From 2825189542c13a103e123b01d904d7a0f817ef44 Mon Sep 17 00:00:00 2001 From: Wayne Lin Date: Mon, 3 Oct 2022 15:07:07 +0800 Subject: [PATCH] Add NuMaker-HMI-MA35D1 and RTP porting. --- bsp/nuvoton/README.md | 24 +- bsp/nuvoton/docs/LVGL_Notes.md | 1 + .../libraries/m031/rtt_port/drv_uart.c | 4 +- .../libraries/m2354/rtt_port/drv_usbhost.c | 115 +- .../libraries/m460/rtt_port/drv_ccap.c | 22 +- .../libraries/m460/rtt_port/drv_usbhost.c | 133 +- .../libraries/m480/rtt_port/drv_usbhost.c | 130 +- .../ma35/CMSIS/Include/arm_common_tables.h | 136 + .../ma35/CMSIS/Include/arm_const_structs.h | 79 + .../libraries/ma35/CMSIS/Include/arm_math.h | 7154 ++++++++++++ .../ma35/CMSIS/Include/cmsis_armcc.h | 734 ++ .../ma35/CMSIS/Include/cmsis_armcc_V6.h | 1804 ++++ .../libraries/ma35/CMSIS/Include/cmsis_gcc.h | 1377 +++ .../libraries/ma35/CMSIS/Include/core_cm0.h | 798 ++ .../ma35/CMSIS/Include/core_cm0plus.h | 914 ++ .../libraries/ma35/CMSIS/Include/core_cm3.h | 1763 +++ .../libraries/ma35/CMSIS/Include/core_cm4.h | 1937 ++++ .../libraries/ma35/CMSIS/Include/core_cm7.h | 2535 +++++ .../ma35/CMSIS/Include/core_cmFunc.h | 87 + .../ma35/CMSIS/Include/core_cmInstr.h | 87 + .../ma35/CMSIS/Include/core_cmSimd.h | 96 + .../libraries/ma35/CMSIS/Include/core_sc000.h | 926 ++ .../libraries/ma35/CMSIS/Include/core_sc300.h | 1745 +++ bsp/nuvoton/libraries/ma35/CMSIS/SConscript | 14 + .../Device/Nuvoton/MA35D1/Include/NuMicro.h | 15 + .../Device/Nuvoton/MA35D1/Include/adc_reg.h | 378 + .../Device/Nuvoton/MA35D1/Include/canfd_reg.h | 1709 +++ .../Device/Nuvoton/MA35D1/Include/ccap_reg.h | 453 + .../Device/Nuvoton/MA35D1/Include/clk_reg.h | 2596 +++++ .../Nuvoton/MA35D1/Include/crypto_reg.h | 7135 ++++++++++++ .../Nuvoton/MA35D1/Include/ddr32phy_reg.h | 9569 +++++++++++++++++ .../Device/Nuvoton/MA35D1/Include/disp_reg.h | 1432 +++ .../Device/Nuvoton/MA35D1/Include/dpm_reg.h | 315 + .../Device/Nuvoton/MA35D1/Include/eadc_reg.h | 2278 ++++ .../Device/Nuvoton/MA35D1/Include/ebi_reg.h | 428 + .../Device/Nuvoton/MA35D1/Include/ecap_reg.h | 389 + .../Device/Nuvoton/MA35D1/Include/epwm_reg.h | 4978 +++++++++ .../Device/Nuvoton/MA35D1/Include/gfx_reg.h | 382 + .../Device/Nuvoton/MA35D1/Include/gmac_reg.h | 2606 +++++ .../Device/Nuvoton/MA35D1/Include/gpio_reg.h | 1221 +++ .../Nuvoton/MA35D1/Include/hsusbd_reg.h | 3108 ++++++ .../Nuvoton/MA35D1/Include/hsusbh_reg.h | 597 + .../Device/Nuvoton/MA35D1/Include/hwsem_reg.h | 452 + .../Device/Nuvoton/MA35D1/Include/i2c_reg.h | 453 + .../Device/Nuvoton/MA35D1/Include/i2s_reg.h | 704 ++ .../Device/Nuvoton/MA35D1/Include/kpi_reg.h | 409 + .../Device/Nuvoton/MA35D1/Include/ks_reg.h | 473 + .../Device/Nuvoton/MA35D1/Include/ma35d1.h | 1050 ++ .../Device/Nuvoton/MA35D1/Include/nfi_reg.h | 2850 +++++ .../Device/Nuvoton/MA35D1/Include/otp_reg.h | 346 + .../Device/Nuvoton/MA35D1/Include/pdma_reg.h | 1020 ++ .../Device/Nuvoton/MA35D1/Include/plm_reg.h | 76 + .../Device/Nuvoton/MA35D1/Include/qei_reg.h | 314 + .../Device/Nuvoton/MA35D1/Include/qspi_reg.h | 661 ++ .../Device/Nuvoton/MA35D1/Include/rtc_reg.h | 1318 +++ .../Device/Nuvoton/MA35D1/Include/sc_reg.h | 972 ++ .../Device/Nuvoton/MA35D1/Include/sdh_reg.h | 2670 +++++ .../Device/Nuvoton/MA35D1/Include/spi_reg.h | 893 ++ .../Device/Nuvoton/MA35D1/Include/ssmcc_reg.h | 932 ++ .../Device/Nuvoton/MA35D1/Include/sspcc_reg.h | 2625 +++++ .../Device/Nuvoton/MA35D1/Include/sys_reg.h | 5816 ++++++++++ .../Nuvoton/MA35D1/Include/system_ma35d1.h | 65 + .../Device/Nuvoton/MA35D1/Include/timer_reg.h | 1069 ++ .../Device/Nuvoton/MA35D1/Include/trng_reg.h | 922 ++ .../Device/Nuvoton/MA35D1/Include/uart_reg.h | 1061 ++ .../Nuvoton/MA35D1/Include/umctl2_reg.h | 3918 +++++++ .../Device/Nuvoton/MA35D1/Include/usbh_reg.h | 796 ++ .../Device/Nuvoton/MA35D1/Include/wdt_reg.h | 179 + .../Device/Nuvoton/MA35D1/Include/whc_reg.h | 1034 ++ .../Device/Nuvoton/MA35D1/Include/wwdt_reg.h | 147 + .../MA35D1/Source/ARM/startup_ma35d1_subm.s | 488 + .../MA35D1/Source/GCC/startup_ma35d1_subm.S | 352 + .../MA35D1/Source/IAR/startup_ma35d1_subm.s | 430 + .../MA35D1/Source/system_ma35d1_subm.c | 67 + bsp/nuvoton/libraries/ma35/Device/SConscript | 22 + bsp/nuvoton/libraries/ma35/README.md | 38 + bsp/nuvoton/libraries/ma35/SConscript | 15 + .../libraries/ma35/StdDriver/SConscript | 13 + .../libraries/ma35/StdDriver/inc/nu_adc.h | 287 + .../libraries/ma35/StdDriver/inc/nu_canfd.h | 476 + .../libraries/ma35/StdDriver/inc/nu_ccap.h | 175 + .../libraries/ma35/StdDriver/inc/nu_clk.h | 622 ++ .../libraries/ma35/StdDriver/inc/nu_disp.h | 205 + .../libraries/ma35/StdDriver/inc/nu_eadc.h | 630 ++ .../libraries/ma35/StdDriver/inc/nu_ebi.h | 350 + .../libraries/ma35/StdDriver/inc/nu_ecap.h | 453 + .../libraries/ma35/StdDriver/inc/nu_epwm.h | 643 ++ .../libraries/ma35/StdDriver/inc/nu_gpio.h | 600 ++ .../libraries/ma35/StdDriver/inc/nu_hwsem.h | 174 + .../libraries/ma35/StdDriver/inc/nu_i2c.h | 296 + .../libraries/ma35/StdDriver/inc/nu_i2s.h | 351 + .../libraries/ma35/StdDriver/inc/nu_kpi.h | 169 + .../libraries/ma35/StdDriver/inc/nu_pdma.h | 421 + .../libraries/ma35/StdDriver/inc/nu_qei.h | 388 + .../libraries/ma35/StdDriver/inc/nu_qspi.h | 379 + .../libraries/ma35/StdDriver/inc/nu_rtc.h | 224 + .../libraries/ma35/StdDriver/inc/nu_sc.h | 266 + .../libraries/ma35/StdDriver/inc/nu_scuart.h | 265 + .../libraries/ma35/StdDriver/inc/nu_sdh.h | 121 + .../libraries/ma35/StdDriver/inc/nu_spi.h | 607 ++ .../libraries/ma35/StdDriver/inc/nu_ssmcc.h | 73 + .../libraries/ma35/StdDriver/inc/nu_sspcc.h | 384 + .../libraries/ma35/StdDriver/inc/nu_sys.h | 1855 ++++ .../libraries/ma35/StdDriver/inc/nu_timer.h | 522 + .../ma35/StdDriver/inc/nu_timer_pwm.h | 745 ++ .../libraries/ma35/StdDriver/inc/nu_uart.h | 489 + .../libraries/ma35/StdDriver/inc/nu_wdt.h | 214 + .../libraries/ma35/StdDriver/inc/nu_whc.h | 279 + .../libraries/ma35/StdDriver/inc/nu_wwdt.h | 150 + .../libraries/ma35/StdDriver/src/nu_adc.c | 87 + .../libraries/ma35/StdDriver/src/nu_canfd.c | 1894 ++++ .../libraries/ma35/StdDriver/src/nu_ccap.c | 406 + .../libraries/ma35/StdDriver/src/nu_clk.c | 1763 +++ .../libraries/ma35/StdDriver/src/nu_disp.c | 560 + .../libraries/ma35/StdDriver/src/nu_eadc.c | 141 + .../libraries/ma35/StdDriver/src/nu_ebi.c | 193 + .../libraries/ma35/StdDriver/src/nu_ecap.c | 96 + .../libraries/ma35/StdDriver/src/nu_epwm.c | 1616 +++ .../libraries/ma35/StdDriver/src/nu_gpio.c | 255 + .../libraries/ma35/StdDriver/src/nu_i2c.c | 1244 +++ .../libraries/ma35/StdDriver/src/nu_i2s.c | 269 + .../libraries/ma35/StdDriver/src/nu_kpi.c | 135 + .../libraries/ma35/StdDriver/src/nu_pdma.c | 443 + .../libraries/ma35/StdDriver/src/nu_qei.c | 122 + .../libraries/ma35/StdDriver/src/nu_qspi.c | 788 ++ .../libraries/ma35/StdDriver/src/nu_rtc.c | 731 ++ .../libraries/ma35/StdDriver/src/nu_sc.c | 368 + .../libraries/ma35/StdDriver/src/nu_scuart.c | 222 + .../libraries/ma35/StdDriver/src/nu_sdh.c | 276 + .../libraries/ma35/StdDriver/src/nu_spi.c | 1313 +++ .../libraries/ma35/StdDriver/src/nu_ssmcc.c | 133 + .../libraries/ma35/StdDriver/src/nu_sspcc.c | 106 + .../libraries/ma35/StdDriver/src/nu_sys.c | 149 + .../libraries/ma35/StdDriver/src/nu_timer.c | 396 + .../ma35/StdDriver/src/nu_timer_pwm.c | 437 + .../libraries/ma35/StdDriver/src/nu_uart.c | 545 + .../libraries/ma35/StdDriver/src/nu_wdt.c | 68 + .../libraries/ma35/StdDriver/src/nu_whc.c | 100 + .../libraries/ma35/StdDriver/src/nu_wwdt.c | 67 + .../libraries/ma35/UsbHostLib/SConscript | 12 + .../libraries/ma35/UsbHostLib/inc/config.h | 142 + .../libraries/ma35/UsbHostLib/inc/ehci.h | 277 + .../libraries/ma35/UsbHostLib/inc/hub.h | 124 + .../libraries/ma35/UsbHostLib/inc/ohci.h | 147 + .../libraries/ma35/UsbHostLib/inc/usb.h | 386 + .../libraries/ma35/UsbHostLib/inc/usbh_lib.h | 189 + .../libraries/ma35/UsbHostLib/src/_ehci.c_ | 1264 +++ .../ma35/UsbHostLib/src/_ehci_iso.c_ | 902 ++ .../libraries/ma35/UsbHostLib/src/_ohci.c_ | 1283 +++ .../libraries/ma35/UsbHostLib/src/ehci_0.c | 43 + .../libraries/ma35/UsbHostLib/src/ehci_1.c | 43 + .../libraries/ma35/UsbHostLib/src/mem_alloc.c | 538 + .../libraries/ma35/UsbHostLib/src/ohci_0.c | 41 + .../libraries/ma35/UsbHostLib/src/ohci_1.c | 41 + .../libraries/ma35/UsbHostLib/src/support.c | 274 + .../libraries/ma35/UsbHostLib/src/usb_core.c | 335 + bsp/nuvoton/libraries/ma35/libcpu/SConscript | 15 + .../libraries/ma35/libcpu/aarch64/SConscript | 13 + .../libraries/ma35/libcpu/aarch64/armv8.h | 63 + .../libraries/ma35/libcpu/aarch64/cache.S | 151 + .../ma35/libcpu/aarch64/context_gcc.S | 312 + .../libraries/ma35/libcpu/aarch64/cp15.h | 68 + .../libraries/ma35/libcpu/aarch64/cpu.c | 108 + .../libraries/ma35/libcpu/aarch64/cpu_gcc.S | 82 + .../ma35/libcpu/aarch64/entry_point.S | 212 + .../libraries/ma35/libcpu/aarch64/gic.c | 491 + .../libraries/ma35/libcpu/aarch64/gic.h | 62 + .../libraries/ma35/libcpu/aarch64/gtimer.S | 44 + .../libraries/ma35/libcpu/aarch64/gtimer.h | 27 + .../libraries/ma35/libcpu/aarch64/interrupt.c | 285 + .../libraries/ma35/libcpu/aarch64/interrupt.h | 55 + .../libraries/ma35/libcpu/aarch64/mmu.c | 371 + .../libraries/ma35/libcpu/aarch64/mmu.h | 78 + .../ma35/libcpu/aarch64/secondary_cpu.c | 71 + .../libraries/ma35/libcpu/aarch64/stack.c | 90 + .../libraries/ma35/libcpu/aarch64/trap.c | 114 + .../ma35/libcpu/aarch64/vector_gcc.S | 61 + .../libraries/ma35/libcpu/arm/SConscript | 17 + .../ma35/libcpu/arm/cortex-a/SConscript | 14 + .../ma35/libcpu/arm/cortex-a/gtimer.c | 179 + .../ma35/libcpu/arm/cortex-a/gtimer.h | 27 + .../libraries/ma35/libcpu/arm/cortex-a/pmu.c | 20 + .../libraries/ma35/libcpu/arm/cortex-a/pmu.h | 160 + .../ma35/libcpu/arm/cortex-m4/SConscript | 14 + .../ma35/libcpu/arm/cortex-m4/interrupt.c | 156 + .../ma35/libcpu/arm/cortex-m4/interrupt.h | 27 + bsp/nuvoton/libraries/ma35/rtt_port/Kconfig | 1119 ++ .../libraries/ma35/rtt_port/SConscript | 21 + bsp/nuvoton/libraries/ma35/rtt_port/drv_adc.c | 615 ++ bsp/nuvoton/libraries/ma35/rtt_port/drv_adc.h | 63 + .../libraries/ma35/rtt_port/drv_canfd.c | 660 ++ .../libraries/ma35/rtt_port/drv_ccap.c | 489 + .../libraries/ma35/rtt_port/drv_ccap.h | 49 + .../libraries/ma35/rtt_port/drv_common.c | 437 + .../libraries/ma35/rtt_port/drv_common.h | 83 + .../libraries/ma35/rtt_port/drv_disp.c | 450 + .../libraries/ma35/rtt_port/drv_eadc.c | 154 + .../libraries/ma35/rtt_port/drv_ecap.c | 287 + .../libraries/ma35/rtt_port/drv_epwm.c | 210 + .../ma35/rtt_port/drv_epwm_capture.c | 289 + .../libraries/ma35/rtt_port/drv_gpio.c | 341 + .../libraries/ma35/rtt_port/drv_gpio.h | 40 + bsp/nuvoton/libraries/ma35/rtt_port/drv_i2c.c | 409 + bsp/nuvoton/libraries/ma35/rtt_port/drv_i2c.h | 36 + bsp/nuvoton/libraries/ma35/rtt_port/drv_i2s.c | 637 ++ bsp/nuvoton/libraries/ma35/rtt_port/drv_i2s.h | 96 + .../libraries/ma35/rtt_port/drv_pdma.c | 1265 +++ .../libraries/ma35/rtt_port/drv_pdma.h | 87 + bsp/nuvoton/libraries/ma35/rtt_port/drv_qei.c | 298 + bsp/nuvoton/libraries/ma35/rtt_port/drv_qei.h | 29 + .../libraries/ma35/rtt_port/drv_qspi.c | 442 + .../libraries/ma35/rtt_port/drv_qspi.h | 20 + bsp/nuvoton/libraries/ma35/rtt_port/drv_rtc.c | 371 + bsp/nuvoton/libraries/ma35/rtt_port/drv_rtp.c | 250 + .../libraries/ma35/rtt_port/drv_scuart.c | 323 + .../libraries/ma35/rtt_port/drv_sdio.c | 1061 ++ .../libraries/ma35/rtt_port/drv_softi2c.c | 232 + bsp/nuvoton/libraries/ma35/rtt_port/drv_spi.c | 726 ++ bsp/nuvoton/libraries/ma35/rtt_port/drv_spi.h | 53 + .../libraries/ma35/rtt_port/drv_spii2s.c | 652 ++ bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.c | 269 + bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.h | 95 + .../libraries/ma35/rtt_port/drv_sys_i2c0.c | 303 + .../libraries/ma35/rtt_port/drv_timer.c | 307 + .../libraries/ma35/rtt_port/drv_tpwm.c | 265 + .../libraries/ma35/rtt_port/drv_uart.c | 1071 ++ .../libraries/ma35/rtt_port/drv_uart.h | 22 + .../libraries/ma35/rtt_port/drv_usbhost.c | 950 ++ bsp/nuvoton/libraries/ma35/rtt_port/drv_wdt.c | 372 + .../libraries/ma35/rtt_port/gmac/SConscript | 13 + .../libraries/ma35/rtt_port/gmac/drv_gmac.c | 801 ++ .../libraries/ma35/rtt_port/gmac/mii.c | 144 + .../libraries/ma35/rtt_port/gmac/mii.h | 233 + .../ma35/rtt_port/gmac/synopGMAC_Dev.c | 2961 +++++ .../ma35/rtt_port/gmac/synopGMAC_Dev.h | 1715 +++ .../ma35/rtt_port/gmac/synopGMAC_Host.h | 38 + .../gmac/synopGMAC_network_interface.c | 628 ++ .../gmac/synopGMAC_network_interface.h | 54 + .../ma35/rtt_port/gmac/synopGMAC_plat.c | 78 + .../ma35/rtt_port/gmac/synopGMAC_plat.h | 44 + .../ma35/rtt_port/gmac/synopGMAC_types.h | 31 + .../libraries/ma35/rtt_port/nu_clock_init.c | 398 + .../libraries/n9h30/rtt_port/drv_adc.c | 34 +- .../libraries/n9h30/rtt_port/drv_usbhost.c | 120 +- .../nu_packages/CCAP_Sensors/ccap_demo.c | 44 +- .../nu_packages/CCAP_Sensors/ccap_sensor.c | 9 +- .../nu_packages/CCAP_Sensors/ccap_sensor.h | 2 +- .../libraries/nuc980/rtt_port/drv_adc.c | 34 +- .../libraries/nuc980/rtt_port/drv_usbhost.c | 120 +- bsp/nuvoton/ma35-rtp/.config | 801 ++ bsp/nuvoton/ma35-rtp/Kconfig | 27 + bsp/nuvoton/ma35-rtp/Nu_Link_Driver.ini | 1144 ++ bsp/nuvoton/ma35-rtp/README.md | 22 + bsp/nuvoton/ma35-rtp/SConscript | 14 + bsp/nuvoton/ma35-rtp/SConstruct | 59 + bsp/nuvoton/ma35-rtp/applications/SConscript | 11 + bsp/nuvoton/ma35-rtp/applications/main.c | 47 + bsp/nuvoton/ma35-rtp/applications/mnt.c | 14 + bsp/nuvoton/ma35-rtp/board/Kconfig | 23 + bsp/nuvoton/ma35-rtp/board/SConscript | 18 + bsp/nuvoton/ma35-rtp/board/board.h | 42 + bsp/nuvoton/ma35-rtp/board/board_dev.c | 14 + .../board/nutool_pincfg/nutool_pincfg.c | 52 + .../board/nutool_pincfg/nutool_pincfg.h | 80 + bsp/nuvoton/ma35-rtp/linking_scripts/subm.ld | 160 + bsp/nuvoton/ma35-rtp/ma35-rtp.uvprojx | 1012 ++ bsp/nuvoton/ma35-rtp/rtconfig.py | 99 + bsp/nuvoton/ma35-rtp/rtthread.bin | Bin 0 -> 89340 bytes bsp/nuvoton/ma35-rtp/template.uvprojx | 390 + bsp/nuvoton/nk-n9h30/.config | 2 + bsp/nuvoton/numaker-hmi-ma35d1/.config | 1071 ++ bsp/nuvoton/numaker-hmi-ma35d1/Kconfig | 27 + bsp/nuvoton/numaker-hmi-ma35d1/README.md | 216 + bsp/nuvoton/numaker-hmi-ma35d1/SConscript | 14 + bsp/nuvoton/numaker-hmi-ma35d1/SConstruct | 58 + .../applications/SConscript | 21 + .../applications/lvgl/SConscript | 10 + .../applications/lvgl/lv_conf.h | 38 + .../applications/lvgl/lv_demo.c | 32 + .../applications/lvgl/lv_port_disp.c | 189 + .../applications/lvgl/lv_port_disp.h | 23 + .../applications/lvgl/lv_port_indev.c | 54 + .../applications/lvgl/lv_port_indev.h | 28 + .../numaker-hmi-ma35d1/applications/main.c | 71 + .../numaker-hmi-ma35d1/applications/mnt.c | 266 + bsp/nuvoton/numaker-hmi-ma35d1/board/Kconfig | 154 + .../numaker-hmi-ma35d1/board/SConscript | 18 + bsp/nuvoton/numaker-hmi-ma35d1/board/board.h | 39 + .../numaker-hmi-ma35d1/board/board_dev.c | 611 ++ .../board/nutool_pincfg/nutool_pincfg.c | 774 ++ .../board/nutool_pincfg/nutool_pincfg.cfg | 367 + .../board/nutool_pincfg/nutool_pincfg.h | 26 + .../numaker-hmi-ma35d1/figures/LCD-Panel.png | Bin 0 -> 585100 bytes .../figures/NuMaker-BASE-MA35D1B1.png | Bin 0 -> 1092795 bytes .../figures/NuMaker-HMI-MA35D1.png | Bin 0 -> 131518 bytes .../figures/NuMaker-SOM-MA35D16A81.png | Bin 0 -> 336751 bytes .../figures/SerialSetting.png | Bin 0 -> 7691 bytes .../numaker-hmi-ma35d1/figures/ddr.gif | Bin 0 -> 992855 bytes .../numaker-hmi-ma35d1/figures/emmc.gif | Bin 0 -> 1058651 bytes .../numaker-hmi-ma35d1/figures/nand.gif | Bin 0 -> 1251518 bytes .../numaker-hmi-ma35d1/figures/spinand.gif | Bin 0 -> 820236 bytes .../linking_scripts/aarch32.ld | 128 + .../linking_scripts/aarch64.ld | 149 + .../nuwriter_scripts/README.md | 36 + .../nuwriter_scripts/UnpackImage.py | 62 + .../_nuwriter_nand_generate_header_bin.bat | 2 + .../_nuwriter_nand_generate_pack_bin.bat | 2 + .../nuwriter_scripts/header-nand.json | 36 + .../nuwriter_scripts/header-sd.json | 36 + .../nuwriter_scripts/nuwriter.py | 1938 ++++ .../nuwriter_ddr_download_and_run.bat | 8 + .../nuwriter_leave_ibr_download_and_run.bat | 8 + .../nuwriter_leave_ibr_sd_pack.bat | 5 + .../nuwriter_nand_programming.bat | 7 + .../nuwriter_sd_programming.bat | 8 + .../nuwriter_spinand_programming.bat | 7 + .../nuwriter_scripts/pack-nand.json | 21 + .../nuwriter_scripts/pack-sd.json | 20 + .../nuwriter_scripts/xusbcom.py | 154 + .../numaker-hmi-ma35d1/preload/Makefile | 68 + .../preload/Makefile.leave_ibr | 69 + .../numaker-hmi-ma35d1/preload/SConscript | 14 + .../numaker-hmi-ma35d1/preload/entry_point.S | 109 + .../numaker-hmi-ma35d1/preload/env_build.bat | 9 + .../numaker-hmi-ma35d1/preload/leave_ibr.ASM | 53 + .../numaker-hmi-ma35d1/preload/preload.ASM | 228 + .../numaker-hmi-ma35d1/preload/preload.ld | 113 + .../numaker-hmi-ma35d1/preload/transcode.py | 41 + bsp/nuvoton/numaker-hmi-ma35d1/rtconfig.py | 77 + bsp/nuvoton/numaker-iot-m467/.config | 5 +- .../numaker-iot-m467/applications/mnt.c | 19 +- bsp/nuvoton/numaker-m032ki/.config | 2 + bsp/nuvoton/numaker-m467hj/.config | 2 + bsp/nuvoton/numaker-m467hj/board/board_dev.c | 2 +- 334 files changed, 168700 insertions(+), 343 deletions(-) create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/arm_common_tables.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/arm_const_structs.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/arm_math.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/cmsis_armcc.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/cmsis_armcc_V6.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/cmsis_gcc.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm0.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm0plus.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm3.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm4.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm7.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cmFunc.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cmInstr.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cmSimd.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/core_sc000.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/Include/core_sc300.h create mode 100644 bsp/nuvoton/libraries/ma35/CMSIS/SConscript create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/NuMicro.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/adc_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/canfd_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ccap_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/clk_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/crypto_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ddr32phy_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/disp_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/dpm_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/eadc_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ebi_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ecap_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/epwm_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/gfx_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/gmac_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/gpio_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/hsusbd_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/hsusbh_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/hwsem_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/i2c_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/i2s_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/kpi_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ks_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ma35d1.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/nfi_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/otp_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/pdma_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/plm_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/qei_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/qspi_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/rtc_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/sc_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/sdh_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/spi_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ssmcc_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/sspcc_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/sys_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/system_ma35d1.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/timer_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/trng_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/uart_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/umctl2_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/usbh_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/wdt_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/whc_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/wwdt_reg.h create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/ARM/startup_ma35d1_subm.s create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/GCC/startup_ma35d1_subm.S create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/IAR/startup_ma35d1_subm.s create mode 100644 bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/system_ma35d1_subm.c create mode 100644 bsp/nuvoton/libraries/ma35/Device/SConscript create mode 100644 bsp/nuvoton/libraries/ma35/README.md create mode 100644 bsp/nuvoton/libraries/ma35/SConscript create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/SConscript create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_adc.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_canfd.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ccap.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_clk.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_disp.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_eadc.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ebi.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ecap.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_epwm.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_gpio.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_hwsem.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_i2c.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_i2s.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_kpi.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_pdma.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_qei.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_qspi.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_rtc.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sc.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_scuart.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sdh.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_spi.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ssmcc.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sspcc.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sys.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_timer.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_timer_pwm.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_uart.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_wdt.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_whc.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_wwdt.h create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_adc.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_canfd.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ccap.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_clk.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_disp.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_eadc.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ebi.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ecap.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_epwm.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_gpio.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_i2c.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_i2s.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_kpi.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_pdma.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_qei.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_qspi.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_rtc.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sc.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_scuart.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sdh.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_spi.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ssmcc.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sspcc.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sys.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_timer.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_timer_pwm.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_uart.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_wdt.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_whc.c create mode 100644 bsp/nuvoton/libraries/ma35/StdDriver/src/nu_wwdt.c create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/SConscript create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/inc/config.h create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/inc/ehci.h create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/inc/hub.h create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/inc/ohci.h create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/inc/usb.h create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/inc/usbh_lib.h create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ehci.c_ create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ehci_iso.c_ create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ohci.c_ create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/src/ehci_0.c create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/src/ehci_1.c create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/src/mem_alloc.c create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/src/ohci_0.c create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/src/ohci_1.c create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/src/support.c create mode 100644 bsp/nuvoton/libraries/ma35/UsbHostLib/src/usb_core.c create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/SConscript create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/SConscript create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/armv8.h create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/cache.S create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/context_gcc.S create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/cp15.h create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/cpu.c create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/cpu_gcc.S create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/entry_point.S create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/gic.c create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/gic.h create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/gtimer.S create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/gtimer.h create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/interrupt.c create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/interrupt.h create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/mmu.c create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/mmu.h create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/secondary_cpu.c create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/stack.c create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/trap.c create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/aarch64/vector_gcc.S create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/arm/SConscript create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/SConscript create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/gtimer.c create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/gtimer.h create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/pmu.c create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/pmu.h create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-m4/SConscript create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-m4/interrupt.c create mode 100644 bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-m4/interrupt.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/Kconfig create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/SConscript create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_adc.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_adc.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_canfd.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_ccap.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_ccap.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_common.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_common.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_disp.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_eadc.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_ecap.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_epwm.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_epwm_capture.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_gpio.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_gpio.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_i2c.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_i2c.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_i2s.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_i2s.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_qei.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_qei.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_qspi.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_qspi.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_rtc.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_rtp.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_scuart.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_sdio.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_softi2c.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_spi.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_spi.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_spii2s.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_sys_i2c0.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_timer.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_tpwm.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_uart.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_uart.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_usbhost.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_wdt.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/gmac/SConscript create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/gmac/drv_gmac.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/gmac/mii.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/gmac/mii.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_Dev.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_Dev.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_Host.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_network_interface.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_network_interface.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_plat.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_plat.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_types.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/nu_clock_init.c create mode 100644 bsp/nuvoton/ma35-rtp/.config create mode 100644 bsp/nuvoton/ma35-rtp/Kconfig create mode 100644 bsp/nuvoton/ma35-rtp/Nu_Link_Driver.ini create mode 100644 bsp/nuvoton/ma35-rtp/README.md create mode 100644 bsp/nuvoton/ma35-rtp/SConscript create mode 100644 bsp/nuvoton/ma35-rtp/SConstruct create mode 100644 bsp/nuvoton/ma35-rtp/applications/SConscript create mode 100644 bsp/nuvoton/ma35-rtp/applications/main.c create mode 100644 bsp/nuvoton/ma35-rtp/applications/mnt.c create mode 100644 bsp/nuvoton/ma35-rtp/board/Kconfig create mode 100644 bsp/nuvoton/ma35-rtp/board/SConscript create mode 100644 bsp/nuvoton/ma35-rtp/board/board.h create mode 100644 bsp/nuvoton/ma35-rtp/board/board_dev.c create mode 100644 bsp/nuvoton/ma35-rtp/board/nutool_pincfg/nutool_pincfg.c create mode 100644 bsp/nuvoton/ma35-rtp/board/nutool_pincfg/nutool_pincfg.h create mode 100644 bsp/nuvoton/ma35-rtp/linking_scripts/subm.ld create mode 100644 bsp/nuvoton/ma35-rtp/ma35-rtp.uvprojx create mode 100644 bsp/nuvoton/ma35-rtp/rtconfig.py create mode 100644 bsp/nuvoton/ma35-rtp/rtthread.bin create mode 100644 bsp/nuvoton/ma35-rtp/template.uvprojx create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/.config create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/Kconfig create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/README.md create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/SConscript create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/SConstruct create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/applications/SConscript create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/SConscript create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_conf.h create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_demo.c create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.c create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.h create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_indev.c create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_indev.h create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/applications/main.c create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/applications/mnt.c create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/board/Kconfig create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/board/SConscript create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/board/board.h create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/board/board_dev.c create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.c create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.cfg create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.h create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/figures/LCD-Panel.png create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/figures/NuMaker-BASE-MA35D1B1.png create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/figures/NuMaker-HMI-MA35D1.png create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/figures/NuMaker-SOM-MA35D16A81.png create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/figures/SerialSetting.png create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/figures/ddr.gif create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/figures/emmc.gif create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/figures/nand.gif create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/figures/spinand.gif create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/linking_scripts/aarch32.ld create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/linking_scripts/aarch64.ld create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/README.md create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/UnpackImage.py create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_header_bin.bat create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_pack_bin.bat create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/header-nand.json create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/header-sd.json create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter.py create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_ddr_download_and_run.bat create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_leave_ibr_download_and_run.bat create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_leave_ibr_sd_pack.bat create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_nand_programming.bat create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_sd_programming.bat create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_spinand_programming.bat create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/pack-nand.json create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/pack-sd.json create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/xusbcom.py create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/preload/Makefile create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/preload/Makefile.leave_ibr create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/preload/SConscript create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/preload/entry_point.S create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/preload/env_build.bat create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/preload/leave_ibr.ASM create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/preload/preload.ASM create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/preload/preload.ld create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/preload/transcode.py create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/rtconfig.py diff --git a/bsp/nuvoton/README.md b/bsp/nuvoton/README.md index c3548b8813..7cbf783135 100644 --- a/bsp/nuvoton/README.md +++ b/bsp/nuvoton/README.md @@ -1,14 +1,16 @@ # Nuvoton BSP Description + Current supported BSP shown in below table: -| **BSP Folder** | **Board Name** | -| ------------------------- | -------------------------- | -| [numaker-iot-m487](numaker-iot-m487) | Nuvoton NuMaker-IoT-M487 | -| [numaker-pfm-m487](numaker-pfm-m487) | Nuvoton NuMaker-PFM-M487 | -| [nk-980iot](nk-980iot) | Nuvoton NK-980IOT | -| [numaker-m2354](numaker-m2354) | Nuvoton NuMaker-M2354 | -| [nk-rtu980](nk-rtu980) | Nuvoton NK-RTU980 | -| [nk-n9h30](nk-n9h30) | Nuvoton NK-N9H30 | -| [numaker-m032ki](numaker-m032ki) | Nuvoton NuMaker-M032KI | -| [numaker-m467hj](numaker-m467hj) | Nuvoton NuMaker-M467HJ | -| [numaker-iot-m467](numaker-iot-m467) | Nuvoton NuMaker-IoT-M467 | +| **Board Name** | **CPU Architecture** | **BSP Folder** | +| ------------------------- | ------------------------- | -------------------------- | +| NuMaker-IoT-M487 | CORTEX-M4 | [numaker-iot-m487](numaker-iot-m487) | +| NuMaker-PFM-M487 | CORTEX-M4 | [numaker-pfm-m487](numaker-pfm-m487) | +| NK-980IOT | ARM926EJS | [nk-980iot](nk-980iot) | +| NuMaker-M2354 | CORTEX-M23 | [numaker-m2354](numaker-m2354) | +| NK-RTU980 | ARM926EJS | [nk-rtu980](nk-rtu980) | +| NK-N9H30 | CORTEX-M4 | [nk-n9h30](nk-n9h30) | +| NuMaker-M032KI | CORTEX-M0 | [numaker-m032ki](numaker-m032ki) | +| NuMaker-M467HJ | CORTEX-M4 | [numaker-m467hj](numaker-m467hj) | +| NuMaker-IoT-M467 | CORTEX-M4 | [numaker-iot-m467](numaker-iot-m467) | +| NuMaker-HMI-MA35D1 | CORTEX-A35, CORTEX-M4 | [numaker-hmi-ma35d1](numaker-hmi-ma35d1), [ma35-rtp](ma35-rtp) | diff --git a/bsp/nuvoton/docs/LVGL_Notes.md b/bsp/nuvoton/docs/LVGL_Notes.md index 9245f92804..1ccadd838c 100644 --- a/bsp/nuvoton/docs/LVGL_Notes.md +++ b/bsp/nuvoton/docs/LVGL_Notes.md @@ -12,6 +12,7 @@ Current supported LVGL running environment on Nuvoton's boards shown in below ta | numaker-m032ki | Widgets | Nu-TFT v1.3 | config_lvgl | | numaker-m467hj | Widgets | NuMaker-TFT-LCD43 v1.0 | config_lvgl | | numaker-iot-m467 | Widgets | Nu-TFT v1.3 | config_lvgl | +| numaker-hmi-ma35d1 | Widgets | No | .config | ## Download related packages diff --git a/bsp/nuvoton/libraries/m031/rtt_port/drv_uart.c b/bsp/nuvoton/libraries/m031/rtt_port/drv_uart.c index e8743850ba..58e0ffc4db 100644 --- a/bsp/nuvoton/libraries/m031/rtt_port/drv_uart.c +++ b/bsp/nuvoton/libraries/m031/rtt_port/drv_uart.c @@ -516,7 +516,7 @@ static rt_err_t nu_pdma_uart_rx_config(struct rt_serial_device *serial, uint8_t nu_pdma_uart_rx_cb, (void *)serial, NU_PDMA_EVENT_TRANSFER_DONE | NU_PDMA_EVENT_TIMEOUT); - if ( result != RT_EOK ) + if (result != RT_EOK) { goto exit_nu_pdma_uart_rx_config; } @@ -527,7 +527,7 @@ static rt_err_t nu_pdma_uart_rx_config(struct rt_serial_device *serial, uint8_t (uint32_t)pu8Buf, i32TriggerLen, 1000); //Idle-timeout, 1ms - if ( result != RT_EOK ) + if (result != RT_EOK) { goto exit_nu_pdma_uart_rx_config; } diff --git a/bsp/nuvoton/libraries/m2354/rtt_port/drv_usbhost.c b/bsp/nuvoton/libraries/m2354/rtt_port/drv_usbhost.c index e54580d671..abee7c2a77 100644 --- a/bsp/nuvoton/libraries/m2354/rtt_port/drv_usbhost.c +++ b/bsp/nuvoton/libraries/m2354/rtt_port/drv_usbhost.c @@ -21,6 +21,13 @@ #include "usb.h" #include "usbh_lib.h" +#define LOG_TAG "drv.usbhost" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_DBG +#define DBG_COLOR +#include + #if !defined(NU_USBHOST_HUB_POLLING_INTERVAL) #define NU_USBHOST_HUB_POLLING_INTERVAL (100) #endif @@ -60,6 +67,7 @@ typedef struct nu_port_dev UDEV_T *pUDev; EP_INFO_T *apsEPInfo[NU_MAX_USBH_PIPE]; struct urequest asSetupReq[NU_MAX_USBH_PIPE]; + uint32_t u32SentLength[NU_MAX_USBH_PIPE]; struct rt_completion utr_completion; int port_num; rt_bool_t bEnumDone; @@ -426,22 +434,30 @@ static int nu_int_xfer( int timeouts) { int ret; - int retry = 3; - while (retry > 0) + while (1) { ret = usbh_int_xfer(psUTR); - if (ret == 0) + if (ret < 0) + return ret; + + if (rt_completion_wait(&(psPortDev->utr_completion), timeouts) != 0) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("Request %08x Timeout in %d ms!!\n", psUTR, timeouts)); + usbh_quit_utr(psUTR); + + rt_completion_init(&(psPortDev->utr_completion)); + rt_thread_mdelay(1); + } + else + { + + RT_DEBUG_LOG(RT_DEBUG_USB, ("Transferring done %08x\n", psUTR)); + usbh_quit_utr(psUTR); break; - - RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_int_xfer ERROR: failed to submit interrupt request\n")); - rt_thread_delay((pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) > 0 ? (pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) : 1); - retry --; + } } - if (ret < 0) - return ret; - return 0; } @@ -453,30 +469,6 @@ static void xfer_done_cb(UTR_T *psUTR) rt_completion_done(&(psPortDev->utr_completion)); } -static void int_xfer_done_cb(UTR_T *psUTR) -{ - upipe_t pipe = (upipe_t)psUTR->context; - - if (psUTR->status != 0) - { - RT_DEBUG_LOG(RT_DEBUG_USB, ("Interrupt xfer failed %d\n", psUTR->status)); - goto exit_int_xfer_done_cb; - } - - if (pipe->callback != RT_NULL) - { - struct uhost_msg msg; - msg.type = USB_MSG_CALLBACK; - msg.content.cb.function = pipe->callback; - msg.content.cb.context = pipe; - rt_usbh_event_signal(&s_sUSBHDev.uhcd, &msg); - } - -exit_int_xfer_done_cb: - - free_utr(psUTR); -} - static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts) { S_NU_RH_PORT_CTRL *psPortCtrl; @@ -510,6 +502,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes { struct urequest *psSetup = (struct urequest *)buffer_nonch; RT_ASSERT(buffer_nonch != RT_NULL); + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] = 0; /* Read data from USB device. */ if (psSetup->request_type & USB_REQ_TYPE_DIR_IN) @@ -531,10 +524,31 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes //token == USBH_PID_DATA if (buffer_nonch && ((pipe->ep.bEndpointAddress & USB_DIR_MASK) == USB_DIR_IN)) { + struct urequest *psSetup = &psPortCtrl->asHubPortDev->asSetupReq[pipe->pipe_index]; + /* Read data from USB device. */ //Trigger USBHostLib Ctril_Xfer - ret = nu_ctrl_xfer(psPortDev, &psPortCtrl->asHubPortDev->asSetupReq[pipe->pipe_index], buffer_nonch, timeouts); - if (ret != nbytes) + /* + * Workaround: HCD driver can readback all bytes of setup.wLength, but not support single packet transferring. + */ + if (psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] == 0) + { + ret = nu_ctrl_xfer(psPortDev, psSetup, buffer_nonch, timeouts); + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] = ret; + } + else + { + if (psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] < nbytes) + { + ret = 0; + } + else + { + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] -= nbytes; + ret = nbytes; + } + } + if (ret <= 0) goto exit_nu_pipe_xfer; } else @@ -579,9 +593,6 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes } else if (pipe->ep.bmAttributes == USB_EP_ATTR_INT) { - psUTR->func = int_xfer_done_cb; - psUTR->context = pipe; - if (nu_int_xfer(pipe, psPortDev, psUTR, timeouts) < 0) { RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_pipe_xfer ERROR: int transfer failed\n")); @@ -591,7 +602,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes { i32XferLen = nbytes; } - goto exit2_nu_pipe_xfer; + goto exit_nu_pipe_xfer; } else if (pipe->ep.bmAttributes == USB_EP_ATTR_ISOC) { @@ -630,20 +641,17 @@ failreport_nu_pipe_xfer: i32XferLen = psUTR->xfer_len; +exit_nu_pipe_xfer: + //Call callback if (pipe->callback != RT_NULL) { pipe->callback(pipe); } -exit_nu_pipe_xfer: - if (psUTR) free_utr(psUTR); -exit2_nu_pipe_xfer: - - NU_USBHOST_UNLOCK(); return i32XferLen; @@ -851,12 +859,19 @@ int nu_usbh_register(void) psUHCD->num_ports = NU_MAX_USBH_PORT; #if !defined(BSP_USING_OTG) - SYS_UnlockReg(); + { + uint32_t u32RegLockBackup; - /* Set OTG as USB Host role */ - SYS->USBPHY = SYS_USBPHY_OTGPHYEN_Msk | SYS_USBPHY_SBO_Msk | (0x1 << SYS_USBPHY_USBROLE_Pos); + u32RegLockBackup = SYS_IsRegLocked(); + if (u32RegLockBackup) + SYS_UnlockReg(); - SYS_LockReg(); + /* Set OTG as USB Host role */ + SYS->USBPHY = SYS_USBPHY_OTGPHYEN_Msk | SYS_USBPHY_SBO_Msk | (0x1 << SYS_USBPHY_USBROLE_Pos); + + if (u32RegLockBackup) + SYS_LockReg(); + } #endif @@ -875,6 +890,6 @@ int nu_usbh_register(void) return 0; } -INIT_DEVICE_EXPORT(nu_usbh_register); +INIT_APP_EXPORT(nu_usbh_register); #endif diff --git a/bsp/nuvoton/libraries/m460/rtt_port/drv_ccap.c b/bsp/nuvoton/libraries/m460/rtt_port/drv_ccap.c index 3a7e680911..986d10b174 100644 --- a/bsp/nuvoton/libraries/m460/rtt_port/drv_ccap.c +++ b/bsp/nuvoton/libraries/m460/rtt_port/drv_ccap.c @@ -208,6 +208,22 @@ static rt_err_t ccap_pipe_configure(nu_ccap_t psNuCcap, ccap_view_info_t psViewI { uint32_t u32Offset = 0; uint32_t u32WM, u32WN, u32HM, u32HN; + uint32_t u32Div = 0; + + if (psCcapConf->sPipeInfo_Planar.u32PixFmt == CCAP_PAR_PLNFMT_YUV422) + { + /* U/V farm size equals Y/2 farm size */ + u32Div = 2; + } + else if (psCcapConf->sPipeInfo_Planar.u32PixFmt == CCAP_PAR_PLNFMT_YUV420) + { + /* U/V farm size equals Y/4 farm size */ + u32Div = 4; + } + else + { + goto fail_ccap_pipe_configure; + } /* Set System Memory Planar Y Base Address Register */ CCAP_SetPlanarYBuf(psNuCcap->base, (uint32_t)psCcapConf->sPipeInfo_Planar.pu8FarmAddr + u32Offset); @@ -217,7 +233,7 @@ static rt_err_t ccap_pipe_configure(nu_ccap_t psNuCcap, ccap_view_info_t psViewI /* Set System Memory Planar U Base Address Register */ CCAP_SetPlanarUBuf(psNuCcap->base, (uint32_t)psCcapConf->sPipeInfo_Planar.pu8FarmAddr + u32Offset); - u32Offset += ((psCcapConf->sPipeInfo_Planar.u32Height * psCcapConf->sPipeInfo_Planar.u32Width) / 2); + u32Offset += ((psCcapConf->sPipeInfo_Planar.u32Height * psCcapConf->sPipeInfo_Planar.u32Width) / u32Div); /* Set System Memory Planar V Base Address Register */ CCAP_SetPlanarVBuf(psNuCcap->base, (uint32_t)psCcapConf->sPipeInfo_Planar.pu8FarmAddr + u32Offset); @@ -258,6 +274,10 @@ static rt_err_t ccap_pipe_configure(nu_ccap_t psNuCcap, ccap_view_info_t psViewI u32PipeEnabling); return RT_EOK; + +fail_ccap_pipe_configure: + + return -RT_ERROR; } static rt_err_t ccap_open(rt_device_t dev, rt_uint16_t oflag) diff --git a/bsp/nuvoton/libraries/m460/rtt_port/drv_usbhost.c b/bsp/nuvoton/libraries/m460/rtt_port/drv_usbhost.c index 8d7d264f85..68c2116882 100644 --- a/bsp/nuvoton/libraries/m460/rtt_port/drv_usbhost.c +++ b/bsp/nuvoton/libraries/m460/rtt_port/drv_usbhost.c @@ -23,6 +23,13 @@ #include "usb.h" #include "usbh_lib.h" +#define LOG_TAG "drv.usbhost" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_DBG +#define DBG_COLOR +#include + #if !defined(NU_USBHOST_HUB_POLLING_INTERVAL) #define NU_USBHOST_HUB_POLLING_INTERVAL (100) #endif @@ -62,6 +69,7 @@ typedef struct nu_port_dev UDEV_T *pUDev; EP_INFO_T *apsEPInfo[NU_MAX_USBH_PIPE]; struct urequest asSetupReq[NU_MAX_USBH_PIPE]; + uint32_t u32SentLength[NU_MAX_USBH_PIPE]; struct rt_completion utr_completion; int port_num; rt_bool_t bEnumDone; @@ -445,22 +453,30 @@ static int nu_int_xfer( int timeouts) { int ret; - int retry = 3; - while (retry > 0) + while (1) { ret = usbh_int_xfer(psUTR); - if (ret == 0) + if (ret < 0) + return ret; + + if (rt_completion_wait(&(psPortDev->utr_completion), timeouts) != 0) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("Request %08x Timeout in %d ms!!\n", psUTR, timeouts)); + usbh_quit_utr(psUTR); + + rt_completion_init(&(psPortDev->utr_completion)); + rt_thread_mdelay(1); + } + else + { + + RT_DEBUG_LOG(RT_DEBUG_USB, ("Transferring done %08x\n", psUTR)); + usbh_quit_utr(psUTR); break; - - RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_int_xfer ERROR: failed to submit interrupt request\n")); - rt_thread_delay((pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) > 0 ? (pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) : 1); - retry --; + } } - if (ret < 0) - return ret; - return 0; } @@ -472,30 +488,6 @@ static void xfer_done_cb(UTR_T *psUTR) rt_completion_done(&(psPortDev->utr_completion)); } -static void int_xfer_done_cb(UTR_T *psUTR) -{ - upipe_t pipe = (upipe_t)psUTR->context; - - if (psUTR->status != 0) - { - RT_DEBUG_LOG(RT_DEBUG_USB, ("Interrupt xfer failed %d\n", psUTR->status)); - goto exit_int_xfer_done_cb; - } - - if (pipe->callback != RT_NULL) - { - struct uhost_msg msg; - msg.type = USB_MSG_CALLBACK; - msg.content.cb.function = pipe->callback; - msg.content.cb.context = pipe; - rt_usbh_event_signal(&s_sUSBHDev.uhcd, &msg); - } - -exit_int_xfer_done_cb: - - free_utr(psUTR); -} - static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts) { S_NU_RH_PORT_CTRL *psPortCtrl; @@ -529,6 +521,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes { struct urequest *psSetup = (struct urequest *)buffer_nonch; RT_ASSERT(buffer_nonch != RT_NULL); + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] = 0; /* Read data from USB device. */ if (psSetup->request_type & USB_REQ_TYPE_DIR_IN) @@ -550,10 +543,31 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes //token == USBH_PID_DATA if (buffer_nonch && ((pipe->ep.bEndpointAddress & USB_DIR_MASK) == USB_DIR_IN)) { + struct urequest *psSetup = &psPortCtrl->asHubPortDev->asSetupReq[pipe->pipe_index]; + /* Read data from USB device. */ //Trigger USBHostLib Ctril_Xfer - ret = nu_ctrl_xfer(psPortDev, &psPortCtrl->asHubPortDev->asSetupReq[pipe->pipe_index], buffer_nonch, timeouts); - if (ret != nbytes) + /* + * Workaround: HCD driver can readback all bytes of setup.wLength, but not support single packet transferring. + */ + if (psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] == 0) + { + ret = nu_ctrl_xfer(psPortDev, psSetup, buffer_nonch, timeouts); + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] = ret; + } + else + { + if (psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] < nbytes) + { + ret = 0; + } + else + { + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] -= nbytes; + ret = nbytes; + } + } + if (ret <= 0) goto exit_nu_pipe_xfer; } else @@ -598,9 +612,6 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes } else if (pipe->ep.bmAttributes == USB_EP_ATTR_INT) { - psUTR->func = int_xfer_done_cb; - psUTR->context = pipe; - if (nu_int_xfer(pipe, psPortDev, psUTR, timeouts) < 0) { RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_pipe_xfer ERROR: int transfer failed\n")); @@ -610,7 +621,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes { i32XferLen = nbytes; } - goto exit2_nu_pipe_xfer; + goto exit_nu_pipe_xfer; } else if (pipe->ep.bmAttributes == USB_EP_ATTR_ISOC) { @@ -649,20 +660,17 @@ failreport_nu_pipe_xfer: i32XferLen = psUTR->xfer_len; +exit_nu_pipe_xfer: + //Call callback if (pipe->callback != RT_NULL) { pipe->callback(pipe); } -exit_nu_pipe_xfer: - if (psUTR) free_utr(psUTR); -exit2_nu_pipe_xfer: - - NU_USBHOST_UNLOCK(); return i32XferLen; @@ -859,7 +867,6 @@ int nu_usbh_register(void) { rt_err_t res; uhcd_t psUHCD; - uint32_t u32RegLockBackup; psUHCD = (uhcd_t)&s_sUSBHDev.uhcd; @@ -869,28 +876,32 @@ int nu_usbh_register(void) psUHCD->ops = &nu_uhcd_ops; psUHCD->num_ports = NU_MAX_USBH_PORT; + #if !defined(BSP_USING_HSOTG) - u32RegLockBackup = SYS_IsRegLocked(); - SYS_UnlockReg(); + { + uint32_t u32RegLockBackup; + + u32RegLockBackup = SYS_IsRegLocked(); + if (u32RegLockBackup) + SYS_UnlockReg(); #if defined(BSP_USING_HSUSBH) - /* Set USB Host role */ - SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_HSUSBROLE_Msk) | (0x1u << SYS_USBPHY_HSUSBROLE_Pos); - SYS->USBPHY |= SYS_USBPHY_HSUSBEN_Msk | SYS_USBPHY_SBO_Msk; - rt_thread_delay(20); - SYS->USBPHY |= SYS_USBPHY_HSUSBACT_Msk; - + /* Set USB Host role */ + SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_HSUSBROLE_Msk) | (0x1u << SYS_USBPHY_HSUSBROLE_Pos); + SYS->USBPHY |= SYS_USBPHY_HSUSBEN_Msk | SYS_USBPHY_SBO_Msk; + rt_thread_delay(20); + SYS->USBPHY |= SYS_USBPHY_HSUSBACT_Msk; #endif #if defined(BSP_USING_USBH) - /* Set USB Host role */ - SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_USBROLE_Msk) | (0x1u << SYS_USBPHY_USBROLE_Pos); - SYS->USBPHY |= SYS_USBPHY_USBEN_Msk | SYS_USBPHY_SBO_Msk ; + /* Set USB Host role */ + SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_USBROLE_Msk) | (0x1u << SYS_USBPHY_USBROLE_Pos); + SYS->USBPHY |= SYS_USBPHY_USBEN_Msk | SYS_USBPHY_SBO_Msk ; #endif - if (u32RegLockBackup) - SYS_LockReg(); - + if (u32RegLockBackup) + SYS_LockReg(); + } #endif @@ -909,6 +920,6 @@ int nu_usbh_register(void) return 0; } -INIT_DEVICE_EXPORT(nu_usbh_register); +INIT_APP_EXPORT(nu_usbh_register); #endif diff --git a/bsp/nuvoton/libraries/m480/rtt_port/drv_usbhost.c b/bsp/nuvoton/libraries/m480/rtt_port/drv_usbhost.c index 0df76a63ad..cf910fcc7e 100644 --- a/bsp/nuvoton/libraries/m480/rtt_port/drv_usbhost.c +++ b/bsp/nuvoton/libraries/m480/rtt_port/drv_usbhost.c @@ -23,6 +23,13 @@ #include "usb.h" #include "usbh_lib.h" +#define LOG_TAG "drv.usbhost" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_DBG +#define DBG_COLOR +#include + #if !defined(NU_USBHOST_HUB_POLLING_INTERVAL) #define NU_USBHOST_HUB_POLLING_INTERVAL (100) #endif @@ -62,6 +69,7 @@ typedef struct nu_port_dev UDEV_T *pUDev; EP_INFO_T *apsEPInfo[NU_MAX_USBH_PIPE]; struct urequest asSetupReq[NU_MAX_USBH_PIPE]; + uint32_t u32SentLength[NU_MAX_USBH_PIPE]; struct rt_completion utr_completion; int port_num; rt_bool_t bEnumDone; @@ -416,7 +424,6 @@ static int nu_bulk_xfer( rt_kprintf("psUTR->bIsTransferDone: %08x\n", psUTR->bIsTransferDone); rt_kprintf("psUTR->status: %08x\n", psUTR->status); rt_kprintf("psUTR->td_cnt: %08x\n", psUTR->td_cnt); - return -1; } return 0; @@ -429,22 +436,30 @@ static int nu_int_xfer( int timeouts) { int ret; - int retry = 3; - while (retry > 0) + while (1) { ret = usbh_int_xfer(psUTR); - if (ret == 0) + if (ret < 0) + return ret; + + if (rt_completion_wait(&(psPortDev->utr_completion), timeouts) != 0) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("Request %08x Timeout in %d ms!!\n", psUTR, timeouts)); + usbh_quit_utr(psUTR); + + rt_completion_init(&(psPortDev->utr_completion)); + rt_thread_mdelay(1); + } + else + { + + RT_DEBUG_LOG(RT_DEBUG_USB, ("Transferring done %08x\n", psUTR)); + usbh_quit_utr(psUTR); break; - - RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_int_xfer ERROR: failed to submit interrupt request\n")); - rt_thread_delay((pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) > 0 ? (pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) : 1); - retry --; + } } - if (ret < 0) - return ret; - return 0; } @@ -456,30 +471,6 @@ static void xfer_done_cb(UTR_T *psUTR) rt_completion_done(&(psPortDev->utr_completion)); } -static void int_xfer_done_cb(UTR_T *psUTR) -{ - upipe_t pipe = (upipe_t)psUTR->context; - - if (psUTR->status != 0) - { - RT_DEBUG_LOG(RT_DEBUG_USB, ("Interrupt xfer failed %d\n", psUTR->status)); - goto exit_int_xfer_done_cb; - } - - if (pipe->callback != RT_NULL) - { - struct uhost_msg msg; - msg.type = USB_MSG_CALLBACK; - msg.content.cb.function = pipe->callback; - msg.content.cb.context = pipe; - rt_usbh_event_signal(&s_sUSBHDev.uhcd, &msg); - } - -exit_int_xfer_done_cb: - - free_utr(psUTR); -} - static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts) { S_NU_RH_PORT_CTRL *psPortCtrl; @@ -513,6 +504,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes { struct urequest *psSetup = (struct urequest *)buffer_nonch; RT_ASSERT(buffer_nonch != RT_NULL); + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] = 0; /* Read data from USB device. */ if (psSetup->request_type & USB_REQ_TYPE_DIR_IN) @@ -534,10 +526,31 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes //token == USBH_PID_DATA if (buffer_nonch && ((pipe->ep.bEndpointAddress & USB_DIR_MASK) == USB_DIR_IN)) { + struct urequest *psSetup = &psPortCtrl->asHubPortDev->asSetupReq[pipe->pipe_index]; + /* Read data from USB device. */ //Trigger USBHostLib Ctril_Xfer - ret = nu_ctrl_xfer(psPortDev, &psPortCtrl->asHubPortDev->asSetupReq[pipe->pipe_index], buffer_nonch, timeouts); - if (ret != nbytes) + /* + * Workaround: HCD driver can readback all bytes of setup.wLength, but not support single packet transferring. + */ + if (psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] == 0) + { + ret = nu_ctrl_xfer(psPortDev, psSetup, buffer_nonch, timeouts); + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] = ret; + } + else + { + if (psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] < nbytes) + { + ret = 0; + } + else + { + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] -= nbytes; + ret = nbytes; + } + } + if (ret <= 0) goto exit_nu_pipe_xfer; } else @@ -582,9 +595,6 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes } else if (pipe->ep.bmAttributes == USB_EP_ATTR_INT) { - psUTR->func = int_xfer_done_cb; - psUTR->context = pipe; - if (nu_int_xfer(pipe, psPortDev, psUTR, timeouts) < 0) { RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_pipe_xfer ERROR: int transfer failed\n")); @@ -594,7 +604,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes { i32XferLen = nbytes; } - goto exit2_nu_pipe_xfer; + goto exit_nu_pipe_xfer; } else if (pipe->ep.bmAttributes == USB_EP_ATTR_ISOC) { @@ -633,20 +643,17 @@ failreport_nu_pipe_xfer: i32XferLen = psUTR->xfer_len; +exit_nu_pipe_xfer: + //Call callback if (pipe->callback != RT_NULL) { pipe->callback(pipe); } -exit_nu_pipe_xfer: - if (psUTR) free_utr(psUTR); -exit2_nu_pipe_xfer: - - NU_USBHOST_UNLOCK(); return i32XferLen; @@ -852,25 +859,32 @@ int nu_usbh_register(void) psUHCD->ops = &nu_uhcd_ops; psUHCD->num_ports = NU_MAX_USBH_PORT; + #if !defined(BSP_USING_HSOTG) - SYS_UnlockReg(); + { + uint32_t u32RegLockBackup; + + u32RegLockBackup = SYS_IsRegLocked(); + if (u32RegLockBackup) + SYS_UnlockReg(); #if defined(BSP_USING_HSUSBH) - /* Set USB Host role */ - SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_HSUSBROLE_Msk) | (0x1u << SYS_USBPHY_HSUSBROLE_Pos); - SYS->USBPHY |= SYS_USBPHY_HSUSBEN_Msk | SYS_USBPHY_SBO_Msk; - rt_thread_delay(20); - SYS->USBPHY |= SYS_USBPHY_HSUSBACT_Msk; - + /* Set USB Host role */ + SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_HSUSBROLE_Msk) | (0x1u << SYS_USBPHY_HSUSBROLE_Pos); + SYS->USBPHY |= SYS_USBPHY_HSUSBEN_Msk | SYS_USBPHY_SBO_Msk; + rt_thread_delay(20); + SYS->USBPHY |= SYS_USBPHY_HSUSBACT_Msk; #endif #if defined(BSP_USING_USBH) - /* Set USB Host role */ - SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_USBROLE_Msk) | (0x1u << SYS_USBPHY_USBROLE_Pos); - SYS->USBPHY |= SYS_USBPHY_USBEN_Msk | SYS_USBPHY_SBO_Msk ; + /* Set USB Host role */ + SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_USBROLE_Msk) | (0x1u << SYS_USBPHY_USBROLE_Pos); + SYS->USBPHY |= SYS_USBPHY_USBEN_Msk | SYS_USBPHY_SBO_Msk ; #endif - SYS_LockReg(); + if (u32RegLockBackup) + SYS_LockReg(); + } #endif @@ -889,6 +903,6 @@ int nu_usbh_register(void) return 0; } -INIT_DEVICE_EXPORT(nu_usbh_register); +INIT_APP_EXPORT(nu_usbh_register); #endif diff --git a/bsp/nuvoton/libraries/ma35/CMSIS/Include/arm_common_tables.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/arm_common_tables.h new file mode 100644 index 0000000000..03153851b8 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/arm_common_tables.h @@ -0,0 +1,136 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2014 ARM Limited. All rights reserved. +* +* $Date: 19. October 2015 +* $Revision: V.1.4.5 a +* +* Project: CMSIS DSP Library +* Title: arm_common_tables.h +* +* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (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 _ARM_COMMON_TABLES_H +#define _ARM_COMMON_TABLES_H + +#include "arm_math.h" + +extern const uint16_t armBitRevTable[1024]; +extern const q15_t armRecipTableQ15[64]; +extern const q31_t armRecipTableQ31[64]; +/* extern const q31_t realCoefAQ31[1024]; */ +/* extern const q31_t realCoefBQ31[1024]; */ +extern const float32_t twiddleCoef_16[32]; +extern const float32_t twiddleCoef_32[64]; +extern const float32_t twiddleCoef_64[128]; +extern const float32_t twiddleCoef_128[256]; +extern const float32_t twiddleCoef_256[512]; +extern const float32_t twiddleCoef_512[1024]; +extern const float32_t twiddleCoef_1024[2048]; +extern const float32_t twiddleCoef_2048[4096]; +extern const float32_t twiddleCoef_4096[8192]; +#define twiddleCoef twiddleCoef_4096 +extern const q31_t twiddleCoef_16_q31[24]; +extern const q31_t twiddleCoef_32_q31[48]; +extern const q31_t twiddleCoef_64_q31[96]; +extern const q31_t twiddleCoef_128_q31[192]; +extern const q31_t twiddleCoef_256_q31[384]; +extern const q31_t twiddleCoef_512_q31[768]; +extern const q31_t twiddleCoef_1024_q31[1536]; +extern const q31_t twiddleCoef_2048_q31[3072]; +extern const q31_t twiddleCoef_4096_q31[6144]; +extern const q15_t twiddleCoef_16_q15[24]; +extern const q15_t twiddleCoef_32_q15[48]; +extern const q15_t twiddleCoef_64_q15[96]; +extern const q15_t twiddleCoef_128_q15[192]; +extern const q15_t twiddleCoef_256_q15[384]; +extern const q15_t twiddleCoef_512_q15[768]; +extern const q15_t twiddleCoef_1024_q15[1536]; +extern const q15_t twiddleCoef_2048_q15[3072]; +extern const q15_t twiddleCoef_4096_q15[6144]; +extern const float32_t twiddleCoef_rfft_32[32]; +extern const float32_t twiddleCoef_rfft_64[64]; +extern const float32_t twiddleCoef_rfft_128[128]; +extern const float32_t twiddleCoef_rfft_256[256]; +extern const float32_t twiddleCoef_rfft_512[512]; +extern const float32_t twiddleCoef_rfft_1024[1024]; +extern const float32_t twiddleCoef_rfft_2048[2048]; +extern const float32_t twiddleCoef_rfft_4096[4096]; + + +/* floating-point bit reversal tables */ +#define ARMBITREVINDEXTABLE__16_TABLE_LENGTH ((uint16_t)20 ) +#define ARMBITREVINDEXTABLE__32_TABLE_LENGTH ((uint16_t)48 ) +#define ARMBITREVINDEXTABLE__64_TABLE_LENGTH ((uint16_t)56 ) +#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208 ) +#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440 ) +#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448 ) +#define ARMBITREVINDEXTABLE1024_TABLE_LENGTH ((uint16_t)1800) +#define ARMBITREVINDEXTABLE2048_TABLE_LENGTH ((uint16_t)3808) +#define ARMBITREVINDEXTABLE4096_TABLE_LENGTH ((uint16_t)4032) + +extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE__16_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE__32_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE__64_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE1024_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE2048_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE4096_TABLE_LENGTH]; + +/* fixed-point bit reversal tables */ +#define ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH ((uint16_t)12 ) +#define ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH ((uint16_t)24 ) +#define ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH ((uint16_t)56 ) +#define ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH ((uint16_t)112 ) +#define ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH ((uint16_t)240 ) +#define ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH ((uint16_t)480 ) +#define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992 ) +#define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984) +#define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032) + +extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH]; +extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH]; + +/* Tables for Fast Math Sine and Cosine */ +extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1]; +extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1]; +extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1]; + +#endif /* ARM_COMMON_TABLES_H */ diff --git a/bsp/nuvoton/libraries/ma35/CMSIS/Include/arm_const_structs.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/arm_const_structs.h new file mode 100644 index 0000000000..4d02617344 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/arm_const_structs.h @@ -0,0 +1,79 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2014 ARM Limited. All rights reserved. +* +* $Date: 19. March 2015 +* $Revision: V.1.4.5 +* +* Project: CMSIS DSP Library +* Title: arm_const_structs.h +* +* Description: This file has constant structs that are initialized for +* user convenience. For example, some can be given as +* arguments to the arm_cfft_f32() function. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (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 _ARM_CONST_STRUCTS_H +#define _ARM_CONST_STRUCTS_H + +#include "arm_math.h" +#include "arm_common_tables.h" + +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096; + +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096; + +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096; + +#endif diff --git a/bsp/nuvoton/libraries/ma35/CMSIS/Include/arm_math.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/arm_math.h new file mode 100644 index 0000000000..dd69a3e32f --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/arm_math.h @@ -0,0 +1,7154 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2015 ARM Limited. All rights reserved. +* +* $Date: 20. October 2015 +* $Revision: V1.4.5 b +* +* Project: CMSIS DSP Library +* Title: arm_math.h +* +* Description: Public header file for CMSIS DSP Library +* +* Target Processor: Cortex-M7/Cortex-M4/Cortex-M3/Cortex-M0 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. + * -------------------------------------------------------------------- */ + +/** + \mainpage CMSIS DSP Software Library + * + * Introduction + * ------------ + * + * This user manual describes the CMSIS DSP software library, + * a suite of common signal processing functions for use on Cortex-M processor based devices. + * + * The library is divided into a number of functions each covering a specific category: + * - Basic math functions + * - Fast math functions + * - Complex math functions + * - Filters + * - Matrix functions + * - Transforms + * - Motor control functions + * - Statistical functions + * - Support functions + * - Interpolation functions + * + * The library has separate functions for operating on 8-bit integers, 16-bit integers, + * 32-bit integer and 32-bit floating-point values. + * + * Using the Library + * ------------ + * + * The library installer contains prebuilt versions of the libraries in the Lib folder. + * - arm_cortexM7lfdp_math.lib (Little endian and Double Precision Floating Point Unit on Cortex-M7) + * - arm_cortexM7bfdp_math.lib (Big endian and Double Precision Floating Point Unit on Cortex-M7) + * - arm_cortexM7lfsp_math.lib (Little endian and Single Precision Floating Point Unit on Cortex-M7) + * - arm_cortexM7bfsp_math.lib (Big endian and Single Precision Floating Point Unit on Cortex-M7) + * - arm_cortexM7l_math.lib (Little endian on Cortex-M7) + * - arm_cortexM7b_math.lib (Big endian on Cortex-M7) + * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4) + * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4) + * - arm_cortexM4l_math.lib (Little endian on Cortex-M4) + * - arm_cortexM4b_math.lib (Big endian on Cortex-M4) + * - arm_cortexM3l_math.lib (Little endian on Cortex-M3) + * - arm_cortexM3b_math.lib (Big endian on Cortex-M3) + * - arm_cortexM0l_math.lib (Little endian on Cortex-M0 / CortexM0+) + * - arm_cortexM0b_math.lib (Big endian on Cortex-M0 / CortexM0+) + * + * The library functions are declared in the public file arm_math.h which is placed in the Include folder. + * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single + * public header file arm_math.h for Cortex-M7/M4/M3/M0/M0+ with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. + * Define the appropriate pre processor MACRO ARM_MATH_CM7 or ARM_MATH_CM4 or ARM_MATH_CM3 or + * ARM_MATH_CM0 or ARM_MATH_CM0PLUS depending on the target processor in the application. + * + * Examples + * -------- + * + * The library ships with a number of examples which demonstrate how to use the library functions. + * + * Toolchain Support + * ------------ + * + * The library has been developed and tested with MDK-ARM version 5.14.0.0 + * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. + * + * Building the Library + * ------------ + * + * The library installer contains a project file to re build libraries on MDK-ARM Tool chain in the CMSIS\\DSP_Lib\\Source\\ARM folder. + * - arm_cortexM_math.uvprojx + * + * + * The libraries can be built by opening the arm_cortexM_math.uvprojx project in MDK-ARM, selecting a specific target, and defining the optional pre processor MACROs detailed above. + * + * Pre-processor Macros + * ------------ + * + * Each library project have differant pre-processor macros. + * + * - UNALIGNED_SUPPORT_DISABLE: + * + * Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access + * + * - ARM_MATH_BIG_ENDIAN: + * + * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. + * + * - ARM_MATH_MATRIX_CHECK: + * + * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices + * + * - ARM_MATH_ROUNDING: + * + * Define macro ARM_MATH_ROUNDING for rounding on support functions + * + * - ARM_MATH_CMx: + * + * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target + * and ARM_MATH_CM0 for building library on Cortex-M0 target, ARM_MATH_CM0PLUS for building library on Cortex-M0+ target, and + * ARM_MATH_CM7 for building the library on cortex-M7. + * + * - __FPU_PRESENT: + * + * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries + * + *
+ * CMSIS-DSP in ARM::CMSIS Pack + * ----------------------------- + * + * The following files relevant to CMSIS-DSP are present in the ARM::CMSIS Pack directories: + * |File/Folder |Content | + * |------------------------------|------------------------------------------------------------------------| + * |\b CMSIS\\Documentation\\DSP | This documentation | + * |\b CMSIS\\DSP_Lib | Software license agreement (license.txt) | + * |\b CMSIS\\DSP_Lib\\Examples | Example projects demonstrating the usage of the library functions | + * |\b CMSIS\\DSP_Lib\\Source | Source files for rebuilding the library | + * + *
+ * Revision History of CMSIS-DSP + * ------------ + * Please refer to \ref ChangeLog_pg. + * + * Copyright Notice + * ------------ + * + * Copyright (C) 2010-2015 ARM Limited. All rights reserved. + */ + + +/** + * @defgroup groupMath Basic Math Functions + */ + +/** + * @defgroup groupFastMath Fast Math Functions + * This set of functions provides a fast approximation to sine, cosine, and square root. + * As compared to most of the other functions in the CMSIS math library, the fast math functions + * operate on individual values and not arrays. + * There are separate functions for Q15, Q31, and floating-point data. + * + */ + +/** + * @defgroup groupCmplxMath Complex Math Functions + * This set of functions operates on complex data vectors. + * The data in the complex arrays is stored in an interleaved fashion + * (real, imag, real, imag, ...). + * In the API functions, the number of samples in a complex array refers + * to the number of complex values; the array contains twice this number of + * real values. + */ + +/** + * @defgroup groupFilters Filtering Functions + */ + +/** + * @defgroup groupMatrix Matrix Functions + * + * This set of functions provides basic matrix math operations. + * The functions operate on matrix data structures. For example, + * the type + * definition for the floating-point matrix structure is shown + * below: + *
+ *     typedef struct
+ *     {
+ *       uint16_t numRows;     // number of rows of the matrix.
+ *       uint16_t numCols;     // number of columns of the matrix.
+ *       float32_t *pData;     // points to the data of the matrix.
+ *     } arm_matrix_instance_f32;
+ * 
+ * There are similar definitions for Q15 and Q31 data types. + * + * The structure specifies the size of the matrix and then points to + * an array of data. The array is of size numRows X numCols + * and the values are arranged in row order. That is, the + * matrix element (i, j) is stored at: + *
+ *     pData[i*numCols + j]
+ * 
+ * + * \par Init Functions + * There is an associated initialization function for each type of matrix + * data structure. + * The initialization function sets the values of the internal structure fields. + * Refer to the function arm_mat_init_f32(), arm_mat_init_q31() + * and arm_mat_init_q15() for floating-point, Q31 and Q15 types, respectively. + * + * \par + * Use of the initialization function is optional. However, if initialization function is used + * then the instance structure cannot be placed into a const data section. + * To place the instance structure in a const data + * section, manually initialize the data structure. For example: + *
+ * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
+ * 
+ * where nRows specifies the number of rows, nColumns + * specifies the number of columns, and pData points to the + * data array. + * + * \par Size Checking + * By default all of the matrix functions perform size checking on the input and + * output matrices. For example, the matrix addition function verifies that the + * two input matrices and the output matrix all have the same number of rows and + * columns. If the size check fails the functions return: + *
+ *     ARM_MATH_SIZE_MISMATCH
+ * 
+ * Otherwise the functions return + *
+ *     ARM_MATH_SUCCESS
+ * 
+ * There is some overhead associated with this matrix size checking. + * The matrix size checking is enabled via the \#define + *
+ *     ARM_MATH_MATRIX_CHECK
+ * 
+ * within the library project settings. By default this macro is defined + * and size checking is enabled. By changing the project settings and + * undefining this macro size checking is eliminated and the functions + * run a bit faster. With size checking disabled the functions always + * return ARM_MATH_SUCCESS. + */ + +/** + * @defgroup groupTransforms Transform Functions + */ + +/** + * @defgroup groupController Controller Functions + */ + +/** + * @defgroup groupStats Statistics Functions + */ +/** + * @defgroup groupSupport Support Functions + */ + +/** + * @defgroup groupInterpolation Interpolation Functions + * These functions perform 1- and 2-dimensional interpolation of data. + * Linear interpolation is used for 1-dimensional data and + * bilinear interpolation is used for 2-dimensional data. + */ + +/** + * @defgroup groupExamples Examples + */ +#ifndef _ARM_MATH_H +#define _ARM_MATH_H + +/* ignore some GCC warnings */ +#if defined ( __GNUC__ ) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsign-conversion" + #pragma GCC diagnostic ignored "-Wconversion" + #pragma GCC diagnostic ignored "-Wunused-parameter" +#endif + +#define __CMSIS_GENERIC /* disable NVIC and Systick functions */ + +#if defined(ARM_MATH_CM7) + #include "core_cm7.h" +#elif defined (ARM_MATH_CM4) + #include "core_cm4.h" +#elif defined (ARM_MATH_CM3) + #include "core_cm3.h" +#elif defined (ARM_MATH_CM0) + #include "core_cm0.h" + #define ARM_MATH_CM0_FAMILY +#elif defined (ARM_MATH_CM0PLUS) + #include "core_cm0plus.h" + #define ARM_MATH_CM0_FAMILY +#else + #error "Define according the used Cortex core ARM_MATH_CM7, ARM_MATH_CM4, ARM_MATH_CM3, ARM_MATH_CM0PLUS or ARM_MATH_CM0" +#endif + +#undef __CMSIS_GENERIC /* enable NVIC and Systick functions */ +#include "string.h" +#include "math.h" +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** + * @brief Macros required for reciprocal calculation in Normalized LMS + */ + +#define DELTA_Q31 (0x100) +#define DELTA_Q15 0x5 +#define INDEX_MASK 0x0000003F +#ifndef PI +#define PI 3.14159265358979f +#endif + +/** + * @brief Macros required for SINE and COSINE Fast math approximations + */ + +#define FAST_MATH_TABLE_SIZE 512 +#define FAST_MATH_Q31_SHIFT (32 - 10) +#define FAST_MATH_Q15_SHIFT (16 - 10) +#define CONTROLLER_Q31_SHIFT (32 - 9) +#define TABLE_SIZE 256 +#define TABLE_SPACING_Q31 0x400000 +#define TABLE_SPACING_Q15 0x80 + +/** + * @brief Macros required for SINE and COSINE Controller functions + */ +/* 1.31(q31) Fixed value of 2/360 */ +/* -1 to +1 is divided into 360 values so total spacing is (2/360) */ +#define INPUT_SPACING 0xB60B61 + +/** + * @brief Macro for Unaligned Support + */ +#ifndef UNALIGNED_SUPPORT_DISABLE +#define ALIGN4 +#else +#if defined (__GNUC__) +#define ALIGN4 __attribute__((aligned(4))) +#else +#define ALIGN4 __align(4) +#endif +#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ + +/** + * @brief Error status returned by some functions in the library. + */ + +typedef enum +{ + ARM_MATH_SUCCESS = 0, /**< No error */ + ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ + ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ + ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ + ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ + ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ + ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ +} arm_status; + +/** + * @brief 8-bit fractional data type in 1.7 format. + */ +typedef int8_t q7_t; + +/** + * @brief 16-bit fractional data type in 1.15 format. + */ +typedef int16_t q15_t; + +/** + * @brief 32-bit fractional data type in 1.31 format. + */ +typedef int32_t q31_t; + +/** + * @brief 64-bit fractional data type in 1.63 format. + */ +typedef int64_t q63_t; + +/** + * @brief 32-bit floating-point type definition. + */ +typedef float float32_t; + +/** + * @brief 64-bit floating-point type definition. + */ +typedef double float64_t; + +/** + * @brief definition to read/write two 16 bit values. + */ +#if defined __CC_ARM +#define __SIMD32_TYPE int32_t __packed +#define CMSIS_UNUSED __attribute__((unused)) + +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define __SIMD32_TYPE int32_t +#define CMSIS_UNUSED __attribute__((unused)) + +#elif defined __GNUC__ +#define __SIMD32_TYPE int32_t +#define CMSIS_UNUSED __attribute__((unused)) + +#elif defined __ICCARM__ +#define __SIMD32_TYPE int32_t __packed +#define CMSIS_UNUSED + +#elif defined __CSMC__ +#define __SIMD32_TYPE int32_t +#define CMSIS_UNUSED + +#elif defined __TASKING__ +#define __SIMD32_TYPE __unaligned int32_t +#define CMSIS_UNUSED + +#else +#error Unknown compiler +#endif + +#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) +#define __SIMD32_CONST(addr) ((__SIMD32_TYPE *)(addr)) +#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE *) (addr)) +#define __SIMD64(addr) (*(int64_t **) & (addr)) + +#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) +/** + * @brief definition to pack two 16 bit values. + */ +#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ + (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) +#define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ + (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) + +#endif + + +/** +* @brief definition to pack four 8 bit values. +*/ +#ifndef ARM_MATH_BIG_ENDIAN + +#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) +#else + +#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) + +#endif + + +/** + * @brief Clips Q63 to Q31 values. + */ +static __INLINE q31_t clip_q63_to_q31( + q63_t x) +{ + return ((q31_t)(x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFFFFFF ^ ((q31_t)(x >> 63)))) : (q31_t) x; +} + +/** + * @brief Clips Q63 to Q15 values. + */ +static __INLINE q15_t clip_q63_to_q15( + q63_t x) +{ + return ((q31_t)(x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFF ^ ((q15_t)(x >> 63)))) : (q15_t)(x >> 15); +} + +/** + * @brief Clips Q31 to Q7 values. + */ +static __INLINE q7_t clip_q31_to_q7( + q31_t x) +{ + return ((q31_t)(x >> 24) != ((q31_t) x >> 23)) ? + ((0x7F ^ ((q7_t)(x >> 31)))) : (q7_t) x; +} + +/** + * @brief Clips Q31 to Q15 values. + */ +static __INLINE q15_t clip_q31_to_q15( + q31_t x) +{ + return ((q31_t)(x >> 16) != ((q31_t) x >> 15)) ? + ((0x7FFF ^ ((q15_t)(x >> 31)))) : (q15_t) x; +} + +/** + * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. + */ + +static __INLINE q63_t mult32x64( + q63_t x, + q31_t y) +{ + return ((((q63_t)(x & 0x00000000FFFFFFFF) * y) >> 32) + + (((q63_t)(x >> 32) * y))); +} + +/* + #if defined (ARM_MATH_CM0_FAMILY) && defined ( __CC_ARM ) + #define __CLZ __clz + #endif + */ +/* note: function can be removed when all toolchain support __CLZ for Cortex-M0 */ +#if defined (ARM_MATH_CM0_FAMILY) && ((defined (__ICCARM__)) ) +static __INLINE uint32_t __CLZ( + q31_t data); + +static __INLINE uint32_t __CLZ( + q31_t data) +{ + uint32_t count = 0; + uint32_t mask = 0x80000000; + + while ((data & mask) == 0) + { + count += 1u; + mask = mask >> 1u; + } + + return (count); +} +#endif + +/** + * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type. + */ + +static __INLINE uint32_t arm_recip_q31( + q31_t in, + q31_t *dst, + q31_t *pRecipTable) +{ + q31_t out; + uint32_t tempVal; + uint32_t index, i; + uint32_t signBits; + + if (in > 0) + { + signBits = ((uint32_t)(__CLZ(in) - 1)); + } + else + { + signBits = ((uint32_t)(__CLZ(-in) - 1)); + } + + /* Convert input sample to 1.31 format */ + in = (in << signBits); + + /* calculation of index for initial approximated Val */ + index = (uint32_t)(in >> 24); + index = (index & INDEX_MASK); + + /* 1.31 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0u; i < 2u; i++) + { + tempVal = (uint32_t)(((q63_t) in * out) >> 31); + tempVal = 0x7FFFFFFFu - tempVal; + /* 1.31 with exp 1 */ + /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */ + out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30); + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1u); +} + + +/** + * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type. + */ +static __INLINE uint32_t arm_recip_q15( + q15_t in, + q15_t *dst, + q15_t *pRecipTable) +{ + q15_t out = 0; + uint32_t tempVal = 0; + uint32_t index = 0, i = 0; + uint32_t signBits = 0; + + if (in > 0) + { + signBits = ((uint32_t)(__CLZ(in) - 17)); + } + else + { + signBits = ((uint32_t)(__CLZ(-in) - 17)); + } + + /* Convert input sample to 1.15 format */ + in = (in << signBits); + + /* calculation of index for initial approximated Val */ + index = (uint32_t)(in >> 8); + index = (index & INDEX_MASK); + + /* 1.15 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0u; i < 2u; i++) + { + tempVal = (uint32_t)(((q31_t) in * out) >> 15); + tempVal = 0x7FFFu - tempVal; + /* 1.15 with exp 1 */ + out = (q15_t)(((q31_t) out * tempVal) >> 14); + /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */ + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1); +} + + +/* + * @brief C custom defined intrinisic function for only M0 processors + */ +#if defined(ARM_MATH_CM0_FAMILY) +static __INLINE q31_t __SSAT( + q31_t x, + uint32_t y) +{ + int32_t posMax, negMin; + uint32_t i; + + posMax = 1; + for (i = 0; i < (y - 1); i++) + { + posMax = posMax * 2; + } + + if (x > 0) + { + posMax = (posMax - 1); + + if (x > posMax) + { + x = posMax; + } + } + else + { + negMin = -posMax; + + if (x < negMin) + { + x = negMin; + } + } + return (x); +} +#endif /* end of ARM_MATH_CM0_FAMILY */ + + +/* + * @brief C custom defined intrinsic function for M3 and M0 processors + */ +#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) + +/* + * @brief C custom defined QADD8 for M3 and M0 processors + */ +static __INLINE uint32_t __QADD8( + uint32_t x, + uint32_t y) +{ + q31_t r, s, t, u; + + r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; + s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; + t = __SSAT(((((q31_t)x << 8) >> 24) + (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; + u = __SSAT(((((q31_t)x) >> 24) + (((q31_t)y) >> 24)), 8) & (int32_t)0x000000FF; + + return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r))); +} + + +/* + * @brief C custom defined QSUB8 for M3 and M0 processors + */ +static __INLINE uint32_t __QSUB8( + uint32_t x, + uint32_t y) +{ + q31_t r, s, t, u; + + r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; + s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; + t = __SSAT(((((q31_t)x << 8) >> 24) - (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; + u = __SSAT(((((q31_t)x) >> 24) - (((q31_t)y) >> 24)), 8) & (int32_t)0x000000FF; + + return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r))); +} + + +/* + * @brief C custom defined QADD16 for M3 and M0 processors + */ +static __INLINE uint32_t __QADD16( + uint32_t x, + uint32_t y) +{ + /* q31_t r, s; without initialisation 'arm_offset_q15 test' fails but 'intrinsic' tests pass! for armCC */ + q31_t r = 0, s = 0; + + r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x) >> 16) + (((q31_t)y) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r))); +} + + +/* + * @brief C custom defined SHADD16 for M3 and M0 processors + */ +static __INLINE uint32_t __SHADD16( + uint32_t x, + uint32_t y) +{ + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x) >> 16) + (((q31_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r))); +} + + +/* + * @brief C custom defined QSUB16 for M3 and M0 processors + */ +static __INLINE uint32_t __QSUB16( + uint32_t x, + uint32_t y) +{ + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x) >> 16) - (((q31_t)y) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r))); +} + + +/* + * @brief C custom defined SHSUB16 for M3 and M0 processors + */ +static __INLINE uint32_t __SHSUB16( + uint32_t x, + uint32_t y) +{ + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x) >> 16) - (((q31_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r))); +} + + +/* + * @brief C custom defined QASX for M3 and M0 processors + */ +static __INLINE uint32_t __QASX( + uint32_t x, + uint32_t y) +{ + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r))); +} + + +/* + * @brief C custom defined SHASX for M3 and M0 processors + */ +static __INLINE uint32_t __SHASX( + uint32_t x, + uint32_t y) +{ + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) - (((q31_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r))); +} + + +/* + * @brief C custom defined QSAX for M3 and M0 processors + */ +static __INLINE uint32_t __QSAX( + uint32_t x, + uint32_t y) +{ + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r))); +} + + +/* + * @brief C custom defined SHSAX for M3 and M0 processors + */ +static __INLINE uint32_t __SHSAX( + uint32_t x, + uint32_t y) +{ + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) + (((q31_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r))); +} + + +/* + * @brief C custom defined SMUSDX for M3 and M0 processors + */ +static __INLINE uint32_t __SMUSDX( + uint32_t x, + uint32_t y) +{ + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y) >> 16)) - + ((((q31_t)x) >> 16) * (((q31_t)y << 16) >> 16)))); +} + +/* + * @brief C custom defined SMUADX for M3 and M0 processors + */ +static __INLINE uint32_t __SMUADX( + uint32_t x, + uint32_t y) +{ + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y) >> 16)) + + ((((q31_t)x) >> 16) * (((q31_t)y << 16) >> 16)))); +} + + +/* + * @brief C custom defined QADD for M3 and M0 processors + */ +static __INLINE int32_t __QADD( + int32_t x, + int32_t y) +{ + return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y))); +} + + +/* + * @brief C custom defined QSUB for M3 and M0 processors + */ +static __INLINE int32_t __QSUB( + int32_t x, + int32_t y) +{ + return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y))); +} + + +/* + * @brief C custom defined SMLAD for M3 and M0 processors + */ +static __INLINE uint32_t __SMLAD( + uint32_t x, + uint32_t y, + uint32_t sum) +{ + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x) >> 16) * (((q31_t)y) >> 16)) + + (((q31_t)sum)))); +} + + +/* + * @brief C custom defined SMLADX for M3 and M0 processors + */ +static __INLINE uint32_t __SMLADX( + uint32_t x, + uint32_t y, + uint32_t sum) +{ + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y) >> 16)) + + ((((q31_t)x) >> 16) * (((q31_t)y << 16) >> 16)) + + (((q31_t)sum)))); +} + + +/* + * @brief C custom defined SMLSDX for M3 and M0 processors + */ +static __INLINE uint32_t __SMLSDX( + uint32_t x, + uint32_t y, + uint32_t sum) +{ + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y) >> 16)) - + ((((q31_t)x) >> 16) * (((q31_t)y << 16) >> 16)) + + (((q31_t)sum)))); +} + + +/* + * @brief C custom defined SMLALD for M3 and M0 processors + */ +static __INLINE uint64_t __SMLALD( + uint32_t x, + uint32_t y, + uint64_t sum) +{ + /* return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */ + return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x) >> 16) * (((q31_t)y) >> 16)) + + (((q63_t)sum)))); +} + + +/* + * @brief C custom defined SMLALDX for M3 and M0 processors + */ +static __INLINE uint64_t __SMLALDX( + uint32_t x, + uint32_t y, + uint64_t sum) +{ + /* return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */ + return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y) >> 16)) + + ((((q31_t)x) >> 16) * (((q31_t)y << 16) >> 16)) + + (((q63_t)sum)))); +} + + +/* + * @brief C custom defined SMUAD for M3 and M0 processors + */ +static __INLINE uint32_t __SMUAD( + uint32_t x, + uint32_t y) +{ + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x) >> 16) * (((q31_t)y) >> 16)))); +} + + +/* + * @brief C custom defined SMUSD for M3 and M0 processors + */ +static __INLINE uint32_t __SMUSD( + uint32_t x, + uint32_t y) +{ + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) - + ((((q31_t)x) >> 16) * (((q31_t)y) >> 16)))); +} + + +/* + * @brief C custom defined SXTB16 for M3 and M0 processors + */ +static __INLINE uint32_t __SXTB16( + uint32_t x) +{ + return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) | + ((((q31_t)x << 8) >> 8) & (q31_t)0xFFFF0000))); +} + +#endif /* defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */ + + +/** + * @brief Instance structure for the Q7 FIR filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ +} arm_fir_instance_q7; + +/** + * @brief Instance structure for the Q15 FIR filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ +} arm_fir_instance_q15; + +/** + * @brief Instance structure for the Q31 FIR filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ +} arm_fir_instance_q31; + +/** + * @brief Instance structure for the floating-point FIR filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ +} arm_fir_instance_f32; + + +/** + * @brief Processing function for the Q7 FIR filter. + * @param[in] S points to an instance of the Q7 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_fir_q7( + const arm_fir_instance_q7 *S, + q7_t *pSrc, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q7 FIR filter. + * @param[in,out] S points to an instance of the Q7 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed. + */ +void arm_fir_init_q7( + arm_fir_instance_q7 *S, + uint16_t numTaps, + q7_t *pCoeffs, + q7_t *pState, + uint32_t blockSize); + + +/** + * @brief Processing function for the Q15 FIR filter. + * @param[in] S points to an instance of the Q15 FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_fir_q15( + const arm_fir_instance_q15 *S, + q15_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_fir_fast_q15( + const arm_fir_instance_q15 *S, + q15_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q15 FIR filter. + * @param[in,out] S points to an instance of the Q15 FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if + * numTaps is not a supported value. + */ +arm_status arm_fir_init_q15( + arm_fir_instance_q15 *S, + uint16_t numTaps, + q15_t *pCoeffs, + q15_t *pState, + uint32_t blockSize); + + +/** + * @brief Processing function for the Q31 FIR filter. + * @param[in] S points to an instance of the Q31 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_fir_q31( + const arm_fir_instance_q31 *S, + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_fir_fast_q31( + const arm_fir_instance_q31 *S, + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q31 FIR filter. + * @param[in,out] S points to an instance of the Q31 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + */ +void arm_fir_init_q31( + arm_fir_instance_q31 *S, + uint16_t numTaps, + q31_t *pCoeffs, + q31_t *pState, + uint32_t blockSize); + + +/** + * @brief Processing function for the floating-point FIR filter. + * @param[in] S points to an instance of the floating-point FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_fir_f32( + const arm_fir_instance_f32 *S, + float32_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the floating-point FIR filter. + * @param[in,out] S points to an instance of the floating-point FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + */ +void arm_fir_init_f32( + arm_fir_instance_f32 *S, + uint16_t numTaps, + float32_t *pCoeffs, + float32_t *pState, + uint32_t blockSize); + + +/** + * @brief Instance structure for the Q15 Biquad cascade filter. + */ +typedef struct +{ + int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ +} arm_biquad_casd_df1_inst_q15; + +/** + * @brief Instance structure for the Q31 Biquad cascade filter. + */ +typedef struct +{ + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ +} arm_biquad_casd_df1_inst_q31; + +/** + * @brief Instance structure for the floating-point Biquad cascade filter. + */ +typedef struct +{ + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ +} arm_biquad_casd_df1_inst_f32; + + +/** + * @brief Processing function for the Q15 Biquad cascade filter. + * @param[in] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_biquad_cascade_df1_q15( + const arm_biquad_casd_df1_inst_q15 *S, + q15_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q15 Biquad cascade filter. + * @param[in,out] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + */ +void arm_biquad_cascade_df1_init_q15( + arm_biquad_casd_df1_inst_q15 *S, + uint8_t numStages, + q15_t *pCoeffs, + q15_t *pState, + int8_t postShift); + + +/** + * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_biquad_cascade_df1_fast_q15( + const arm_biquad_casd_df1_inst_q15 *S, + q15_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Processing function for the Q31 Biquad cascade filter + * @param[in] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_biquad_cascade_df1_q31( + const arm_biquad_casd_df1_inst_q31 *S, + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_biquad_cascade_df1_fast_q31( + const arm_biquad_casd_df1_inst_q31 *S, + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q31 Biquad cascade filter. + * @param[in,out] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + */ +void arm_biquad_cascade_df1_init_q31( + arm_biquad_casd_df1_inst_q31 *S, + uint8_t numStages, + q31_t *pCoeffs, + q31_t *pState, + int8_t postShift); + + +/** + * @brief Processing function for the floating-point Biquad cascade filter. + * @param[in] S points to an instance of the floating-point Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_biquad_cascade_df1_f32( + const arm_biquad_casd_df1_inst_f32 *S, + float32_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the floating-point Biquad cascade filter. + * @param[in,out] S points to an instance of the floating-point Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ +void arm_biquad_cascade_df1_init_f32( + arm_biquad_casd_df1_inst_f32 *S, + uint8_t numStages, + float32_t *pCoeffs, + float32_t *pState); + + +/** + * @brief Instance structure for the floating-point matrix structure. + */ +typedef struct +{ + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float32_t *pData; /**< points to the data of the matrix. */ +} arm_matrix_instance_f32; + + +/** + * @brief Instance structure for the floating-point matrix structure. + */ +typedef struct +{ + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float64_t *pData; /**< points to the data of the matrix. */ +} arm_matrix_instance_f64; + +/** + * @brief Instance structure for the Q15 matrix structure. + */ +typedef struct +{ + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q15_t *pData; /**< points to the data of the matrix. */ +} arm_matrix_instance_q15; + +/** + * @brief Instance structure for the Q31 matrix structure. + */ +typedef struct +{ + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q31_t *pData; /**< points to the data of the matrix. */ +} arm_matrix_instance_q31; + + +/** + * @brief Floating-point matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_f32( + const arm_matrix_instance_f32 *pSrcA, + const arm_matrix_instance_f32 *pSrcB, + arm_matrix_instance_f32 *pDst); + + +/** + * @brief Q15 matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_q15( + const arm_matrix_instance_q15 *pSrcA, + const arm_matrix_instance_q15 *pSrcB, + arm_matrix_instance_q15 *pDst); + + +/** + * @brief Q31 matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_q31( + const arm_matrix_instance_q31 *pSrcA, + const arm_matrix_instance_q31 *pSrcB, + arm_matrix_instance_q31 *pDst); + + +/** + * @brief Floating-point, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_f32( + const arm_matrix_instance_f32 *pSrcA, + const arm_matrix_instance_f32 *pSrcB, + arm_matrix_instance_f32 *pDst); + + +/** + * @brief Q15, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_q15( + const arm_matrix_instance_q15 *pSrcA, + const arm_matrix_instance_q15 *pSrcB, + arm_matrix_instance_q15 *pDst, + q15_t *pScratch); + + +/** + * @brief Q31, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_q31( + const arm_matrix_instance_q31 *pSrcA, + const arm_matrix_instance_q31 *pSrcB, + arm_matrix_instance_q31 *pDst); + + +/** + * @brief Floating-point matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_f32( + const arm_matrix_instance_f32 *pSrc, + arm_matrix_instance_f32 *pDst); + + +/** + * @brief Q15 matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_q15( + const arm_matrix_instance_q15 *pSrc, + arm_matrix_instance_q15 *pDst); + + +/** + * @brief Q31 matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_q31( + const arm_matrix_instance_q31 *pSrc, + arm_matrix_instance_q31 *pDst); + + +/** + * @brief Floating-point matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_f32( + const arm_matrix_instance_f32 *pSrcA, + const arm_matrix_instance_f32 *pSrcB, + arm_matrix_instance_f32 *pDst); + + +/** + * @brief Q15 matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_q15( + const arm_matrix_instance_q15 *pSrcA, + const arm_matrix_instance_q15 *pSrcB, + arm_matrix_instance_q15 *pDst, + q15_t *pState); + + +/** + * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_fast_q15( + const arm_matrix_instance_q15 *pSrcA, + const arm_matrix_instance_q15 *pSrcB, + arm_matrix_instance_q15 *pDst, + q15_t *pState); + + +/** + * @brief Q31 matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_q31( + const arm_matrix_instance_q31 *pSrcA, + const arm_matrix_instance_q31 *pSrcB, + arm_matrix_instance_q31 *pDst); + + +/** + * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_fast_q31( + const arm_matrix_instance_q31 *pSrcA, + const arm_matrix_instance_q31 *pSrcB, + arm_matrix_instance_q31 *pDst); + + +/** + * @brief Floating-point matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_f32( + const arm_matrix_instance_f32 *pSrcA, + const arm_matrix_instance_f32 *pSrcB, + arm_matrix_instance_f32 *pDst); + + +/** + * @brief Q15 matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_q15( + const arm_matrix_instance_q15 *pSrcA, + const arm_matrix_instance_q15 *pSrcB, + arm_matrix_instance_q15 *pDst); + + +/** + * @brief Q31 matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_q31( + const arm_matrix_instance_q31 *pSrcA, + const arm_matrix_instance_q31 *pSrcB, + arm_matrix_instance_q31 *pDst); + + +/** + * @brief Floating-point matrix scaling. + * @param[in] pSrc points to the input matrix + * @param[in] scale scale factor + * @param[out] pDst points to the output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_f32( + const arm_matrix_instance_f32 *pSrc, + float32_t scale, + arm_matrix_instance_f32 *pDst); + + +/** + * @brief Q15 matrix scaling. + * @param[in] pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_q15( + const arm_matrix_instance_q15 *pSrc, + q15_t scaleFract, + int32_t shift, + arm_matrix_instance_q15 *pDst); + + +/** + * @brief Q31 matrix scaling. + * @param[in] pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_q31( + const arm_matrix_instance_q31 *pSrc, + q31_t scaleFract, + int32_t shift, + arm_matrix_instance_q31 *pDst); + + +/** + * @brief Q31 matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ +void arm_mat_init_q31( + arm_matrix_instance_q31 *S, + uint16_t nRows, + uint16_t nColumns, + q31_t *pData); + + +/** + * @brief Q15 matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ +void arm_mat_init_q15( + arm_matrix_instance_q15 *S, + uint16_t nRows, + uint16_t nColumns, + q15_t *pData); + + +/** + * @brief Floating-point matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ +void arm_mat_init_f32( + arm_matrix_instance_f32 *S, + uint16_t nRows, + uint16_t nColumns, + float32_t *pData); + + + +/** + * @brief Instance structure for the Q15 PID Control. + */ +typedef struct +{ + q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ +#ifdef ARM_MATH_CM0_FAMILY + q15_t A1; + q15_t A2; +#else + q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ +#endif + q15_t state[3]; /**< The state array of length 3. */ + q15_t Kp; /**< The proportional gain. */ + q15_t Ki; /**< The integral gain. */ + q15_t Kd; /**< The derivative gain. */ +} arm_pid_instance_q15; + +/** + * @brief Instance structure for the Q31 PID Control. + */ +typedef struct +{ + q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + q31_t A2; /**< The derived gain, A2 = Kd . */ + q31_t state[3]; /**< The state array of length 3. */ + q31_t Kp; /**< The proportional gain. */ + q31_t Ki; /**< The integral gain. */ + q31_t Kd; /**< The derivative gain. */ +} arm_pid_instance_q31; + +/** + * @brief Instance structure for the floating-point PID Control. + */ +typedef struct +{ + float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + float32_t A2; /**< The derived gain, A2 = Kd . */ + float32_t state[3]; /**< The state array of length 3. */ + float32_t Kp; /**< The proportional gain. */ + float32_t Ki; /**< The integral gain. */ + float32_t Kd; /**< The derivative gain. */ +} arm_pid_instance_f32; + + + +/** + * @brief Initialization function for the floating-point PID Control. + * @param[in,out] S points to an instance of the PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ +void arm_pid_init_f32( + arm_pid_instance_f32 *S, + int32_t resetStateFlag); + + +/** + * @brief Reset function for the floating-point PID Control. + * @param[in,out] S is an instance of the floating-point PID Control structure + */ +void arm_pid_reset_f32( + arm_pid_instance_f32 *S); + + +/** + * @brief Initialization function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ +void arm_pid_init_q31( + arm_pid_instance_q31 *S, + int32_t resetStateFlag); + + +/** + * @brief Reset function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q31 PID Control structure + */ + +void arm_pid_reset_q31( + arm_pid_instance_q31 *S); + + +/** + * @brief Initialization function for the Q15 PID Control. + * @param[in,out] S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ +void arm_pid_init_q15( + arm_pid_instance_q15 *S, + int32_t resetStateFlag); + + +/** + * @brief Reset function for the Q15 PID Control. + * @param[in,out] S points to an instance of the q15 PID Control structure + */ +void arm_pid_reset_q15( + arm_pid_instance_q15 *S); + + +/** + * @brief Instance structure for the floating-point Linear Interpolate function. + */ +typedef struct +{ + uint32_t nValues; /**< nValues */ + float32_t x1; /**< x1 */ + float32_t xSpacing; /**< xSpacing */ + float32_t *pYData; /**< pointer to the table of Y values */ +} arm_linear_interp_instance_f32; + +/** + * @brief Instance structure for the floating-point bilinear interpolation function. + */ +typedef struct +{ + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + float32_t *pData; /**< points to the data table. */ +} arm_bilinear_interp_instance_f32; + +/** +* @brief Instance structure for the Q31 bilinear interpolation function. +*/ +typedef struct +{ + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q31_t *pData; /**< points to the data table. */ +} arm_bilinear_interp_instance_q31; + +/** +* @brief Instance structure for the Q15 bilinear interpolation function. +*/ +typedef struct +{ + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q15_t *pData; /**< points to the data table. */ +} arm_bilinear_interp_instance_q15; + +/** +* @brief Instance structure for the Q15 bilinear interpolation function. +*/ +typedef struct +{ + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q7_t *pData; /**< points to the data table. */ +} arm_bilinear_interp_instance_q7; + + +/** + * @brief Q7 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_mult_q7( + q7_t *pSrcA, + q7_t *pSrcB, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Q15 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_mult_q15( + q15_t *pSrcA, + q15_t *pSrcB, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Q31 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_mult_q31( + q31_t *pSrcA, + q31_t *pSrcB, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Floating-point vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_mult_f32( + float32_t *pSrcA, + float32_t *pSrcB, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Instance structure for the Q15 CFFT/CIFFT function. + */ +typedef struct +{ + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ +} arm_cfft_radix2_instance_q15; + +/* Deprecated */ +arm_status arm_cfft_radix2_init_q15( + arm_cfft_radix2_instance_q15 *S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ +void arm_cfft_radix2_q15( + const arm_cfft_radix2_instance_q15 *S, + q15_t *pSrc); + + +/** + * @brief Instance structure for the Q15 CFFT/CIFFT function. + */ +typedef struct +{ + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q15_t *pTwiddle; /**< points to the twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ +} arm_cfft_radix4_instance_q15; + +/* Deprecated */ +arm_status arm_cfft_radix4_init_q15( + arm_cfft_radix4_instance_q15 *S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ +void arm_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 *S, + q15_t *pSrc); + +/** + * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. + */ +typedef struct +{ + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q31_t *pTwiddle; /**< points to the Twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ +} arm_cfft_radix2_instance_q31; + +/* Deprecated */ +arm_status arm_cfft_radix2_init_q31( + arm_cfft_radix2_instance_q31 *S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ +void arm_cfft_radix2_q31( + const arm_cfft_radix2_instance_q31 *S, + q31_t *pSrc); + +/** + * @brief Instance structure for the Q31 CFFT/CIFFT function. + */ +typedef struct +{ + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q31_t *pTwiddle; /**< points to the twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ +} arm_cfft_radix4_instance_q31; + +/* Deprecated */ +void arm_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 *S, + q31_t *pSrc); + +/* Deprecated */ +arm_status arm_cfft_radix4_init_q31( + arm_cfft_radix4_instance_q31 *S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ +typedef struct +{ + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ +} arm_cfft_radix2_instance_f32; + +/* Deprecated */ +arm_status arm_cfft_radix2_init_f32( + arm_cfft_radix2_instance_f32 *S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ +void arm_cfft_radix2_f32( + const arm_cfft_radix2_instance_f32 *S, + float32_t *pSrc); + +/** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ +typedef struct +{ + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ +} arm_cfft_radix4_instance_f32; + +/* Deprecated */ +arm_status arm_cfft_radix4_init_f32( + arm_cfft_radix4_instance_f32 *S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ +void arm_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 *S, + float32_t *pSrc); + +/** + * @brief Instance structure for the fixed-point CFFT/CIFFT function. + */ +typedef struct +{ + uint16_t fftLen; /**< length of the FFT. */ + const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ +} arm_cfft_instance_q15; + +void arm_cfft_q15( + const arm_cfft_instance_q15 *S, + q15_t *p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/** + * @brief Instance structure for the fixed-point CFFT/CIFFT function. + */ +typedef struct +{ + uint16_t fftLen; /**< length of the FFT. */ + const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ +} arm_cfft_instance_q31; + +void arm_cfft_q31( + const arm_cfft_instance_q31 *S, + q31_t *p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ +typedef struct +{ + uint16_t fftLen; /**< length of the FFT. */ + const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ +} arm_cfft_instance_f32; + +void arm_cfft_f32( + const arm_cfft_instance_f32 *S, + float32_t *p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/** + * @brief Instance structure for the Q15 RFFT/RIFFT function. + */ +typedef struct +{ + uint32_t fftLenReal; /**< length of the real FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ +} arm_rfft_instance_q15; + +arm_status arm_rfft_init_q15( + arm_rfft_instance_q15 *S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +void arm_rfft_q15( + const arm_rfft_instance_q15 *S, + q15_t *pSrc, + q15_t *pDst); + +/** + * @brief Instance structure for the Q31 RFFT/RIFFT function. + */ +typedef struct +{ + uint32_t fftLenReal; /**< length of the real FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ +} arm_rfft_instance_q31; + +arm_status arm_rfft_init_q31( + arm_rfft_instance_q31 *S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +void arm_rfft_q31( + const arm_rfft_instance_q31 *S, + q31_t *pSrc, + q31_t *pDst); + +/** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ +typedef struct +{ + uint32_t fftLenReal; /**< length of the real FFT. */ + uint16_t fftLenBy2; /**< length of the complex FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ +} arm_rfft_instance_f32; + +arm_status arm_rfft_init_f32( + arm_rfft_instance_f32 *S, + arm_cfft_radix4_instance_f32 *S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +void arm_rfft_f32( + const arm_rfft_instance_f32 *S, + float32_t *pSrc, + float32_t *pDst); + +/** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ +typedef struct +{ + arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ + uint16_t fftLenRFFT; /**< length of the real sequence */ + float32_t *pTwiddleRFFT; /**< Twiddle factors real stage */ +} arm_rfft_fast_instance_f32 ; + +arm_status arm_rfft_fast_init_f32( + arm_rfft_fast_instance_f32 *S, + uint16_t fftLen); + +void arm_rfft_fast_f32( + arm_rfft_fast_instance_f32 *S, + float32_t *p, float32_t *pOut, + uint8_t ifftFlag); + +/** + * @brief Instance structure for the floating-point DCT4/IDCT4 function. + */ +typedef struct +{ + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + float32_t normalize; /**< normalizing factor. */ + float32_t *pTwiddle; /**< points to the twiddle factor table. */ + float32_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ +} arm_dct4_instance_f32; + + +/** + * @brief Initialization function for the floating-point DCT4/IDCT4. + * @param[in,out] S points to an instance of floating-point DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of floating-point RFFT/RIFFT structure. + * @param[in] S_CFFT points to an instance of floating-point CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. + */ +arm_status arm_dct4_init_f32( + arm_dct4_instance_f32 *S, + arm_rfft_instance_f32 *S_RFFT, + arm_cfft_radix4_instance_f32 *S_CFFT, + uint16_t N, + uint16_t Nby2, + float32_t normalize); + + +/** + * @brief Processing function for the floating-point DCT4/IDCT4. + * @param[in] S points to an instance of the floating-point DCT4/IDCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ +void arm_dct4_f32( + const arm_dct4_instance_f32 *S, + float32_t *pState, + float32_t *pInlineBuffer); + + +/** + * @brief Instance structure for the Q31 DCT4/IDCT4 function. + */ +typedef struct +{ + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q31_t normalize; /**< normalizing factor. */ + q31_t *pTwiddle; /**< points to the twiddle factor table. */ + q31_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ +} arm_dct4_instance_q31; + + +/** + * @brief Initialization function for the Q31 DCT4/IDCT4. + * @param[in,out] S points to an instance of Q31 DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of Q31 RFFT/RIFFT structure + * @param[in] S_CFFT points to an instance of Q31 CFFT/CIFFT structure + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ +arm_status arm_dct4_init_q31( + arm_dct4_instance_q31 *S, + arm_rfft_instance_q31 *S_RFFT, + arm_cfft_radix4_instance_q31 *S_CFFT, + uint16_t N, + uint16_t Nby2, + q31_t normalize); + + +/** + * @brief Processing function for the Q31 DCT4/IDCT4. + * @param[in] S points to an instance of the Q31 DCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ +void arm_dct4_q31( + const arm_dct4_instance_q31 *S, + q31_t *pState, + q31_t *pInlineBuffer); + + +/** + * @brief Instance structure for the Q15 DCT4/IDCT4 function. + */ +typedef struct +{ + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q15_t normalize; /**< normalizing factor. */ + q15_t *pTwiddle; /**< points to the twiddle factor table. */ + q15_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ +} arm_dct4_instance_q15; + + +/** + * @brief Initialization function for the Q15 DCT4/IDCT4. + * @param[in,out] S points to an instance of Q15 DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of Q15 RFFT/RIFFT structure. + * @param[in] S_CFFT points to an instance of Q15 CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ +arm_status arm_dct4_init_q15( + arm_dct4_instance_q15 *S, + arm_rfft_instance_q15 *S_RFFT, + arm_cfft_radix4_instance_q15 *S_CFFT, + uint16_t N, + uint16_t Nby2, + q15_t normalize); + + +/** + * @brief Processing function for the Q15 DCT4/IDCT4. + * @param[in] S points to an instance of the Q15 DCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ +void arm_dct4_q15( + const arm_dct4_instance_q15 *S, + q15_t *pState, + q15_t *pInlineBuffer); + + +/** + * @brief Floating-point vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_add_f32( + float32_t *pSrcA, + float32_t *pSrcB, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Q7 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_add_q7( + q7_t *pSrcA, + q7_t *pSrcB, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Q15 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_add_q15( + q15_t *pSrcA, + q15_t *pSrcB, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Q31 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_add_q31( + q31_t *pSrcA, + q31_t *pSrcB, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Floating-point vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_sub_f32( + float32_t *pSrcA, + float32_t *pSrcB, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Q7 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_sub_q7( + q7_t *pSrcA, + q7_t *pSrcB, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Q15 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_sub_q15( + q15_t *pSrcA, + q15_t *pSrcB, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Q31 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_sub_q31( + q31_t *pSrcA, + q31_t *pSrcB, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Multiplies a floating-point vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scale scale factor to be applied + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_scale_f32( + float32_t *pSrc, + float32_t scale, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Multiplies a Q7 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_scale_q7( + q7_t *pSrc, + q7_t scaleFract, + int8_t shift, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Multiplies a Q15 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_scale_q15( + q15_t *pSrc, + q15_t scaleFract, + int8_t shift, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Multiplies a Q31 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_scale_q31( + q31_t *pSrc, + q31_t scaleFract, + int8_t shift, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Q7 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ +void arm_abs_q7( + q7_t *pSrc, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Floating-point vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ +void arm_abs_f32( + float32_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Q15 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ +void arm_abs_q15( + q15_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Q31 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ +void arm_abs_q31( + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Dot product of floating-point vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ +void arm_dot_prod_f32( + float32_t *pSrcA, + float32_t *pSrcB, + uint32_t blockSize, + float32_t *result); + + +/** + * @brief Dot product of Q7 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ +void arm_dot_prod_q7( + q7_t *pSrcA, + q7_t *pSrcB, + uint32_t blockSize, + q31_t *result); + + +/** + * @brief Dot product of Q15 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ +void arm_dot_prod_q15( + q15_t *pSrcA, + q15_t *pSrcB, + uint32_t blockSize, + q63_t *result); + + +/** + * @brief Dot product of Q31 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ +void arm_dot_prod_q31( + q31_t *pSrcA, + q31_t *pSrcB, + uint32_t blockSize, + q63_t *result); + + +/** + * @brief Shifts the elements of a Q7 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_shift_q7( + q7_t *pSrc, + int8_t shiftBits, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Shifts the elements of a Q15 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_shift_q15( + q15_t *pSrc, + int8_t shiftBits, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Shifts the elements of a Q31 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_shift_q31( + q31_t *pSrc, + int8_t shiftBits, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Adds a constant offset to a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_offset_f32( + float32_t *pSrc, + float32_t offset, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Adds a constant offset to a Q7 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_offset_q7( + q7_t *pSrc, + q7_t offset, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Adds a constant offset to a Q15 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_offset_q15( + q15_t *pSrc, + q15_t offset, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Adds a constant offset to a Q31 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_offset_q31( + q31_t *pSrc, + q31_t offset, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Negates the elements of a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_negate_f32( + float32_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Negates the elements of a Q7 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_negate_q7( + q7_t *pSrc, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Negates the elements of a Q15 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_negate_q15( + q15_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Negates the elements of a Q31 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_negate_q31( + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Copies the elements of a floating-point vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ +void arm_copy_f32( + float32_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Copies the elements of a Q7 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ +void arm_copy_q7( + q7_t *pSrc, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Copies the elements of a Q15 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ +void arm_copy_q15( + q15_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Copies the elements of a Q31 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ +void arm_copy_q31( + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Fills a constant value into a floating-point vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ +void arm_fill_f32( + float32_t value, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Fills a constant value into a Q7 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ +void arm_fill_q7( + q7_t value, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Fills a constant value into a Q15 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ +void arm_fill_q15( + q15_t value, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Fills a constant value into a Q31 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ +void arm_fill_q31( + q31_t value, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Convolution of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + */ +void arm_conv_f32( + float32_t *pSrcA, + uint32_t srcALen, + float32_t *pSrcB, + uint32_t srcBLen, + float32_t *pDst); + + +/** + * @brief Convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + */ +void arm_conv_opt_q15( + q15_t *pSrcA, + uint32_t srcALen, + q15_t *pSrcB, + uint32_t srcBLen, + q15_t *pDst, + q15_t *pScratch1, + q15_t *pScratch2); + + +/** + * @brief Convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + */ +void arm_conv_q15( + q15_t *pSrcA, + uint32_t srcALen, + q15_t *pSrcB, + uint32_t srcBLen, + q15_t *pDst); + + +/** + * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ +void arm_conv_fast_q15( + q15_t *pSrcA, + uint32_t srcALen, + q15_t *pSrcB, + uint32_t srcBLen, + q15_t *pDst); + + +/** + * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + */ +void arm_conv_fast_opt_q15( + q15_t *pSrcA, + uint32_t srcALen, + q15_t *pSrcB, + uint32_t srcBLen, + q15_t *pDst, + q15_t *pScratch1, + q15_t *pScratch2); + + +/** + * @brief Convolution of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ +void arm_conv_q31( + q31_t *pSrcA, + uint32_t srcALen, + q31_t *pSrcB, + uint32_t srcBLen, + q31_t *pDst); + + +/** + * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ +void arm_conv_fast_q31( + q31_t *pSrcA, + uint32_t srcALen, + q31_t *pSrcB, + uint32_t srcBLen, + q31_t *pDst); + + +/** +* @brief Convolution of Q7 sequences. +* @param[in] pSrcA points to the first input sequence. +* @param[in] srcALen length of the first input sequence. +* @param[in] pSrcB points to the second input sequence. +* @param[in] srcBLen length of the second input sequence. +* @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. +* @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. +* @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). +*/ +void arm_conv_opt_q7( + q7_t *pSrcA, + uint32_t srcALen, + q7_t *pSrcB, + uint32_t srcBLen, + q7_t *pDst, + q15_t *pScratch1, + q15_t *pScratch2); + + +/** + * @brief Convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ +void arm_conv_q7( + q7_t *pSrcA, + uint32_t srcALen, + q7_t *pSrcB, + uint32_t srcBLen, + q7_t *pDst); + + +/** + * @brief Partial convolution of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ +arm_status arm_conv_partial_f32( + float32_t *pSrcA, + uint32_t srcALen, + float32_t *pSrcB, + uint32_t srcBLen, + float32_t *pDst, + uint32_t firstIndex, + uint32_t numPoints); + + +/** + * @brief Partial convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ +arm_status arm_conv_partial_opt_q15( + q15_t *pSrcA, + uint32_t srcALen, + q15_t *pSrcB, + uint32_t srcBLen, + q15_t *pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t *pScratch1, + q15_t *pScratch2); + + +/** + * @brief Partial convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ +arm_status arm_conv_partial_q15( + q15_t *pSrcA, + uint32_t srcALen, + q15_t *pSrcB, + uint32_t srcBLen, + q15_t *pDst, + uint32_t firstIndex, + uint32_t numPoints); + + +/** + * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ +arm_status arm_conv_partial_fast_q15( + q15_t *pSrcA, + uint32_t srcALen, + q15_t *pSrcB, + uint32_t srcBLen, + q15_t *pDst, + uint32_t firstIndex, + uint32_t numPoints); + + +/** + * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ +arm_status arm_conv_partial_fast_opt_q15( + q15_t *pSrcA, + uint32_t srcALen, + q15_t *pSrcB, + uint32_t srcBLen, + q15_t *pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t *pScratch1, + q15_t *pScratch2); + + +/** + * @brief Partial convolution of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ +arm_status arm_conv_partial_q31( + q31_t *pSrcA, + uint32_t srcALen, + q31_t *pSrcB, + uint32_t srcBLen, + q31_t *pDst, + uint32_t firstIndex, + uint32_t numPoints); + + +/** + * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ +arm_status arm_conv_partial_fast_q31( + q31_t *pSrcA, + uint32_t srcALen, + q31_t *pSrcB, + uint32_t srcBLen, + q31_t *pDst, + uint32_t firstIndex, + uint32_t numPoints); + + +/** + * @brief Partial convolution of Q7 sequences + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ +arm_status arm_conv_partial_opt_q7( + q7_t *pSrcA, + uint32_t srcALen, + q7_t *pSrcB, + uint32_t srcBLen, + q7_t *pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t *pScratch1, + q15_t *pScratch2); + + +/** + * @brief Partial convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ +arm_status arm_conv_partial_q7( + q7_t *pSrcA, + uint32_t srcALen, + q7_t *pSrcB, + uint32_t srcBLen, + q7_t *pDst, + uint32_t firstIndex, + uint32_t numPoints); + + +/** + * @brief Instance structure for the Q15 FIR decimator. + */ +typedef struct +{ + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ +} arm_fir_decimate_instance_q15; + +/** + * @brief Instance structure for the Q31 FIR decimator. + */ +typedef struct +{ + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ +} arm_fir_decimate_instance_q31; + +/** + * @brief Instance structure for the floating-point FIR decimator. + */ +typedef struct +{ + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ +} arm_fir_decimate_instance_f32; + + +/** + * @brief Processing function for the floating-point FIR decimator. + * @param[in] S points to an instance of the floating-point FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ +void arm_fir_decimate_f32( + const arm_fir_decimate_instance_f32 *S, + float32_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the floating-point FIR decimator. + * @param[in,out] S points to an instance of the floating-point FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ +arm_status arm_fir_decimate_init_f32( + arm_fir_decimate_instance_f32 *S, + uint16_t numTaps, + uint8_t M, + float32_t *pCoeffs, + float32_t *pState, + uint32_t blockSize); + + +/** + * @brief Processing function for the Q15 FIR decimator. + * @param[in] S points to an instance of the Q15 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ +void arm_fir_decimate_q15( + const arm_fir_decimate_instance_q15 *S, + q15_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ +void arm_fir_decimate_fast_q15( + const arm_fir_decimate_instance_q15 *S, + q15_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q15 FIR decimator. + * @param[in,out] S points to an instance of the Q15 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ +arm_status arm_fir_decimate_init_q15( + arm_fir_decimate_instance_q15 *S, + uint16_t numTaps, + uint8_t M, + q15_t *pCoeffs, + q15_t *pState, + uint32_t blockSize); + + +/** + * @brief Processing function for the Q31 FIR decimator. + * @param[in] S points to an instance of the Q31 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ +void arm_fir_decimate_q31( + const arm_fir_decimate_instance_q31 *S, + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + +/** + * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ +void arm_fir_decimate_fast_q31( + arm_fir_decimate_instance_q31 *S, + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q31 FIR decimator. + * @param[in,out] S points to an instance of the Q31 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ +arm_status arm_fir_decimate_init_q31( + arm_fir_decimate_instance_q31 *S, + uint16_t numTaps, + uint8_t M, + q31_t *pCoeffs, + q31_t *pState, + uint32_t blockSize); + + +/** + * @brief Instance structure for the Q15 FIR interpolator. + */ +typedef struct +{ + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ +} arm_fir_interpolate_instance_q15; + +/** + * @brief Instance structure for the Q31 FIR interpolator. + */ +typedef struct +{ + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ +} arm_fir_interpolate_instance_q31; + +/** + * @brief Instance structure for the floating-point FIR interpolator. + */ +typedef struct +{ + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ +} arm_fir_interpolate_instance_f32; + + +/** + * @brief Processing function for the Q15 FIR interpolator. + * @param[in] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ +void arm_fir_interpolate_q15( + const arm_fir_interpolate_instance_q15 *S, + q15_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q15 FIR interpolator. + * @param[in,out] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ +arm_status arm_fir_interpolate_init_q15( + arm_fir_interpolate_instance_q15 *S, + uint8_t L, + uint16_t numTaps, + q15_t *pCoeffs, + q15_t *pState, + uint32_t blockSize); + + +/** + * @brief Processing function for the Q31 FIR interpolator. + * @param[in] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ +void arm_fir_interpolate_q31( + const arm_fir_interpolate_instance_q31 *S, + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q31 FIR interpolator. + * @param[in,out] S points to an instance of the Q31 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ +arm_status arm_fir_interpolate_init_q31( + arm_fir_interpolate_instance_q31 *S, + uint8_t L, + uint16_t numTaps, + q31_t *pCoeffs, + q31_t *pState, + uint32_t blockSize); + + +/** + * @brief Processing function for the floating-point FIR interpolator. + * @param[in] S points to an instance of the floating-point FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ +void arm_fir_interpolate_f32( + const arm_fir_interpolate_instance_f32 *S, + float32_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the floating-point FIR interpolator. + * @param[in,out] S points to an instance of the floating-point FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ +arm_status arm_fir_interpolate_init_f32( + arm_fir_interpolate_instance_f32 *S, + uint8_t L, + uint16_t numTaps, + float32_t *pCoeffs, + float32_t *pState, + uint32_t blockSize); + + +/** + * @brief Instance structure for the high precision Q31 Biquad cascade filter. + */ +typedef struct +{ + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ +} arm_biquad_cas_df1_32x64_ins_q31; + + +/** + * @param[in] S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ +void arm_biquad_cas_df1_32x64_q31( + const arm_biquad_cas_df1_32x64_ins_q31 *S, + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @param[in,out] S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format + */ +void arm_biquad_cas_df1_32x64_init_q31( + arm_biquad_cas_df1_32x64_ins_q31 *S, + uint8_t numStages, + q31_t *pCoeffs, + q63_t *pState, + uint8_t postShift); + + +/** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ +typedef struct +{ + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ +} arm_biquad_cascade_df2T_instance_f32; + +/** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ +typedef struct +{ + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ +} arm_biquad_cascade_stereo_df2T_instance_f32; + +/** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ +typedef struct +{ + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float64_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + float64_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ +} arm_biquad_cascade_df2T_instance_f64; + + +/** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ +void arm_biquad_cascade_df2T_f32( + const arm_biquad_cascade_df2T_instance_f32 *S, + float32_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ +void arm_biquad_cascade_stereo_df2T_f32( + const arm_biquad_cascade_stereo_df2T_instance_f32 *S, + float32_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ +void arm_biquad_cascade_df2T_f64( + const arm_biquad_cascade_df2T_instance_f64 *S, + float64_t *pSrc, + float64_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ +void arm_biquad_cascade_df2T_init_f32( + arm_biquad_cascade_df2T_instance_f32 *S, + uint8_t numStages, + float32_t *pCoeffs, + float32_t *pState); + + +/** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ +void arm_biquad_cascade_stereo_df2T_init_f32( + arm_biquad_cascade_stereo_df2T_instance_f32 *S, + uint8_t numStages, + float32_t *pCoeffs, + float32_t *pState); + + +/** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ +void arm_biquad_cascade_df2T_init_f64( + arm_biquad_cascade_df2T_instance_f64 *S, + uint8_t numStages, + float64_t *pCoeffs, + float64_t *pState); + + +/** + * @brief Instance structure for the Q15 FIR lattice filter. + */ +typedef struct +{ + uint16_t numStages; /**< number of filter stages. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ +} arm_fir_lattice_instance_q15; + +/** + * @brief Instance structure for the Q31 FIR lattice filter. + */ +typedef struct +{ + uint16_t numStages; /**< number of filter stages. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ +} arm_fir_lattice_instance_q31; + +/** + * @brief Instance structure for the floating-point FIR lattice filter. + */ +typedef struct +{ + uint16_t numStages; /**< number of filter stages. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ +} arm_fir_lattice_instance_f32; + + +/** + * @brief Initialization function for the Q15 FIR lattice filter. + * @param[in] S points to an instance of the Q15 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ +void arm_fir_lattice_init_q15( + arm_fir_lattice_instance_q15 *S, + uint16_t numStages, + q15_t *pCoeffs, + q15_t *pState); + + +/** + * @brief Processing function for the Q15 FIR lattice filter. + * @param[in] S points to an instance of the Q15 FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_fir_lattice_q15( + const arm_fir_lattice_instance_q15 *S, + q15_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q31 FIR lattice filter. + * @param[in] S points to an instance of the Q31 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ +void arm_fir_lattice_init_q31( + arm_fir_lattice_instance_q31 *S, + uint16_t numStages, + q31_t *pCoeffs, + q31_t *pState); + + +/** + * @brief Processing function for the Q31 FIR lattice filter. + * @param[in] S points to an instance of the Q31 FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ +void arm_fir_lattice_q31( + const arm_fir_lattice_instance_q31 *S, + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the floating-point FIR lattice filter. + * @param[in] S points to an instance of the floating-point FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ +void arm_fir_lattice_init_f32( + arm_fir_lattice_instance_f32 *S, + uint16_t numStages, + float32_t *pCoeffs, + float32_t *pState); + + +/** + * @brief Processing function for the floating-point FIR lattice filter. + * @param[in] S points to an instance of the floating-point FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ +void arm_fir_lattice_f32( + const arm_fir_lattice_instance_f32 *S, + float32_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Instance structure for the Q15 IIR lattice filter. + */ +typedef struct +{ + uint16_t numStages; /**< number of stages in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ +} arm_iir_lattice_instance_q15; + +/** + * @brief Instance structure for the Q31 IIR lattice filter. + */ +typedef struct +{ + uint16_t numStages; /**< number of stages in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ +} arm_iir_lattice_instance_q31; + +/** + * @brief Instance structure for the floating-point IIR lattice filter. + */ +typedef struct +{ + uint16_t numStages; /**< number of stages in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ +} arm_iir_lattice_instance_f32; + + +/** + * @brief Processing function for the floating-point IIR lattice filter. + * @param[in] S points to an instance of the floating-point IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_iir_lattice_f32( + const arm_iir_lattice_instance_f32 *S, + float32_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the floating-point IIR lattice filter. + * @param[in] S points to an instance of the floating-point IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to the state buffer. The array is of length numStages+blockSize-1. + * @param[in] blockSize number of samples to process. + */ +void arm_iir_lattice_init_f32( + arm_iir_lattice_instance_f32 *S, + uint16_t numStages, + float32_t *pkCoeffs, + float32_t *pvCoeffs, + float32_t *pState, + uint32_t blockSize); + + +/** + * @brief Processing function for the Q31 IIR lattice filter. + * @param[in] S points to an instance of the Q31 IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_iir_lattice_q31( + const arm_iir_lattice_instance_q31 *S, + q31_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q31 IIR lattice filter. + * @param[in] S points to an instance of the Q31 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to the state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process. + */ +void arm_iir_lattice_init_q31( + arm_iir_lattice_instance_q31 *S, + uint16_t numStages, + q31_t *pkCoeffs, + q31_t *pvCoeffs, + q31_t *pState, + uint32_t blockSize); + + +/** + * @brief Processing function for the Q15 IIR lattice filter. + * @param[in] S points to an instance of the Q15 IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ +void arm_iir_lattice_q15( + const arm_iir_lattice_instance_q15 *S, + q15_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q15 IIR lattice filter. + * @param[in] S points to an instance of the fixed-point Q15 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process per call. + */ +void arm_iir_lattice_init_q15( + arm_iir_lattice_instance_q15 *S, + uint16_t numStages, + q15_t *pkCoeffs, + q15_t *pvCoeffs, + q15_t *pState, + uint32_t blockSize); + + +/** + * @brief Instance structure for the floating-point LMS filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that controls filter coefficient updates. */ +} arm_lms_instance_f32; + + +/** + * @brief Processing function for floating-point LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ +void arm_lms_f32( + const arm_lms_instance_f32 *S, + float32_t *pSrc, + float32_t *pRef, + float32_t *pOut, + float32_t *pErr, + uint32_t blockSize); + + +/** + * @brief Initialization function for floating-point LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to the coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + */ +void arm_lms_init_f32( + arm_lms_instance_f32 *S, + uint16_t numTaps, + float32_t *pCoeffs, + float32_t *pState, + float32_t mu, + uint32_t blockSize); + + +/** + * @brief Instance structure for the Q15 LMS filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ +} arm_lms_instance_q15; + + +/** + * @brief Initialization function for the Q15 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to the coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ +void arm_lms_init_q15( + arm_lms_instance_q15 *S, + uint16_t numTaps, + q15_t *pCoeffs, + q15_t *pState, + q15_t mu, + uint32_t blockSize, + uint32_t postShift); + + +/** + * @brief Processing function for Q15 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ +void arm_lms_q15( + const arm_lms_instance_q15 *S, + q15_t *pSrc, + q15_t *pRef, + q15_t *pOut, + q15_t *pErr, + uint32_t blockSize); + + +/** + * @brief Instance structure for the Q31 LMS filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ +} arm_lms_instance_q31; + + +/** + * @brief Processing function for Q31 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ +void arm_lms_q31( + const arm_lms_instance_q31 *S, + q31_t *pSrc, + q31_t *pRef, + q31_t *pOut, + q31_t *pErr, + uint32_t blockSize); + + +/** + * @brief Initialization function for Q31 LMS filter. + * @param[in] S points to an instance of the Q31 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ +void arm_lms_init_q31( + arm_lms_instance_q31 *S, + uint16_t numTaps, + q31_t *pCoeffs, + q31_t *pState, + q31_t mu, + uint32_t blockSize, + uint32_t postShift); + + +/** + * @brief Instance structure for the floating-point normalized LMS filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that control filter coefficient updates. */ + float32_t energy; /**< saves previous frame energy. */ + float32_t x0; /**< saves previous input sample. */ +} arm_lms_norm_instance_f32; + + +/** + * @brief Processing function for floating-point normalized LMS filter. + * @param[in] S points to an instance of the floating-point normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ +void arm_lms_norm_f32( + arm_lms_norm_instance_f32 *S, + float32_t *pSrc, + float32_t *pRef, + float32_t *pOut, + float32_t *pErr, + uint32_t blockSize); + + +/** + * @brief Initialization function for floating-point normalized LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + */ +void arm_lms_norm_init_f32( + arm_lms_norm_instance_f32 *S, + uint16_t numTaps, + float32_t *pCoeffs, + float32_t *pState, + float32_t mu, + uint32_t blockSize); + + +/** + * @brief Instance structure for the Q31 normalized LMS filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + q31_t *recipTable; /**< points to the reciprocal initial value table. */ + q31_t energy; /**< saves previous frame energy. */ + q31_t x0; /**< saves previous input sample. */ +} arm_lms_norm_instance_q31; + + +/** + * @brief Processing function for Q31 normalized LMS filter. + * @param[in] S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ +void arm_lms_norm_q31( + arm_lms_norm_instance_q31 *S, + q31_t *pSrc, + q31_t *pRef, + q31_t *pOut, + q31_t *pErr, + uint32_t blockSize); + + +/** + * @brief Initialization function for Q31 normalized LMS filter. + * @param[in] S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ +void arm_lms_norm_init_q31( + arm_lms_norm_instance_q31 *S, + uint16_t numTaps, + q31_t *pCoeffs, + q31_t *pState, + q31_t mu, + uint32_t blockSize, + uint8_t postShift); + + +/** + * @brief Instance structure for the Q15 normalized LMS filter. + */ +typedef struct +{ + uint16_t numTaps; /**< Number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + q15_t *recipTable; /**< Points to the reciprocal initial value table. */ + q15_t energy; /**< saves previous frame energy. */ + q15_t x0; /**< saves previous input sample. */ +} arm_lms_norm_instance_q15; + + +/** + * @brief Processing function for Q15 normalized LMS filter. + * @param[in] S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ +void arm_lms_norm_q15( + arm_lms_norm_instance_q15 *S, + q15_t *pSrc, + q15_t *pRef, + q15_t *pOut, + q15_t *pErr, + uint32_t blockSize); + + +/** + * @brief Initialization function for Q15 normalized LMS filter. + * @param[in] S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ +void arm_lms_norm_init_q15( + arm_lms_norm_instance_q15 *S, + uint16_t numTaps, + q15_t *pCoeffs, + q15_t *pState, + q15_t mu, + uint32_t blockSize, + uint8_t postShift); + + +/** + * @brief Correlation of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ +void arm_correlate_f32( + float32_t *pSrcA, + uint32_t srcALen, + float32_t *pSrcB, + uint32_t srcBLen, + float32_t *pDst); + + +/** +* @brief Correlation of Q15 sequences +* @param[in] pSrcA points to the first input sequence. +* @param[in] srcALen length of the first input sequence. +* @param[in] pSrcB points to the second input sequence. +* @param[in] srcBLen length of the second input sequence. +* @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. +* @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. +*/ +void arm_correlate_opt_q15( + q15_t *pSrcA, + uint32_t srcALen, + q15_t *pSrcB, + uint32_t srcBLen, + q15_t *pDst, + q15_t *pScratch); + + +/** + * @brief Correlation of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + +void arm_correlate_q15( + q15_t *pSrcA, + uint32_t srcALen, + q15_t *pSrcB, + uint32_t srcBLen, + q15_t *pDst); + + +/** + * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + +void arm_correlate_fast_q15( + q15_t *pSrcA, + uint32_t srcALen, + q15_t *pSrcB, + uint32_t srcBLen, + q15_t *pDst); + + +/** + * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + */ +void arm_correlate_fast_opt_q15( + q15_t *pSrcA, + uint32_t srcALen, + q15_t *pSrcB, + uint32_t srcBLen, + q15_t *pDst, + q15_t *pScratch); + + +/** + * @brief Correlation of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ +void arm_correlate_q31( + q31_t *pSrcA, + uint32_t srcALen, + q31_t *pSrcB, + uint32_t srcBLen, + q31_t *pDst); + + +/** + * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ +void arm_correlate_fast_q31( + q31_t *pSrcA, + uint32_t srcALen, + q31_t *pSrcB, + uint32_t srcBLen, + q31_t *pDst); + + +/** + * @brief Correlation of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + */ +void arm_correlate_opt_q7( + q7_t *pSrcA, + uint32_t srcALen, + q7_t *pSrcB, + uint32_t srcBLen, + q7_t *pDst, + q15_t *pScratch1, + q15_t *pScratch2); + + +/** + * @brief Correlation of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ +void arm_correlate_q7( + q7_t *pSrcA, + uint32_t srcALen, + q7_t *pSrcB, + uint32_t srcBLen, + q7_t *pDst); + + +/** + * @brief Instance structure for the floating-point sparse FIR filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ +} arm_fir_sparse_instance_f32; + +/** + * @brief Instance structure for the Q31 sparse FIR filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ +} arm_fir_sparse_instance_q31; + +/** + * @brief Instance structure for the Q15 sparse FIR filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ +} arm_fir_sparse_instance_q15; + +/** + * @brief Instance structure for the Q7 sparse FIR filter. + */ +typedef struct +{ + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ +} arm_fir_sparse_instance_q7; + + +/** + * @brief Processing function for the floating-point sparse FIR filter. + * @param[in] S points to an instance of the floating-point sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ +void arm_fir_sparse_f32( + arm_fir_sparse_instance_f32 *S, + float32_t *pSrc, + float32_t *pDst, + float32_t *pScratchIn, + uint32_t blockSize); + + +/** + * @brief Initialization function for the floating-point sparse FIR filter. + * @param[in,out] S points to an instance of the floating-point sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ +void arm_fir_sparse_init_f32( + arm_fir_sparse_instance_f32 *S, + uint16_t numTaps, + float32_t *pCoeffs, + float32_t *pState, + int32_t *pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + +/** + * @brief Processing function for the Q31 sparse FIR filter. + * @param[in] S points to an instance of the Q31 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ +void arm_fir_sparse_q31( + arm_fir_sparse_instance_q31 *S, + q31_t *pSrc, + q31_t *pDst, + q31_t *pScratchIn, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q31 sparse FIR filter. + * @param[in,out] S points to an instance of the Q31 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ +void arm_fir_sparse_init_q31( + arm_fir_sparse_instance_q31 *S, + uint16_t numTaps, + q31_t *pCoeffs, + q31_t *pState, + int32_t *pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + +/** + * @brief Processing function for the Q15 sparse FIR filter. + * @param[in] S points to an instance of the Q15 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ +void arm_fir_sparse_q15( + arm_fir_sparse_instance_q15 *S, + q15_t *pSrc, + q15_t *pDst, + q15_t *pScratchIn, + q31_t *pScratchOut, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q15 sparse FIR filter. + * @param[in,out] S points to an instance of the Q15 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ +void arm_fir_sparse_init_q15( + arm_fir_sparse_instance_q15 *S, + uint16_t numTaps, + q15_t *pCoeffs, + q15_t *pState, + int32_t *pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + +/** + * @brief Processing function for the Q7 sparse FIR filter. + * @param[in] S points to an instance of the Q7 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ +void arm_fir_sparse_q7( + arm_fir_sparse_instance_q7 *S, + q7_t *pSrc, + q7_t *pDst, + q7_t *pScratchIn, + q31_t *pScratchOut, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q7 sparse FIR filter. + * @param[in,out] S points to an instance of the Q7 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ +void arm_fir_sparse_init_q7( + arm_fir_sparse_instance_q7 *S, + uint16_t numTaps, + q7_t *pCoeffs, + q7_t *pState, + int32_t *pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + +/** + * @brief Floating-point sin_cos function. + * @param[in] theta input value in degrees + * @param[out] pSinVal points to the processed sine output. + * @param[out] pCosVal points to the processed cos output. + */ +void arm_sin_cos_f32( + float32_t theta, + float32_t *pSinVal, + float32_t *pCosVal); + + +/** + * @brief Q31 sin_cos function. + * @param[in] theta scaled input value in degrees + * @param[out] pSinVal points to the processed sine output. + * @param[out] pCosVal points to the processed cosine output. + */ +void arm_sin_cos_q31( + q31_t theta, + q31_t *pSinVal, + q31_t *pCosVal); + + +/** + * @brief Floating-point complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ +void arm_cmplx_conj_f32( + float32_t *pSrc, + float32_t *pDst, + uint32_t numSamples); + +/** + * @brief Q31 complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ +void arm_cmplx_conj_q31( + q31_t *pSrc, + q31_t *pDst, + uint32_t numSamples); + + +/** + * @brief Q15 complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ +void arm_cmplx_conj_q15( + q15_t *pSrc, + q15_t *pDst, + uint32_t numSamples); + + +/** + * @brief Floating-point complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ +void arm_cmplx_mag_squared_f32( + float32_t *pSrc, + float32_t *pDst, + uint32_t numSamples); + + +/** + * @brief Q31 complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ +void arm_cmplx_mag_squared_q31( + q31_t *pSrc, + q31_t *pDst, + uint32_t numSamples); + + +/** + * @brief Q15 complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ +void arm_cmplx_mag_squared_q15( + q15_t *pSrc, + q15_t *pDst, + uint32_t numSamples); + + +/** + * @ingroup groupController + */ + +/** + * @defgroup PID PID Motor Control + * + * A Proportional Integral Derivative (PID) controller is a generic feedback control + * loop mechanism widely used in industrial control systems. + * A PID controller is the most commonly used type of feedback controller. + * + * This set of functions implements (PID) controllers + * for Q15, Q31, and floating-point data types. The functions operate on a single sample + * of data and each call to the function returns a single processed value. + * S points to an instance of the PID control data structure. in + * is the input sample value. The functions return the output value. + * + * \par Algorithm: + *
+ *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
+ *    A0 = Kp + Ki + Kd
+ *    A1 = (-Kp ) - (2 * Kd )
+ *    A2 = Kd  
+ * + * \par + * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant + * + * \par + * \image html PID.gif "Proportional Integral Derivative Controller" + * + * \par + * The PID controller calculates an "error" value as the difference between + * the measured output and the reference input. + * The controller attempts to minimize the error by adjusting the process control inputs. + * The proportional value determines the reaction to the current error, + * the integral value determines the reaction based on the sum of recent errors, + * and the derivative value determines the reaction based on the rate at which the error has been changing. + * + * \par Instance Structure + * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. + * A separate instance structure must be defined for each PID Controller. + * There are separate instance structure declarations for each of the 3 supported data types. + * + * \par Reset Functions + * There is also an associated reset function for each data type which clears the state array. + * + * \par Initialization Functions + * There is also an associated initialization function for each data type. + * The initialization function performs the following operations: + * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. + * - Zeros out the values in the state buffer. + * + * \par + * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. + * + * \par Fixed-Point Behavior + * Care must be taken when using the fixed-point versions of the PID Controller functions. + * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + +/** + * @addtogroup PID + * @{ + */ + +/** + * @brief Process function for the floating-point PID Control. + * @param[in,out] S is an instance of the floating-point PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + */ +static __INLINE float32_t arm_pid_f32( + arm_pid_instance_f32 *S, + float32_t in) +{ + float32_t out; + + /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ + out = (S->A0 * in) + + (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + +} + +/** + * @brief Process function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q31 PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 64-bit accumulator. + * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. + * Thus, if the accumulator result overflows it wraps around rather than clip. + * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. + * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. + */ +static __INLINE q31_t arm_pid_q31( + arm_pid_instance_q31 *S, + q31_t in) +{ + q63_t acc; + q31_t out; + + /* acc = A0 * x[n] */ + acc = (q63_t) S->A0 * in; + + /* acc += A1 * x[n-1] */ + acc += (q63_t) S->A1 * S->state[0]; + + /* acc += A2 * x[n-2] */ + acc += (q63_t) S->A2 * S->state[1]; + + /* convert output to 1.31 format to add y[n-1] */ + out = (q31_t)(acc >> 31u); + + /* out += y[n-1] */ + out += S->state[2]; + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); +} + + +/** + * @brief Process function for the Q15 PID Control. + * @param[in,out] S points to an instance of the Q15 PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using a 64-bit internal accumulator. + * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. + * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. + * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. + * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. + * Lastly, the accumulator is saturated to yield a result in 1.15 format. + */ +static __INLINE q15_t arm_pid_q15( + arm_pid_instance_q15 *S, + q15_t in) +{ + q63_t acc; + q15_t out; + +#ifndef ARM_MATH_CM0_FAMILY + __SIMD32_TYPE *vstate; + + /* Implementation of PID controller */ + + /* acc = A0 * x[n] */ + acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in); + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + vstate = __SIMD32_CONST(S->state); + acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t) * vstate, (uint64_t)acc); +#else + /* acc = A0 * x[n] */ + acc = ((q31_t) S->A0) * in; + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc += (q31_t) S->A1 * S->state[0]; + acc += (q31_t) S->A2 * S->state[1]; +#endif + + /* acc += y[n-1] */ + acc += (q31_t) S->state[2] << 15; + + /* saturate the output */ + out = (q15_t)(__SSAT((acc >> 15), 16)); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); +} + +/** + * @} end of PID group + */ + + +/** + * @brief Floating-point matrix inverse. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ +arm_status arm_mat_inverse_f32( + const arm_matrix_instance_f32 *src, + arm_matrix_instance_f32 *dst); + + +/** + * @brief Floating-point matrix inverse. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ +arm_status arm_mat_inverse_f64( + const arm_matrix_instance_f64 *src, + arm_matrix_instance_f64 *dst); + + + +/** + * @ingroup groupController + */ + +/** + * @defgroup clarke Vector Clarke Transform + * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. + * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents + * in the two-phase orthogonal stator axis Ialpha and Ibeta. + * When Ialpha is superposed with Ia as shown in the figure below + * \image html clarke.gif Stator current space vector and its components in (a,b). + * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta + * can be calculated using only Ia and Ib. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeFormula.gif + * where Ia and Ib are the instantaneous stator phases and + * pIalpha and pIbeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + +/** + * @addtogroup clarke + * @{ + */ + +/** + * + * @brief Floating-point Clarke transform + * @param[in] Ia input three-phase coordinate a + * @param[in] Ib input three-phase coordinate b + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + */ +static __INLINE void arm_clarke_f32( + float32_t Ia, + float32_t Ib, + float32_t *pIalpha, + float32_t *pIbeta) +{ + /* Calculate pIalpha using the equation, pIalpha = Ia */ + *pIalpha = Ia; + + /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ + *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); +} + + +/** + * @brief Clarke transform for Q31 version + * @param[in] Ia input three-phase coordinate a + * @param[in] Ib input three-phase coordinate b + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition, hence there is no risk of overflow. + */ +static __INLINE void arm_clarke_q31( + q31_t Ia, + q31_t Ib, + q31_t *pIalpha, + q31_t *pIbeta) +{ + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIalpha from Ia by equation pIalpha = Ia */ + *pIalpha = Ia; + + /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ + product1 = (q31_t)(((q63_t) Ia * 0x24F34E8B) >> 30); + + /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ + product2 = (q31_t)(((q63_t) Ib * 0x49E69D16) >> 30); + + /* pIbeta is calculated by adding the intermediate products */ + *pIbeta = __QADD(product1, product2); +} + +/** + * @} end of clarke group + */ + +/** + * @brief Converts the elements of the Q7 vector to Q31 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ +void arm_q7_to_q31( + q7_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + + +/** + * @ingroup groupController + */ + +/** + * @defgroup inv_clarke Vector Inverse Clarke Transform + * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeInvFormula.gif + * where pIa and pIb are the instantaneous stator phases and + * Ialpha and Ibeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + +/** + * @addtogroup inv_clarke + * @{ + */ + +/** +* @brief Floating-point Inverse Clarke transform +* @param[in] Ialpha input two-phase orthogonal vector axis alpha +* @param[in] Ibeta input two-phase orthogonal vector axis beta +* @param[out] pIa points to output three-phase coordinate a +* @param[out] pIb points to output three-phase coordinate b +*/ +static __INLINE void arm_inv_clarke_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t *pIa, + float32_t *pIb) +{ + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ + *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta; +} + + +/** + * @brief Inverse Clarke transform for Q31 version + * @param[in] Ialpha input two-phase orthogonal vector axis alpha + * @param[in] Ibeta input two-phase orthogonal vector axis beta + * @param[out] pIa points to output three-phase coordinate a + * @param[out] pIb points to output three-phase coordinate b + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the subtraction, hence there is no risk of overflow. + */ +static __INLINE void arm_inv_clarke_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t *pIa, + q31_t *pIb) +{ + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ + product1 = (q31_t)(((q63_t)(Ialpha) * (0x40000000)) >> 31); + + /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ + product2 = (q31_t)(((q63_t)(Ibeta) * (0x6ED9EBA1)) >> 31); + + /* pIb is calculated by subtracting the products */ + *pIb = __QSUB(product2, product1); +} + +/** + * @} end of inv_clarke group + */ + +/** + * @brief Converts the elements of the Q7 vector to Q15 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ +void arm_q7_to_q15( + q7_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + + +/** + * @ingroup groupController + */ + +/** + * @defgroup park Vector Park Transform + * + * Forward Park transform converts the input two-coordinate vector to flux and torque components. + * The Park transform can be used to realize the transformation of the Ialpha and the Ibeta currents + * from the stationary to the moving reference frame and control the spatial relationship between + * the stator vector current and rotor flux vector. + * If we consider the d axis aligned with the rotor flux, the diagram below shows the + * current vector and the relationship from the two reference frames: + * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkFormula.gif + * where Ialpha and Ibeta are the stator vector components, + * pId and pIq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + +/** + * @addtogroup park + * @{ + */ + +/** + * @brief Floating-point Park transform + * @param[in] Ialpha input two-phase vector coordinate alpha + * @param[in] Ibeta input two-phase vector coordinate beta + * @param[out] pId points to output rotor reference frame d + * @param[out] pIq points to output rotor reference frame q + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * + * The function implements the forward Park transform. + * + */ +static __INLINE void arm_park_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t *pId, + float32_t *pIq, + float32_t sinVal, + float32_t cosVal) +{ + /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ + *pId = Ialpha * cosVal + Ibeta * sinVal; + + /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ + *pIq = -Ialpha * sinVal + Ibeta * cosVal; +} + + +/** + * @brief Park transform for Q31 version + * @param[in] Ialpha input two-phase vector coordinate alpha + * @param[in] Ibeta input two-phase vector coordinate beta + * @param[out] pId points to output rotor reference frame d + * @param[out] pIq points to output rotor reference frame q + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition and subtraction, hence there is no risk of overflow. + */ +static __INLINE void arm_park_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t *pId, + q31_t *pIq, + q31_t sinVal, + q31_t cosVal) +{ + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Ialpha * cosVal) */ + product1 = (q31_t)(((q63_t)(Ialpha) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * sinVal) */ + product2 = (q31_t)(((q63_t)(Ibeta) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Ialpha * sinVal) */ + product3 = (q31_t)(((q63_t)(Ialpha) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * cosVal) */ + product4 = (q31_t)(((q63_t)(Ibeta) * (cosVal)) >> 31); + + /* Calculate pId by adding the two intermediate products 1 and 2 */ + *pId = __QADD(product1, product2); + + /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ + *pIq = __QSUB(product4, product3); +} + +/** + * @} end of park group + */ + +/** + * @brief Converts the elements of the Q7 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ +void arm_q7_to_float( + q7_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @ingroup groupController + */ + +/** + * @defgroup inv_park Vector Inverse Park transform + * Inverse Park transform converts the input flux and torque components to two-coordinate vector. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkInvFormula.gif + * where pIalpha and pIbeta are the stator vector components, + * Id and Iq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + +/** + * @addtogroup inv_park + * @{ + */ + +/** +* @brief Floating-point Inverse Park transform +* @param[in] Id input coordinate of rotor reference frame d +* @param[in] Iq input coordinate of rotor reference frame q +* @param[out] pIalpha points to output two-phase orthogonal vector axis alpha +* @param[out] pIbeta points to output two-phase orthogonal vector axis beta +* @param[in] sinVal sine value of rotation angle theta +* @param[in] cosVal cosine value of rotation angle theta +*/ +static __INLINE void arm_inv_park_f32( + float32_t Id, + float32_t Iq, + float32_t *pIalpha, + float32_t *pIbeta, + float32_t sinVal, + float32_t cosVal) +{ + /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ + *pIalpha = Id * cosVal - Iq * sinVal; + + /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ + *pIbeta = Id * sinVal + Iq * cosVal; +} + + +/** + * @brief Inverse Park transform for Q31 version + * @param[in] Id input coordinate of rotor reference frame d + * @param[in] Iq input coordinate of rotor reference frame q + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition, hence there is no risk of overflow. + */ +static __INLINE void arm_inv_park_q31( + q31_t Id, + q31_t Iq, + q31_t *pIalpha, + q31_t *pIbeta, + q31_t sinVal, + q31_t cosVal) +{ + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Id * cosVal) */ + product1 = (q31_t)(((q63_t)(Id) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Iq * sinVal) */ + product2 = (q31_t)(((q63_t)(Iq) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Id * sinVal) */ + product3 = (q31_t)(((q63_t)(Id) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Iq * cosVal) */ + product4 = (q31_t)(((q63_t)(Iq) * (cosVal)) >> 31); + + /* Calculate pIalpha by using the two intermediate products 1 and 2 */ + *pIalpha = __QSUB(product1, product2); + + /* Calculate pIbeta by using the two intermediate products 3 and 4 */ + *pIbeta = __QADD(product4, product3); +} + +/** + * @} end of Inverse park group + */ + + +/** + * @brief Converts the elements of the Q31 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ +void arm_q31_to_float( + q31_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + +/** + * @ingroup groupInterpolation + */ + +/** + * @defgroup LinearInterpolate Linear Interpolation + * + * Linear interpolation is a method of curve fitting using linear polynomials. + * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line + * + * \par + * \image html LinearInterp.gif "Linear interpolation" + * + * \par + * A Linear Interpolate function calculates an output value(y), for the input(x) + * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) + * + * \par Algorithm: + *
+ *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
+ *       where x0, x1 are nearest values of input x
+ *             y0, y1 are nearest values to output y
+ * 
+ * + * \par + * This set of functions implements Linear interpolation process + * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single + * sample of data and each call to the function returns a single processed value. + * S points to an instance of the Linear Interpolate function data structure. + * x is the input sample value. The functions returns the output value. + * + * \par + * if x is outside of the table boundary, Linear interpolation returns first value of the table + * if x is below input range and returns last value of table if x is above range. + */ + +/** + * @addtogroup LinearInterpolate + * @{ + */ + +/** + * @brief Process function for the floating-point Linear Interpolation Function. + * @param[in,out] S is an instance of the floating-point Linear Interpolation structure + * @param[in] x input sample to process + * @return y processed output sample. + * + */ +static __INLINE float32_t arm_linear_interp_f32( + arm_linear_interp_instance_f32 *S, + float32_t x) +{ + float32_t y; + float32_t x0, x1; /* Nearest input values */ + float32_t y0, y1; /* Nearest output values */ + float32_t xSpacing = S->xSpacing; /* spacing between input values */ + int32_t i; /* Index variable */ + float32_t *pYData = S->pYData; /* pointer to output table */ + + /* Calculation of index */ + i = (int32_t)((x - S->x1) / xSpacing); + + if (i < 0) + { + /* Iniatilize output for below specified range as least output value of table */ + y = pYData[0]; + } + else if ((uint32_t)i >= S->nValues) + { + /* Iniatilize output for above specified range as last output value of table */ + y = pYData[S->nValues - 1]; + } + else + { + /* Calculation of nearest input values */ + x0 = S->x1 + i * xSpacing; + x1 = S->x1 + (i + 1) * xSpacing; + + /* Read of nearest output values */ + y0 = pYData[i]; + y1 = pYData[i + 1]; + + /* Calculation of output */ + y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); + + } + + /* returns output value */ + return (y); +} + + +/** +* +* @brief Process function for the Q31 Linear Interpolation Function. +* @param[in] pYData pointer to Q31 Linear Interpolation table +* @param[in] x input sample to process +* @param[in] nValues number of table values +* @return y processed output sample. +* +* \par +* Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. +* This function can support maximum of table size 2^12. +* +*/ +static __INLINE q31_t arm_linear_interp_q31( + q31_t *pYData, + q31_t x, + uint32_t nValues) +{ + q31_t y; /* output */ + q31_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & (q31_t)0xFFF00000) >> 20); + + if (index >= (int32_t)(nValues - 1)) + { + return (pYData[nValues - 1]); + } + else if (index < 0) + { + return (pYData[0]); + } + else + { + /* 20 bits for the fractional part */ + /* shift left by 11 to keep fract in 1.31 format */ + fract = (x & 0x000FFFFF) << 11; + + /* Read two nearest output values from the index in 1.31(q31) format */ + y0 = pYData[index]; + y1 = pYData[index + 1]; + + /* Calculation of y0 * (1-fract) and y is in 2.30 format */ + y = ((q31_t)((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); + + /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ + y += ((q31_t)(((q63_t) y1 * fract) >> 32)); + + /* Convert y to 1.31 format */ + return (y << 1u); + } +} + + +/** + * + * @brief Process function for the Q15 Linear Interpolation Function. + * @param[in] pYData pointer to Q15 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ +static __INLINE q15_t arm_linear_interp_q15( + q15_t *pYData, + q31_t x, + uint32_t nValues) +{ + q63_t y; /* output */ + q15_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & (int32_t)0xFFF00000) >> 20); + + if (index >= (int32_t)(nValues - 1)) + { + return (pYData[nValues - 1]); + } + else if (index < 0) + { + return (pYData[0]); + } + else + { + /* 20 bits for the fractional part */ + /* fract is in 12.20 format */ + fract = (x & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y0 = pYData[index]; + y1 = pYData[index + 1]; + + /* Calculation of y0 * (1-fract) and y is in 13.35 format */ + y = ((q63_t) y0 * (0xFFFFF - fract)); + + /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ + y += ((q63_t) y1 * (fract)); + + /* convert y to 1.15 format */ + return (q15_t)(y >> 20); + } +} + + +/** + * + * @brief Process function for the Q7 Linear Interpolation Function. + * @param[in] pYData pointer to Q7 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + */ +static __INLINE q7_t arm_linear_interp_q7( + q7_t *pYData, + q31_t x, + uint32_t nValues) +{ + q31_t y; /* output */ + q7_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + uint32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + if (x < 0) + { + return (pYData[0]); + } + index = (x >> 20) & 0xfff; + + if (index >= (nValues - 1)) + { + return (pYData[nValues - 1]); + } + else + { + /* 20 bits for the fractional part */ + /* fract is in 12.20 format */ + fract = (x & 0x000FFFFF); + + /* Read two nearest output values from the index and are in 1.7(q7) format */ + y0 = pYData[index]; + y1 = pYData[index + 1]; + + /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ + y = ((y0 * (0xFFFFF - fract))); + + /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ + y += (y1 * fract); + + /* convert y to 1.7(q7) format */ + return (q7_t)(y >> 20); + } +} + +/** + * @} end of LinearInterpolate group + */ + +/** + * @brief Fast approximation to the trigonometric sine function for floating-point data. + * @param[in] x input value in radians. + * @return sin(x). + */ +float32_t arm_sin_f32( + float32_t x); + + +/** + * @brief Fast approximation to the trigonometric sine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ +q31_t arm_sin_q31( + q31_t x); + + +/** + * @brief Fast approximation to the trigonometric sine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ +q15_t arm_sin_q15( + q15_t x); + + +/** + * @brief Fast approximation to the trigonometric cosine function for floating-point data. + * @param[in] x input value in radians. + * @return cos(x). + */ +float32_t arm_cos_f32( + float32_t x); + + +/** + * @brief Fast approximation to the trigonometric cosine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ +q31_t arm_cos_q31( + q31_t x); + + +/** + * @brief Fast approximation to the trigonometric cosine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ +q15_t arm_cos_q15( + q15_t x); + + +/** + * @ingroup groupFastMath + */ + + +/** + * @defgroup SQRT Square Root + * + * Computes the square root of a number. + * There are separate functions for Q15, Q31, and floating-point data types. + * The square root function is computed using the Newton-Raphson algorithm. + * This is an iterative algorithm of the form: + *
+ *      x1 = x0 - f(x0)/f'(x0)
+ * 
+ * where x1 is the current estimate, + * x0 is the previous estimate, and + * f'(x0) is the derivative of f() evaluated at x0. + * For the square root function, the algorithm reduces to: + *
+ *     x0 = in/2                         [initial guess]
+ *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
+ * 
+ */ + + +/** + * @addtogroup SQRT + * @{ + */ + +/** + * @brief Floating-point square root function. + * @param[in] in input value. + * @param[out] pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ +static __INLINE arm_status arm_sqrt_f32( + float32_t in, + float32_t *pOut) +{ + if (in >= 0.0f) + { + +#if (__FPU_USED == 1) && defined ( __CC_ARM ) + *pOut = __sqrtf(in); +#elif (__FPU_USED == 1) && (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) + *pOut = __builtin_sqrtf(in); +#elif (__FPU_USED == 1) && defined(__GNUC__) + *pOut = __builtin_sqrtf(in); +#elif (__FPU_USED == 1) && defined ( __ICCARM__ ) && (__VER__ >= 6040000) + __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); +#else + *pOut = sqrtf(in); +#endif + + return (ARM_MATH_SUCCESS); + } + else + { + *pOut = 0.0f; + return (ARM_MATH_ARGUMENT_ERROR); + } +} + + +/** + * @brief Q31 square root function. + * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF. + * @param[out] pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ +arm_status arm_sqrt_q31( + q31_t in, + q31_t *pOut); + + +/** + * @brief Q15 square root function. + * @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF. + * @param[out] pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ +arm_status arm_sqrt_q15( + q15_t in, + q15_t *pOut); + +/** + * @} end of SQRT group + */ + + +/** + * @brief floating-point Circular write function. + */ +static __INLINE void arm_circularWrite_f32( + int32_t *circBuffer, + int32_t L, + uint16_t *writeOffset, + int32_t bufferInc, + const int32_t *src, + int32_t srcInc, + uint32_t blockSize) +{ + uint32_t i = 0u; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0u) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; +} + + + +/** + * @brief floating-point Circular Read function. + */ +static __INLINE void arm_circularRead_f32( + int32_t *circBuffer, + int32_t L, + int32_t *readOffset, + int32_t bufferInc, + int32_t *dst, + int32_t *dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) +{ + uint32_t i = 0u; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + dst_end = (int32_t)(dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0u) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == (int32_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; +} + + +/** + * @brief Q15 Circular write function. + */ +static __INLINE void arm_circularWrite_q15( + q15_t *circBuffer, + int32_t L, + uint16_t *writeOffset, + int32_t bufferInc, + const q15_t *src, + int32_t srcInc, + uint32_t blockSize) +{ + uint32_t i = 0u; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0u) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; +} + + +/** + * @brief Q15 Circular Read function. + */ +static __INLINE void arm_circularRead_q15( + q15_t *circBuffer, + int32_t L, + int32_t *readOffset, + int32_t bufferInc, + q15_t *dst, + q15_t *dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) +{ + uint32_t i = 0; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = (int32_t)(dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0u) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == (q15_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update wOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; +} + + +/** + * @brief Q7 Circular write function. + */ +static __INLINE void arm_circularWrite_q7( + q7_t *circBuffer, + int32_t L, + uint16_t *writeOffset, + int32_t bufferInc, + const q7_t *src, + int32_t srcInc, + uint32_t blockSize) +{ + uint32_t i = 0u; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0u) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; +} + + +/** + * @brief Q7 Circular Read function. + */ +static __INLINE void arm_circularRead_q7( + q7_t *circBuffer, + int32_t L, + int32_t *readOffset, + int32_t bufferInc, + q7_t *dst, + q7_t *dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) +{ + uint32_t i = 0; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = (int32_t)(dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0u) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == (q7_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; +} + + +/** + * @brief Sum of the squares of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_power_q31( + q31_t *pSrc, + uint32_t blockSize, + q63_t *pResult); + + +/** + * @brief Sum of the squares of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_power_f32( + float32_t *pSrc, + uint32_t blockSize, + float32_t *pResult); + + +/** + * @brief Sum of the squares of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_power_q15( + q15_t *pSrc, + uint32_t blockSize, + q63_t *pResult); + + +/** + * @brief Sum of the squares of the elements of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_power_q7( + q7_t *pSrc, + uint32_t blockSize, + q31_t *pResult); + + +/** + * @brief Mean value of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_mean_q7( + q7_t *pSrc, + uint32_t blockSize, + q7_t *pResult); + + +/** + * @brief Mean value of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_mean_q15( + q15_t *pSrc, + uint32_t blockSize, + q15_t *pResult); + + +/** + * @brief Mean value of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_mean_q31( + q31_t *pSrc, + uint32_t blockSize, + q31_t *pResult); + + +/** + * @brief Mean value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_mean_f32( + float32_t *pSrc, + uint32_t blockSize, + float32_t *pResult); + + +/** + * @brief Variance of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_var_f32( + float32_t *pSrc, + uint32_t blockSize, + float32_t *pResult); + + +/** + * @brief Variance of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_var_q31( + q31_t *pSrc, + uint32_t blockSize, + q31_t *pResult); + + +/** + * @brief Variance of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_var_q15( + q15_t *pSrc, + uint32_t blockSize, + q15_t *pResult); + + +/** + * @brief Root Mean Square of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_rms_f32( + float32_t *pSrc, + uint32_t blockSize, + float32_t *pResult); + + +/** + * @brief Root Mean Square of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_rms_q31( + q31_t *pSrc, + uint32_t blockSize, + q31_t *pResult); + + +/** + * @brief Root Mean Square of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_rms_q15( + q15_t *pSrc, + uint32_t blockSize, + q15_t *pResult); + + +/** + * @brief Standard deviation of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_std_f32( + float32_t *pSrc, + uint32_t blockSize, + float32_t *pResult); + + +/** + * @brief Standard deviation of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_std_q31( + q31_t *pSrc, + uint32_t blockSize, + q31_t *pResult); + + +/** + * @brief Standard deviation of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ +void arm_std_q15( + q15_t *pSrc, + uint32_t blockSize, + q15_t *pResult); + + +/** + * @brief Floating-point complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ +void arm_cmplx_mag_f32( + float32_t *pSrc, + float32_t *pDst, + uint32_t numSamples); + + +/** + * @brief Q31 complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ +void arm_cmplx_mag_q31( + q31_t *pSrc, + q31_t *pDst, + uint32_t numSamples); + + +/** + * @brief Q15 complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ +void arm_cmplx_mag_q15( + q15_t *pSrc, + q15_t *pDst, + uint32_t numSamples); + + +/** + * @brief Q15 complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ +void arm_cmplx_dot_prod_q15( + q15_t *pSrcA, + q15_t *pSrcB, + uint32_t numSamples, + q31_t *realResult, + q31_t *imagResult); + + +/** + * @brief Q31 complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ +void arm_cmplx_dot_prod_q31( + q31_t *pSrcA, + q31_t *pSrcB, + uint32_t numSamples, + q63_t *realResult, + q63_t *imagResult); + + +/** + * @brief Floating-point complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ +void arm_cmplx_dot_prod_f32( + float32_t *pSrcA, + float32_t *pSrcB, + uint32_t numSamples, + float32_t *realResult, + float32_t *imagResult); + + +/** + * @brief Q15 complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ +void arm_cmplx_mult_real_q15( + q15_t *pSrcCmplx, + q15_t *pSrcReal, + q15_t *pCmplxDst, + uint32_t numSamples); + + +/** + * @brief Q31 complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ +void arm_cmplx_mult_real_q31( + q31_t *pSrcCmplx, + q31_t *pSrcReal, + q31_t *pCmplxDst, + uint32_t numSamples); + + +/** + * @brief Floating-point complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ +void arm_cmplx_mult_real_f32( + float32_t *pSrcCmplx, + float32_t *pSrcReal, + float32_t *pCmplxDst, + uint32_t numSamples); + + +/** + * @brief Minimum value of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] result is output pointer + * @param[in] index is the array index of the minimum value in the input buffer. + */ +void arm_min_q7( + q7_t *pSrc, + uint32_t blockSize, + q7_t *result, + uint32_t *index); + + +/** + * @brief Minimum value of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[in] pIndex is the array index of the minimum value in the input buffer. + */ +void arm_min_q15( + q15_t *pSrc, + uint32_t blockSize, + q15_t *pResult, + uint32_t *pIndex); + + +/** + * @brief Minimum value of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ +void arm_min_q31( + q31_t *pSrc, + uint32_t blockSize, + q31_t *pResult, + uint32_t *pIndex); + + +/** + * @brief Minimum value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ +void arm_min_f32( + float32_t *pSrc, + uint32_t blockSize, + float32_t *pResult, + uint32_t *pIndex); + + +/** + * @brief Maximum value of a Q7 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ +void arm_max_q7( + q7_t *pSrc, + uint32_t blockSize, + q7_t *pResult, + uint32_t *pIndex); + + +/** + * @brief Maximum value of a Q15 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ +void arm_max_q15( + q15_t *pSrc, + uint32_t blockSize, + q15_t *pResult, + uint32_t *pIndex); + + +/** + * @brief Maximum value of a Q31 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ +void arm_max_q31( + q31_t *pSrc, + uint32_t blockSize, + q31_t *pResult, + uint32_t *pIndex); + + +/** + * @brief Maximum value of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ +void arm_max_f32( + float32_t *pSrc, + uint32_t blockSize, + float32_t *pResult, + uint32_t *pIndex); + + +/** + * @brief Q15 complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ +void arm_cmplx_mult_cmplx_q15( + q15_t *pSrcA, + q15_t *pSrcB, + q15_t *pDst, + uint32_t numSamples); + + +/** + * @brief Q31 complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ +void arm_cmplx_mult_cmplx_q31( + q31_t *pSrcA, + q31_t *pSrcB, + q31_t *pDst, + uint32_t numSamples); + + +/** + * @brief Floating-point complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ +void arm_cmplx_mult_cmplx_f32( + float32_t *pSrcA, + float32_t *pSrcB, + float32_t *pDst, + uint32_t numSamples); + + +/** + * @brief Converts the elements of the floating-point vector to Q31 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q31 output vector + * @param[in] blockSize length of the input vector + */ +void arm_float_to_q31( + float32_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Converts the elements of the floating-point vector to Q15 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q15 output vector + * @param[in] blockSize length of the input vector + */ +void arm_float_to_q15( + float32_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Converts the elements of the floating-point vector to Q7 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q7 output vector + * @param[in] blockSize length of the input vector + */ +void arm_float_to_q7( + float32_t *pSrc, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Converts the elements of the Q31 vector to Q15 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ +void arm_q31_to_q15( + q31_t *pSrc, + q15_t *pDst, + uint32_t blockSize); + + +/** + * @brief Converts the elements of the Q31 vector to Q7 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ +void arm_q31_to_q7( + q31_t *pSrc, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @brief Converts the elements of the Q15 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ +void arm_q15_to_float( + q15_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + +/** + * @brief Converts the elements of the Q15 vector to Q31 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ +void arm_q15_to_q31( + q15_t *pSrc, + q31_t *pDst, + uint32_t blockSize); + + +/** + * @brief Converts the elements of the Q15 vector to Q7 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ +void arm_q15_to_q7( + q15_t *pSrc, + q7_t *pDst, + uint32_t blockSize); + + +/** + * @ingroup groupInterpolation + */ + +/** + * @defgroup BilinearInterpolate Bilinear Interpolation + * + * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. + * The underlying function f(x, y) is sampled on a regular grid and the interpolation process + * determines values between the grid points. + * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. + * Bilinear interpolation is often used in image processing to rescale images. + * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. + * + * Algorithm + * \par + * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. + * For floating-point, the instance structure is defined as: + *
+ *   typedef struct
+ *   {
+ *     uint16_t numRows;
+ *     uint16_t numCols;
+ *     float32_t *pData;
+ * } arm_bilinear_interp_instance_f32;
+ * 
+ * + * \par + * where numRows specifies the number of rows in the table; + * numCols specifies the number of columns in the table; + * and pData points to an array of size numRows*numCols values. + * The data table pTable is organized in row order and the supplied data values fall on integer indexes. + * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. + * + * \par + * Let (x, y) specify the desired interpolation point. Then define: + *
+ *     XF = floor(x)
+ *     YF = floor(y)
+ * 
+ * \par + * The interpolated output point is computed as: + *
+ *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
+ *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
+ *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
+ *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
+ * 
+ * Note that the coordinates (x, y) contain integer and fractional components. + * The integer components specify which portion of the table to use while the + * fractional components control the interpolation processor. + * + * \par + * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. + */ + +/** + * @addtogroup BilinearInterpolate + * @{ + */ + + +/** +* +* @brief Floating-point bilinear interpolation. +* @param[in,out] S points to an instance of the interpolation structure. +* @param[in] X interpolation coordinate. +* @param[in] Y interpolation coordinate. +* @return out interpolated value. +*/ +static __INLINE float32_t arm_bilinear_interp_f32( + const arm_bilinear_interp_instance_f32 *S, + float32_t X, + float32_t Y) +{ + float32_t out; + float32_t f00, f01, f10, f11; + float32_t *pData = S->pData; + int32_t xIndex, yIndex, index; + float32_t xdiff, ydiff; + float32_t b1, b2, b3, b4; + + xIndex = (int32_t) X; + yIndex = (int32_t) Y; + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0 || yIndex > (S->numCols - 1)) + { + return (0); + } + + /* Calculation of index for two nearest points in X-direction */ + index = (xIndex - 1) + (yIndex - 1) * S->numCols; + + + /* Read two nearest points in X-direction */ + f00 = pData[index]; + f01 = pData[index + 1]; + + /* Calculation of index for two nearest points in Y-direction */ + index = (xIndex - 1) + (yIndex) * S->numCols; + + + /* Read two nearest points in Y-direction */ + f10 = pData[index]; + f11 = pData[index + 1]; + + /* Calculation of intermediate values */ + b1 = f00; + b2 = f01 - f00; + b3 = f10 - f00; + b4 = f00 - f01 - f10 + f11; + + /* Calculation of fractional part in X */ + xdiff = X - xIndex; + + /* Calculation of fractional part in Y */ + ydiff = Y - yIndex; + + /* Calculation of bi-linear interpolated output */ + out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; + + /* return to application */ + return (out); +} + + +/** +* +* @brief Q31 bilinear interpolation. +* @param[in,out] S points to an instance of the interpolation structure. +* @param[in] X interpolation coordinate in 12.20 format. +* @param[in] Y interpolation coordinate in 12.20 format. +* @return out interpolated value. +*/ +static __INLINE q31_t arm_bilinear_interp_q31( + arm_bilinear_interp_instance_q31 *S, + q31_t X, + q31_t Y) +{ + q31_t out; /* Temporary output */ + q31_t acc = 0; /* output */ + q31_t xfract, yfract; /* X, Y fractional parts */ + q31_t x1, x2, y1, y2; /* Nearest output values */ + int32_t rI, cI; /* Row and column indices */ + q31_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & (q31_t)0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & (q31_t)0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) + { + return (0); + } + + /* 20 bits for the fractional part */ + /* shift left xfract by 11 to keep 1.31 format */ + xfract = (X & 0x000FFFFF) << 11u; + + /* Read two nearest output values from the index */ + x1 = pYData[(rI) + (int32_t)nCols * (cI) ]; + x2 = pYData[(rI) + (int32_t)nCols * (cI) + 1]; + + /* 20 bits for the fractional part */ + /* shift left yfract by 11 to keep 1.31 format */ + yfract = (Y & 0x000FFFFF) << 11u; + + /* Read two nearest output values from the index */ + y1 = pYData[(rI) + (int32_t)nCols * (cI + 1) ]; + y2 = pYData[(rI) + (int32_t)nCols * (cI + 1) + 1]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ + out = ((q31_t)(((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); + acc = ((q31_t)(((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); + + /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t)((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); + acc += ((q31_t)((q63_t) out * (xfract) >> 32)); + + /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t)((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); + acc += ((q31_t)((q63_t) out * (yfract) >> 32)); + + /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t)((q63_t) y2 * (xfract) >> 32)); + acc += ((q31_t)((q63_t) out * (yfract) >> 32)); + + /* Convert acc to 1.31(q31) format */ + return ((q31_t)(acc << 2)); +} + + +/** +* @brief Q15 bilinear interpolation. +* @param[in,out] S points to an instance of the interpolation structure. +* @param[in] X interpolation coordinate in 12.20 format. +* @param[in] Y interpolation coordinate in 12.20 format. +* @return out interpolated value. +*/ +static __INLINE q15_t arm_bilinear_interp_q15( + arm_bilinear_interp_instance_q15 *S, + q31_t X, + q31_t Y) +{ + q63_t acc = 0; /* output */ + q31_t out; /* Temporary output */ + q15_t x1, x2, y1, y2; /* Nearest output values */ + q31_t xfract, yfract; /* X, Y fractional parts */ + int32_t rI, cI; /* Row and column indices */ + q15_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & (q31_t)0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & (q31_t)0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) + { + return (0); + } + + /* 20 bits for the fractional part */ + /* xfract should be in 12.20 format */ + xfract = (X & 0x000FFFFF); + + /* Read two nearest output values from the index */ + x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; + x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; + + /* 20 bits for the fractional part */ + /* yfract should be in 12.20 format */ + yfract = (Y & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; + y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ + + /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ + /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ + out = (q31_t)(((q63_t) x1 * (0xFFFFF - xfract)) >> 4u); + acc = ((q63_t) out * (0xFFFFF - yfract)); + + /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ + out = (q31_t)(((q63_t) x2 * (0xFFFFF - yfract)) >> 4u); + acc += ((q63_t) out * (xfract)); + + /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ + out = (q31_t)(((q63_t) y1 * (0xFFFFF - xfract)) >> 4u); + acc += ((q63_t) out * (yfract)); + + /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ + out = (q31_t)(((q63_t) y2 * (xfract)) >> 4u); + acc += ((q63_t) out * (yfract)); + + /* acc is in 13.51 format and down shift acc by 36 times */ + /* Convert out to 1.15 format */ + return ((q15_t)(acc >> 36)); +} + + +/** +* @brief Q7 bilinear interpolation. +* @param[in,out] S points to an instance of the interpolation structure. +* @param[in] X interpolation coordinate in 12.20 format. +* @param[in] Y interpolation coordinate in 12.20 format. +* @return out interpolated value. +*/ +static __INLINE q7_t arm_bilinear_interp_q7( + arm_bilinear_interp_instance_q7 *S, + q31_t X, + q31_t Y) +{ + q63_t acc = 0; /* output */ + q31_t out; /* Temporary output */ + q31_t xfract, yfract; /* X, Y fractional parts */ + q7_t x1, x2, y1, y2; /* Nearest output values */ + int32_t rI, cI; /* Row and column indices */ + q7_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & (q31_t)0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & (q31_t)0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) + { + return (0); + } + + /* 20 bits for the fractional part */ + /* xfract should be in 12.20 format */ + xfract = (X & (q31_t)0x000FFFFF); + + /* Read two nearest output values from the index */ + x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; + x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; + + /* 20 bits for the fractional part */ + /* yfract should be in 12.20 format */ + yfract = (Y & (q31_t)0x000FFFFF); + + /* Read two nearest output values from the index */ + y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; + y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ + out = ((x1 * (0xFFFFF - xfract))); + acc = (((q63_t) out * (0xFFFFF - yfract))); + + /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ + out = ((x2 * (0xFFFFF - yfract))); + acc += (((q63_t) out * (xfract))); + + /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ + out = ((y1 * (0xFFFFF - xfract))); + acc += (((q63_t) out * (yfract))); + + /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ + out = ((y2 * (yfract))); + acc += (((q63_t) out * (xfract))); + + /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ + return ((q7_t)(acc >> 40)); +} + +/** + * @} end of BilinearInterpolate group + */ + + +/* SMMLAR */ +#define multAcc_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) + +/* SMMLSR */ +#define multSub_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) + +/* SMMULR */ +#define mult_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) + +/* SMMLA */ +#define multAcc_32x32_keep32(a, x, y) \ + a += (q31_t) (((q63_t) x * y) >> 32) + +/* SMMLS */ +#define multSub_32x32_keep32(a, x, y) \ + a -= (q31_t) (((q63_t) x * y) >> 32) + +/* SMMUL */ +#define mult_32x32_keep32(a, x, y) \ + a = (q31_t) (((q63_t) x * y ) >> 32) + + +#if defined ( __CC_ARM ) +/* Enter low optimization region - place directly above function definition */ +#if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7) +#define LOW_OPTIMIZATION_ENTER \ + _Pragma ("push") \ + _Pragma ("O1") +#else +#define LOW_OPTIMIZATION_ENTER +#endif + +/* Exit low optimization region - place directly after end of function definition */ +#if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7) +#define LOW_OPTIMIZATION_EXIT \ + _Pragma ("pop") +#else +#define LOW_OPTIMIZATION_EXIT +#endif + +/* Enter low optimization region - place directly above function definition */ +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER + +/* Exit low optimization region - place directly after end of function definition */ +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define LOW_OPTIMIZATION_ENTER +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(__GNUC__) +#define LOW_OPTIMIZATION_ENTER __attribute__(( optimize("-O1") )) +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(__ICCARM__) +/* Enter low optimization region - place directly above function definition */ +#if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7) +#define LOW_OPTIMIZATION_ENTER \ + _Pragma ("optimize=low") +#else +#define LOW_OPTIMIZATION_ENTER +#endif + +/* Exit low optimization region - place directly after end of function definition */ +#define LOW_OPTIMIZATION_EXIT + +/* Enter low optimization region - place directly above function definition */ +#if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7) +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ + _Pragma ("optimize=low") +#else +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#endif + +/* Exit low optimization region - place directly after end of function definition */ +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(__CSMC__) +#define LOW_OPTIMIZATION_ENTER +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(__TASKING__) +#define LOW_OPTIMIZATION_ENTER +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#endif + + +#ifdef __cplusplus +} +#endif + + +#if defined ( __GNUC__ ) + #pragma GCC diagnostic pop +#endif + +#endif /* _ARM_MATH_H */ + +/** + * + * End of file. + */ diff --git a/bsp/nuvoton/libraries/ma35/CMSIS/Include/cmsis_armcc.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/cmsis_armcc.h new file mode 100644 index 0000000000..7b85e336fe --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/cmsis_armcc.h @@ -0,0 +1,734 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS Cortex-M Core Function/Instruction Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (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 __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 + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/* intrinsic void __enable_irq(); */ +/* 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 (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) + +/** + \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)1); +} + +#endif /* (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) */ + + +#if (__CORTEX_M == 0x04U) || (__CORTEX_M == 0x07U) + +/** + \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 (__FPU_PRESENT == 1U) && (__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 (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#endif +} + +#endif /* (__CORTEX_M == 0x04U) || (__CORTEX_M == 0x07U) */ + + + +/*@} 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] value Value to rotate + \param [in] value 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 (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) +#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 (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) + +/** + \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 /* (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (__CORTEX_M >= 0x04U) /* only for Cortex-M4 and above */ + +#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 /* (__CORTEX_M >= 0x04) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/bsp/nuvoton/libraries/ma35/CMSIS/Include/cmsis_armcc_V6.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/cmsis_armcc_V6.h new file mode 100644 index 0000000000..6d8f998d84 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/cmsis_armcc_V6.h @@ -0,0 +1,1804 @@ +/**************************************************************************//** + * @file cmsis_armcc_V6.h + * @brief CMSIS Cortex-M Core Function/Instruction Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (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 __CMSIS_ARMCC_V6_H +#define __CMSIS_ARMCC_V6_H + + +/* ########################### 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 (__ARM_FEATURE_CMSE == 3U) +/** + \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 (__ARM_FEATURE_CMSE == 3U) +/** + \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); +} + + +#if (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get IPSR Register (non-secure) + \details Returns the content of the non-secure IPSR Register when in secure state. + \return IPSR Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_IPSR_NS(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, ipsr_ns" : "=r"(result)); + return (result); +} +#endif + + +/** + \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); +} + + +#if (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get APSR Register (non-secure) + \details Returns the content of the non-secure APSR Register when in secure state. + \return APSR Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_APSR_NS(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, apsr_ns" : "=r"(result)); + return (result); +} +#endif + + +/** + \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); +} + + +#if (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get xPSR Register (non-secure) + \details Returns the content of the non-secure xPSR Register when in secure state. + \return xPSR Register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_xPSR_NS(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, xpsr_ns" : "=r"(result)); + return (result); +} +#endif + + +/** + \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 (__ARM_FEATURE_CMSE == 3U) +/** + \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) : "sp"); +} + + +#if (__ARM_FEATURE_CMSE == 3U) +/** + \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) : "sp"); +} +#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 (__ARM_FEATURE_CMSE == 3U) +/** + \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) : "sp"); +} + + +#if (__ARM_FEATURE_CMSE == 3U) +/** + \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) : "sp"); +} +#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 (__ARM_FEATURE_CMSE == 3U) +/** + \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 (__ARM_FEATURE_CMSE == 3U) +/** + \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 ((__ARM_ARCH_7M__ == 1U) || (__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M__ == 1U)) /* ToDo: ARMCC_V6: check if this is ok for cortex >=3 */ + +/** + \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 (__ARM_FEATURE_CMSE == 3U) +/** + \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 value) +{ + __ASM volatile("MSR basepri, %0" : : "r"(value) : "memory"); +} + + +#if (__ARM_FEATURE_CMSE == 3U) +/** + \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 value) +{ + __ASM volatile("MSR basepri_ns, %0" : : "r"(value) : "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 value) +{ + __ASM volatile("MSR basepri_max, %0" : : "r"(value) : "memory"); +} + + +#if (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Base Priority with condition (non_secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state 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 __TZ_set_BASEPRI_MAX_NS(uint32_t value) +{ + __ASM volatile("MSR basepri_max_ns, %0" : : "r"(value) : "memory"); +} +#endif + + +/** + \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 (__ARM_FEATURE_CMSE == 3U) +/** + \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 (__ARM_FEATURE_CMSE == 3U) +/** + \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 /* ((__ARM_ARCH_7M__ == 1U) || (__ARM_ARCH_8M__ == 1U)) */ + + +#if (__ARM_ARCH_8M__ == 1U) + +/** + \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 (__ARM_FEATURE_CMSE == 3U) && (__ARM_ARCH_PROFILE == 'M') /* ToDo: ARMCC_V6: check predefined macro for mainline */ +/** + \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 (__ARM_FEATURE_CMSE == 3U) && (__ARM_ARCH_PROFILE == 'M') /* ToDo: ARMCC_V6: check predefined macro for mainline */ +/** + \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 (__ARM_FEATURE_CMSE == 3U) && (__ARM_ARCH_PROFILE == 'M') /* ToDo: ARMCC_V6: check predefined macro for mainline */ +/** + \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 (__ARM_FEATURE_CMSE == 3U) && (__ARM_ARCH_PROFILE == 'M') /* ToDo: ARMCC_V6: check predefined macro for mainline */ +/** + \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 /* (__ARM_ARCH_8M__ == 1U) */ + + +#if ((__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M__ == 1U)) /* ToDo: ARMCC_V6: check if this is ok for cortex >=4 */ + +/** + \brief Get FPSCR + \details eturns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#define __get_FPSCR __builtin_arm_get_fpscr +#if 0 +__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) + uint32_t result; + + __ASM volatile(""); /* Empty asm statement works as a scheduling barrier */ + __ASM volatile("VMRS %0, fpscr" : "=r"(result)); + __ASM volatile(""); + return (result); +#else + return (0); +#endif +} +#endif + +#if (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get FPSCR (non-secure) + \details Returns the current value of the non-secure Floating Point Status/Control register when in secure state. + \return Floating Point Status/Control register value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_FPSCR_NS(void) +{ +#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) + uint32_t result; + + __ASM volatile(""); /* Empty asm statement works as a scheduling barrier */ + __ASM volatile("VMRS %0, fpscr_ns" : "=r"(result)); + __ASM volatile(""); + return (result); +#else + return (0); +#endif +} +#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 +#if 0 +__attribute__((always_inline)) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) + __ASM volatile(""); /* Empty asm statement works as a scheduling barrier */ + __ASM volatile("VMSR fpscr, %0" : : "r"(fpscr) : "vfpcc"); + __ASM volatile(""); +#endif +} +#endif + +#if (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set FPSCR (non-secure) + \details Assigns the given value to the non-secure Floating Point Status/Control register when in secure state. + \param [in] fpscr Floating Point Status/Control value to set + */ +__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_FPSCR_NS(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) + __ASM volatile(""); /* Empty asm statement works as a scheduling barrier */ + __ASM volatile("VMSR fpscr_ns, %0" : : "r"(fpscr) : "vfpcc"); + __ASM volatile(""); +#endif +} +#endif + +#endif /* ((__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M__ == 1U)) */ + + + +/*@} 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: ARMCC_V6: 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: ARMCC_V6: 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: ARMCC_V6: check if __builtin_arm_rbit is supported */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((__ARM_ARCH_7M__ == 1U) || (__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M__ == 1U)) /* ToDo: ARMCC_V6: check if this is ok for cortex >=3 */ + __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 ((__ARM_ARCH_7M__ == 1U) || (__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M__ == 1U)) /* ToDo: ARMCC_V6: check if this is ok for cortex >=3 */ + +/** + \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 + + +/** + \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*/ +#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 __builtin_arm_usat +#if 0 +#define __USAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) +#endif + + +/** + \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 /* ((__ARM_ARCH_7M__ == 1U) || (__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M__ == 1U)) */ + + +#if (__ARM_ARCH_8M__ == 1U) + +/** + \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 /* (__ARM_ARCH_8M__ == 1U) */ + +/*@}*/ /* 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 == 1U) /* ToDo: ARMCC_V6: 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) \ +({ \ + uint32_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); +} + +#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; \ + }) + +__attribute__((always_inline)) __STATIC_INLINE uint32_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 == 1U) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_V6_H */ diff --git a/bsp/nuvoton/libraries/ma35/CMSIS/Include/cmsis_gcc.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/cmsis_gcc.h new file mode 100644 index 0000000000..815df3ea75 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/cmsis_gcc.h @@ -0,0 +1,1377 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS Cortex-M Core Function/Instruction Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (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 __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#if defined ( __GNUC__ ) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsign-conversion" + #pragma GCC diagnostic ignored "-Wconversion" + #pragma GCC diagnostic ignored "-Wunused-parameter" +#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); +} + + +/** + \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"); +} + + +/** + \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\n" : "=r"(result)); + return (result); +} + + +/** + \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\n" : : "r"(topOfProcStack) : "sp"); +} + + +/** + \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\n" : "=r"(result)); + return (result); +} + + +/** + \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\n" : : "r"(topOfMainStack) : "sp"); +} + + +/** + \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); +} + + +/** + \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 (__CORTEX_M >= 0x03U) + +/** + \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); +} + + +/** + \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 value) +{ + __ASM volatile("MSR basepri, %0" : : "r"(value) : "memory"); +} + + +/** + \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 value) +{ + __ASM volatile("MSR basepri_max, %0" : : "r"(value) : "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); +} + + +/** + \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"); +} + +#endif /* (__CORTEX_M >= 0x03U) */ + + +#if (__CORTEX_M == 0x04U) || (__CORTEX_M == 0x07U) + +/** + \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 (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) + uint32_t result; + + /* Empty asm statement works as a scheduling barrier */ + __ASM volatile(""); + __ASM volatile("VMRS %0, fpscr" : "=r"(result)); + __ASM volatile(""); + return (result); +#else + return (0); +#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 (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) + /* Empty asm statement works as a scheduling barrier */ + __ASM volatile(""); + __ASM volatile("VMSR fpscr, %0" : : "r"(fpscr) : "vfpcc"); + __ASM volatile(""); +#endif +} + +#endif /* (__CORTEX_M == 0x04U) || (__CORTEX_M == 0x07U) */ + + + +/*@} 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. + */ +__attribute__((always_inline)) __STATIC_INLINE void __NOP(void) +{ + __ASM volatile("nop"); +} + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +__attribute__((always_inline)) __STATIC_INLINE void __WFI(void) +{ + __ASM volatile("wfi"); +} + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +__attribute__((always_inline)) __STATIC_INLINE void __WFE(void) +{ + __ASM volatile("wfe"); +} + + +/** + \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"); +} + + +/** + \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] value Value to rotate + \param [in] value 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 (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) + __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 (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) + +/** + \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"); +} + + +/** + \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) \ +({ \ + uint32_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 *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile("ldrbt %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("ldrbt %0, [%1]" : "=r"(result) : "r"(addr) : "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 *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile("ldrht %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("ldrht %0, [%1]" : "=r"(result) : "r"(addr) : "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 *addr) +{ + uint32_t result; + + __ASM volatile("ldrt %0, %1" : "=r"(result) : "Q"(*addr)); + 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 *addr) +{ + __ASM volatile("strbt %1, %0" : "=Q"(*addr) : "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 *addr) +{ + __ASM volatile("strht %1, %0" : "=Q"(*addr) : "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 *addr) +{ + __ASM volatile("strt %1, %0" : "=Q"(*addr) : "r"(value)); +} + +#endif /* (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (__CORTEX_M >= 0x04U) /* only for Cortex-M4 and above */ + +__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); +} + +#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; \ + }) + +__attribute__((always_inline)) __STATIC_INLINE uint32_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 /* (__CORTEX_M >= 0x04) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#if defined ( __GNUC__ ) + #pragma GCC diagnostic pop +#endif + +#endif /* __CMSIS_GCC_H */ diff --git a/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm0.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm0.h new file mode 100644 index 0000000000..81e63175d7 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm0.h @@ -0,0 +1,798 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#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 + @{ + */ + +/* CMSIS CM0 definitions */ +#define __CM0_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ +#define __CM0_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ +#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ + __CM0_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x00U) /*!< Cortex-M Core */ + + +#if defined ( __CC_ARM ) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined ( __GNUC__ ) +#define __ASM __asm /*!< asm keyword for GNU Compiler */ +#define __INLINE inline /*!< inline keyword for GNU Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __ICCARM__ ) +#define __ASM __asm /*!< asm keyword for IAR Compiler */ +#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ +#define __STATIC_INLINE static inline + +#elif defined ( __TMS470__ ) +#define __ASM __asm /*!< asm keyword for TI CCS Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __TASKING__ ) +#define __ASM __asm /*!< asm keyword for TASKING Compiler */ +#define __INLINE inline /*!< inline keyword for TASKING Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __CSMC__ ) +#define __packed +#define __ASM _asm /*!< asm keyword for COSMIC Compiler */ +#define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ +#define __STATIC_INLINE static inline + +#else +#error Unknown compiler +#endif + +/** __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 ( __TMS470__ ) +#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 "core_cmInstr.h" /* Core Instruction Access */ +#include "core_cmFunc.h" /* Core Function Access */ + +#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. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) ((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. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) ((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 Cortex-M0 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. + @{ + */ + +/* 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 External Interrupt + \details Enables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Disable External Interrupt + \details Disables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Get Pending Interrupt + \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. + \param [in] IRQn Interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return ((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of an external interrupt. + \param [in] IRQn Interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of an external interrupt. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of an interrupt. + \note The priority cannot be set for every core interrupt. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) < 0) + { + 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))); + } + else + { + 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))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of an interrupt. + The interrupt number can be positive to specify an external (device specific) interrupt, + or negative to specify an internal (core) interrupt. + \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)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn)) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return ((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn)) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \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 */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if (__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/nuvoton/libraries/ma35/CMSIS/Include/core_cm0plus.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm0plus.h new file mode 100644 index 0000000000..aa0ca4ae65 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm0plus.h @@ -0,0 +1,914 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#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+ + @{ + */ + +/* CMSIS CM0+ definitions */ +#define __CM0PLUS_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ +#define __CM0PLUS_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ +#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ + __CM0PLUS_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x00U) /*!< Cortex-M Core */ + + +#if defined ( __CC_ARM ) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined ( __GNUC__ ) +#define __ASM __asm /*!< asm keyword for GNU Compiler */ +#define __INLINE inline /*!< inline keyword for GNU Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __ICCARM__ ) +#define __ASM __asm /*!< asm keyword for IAR Compiler */ +#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ +#define __STATIC_INLINE static inline + +#elif defined ( __TMS470__ ) +#define __ASM __asm /*!< asm keyword for TI CCS Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __TASKING__ ) +#define __ASM __asm /*!< asm keyword for TASKING Compiler */ +#define __INLINE inline /*!< inline keyword for TASKING Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __CSMC__ ) +#define __packed +#define __ASM _asm /*!< asm keyword for COSMIC Compiler */ +#define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ +#define __STATIC_INLINE static inline + +#else +#error Unknown compiler +#endif + +/** __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 ( __TMS470__ ) +#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 "core_cmInstr.h" /* Core Instruction Access */ +#include "core_cmFunc.h" /* Core Function Access */ + +#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 (__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 (__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 (__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. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) ((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. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) ((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 Cortex-M0+ 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 (__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. + @{ + */ + +/* 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 External Interrupt + \details Enables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Disable External Interrupt + \details Disables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Get Pending Interrupt + \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. + \param [in] IRQn Interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return ((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of an external interrupt. + \param [in] IRQn Interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of an external interrupt. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of an interrupt. + \note The priority cannot be set for every core interrupt. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) < 0) + { + 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))); + } + else + { + 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))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of an interrupt. + The interrupt number can be positive to specify an external (device specific) interrupt, + or negative to specify an internal (core) interrupt. + \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)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn)) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return ((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn)) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \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 */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if (__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/nuvoton/libraries/ma35/CMSIS/Include/core_cm3.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm3.h new file mode 100644 index 0000000000..337c324442 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm3.h @@ -0,0 +1,1763 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#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 + @{ + */ + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ + __CM3_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x03U) /*!< Cortex-M Core */ + + +#if defined ( __CC_ARM ) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined ( __GNUC__ ) +#define __ASM __asm /*!< asm keyword for GNU Compiler */ +#define __INLINE inline /*!< inline keyword for GNU Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __ICCARM__ ) +#define __ASM __asm /*!< asm keyword for IAR Compiler */ +#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ +#define __STATIC_INLINE static inline + +#elif defined ( __TMS470__ ) +#define __ASM __asm /*!< asm keyword for TI CCS Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __TASKING__ ) +#define __ASM __asm /*!< asm keyword for TASKING Compiler */ +#define __INLINE inline /*!< inline keyword for TASKING Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __CSMC__ ) +#define __packed +#define __ASM _asm /*!< asm keyword for COSMIC Compiler */ +#define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ +#define __STATIC_INLINE static inline + +#else +#error Unknown compiler +#endif + +/** __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 ( __TMS470__ ) +#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 "core_cmInstr.h" /* Core Instruction Access */ +#include "core_cmFunc.h" /* Core Function Access */ + +#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 4U +#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: 15; /*!< bit: 9..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_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 (__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 */ + +/* 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 (__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. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) ((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. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) ((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 Cortex-M3 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 (__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. + @{ + */ + +/** + \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 External Interrupt + \details Enables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Disable External Interrupt + \details Disables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Get Pending Interrupt + \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. + \param [in] IRQn Interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return ((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of an external interrupt. + \param [in] IRQn Interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + 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 an external interrupt. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + 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 NVIC and returns the active bit. + \param [in] IRQn Interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + */ +__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return ((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of an interrupt. + \note The priority cannot be set for every core interrupt. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) < 0) + { + SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL) - 4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of an interrupt. + The interrupt number can be positive to specify an external (device specific) interrupt, + or negative to specify an internal (core) interrupt. + \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)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL) - 4UL] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return (((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (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 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 */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if (__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 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/nuvoton/libraries/ma35/CMSIS/Include/core_cm4.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm4.h new file mode 100644 index 0000000000..e9d5044f4c --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm4.h @@ -0,0 +1,1937 @@ +/**************************************************************************//** + * @file core_cm4.h + * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#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 + @{ + */ + +/* CMSIS CM4 definitions */ +#define __CM4_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ +#define __CM4_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ +#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ + __CM4_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x04U) /*!< Cortex-M Core */ + + +#if defined ( __CC_ARM ) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined ( __GNUC__ ) +#define __ASM __asm /*!< asm keyword for GNU Compiler */ +#define __INLINE inline /*!< inline keyword for GNU Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __ICCARM__ ) +#define __ASM __asm /*!< asm keyword for IAR Compiler */ +#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ +#define __STATIC_INLINE static inline + +#elif defined ( __TMS470__ ) +#define __ASM __asm /*!< asm keyword for TI CCS Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __TASKING__ ) +#define __ASM __asm /*!< asm keyword for TASKING Compiler */ +#define __INLINE inline /*!< inline keyword for TASKING Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __CSMC__ ) +#define __packed +#define __ASM _asm /*!< asm keyword for COSMIC Compiler */ +#define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ +#define __STATIC_INLINE static inline + +#else +#error Unknown compiler +#endif + +/** __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 (__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 (__FPU_PRESENT == 1) +#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 (__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 (__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 ( __TMS470__ ) +#if defined __TI_VFP_SUPPORT__ +#if (__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 (__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 (__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 "core_cmInstr.h" /* Core Instruction Access */ +#include "core_cmFunc.h" /* Core Function Access */ +#include "core_cmSimd.h" /* Compiler specific SIMD Intrinsics */ + +#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 4U +#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: 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 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 */ + +/* 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 (__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 + + +#if (__FPU_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 */ +#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. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) ((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. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) ((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 Cortex-M4 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 (__MPU_PRESENT == 1U) +#define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ +#define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#if (__FPU_PRESENT == 1U) +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point 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. + @{ + */ + +/** + \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 External Interrupt + \details Enables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Disable External Interrupt + \details Disables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Get Pending Interrupt + \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. + \param [in] IRQn Interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return ((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of an external interrupt. + \param [in] IRQn Interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + 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 an external interrupt. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + 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 NVIC and returns the active bit. + \param [in] IRQn Interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + */ +__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return ((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of an interrupt. + \note The priority cannot be set for every core interrupt. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) < 0) + { + SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL) - 4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of an interrupt. + The interrupt number can be positive to specify an external (device specific) interrupt, + or negative to specify an internal (core) interrupt. + \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)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL) - 4UL] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return (((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (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 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 */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if (__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 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/nuvoton/libraries/ma35/CMSIS/Include/core_cm7.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm7.h new file mode 100644 index 0000000000..f2877865b1 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cm7.h @@ -0,0 +1,2535 @@ +/**************************************************************************//** + * @file core_cm7.h + * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#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 + @{ + */ + +/* CMSIS CM7 definitions */ +#define __CM7_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ +#define __CM7_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ +#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ + __CM7_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x07U) /*!< Cortex-M Core */ + + +#if defined ( __CC_ARM ) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined ( __GNUC__ ) +#define __ASM __asm /*!< asm keyword for GNU Compiler */ +#define __INLINE inline /*!< inline keyword for GNU Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __ICCARM__ ) +#define __ASM __asm /*!< asm keyword for IAR Compiler */ +#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ +#define __STATIC_INLINE static inline + +#elif defined ( __TMS470__ ) +#define __ASM __asm /*!< asm keyword for TI CCS Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __TASKING__ ) +#define __ASM __asm /*!< asm keyword for TASKING Compiler */ +#define __INLINE inline /*!< inline keyword for TASKING Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __CSMC__ ) +#define __packed +#define __ASM _asm /*!< asm keyword for COSMIC Compiler */ +#define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ +#define __STATIC_INLINE static inline + +#else +#error Unknown compiler +#endif + +/** __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 (__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 (__FPU_PRESENT == 1) +#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 (__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 (__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 ( __TMS470__ ) +#if defined __TI_VFP_SUPPORT__ +#if (__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 (__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 (__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 "core_cmInstr.h" /* Core Instruction Access */ +#include "core_cmFunc.h" /* Core Function Access */ +#include "core_cmSimd.h" /* Compiler specific SIMD Intrinsics */ + +#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: 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 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 1 */ + 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 */ + +/* 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 (__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 + + +#if (__FPU_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 */ +#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. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) ((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. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) ((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 Cortex-M4 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 (__MPU_PRESENT == 1U) +#define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ +#define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#if (__FPU_PRESENT == 1U) +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point 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. + @{ + */ + +/** + \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 External Interrupt + \details Enables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Disable External Interrupt + \details Disables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Get Pending Interrupt + \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. + \param [in] IRQn Interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return ((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of an external interrupt. + \param [in] IRQn Interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + 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 an external interrupt. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + 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 NVIC and returns the active bit. + \param [in] IRQn Interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + */ +__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return ((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of an interrupt. + \note The priority cannot be set for every core interrupt. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) < 0) + { + SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL) - 4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of an interrupt. + The interrupt number can be positive to specify an external (device specific) interrupt, + or negative to specify an internal (core) interrupt. + \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)SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL) - 4UL] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return (((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (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 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) +{ + uint32_t mvfr0; + + mvfr0 = SCB->MVFR0; + if ((mvfr0 & 0x00000FF0UL) == 0x220UL) + { + return 2UL; /* Double + Single precision FPU */ + } + else if ((mvfr0 & 0x00000FF0UL) == 0x020UL) + { + return 1UL; /* Single precision FPU */ + } + else + { + return 0UL; /* 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 (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + 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 (__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 (__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 (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = (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--); + } + while (sets--); + __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 (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = (0U << 1U) | 0U; /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ + + /* 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--); + } + while (sets--); + + __DSB(); + __ISB(); +#endif +} + + +/** + \brief Invalidate D-Cache + \details Invalidates D-Cache + */ +__STATIC_INLINE void SCB_InvalidateDCache(void) +{ +#if (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = (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--); + } + while (sets--); + + __DSB(); + __ISB(); +#endif +} + + +/** + \brief Clean D-Cache + \details Cleans D-Cache + */ +__STATIC_INLINE void SCB_CleanDCache(void) +{ +#if (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = (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--); + } + while (sets--); + + __DSB(); + __ISB(); +#endif +} + + +/** + \brief Clean & Invalidate D-Cache + \details Cleans and Invalidates D-Cache + */ +__STATIC_INLINE void SCB_CleanInvalidateDCache(void) +{ +#if (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = (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--); + } + while (sets--); + + __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 (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t)addr; + int32_t linesize = 32U; /* 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 += 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 (__DCACHE_PRESENT == 1) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t) addr; + int32_t linesize = 32U; /* 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 += 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 (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t) addr; + int32_t linesize = 32U; /* 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 += 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 (__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 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/nuvoton/libraries/ma35/CMSIS/Include/core_cmFunc.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cmFunc.h new file mode 100644 index 0000000000..ed3c190107 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cmFunc.h @@ -0,0 +1,87 @@ +/**************************************************************************//** + * @file core_cmFunc.h + * @brief CMSIS Cortex-M Core Function Access Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#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_CMFUNC_H + #define __CORE_CMFUNC_H + + + /* ########################### Core Function Access ########################### */ + /** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + + /*------------------ RealView Compiler -----------------*/ + #if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + /*------------------ ARM Compiler V6 -------------------*/ + #elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #include "cmsis_armcc_V6.h" + + /*------------------ GNU Compiler ----------------------*/ + #elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + /*------------------ ICC Compiler ----------------------*/ + #elif defined ( __ICCARM__ ) + #include + + /*------------------ TI CCS Compiler -------------------*/ + #elif defined ( __TMS470__ ) + #include + + /*------------------ 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. + */ + + /*------------------ COSMIC Compiler -------------------*/ + #elif defined ( __CSMC__ ) + #include + + #endif + + /*@} end of CMSIS_Core_RegAccFunctions */ + +#endif /* __CORE_CMFUNC_H */ diff --git a/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cmInstr.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cmInstr.h new file mode 100644 index 0000000000..a334984f5d --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cmInstr.h @@ -0,0 +1,87 @@ +/**************************************************************************//** + * @file core_cmInstr.h + * @brief CMSIS Cortex-M Core Instruction Access Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#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_CMINSTR_H + #define __CORE_CMINSTR_H + + + /* ########################## Core Instruction Access ######################### */ + /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ + */ + + /*------------------ RealView Compiler -----------------*/ + #if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + /*------------------ ARM Compiler V6 -------------------*/ + #elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #include "cmsis_armcc_V6.h" + + /*------------------ GNU Compiler ----------------------*/ + #elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + /*------------------ ICC Compiler ----------------------*/ + #elif defined ( __ICCARM__ ) + #include + + /*------------------ TI CCS Compiler -------------------*/ + #elif defined ( __TMS470__ ) + #include + + /*------------------ 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. + */ + + /*------------------ COSMIC Compiler -------------------*/ + #elif defined ( __CSMC__ ) + #include + + #endif + + /*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + +#endif /* __CORE_CMINSTR_H */ diff --git a/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cmSimd.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cmSimd.h new file mode 100644 index 0000000000..590ebee9d5 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_cmSimd.h @@ -0,0 +1,96 @@ +/**************************************************************************//** + * @file core_cmSimd.h + * @brief CMSIS Cortex-M SIMD Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#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_CMSIMD_H +#define __CORE_CMSIMD_H + +#ifdef __cplusplus +extern "C" { +#endif + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +/*------------------ RealView Compiler -----------------*/ +#if defined ( __CC_ARM ) +#include "cmsis_armcc.h" + +/*------------------ ARM Compiler V6 -------------------*/ +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#include "cmsis_armcc_V6.h" + +/*------------------ GNU Compiler ----------------------*/ +#elif defined ( __GNUC__ ) +#include "cmsis_gcc.h" + +/*------------------ ICC Compiler ----------------------*/ +#elif defined ( __ICCARM__ ) +#include + +/*------------------ TI CCS Compiler -------------------*/ +#elif defined ( __TMS470__ ) +#include + +/*------------------ 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. + */ + +/*------------------ COSMIC Compiler -------------------*/ +#elif defined ( __CSMC__ ) +#include + +#endif + +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CMSIMD_H */ diff --git a/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_sc000.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_sc000.h new file mode 100644 index 0000000000..793c28f09b --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_sc000.h @@ -0,0 +1,926 @@ +/**************************************************************************//** + * @file core_sc000.h + * @brief CMSIS SC000 Core Peripheral Access Layer Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#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 + @{ + */ + +/* CMSIS SC000 definitions */ +#define __SC000_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ +#define __SC000_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ +#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ + __SC000_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_SC (000U) /*!< Cortex secure core */ + + +#if defined ( __CC_ARM ) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined ( __GNUC__ ) +#define __ASM __asm /*!< asm keyword for GNU Compiler */ +#define __INLINE inline /*!< inline keyword for GNU Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __ICCARM__ ) +#define __ASM __asm /*!< asm keyword for IAR Compiler */ +#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ +#define __STATIC_INLINE static inline + +#elif defined ( __TMS470__ ) +#define __ASM __asm /*!< asm keyword for TI CCS Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __TASKING__ ) +#define __ASM __asm /*!< asm keyword for TASKING Compiler */ +#define __INLINE inline /*!< inline keyword for TASKING Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __CSMC__ ) +#define __packed +#define __ASM _asm /*!< asm keyword for COSMIC Compiler */ +#define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ +#define __STATIC_INLINE static inline + +#else +#error Unknown compiler +#endif + +/** __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 ( __TMS470__ ) +#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 "core_cmInstr.h" /* Core Instruction Access */ +#include "core_cmFunc.h" /* Core Function Access */ + +#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 (__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. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) ((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. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) ((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 SC000 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 (__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. + @{ + */ + +/* 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 External Interrupt + \details Enables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Disable External Interrupt + \details Disables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Get Pending Interrupt + \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. + \param [in] IRQn Interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return ((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of an external interrupt. + \param [in] IRQn Interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of an external interrupt. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of an interrupt. + \note The priority cannot be set for every core interrupt. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) < 0) + { + 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))); + } + else + { + 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))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of an interrupt. + The interrupt number can be positive to specify an external (device specific) interrupt, + or negative to specify an internal (core) interrupt. + \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)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn)) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return ((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn)) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \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 */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if (__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/nuvoton/libraries/ma35/CMSIS/Include/core_sc300.h b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_sc300.h new file mode 100644 index 0000000000..eaece43eb2 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/Include/core_sc300.h @@ -0,0 +1,1745 @@ +/**************************************************************************//** + * @file core_sc300.h + * @brief CMSIS SC300 Core Peripheral Access Layer Header File + * @version V4.30 + * @date 20. October 2015 + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#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 + @{ + */ + +/* CMSIS SC300 definitions */ +#define __SC300_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ +#define __SC300_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ +#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ + __SC300_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_SC (300U) /*!< Cortex secure core */ + + +#if defined ( __CC_ARM ) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define __ASM __asm /*!< asm keyword for ARM Compiler */ +#define __INLINE __inline /*!< inline keyword for ARM Compiler */ +#define __STATIC_INLINE static __inline + +#elif defined ( __GNUC__ ) +#define __ASM __asm /*!< asm keyword for GNU Compiler */ +#define __INLINE inline /*!< inline keyword for GNU Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __ICCARM__ ) +#define __ASM __asm /*!< asm keyword for IAR Compiler */ +#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ +#define __STATIC_INLINE static inline + +#elif defined ( __TMS470__ ) +#define __ASM __asm /*!< asm keyword for TI CCS Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __TASKING__ ) +#define __ASM __asm /*!< asm keyword for TASKING Compiler */ +#define __INLINE inline /*!< inline keyword for TASKING Compiler */ +#define __STATIC_INLINE static inline + +#elif defined ( __CSMC__ ) +#define __packed +#define __ASM _asm /*!< asm keyword for COSMIC Compiler */ +#define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ +#define __STATIC_INLINE static inline + +#else +#error Unknown compiler +#endif + +/** __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 ( __TMS470__ ) +#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 "core_cmInstr.h" /* Core Instruction Access */ +#include "core_cmFunc.h" /* Core Function Access */ + +#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 4U +#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: 15; /*!< bit: 9..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_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 */ + +/* 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 (__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. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) ((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. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) ((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 Cortex-M3 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 (__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. + @{ + */ + +/** + \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 External Interrupt + \details Enables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Disable External Interrupt + \details Disables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); +} + + +/** + \brief Get Pending Interrupt + \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. + \param [in] IRQn Interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return ((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of an external interrupt. + \param [in] IRQn Interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + 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 an external interrupt. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + 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 NVIC and returns the active bit. + \param [in] IRQn Interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + */ +__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return ((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of an interrupt. + \note The priority cannot be set for every core interrupt. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) < 0) + { + SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL) - 4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of an interrupt. + The interrupt number can be positive to specify an external (device specific) interrupt, + or negative to specify an internal (core) interrupt. + \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)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL) - 4UL] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return (((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (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 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 */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if (__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 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/nuvoton/libraries/ma35/CMSIS/SConscript b/bsp/nuvoton/libraries/ma35/CMSIS/SConscript new file mode 100644 index 0000000000..dc4b1082e8 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/CMSIS/SConscript @@ -0,0 +1,14 @@ +import rtconfig +Import('RTT_ROOT') +from building import * + +# get current directory +group = [] + +if GetDepend('USE_MA35D1_SUBM'): + cwd = GetCurrentDir() + src = [] + path = [cwd + '/Include',] + group = DefineGroup('CMSIS', src, depend = [''], CPPPATH = path) + +Return('group') diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/NuMicro.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/NuMicro.h new file mode 100644 index 0000000000..6701a455c8 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/NuMicro.h @@ -0,0 +1,15 @@ +/**************************************************************************//** + * @file NuMicro.h + * @brief NuMicro peripheral access layer header file. + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NUMICRO_H__ +#define __NUMICRO_H__ + +#include "ma35d1.h" + +#endif /* __NUMICRO_H__ */ + + diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/adc_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/adc_reg.h new file mode 100644 index 0000000000..4637bb5d19 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/adc_reg.h @@ -0,0 +1,378 @@ +/**************************************************************************//** + * @file adc.h + * @brief ADC driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020~2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#ifndef __ADC_REG_H__ +#define __ADC_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup ADC Analog to Digital Converter(ADC) + Memory Mapped Structure for ADC Controller +@{ */ + +typedef struct +{ + + + /** + * @var ADC_T::CTL + * Offset: 0x00 ADC Control + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ADEN |ADC Power Control + * | | |0 = Power down ADC. + * | | |1 = Power on ADC. + * |[8] |MST |Menu Start Conversion + * | | |0 = Functional menu not started. + * | | |1 = Start all enable bit in ADC_CONF register. + * | | |Note: This bit is set by software and cleared by hardware when all the tasks listed in ADC_CONF are done. + * |[9] |PEDEEN |Pen Down Event Enable Bit + * | | |0 = Pen down event interrupt Disabled. + * | | |1 = Pen down event interrupt Enabled. + * |[11] |WKTEN |Touch Wake Up Enable Bit + * | | |0 = Touch wake-up Disabled. + * | | |1 = Touch wake-up Enabled. + * |[16] |WMSWCH |Wire Mode Switch for 5-wire/4-wire Configuration + * | | |0 = 4-wire mode. + * | | |1 = 5-wire mode. + * @var ADC_T::CONF + * Offset: 0x04 ADC Configure + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TEN |Touch Detection Enable Bit + * | | |0 = Touch detection function Disabled. + * | | |1 = Touch detection function Enabled. + * |[1] |ZEN |Press Measure Enable Bit + * | | |1 = Press measure function Disabled. + * | | |1 = Press measure function Enabled. + * |[2] |NACEN |Normal A/D Conversion Enable Bit + * | | |ADC normal conversion function enable + * | | |0 = Normal A/D Conversion Disabled. + * | | |1 = Normal A/D Conversion Enabled. + * |[7:6] |REFSEL |ADC Reference Select + * | | |ADC reference voltage select when ADC operate in normal conversion. + * | | |00 = AGND33 vs VREF input. + * | | |01 = YM vs YP. + * | | |10 = XM vs XP. + * | | |11 = AGND33 vs AVDD33. + * |[14:12] |CHSEL |Channel Selection + * | | |ADC input channel selection. + * | | |000 = VREF. + * | | |001 = A1. + * | | |010 = A2. + * | | |011 = VSENSE. + * | | |100 = YM. + * | | |101 = YP. + * | | |110 = XM. + * | | |111 = XP. + * |[20] |TMAVDIS |Display T Mean Average Disable Bit + * | | |Touch mean average for X and Y function disable bit. + * | | |0 = Touch mean average for X and Y function Enabled. + * | | |1 = Touch mean average for X and Y function Disabled. + * |[21] |ZMAVDIS |Display Z Mean Average Disable Bit + * | | |Pressure mean average for Z1 and Z2 function disable bit. + * | | |0 = Pressure mean average for Z1 and Z2 function Enabled. + * | | |1 = Pressure mean average for Z1 and Z2 function Disabled. + * |[22] |SPEED |Speed Mode Selection + * | | |0 = All ADC channels set to high speed mode. + * | | |1 = All ADC channels set to low speed mode. + * @var ADC_T::IER + * Offset: 0x08 ADC Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |MIEN |Menu Interrupt Enable Bit + * | | |Function menu complete interrupt enable. + * | | |0 = Menu interrupt Disabled. + * | | |1 = Menu interrupt Enabled. + * |[2] |PEDEIEN |Pen Down Event Interrupt Enable Bit + * | | |0 = Pen down event detection interrupt Disabled. + * | | |1 = Pen down event detection interrupt Enabled. + * |[3] |WKTIEN |Wake Up Touch Interrupt Enable Bit + * | | |0 = Wake up touch detection interrupt Disabled. + * | | |1 = Wake up touch detection interrupt Enabled. + * |[6] |PEUEIEN |Pen Up Event Interrupt Enable Bit + * | | |0 = Pen up event detection interrupt Disabled. + * | | |1 = Pen up event detection interrupt Enabled. + * @var ADC_T::ISR + * Offset: 0x0C ADC Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |MF |Menu Complete Flag + * | | |Function menu complete status indicator. + * | | |Note: Set by hardware and write 1 to clear this bit. + * |[2] |PEDEF |Pen Down Event Flag + * | | |Pen down event status indicator. + * | | |Note: Set by hardware and write 1 to clear this bit. + * |[4] |PEUEF |Pen Up Event Flag + * | | |Pen up event status indicator. + * | | |Note: Set by hardware and write 1 to clear this bit. + * |[8] |TF |Touch Conversion Finish + * | | |Functional menu touch detection conversion finish. + * | | |Note: Set by hardware and write 1 to clear this bit. + * |[9] |ZF |Press Conversion Finish + * | | |Functional menu press measure conversion finish. + * | | |Note: Set by hardware and write 1 to clear this bit. + * |[10] |NACF |Normal AD Conversion Finish + * | | |Functional menu normal AD conversion finish. + * | | |Note: Set by hardware and write 1 to clear this bit. + * |[17] |INTTC |Interrupt Signal for Touch Screen Touching Detection + * | | |This signal is directly from analog macro without de-bouncing and can be used to determine the pen down touch event together with PEDEF (ADC_ISR[2]) flag. + * @var ADC_T::WKISR + * Offset: 0x10 ADC Wake-up interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |WPEDEF |Wake Up Pen Down Event Flag + * | | |Pen down event wake up status indicator. + * @var ADC_T::XYDATA + * Offset: 0x20 ADC Touch X,Y Position Data + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |XDATA |ADC X Data + * | | |When TEN (ADC_CONF[0]) is set, the touch x-position will be stored in this register. + * | | |Note: If the TMAVDIS (ADC_CONF[20]) = 0, both x and y position are the results of the mean average of x and y in ADC_XYSORT0 ~ ADC_XYSORT3. + * |[27:16] |YDATA |ADC Y Data + * | | |When TEN (ADC_CONF[0]) is set, the touch y-position will be stored in this register. + * | | |Note: If the TMAVDIS (ADC_CONF[20]) = 0, both x and y position are the results of the mean average of x and y in ADC_XYSORT0 ~ ADC_XYSORT3. + * @var ADC_T::ZDATA + * Offset: 0x24 ADC Touch Z Pressure Data + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |Z1DATA |ADC Z1 Data + * | | |When ZEN (ADC_CONF[1]) is set; the touch pressure measure Z1 will be stored in this register. + * | | |Note: If the ZMAVDIS (ADC_CONF[21]) = 0, both Z1 and Z2 data is the results of the mean average of Z1 and Z2 in ADC_ZSORT0 ~ ADC_ZSORT3. + * |[27:16] |Z2DATA |ADC Z2 Data + * | | |When ZEN (ADC_CONF[1]) is set; the touch pressure measure Z2 will be stored in this register. + * | | |Note: If the ZMAVDIS (ADC_CONF[21]) = 0, both Z1 and Z2 data is the results of the mean average of Z1 and Z2 in ADC_ZSORT0 ~ ADC_ZSORT3. + * @var ADC_T::DATA + * Offset: 0x28 ADC Normal Conversion Data + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |ADCDATA |ADC Data + * | | |When NACEN (ADC_CONF[2]) is enabled, the AD converting result with corresponding channel is stored in this register. + * @var ADC_T::XYSORT0 + * Offset: 0x1F4 ADC Touch XY Position Mean Value Sort 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |XSORT0 |X Position Sort Data 0 + * | | |X position mean average sort data 0. + * |[27:16] |YSORT0 |Y Position Sort Data 0 + * | | |Y position mean average sort data 0. + * @var ADC_T::XYSORT1 + * Offset: 0x1F8 ADC Touch XY Position Mean Value Sort 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |XSORT1 |X Position Sort Data 1 + * | | |X position mean average sort data 1. + * |[27:16] |YSORT1 |Y Position Sort Data 1 + * | | |Y position mean average sort data 1. + * @var ADC_T::XYSORT2 + * Offset: 0x1FC ADC Touch XY Position Mean Value Sort 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |XSORT2 |X Position Sort Data 2 + * | | |X position mean average sort data 2. + * |[27:16] |YSORT2 |Y Position Sort Data 2 + * | | |Y position mean average sort data 2. + * @var ADC_T::XYSORT3 + * Offset: 0x200 ADC Touch XY Position Mean Value Sort 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |XSORT3 |X Position Sort Data 3 + * | | |X position mean average sort data 3. + * |[27:16] |YSORT3 |Y Position Sort Data 3 + * | | |Y position mean average sort data 3. + * @var ADC_T::ZSORT0 + * Offset: 0x204 ADC Touch Z Pressure Mean Value Sort 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |Z1SORT0 |Z1 Position Sort Data 0 + * | | |Z1 position Mean average sort data 0. + * |[27:16] |Z2SORT0 |Z2 Position Sort Data 0 + * | | |Z2 position Mean average sort data 0. + * @var ADC_T::ZSORT1 + * Offset: 0x208 ADC Touch Z Pressure Mean Value Sort 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |Z1SORT1 |Z1 Position Sort Data 1 + * | | |Z1 position Mean average sort data 1. + * |[27:16] |Z2SORT1 |Z2 Position Sort Data 1 + * | | |Z2 position Mean average sort data 1. + * @var ADC_T::ZSORT2 + * Offset: 0x20C ADC Touch Z Pressure Mean Value Sort 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |Z1SORT2 |Z1 Position Sort Data 2 + * | | |Z1 position Mean average sort data 2. + * |[27:16] |Z2SORT2 |Z2 Position Sort Data 2 + * | | |Z2 position Mean average sort data 2. + * @var ADC_T::ZSORT3 + * Offset: 0x210 ADC Touch Z Pressure Mean Value Sort 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |Z1SORT3 |Z1 Position Sort Data 3 + * | | |Z1 position Mean average sort data 3. + * |[27:16] |Z2SORT3 |Z2 Position Sort Data 3 + * | | |Z2 position Mean average sort data 3. + */ + __IO uint32_t CTL; /*!< [0x0000] ADC Control */ + __IO uint32_t CONF; /*!< [0x0004] ADC Configure */ + __IO uint32_t IER; /*!< [0x0008] ADC Interrupt Enable Register */ + __IO uint32_t ISR; /*!< [0x000c] ADC Interrupt Status Register */ + __I uint32_t WKISR; /*!< [0x0010] ADC Wake-up interrupt Status Register */ + __I uint32_t RESERVE0[3]; + __I uint32_t XYDATA; /*!< [0x0020] ADC Touch X,Y Position Data */ + __I uint32_t ZDATA; /*!< [0x0024] ADC Touch Z Pressure Data */ + __I uint32_t DATA; /*!< [0x0028] ADC Normal Conversion Data */ + __I uint32_t RESERVE1[114]; + __I uint32_t XYSORT[4]; /*!< [0x01f4~0x0200] ADC Touch XY Position Mean Value Sort Register */ + __I uint32_t ZSORT0[4]; /*!< [0x0204~0x0210] ADC Touch Z Pressure Mean Value Sort Register */ + +} ADC_T; + +/** + @addtogroup ADC_CONST ADC Bit Field Definition + Constant Definitions for ADC Controller +@{ */ + +#define ADC_CTL_ADEN_Pos (0) /*!< ADC_T::CTL: ADEN Position */ +#define ADC_CTL_ADEN_Msk (0x1ul << ADC_CTL_ADEN_Pos) /*!< ADC_T::CTL: ADEN Mask */ + +#define ADC_CTL_MST_Pos (8) /*!< ADC_T::CTL: MST Position */ +#define ADC_CTL_MST_Msk (0x1ul << ADC_CTL_MST_Pos) /*!< ADC_T::CTL: MST Mask */ + +#define ADC_CTL_PEDEEN_Pos (9) /*!< ADC_T::CTL: PEDEEN Position */ +#define ADC_CTL_PEDEEN_Msk (0x1ul << ADC_CTL_PEDEEN_Pos) /*!< ADC_T::CTL: PEDEEN Mask */ + +#define ADC_CTL_WKTEN_Pos (11) /*!< ADC_T::CTL: WKTEN Position */ +#define ADC_CTL_WKTEN_Msk (0x1ul << ADC_CTL_WKTEN_Pos) /*!< ADC_T::CTL: WKTEN Mask */ + +#define ADC_CTL_WMSWCH_Pos (16) /*!< ADC_T::CTL: WMSWCH Position */ +#define ADC_CTL_WMSWCH_Msk (0x1ul << ADC_CTL_WMSWCH_Pos) /*!< ADC_T::CTL: WMSWCH Mask */ + +#define ADC_CONF_TEN_Pos (0) /*!< ADC_T::CONF: TEN Position */ +#define ADC_CONF_TEN_Msk (0x1ul << ADC_CONF_TEN_Pos) /*!< ADC_T::CONF: TEN Mask */ + +#define ADC_CONF_ZEN_Pos (1) /*!< ADC_T::CONF: ZEN Position */ +#define ADC_CONF_ZEN_Msk (0x1ul << ADC_CONF_ZEN_Pos) /*!< ADC_T::CONF: ZEN Mask */ + +#define ADC_CONF_NACEN_Pos (2) /*!< ADC_T::CONF: NACEN Position */ +#define ADC_CONF_NACEN_Msk (0x1ul << ADC_CONF_NACEN_Pos) /*!< ADC_T::CONF: NACEN Mask */ + +#define ADC_CONF_REFSEL_Pos (6) /*!< ADC_T::CONF: REFSEL Position */ +#define ADC_CONF_REFSEL_Msk (0x3ul << ADC_CONF_REFSEL_Pos) /*!< ADC_T::CONF: REFSEL Mask */ + +#define ADC_CONF_CHSEL_Pos (12) /*!< ADC_T::CONF: CHSEL Position */ +#define ADC_CONF_CHSEL_Msk (0x7ul << ADC_CONF_CHSEL_Pos) /*!< ADC_T::CONF: CHSEL Mask */ + +#define ADC_CONF_TMAVDIS_Pos (20) /*!< ADC_T::CONF: TMAVDIS Position */ +#define ADC_CONF_TMAVDIS_Msk (0x1ul << ADC_CONF_TMAVDIS_Pos) /*!< ADC_T::CONF: TMAVDIS Mask */ + +#define ADC_CONF_ZMAVDIS_Pos (21) /*!< ADC_T::CONF: ZMAVDIS Position */ +#define ADC_CONF_ZMAVDIS_Msk (0x1ul << ADC_CONF_ZMAVDIS_Pos) /*!< ADC_T::CONF: ZMAVDIS Mask */ + +#define ADC_CONF_SPEED_Pos (22) /*!< ADC_T::CONF: SPEED Position */ +#define ADC_CONF_SPEED_Msk (0x1ul << ADC_CONF_SPEED_Pos) /*!< ADC_T::CONF: SPEED Mask */ + +#define ADC_IER_MIEN_Pos (0) /*!< ADC_T::IER: MIEN Position */ +#define ADC_IER_MIEN_Msk (0x1ul << ADC_IER_MIEN_Pos) /*!< ADC_T::IER: MIEN Mask */ + +#define ADC_IER_PEDEIEN_Pos (2) /*!< ADC_T::IER: PEDEIEN Position */ +#define ADC_IER_PEDEIEN_Msk (0x1ul << ADC_IER_PEDEIEN_Pos) /*!< ADC_T::IER: PEDEIEN Mask */ + +#define ADC_IER_WKTIEN_Pos (3) /*!< ADC_T::IER: WKTIEN Position */ +#define ADC_IER_WKTIEN_Msk (0x1ul << ADC_IER_WKTIEN_Pos) /*!< ADC_T::IER: WKTIEN Mask */ + +#define ADC_IER_PEUEIEN_Pos (6) /*!< ADC_T::IER: PEUEIEN Position */ +#define ADC_IER_PEUEIEN_Msk (0x1ul << ADC_IER_PEUEIEN_Pos) /*!< ADC_T::IER: PEUEIEN Mask */ + +#define ADC_ISR_MF_Pos (0) /*!< ADC_T::ISR: MF Position */ +#define ADC_ISR_MF_Msk (0x1ul << ADC_ISR_MF_Pos) /*!< ADC_T::ISR: MF Mask */ + +#define ADC_ISR_PEDEF_Pos (2) /*!< ADC_T::ISR: PEDEF Position */ +#define ADC_ISR_PEDEF_Msk (0x1ul << ADC_ISR_PEDEF_Pos) /*!< ADC_T::ISR: PEDEF Mask */ + +#define ADC_ISR_PEUEF_Pos (4) /*!< ADC_T::ISR: PEUEF Position */ +#define ADC_ISR_PEUEF_Msk (0x1ul << ADC_ISR_PEUEF_Pos) /*!< ADC_T::ISR: PEUEF Mask */ + +#define ADC_ISR_TF_Pos (8) /*!< ADC_T::ISR: TF Position */ +#define ADC_ISR_TF_Msk (0x1ul << ADC_ISR_TF_Pos) /*!< ADC_T::ISR: TF Mask */ + +#define ADC_ISR_ZF_Pos (9) /*!< ADC_T::ISR: ZF Position */ +#define ADC_ISR_ZF_Msk (0x1ul << ADC_ISR_ZF_Pos) /*!< ADC_T::ISR: ZF Mask */ + +#define ADC_ISR_NACF_Pos (10) /*!< ADC_T::ISR: NACF Position */ +#define ADC_ISR_NACF_Msk (0x1ul << ADC_ISR_NACF_Pos) /*!< ADC_T::ISR: NACF Mask */ + +#define ADC_ISR_INTTC_Pos (17) /*!< ADC_T::ISR: INTTC Position */ +#define ADC_ISR_INTTC_Msk (0x1ul << ADC_ISR_INTTC_Pos) /*!< ADC_T::ISR: INTTC Mask */ + +#define ADC_WKISR_WPEDEF_Pos (1) /*!< ADC_T::WKISR: WPEDEF Position */ +#define ADC_WKISR_WPEDEF_Msk (0x1ul << ADC_WKISR_WPEDEF_Pos) /*!< ADC_T::WKISR: WPEDEF Mask */ + +#define ADC_XYDATA_XDATA_Pos (0) /*!< ADC_T::XYDATA: XDATA Position */ +#define ADC_XYDATA_XDATA_Msk (0xffful << ADC_XYDATA_XDATA_Pos) /*!< ADC_T::XYDATA: XDATA Mask */ + +#define ADC_XYDATA_YDATA_Pos (16) /*!< ADC_T::XYDATA: YDATA Position */ +#define ADC_XYDATA_YDATA_Msk (0xffful << ADC_XYDATA_YDATA_Pos) /*!< ADC_T::XYDATA: YDATA Mask */ + +#define ADC_ZDATA_Z1DATA_Pos (0) /*!< ADC_T::ZDATA: Z1DATA Position */ +#define ADC_ZDATA_Z1DATA_Msk (0xffful << ADC_ZDATA_Z1DATA_Pos) /*!< ADC_T::ZDATA: Z1DATA Mask */ + +#define ADC_ZDATA_Z2DATA_Pos (16) /*!< ADC_T::ZDATA: Z2DATA Position */ +#define ADC_ZDATA_Z2DATA_Msk (0xffful << ADC_ZDATA_Z2DATA_Pos) /*!< ADC_T::ZDATA: Z2DATA Mask */ + +#define ADC_DATA_ADCDATA_Pos (0) /*!< ADC_T::DATA: ADCDATA Position */ +#define ADC_DATA_ADCDATA_Msk (0xffful << ADC_DATA_ADCDATA_Pos) /*!< ADC_T::DATA: ADCDATA Mask */ + +#define ADC_XYSORT_XSORT_Pos (0) /*!< ADC_T::XYSORT: XSORT Position */ +#define ADC_XYSORT_XSORT_Msk (0xffful << ADC_XYSORT_XSORT_Pos) /*!< ADC_T::XYSORT: XSORT Mask */ + +#define ADC_XYSORT_YSORT_Pos (16) /*!< ADC_T::XYSORT: YSORT Position */ +#define ADC_XYSORT_YSORT_Msk (0xffful << ADC_XYSORT_YSORT_Pos) /*!< ADC_T::XYSORT: YSORT Mask */ + +#define ADC_ZSORT_Z1SORT_Pos (0) /*!< ADC_T::ZSORT: Z1SORT Position */ +#define ADC_ZSORT_Z1SORT_Msk (0xffful << ADC_ZSORT_Z1SORT_Pos) /*!< ADC_T::ZSORT: Z1SORT Mask */ + +#define ADC_ZSORT_Z2SORT_Pos (16) /*!< ADC_T::ZSORT: Z2SORT Position */ +#define ADC_ZSORT_Z2SORT_Msk (0xffful << ADC_ZSORT_Z2SORT_Pos) /*!< ADC_T::ZSORT: Z2SORT Mask */ + +/**@}*/ /* ADC_CONST */ +/**@}*/ /* end of ADC register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif //__ADC_REG_H__ + + diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/canfd_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/canfd_reg.h new file mode 100644 index 0000000000..e4595d878a --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/canfd_reg.h @@ -0,0 +1,1709 @@ +/**************************************************************************//** + * @file canfd_reg.h + * @brief CANFD register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#ifndef __CANFD_REG_H__ +#define __CANFD_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup Controller Area Network with Feasibility Data Rate (CAN FD) + Memory Mapped Structure for CAN FD Controller +@{ */ + +typedef struct +{ + + + /** + * @var CANFD_T::DBTP + * Offset: 0x0C Data Bit Timing & Prescaler Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |DSJW |Data Re-Synchronization Jump Width + * | | |Valid values are 0 to 15 + * | | |The actual interpretation by the hardware of this value is such that one more than the programmed value is used + * | | |tSJW = (DSJW + 1) x tq. + * |[7:4] |DTSEG2 |Data time segment after sample point + * | | |Valid values are 0 to 15 + * | | |The actual interpretation by the hardware of this value is such that one more than the programmed value is used + * | | |tBS2 = (DTSEG2 + 1) x tq. + * |[12:8] |DTSEG1 |Data time segment before sample point + * | | |Valid values are 0 to 31 + * | | |The actual interpretation by the hardware of this value is such that one more than the programmed value is used + * | | |tBS1 = (DTSEG1 + 1) x tq. + * |[20:16] |DBRP |Data Bit Rate Prescaler + * | | |The value by which the oscillator frequency is divided for generating the bit time quanta + * | | |The bit time is built up from a multiple of this quanta + * | | |Valid values for the Bit Rate Prescaler are 0 to 31 + * | | |When TDC = '1', the range is limited to 0,1 + * | | |The actual interpretation by the hardware of this value is such that one more than the value programmed here is used. + * |[23] |TDC |Transmitter Delay Compensation + * | | |0 =Transmitter Delay Compensation Disabled. + * | | |1 =Transmitter Delay Compensation Enabled. + * @var CANFD_T::TEST + * Offset: 0x10 Test Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4] |LBCK |Loop Back Mode + * | | |0 = Reset value, Loop Back Mode Disabled. + * | | |1 = Loop Back Mode Enabled (refer to section 6.33.5.1 TEST Mode). + * |[6:5] |TX |Control of Transmit Pin + * | | |00 = Reset value, CANx_TXD controlled by the CAN Core, updated at the end of the CAN bit time. + * | | |01 = Sample Point can be monitored at pin CANx_TXD. + * | | |10 = Dominant ('0') level at pin CANx_TXD. + * | | |11 = Recessive ('1') level at pin CANx_TXD. + * |[7] |RX |Receive Pin + * | | |Monitors the actual value of pin CANx_RXD + * | | |0 = The CAN bus is dominant (CANx_RXD = 0). + * | | |1 = The CAN bus is recessive (CANx_RXD = 1). + * @var CANFD_T::RWD + * Offset: 0x14 RAM Watchdog + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |WDC |Watchdog Configuration + * | | |Start value of the Message RAM Watchdog Counter. With the reset value of 00 the counter is disabled. + * |[15:8] |WDV |Watchdog Value + * | | |Actual Message RAM Watchdog Counter Value. + * @var CANFD_T::CCCR + * Offset: 0x18 CC Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |INIT |Initialization + * | | |0 = Normal Operation. + * | | |1 = Initialization is started. + * | | |Note: Due to the synchronization mechanism between the two clock domains, there may be a delay until the value written to INIT can be read back + * | | |Therefore the programmer has to assure that the previous value written to INIT has been accepted by reading INIT before setting INIT to a new value. + * |[1] |CCE |Configuration Change Enable + * | | |0 = The CPU has no write access to the protected configuration registers. + * | | |1 = The CPU has write access to the protected configuration registers (while CANFD_INIT (CANFD_CCCR[0]) = 1). + * |[2] |ASM |Restricted Operation Mode + * | | |Bit ASM can only be set by the Host when both CCE and INIT are set to 1 + * | | |The bit can be reset by the software at any time + * | | |This bit will be set automatically set to 1 when the Tx handler was not able to read data from the message RAM in time + * | | |For a description of the Restricted Operation Mode refer to Restricted Operation Mode. + * | | |0 = Normal CAN operation. + * | | |1 = Restricted Operation Mode active. + * |[3] |CSA |Clock Stop Acknowledge + * | | |0 = No clock stop acknowledged. + * | | |1 = The Controller may be set in power down by stopping AHB clock and CAN Core clock. + * |[4] |CSR |Clock Stop Request + * | | |0 = No clock stop is requested. + * | | |1 = Clock stop requested + * | | |When clock stop is requested, first INIT and then CSA will be set after all pending transfer requests have been completed and the CAN bus reached idle. + * |[5] |MON |Bus Monitoring Mode + * | | |Bit MON can only be set by the Host when both CCE and INIT are set to 1 + * | | |The bit can be reset by the Host at any time. + * | | |0 = Bus Monitoring Mode Disabled. + * | | |1 = Bus Monitoring Mode Enabled. + * |[6] |DAR |Disable Automatic Retransmission + * | | |0 = Automatic retransmission of messages not transmitted successfully Enabled. + * | | |1 = Automatic retransmission Disabled. + * |[7] |TEST |Test Mode Enable + * | | |0 = Normal operation, register TEST holds reset values. + * | | |1 = Test Mode, write access to register TEST enabled. + * |[8] |FDOE |FD Operation Enable + * | | |0 = FD operation Disabled. + * | | |1 = FD operation Enabled. + * |[9] |BRSE |Bit Rate Switch Enable + * | | |0 = Bit rate switching for transmissions Disabled. + * | | |1 = Bit rate switching for transmissions Enabled. + * | | |Note: When CAN FD operation is disabled FDOE = 0, BRSE is not evaluated. + * |[12] |PXHD |Protocol Exception Handling Disable + * | | |0 = Protocol exception handling Enabled. + * | | |1 = Protocol exception handling Disabled. + * | | |Note: When protocol exception handling is disabled, the controller will transmit an error frame when it detects a protocol exception condition. + * |[13] |EFBI |Edge Filtering during Bus Integration + * | | |0 = Edge filtering Disabled. + * | | |1 = Two consecutive dominant tq required to detect an edge f or hard synchronization. + * |[14] |TXP |Transmit Pause + * | | |If this bit is set, the CAN FD controller pauses for two CAN bit times before starting the next transmission after itself has successfully transmitted a frame (refer to section 6.33.5.5). + * | | |0 = Transmit pause Disabled. + * | | |1 = Transmit pause Enabled. + * |[15] |NISO |Non ISO Operation + * | | |If this bit is set, the CAN FD controller uses the CAN FD frame format as specified by the Bosch CAN FD Specification V1.0. + * | | |0 = CAN FD frame format according to ISO 11898-1:2015. + * | | |1 = CAN FD frame format according to Bosch CAN FD Specification V1.0. + * @var CANFD_T::NBTP + * Offset: 0x1C Nominal Bit Timing & Prescaler Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |NTSEG2 |Nominal Time Segment after Sample Point + * | | |0x01-0x7F Valid values are 1 to 127 + * | | |The actual interpretation by the hardware of this value is such that one more than the programmed value is used + * | | |tBS2 = (NTSEG2 + 1) x tq. + * | | |Note: With a CAN Core clock (cclk) of 8 MHz, the reset value of 0x06000A03 configures the controller for a bit rate of 500 kBit/s. + * |[15:8] |NTSEG1 |Nominal Time Segment before Sample Point + * | | |Valid values are 1 to 255 + * | | |The actual interpretation by the hardware of this value is such that one more than the programmed value is used + * | | |tBS1 = (NTSEG1 + 1) x tq. + * |[24:16] |NBRP |Nominal Bit Rate Prescaler + * | | |The value by which the oscillator frequency is divided for generating the bit time quanta + * | | |The bit time is built up from a multiple of this quanta + * | | |Valid values for the Bit Rate Prescaler are 0 to 511 + * | | |The actual interpretation by the hardware of this value is such that one more than the value programmed here is used + * |[31:25] |NSJW |Nominal Re-Synchronization Jump Width + * | | |Valid values are 0 to 127, which should be smaller than NTSEG2 + * | | |The actual interpretation by the hardware of this value is such that one more than the value programmed here is used + * | | |tSJW = (NSJW + 1) x tq. + * @var CANFD_T::TSCC + * Offset: 0x20 Timestamp Counter Configuration + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |TSS |Timestamp Select + * | | |00 = Timestamp counter value always 0x0000. + * | | |01 = Timestamp counter value incremented according to TCP. + * | | |10 = Reserved. + * | | |11 = Same as '00'. + * |[19:16] |TCP |Timestamp Counter Prescaler + * | | |Configures the timestamp and timeout counters time unit in multiples of CAN bit times [ 1u202616 ] + * | | |The actual interpretation by the hardware of this value is such that one more than the value programmed here is used. + * @var CANFD_T::TSCV + * Offset: 0x24 Timestamp Counter Value + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |TSC |Timestamp Counter + * | | |The internal Timestamp Counter value is captured on start of frame (both Rx and Tx) + * | | |When CANFD_TSS (TSCC[[1:0]) = 2'b01, the Timestamp Counter is incremented in multiples of CAN bit times [ 1...16 ] depending on the configuration of CANFD_TCP (CANFD_TSCC[19:16]) + * | | |A wrap around sets interrupt flag CANFD_IR (CANFD_IR[16]) + * | | |Write access resets the counter to 0. + * | | |Note: A "around" is a change of the Timestamp Counter value from non-zero to 0 not caused by write access to CANFD_TSCV. + * @var CANFD_T::TOCC + * Offset: 0x28 Timeout Counter Configuration + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ETOC |Enable Timeout Counter + * | | |0 = Timeout Counter Disabled. + * | | |1 = Timeout Counter Enabled. + * | | |Note: For use of timeout function with CAN FD refer to section 6.33.5.3. + * |[2:1] |TOS |Timeout Select + * | | |When operating in Continuous mode, a write to CANFD_TOCV presets the counter to the value configured by CANFD_TOP (TOCC[31:16]) and continues down-counting + * | | |When the Timeout Counter is controlled by one of the FIFOs, an empty FIFO presets the counter to the value configured by CANFD_TOP (TOCC[31:16]) + * | | |Down-counting is started when the first FIFO element is stored. + * | | |00 = Continuous operation. + * | | |01 = Timeout controlled by Tx Event FIFO. + * | | |10 = Timeout controlled by Rx FIFO 0. + * | | |11 = Timeout controlled by Rx FIFO 1. + * |[31:16] |TOP |Timeout Period + * | | |Start value of the Timeout Counter (down-counter). Configures the Timeout Period. + * @var CANFD_T::TOCV + * Offset: 0x2C Timeout Counter Value + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |TOC |Timeout Counter + * | | |The filed is decremented in multiples of CAN bit times [ 1...16 ] depending on the configuration of TCP (CANFD_TSCC[19:16]) + * | | |When decremented to 0, interrupt flag TOO (CANFD_IR[18]) is set and the timeout counter is stopped + * | | |Start and reset/restart conditions are configured via TOS (CANFD_TOCC[1:0]). + * @var CANFD_T::ECR + * Offset: 0x40 Error Counter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |TEC |Transmit Error Counter + * | | |Actual state of the Transmit Error Counter, values between 0 and 255. + * | | |Note: When ASM (CANFD_CCCR[2]) is set, the CAN protocol controller does not increment TEC and REC when a CAN protocol error is detected, but CEL is still incremented. + * |[14:8] |REC |Receive Error Counter + * | | |Actual state of the Receive Error Counter, values between 0 and 127. + * |[15] |RP |Receive Error Passive + * | | |0 = The Receive Error Counter is below the error passive level of 128. + * | | |1 = The Receive Error Counter has reached the error passive level of 128. + * |[23:16] |CEL |CAN Error Logging + * | | |The counter is incremented each time when a CAN protocol error causes the 8-bit Transmit Error Counter TEC or the 7-bit Receive Error Counter REC to be incremented + * | | |The counter is also incremented when the Bus_Off limit is reached + * | | |It is not incremented when only RP is set without changing REC + * | | |The increment of CEL follows after the increment of REC or TEC. + * | | |The counter is reset by read access to CEL + * | | |The counter stops at 0xFF; the next increment of TEC or REC sets interrupt flag ELO (CANFD_IR[22]). + * @var CANFD_T::PSR + * Offset: 0x44 Protocol Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |LEC |Last Error Code + * | | |The LEC indicates the type of the last error to occur on the CAN bus + * | | |This field will be cleared to 0 when a message has been transferred (reception or transmission) without error. + * | | |000 = No Error: No error occurred since LEC has been reset by successful reception or transmission. + * | | |001 = Stuff Error: More than 5 equal bits in a sequence have occurred in a part of a received message where this is not allowed. + * | | |010 = Form Error: A fixed format part of a received frame has the wrong format. + * | | |011 = AckError: The message transmitted by the CANFD CONTROLLER was not acknowledged by another node. + * | | |100 = Bit1Error: During the transmission of a message (with the exception of the arbitration field), the device wanted to send a recessive level (bit of logical value 1), but the monitored bus value was dominant. + * | | |101 = Bit0Error : During the transmission of a message (or acknowledge bit, or active error flag, or overload flag), the device wanted to send a dominant level (data or identifier bit logical value 0), but the monitored bus value was recessive + * | | |During Bus_Off recovery this status is set each time a sequence of 11 recessive bits has been monitored + * | | |This enables the CPU to monitor the proceeding of the Bus_Off recovery sequence (indicating the bus is not stuck at dominant or continuously disturbed). + * | | |110 = CRCError: The CRC check sum of a received message was incorrect + * | | |The CRC of an incoming message does not match with the CRC calculated from the received data. + * | | |111 = NoChange: Any read access to the Protocol Status Register re-initializes the LEC to 7.When the LEC shows the value 7, no CAN bus event was detected since the last CPU read access to the Protocol Status Register. + * |[4:3] |ACT |Activity + * | | |Monitors the module's CAN communication state. + * | | |00 = Synchronizing - node is synchronizing on CAN communication. + * | | |01 = Idle - node is neither receiver nor transmitter. + * | | |10 = Receiver - node is operating as receiver. + * | | |11 = Transmitter - node is operating as transmitter. + * |[5] |EP |Error Passive + * | | |0 = The CAN FD controller is in the Error_Active state + * | | |It normally takes part in bus communication and sends an active error flag when an error has been detected. + * | | |1 = The CAN FD controller is in the Error_Passive state. + * |[6] |EW |Warning Status + * | | |0 = Both error counters are below the Error_Warning limit of 96. + * | | |1 = At least one of error counter has reached the Error_Warning limit of 96. + * |[7] |BO |Bus_Off Status + * | | |0 = The CAN FD controller is not Bus_Off. + * | | |1 = The CAN FD controller is in Bus_Off state. + * |[10:8] |DLEC |Data Phase Last Error Code + * | | |Type of last error that occurred in the data phase of a CAN FD format frame with its BRS flag set + * | | |Coding is the same as for LEC + * | | |This field will be cleared to 0 when a CAN FD format frame with its BRS flag set has been transferred (reception or transmission) without error. + * |[11] |RESI |ESI flag of last received CAN FD Message + * | | |This bit is set together with RFDF, independent of acceptance filtering. + * | | |0 = Last received CAN FD message did not have its ESI flag set. + * | | |1 = Last received CAN FD message had its ESI flag set. + * |[12] |RBRS |BRS flag of last received CAN FD Message + * | | |This bit is set together with RFDF, independent of acceptance filtering. + * | | |0 = Last received CAN FD message did not have its BRS flag set. + * | | |1 = Last received CAN FD message had its BRS flag set. + * | | |Note: Byte access: Reading byte 0 will reset RBRS, reading bytes 3/2/1 has no impact. + * |[13] |RFDF |Received a CAN FD Message + * | | |This bit is set independent of acceptance filtering. + * | | |0 = Since this bit was reset by the CPU, no CAN FD message has been received. + * | | |1 = Message in CAN FD format with FDF flag set has been received. + * | | |Note: Byte access: Reading byte 0 will reset RFDF, reading bytes 3/2/1 has no impact. + * |[14] |PXE |Protocol Exception Event + * | | |0 = No protocol exception event occurred since last read access. + * | | |1 = Protocol exception event occurred. + * |[22:16] |TDCV |Transmitter Delay Compensation Value + * | | |Position of the secondary sample point, defined by the sum of the measured delay from CANx_TXD to CANx_RXD and TDCO (TDCR[[14:8]) + * | | |The SSP position is, in the data phase, the number of minimum time quata (mtq) between the start of the transmitted bit and the secondary sample point + * | | |Valid values are 0 to 127 mtq. + * @var CANFD_T::TDCR + * Offset: 0x48 Transmitter Delay Compensation Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |TDCF |Transmitter Delay Compensation Filter Window Length + * | | |Defines the minimum value for the SSP position, dominant edges on CANx_RXD that would result in an earlier SSP position are ignored for transmitter delay measurement + * | | |The feature is enabled when TDCF is configured to a value greater than TDCO + * | | |Valid values are 0 to 127 mtq. + * |[14:8] |TDCO |Transmitter Delay Compensation SSP Offset + * | | |Offset value defining the distance between the measured delay from CANx_TXD to CANx_RXD and the secondary sample point + * | | |Valid values are 0 to 127 mtq. + * @var CANFD_T::IR + * Offset: 0x50 Interrupt Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RF0N |Rx FIFO 0 New Message + * | | |0 = No new message written to Rx FIFO 0. + * | | |1 = New message written to Rx FIFO 0. + * |[1] |RF0W |Rx FIFO 0 Watermark Reached + * | | |0 = Rx FIFO 0 fill level below watermark. + * | | |1 = Rx FIFO 0 fill level reached watermark. + * |[2] |RF0F |Rx FIFO 0 Full + * | | |0 = Rx FIFO 0 not full. + * | | |1 = Rx FIFO 0 full. + * |[3] |RF0L |Rx FIFO 0 Message Lost + * | | |0 = No Rx FIFO 0 message lost. + * | | |1 = Rx FIFO 0 message lost, also set after write attempt to Rx FIFO 0 of size zero. + * |[4] |RF1N |Rx FIFO 1 New Message + * | | |0 = No new message written to Rx FIFO 1. + * | | |1 = New message written to Rx FIFO 1. + * |[5] |RF1W |Rx FIFO 1 Watermark Reached + * | | |0 = Rx FIFO 1 fill level below watermark. + * | | |1 = Rx FIFO 1 fill level reached watermark. + * |[6] |RF1F |Rx FIFO 1 Full + * | | |0 = Rx FIFO 1 not full. + * | | |1 = Rx FIFO 1 full. + * |[7] |RF1L |Rx FIFO 1 Message Lost + * | | |0 = No Rx FIFO 1 message lost. + * | | |1 = Rx FIFO 1 message lost, also set after write attempt to Rx FIFO 1 of size zero. + * |[8] |HPM |High Priority Message + * | | |0 = No high priority message received. + * | | |1 = High priority message received. + * |[9] |TC |Transmission Completed + * | | |0 = No transmission completed. + * | | |1 = Transmission completed. + * |[10] |TCF |Transmission Cancellation Finished + * | | |0 = No transmission cancellation finished. + * | | |1 = Transmission cancellation finished. + * |[11] |TFE |Tx FIFO Empty + * | | |0 = Tx FIFO non-empty. + * | | |1 = Tx FIFO empty. + * |[12] |TEFN |Tx Event FIFO New Entry + * | | |0 = Tx Event FIFO unchanged. + * | | |1 = Tx Handler wrote Tx Event FIFO element. + * |[13] |TEFW |Tx Event FIFO Watermark Reached + * | | |0 = Tx Event FIFO fill level below watermark. + * | | |1 = Tx Event FIFO fill level reached watermark. + * |[14] |TEFF |Tx Event FIFO Full + * | | |0 = Tx Event FIFO not full. + * | | |1 = Tx Event FIFO full. + * |[15] |TEFL |Tx Event FIFO Element Lost + * | | |0 = No Tx Event FIFO element lost. + * | | |1 = Tx Event FIFO element lost, also set after write attempt to Tx Event FIFO of size zero. + * |[16] |TSW |Timestamp Wraparound + * | | |0 = No timestamp counter wrap-around. + * | | |1 = Timestamp counter wrapped around. + * |[17] |MRAF |Message RAM Access Failure + * | | |The flag is set, when the Rx Handler + * | | |Has not completed acceptance filtering or storage of an accepted message until the arbitration field of the following message has been received + * | | |In this case acceptance filtering or message storage is aborted and the Rx Handler starts processing of the following message. + * | | |Was not able to write a message to the Message RAM. In this case message storage is aborted. + * | | |In both cases the FIFO put index is not updated resp + * | | |The New Data flag for a dedicated Rx Buffer is not set, a partly stored message is overwritten when the next message is stored to this location. + * | | |The flag is also set when the Tx Handler was not able to read a message from the Message RAM in time + * | | |In this case message transmission is aborted + * | | |In case of a Tx Handler access failure the CAN FD controller is switched into Restricted Operation Mode (refer to Restricted Operation Mode) + * | | |To leave Restricted Operation Mode, the Host CPU has to reset CANFD_ASM (CANFD_CCCR[2]). + * | | |0 = No Message RAM access failure occurred. + * | | |1 = Message RAM access failure occurred. + * |[18] |TOO |Timeout Occurred + * | | |0 = No timeout. + * | | |1 = Timeout reached. + * |[19] |DRX |Message stored to Dedicated Rx Buffer + * | | |The flag is set whenever a received message has been stored into a dedicated Rx Buffer. + * | | |0 = No Rx Buffer updated. + * | | |1 = At least one received message stored into an Rx Buffer. + * |[22] |ELO |Error Logging Overflow + * | | |0 = CAN Error Logging Counter did not overflow. + * | | |1 = Overflow of CAN Error Logging Counter occurred. + * |[23] |EP |Error Passive + * | | |0 = Error_Passive status unchanged. + * | | |1 = Error_Passive status changed. + * |[24] |EW |Warning Status + * | | |0 = Error_Warning status unchanged. + * | | |1 = Error_Warning status changed. + * |[25] |BO |Bus_Off Status + * | | |0 = Bus_Off status unchanged. + * | | |1 = Bus_Off status changed. + * |[26] |WDI |Watchdog Interrupt + * | | |0 = No Message RAM Watchdog event occurred. + * | | |1 = Message RAM Watchdog event due to missing READY. + * |[27] |PEA |Protocol Error in Arbitration Phase + * | | |0 = No protocol error in arbitration phase. + * | | |1 = Protocol error in arbitration phase detected (CANFD_LEC (CANFD_PSR[2:0]) no equal 0 or 7). + * | | |Note: Nominal bit time is used. + * |[28] |PED |Protocol Error in Data Phase + * | | |0 = No protocol error in data phase. + * | | |1 = Protocol error in data phase detected (DLEC (CANFD_PSR[10:8]) no equal 0 or 7). + * | | |Note: Data bit time is used. + * |[29] |ARA |Access to Reserved Address + * | | |0 = No access to reserved address occurred. + * | | |1 = Access to reserved address occurred. + * @var CANFD_T::IE + * Offset: 0x54 Interrupt Enable + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RF0NE |Rx FIFO 0 New Message Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[1] |RF0WE |Rx FIFO 0 Watermark Reached Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[2] |RF0FE |Rx FIFO 0 Full Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[3] |RF0LE |Rx FIFO 0 Message Lost Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[4] |RF1NE |Rx FIFO 1 New Message Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[5] |RF1WE |Rx FIFO 1 Watermark Reached Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[6] |RF1FE |Rx FIFO 1 Full Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[7] |RF1LE |Rx FIFO 1 Message Lost Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[8] |HPME |High Priority Message Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[9] |TCE |Transmission Completed Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[10] |TCFE |Transmission Cancellation Finished Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[11] |TFEE |Tx FIFO Empty Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[12] |TEFNE |Tx Event FIFO New Entry Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[13] |TEFWE |Tx Event FIFO Watermark Reached Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[14] |TEFFE |Tx Event FIFO Full Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[15] |TEFLE |Tx Event FIFO Event Lost Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[16] |TSWE |Timestamp Wraparound Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[17] |MRAFE |Message RAM Access Failure Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[18] |TOOE |Timeout Occurred Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[19] |DRXE |Message stored to Dedicated Rx Buffer Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[20] |BECE |Bit Error Corrected Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[21] |BEUE |Bit Error Uncorrected Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[22] |ELOE |Error Logging Overflow Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[23] |EPE |Error Passive Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[24] |EWE |Warning Status Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[25] |BOE |Bus_Off Status Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[26] |WDIE |Watchdog Interrupt Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[27] |PEAE |Protocol Error in Arbitration Phase Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[28] |PEDE |Protocol Error in Data Phase Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * |[29] |ARAE |Access to Reserved Address Enable + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * @var CANFD_T::ILS + * Offset: 0x58 Interrupt Line Select + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RF0NL |Rx FIFO 0 New Message Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[1] |RF0WL |Rx FIFO 0 Watermark Reached Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[2] |RF0FL |Rx FIFO 0 Full Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[3] |RF0LL |Rx FIFO 0 Message Lost Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[4] |RF1NL |Rx FIFO 1 New Message Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[5] |RF1WL |Rx FIFO 1 Watermark Reached Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[6] |RF1FL |Rx FIFO 1 Full Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[7] |RF1LL |Rx FIFO 1 Message Lost Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[8] |HPML |High Priority Message Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[9] |TCL |Transmission Completed Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[10] |TCFL |Transmission Cancellation Finished Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[11] |TFEL |Tx FIFO Empty Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[12] |TEFNL |Tx Event FIFO New Entry Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[13] |TEFWL |Tx Event FIFO Watermark Reached Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[14] |TEFFL |Tx Event FIFO Full Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[15] |TEFLL |Tx Event FIFO Event Lost Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[16] |TSWL |Timestamp Wraparound Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[17] |MRAFL |Message RAM Access Failure Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[18] |TOOL |Timeout Occurred Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[19] |DRXL |Message stored to Dedicated Rx Buffer Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[22] |ELOL |Error Logging Overflow Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[23] |EPL |Error Passive Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[24] |EWL |Warning Status Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[25] |BOL |Bus_Off Status Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[26] |WDIL |Watchdog Interrupt Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[27] |PEAL |Protocol Error in Arbitration Phase Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[28] |PEDL |Protocol Error in Data Phase Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * |[29] |ARAL |Access to Reserved Address Line + * | | |0 = Interrupt assigned to CAN interrupt line 0. + * | | |1 = Interrupt assigned to CAN interrupt line 1. + * @var CANFD_T::ILE + * Offset: 0x5C Interrupt Line Enable + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ENT0 |Enable Interrupt Line 0 + * | | |0 = Interrupt line canfd_int0 Disabled. + * | | |1 = Interrupt line canfd_int0 Enabled. + * |[1] |ENT1 |Enable Interrupt Line 1 + * | | |0 = Interrupt line canfd_int1 Disabled. + * | | |1 = Interrupt line canfd_int1 Enabled. + * @var CANFD_T::GFC + * Offset: 0x80 Global Filter Configuration + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RRFE |Reject Remote Frames Extended + * | | |0 = Filter remote frames with 29-bit extended IDs. + * | | |1 = Reject all remote frames with 29-bit extended IDs. + * |[1] |RRFS |Reject Remote Frames Standard + * | | |0 = Filter remote frames with 11-bit standard IDs. + * | | |1 = Reject all remote frames with 11-bit standard IDs. + * |[3:2] |ANFE |Accept Non-matching Frames Extended + * | | |Defines how received messages with 29-bit IDs that do not match any element of the filter list are treated. + * | | |00 = Accept in Rx FIFO 0. + * | | |01 = Accept in Rx FIFO 1. + * | | |10 = Reject. + * | | |11 = Reject. + * |[5:4] |ANFS |Accept Non-matching Frames Standard + * | | |Defines how received messages with 11-bit IDs that do not match any element of the filter list are treated. + * | | |00 = Accept in Rx FIFO 0. + * | | |01 = Accept in Rx FIFO 1. + * | | |10 = Reject. + * | | |11 = Reject. + * @var CANFD_T::SIDFC + * Offset: 0x84 Standard ID Filter Configuration + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:2] |FLSSA |Filter List Standard Start Address + * | | |Start address of standard Message ID filter list (32-bit word address, refer to Figure 6.33-11). + * |[23:16] |LSS |List Size Standard + * | | |0 = No standard Message ID filter. + * | | |1-128 = Number of standard Message ID filter elements. + * | | |>128 = Values greater than 128 are interpreted as 128. + * @var CANFD_T::XIDFC + * Offset: 0x88 Extended ID Filter Configuration + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:2] |FLESA |Filter List Extended Start Address + * | | |Start address of extended Message ID filter list (32-bit word address, refer to Figure 6.33-11). + * |[22:16] |LSE |List Size Extended + * | | |0 = No extended Message ID filter. + * | | |1-64 = Number of extended Message ID filter elements. + * | | |>64 = Values greater than 64 are interpreted as 64. + * @var CANFD_T::XIDAM + * Offset: 0x90 Extended ID AND Mask + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[28:0] |EIDM |Extended ID Mask + * | | |For acceptance filtering of extended frames the Extended ID AND Mask is ANDed with the Message ID of a received frame + * | | |Intended for masking of 29-bit IDs in SAE J1939 + * | | |With the reset value of all bits set to one the mask is not active. + * @var CANFD_T::HPMS + * Offset: 0x94 High Priority Message Status + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |BIDX |Buffer Index + * | | |Index of Rx FIFO element to which the message was stored. Only valid when MSI[1] = 1. + * |[7:6] |MSI |Message Storage Indicator + * | | |00 = No FIFO selected. + * | | |01 = FIFO message lost. + * | | |10 = Message stored in FIFO 0. + * | | |11 = Message stored in FIFO 1. + * |[14:8] |FIDX |Filter Index + * | | |Index of matching filter element. Range is 0 to CANFD_SIDFC.LSS - 1 or CANFD_XIDFC.LSE - 1 + * |[15] |FLST |Filter List + * | | |Indicates the filter list of the matching filter element. + * | | |0 = Standard Filter List. + * | | |1 = Extended Filter List. + * @var CANFD_T::NDAT1 + * Offset: 0x98 New Data 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NDn |New Data + * | | |The register holds the New Data flags of Rx Buffers 0 to 31 + * | | |The flags are set when the respective Rx Buffer has been updated from a received frame + * | | |The flags remain set until the Host clears them + * | | |A flag is cleared by writing a 1 to the corresponding bit position + * | | |Writing a 0 has no effect + * | | |A hard reset will clear the register. + * | | |0 = Rx Buffer not updated. + * | | |1 = Rx Buffer updated from new message. + * @var CANFD_T::NDAT2 + * Offset: 0x9C New Data 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NDn |New Data + * | | |The register holds the New Data flags of Rx Buffers 32 to 63 + * | | |The flags are set when the respective Rx Buffer has been updated from a received frame + * | | |The flags remain set until the Host clears them + * | | |A flag is cleared by writing a 1 to the corresponding bit position + * | | |Writing a 0 has no effect + * | | |A hard reset will clear the register. + * | | |0 = Rx Buffer not updated. + * | | |1 = Rx Buffer updated from new message. + * @var CANFD_T::RXF0C + * Offset: 0xA0 Rx FIFO 0 Configuration + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:2] |F0SA |Rx FIFO 0 Start Address + * | | |Start address of Rx FIFO 0 in Message RAM (32-bit word address). + * |[22:16] |F0S |Rx FIFO 0 Size + * | | |0 = No Rx FIFO 0. + * | | |1-64 = Number of Rx FIFO 0 elements. + * | | |>64 = Values greater than 64 are interpreted as 64. + * | | |The Rx FIFO 0 elements are indexed from 0 to F0S-1 + * |[30:24] |F0WM |Rx FIFO 0 Watermark + * | | |0 = Watermark interrupt Disabled. + * | | |1-64 = Level for Rx FIFO 0 watermark interrupt (CANFD_IR.RF0W). + * | | |>64 = Watermark interrupt Disabled. + * |[31] |F0OM |FIFO 0 Operation Mode + * | | |FIFO 0 can be operated in blocking or in overwrite mode (refer to Rx FIFOs). + * | | |0 = FIFO 0 blocking mode. + * | | |1 = FIFO 0 overwrite mode. + * @var CANFD_T::RXF0S + * Offset: 0xA4 Rx FIFO 0 Status + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |F0FL |Rx FIFO 0 Fill Level + * | | |Number of elements stored in Rx FIFO 0, range 0 to 64 + * |[13:8] |F0GI |Rx FIFO 0 Get Index + * | | |Rx FIFO 0 read index pointer, range 0 to 63. + * |[21:16] |F0PI |Rx FIFO 0 Put Index + * | | |Rx FIFO 0 write index pointer, range 0 to 63. + * |[24] |F0F |Rx FIFO 0 Full + * | | |0 = Rx FIFO 0 not full. + * | | |1 = Rx FIFO 0 full. + * |[25] |RF0L |Rx FIFO 0 Message Lost + * | | |This bit is a copy of interrupt flag CANFD_IR.RF0L + * | | |When CANFD_IR.RF0L is reset, this bit is also reset + * | | |0 = No Rx FIFO 0 message lost. + * | | |1 = Rx FIFO 0 message lost, also set after write attempt to Rx FIFO 0 of size zero. + * | | |Note: Overwriting the oldest message when F0OM (CANFD_RXF0C[31]) = 1 will not set this flag. + * @var CANFD_T::RXF0A + * Offset: 0xA8 Rx FIFO 0 Acknowledge + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |F0A |Rx FIFO 0 Acknowledge Index + * | | |After the Host has read a message or a sequence of messages from Rx FIFO 0 it has to write the buffer index of the last element read from Rx FIFO 0 to F0AI + * | | |This will set the Rx FIFO 0 Get Index F0GI (CANFD_RXF0S[13:8]) to F0AI (CANFD_RXF0A[5:0]) + 1 and update the FIFO 0 Fill Level CANFD_RXF0S.F0FL. + * @var CANFD_T::RXBC + * Offset: 0xAC Rx Buffer Configuration + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:2] |RBSA |Rx Buffer Start Address + * | | |Configures the start address of the Rx Buffers section in the Message RAM (32-bit word address). + * @var CANFD_T::RXF1C + * Offset: 0xB0 Rx FIFO 1 Configuration + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:2] |F1SA |Rx FIFO 1 Start Address + * | | |Start address of Rx FIFO 1 in Message RAM (32-bit word address, refer to Figure 6.33-11). + * |[22:16] |F1S |Rx FIFO 1 Size + * | | |0 = No Rx FIFO 1. + * | | |1-64 = Number of Rx FIFO 1 elements. + * | | |>64 = Values greater than 64 are interpreted as 64. + * | | |The Rx FIFO 1 elements are indexed from 0 to F1S - 1 + * |[30:24] |F1WM |Rx FIFO 1 Watermark + * | | |0 = Watermark interrupt Disabled. + * | | |1-64 = Level for Rx FIFO 1 watermark interrupt (CANFD_IR.RF1W). + * | | |>64 = Watermark interrupt Disabled. + * |[31] |F1OM |FIFO 1 Operation Mode + * | | |FIFO 1 can be operated in blocking or in overwrite mode (refer to Rx FIFOs). + * | | |0 = FIFO 1 blocking mode. + * | | |1 = FIFO 1 overwrite mode. + * @var CANFD_T::RXF1S + * Offset: 0xB4 Rx FIFO 1 Status + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |F1FL |Rx FIFO 1 Fill Level + * | | |Number of elements stored in Rx FIFO 1, range 0 to 64 + * |[13:8] |F1G |Rx FIFO 1 Get Index + * | | |Rx FIFO 1 read index pointer, range 0 to 63. + * |[21:16] |F1P |Rx FIFO 1 Fill Level + * | | |Number of elements stored in Rx FIFO 1, range 0 to 64. + * |[24] |F1F |Rx FIFO 1 Full + * | | |0 = Rx FIFO 1 not full. + * | | |1 = Rx FIFO 1 full. + * |[25] |RF1L |Rx FIFO 1 Message Lost + * | | |This bit is a copy of interrupt flag CANFD_IR.RF1L + * | | |When CANFD_IR.RF1L is reset, this bit is also reset + * | | |0 = No Rx FIFO 1 message lost. + * | | |1 = Rx FIFO 1 message lost, also set after write attempt to Rx FIFO 1 of size zero. + * | | |Note: Overwriting the oldest message when F1OM (CANFD_RXF1C[31]) = 1 will not set this flag. + * @var CANFD_T::RXF1A + * Offset: 0xB8 Rx FIFO 1 Acknowledge + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |F1A |Rx FIFO 1 Acknowledge Index + * | | |After the Host has read a message or a sequence of messages from Rx FIFO 1 it has to write the buffer index of the last element read from Rx FIFO 1 to F1AI + * | | |This will set the Rx FIFO 1 Get Index F1GI (CANFD_RXF1S[13:8]) to F1AI (CANFD_RXF1A[5:0]) + 1 and update the FIFO 1 Fill Level F1FL (CANFD_RXF1S[6:0]). + * @var CANFD_T::RXESC + * Offset: 0xBC Rx Buffer / FIFO Element Size Configuration + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |F0DS |Rx FIFO 0 Data Field Size + * | | |000 = 8 byte data field. + * | | |001 = 12 byte data field. + * | | |010 = 16 byte data field. + * | | |011 = 20 byte data field. + * | | |100 = 24 byte data field. + * | | |101 = 32 byte data field. + * | | |110 = 48 byte data field. + * | | |111 = 64 byte data field. + * | | |Note: In case the data field size of an accepted CAN frame exceeds the data field size configured for the matching Rx Buffer or Rx FIFO, only the number of bytes as configured by CANFD_RXESC are stored to the Rx Buffer resp + * | | |Rx FIFO element + * | | |The rest of the frame data field is ignored. + * |[6:4] |F1DS |Rx FIFO 1 Data Field Size + * | | |000 = 8 byte data field. + * | | |001 = 12 byte data field. + * | | |010 = 16 byte data field. + * | | |011 = 20 byte data field. + * | | |100 = 24 byte data field. + * | | |101 = 32 byte data field. + * | | |110 = 48 byte data field. + * | | |111 = 64 byte data field. + * |[10:8] |RBDS |Rx Buffer Data Field Size + * | | |000 = 8 byte data field. + * | | |001 = 12 byte data field. + * | | |010 = 16 byte data field. + * | | |011 = 20 byte data field. + * | | |100 = 24 byte data field. + * | | |101 = 32 byte data field. + * | | |110 = 48 byte data field. + * | | |111 = 64 byte data field. + * @var CANFD_T::TXBC + * Offset: 0xC0 Tx Buffer Configuration + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:2] |TBSA |Tx Buffers Start Address + * | | |Start address of Tx Buffers section in Message RAM (32-bit word address, refer to Figure 6.33-11). + * | | |Note: The sum of TFQS and NDTB may be not greater than 32 + * | | |There is no check for erroneous configurations + * | | |The Tx Buffers section in the Message RAM starts with the dedicated Tx Buffers. + * |[21:16] |NDTB |Number of Dedicated Transmit Buffers + * | | |0 = No Dedicated Tx Buffers. + * | | |1-32 = Number of Dedicated Tx Buffers. + * | | |>32 = Values greater than 32 are interpreted as 32. + * |[29:24] |TFQS |Transmit FIFO/Queue Size + * | | |0 = No Tx FIFO/Queue. + * | | |1-32 = Number of Tx Buffers used for Tx FIFO/Queue. + * | | |>32 = Values greater than 32 are interpreted as 32. + * |[30] |TFQM |Tx FIFO/Queue Mode + * | | |0 = Tx FIFO operation. + * | | |1 = Tx Queue operation. + * @var CANFD_T::TXFQS + * Offset: 0xC4 Tx FIFO/Queue Status + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |TFFL |Tx FIFO Free Level + * | | |Number of consecutive free Tx FIFO elements starting from TFGI, range 0 to 32 + * | | |Read as 0 when Tx Queue operation is configured (TFQM (CANFD_TXBC[3]) = 1). + * | | |Note: In case of mixed configurations where dedicated Tx Buffers are combined with a Tx FIFO or a Tx Queue, the Put and Get Indices indicate the number of the Tx Buffer starting with the first dedicated Tx Buffers. + * | | |Example: For a configuration of 12 dedicated Tx Buffers and a Tx FIFO of 20 Buffers a Put Index of 15 points to the fourth buffer of the Tx FIFO. + * |[12:8] |TFG |Tx FIFO Get Index + * | | |Tx FIFO read index pointer, range 0 to 31 + * | | |Read as 0 when Tx Queue operation is configured (TFQM (CANFD_TXBC[30]) = 1). + * |[20:16] |TFQP |Tx FIFO/Queue Put Index + * | | |Tx FIFO/Queue write index pointer, range 0 to 31. + * |[21] |TFQF |Tx FIFO/Queue Full + * | | |0 = Tx FIFO/Queue not full. + * | | |1 = Tx FIFO/Queue full. + * @var CANFD_T::TXESC + * Offset: 0xC8 Tx Buffer Element Size Configuration + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |TBDS |Tx Buffer Data Field Size + * | | |000 = 8 byte data field. + * | | |001 = 12 byte data field. + * | | |010 = 16 byte data field. + * | | |011 = 20 byte data field. + * | | |100 = 24 byte data field. + * | | |101 = 32 byte data field. + * | | |110 = 48 byte data field. + * | | |111 = 64 byte data field. + * | | |Note: In case the data length code DLC of a Tx Buffer element is configured to a value higher than the Tx Buffer data field size CANFD_TXESC.TBDS, the bytes not defined by the Tx Buffer are transmitted as 0xCC (padding bytes). + * @var CANFD_T::TXBRP + * Offset: 0xCC Tx Buffer Request Pending + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |TRPn |Transmission Request Pending Each Tx Buffer has its own Transmission Request Pending bit The bits are set via register CANFD_TXBAR The bits are reset after a requested transmission has completed or has been cancelled via register CANFD_TXBCR + * | | |CANFD_TXBRP bits are set only for those Tx Buffers configured via CANFD_TXBC + * | | |After a CANFD_TXBRP bit has been set, a Tx scan (refer to section 6.33.5.5, Tx Handling) is started to check for the pending Tx request with the highest priority (Tx Buffer with lowest Message ID). + * | | |A cancellation request resets the corresponding transmission request pending bit of register CANFD_TXBRP + * | | |In case a transmission has already been started when a cancellation is requested, this is done at the end of the transmission, regardless whether the transmission was successful or not + * | | |The cancellation request bits are reset directly after the corresponding CANFD_TXBRP bit has been reset. + * | | |After a cancellation has been requested, a finished cancellation is signaled via CANFD_TXBCF + * | | |- after successful transmission together with the corresponding CANFD_TXBTO bit + * | | |- when the transmission has not yet been started at the point of cancellation + * | | |- when the transmission has been aborted due to lost arbitration + * | | |- when an error occurred during frame transmission + * | | |In DAR mode all transmissions are automatically cancelled if they are not successful + * | | |The corresponding CANFD_TXBCF bit is set for all unsuccessful transmissions. + * | | |0 = No transmission request pending. + * | | |1 = Transmission request pending. + * | | |Note: CANFD_TXBRP bits which are set while a Tx scan is in progress are not considered during this particular Tx scan + * | | |In case a cancellation is requested for such a Tx Buffer, this Add Request is cancelled immediately, the corresponding CANFD_TXBRP bit is reset. + * @var CANFD_T::TXBAR + * Offset: 0xD0 Tx Buffer Add Request + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ARn |Add Request Each Tx Buffer has its own Add Request bit Writing a 1 will set the corresponding Add Request bit; writing a 0 has no impact This enables the Host to set transmission requests for multiple Tx Buffers with one write to CANFD_TXBAR CANFD_TXBAR bits are set only for those Tx Buffers configured via CANFD_TXBC + * | | |When no Tx scan is running, the bits are reset immediately, else the bits remain set until the Tx scan process has completed + * | | |0 = No transmission request added. + * | | |1 = Transmission requested added. + * | | |Note: If an add request is applied for a Tx Buffer with pending transmission request (corresponding CANFD_TXBRP bit already set), this add request is ignored. + * @var CANFD_T::TXBCR + * Offset: 0xD4 Tx Buffer Cancellation Request + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CRn |Cancellation Request + * | | |Each Tx Buffer has its own Cancellation Request bit + * | | |Writing a 1 will set the corresponding Cancellation Request bit; writing a 0 has no impact + * | | |This enables the Host to set cancellation requests for multiple Tx Buffers with one write to CANFD_TXBCR + * | | |CANFD_TXBCR bits are set only for those Tx Buffers configured via CANFD_TXBC + * | | |The bits remain set until the corresponding bit of CANFD_TXBRP is reset. + * | | |0 = No cancellation pending. + * | | |1 = Cancellation pending. + * @var CANFD_T::TXBTO + * Offset: 0xD8 Tx Buffer Transmission Occurred + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |TOn |Transmission Occurred + * | | |Each Tx Buffer has its own Transmission Occurred bit + * | | |The bits are set when the corresponding CANFD_TXBRP bit is cleared after a successful transmission + * | | |The bits are reset when a new transmission is requested by writing a 1 to the corresponding bit of register CANFD_TXBAR. + * | | |0 = No transmission occurred. + * | | |1 = Transmission occurred. + * @var CANFD_T::TXBCF + * Offset: 0xDC Tx Buffer Cancellation Finished + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CFn |Cancellation Finished + * | | |Each Tx Buffer has its own Cancellation Finished bit + * | | |The bits are set when the corresponding CANFD_TXBRP bit is cleared after a cancellation was requested via CANFD_TXBCR + * | | |In case the corresponding CANFD_TXBRP bit was not set at the point of cancellation, CF is set immediately + * | | |The bits are reset when a new transmission is requested by writing a 1 to the corresponding bit of register CANFD_TXBAR. + * | | |0 = No transmit buffer cancellation. + * | | |1 = Transmit buffer cancellation finished. + * @var CANFD_T::TXBTIE + * Offset: 0xE0 Tx Buffer Transmission Interrupt Enable + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |TIEn |Transmission Interrupt Enable + * | | |Each Tx Buffer has its own Transmission Interrupt Enable bit. + * | | |0 = Transmission interrupt Disabled. + * | | |1 = Transmission interrupt Enabled. + * @var CANFD_T::TXBCIE + * Offset: 0xE4 Tx Buffer Cancellation Finished Interrupt Enable + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CFIEn |Cancellation Finished Interrupt Enable + * | | |Each Tx Buffer has its own Cancellation Finished Interrupt Enable bit. + * | | |0 = Cancellation finished interrupt Disabled. + * | | |1 = Cancellation finished interrupt Enabled. + * @var CANFD_T::TXEFC + * Offset: 0xF0 Tx Event FIFO Configuration + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:2] |EFSA |Event FIFO Start Address + * | | |Start address of Tx Event FIFO in Message RAM (32-bit word address, refer to Figure 6.33-11). + * |[21:16] |EFS |Event FIFO Size + * | | |0 = Tx Event FIFO Disabled. + * | | |1-32 = Number of Tx Event FIFO elements. + * | | |>32 = Values greater than 32 are interpreted as 32. + * | | |The Tx Event FIFO elements are indexed from 0 to EFS - 1 + * |[29:24] |EFWN |Event FIFO Watermark + * | | |0 = Watermark interrupt Disabled. + * | | |1-32 = Level for Tx Event FIFO watermark interrupt (TEFW (CANFD_IR[13])). + * | | |>32 = Watermark interrupt Disabled. + * @var CANFD_T::TXEFS + * Offset: 0xF4 Tx Event FIFO Status + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |EFFL |Event FIFO Fill Level + * | | |Number of elements stored in Tx Event FIFO, range 0 to 32 + * |[12:8] |EFG |Event FIFO Get Index + * | | |Tx Event FIFO read index pointer, range 0 to 31 + * |[20:16] |EFP |Event FIFO Put Index + * | | |Tx Event FIFO write index pointer, range 0 to 31 + * |[24] |EFF |Event FIFO Full + * | | |0 = Tx Event FIFO not full. + * | | |1 = Tx Event FIFO full. + * |[25] |TEFL |Tx Event FIFO Element Lost + * | | |This bit is a copy of interrupt flag TEFL (CANFD_IR[15]). When TEFL is reset, this bit is also reset. + * | | |0 = No Tx Event FIFO element lost. + * | | |1 = Tx Event FIFO element lost, also set after write attempt to Tx Event FIFO of size zero. + * @var CANFD_T::TXEFA + * Offset: 0xF8 Tx Event FIFO Acknowledge + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |EFA |Event FIFO Acknowledge Index + * | | |After the Host has read an element or a sequence of elements from the Tx Event FIFO it has to write the index of the last element read from Tx Event FIFO to EFAI + * | | |This will set the Tx Event FIFO Get Index EFGI (CANFD_TXEFS[12:8]) to EFAI + 1 and update the Event FIFO Fill Level EFFL (CANFD_TXEFS[5:0]) + */ + __I uint32_t RESERVE0[3]; + __IO uint32_t DBTP; /*!< [0x000c] Data Bit Timing & Prescaler Register */ + __IO uint32_t TEST; /*!< [0x0010] Test Register */ + __IO uint32_t RWD; /*!< [0x0014] RAM Watchdog */ + __IO uint32_t CCCR; /*!< [0x0018] CC Control Register */ + __IO uint32_t NBTP; /*!< [0x001c] Nominal Bit Timing & Prescaler Register */ + __IO uint32_t TSCC; /*!< [0x0020] Timestamp Counter Configuration */ + __IO uint32_t TSCV; /*!< [0x0024] Timestamp Counter Value */ + __IO uint32_t TOCC; /*!< [0x0028] Timeout Counter Configuration */ + __IO uint32_t TOCV; /*!< [0x002c] Timeout Counter Value */ + __I uint32_t RESERVE1[4]; + __IO uint32_t ECR; /*!< [0x0040] Error Counter Register */ + __IO uint32_t PSR; /*!< [0x0044] Protocol Status Register */ + __IO uint32_t TDCR; /*!< [0x0048] Transmitter Delay Compensation Register */ + __I uint32_t RESERVE2[1]; + __IO uint32_t IR; /*!< [0x0050] Interrupt Register */ + __IO uint32_t IE; /*!< [0x0054] Interrupt Enable */ + __IO uint32_t ILS; /*!< [0x0058] Interrupt Line Select */ + __IO uint32_t ILE; /*!< [0x005c] Interrupt Line Enable */ + __I uint32_t RESERVE3[8]; + __IO uint32_t GFC; /*!< [0x0080] Global Filter Configuration */ + __IO uint32_t SIDFC; /*!< [0x0084] Standard ID Filter Configuration */ + __IO uint32_t XIDFC; /*!< [0x0088] Extended ID Filter Configuration */ + __I uint32_t RESERVE4[1]; + __IO uint32_t XIDAM; /*!< [0x0090] Extended ID AND Mask */ + __I uint32_t HPMS; /*!< [0x0094] High Priority Message Status */ + __IO uint32_t NDAT1; /*!< [0x0098] New Data 1 */ + __IO uint32_t NDAT2; /*!< [0x009c] New Data 2 */ + __IO uint32_t RXF0C; /*!< [0x00a0] Rx FIFO 0 Configuration */ + __I uint32_t RXF0S; /*!< [0x00a4] Rx FIFO 0 Status */ + __IO uint32_t RXF0A; /*!< [0x00a8] Rx FIFO 0 Acknowledge */ + __IO uint32_t RXBC; /*!< [0x00ac] Rx Buffer Configuration */ + __IO uint32_t RXF1C; /*!< [0x00b0] Rx FIFO 1 Configuration */ + __I uint32_t RXF1S; /*!< [0x00b4] Rx FIFO 1 Status */ + __IO uint32_t RXF1A; /*!< [0x00b8] Rx FIFO 1 Acknowledge */ + __IO uint32_t RXESC; /*!< [0x00bc] Rx Buffer / FIFO Element Size Configuration */ + __IO uint32_t TXBC; /*!< [0x00c0] Tx Buffer Configuration */ + __I uint32_t TXFQS; /*!< [0x00c4] Tx FIFO/Queue Status */ + __IO uint32_t TXESC; /*!< [0x00c8] Tx Buffer Element Size Configuration */ + __I uint32_t TXBRP; /*!< [0x00cc] Tx Buffer Request Pending */ + __IO uint32_t TXBAR; /*!< [0x00d0] Tx Buffer Add Request */ + __IO uint32_t TXBCR; /*!< [0x00d4] Tx Buffer Cancellation Request */ + __I uint32_t TXBTO; /*!< [0x00d8] Tx Buffer Transmission Occurred */ + __I uint32_t TXBCF; /*!< [0x00dc] Tx Buffer Cancellation Finished */ + __IO uint32_t TXBTIE; /*!< [0x00e0] Tx Buffer Transmission Interrupt Enable */ + __IO uint32_t TXBCIE; /*!< [0x00e4] Tx Buffer Cancellation Finished Interrupt Enable */ + __I uint32_t RESERVE5[2]; + __IO uint32_t TXEFC; /*!< [0x00f0] Tx Event FIFO Configuration */ + __I uint32_t TXEFS; /*!< [0x00f4] Tx Event FIFO Status */ + __IO uint32_t TXEFA; /*!< [0x00f8] Tx Event FIFO Acknowledge */ + +} CANFD_T; + +/** + @addtogroup CANFD_CONST CANFD Bit Field Definition + Constant Definitions for CANFD Controller +@{ */ + +#define CANFD_DBTP_DSJW_Pos (0) /*!< CANFD_T::DBTP: DSJW Position */ +#define CANFD_DBTP_DSJW_Msk (0xful << CANFD_DBTP_DSJW_Pos) /*!< CANFD_T::DBTP: DSJW Mask */ + +#define CANFD_DBTP_DTSEG2_Pos (4) /*!< CANFD_T::DBTP: DTSEG2 Position */ +#define CANFD_DBTP_DTSEG2_Msk (0xful << CANFD_DBTP_DTSEG2_Pos) /*!< CANFD_T::DBTP: DTSEG2 Mask */ + +#define CANFD_DBTP_DTSEG1_Pos (8) /*!< CANFD_T::DBTP: DTSEG1 Position */ +#define CANFD_DBTP_DTSEG1_Msk (0x1ful << CANFD_DBTP_DTSEG1_Pos) /*!< CANFD_T::DBTP: DTSEG1 Mask */ + +#define CANFD_DBTP_DBRP_Pos (16) /*!< CANFD_T::DBTP: DBRP Position */ +#define CANFD_DBTP_DBRP_Msk (0x1ful << CANFD_DBTP_DBRP_Pos) /*!< CANFD_T::DBTP: DBRP Mask */ + +#define CANFD_DBTP_TDC_Pos (23) /*!< CANFD_T::DBTP: TDC Position */ +#define CANFD_DBTP_TDC_Msk (0x1ul << CANFD_DBTP_TDC_Pos) /*!< CANFD_T::DBTP: TDC Mask */ + +#define CANFD_TEST_LBCK_Pos (4) /*!< CANFD_T::TEST: LBCK Position */ +#define CANFD_TEST_LBCK_Msk (0x1ul << CANFD_TEST_LBCK_Pos) /*!< CANFD_T::TEST: LBCK Mask */ + +#define CANFD_TEST_TX_Pos (5) /*!< CANFD_T::TEST: TX Position */ +#define CANFD_TEST_TX_Msk (0x3ul << CANFD_TEST_TX_Pos) /*!< CANFD_T::TEST: TX Mask */ + +#define CANFD_TEST_RX_Pos (7) /*!< CANFD_T::TEST: RX Position */ +#define CANFD_TEST_RX_Msk (0x1ul << CANFD_TEST_RX_Pos) /*!< CANFD_T::TEST: RX Mask */ + +#define CANFD_RWD_WDC_Pos (0) /*!< CANFD_T::RWD: WDC Position */ +#define CANFD_RWD_WDC_Msk (0xfful << CANFD_RWD_WDC_Pos) /*!< CANFD_T::RWD: WDC Mask */ + +#define CANFD_RWD_WDV_Pos (8) /*!< CANFD_T::RWD: WDV Position */ +#define CANFD_RWD_WDV_Msk (0xfful << CANFD_RWD_WDV_Pos) /*!< CANFD_T::RWD: WDV Mask */ + +#define CANFD_CCCR_INIT_Pos (0) /*!< CANFD_T::CCCR: INIT Position */ +#define CANFD_CCCR_INIT_Msk (0x1ul << CANFD_CCCR_INIT_Pos) /*!< CANFD_T::CCCR: INIT Mask */ + +#define CANFD_CCCR_CCE_Pos (1) /*!< CANFD_T::CCCR: CCE Position */ +#define CANFD_CCCR_CCE_Msk (0x1ul << CANFD_CCCR_CCE_Pos) /*!< CANFD_T::CCCR: CCE Mask */ + +#define CANFD_CCCR_ASM_Pos (2) /*!< CANFD_T::CCCR: ASM Position */ +#define CANFD_CCCR_ASM_Msk (0x1ul << CANFD_CCCR_ASM_Pos) /*!< CANFD_T::CCCR: ASM Mask */ + +#define CANFD_CCCR_CSA_Pos (3) /*!< CANFD_T::CCCR: CSA Position */ +#define CANFD_CCCR_CSA_Msk (0x1ul << CANFD_CCCR_CSA_Pos) /*!< CANFD_T::CCCR: CSA Mask */ + +#define CANFD_CCCR_CSR_Pos (4) /*!< CANFD_T::CCCR: CSR Position */ +#define CANFD_CCCR_CSR_Msk (0x1ul << CANFD_CCCR_CSR_Pos) /*!< CANFD_T::CCCR: CSR Mask */ + +#define CANFD_CCCR_MON_Pos (5) /*!< CANFD_T::CCCR: MON Position */ +#define CANFD_CCCR_MON_Msk (0x1ul << CANFD_CCCR_MON_Pos) /*!< CANFD_T::CCCR: MON Mask */ + +#define CANFD_CCCR_DAR_Pos (6) /*!< CANFD_T::CCCR: DAR Position */ +#define CANFD_CCCR_DAR_Msk (0x1ul << CANFD_CCCR_DAR_Pos) /*!< CANFD_T::CCCR: DAR Mask */ + +#define CANFD_CCCR_TEST_Pos (7) /*!< CANFD_T::CCCR: TEST Position */ +#define CANFD_CCCR_TEST_Msk (0x1ul << CANFD_CCCR_TEST_Pos) /*!< CANFD_T::CCCR: TEST Mask */ + +#define CANFD_CCCR_FDOE_Pos (8) /*!< CANFD_T::CCCR: FDOE Position */ +#define CANFD_CCCR_FDOE_Msk (0x1ul << CANFD_CCCR_FDOE_Pos) /*!< CANFD_T::CCCR: FDOE Mask */ + +#define CANFD_CCCR_BRSE_Pos (9) /*!< CANFD_T::CCCR: BRSE Position */ +#define CANFD_CCCR_BRSE_Msk (0x1ul << CANFD_CCCR_BRSE_Pos) /*!< CANFD_T::CCCR: BRSE Mask */ + +#define CANFD_CCCR_PXHD_Pos (12) /*!< CANFD_T::CCCR: PXHD Position */ +#define CANFD_CCCR_PXHD_Msk (0x1ul << CANFD_CCCR_PXHD_Pos) /*!< CANFD_T::CCCR: PXHD Mask */ + +#define CANFD_CCCR_EFBI_Pos (13) /*!< CANFD_T::CCCR: EFBI Position */ +#define CANFD_CCCR_EFBI_Msk (0x1ul << CANFD_CCCR_EFBI_Pos) /*!< CANFD_T::CCCR: EFBI Mask */ + +#define CANFD_CCCR_TXP_Pos (14) /*!< CANFD_T::CCCR: TXP Position */ +#define CANFD_CCCR_TXP_Msk (0x1ul << CANFD_CCCR_TXP_Pos) /*!< CANFD_T::CCCR: TXP Mask */ + +#define CANFD_CCCR_NISO_Pos (15) /*!< CANFD_T::CCCR: NISO Position */ +#define CANFD_CCCR_NISO_Msk (0x1ul << CANFD_CCCR_NISO_Pos) /*!< CANFD_T::CCCR: NISO Mask */ + +#define CANFD_NBTP_NTSEG2_Pos (0) /*!< CANFD_T::NBTP: NTSEG2 Position */ +#define CANFD_NBTP_NTSEG2_Msk (0x7ful << CANFD_NBTP_NTSEG2_Pos) /*!< CANFD_T::NBTP: NTSEG2 Mask */ + +#define CANFD_NBTP_NTSEG1_Pos (8) /*!< CANFD_T::NBTP: NTSEG1 Position */ +#define CANFD_NBTP_NTSEG1_Msk (0xfful << CANFD_NBTP_NTSEG1_Pos) /*!< CANFD_T::NBTP: NTSEG1 Mask */ + +#define CANFD_NBTP_NBRP_Pos (16) /*!< CANFD_T::NBTP: NBRP Position */ +#define CANFD_NBTP_NBRP_Msk (0x1fful << CANFD_NBTP_NBRP_Pos) /*!< CANFD_T::NBTP: NBRP Mask */ + +#define CANFD_NBTP_NSJW_Pos (25) /*!< CANFD_T::NBTP: NSJW Position */ +#define CANFD_NBTP_NSJW_Msk (0x7ful << CANFD_NBTP_NSJW_Pos) /*!< CANFD_T::NBTP: NSJW Mask */ + +#define CANFD_TSCC_TSS_Pos (0) /*!< CANFD_T::TSCC: TSS Position */ +#define CANFD_TSCC_TSS_Msk (0x3ul << CANFD_TSCC_TSS_Pos) /*!< CANFD_T::TSCC: TSS Mask */ + +#define CANFD_TSCC_TCP_Pos (16) /*!< CANFD_T::TSCC: TCP Position */ +#define CANFD_TSCC_TCP_Msk (0xful << CANFD_TSCC_TCP_Pos) /*!< CANFD_T::TSCC: TCP Mask */ + +#define CANFD_TSCV_TSC_Pos (0) /*!< CANFD_T::TSCV: TSC Position */ +#define CANFD_TSCV_TSC_Msk (0xfffful << CANFD_TSCV_TSC_Pos) /*!< CANFD_T::TSCV: TSC Mask */ + +#define CANFD_TOCC_ETOC_Pos (0) /*!< CANFD_T::TOCC: ETOC Position */ +#define CANFD_TOCC_ETOC_Msk (0x1ul << CANFD_TOCC_ETOC_Pos) /*!< CANFD_T::TOCC: ETOC Mask */ + +#define CANFD_TOCC_TOS_Pos (1) /*!< CANFD_T::TOCC: TOS Position */ +#define CANFD_TOCC_TOS_Msk (0x3ul << CANFD_TOCC_TOS_Pos) /*!< CANFD_T::TOCC: TOS Mask */ + +#define CANFD_TOCC_TOP_Pos (16) /*!< CANFD_T::TOCC: TOP Position */ +#define CANFD_TOCC_TOP_Msk (0xfffful << CANFD_TOCC_TOP_Pos) /*!< CANFD_T::TOCC: TOP Mask */ + +#define CANFD_TOCV_TOC_Pos (0) /*!< CANFD_T::TOCV: TOC Position */ +#define CANFD_TOCV_TOC_Msk (0xfffful << CANFD_TOCV_TOC_Pos) /*!< CANFD_T::TOCV: TOC Mask */ + +#define CANFD_ECR_TEC_Pos (0) /*!< CANFD_T::ECR: TEC Position */ +#define CANFD_ECR_TEC_Msk (0xfful << CANFD_ECR_TEC_Pos) /*!< CANFD_T::ECR: TEC Mask */ + +#define CANFD_ECR_REC_Pos (8) /*!< CANFD_T::ECR: REC Position */ +#define CANFD_ECR_REC_Msk (0x7ful << CANFD_ECR_REC_Pos) /*!< CANFD_T::ECR: REC Mask */ + +#define CANFD_ECR_RP_Pos (15) /*!< CANFD_T::ECR: RP Position */ +#define CANFD_ECR_RP_Msk (0x1ul << CANFD_ECR_RP_Pos) /*!< CANFD_T::ECR: RP Mask */ + +#define CANFD_ECR_CEL_Pos (16) /*!< CANFD_T::ECR: CEL Position */ +#define CANFD_ECR_CEL_Msk (0xfful << CANFD_ECR_CEL_Pos) /*!< CANFD_T::ECR: CEL Mask */ + +#define CANFD_PSR_LEC_Pos (0) /*!< CANFD_T::PSR: LEC Position */ +#define CANFD_PSR_LEC_Msk (0x7ul << CANFD_PSR_LEC_Pos) /*!< CANFD_T::PSR: LEC Mask */ + +#define CANFD_PSR_ACT_Pos (3) /*!< CANFD_T::PSR: ACT Position */ +#define CANFD_PSR_ACT_Msk (0x3ul << CANFD_PSR_ACT_Pos) /*!< CANFD_T::PSR: ACT Mask */ + +#define CANFD_PSR_EP_Pos (5) /*!< CANFD_T::PSR: EP Position */ +#define CANFD_PSR_EP_Msk (0x1ul << CANFD_PSR_EP_Pos) /*!< CANFD_T::PSR: EP Mask */ + +#define CANFD_PSR_EW_Pos (6) /*!< CANFD_T::PSR: EW Position */ +#define CANFD_PSR_EW_Msk (0x1ul << CANFD_PSR_EW_Pos) /*!< CANFD_T::PSR: EW Mask */ + +#define CANFD_PSR_BO_Pos (7) /*!< CANFD_T::PSR: BO Position */ +#define CANFD_PSR_BO_Msk (0x1ul << CANFD_PSR_BO_Pos) /*!< CANFD_T::PSR: BO Mask */ + +#define CANFD_PSR_DLEC_Pos (8) /*!< CANFD_T::PSR: DLEC Position */ +#define CANFD_PSR_DLEC_Msk (0x7ul << CANFD_PSR_DLEC_Pos) /*!< CANFD_T::PSR: DLEC Mask */ + +#define CANFD_PSR_RESI_Pos (11) /*!< CANFD_T::PSR: RESI Position */ +#define CANFD_PSR_RESI_Msk (0x1ul << CANFD_PSR_RESI_Pos) /*!< CANFD_T::PSR: RESI Mask */ + +#define CANFD_PSR_RBRS_Pos (12) /*!< CANFD_T::PSR: RBRS Position */ +#define CANFD_PSR_RBRS_Msk (0x1ul << CANFD_PSR_RBRS_Pos) /*!< CANFD_T::PSR: RBRS Mask */ + +#define CANFD_PSR_RFDF_Pos (13) /*!< CANFD_T::PSR: RFDF Position */ +#define CANFD_PSR_RFDF_Msk (0x1ul << CANFD_PSR_RFDF_Pos) /*!< CANFD_T::PSR: RFDF Mask */ + +#define CANFD_PSR_PXE_Pos (14) /*!< CANFD_T::PSR: PXE Position */ +#define CANFD_PSR_PXE_Msk (0x1ul << CANFD_PSR_PXE_Pos) /*!< CANFD_T::PSR: PXE Mask */ + +#define CANFD_PSR_TDCV_Pos (16) /*!< CANFD_T::PSR: TDCV Position */ +#define CANFD_PSR_TDCV_Msk (0x7ful << CANFD_PSR_TDCV_Pos) /*!< CANFD_T::PSR: TDCV Mask */ + +#define CANFD_TDCR_TDCF_Pos (0) /*!< CANFD_T::TDCR: TDCF Position */ +#define CANFD_TDCR_TDCF_Msk (0x7ful << CANFD_TDCR_TDCF_Pos) /*!< CANFD_T::TDCR: TDCF Mask */ + +#define CANFD_TDCR_TDCO_Pos (8) /*!< CANFD_T::TDCR: TDCO Position */ +#define CANFD_TDCR_TDCO_Msk (0x7ful << CANFD_TDCR_TDCO_Pos) /*!< CANFD_T::TDCR: TDCO Mask */ + +#define CANFD_IR_RF0N_Pos (0) /*!< CANFD_T::IR: RF0N Position */ +#define CANFD_IR_RF0N_Msk (0x1ul << CANFD_IR_RF0N_Pos) /*!< CANFD_T::IR: RF0N Mask */ + +#define CANFD_IR_RF0W_Pos (1) /*!< CANFD_T::IR: RF0W Position */ +#define CANFD_IR_RF0W_Msk (0x1ul << CANFD_IR_RF0W_Pos) /*!< CANFD_T::IR: RF0W Mask */ + +#define CANFD_IR_RF0F_Pos (2) /*!< CANFD_T::IR: RF0F Position */ +#define CANFD_IR_RF0F_Msk (0x1ul << CANFD_IR_RF0F_Pos) /*!< CANFD_T::IR: RF0F Mask */ + +#define CANFD_IR_RF0L_Pos (3) /*!< CANFD_T::IR: RF0L Position */ +#define CANFD_IR_RF0L_Msk (0x1ul << CANFD_IR_RF0L_Pos) /*!< CANFD_T::IR: RF0L Mask */ + +#define CANFD_IR_RF1N_Pos (4) /*!< CANFD_T::IR: RF1N Position */ +#define CANFD_IR_RF1N_Msk (0x1ul << CANFD_IR_RF1N_Pos) /*!< CANFD_T::IR: RF1N Mask */ + +#define CANFD_IR_RF1W_Pos (5) /*!< CANFD_T::IR: RF1W Position */ +#define CANFD_IR_RF1W_Msk (0x1ul << CANFD_IR_RF1W_Pos) /*!< CANFD_T::IR: RF1W Mask */ + +#define CANFD_IR_RF1F_Pos (6) /*!< CANFD_T::IR: RF1F Position */ +#define CANFD_IR_RF1F_Msk (0x1ul << CANFD_IR_RF1F_Pos) /*!< CANFD_T::IR: RF1F Mask */ + +#define CANFD_IR_RF1L_Pos (7) /*!< CANFD_T::IR: RF1L Position */ +#define CANFD_IR_RF1L_Msk (0x1ul << CANFD_IR_RF1L_Pos) /*!< CANFD_T::IR: RF1L Mask */ + +#define CANFD_IR_HPM_Pos (8) /*!< CANFD_T::IR: HPM Position */ +#define CANFD_IR_HPM_Msk (0x1ul << CANFD_IR_HPM_Pos) /*!< CANFD_T::IR: HPM Mask */ + +#define CANFD_IR_TC_Pos (9) /*!< CANFD_T::IR: TC Position */ +#define CANFD_IR_TC_Msk (0x1ul << CANFD_IR_TC_Pos) /*!< CANFD_T::IR: TC Mask */ + +#define CANFD_IR_TCF_Pos (10) /*!< CANFD_T::IR: TCF Position */ +#define CANFD_IR_TCF_Msk (0x1ul << CANFD_IR_TCF_Pos) /*!< CANFD_T::IR: TCF Mask */ + +#define CANFD_IR_TFE_Pos (11) /*!< CANFD_T::IR: TFE Position */ +#define CANFD_IR_TFE_Msk (0x1ul << CANFD_IR_TFE_Pos) /*!< CANFD_T::IR: TFE Mask */ + +#define CANFD_IR_TEFN_Pos (12) /*!< CANFD_T::IR: TEFN Position */ +#define CANFD_IR_TEFN_Msk (0x1ul << CANFD_IR_TEFN_Pos) /*!< CANFD_T::IR: TEFN Mask */ + +#define CANFD_IR_TEFW_Pos (13) /*!< CANFD_T::IR: TEFW Position */ +#define CANFD_IR_TEFW_Msk (0x1ul << CANFD_IR_TEFW_Pos) /*!< CANFD_T::IR: TEFW Mask */ + +#define CANFD_IR_TEFF_Pos (14) /*!< CANFD_T::IR: TEFF Position */ +#define CANFD_IR_TEFF_Msk (0x1ul << CANFD_IR_TEFF_Pos) /*!< CANFD_T::IR: TEFF Mask */ + +#define CANFD_IR_TEFL_Pos (15) /*!< CANFD_T::IR: TEFL Position */ +#define CANFD_IR_TEFL_Msk (0x1ul << CANFD_IR_TEFL_Pos) /*!< CANFD_T::IR: TEFL Mask */ + +#define CANFD_IR_TSW_Pos (16) /*!< CANFD_T::IR: TSW Position */ +#define CANFD_IR_TSW_Msk (0x1ul << CANFD_IR_TSW_Pos) /*!< CANFD_T::IR: TSW Mask */ + +#define CANFD_IR_MRAF_Pos (17) /*!< CANFD_T::IR: MRAF Position */ +#define CANFD_IR_MRAF_Msk (0x1ul << CANFD_IR_MRAF_Pos) /*!< CANFD_T::IR: MRAF Mask */ + +#define CANFD_IR_TOO_Pos (18) /*!< CANFD_T::IR: TOO Position */ +#define CANFD_IR_TOO_Msk (0x1ul << CANFD_IR_TOO_Pos) /*!< CANFD_T::IR: TOO Mask */ + +#define CANFD_IR_DRX_Pos (19) /*!< CANFD_T::IR: DRX Position */ +#define CANFD_IR_DRX_Msk (0x1ul << CANFD_IR_DRX_Pos) /*!< CANFD_T::IR: DRX Mask */ + +#define CANFD_IR_ELO_Pos (22) /*!< CANFD_T::IR: ELO Position */ +#define CANFD_IR_ELO_Msk (0x1ul << CANFD_IR_ELO_Pos) /*!< CANFD_T::IR: ELO Mask */ + +#define CANFD_IR_EP_Pos (23) /*!< CANFD_T::IR: EP Position */ +#define CANFD_IR_EP_Msk (0x1ul << CANFD_IR_EP_Pos) /*!< CANFD_T::IR: EP Mask */ + +#define CANFD_IR_EW_Pos (24) /*!< CANFD_T::IR: EW Position */ +#define CANFD_IR_EW_Msk (0x1ul << CANFD_IR_EW_Pos) /*!< CANFD_T::IR: EW Mask */ + +#define CANFD_IR_BO_Pos (25) /*!< CANFD_T::IR: BO Position */ +#define CANFD_IR_BO_Msk (0x1ul << CANFD_IR_BO_Pos) /*!< CANFD_T::IR: BO Mask */ + +#define CANFD_IR_WDI_Pos (26) /*!< CANFD_T::IR: WDI Position */ +#define CANFD_IR_WDI_Msk (0x1ul << CANFD_IR_WDI_Pos) /*!< CANFD_T::IR: WDI Mask */ + +#define CANFD_IR_PEA_Pos (27) /*!< CANFD_T::IR: PEA Position */ +#define CANFD_IR_PEA_Msk (0x1ul << CANFD_IR_PEA_Pos) /*!< CANFD_T::IR: PEA Mask */ + +#define CANFD_IR_PED_Pos (28) /*!< CANFD_T::IR: PED Position */ +#define CANFD_IR_PED_Msk (0x1ul << CANFD_IR_PED_Pos) /*!< CANFD_T::IR: PED Mask */ + +#define CANFD_IR_ARA_Pos (29) /*!< CANFD_T::IR: ARA Position */ +#define CANFD_IR_ARA_Msk (0x1ul << CANFD_IR_ARA_Pos) /*!< CANFD_T::IR: ARA Mask */ + +#define CANFD_IE_RF0NE_Pos (0) /*!< CANFD_T::IE: RF0NE Position */ +#define CANFD_IE_RF0NE_Msk (0x1ul << CANFD_IE_RF0NE_Pos) /*!< CANFD_T::IE: RF0NE Mask */ + +#define CANFD_IE_RF0WE_Pos (1) /*!< CANFD_T::IE: RF0WE Position */ +#define CANFD_IE_RF0WE_Msk (0x1ul << CANFD_IE_RF0WE_Pos) /*!< CANFD_T::IE: RF0WE Mask */ + +#define CANFD_IE_RF0FE_Pos (2) /*!< CANFD_T::IE: RF0FE Position */ +#define CANFD_IE_RF0FE_Msk (0x1ul << CANFD_IE_RF0FE_Pos) /*!< CANFD_T::IE: RF0FE Mask */ + +#define CANFD_IE_RF0LE_Pos (3) /*!< CANFD_T::IE: RF0LE Position */ +#define CANFD_IE_RF0LE_Msk (0x1ul << CANFD_IE_RF0LE_Pos) /*!< CANFD_T::IE: RF0LE Mask */ + +#define CANFD_IE_RF1NE_Pos (4) /*!< CANFD_T::IE: RF1NE Position */ +#define CANFD_IE_RF1NE_Msk (0x1ul << CANFD_IE_RF1NE_Pos) /*!< CANFD_T::IE: RF1NE Mask */ + +#define CANFD_IE_RF1WE_Pos (5) /*!< CANFD_T::IE: RF1WE Position */ +#define CANFD_IE_RF1WE_Msk (0x1ul << CANFD_IE_RF1WE_Pos) /*!< CANFD_T::IE: RF1WE Mask */ + +#define CANFD_IE_RF1FE_Pos (6) /*!< CANFD_T::IE: RF1FE Position */ +#define CANFD_IE_RF1FE_Msk (0x1ul << CANFD_IE_RF1FE_Pos) /*!< CANFD_T::IE: RF1FE Mask */ + +#define CANFD_IE_RF1LE_Pos (7) /*!< CANFD_T::IE: RF1LE Position */ +#define CANFD_IE_RF1LE_Msk (0x1ul << CANFD_IE_RF1LE_Pos) /*!< CANFD_T::IE: RF1LE Mask */ + +#define CANFD_IE_HPME_Pos (8) /*!< CANFD_T::IE: HPME Position */ +#define CANFD_IE_HPME_Msk (0x1ul << CANFD_IE_HPME_Pos) /*!< CANFD_T::IE: HPME Mask */ + +#define CANFD_IE_TCE_Pos (9) /*!< CANFD_T::IE: TCE Position */ +#define CANFD_IE_TCE_Msk (0x1ul << CANFD_IE_TCE_Pos) /*!< CANFD_T::IE: TCE Mask */ + +#define CANFD_IE_TCFE_Pos (10) /*!< CANFD_T::IE: TCFE Position */ +#define CANFD_IE_TCFE_Msk (0x1ul << CANFD_IE_TCFE_Pos) /*!< CANFD_T::IE: TCFE Mask */ + +#define CANFD_IE_TFEE_Pos (11) /*!< CANFD_T::IE: TFEE Position */ +#define CANFD_IE_TFEE_Msk (0x1ul << CANFD_IE_TFEE_Pos) /*!< CANFD_T::IE: TFEE Mask */ + +#define CANFD_IE_TEFNE_Pos (12) /*!< CANFD_T::IE: TEFNE Position */ +#define CANFD_IE_TEFNE_Msk (0x1ul << CANFD_IE_TEFNE_Pos) /*!< CANFD_T::IE: TEFNE Mask */ + +#define CANFD_IE_TEFWE_Pos (13) /*!< CANFD_T::IE: TEFWE Position */ +#define CANFD_IE_TEFWE_Msk (0x1ul << CANFD_IE_TEFWE_Pos) /*!< CANFD_T::IE: TEFWE Mask */ + +#define CANFD_IE_TEFFE_Pos (14) /*!< CANFD_T::IE: TEFFE Position */ +#define CANFD_IE_TEFFE_Msk (0x1ul << CANFD_IE_TEFFE_Pos) /*!< CANFD_T::IE: TEFFE Mask */ + +#define CANFD_IE_TEFLE_Pos (15) /*!< CANFD_T::IE: TEFLE Position */ +#define CANFD_IE_TEFLE_Msk (0x1ul << CANFD_IE_TEFLE_Pos) /*!< CANFD_T::IE: TEFLE Mask */ + +#define CANFD_IE_TSWE_Pos (16) /*!< CANFD_T::IE: TSWE Position */ +#define CANFD_IE_TSWE_Msk (0x1ul << CANFD_IE_TSWE_Pos) /*!< CANFD_T::IE: TSWE Mask */ + +#define CANFD_IE_MRAFE_Pos (17) /*!< CANFD_T::IE: MRAFE Position */ +#define CANFD_IE_MRAFE_Msk (0x1ul << CANFD_IE_MRAFE_Pos) /*!< CANFD_T::IE: MRAFE Mask */ + +#define CANFD_IE_TOOE_Pos (18) /*!< CANFD_T::IE: TOOE Position */ +#define CANFD_IE_TOOE_Msk (0x1ul << CANFD_IE_TOOE_Pos) /*!< CANFD_T::IE: TOOE Mask */ + +#define CANFD_IE_DRXE_Pos (19) /*!< CANFD_T::IE: DRXE Position */ +#define CANFD_IE_DRXE_Msk (0x1ul << CANFD_IE_DRXE_Pos) /*!< CANFD_T::IE: DRXE Mask */ + +#define CANFD_IE_BECE_Pos (20) /*!< CANFD_T::IE: BECE Position */ +#define CANFD_IE_BECE_Msk (0x1ul << CANFD_IE_BECE_Pos) /*!< CANFD_T::IE: BECE Mask */ + +#define CANFD_IE_BEUE_Pos (21) /*!< CANFD_T::IE: BEUE Position */ +#define CANFD_IE_BEUE_Msk (0x1ul << CANFD_IE_BEUE_Pos) /*!< CANFD_T::IE: BEUE Mask */ + +#define CANFD_IE_ELOE_Pos (22) /*!< CANFD_T::IE: ELOE Position */ +#define CANFD_IE_ELOE_Msk (0x1ul << CANFD_IE_ELOE_Pos) /*!< CANFD_T::IE: ELOE Mask */ + +#define CANFD_IE_EPE_Pos (23) /*!< CANFD_T::IE: EPE Position */ +#define CANFD_IE_EPE_Msk (0x1ul << CANFD_IE_EPE_Pos) /*!< CANFD_T::IE: EPE Mask */ + +#define CANFD_IE_EWE_Pos (24) /*!< CANFD_T::IE: EWE Position */ +#define CANFD_IE_EWE_Msk (0x1ul << CANFD_IE_EWE_Pos) /*!< CANFD_T::IE: EWE Mask */ + +#define CANFD_IE_BOE_Pos (25) /*!< CANFD_T::IE: BOE Position */ +#define CANFD_IE_BOE_Msk (0x1ul << CANFD_IE_BOE_Pos) /*!< CANFD_T::IE: BOE Mask */ + +#define CANFD_IE_WDIE_Pos (26) /*!< CANFD_T::IE: WDIE Position */ +#define CANFD_IE_WDIE_Msk (0x1ul << CANFD_IE_WDIE_Pos) /*!< CANFD_T::IE: WDIE Mask */ + +#define CANFD_IE_PEAE_Pos (27) /*!< CANFD_T::IE: PEAE Position */ +#define CANFD_IE_PEAE_Msk (0x1ul << CANFD_IE_PEAE_Pos) /*!< CANFD_T::IE: PEAE Mask */ + +#define CANFD_IE_PEDE_Pos (28) /*!< CANFD_T::IE: PEDE Position */ +#define CANFD_IE_PEDE_Msk (0x1ul << CANFD_IE_PEDE_Pos) /*!< CANFD_T::IE: PEDE Mask */ + +#define CANFD_IE_ARAE_Pos (29) /*!< CANFD_T::IE: ARAE Position */ +#define CANFD_IE_ARAE_Msk (0x1ul << CANFD_IE_ARAE_Pos) /*!< CANFD_T::IE: ARAE Mask */ + +#define CANFD_ILS_RF0NL_Pos (0) /*!< CANFD_T::ILS: RF0NL Position */ +#define CANFD_ILS_RF0NL_Msk (0x1ul << CANFD_ILS_RF0NL_Pos) /*!< CANFD_T::ILS: RF0NL Mask */ + +#define CANFD_ILS_RF0WL_Pos (1) /*!< CANFD_T::ILS: RF0WL Position */ +#define CANFD_ILS_RF0WL_Msk (0x1ul << CANFD_ILS_RF0WL_Pos) /*!< CANFD_T::ILS: RF0WL Mask */ + +#define CANFD_ILS_RF0FL_Pos (2) /*!< CANFD_T::ILS: RF0FL Position */ +#define CANFD_ILS_RF0FL_Msk (0x1ul << CANFD_ILS_RF0FL_Pos) /*!< CANFD_T::ILS: RF0FL Mask */ + +#define CANFD_ILS_RF0LL_Pos (3) /*!< CANFD_T::ILS: RF0LL Position */ +#define CANFD_ILS_RF0LL_Msk (0x1ul << CANFD_ILS_RF0LL_Pos) /*!< CANFD_T::ILS: RF0LL Mask */ + +#define CANFD_ILS_RF1NL_Pos (4) /*!< CANFD_T::ILS: RF1NL Position */ +#define CANFD_ILS_RF1NL_Msk (0x1ul << CANFD_ILS_RF1NL_Pos) /*!< CANFD_T::ILS: RF1NL Mask */ + +#define CANFD_ILS_RF1WL_Pos (5) /*!< CANFD_T::ILS: RF1WL Position */ +#define CANFD_ILS_RF1WL_Msk (0x1ul << CANFD_ILS_RF1WL_Pos) /*!< CANFD_T::ILS: RF1WL Mask */ + +#define CANFD_ILS_RF1FL_Pos (6) /*!< CANFD_T::ILS: RF1FL Position */ +#define CANFD_ILS_RF1FL_Msk (0x1ul << CANFD_ILS_RF1FL_Pos) /*!< CANFD_T::ILS: RF1FL Mask */ + +#define CANFD_ILS_RF1LL_Pos (7) /*!< CANFD_T::ILS: RF1LL Position */ +#define CANFD_ILS_RF1LL_Msk (0x1ul << CANFD_ILS_RF1LL_Pos) /*!< CANFD_T::ILS: RF1LL Mask */ + +#define CANFD_ILS_HPML_Pos (8) /*!< CANFD_T::ILS: HPML Position */ +#define CANFD_ILS_HPML_Msk (0x1ul << CANFD_ILS_HPML_Pos) /*!< CANFD_T::ILS: HPML Mask */ + +#define CANFD_ILS_TCL_Pos (9) /*!< CANFD_T::ILS: TCL Position */ +#define CANFD_ILS_TCL_Msk (0x1ul << CANFD_ILS_TCL_Pos) /*!< CANFD_T::ILS: TCL Mask */ + +#define CANFD_ILS_TCFL_Pos (10) /*!< CANFD_T::ILS: TCFL Position */ +#define CANFD_ILS_TCFL_Msk (0x1ul << CANFD_ILS_TCFL_Pos) /*!< CANFD_T::ILS: TCFL Mask */ + +#define CANFD_ILS_TFEL_Pos (11) /*!< CANFD_T::ILS: TFEL Position */ +#define CANFD_ILS_TFEL_Msk (0x1ul << CANFD_ILS_TFEL_Pos) /*!< CANFD_T::ILS: TFEL Mask */ + +#define CANFD_ILS_TEFNL_Pos (12) /*!< CANFD_T::ILS: TEFNL Position */ +#define CANFD_ILS_TEFNL_Msk (0x1ul << CANFD_ILS_TEFNL_Pos) /*!< CANFD_T::ILS: TEFNL Mask */ + +#define CANFD_ILS_TEFWL_Pos (13) /*!< CANFD_T::ILS: TEFWL Position */ +#define CANFD_ILS_TEFWL_Msk (0x1ul << CANFD_ILS_TEFWL_Pos) /*!< CANFD_T::ILS: TEFWL Mask */ + +#define CANFD_ILS_TEFFL_Pos (14) /*!< CANFD_T::ILS: TEFFL Position */ +#define CANFD_ILS_TEFFL_Msk (0x1ul << CANFD_ILS_TEFFL_Pos) /*!< CANFD_T::ILS: TEFFL Mask */ + +#define CANFD_ILS_TEFLL_Pos (15) /*!< CANFD_T::ILS: TEFLL Position */ +#define CANFD_ILS_TEFLL_Msk (0x1ul << CANFD_ILS_TEFLL_Pos) /*!< CANFD_T::ILS: TEFLL Mask */ + +#define CANFD_ILS_TSWL_Pos (16) /*!< CANFD_T::ILS: TSWL Position */ +#define CANFD_ILS_TSWL_Msk (0x1ul << CANFD_ILS_TSWL_Pos) /*!< CANFD_T::ILS: TSWL Mask */ + +#define CANFD_ILS_MRAFL_Pos (17) /*!< CANFD_T::ILS: MRAFL Position */ +#define CANFD_ILS_MRAFL_Msk (0x1ul << CANFD_ILS_MRAFL_Pos) /*!< CANFD_T::ILS: MRAFL Mask */ + +#define CANFD_ILS_TOOL_Pos (18) /*!< CANFD_T::ILS: TOOL Position */ +#define CANFD_ILS_TOOL_Msk (0x1ul << CANFD_ILS_TOOL_Pos) /*!< CANFD_T::ILS: TOOL Mask */ + +#define CANFD_ILS_DRXL_Pos (19) /*!< CANFD_T::ILS: DRXL Position */ +#define CANFD_ILS_DRXL_Msk (0x1ul << CANFD_ILS_DRXL_Pos) /*!< CANFD_T::ILS: DRXL Mask */ + +#define CANFD_ILS_ELOL_Pos (22) /*!< CANFD_T::ILS: ELOL Position */ +#define CANFD_ILS_ELOL_Msk (0x1ul << CANFD_ILS_ELOL_Pos) /*!< CANFD_T::ILS: ELOL Mask */ + +#define CANFD_ILS_EPL_Pos (23) /*!< CANFD_T::ILS: EPL Position */ +#define CANFD_ILS_EPL_Msk (0x1ul << CANFD_ILS_EPL_Pos) /*!< CANFD_T::ILS: EPL Mask */ + +#define CANFD_ILS_EWL_Pos (24) /*!< CANFD_T::ILS: EWL Position */ +#define CANFD_ILS_EWL_Msk (0x1ul << CANFD_ILS_EWL_Pos) /*!< CANFD_T::ILS: EWL Mask */ + +#define CANFD_ILS_BOL_Pos (25) /*!< CANFD_T::ILS: BOL Position */ +#define CANFD_ILS_BOL_Msk (0x1ul << CANFD_ILS_BOL_Pos) /*!< CANFD_T::ILS: BOL Mask */ + +#define CANFD_ILS_WDIL_Pos (26) /*!< CANFD_T::ILS: WDIL Position */ +#define CANFD_ILS_WDIL_Msk (0x1ul << CANFD_ILS_WDIL_Pos) /*!< CANFD_T::ILS: WDIL Mask */ + +#define CANFD_ILS_PEAL_Pos (27) /*!< CANFD_T::ILS: PEAL Position */ +#define CANFD_ILS_PEAL_Msk (0x1ul << CANFD_ILS_PEAL_Pos) /*!< CANFD_T::ILS: PEAL Mask */ + +#define CANFD_ILS_PEDL_Pos (28) /*!< CANFD_T::ILS: PEDL Position */ +#define CANFD_ILS_PEDL_Msk (0x1ul << CANFD_ILS_PEDL_Pos) /*!< CANFD_T::ILS: PEDL Mask */ + +#define CANFD_ILS_ARAL_Pos (29) /*!< CANFD_T::ILS: ARAL Position */ +#define CANFD_ILS_ARAL_Msk (0x1ul << CANFD_ILS_ARAL_Pos) /*!< CANFD_T::ILS: ARAL Mask */ + +#define CANFD_ILE_ENT0_Pos (0) /*!< CANFD_T::ILE: ENT0 Position */ +#define CANFD_ILE_ENT0_Msk (0x1ul << CANFD_ILE_ENT0_Pos) /*!< CANFD_T::ILE: ENT0 Mask */ + +#define CANFD_ILE_ENT1_Pos (1) /*!< CANFD_T::ILE: ENT1 Position */ +#define CANFD_ILE_ENT1_Msk (0x1ul << CANFD_ILE_ENT1_Pos) /*!< CANFD_T::ILE: ENT1 Mask */ + +#define CANFD_GFC_RRFE_Pos (0) /*!< CANFD_T::GFC: RRFE Position */ +#define CANFD_GFC_RRFE_Msk (0x1ul << CANFD_GFC_RRFE_Pos) /*!< CANFD_T::GFC: RRFE Mask */ + +#define CANFD_GFC_RRFS_Pos (1) /*!< CANFD_T::GFC: RRFS Position */ +#define CANFD_GFC_RRFS_Msk (0x1ul << CANFD_GFC_RRFS_Pos) /*!< CANFD_T::GFC: RRFS Mask */ + +#define CANFD_GFC_ANFE_Pos (2) /*!< CANFD_T::GFC: ANFE Position */ +#define CANFD_GFC_ANFE_Msk (0x3ul << CANFD_GFC_ANFE_Pos) /*!< CANFD_T::GFC: ANFE Mask */ + +#define CANFD_GFC_ANFS_Pos (4) /*!< CANFD_T::GFC: ANFS Position */ +#define CANFD_GFC_ANFS_Msk (0x3ul << CANFD_GFC_ANFS_Pos) /*!< CANFD_T::GFC: ANFS Mask */ + +#define CANFD_SIDFC_FLSSA_Pos (2) /*!< CANFD_T::SIDFC: FLSSA Position */ +#define CANFD_SIDFC_FLSSA_Msk (0x3ffful << CANFD_SIDFC_FLSSA_Pos) /*!< CANFD_T::SIDFC: FLSSA Mask */ + +#define CANFD_SIDFC_LSS_Pos (16) /*!< CANFD_T::SIDFC: LSS Position */ +#define CANFD_SIDFC_LSS_Msk (0xfful << CANFD_SIDFC_LSS_Pos) /*!< CANFD_T::SIDFC: LSS Mask */ + +#define CANFD_XIDFC_FLESA_Pos (2) /*!< CANFD_T::XIDFC: FLESA Position */ +#define CANFD_XIDFC_FLESA_Msk (0x3ffful << CANFD_XIDFC_FLESA_Pos) /*!< CANFD_T::XIDFC: FLESA Mask */ + +#define CANFD_XIDFC_LSE_Pos (16) /*!< CANFD_T::XIDFC: LSE Position */ +#define CANFD_XIDFC_LSE_Msk (0x7ful << CANFD_XIDFC_LSE_Pos) /*!< CANFD_T::XIDFC: LSE Mask */ + +#define CANFD_XIDAM_EIDM_Pos (0) /*!< CANFD_T::XIDAM: EIDM Position */ +#define CANFD_XIDAM_EIDM_Msk (0x1ffffffful << CANFD_XIDAM_EIDM_Pos) /*!< CANFD_T::XIDAM: EIDM Mask */ + +#define CANFD_HPMS_BIDX_Pos (0) /*!< CANFD_T::HPMS: BIDX Position */ +#define CANFD_HPMS_BIDX_Msk (0x3ful << CANFD_HPMS_BIDX_Pos) /*!< CANFD_T::HPMS: BIDX Mask */ + +#define CANFD_HPMS_MSI_Pos (6) /*!< CANFD_T::HPMS: MSI Position */ +#define CANFD_HPMS_MSI_Msk (0x3ul << CANFD_HPMS_MSI_Pos) /*!< CANFD_T::HPMS: MSI Mask */ + +#define CANFD_HPMS_FIDX_Pos (8) /*!< CANFD_T::HPMS: FIDX Position */ +#define CANFD_HPMS_FIDX_Msk (0x7ful << CANFD_HPMS_FIDX_Pos) /*!< CANFD_T::HPMS: FIDX Mask */ + +#define CANFD_HPMS_FLST_Pos (15) /*!< CANFD_T::HPMS: FLST Position */ +#define CANFD_HPMS_FLST_Msk (0x1ul << CANFD_HPMS_FLST_Pos) /*!< CANFD_T::HPMS: FLST Mask */ + +#define CANFD_NDAT1_NDn_Pos (0) /*!< CANFD_T::NDAT1: NDn Position */ +#define CANFD_NDAT1_NDn_Msk (0xfffffffful << CANFD_NDAT1_NDn_Pos) /*!< CANFD_T::NDAT1: NDn Mask */ + +#define CANFD_NDAT2_NDn_Pos (0) /*!< CANFD_T::NDAT2: NDn Position */ +#define CANFD_NDAT2_NDn_Msk (0xfffffffful << CANFD_NDAT2_NDn_Pos) /*!< CANFD_T::NDAT2: NDn Mask */ + +#define CANFD_RXF0C_F0SA_Pos (2) /*!< CANFD_T::RXF0C: F0SA Position */ +#define CANFD_RXF0C_F0SA_Msk (0x3ffful << CANFD_RXF0C_F0SA_Pos) /*!< CANFD_T::RXF0C: F0SA Mask */ + +#define CANFD_RXF0C_F0S_Pos (16) /*!< CANFD_T::RXF0C: F0S Position */ +#define CANFD_RXF0C_F0S_Msk (0x7ful << CANFD_RXF0C_F0S_Pos) /*!< CANFD_T::RXF0C: F0S Mask */ + +#define CANFD_RXF0C_F0WM_Pos (24) /*!< CANFD_T::RXF0C: F0WM Position */ +#define CANFD_RXF0C_F0WM_Msk (0x7ful << CANFD_RXF0C_F0WM_Pos) /*!< CANFD_T::RXF0C: F0WM Mask */ + +#define CANFD_RXF0C_F0OM_Pos (31) /*!< CANFD_T::RXF0C: F0OM Position */ +#define CANFD_RXF0C_F0OM_Msk (0x1ul << CANFD_RXF0C_F0OM_Pos) /*!< CANFD_T::RXF0C: F0OM Mask */ + +#define CANFD_RXF0S_F0FL_Pos (0) /*!< CANFD_T::RXF0S: F0FL Position */ +#define CANFD_RXF0S_F0FL_Msk (0x7ful << CANFD_RXF0S_F0FL_Pos) /*!< CANFD_T::RXF0S: F0FL Mask */ + +#define CANFD_RXF0S_F0GI_Pos (8) /*!< CANFD_T::RXF0S: F0GI Position */ +#define CANFD_RXF0S_F0GI_Msk (0x3ful << CANFD_RXF0S_F0GI_Pos) /*!< CANFD_T::RXF0S: F0GI Mask */ + +#define CANFD_RXF0S_F0PI_Pos (16) /*!< CANFD_T::RXF0S: F0PI Position */ +#define CANFD_RXF0S_F0PI_Msk (0x3ful << CANFD_RXF0S_F0PI_Pos) /*!< CANFD_T::RXF0S: F0PI Mask */ + +#define CANFD_RXF0S_F0F_Pos (24) /*!< CANFD_T::RXF0S: F0F Position */ +#define CANFD_RXF0S_F0F_Msk (0x1ul << CANFD_RXF0S_F0F_Pos) /*!< CANFD_T::RXF0S: F0F Mask */ + +#define CANFD_RXF0S_RF0L_Pos (25) /*!< CANFD_T::RXF0S: RF0L Position */ +#define CANFD_RXF0S_RF0L_Msk (0x1ul << CANFD_RXF0S_RF0L_Pos) /*!< CANFD_T::RXF0S: RF0L Mask */ + +#define CANFD_RXF0A_F0A_Pos (0) /*!< CANFD_T::RXF0A: F0A Position */ +#define CANFD_RXF0A_F0A_Msk (0x3ful << CANFD_RXF0A_F0A_Pos) /*!< CANFD_T::RXF0A: F0A Mask */ + +#define CANFD_RXBC_RBSA_Pos (2) /*!< CANFD_T::RXBC: RBSA Position */ +#define CANFD_RXBC_RBSA_Msk (0x3ffful << CANFD_RXBC_RBSA_Pos) /*!< CANFD_T::RXBC: RBSA Mask */ + +#define CANFD_RXF1C_F1SA_Pos (2) /*!< CANFD_T::RXF1C: F1SA Position */ +#define CANFD_RXF1C_F1SA_Msk (0x3ffful << CANFD_RXF1C_F1SA_Pos) /*!< CANFD_T::RXF1C: F1SA Mask */ + +#define CANFD_RXF1C_F1S_Pos (16) /*!< CANFD_T::RXF1C: F1S Position */ +#define CANFD_RXF1C_F1S_Msk (0x7ful << CANFD_RXF1C_F1S_Pos) /*!< CANFD_T::RXF1C: F1S Mask */ + +#define CANFD_RXF1C_F1WM_Pos (24) /*!< CANFD_T::RXF1C: F1WM Position */ +#define CANFD_RXF1C_F1WM_Msk (0x7ful << CANFD_RXF1C_F1WM_Pos) /*!< CANFD_T::RXF1C: F1WM Mask */ + +#define CANFD_RXF1C_F1OM_Pos (31) /*!< CANFD_T::RXF1C: F1OM Position */ +#define CANFD_RXF1C_F1OM_Msk (0x1ul << CANFD_RXF1C_F1OM_Pos) /*!< CANFD_T::RXF1C: F1OM Mask */ + +#define CANFD_RXF1S_F1FL_Pos (0) /*!< CANFD_T::RXF1S: F1FL Position */ +#define CANFD_RXF1S_F1FL_Msk (0x7ful << CANFD_RXF1S_F1FL_Pos) /*!< CANFD_T::RXF1S: F1FL Mask */ + +#define CANFD_RXF1S_F1G_Pos (8) /*!< CANFD_T::RXF1S: F1G Position */ +#define CANFD_RXF1S_F1G_Msk (0x3ful << CANFD_RXF1S_F1G_Pos) /*!< CANFD_T::RXF1S: F1G Mask */ + +#define CANFD_RXF1S_F1P_Pos (16) /*!< CANFD_T::RXF1S: F1P Position */ +#define CANFD_RXF1S_F1P_Msk (0x3ful << CANFD_RXF1S_F1P_Pos) /*!< CANFD_T::RXF1S: F1P Mask */ + +#define CANFD_RXF1S_F1F_Pos (24) /*!< CANFD_T::RXF1S: F1F Position */ +#define CANFD_RXF1S_F1F_Msk (0x1ul << CANFD_RXF1S_F1F_Pos) /*!< CANFD_T::RXF1S: F1F Mask */ + +#define CANFD_RXF1S_RF1L_Pos (25) /*!< CANFD_T::RXF1S: RF1L Position */ +#define CANFD_RXF1S_RF1L_Msk (0x1ul << CANFD_RXF1S_RF1L_Pos) /*!< CANFD_T::RXF1S: RF1L Mask */ + +#define CANFD_RXF1S_DMS_Pos (30) /*!< CANFD_T::RXF1S: DMS Position */ +#define CANFD_RXF1S_DMS_Msk (0x3ul << CANFD_RXF1S_DMS_Pos) /*!< CANFD_T::RXF1S: DMS Mask */ + +#define CANFD_RXF1A_F1A_Pos (0) /*!< CANFD_T::RXF1A: F1A Position */ +#define CANFD_RXF1A_F1A_Msk (0x3ful << CANFD_RXF1A_F1A_Pos) /*!< CANFD_T::RXF1A: F1A Mask */ + +#define CANFD_RXESC_F0DS_Pos (0) /*!< CANFD_T::RXESC: F0DS Position */ +#define CANFD_RXESC_F0DS_Msk (0x7ul << CANFD_RXESC_F0DS_Pos) /*!< CANFD_T::RXESC: F0DS Mask */ + +#define CANFD_RXESC_F1DS_Pos (4) /*!< CANFD_T::RXESC: F1DS Position */ +#define CANFD_RXESC_F1DS_Msk (0x7ul << CANFD_RXESC_F1DS_Pos) /*!< CANFD_T::RXESC: F1DS Mask */ + +#define CANFD_RXESC_RBDS_Pos (8) /*!< CANFD_T::RXESC: RBDS Position */ +#define CANFD_RXESC_RBDS_Msk (0x7ul << CANFD_RXESC_RBDS_Pos) /*!< CANFD_T::RXESC: RBDS Mask */ + +#define CANFD_TXBC_TBSA_Pos (2) /*!< CANFD_T::TXBC: TBSA Position */ +#define CANFD_TXBC_TBSA_Msk (0x3ffful << CANFD_TXBC_TBSA_Pos) /*!< CANFD_T::TXBC: TBSA Mask */ + +#define CANFD_TXBC_NDTB_Pos (16) /*!< CANFD_T::TXBC: NDTB Position */ +#define CANFD_TXBC_NDTB_Msk (0x3ful << CANFD_TXBC_NDTB_Pos) /*!< CANFD_T::TXBC: NDTB Mask */ + +#define CANFD_TXBC_TFQS_Pos (24) /*!< CANFD_T::TXBC: TFQS Position */ +#define CANFD_TXBC_TFQS_Msk (0x3ful << CANFD_TXBC_TFQS_Pos) /*!< CANFD_T::TXBC: TFQS Mask */ + +#define CANFD_TXBC_TFQM_Pos (30) /*!< CANFD_T::TXBC: TFQM Position */ +#define CANFD_TXBC_TFQM_Msk (0x1ul << CANFD_TXBC_TFQM_Pos) /*!< CANFD_T::TXBC: TFQM Mask */ + +#define CANFD_TXFQS_TFFL_Pos (0) /*!< CANFD_T::TXFQS: TFFL Position */ +#define CANFD_TXFQS_TFFL_Msk (0x3ful << CANFD_TXFQS_TFFL_Pos) /*!< CANFD_T::TXFQS: TFFL Mask */ + +#define CANFD_TXFQS_TFG_Pos (8) /*!< CANFD_T::TXFQS: TFG Position */ +#define CANFD_TXFQS_TFG_Msk (0x1ful << CANFD_TXFQS_TFG_Pos) /*!< CANFD_T::TXFQS: TFG Mask */ + +#define CANFD_TXFQS_TFQP_Pos (16) /*!< CANFD_T::TXFQS: TFQP Position */ +#define CANFD_TXFQS_TFQP_Msk (0x1ful << CANFD_TXFQS_TFQP_Pos) /*!< CANFD_T::TXFQS: TFQP Mask */ + +#define CANFD_TXFQS_TFQF_Pos (21) /*!< CANFD_T::TXFQS: TFQF Position */ +#define CANFD_TXFQS_TFQF_Msk (0x1ul << CANFD_TXFQS_TFQF_Pos) /*!< CANFD_T::TXFQS: TFQF Mask */ + +#define CANFD_TXESC_TBDS_Pos (0) /*!< CANFD_T::TXESC: TBDS Position */ +#define CANFD_TXESC_TBDS_Msk (0x7ul << CANFD_TXESC_TBDS_Pos) /*!< CANFD_T::TXESC: TBDS Mask */ + +#define CANFD_TXBRP_TRPn_Pos (0) /*!< CANFD_T::TXBRP: TRPn Position */ +#define CANFD_TXBRP_TRPn_Msk (0xfffffffful << CANFD_TXBRP_TRPn_Pos) /*!< CANFD_T::TXBRP: TRPn Mask */ + +#define CANFD_TXBAR_ARn_Pos (0) /*!< CANFD_T::TXBAR: ARn Position */ +#define CANFD_TXBAR_ARn_Msk (0xfffffffful << CANFD_TXBAR_ARn_Pos) /*!< CANFD_T::TXBAR: ARn Mask */ + +#define CANFD_TXBCR_CRn_Pos (0) /*!< CANFD_T::TXBCR: CRn Position */ +#define CANFD_TXBCR_CRn_Msk (0xfffffffful << CANFD_TXBCR_CRn_Pos) /*!< CANFD_T::TXBCR: CRn Mask */ + +#define CANFD_TXBTO_TOn_Pos (0) /*!< CANFD_T::TXBTO: TOn Position */ +#define CANFD_TXBTO_TOn_Msk (0xfffffffful << CANFD_TXBTO_TOn_Pos) /*!< CANFD_T::TXBTO: TOn Mask */ + +#define CANFD_TXBCF_CFn_Pos (0) /*!< CANFD_T::TXBCF: CFn Position */ +#define CANFD_TXBCF_CFn_Msk (0xfffffffful << CANFD_TXBCF_CFn_Pos) /*!< CANFD_T::TXBCF: CFn Mask */ + +#define CANFD_TXBTIE_TIEn_Pos (0) /*!< CANFD_T::TXBTIE: TIEn Position */ +#define CANFD_TXBTIE_TIEn_Msk (0xfffffffful << CANFD_TXBTIE_TIEn_Pos) /*!< CANFD_T::TXBTIE: TIEn Mask */ + +#define CANFD_TXBCIE_CFIEn_Pos (0) /*!< CANFD_T::TXBCIE: CFIEn Position */ +#define CANFD_TXBCIE_CFIEn_Msk (0xfffffffful << CANFD_TXBCIE_CFIEn_Pos) /*!< CANFD_T::TXBCIE: CFIEn Mask */ + +#define CANFD_TXEFC_EFSA_Pos (2) /*!< CANFD_T::TXEFC: EFSA Position */ +#define CANFD_TXEFC_EFSA_Msk (0x3ffful << CANFD_TXEFC_EFSA_Pos) /*!< CANFD_T::TXEFC: EFSA Mask */ + +#define CANFD_TXEFC_EFS_Pos (16) /*!< CANFD_T::TXEFC: EFS Position */ +#define CANFD_TXEFC_EFS_Msk (0x3ful << CANFD_TXEFC_EFS_Pos) /*!< CANFD_T::TXEFC: EFS Mask */ + +#define CANFD_TXEFC_EFWN_Pos (24) /*!< CANFD_T::TXEFC: EFWN Position */ +#define CANFD_TXEFC_EFWN_Msk (0x3ful << CANFD_TXEFC_EFWN_Pos) /*!< CANFD_T::TXEFC: EFWN Mask */ + +#define CANFD_TXEFS_EFFL_Pos (0) /*!< CANFD_T::TXEFS: EFFL Position */ +#define CANFD_TXEFS_EFFL_Msk (0x3ful << CANFD_TXEFS_EFFL_Pos) /*!< CANFD_T::TXEFS: EFFL Mask */ + +#define CANFD_TXEFS_EFG_Pos (8) /*!< CANFD_T::TXEFS: EFG Position */ +#define CANFD_TXEFS_EFG_Msk (0x1ful << CANFD_TXEFS_EFG_Pos) /*!< CANFD_T::TXEFS: EFG Mask */ + +#define CANFD_TXEFS_EFP_Pos (16) /*!< CANFD_T::TXEFS: EFP Position */ +#define CANFD_TXEFS_EFP_Msk (0x1ful << CANFD_TXEFS_EFP_Pos) /*!< CANFD_T::TXEFS: EFP Mask */ + +#define CANFD_TXEFS_EFF_Pos (24) /*!< CANFD_T::TXEFS: EFF Position */ +#define CANFD_TXEFS_EFF_Msk (0x1ul << CANFD_TXEFS_EFF_Pos) /*!< CANFD_T::TXEFS: EFF Mask */ + +#define CANFD_TXEFS_TEFL_Pos (25) /*!< CANFD_T::TXEFS: TEFL Position */ +#define CANFD_TXEFS_TEFL_Msk (0x1ul << CANFD_TXEFS_TEFL_Pos) /*!< CANFD_T::TXEFS: TEFL Mask */ + +#define CANFD_TXEFA_EFA_Pos (0) /*!< CANFD_T::TXEFA: EFA Position */ +#define CANFD_TXEFA_EFA_Msk (0x1ful << CANFD_TXEFA_EFA_Pos) /*!< CANFD_T::TXEFA: EFA Mask */ + +/**@}*/ /* CANFD_CONST */ +/**@}*/ /* end of CANFD register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __CANFD_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ccap_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ccap_reg.h new file mode 100644 index 0000000000..fc81bad940 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ccap_reg.h @@ -0,0 +1,453 @@ +/**************************************************************************//** + * @file ccap_reg.h + * @version V3.00 + * @brief CCAP register definition header file + * + * @copyright SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __CCAP_REG_H__ +#define __CCAP_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup CCAP Camera Capture Interface Controller (CCAP) + Memory Mapped Structure for CCAP Controller +@{ */ + + +typedef struct +{ + + + /** + * @var CCAP_T::CTL + * Offset: 0x00 Camera Capture Interface Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CCAPEN |Camera Capture Interface Enable Bit + * | | |0 = Camera Capture Interface Disabled. + * | | |1 = Camera Capture Interface Enabled. + * |[6] |PKTEN |Packet Output Enable Bit + * | | |0 = Packet output Disabled. + * | | |1 = Packet output Enabled. + * |[7] |MONO |Monochrome CMOS Sensor Select + * | | |0 = Color CMOS Sensor. + * | | |1 = Monochrome CMOS Sensor. The U/V components are ignored when the MONO is enabled. + * |[16] |SHUTTER |Camera Capture Interface Automatically Disable the Capture Interface After a Frame Had Been Captured + * | | |0 = Shutter Disabled. + * | | |1 = Shutter Enabled. + * |[17] |MY4_SWAP |Monochrome CMOS Sensor 4-bit Data Nibble Swap + * | | |0 = The 4-bit data input sequence: 1st Pixel is for 1st Nibble (1st pixel at MSB). + * | | |1 = The 4-bit data input sequence: 1st Pixel is for 2nd Nibble (1st pixel at LSB). + * |[18] |MY8_MY4 |Monochrome CMOS Sensor Data I/O Interface + * | | |0 = Monochrome CMOS sensor is by the 4-bit data I/O interface. + * | | |1 = Monochrome CMOS sensor is by the 8-bit data I/O interface. + * |[19] |Luma_Y_One|Color/Monochrome CMOS Sensor Luminance 8-bit Y to 1-bit Y Conversion + * | | |0 = Color/Monochrome CMOS sensor Luma-Y-One bit Disabled. + * | | |1 = Color/Monochrome CMOS sensor Luma-Y-One bit Enabled. + * | | |Note: Color CMOS sensor U/V components are ignored when the Luma_Y_One is enabled. + * |[20] |UPDATE |Update Register at New Frame + * | | |0 = Update register at new frame Disabled. + * | | |1 = Update register at new frame Enabled (Auto clear to 0 when register updated). + * |[24] |VPRST |Capture Interface Reset + * | | |0 = Capture interface reset Disabled. + * | | |1 = Capture interface reset Enabled. + * @var CCAP_T::PAR + * Offset: 0x04 Camera Capture Interface Parameter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |INFMT |Sensor Input Data Format + * | | |0 = YCbCr422. + * | | |1 = RGB565. + * |[1] |SENTYPE |Sensor Input Type + * | | |0 = CCIR601. + * | | |1 = CCIR656, VSync & Hsync embedded in the data signal. + * |[3:2] |INDATORD |Sensor Input Data Order + * | | |If INFMT (CCAP_PAR[0]) = 0 (YCbCr): + * | | |00 = Sensor input data (Byte 0 1 2 3) is Y0 U0 Y1 V0. + * | | |01 = Sensor input data (Byte 0 1 2 3) is Y0 V0 Y1 U0. + * | | |10 = Sensor input data (Byte 0 1 2 3) is U0 Y0 V0 Y1. + * | | |11 = Sensor input data (Byte 0 1 2 3) is V0 Y0 U0 Y1. + * | | |If INFMT (CCAP_PAR[0]) = 1 (RGB565): + * | | |00 = Sensor input data (Byte 0) is {R[4:0],G[5:3]}. Sensor input data (Byte 1) is {G[2:0], B[4:0]}. + * | | |01 = Sensor input data (Byte 0) is {B[4:0],G[5:3]}. Sensor input data (Byte 1) is {G[2:0], R[4:0]}. + * | | |10 = Sensor input data (Byte 0) is {G[2:0],B[4:0]}. Sensor input data (Byte 1) is {R[4:0], G[5:3]}. + * | | |11 = Sensor input data (Byte 0) is {G[2:0],R[4:0]}. Sensor input data (Byte 1) is {B[4:0], G[5:3]}. + * |[5:4] |OUTFMT |Image Data Format Output to System Memory + * | | |00 = YCbCr422. + * | | |01 = Only output Y. (Select this format when CCAP_CTL "Luma_Y_One" or "MONO" enabled). + * | | |10 = RGB555. + * | | |11 = RGB565. + * |[6] |RANGE |Scale Input YUV CCIR601 Color Range to Full Range + * | | |0 = Default. + * | | |1 = Scale to full range. + * |[8] |PCLKP |Sensor Pixel Clock Polarity + * | | |0 = Input video data and signals are latched by falling edge of Pixel Clock. + * | | |1 = Input video data and signals are latched by rising edge of Pixel Clock. + * |[9] |HSP |Sensor Hsync Polarity + * | | |0 = Sync Low. + * | | |1 = Sync High. + * |[10] |VSP |Sensor Vsync Polarity + * | | |0 = Sync Low. + * | | |1 = Sync High. + * |[18] |FBB |Field by Blank + * | | |Field by Blank (only in ccir-656 mode) means blanking pixel data(0x80108010) have to transfer to system memory or not. + * | | |0 = Field by blank Disabled. (blank pixel data will transfer to system memory). + * | | |1 = Field by blank Enabled. (only active data will transfer to system memory). + * @var CCAP_T::INT + * Offset: 0x08 Camera Capture Interface Interrupt Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |VINTF |Video Frame End Interrupt + * | | |0 = Did not receive a frame completely. + * | | |1 = Received a frame completely. + * | | |Note: This bit is cleared by writing 1 to it. + * |[1] |MEINTF |Bus Master Transfer Error Interrupt + * | | |0 = Transfer Error did not occur. + * | | |1 = Transfer Error occurred. + * | | |Note: This bit is cleared by writing 1 to it. + * |[3] |ADDRMINTF |Memory Address Match Interrupt + * | | |0 = Memory Address Match Interrupt did not occur. + * | | |1 = Memory Address Match Interrupt occurred. + * | | |Note: This bit is cleared by writing 1 to it. + * |[16] |VIEN |Video Frame End Interrupt Enable Bit + * | | |0 = Video frame end interrupt Disabled. + * | | |1 = Video frame end interrupt Enabled. + * |[17] |MEIEN |Bus Master Transfer Error Interrupt Enable Bit + * | | |0 = Bus Master Transfer error interrupt Disabled. + * | | |1 = Bus Master Transfer error interrupt Enabled. + * |[19] |ADDRMIEN |Memory Address Match Interrupt Enable Bit + * | | |0 = Memory address match interrupt Disabled. + * | | |1 = Memory address match interrupt Enabled. + * @var CCAP_T::CWSP + * Offset: 0x20 Cropping Window Starting Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |CWSADDRH |Cropping Window Horizontal Starting Address + * | | |Specify the value of the cropping window horizontal start address. + * |[26:16] |CWSADDRV |Cropping Window Vertical Starting Address + * | | |Specify the value of the cropping window vertical start address. + * @var CCAP_T::CWS + * Offset: 0x24 Cropping Window Size Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |CWW |Cropping Window Width + * | | |Specify the size of the cropping window width. + * |[26:16] |CWH |Cropping Window Height + * | | |Specify the size of the cropping window height. + * @var CCAP_T::PKTSL + * Offset: 0x28 Packet Scaling Vertical/Horizontal Factor Register (LSB) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |PKTSHML |Packet Scaling Horizontal Factor M + * | | |Specifies the lower 8-bit of denominator part (M) of the horizontal scaling factor. + * | | |The lower 8-bit will be cascaded with higher 8-bit (PKDSHMH) to form a 16-bit denominator (M) of vertical factor. + * | | |The output image width will be equal to the image width * N/M. + * | | |Note: The value of N must be equal to or less than M. + * |[15:8] |PKTSHNL |Packet Scaling Horizontal Factor N + * | | |Specify the lower 8-bit of numerator part (N) of the horizontal scaling factor. + * | | |The lower 8-bit will be cascaded with higher 8-bit (PKDSHNH) to form a 16-bit numerator of horizontal factor. + * |[23:16] |PKTSVML |Packet Scaling Vertical Factor M + * | | |Specify the lower 8-bit of denominator part (M) of the vertical scaling factor. + * | | |The lower 8-bit will be cascaded with higher 8-bit (PKDSVMH) to form a 16-bit denominator (M) of vertical factor. + * | | |The output image width will be equal to the image height * N/M. + * | | |Note: The value of N must be equal to or less than M. + * |[31:24] |PKTSVNL |Packet Scaling Vertical Factor N + * | | |Specify the lower 8-bit of numerator part (N) of the vertical scaling factor. + * | | |The lower 8-bit will be cascaded with higher 8-bit (PKDSVNH) to form a 16-bit numerator of vertical factor. + * @var CCAP_T::FRCTL + * Offset: 0x30 Scaling Frame Rate Factor Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |FRM |Scaling Frame Rate Factor M + * | | |Specify the denominator part (M) of the frame rate scaling factor. + * | | |The output image frame rate will be equal to input image frame rate * (N/M). + * | | |Note: The value of N must be equal to or less than M. + * |[13:8] |FRN |Scaling Frame Rate Factor N + * | | |Specify the numerator part (N) of the frame rate scaling factor. + * @var CCAP_T::STRIDE + * Offset: 0x34 Frame Output Pixel Stride Width Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[13:0] |PKTSTRIDE |Packet Frame Output Pixel Stride Width + * | | |The output pixel stride size of packet pipe. + * | | |It is a 32-pixel aligned stride width for the Luma-Y-One bit format or a 4-pixel aligned stride with for the Luma-Y-Eight bit format when color or monochrome CMOS sensors used. + * | | |This means that every new captured line is by word alignment address when color or monochrome CMOS sensors used. + * @var CCAP_T::FIFOTH + * Offset: 0x3C FIFO Threshold Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[28:24] |PKTFTH |Packet FIFO Threshold + * | | |Specify the 5-bit value of the packet FIFO threshold. + * |[31] |OVF |FIFO Overflow Flag + * | | |Indicate the FIFO overflow flag. + * @var CCAP_T::CMPADDR + * Offset: 0x40 Compare Memory Base Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CMPADDR |Compare Memory Base Address + * | | |It is a word alignment address, that is, the address is aligned by ignoring the 2 LSB bits [1:0]. + * @var CCAP_T::LUMA_Y1_THD + * Offset: 0x44 Luminance Y8 to Y1 Threshold Value Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :-----------: | :---- | + * |[7:0] |LUMA_Y1_THRESH |Luminance Y8 to Y1 Threshold Value + * | | |Specify the 8-bit threshold value for the luminance Y bit-8 to the luminance Y 1-bit conversion. + * @var CCAP_T::PKTSM + * Offset: 0x48 Packet Scaling Vertical/Horizontal Factor Register (MSB) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |PKTSHMH |Packet Scaling Horizontal Factor M + * | | |Specify the higher 8-bit of denominator part (M) of the horizontal scaling factor. + * | | |Please refer to the register CCAP_PKTSL for the detailed operation. + * |[15:8] |PKTSHNH |Packet Scaling Horizontal Factor N + * | | |Specify the higher 8-bit of numerator part (N) of the horizontal scaling factor. + * | | |Please refer to the register CCAP_PKTSL for the detailed operation. + * |[23:16] |PKTSVMH |Packet Scaling Vertical Factor M + * | | |Specify the higher 8-bit of denominator part (M) of the vertical scaling factor. + * | | |Please refer to the register CCAP_PKTSL to check the cooperation between these two registers. + * |[31:24] |PKTSVNH |Packet Scaling Vertical Factor N + * | | |Specify the higher 8-bit of numerator part (N) of the vertical scaling factor. + * | | |Please refer to the register CCAP_PKTSL to check the cooperation between these two registers. + * @var CCAP_T::CURADDRP + * Offset: 0x50 Current Packet System Memory Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURADDR |Current Packet Output Memory Address + * | | |Specify the 32-bit value of the current packet output memory address. + * @var CCAP_T::PKTBA0 + * Offset: 0x60 System Memory Packet Base Address 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |BASEADDR |System Memory Packet Base Address 0 + * | | |It is a word alignment address, that is, the address is aligned by ignoring the 2 LSB bits [1:0]. + */ + __IO uint32_t CTL; /*!< [0x0000] Camera Capture Interface Control Register */ + __IO uint32_t PAR; /*!< [0x0004] Camera Capture Interface Parameter Register */ + __IO uint32_t INT; /*!< [0x0008] Camera Capture Interface Interrupt Register */ + __I uint32_t RESERVE0[5]; + __IO uint32_t CWSP; /*!< [0x0020] Cropping Window Starting Address Register */ + __IO uint32_t CWS; /*!< [0x0024] Cropping Window Size Register */ + __IO uint32_t PKTSL; /*!< [0x0028] Packet Scaling Vertical/Horizontal Factor Register (LSB) */ + __IO uint32_t PLNSL; /*!< [0x002C] Planar Scaling Vertical/Horizontal Factor Register (LSB) */ + __IO uint32_t FRCTL; /*!< [0x0030] Scaling Frame Rate Factor Register */ + __IO uint32_t STRIDE; /*!< [0x0034] Frame Output Pixel Stride Width Register */ + __I uint32_t RESERVE1[1]; + __IO uint32_t FIFOTH; /*!< [0x003C] FIFO Threshold Register */ + __IO uint32_t CMPADDR; /*!< [0x0040] Compare Memory Base Address Register */ + __IO uint32_t LUMA_Y1_THD; /*!< [0x0044] Luminance Y8 to Y1 Threshold Value Register */ + __IO uint32_t PKTSM; /*!< [0x0048] Packet Scaling Vertical/Horizontal Factor Register (MSB) */ + __IO uint32_t PLNSM; /*!< [0x004C] Planar Scaling Vertical/Horizontal Factor Register (MSB) */ + __I uint32_t CURADDRP; /*!< [0x0050] Current Packet System Memory Address Register */ + __I uint32_t CURADDRY; /*!< [0x0054] Current Planar Y System Memory Address Register */ + __I uint32_t CURADDRU; /*!< [0x0058] Current Planar U System Memory Address Register */ + __I uint32_t CURADDRV; /*!< [0x005C] Current Planar V System Memory Address Register */ + __IO uint32_t PKTBA0; /*!< [0x0060] System Memory Packet Base Address 0 Register */ + __I uint32_t RESERVE4[7]; + __IO uint32_t YBA; /*!< [0x0080] System Memory Planar Y Base Address Register */ + __IO uint32_t UBA; /*!< [0x0084] System Memory Planar U Base Address Register */ + __IO uint32_t VBA; /*!< [0x0088] System Memory Planar V Base Address Register */ +} CCAP_T; + +/** + @addtogroup CCAP_CONST CCAP Bit Field Definition + Constant Definitions for CCAP Controller +@{ */ + +#define CCAP_CTL_CCAPEN_Pos (0) /*!< CCAP_T::CTL: CCAPEN Position */ +#define CCAP_CTL_CCAPEN_Msk (0x1ul << CCAP_CTL_CCAPEN_Pos) /*!< CCAP_T::CTL: CCAPEN Mask */ + +#define CCAP_CTL_PLNEN_Pos (5) /*!< CCAP_T::CTL: PLNEN Position */ +#define CCAP_CTL_PLNEN_Msk (0x1ul << CCAP_CTL_PLNEN_Pos) /*!< CCAP_T::CTL: PLNEN Mask */ + +#define CCAP_CTL_PKTEN_Pos (6) /*!< CCAP_T::CTL: PKTEN Position */ +#define CCAP_CTL_PKTEN_Msk (0x1ul << CCAP_CTL_PKTEN_Pos) /*!< CCAP_T::CTL: PKTEN Mask */ + +#define CCAP_CTL_MONO_Pos (7) /*!< CCAP_T::CTL: MONO Position */ +#define CCAP_CTL_MONO_Msk (0x1ul << CCAP_CTL_MONO_Pos) /*!< CCAP_T::CTL: MONO Mask */ + +#define CCAP_CTL_SHUTTER_Pos (16) /*!< CCAP_T::CTL: SHUTTER Position */ +#define CCAP_CTL_SHUTTER_Msk (0x1ul << CCAP_CTL_SHUTTER_Pos) /*!< CCAP_T::CTL: SHUTTER Mask */ + +#define CCAP_CTL_MY4_SWAP_Pos (17) /*!< CCAP_T::CTL: MY4_SWAP Position */ +#define CCAP_CTL_MY4_SWAP_Msk (0x1ul << CCAP_CTL_MY4_SWAP_Pos) /*!< CCAP_T::CTL: MY4_SWAP Mask */ + +#define CCAP_CTL_MY8_MY4_Pos (18) /*!< CCAP_T::CTL: MY8_MY4 Position */ +#define CCAP_CTL_MY8_MY4_Msk (0x1ul << CCAP_CTL_MY8_MY4_Pos) /*!< CCAP_T::CTL: MY8_MY4 Mask */ + +#define CCAP_CTL_Luma_Y_One_Pos (19) /*!< CCAP_T::CTL: Luma_Y_One Position */ +#define CCAP_CTL_Luma_Y_One_Msk (0x1ul << CCAP_CTL_Luma_Y_One_Pos) /*!< CCAP_T::CTL: Luma_Y_One Mask */ + +#define CCAP_CTL_UPDATE_Pos (20) /*!< CCAP_T::CTL: UPDATE Position */ +#define CCAP_CTL_UPDATE_Msk (0x1ul << CCAP_CTL_UPDATE_Pos) /*!< CCAP_T::CTL: UPDATE Mask */ + +#define CCAP_CTL_VPRST_Pos (24) /*!< CCAP_T::CTL: VPRST Position */ +#define CCAP_CTL_VPRST_Msk (0x1ul << CCAP_CTL_VPRST_Pos) /*!< CCAP_T::CTL: VPRST Mask */ + +#define CCAP_PAR_INFMT_Pos (0) /*!< CCAP_T::PAR: INFMT Position */ +#define CCAP_PAR_INFMT_Msk (0x1ul << CCAP_PAR_INFMT_Pos) /*!< CCAP_T::PAR: INFMT Mask */ + +#define CCAP_PAR_SENTYPE_Pos (1) /*!< CCAP_T::PAR: SENTYPE Position */ +#define CCAP_PAR_SENTYPE_Msk (0x1ul << CCAP_PAR_SENTYPE_Pos) /*!< CCAP_T::PAR: SENTYPE Mask */ + +#define CCAP_PAR_INDATORD_Pos (2) /*!< CCAP_T::PAR: INDATORD Position */ +#define CCAP_PAR_INDATORD_Msk (0x3ul << CCAP_PAR_INDATORD_Pos) /*!< CCAP_T::PAR: INDATORD Mask */ + +#define CCAP_PAR_PLNFMT_Pos (7) /*!< CCAP_T::PAR: OUTFMT Position */ +#define CCAP_PAR_PLNFMT_Msk (0x1ul << CCAP_PAR_OUTFMT_Pos) /*!< CCAP_T::PAR: OUTFMT Mask */ + +#define CCAP_PAR_OUTFMT_Pos (4) /*!< CCAP_T::PAR: OUTFMT Position */ +#define CCAP_PAR_OUTFMT_Msk (0x3ul << CCAP_PAR_OUTFMT_Pos) /*!< CCAP_T::PAR: OUTFMT Mask */ + +#define CCAP_PAR_RANGE_Pos (6) /*!< CCAP_T::PAR: RANGE Position */ +#define CCAP_PAR_RANGE_Msk (0x1ul << CCAP_PAR_RANGE_Pos) /*!< CCAP_T::PAR: RANGE Mask */ + +#define CCAP_PAR_PCLKP_Pos (8) /*!< CCAP_T::PAR: PCLKP Position */ +#define CCAP_PAR_PCLKP_Msk (0x1ul << CCAP_PAR_PCLKP_Pos) /*!< CCAP_T::PAR: PCLKP Mask */ + +#define CCAP_PAR_HSP_Pos (9) /*!< CCAP_T::PAR: HSP Position */ +#define CCAP_PAR_HSP_Msk (0x1ul << CCAP_PAR_HSP_Pos) /*!< CCAP_T::PAR: HSP Mask */ + +#define CCAP_PAR_VSP_Pos (10) /*!< CCAP_T::PAR: VSP Position */ +#define CCAP_PAR_VSP_Msk (0x1ul << CCAP_PAR_VSP_Pos) /*!< CCAP_T::PAR: VSP Mask */ + +#define CCAP_PAR_FBB_Pos (18) /*!< CCAP_T::PAR: FBB Position */ +#define CCAP_PAR_FBB_Msk (0x1ul << CCAP_PAR_FBB_Pos) /*!< CCAP_T::PAR: FBB Mask */ + +#define CCAP_INT_VINTF_Pos (0) /*!< CCAP_T::INT: VINTF Position */ +#define CCAP_INT_VINTF_Msk (0x1ul << CCAP_INT_VINTF_Pos) /*!< CCAP_T::INT: VINTF Mask */ + +#define CCAP_INT_MEINTF_Pos (1) /*!< CCAP_T::INT: MEINTF Position */ +#define CCAP_INT_MEINTF_Msk (0x1ul << CCAP_INT_MEINTF_Pos) /*!< CCAP_T::INT: MEINTF Mask */ + +#define CCAP_INT_ADDRMINTF_Pos (3) /*!< CCAP_T::INT: ADDRMINTF Position */ +#define CCAP_INT_ADDRMINTF_Msk (0x1ul << CCAP_INT_ADDRMINTF_Pos) /*!< CCAP_T::INT: ADDRMINTF Mask */ + +#define CCAP_INT_VIEN_Pos (16) /*!< CCAP_T::INT: VIEN Position */ +#define CCAP_INT_VIEN_Msk (0x1ul << CCAP_INT_VIEN_Pos) /*!< CCAP_T::INT: VIEN Mask */ + +#define CCAP_INT_MEIEN_Pos (17) /*!< CCAP_T::INT: MEIEN Position */ +#define CCAP_INT_MEIEN_Msk (0x1ul << CCAP_INT_MEIEN_Pos) /*!< CCAP_T::INT: MEIEN Mask */ + +#define CCAP_INT_ADDRMIEN_Pos (19) /*!< CCAP_T::INT: ADDRMIEN Position */ +#define CCAP_INT_ADDRMIEN_Msk (0x1ul << CCAP_INT_ADDRMIEN_Pos) /*!< CCAP_T::INT: ADDRMIEN Mask */ + +#define CCAP_CWSP_CWSADDRH_Pos (0) /*!< CCAP_T::CWSP: CWSADDRH Position */ +#define CCAP_CWSP_CWSADDRH_Msk (0xffful << CCAP_CWSP_CWSADDRH_Pos) /*!< CCAP_T::CWSP: CWSADDRH Mask */ + +#define CCAP_CWSP_CWSADDRV_Pos (16) /*!< CCAP_T::CWSP: CWSADDRV Position */ +#define CCAP_CWSP_CWSADDRV_Msk (0x7fful << CCAP_CWSP_CWSADDRV_Pos) /*!< CCAP_T::CWSP: CWSADDRV Mask */ + +#define CCAP_CWS_CWW_Pos (0) /*!< CCAP_T::CWS: CWW Position */ +#define CCAP_CWS_CWW_Msk (0xffful << CCAP_CWS_CWW_Pos) /*!< CCAP_T::CWS: CWW Mask */ + +#define CCAP_CWS_CWH_Pos (16) /*!< CCAP_T::CWS: CIWH Position */ +#define CCAP_CWS_CWH_Msk (0x7fful << CCAP_CWS_CWH_Pos) /*!< CCAP_T::CWS: CIWH Mask */ + +#define CCAP_PKTSL_PKTSHML_Pos (0) /*!< CCAP_T::PKTSL: PKTSHML Position */ +#define CCAP_PKTSL_PKTSHML_Msk (0xfful << CCAP_PKTSL_PKTSHML_Pos) /*!< CCAP_T::PKTSL: PKTSHML Mask */ + +#define CCAP_PKTSL_PKTSHNL_Pos (8) /*!< CCAP_T::PKTSL: PKTSHNL Position */ +#define CCAP_PKTSL_PKTSHNL_Msk (0xfful << CCAP_PKTSL_PKTSHNL_Pos) /*!< CCAP_T::PKTSL: PKTSHNL Mask */ + +#define CCAP_PKTSL_PKTSVML_Pos (16) /*!< CCAP_T::PKTSL: PKTSVML Position */ +#define CCAP_PKTSL_PKTSVML_Msk (0xfful << CCAP_PKTSL_PKTSVML_Pos) /*!< CCAP_T::PKTSL: PKTSVML Mask */ + +#define CCAP_PKTSL_PKTSVNL_Pos (24) /*!< CCAP_T::PKTSL: PKTSVNL Position */ +#define CCAP_PKTSL_PKTSVNL_Msk (0xfful << CCAP_PKTSL_PKTSVNL_Pos) /*!< CCAP_T::PKTSL: PKTSVNL Mask */ + +#define CCAP_PLNSL_PLNSHML_Pos (0) /*!< CCAP_T::PLNSL: PLNSHML Position */ +#define CCAP_PLNSL_PLNSHML_Msk (0xfful << CCAP_PLNSL_PLNSHML_Pos) /*!< CCAP_T::PLNSL: PLNSHML Mask */ + +#define CCAP_PLNSL_PLNSHNL_Pos (8) /*!< CCAP_T::PLNSL: PLNSHNL Position */ +#define CCAP_PLNSL_PLNSHNL_Msk (0xfful << CCAP_PLNSL_PLNSHNL_Pos) /*!< CCAP_T::PLNSL: PLNSHNL Mask */ + +#define CCAP_PLNSL_PLNSVML_Pos (16) /*!< CCAP_T::PLNSL: PLNSVML Position */ +#define CCAP_PLNSL_PLNSVML_Msk (0xfful << CCAP_PLNSL_PLNSVML_Pos) /*!< CCAP_T::PLNSL: PLNSVML Mask */ + +#define CCAP_PLNSL_PLNSVNL_Pos (24) /*!< CCAP_T::PLNSL: PLNSVNL Position */ +#define CCAP_PLNSL_PLNSVNL_Msk (0xfful << CCAP_PLNSL_PLNSVNL_Pos) /*!< CCAP_T::PLNSL: PLNSVNL Mask */ + +#define CCAP_FRCTL_FRM_Pos (0) /*!< CCAP_T::FRCTL: FRM Position */ +#define CCAP_FRCTL_FRM_Msk (0x3ful << CCAP_FRCTL_FRM_Pos) /*!< CCAP_T::FRCTL: FRM Mask */ + +#define CCAP_FRCTL_FRN_Pos (8) /*!< CCAP_T::FRCTL: FRN Position */ +#define CCAP_FRCTL_FRN_Msk (0x3ful << CCAP_FRCTL_FRN_Pos) /*!< CCAP_T::FRCTL: FRN Mask */ + +#define CCAP_STRIDE_PKTSTRIDE_Pos (0) /*!< CCAP_T::STRIDE: PKTSTRIDE Position */ +#define CCAP_STRIDE_PKTSTRIDE_Msk (0x3ffful << CCAP_STRIDE_PKTSTRIDE_Pos) /*!< CCAP_T::STRIDE: PKTSTRIDE Mask */ + +#define CCAP_STRIDE_PLNSTRIDE_Pos (16) /*!< CCAP_T::STRIDE: PLNSTRIDE Position */ +#define CCAP_STRIDE_PLNSTRIDE_Msk (0x3ffful << CCAP_STRIDE_PLNSTRIDE_Pos) /*!< CCAP_T::STRIDE: PLNSTRIDE Mask */ + +#define CCAP_FIFOTH_PKTFTH_Pos (24) /*!< CCAP_T::FIFOTH: PKTFTH Position */ +#define CCAP_FIFOTH_PKTFTH_Msk (0x1ful << CCAP_FIFOTH_PKTFTH_Pos) /*!< CCAP_T::FIFOTH: PKTFTH Mask */ + +#define CCAP_FIFOTH_OVF_Pos (31) /*!< CCAP_T::FIFOTH: OVF Position */ +#define CCAP_FIFOTH_OVF_Msk (0x1ul << CCAP_FIFOTH_OVF_Pos) /*!< CCAP_T::FIFOTH: OVF Mask */ + +#define CCAP_CMPADDR_CMPADDR_Pos (0) /*!< CCAP_T::CMPADDR: CMPADDR Position */ +#define CCAP_CMPADDR_CMPADDR_Msk (0xfffffffful << CCAP_CMPADDR_CMPADDR_Pos) /*!< CCAP_T::CMPADDR: CMPADDR Mask */ + +#define CCAP_PKTSM_PKTSHMH_Pos (0) /*!< CCAP_T::PKTSM: PKTSHMH Position */ +#define CCAP_PKTSM_PKTSHMH_Msk (0xfful << CCAP_PKTSM_PKTSHMH_Pos) /*!< CCAP_T::PKTSM: PKTSHMH Mask */ + +#define CCAP_PKTSM_PKTSHNH_Pos (8) /*!< CCAP_T::PKTSM: PKTSHNH Position */ +#define CCAP_PKTSM_PKTSHNH_Msk (0xfful << CCAP_PKTSM_PKTSHNH_Pos) /*!< CCAP_T::PKTSM: PKTSHNH Mask */ + +#define CCAP_PKTSM_PKTSVMH_Pos (16) /*!< CCAP_T::PKTSM: PKTSVMH Position */ +#define CCAP_PKTSM_PKTSVMH_Msk (0xfful << CCAP_PKTSM_PKTSVMH_Pos) /*!< CCAP_T::PKTSM: PKTSVMH Mask */ + +#define CCAP_PKTSM_PKTSVNH_Pos (24) /*!< CCAP_T::PKTSM: PKTSVNH Position */ +#define CCAP_PKTSM_PKTSVNH_Msk (0xfful << CCAP_PKTSM_PKTSVNH_Pos) /*!< CCAP_T::PKTSM: PKTSVNH Mask */ + +#define CCAP_PLNSM_PLNSHMH_Pos (0) /*!< CCAP_T::PLNSM: PLNSHMH Position */ +#define CCAP_PLNSM_PLNSHMH_Msk (0xfful << CCAP_PLNSM_PLNSHMH_Pos) /*!< CCAP_T::PLNSM: PLNSHMH Mask */ + +#define CCAP_PLNSM_PLNSHNH_Pos (8) /*!< CCAP_T::PLNSM: PLNSHNH Position */ +#define CCAP_PLNSM_PLNSHNH_Msk (0xfful << CCAP_PLNSM_PLNSHNH_Pos) /*!< CCAP_T::PLNSM: PLNSHNH Mask */ + +#define CCAP_PLNSM_PLNSVMH_Pos (16) /*!< CCAP_T::PLNSM: PLNSVMH Position */ +#define CCAP_PLNSM_PLNSVMH_Msk (0xfful << CCAP_PLNSM_PLNSVMH_Pos) /*!< CCAP_T::PLNSM: PLNSVMH Mask */ + +#define CCAP_PLNSM_PLNSVNH_Pos (24) /*!< CCAP_T::PLNSM: PLNSVNH Position */ +#define CCAP_PLNSM_PLNSVNH_Msk (0xfful << CCAP_PLNSM_PLNSVNH_Pos) /*!< CCAP_T::PLNSM: PLNSVNH Mask */ + +#define CCAP_CURADDRP_CURADDR_Pos (0) /*!< CCAP_T::CURADDRP: CURADDR Position */ +#define CCAP_CURADDRP_CURADDR_Msk (0xfffffffful << CCAP_CURADDRP_CURADDR_Pos) /*!< CCAP_T::CURADDRP: CURADDR Mask */ + +#define CCAP_PKTBA0_BASEADDR_Pos (0) /*!< CCAP_T::PKTBA0: BASEADDR Position */ +#define CCAP_PKTBA0_BASEADDR_Msk (0xfffffffful << CCAP_PKTBA0_BASEADDR_Pos) /*!< CCAP_T::PKTBA0: BASEADDR Mask */ + +/**@}*/ /* CCAP_CONST */ +/**@}*/ /* end of CCAP register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __CCAP_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/clk_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/clk_reg.h new file mode 100644 index 0000000000..96a6945de9 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/clk_reg.h @@ -0,0 +1,2596 @@ +/**************************************************************************//** + * @file clk_reg.h + * @brief CLK register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __CLK_REG_H__ +#define __CLK_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +typedef struct +{ + /** + * @var PLL_T::CTL0 + * Offset: 0x0 PLL Control Register 0(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |FBDIV |PLL Feedback Divider Control (Write Protect) + * | | |Set the feedback divider factor (N) from 16 to 2047. + * | | |The N = FBDIV[10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[17:12] |INDIV |PLL Reference Input Divider Control (Write Protect) + * | | |Set the reference divider factor (M) from 1 to 63. + * | | |The M = INDIV[5:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[19:18] |MODE |Operation Mode Selection(Write Protect) + * | | |00 = Integer mode. + * | | |In this mode, the rising edges of the two clocks at the input of PFD are phase aligned + * | | |And the output clock frequency is at multiples of the input clock frequency contingent on the configuration of OUTDIV, INDIV and FBDIV. + * | | |01 = Fractional mode. + * | | |This mode is suitable for applications which need small output frequency steps, like 20 kHz + * | | |The jitter performance in this mode may be worse than in Integer Mode. + * | | |In this mode, the output clock frequency is at the fractional multiples of the input clock frequency + * | | |By setting the control pins FRAC [23:0], a small output frequency step is achieved.. + * | | |10 = Spread Spectrum Mode. + * | | |This mode is suitable for In this mode the output frequency of PLL will be modulated by triangle wave + * | | |It is for EMI consideration. + * | | |By setting SSRATE [10:0] and SLOPE [23:0], the modulation index and the modulation frequency can be programmed. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[30:20] |SSRATE |Spreading Frequency Control (Write Protect) + * | | |Set the spread step factor SSRATE from 0 to 2047, + * | | |SSRATE = SSRATE [10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var PLL_T::CTL1 + * Offset: 0x4 PLL Control Register 1(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PD |Power-down Mode (Write Protect) + * | | |0 = PLL is enable (in normal mode). + * | | |1 = PLL is disable (in Power-down mode) (default). + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[1] |BP |PLL Bypass Control (Write Protect) + * | | |0 = PLL is in normal mode (default). + * | | |1 = PLL clock output is same as PLL input clock Fref. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[6:4] |OUTDIV |PLL Output Divider Control (Write Protect) + * | | |Set the output divider factor (P) from 1 to 7. + * | | |P = OUTDIV[2:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[31:8] |FRAC |PLL Fractional Portion of DN Value (Write Protect) + * | | |Set the fraction part (X) of Fractional Portion of DN Value factor. + * | | |The X = FRAC[23:0] / 224. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var PLL_T::CTL2 + * Offset: 0x8 PLL Control Register 2(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |SLOPE |PLL Stable Counter Selection (Write Protect) + * | | |Set the spread step factor SLOPE from 0 to 16777215, + * | | |SLOPE = SLOPE[23:0]. + * | | |Note 1: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var PLL_T::RESERVE + * Offset: 0xC + * --------------------------------------------------------------------------------------------------- + */ + __IO uint32_t CTL0; /*!< [0x0000] PLL Control Register 0 of PLL Channel n.(Write Protect) */ + __IO uint32_t CTL1; /*!< [0x0004] PLL Control Register 1 of PLL Channel n.(Write Protect) */ + __IO uint32_t CTL2; /*!< [0x0008] PLL Control Register 2 of PLL Channel n.(Write Protect) */ + __IO uint32_t RESERVE; /*!< [0x000c] Reserved */ + +} PLL_T; + +/** + @addtogroup CLK System Clock Controller(CLK) + Memory Mapped Structure for CLK Controller +@{ */ + +typedef struct +{ + + + /** + * @var CLK_T::PWRCTL + * Offset: 0x00 System Power-down Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |HXTEN |HXT Enable Bit (Write Protect) + * | | |0 = 24 MHz external high speed crystal (HXT) Disabled. + * | | |1 = 24 MHz external high speed crystal (HXT) Enabled. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: HXT cannot be disabled and HXTEN will always read as 1 if HCLK clock source is selected from HXT or PLL (clock source from HXT). + * |[1] |LXTEN |LXT Enable Bit (Write Protect) + * | | |0 = 32.768 kHz external low speed crystal (external LXT) Disabled. + * | | |1 = 32.768 kHz external low speed crystal (external LXT) Enabled. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: LXT cannot be disabled and LXTEN will always read as 1 if HCLK clock source is selected from LXT when the LXT clock source is selected as external LXT by setting C32KS(RTC_LXTCTL[6]) to 1. + * |[2] |HIRCEN |HIRC Enable Bit (Write Protect) + * | | |The HCLK default clock source is from HIRC and this bit default value is 1. + * | | |0 = 12 MHz internal high speed RC oscillator (HIRC) Disabled. + * | | |1 = 12 MHz internal high speed RC oscillator (HIRC) Enabled. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: HIRC cannot be disabled and HIRCEN will always read as 1 if HXTFQIEN or is set. + * |[3] |LIRCEN |LIRC Enable Bit (Write Protect) + * | | |0 = 32 kHz internal low speed RC oscillator (LIRC) Disabled. + * | | |1 = 32 kHz internal low speed RC oscillator (LIRC) Enabled. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[10] |HXTDS |HXT Drive Current Strength (Write Protect) + * | | |0 = Lower power consumption requirement for 2.5V~3.3V I/O power application. + * | | |1 = higher noise immunity requirement for 2.5V~3.3V I/O power application.(default) + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[11] |SYSPLLAPD |SYSPLL Auto Power Down Option when CA35 & RTP-M4 are Power Down (Write Protect) + * | | |0 = When CA35 and RTP-M4 are both in WFI, the PD pin of SYS-PLL is the same as CLK_PLL2CTL1[0]. + * | | |1 = When CA35 and RTP-M4 are both in WFI, set the PD pin of SYS-PLL to high automatically. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: This bit only works when the CA35 and RTP-M4 are not both in Power-down mode + * | | |If one of RTP-M4 and CA35 is not in Power-down mode, the PLL PD pin status is the controlled by CLK_PLL1CTL1[0]. + * |[12] |CAPLLAPD |CAPLL Auto Power Down Option when CA35 is Power Gating (Write Protect) + * | | |0 = When CA35 core power is not ready, the PD pin of CA-PLL is the same as CLK_PLL0CTL1[0]. + * | | |1 = When CA35 core power is not ready, set the PD pin of CA-PLL to high automatically. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: This bit only works when the CA35 core power is not ready + * | | |If CA35 core power is ready, the PLL PD pin status is the controlled by CLK_PLL0CTL1[0]. + * |[13] |DDRPLLAPD |DDRPLL Auto Power Down Option when CA35 is Power Gating (Write Protect) + * | | |0 = When CA35 core power is not ready, the PD pin of DDR-PLL is the same as CLK_PLL2CTL1[0]. + * | | |1 = When CA35 core power is not ready, set the PD pin of DDR-PLL to high automatically. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: This bit only works when the CA35 core power is not ready + * | | |If CA35 core power is ready, the PLL PD pin status is the controlled by CLK_PLL2CTL1[0]. + * |[14] |HXTAOFF |HXT Auto Off Option when CA35 is Power Gating (Write Protect) + * | | |0 = When CA35 core power is not ready, the HXT enable bit is the same as CLK_PWRCTL[0]. + * | | |1 = When CA35 core power is not ready, switch the HXT enable bit to low automatically. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: This bit only works when the CA35 core power is not ready + * | | |If CA35 core power is ready, the HXT enable bit is the controlled by CLK_PWRCTL[0]. + * |[15] |HIRCAOFF |HIRC Auto Off Option when CA35 is Power Gating (Write Protect) + * | | |0 = When CA35 core power is not ready, the HIRC enable bit is the same as CLK_PWRCTL[2]. + * | | |1 = When CA35 core power is not ready, switch the HIRC enable bit to low automatically. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: This bit only works when the CA35 core power is not ready + * | | |If CA35 core power is ready, the HIRC enable bit is the controlled by CLK_PWRCTL[2]. + * |[17:16] |LXTSTBS |LXT Stable Count Select (Write Protect) + * | | |00 = LXT stable count = 16384 clocks. + * | | |01 = LXT stable count = 65536 clocks. + * | | |10 = LXT stable count = 131072 clocks. + * | | |11 = LXT stable count = 327680 clocks. + * | | |Note: These bits are write protected. Refer to the SYS_RLKTZS register. + * |[21] |GICAOFF |GIC CLK Auto Off Option when CA35 is Power Gating (Write Protect) + * | | |0 = When CA35 core power is not ready, the GIC CLK will not be gated. + * | | |1 = When CA35 core power is not ready, the GIC CLK will be gated. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: This bit only works when the CA35 core power is not ready + * | | |If CA35 core power is ready, the HIRC enable bit is the controlled by CLK_PWRCTL[2]. + * |[22] |HXTAPD |HXT Auto Off Option when CA35 is Power Down (Write Protect) + * | | |0 = When CA35 cores are in WFI, the HXT enable bit is the same as CLK_PWRCTL[0]. + * | | |1 = When CA35 cores are in WFI, switch the HXT enable bit to low automatically. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: This bit only works when the CA35 cores are in the WFI + * | | |If CA35 cores are not in WFI, the HXT enable bit is the controlled by CLK_PWRCTL[0]. + * |[23] |HIRCAPD |HIRC Auto Off Option when CA35 is Power Down (Write Protect) + * | | |0 = When CA35 cores are in WFI, the HIRC enable bit is the same as CLK_PWRCTL[2]. + * | | |1 = When CA35 cores are in WFI, switch the HIRC enable bit to low automatically. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: This bit only works when the CA35 cores are in the WFI + * | | |If CA35 cores are not in WFI, the HIRC enable bit is the controlled by CLK_PWRCTL[2]. + * @var CLK_T::SYSCLK0 + * Offset: 0x04 AXI and AHB Device Clock Enable Control Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |RTPEN |CPU RTP CortexM4 AHB Clock Enable Bit (Write Protect) + * | | |0 = Cortex M4 AHB clock Disabled. + * | | |1 = Cortex M4 AHB clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[2] |TAHBCKEN |TSI AHB HCLK Clock Enable Bit (Write Protect) + * | | |0 = TSI AHB HCLK Disabled. + * | | |1 = TSI AHB HCLK Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[3] |LVRDBEN |LVR Debounce Clock Enable Bit (Write Protect) + * | | |0 = LVR Debounce clock Disabled. + * | | |1 = LVR Debounce clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[4] |DDR0CKEN |DDR Port0 Clock Enable Bit (Write Protect) + * | | |0 = DDR Port0 peripheral clock Disabled. + * | | |1 = DDR Port0 peripheral clock Enabled. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: The peripheral clock of DDR Port 1, DDR Port 2, DDR Port 3, DDR Port 4, DDR Port5, DDR Port7 are enabled automatically by the peripheral clock enable bit of the IP on the corresponding bus. + * |[5] |DDR6CKEN |DDR Port6 Clock Enable Bit (Write Protect) + * | | |0 = DDR Port6 peripheral clock Disabled. + * | | |1 = DDR Port6 peripheral clock Enabled. + * | | |Note 1: This bit is write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: The peripheral clock of DDR Port 1, DDR Port 2, DDR Port 3, DDR Port 4, DDR Port5, DDR Port7 are enabled automatically by the peripheral clock enable bit of the IP on the corresponding bus. + * |[8] |CANFD0CKEN|CANFD0 Clock Enable Bit + * | | |0 = CANFD0 clock Disabled. + * | | |1 = CANFD0 clock Enabled. + * |[9] |CANFD1CKEN|CANFD1 Clock Enable Bit + * | | |0 = CANFD1 clock Disabled. + * | | |1 = CANFD1 clock Enabled. + * |[10] |CANFD2CKEN|CANFD2 Clock Enable Bit + * | | |0 = CANFD2 clock Disabled. + * | | |1 = CANFD2 clock Enabled. + * |[11] |CANFD3CKEN|CANFD3 Clock Enable Bit + * | | |0 = CANFD3 clock Disabled. + * | | |1 = CANFD3 clock Enabled. + * |[16] |SDH0EN |SD0 Host Controller AHB clock Enable Bit + * | | |0 = SDH0 controller AHB clock Disabled. + * | | |1 = SDH0 controller AHB clock Enabled. + * |[17] |SDH1EN |SD1 Host Controller AHB clock Enable Bit + * | | |0 = SDH1 controller AHB clock Disabled. + * | | |1 = SDH1 controller AHB clock Enabled. + * |[18] |NANDEN |NAND Controller Clock Enable Bit + * | | |0 = NAND controller clock Disabled. + * | | |1 = NAND controller clock Enabled. + * |[19] |USBDEN |USBD Clock Enable Bit + * | | |0 = USBD clock Disabled. + * | | |1 = USBD clock Enabled. + * |[20] |USBHEN |USBH Clock Enable Bit (TZNS) + * | | |0 = USBH clock Disabled. + * | | |1 = USBH clock Enabled. + * |[21] |HUSBH0EN |High Speed USBH Clock Enable Bit (TZNS) + * | | |0 = HUSBH0 clock Disabled. + * | | |1 = HUSBH0 clock Enabled. + * |[22] |HUSBH1EN |High Speed USBH Clock Enable Bit (TZNS) + * | | |0 = HUSBH1 clock Disabled. + * | | |1 = HUSBH1 clock Enabled. + * |[24] |GFXEN |GFX Clock Enable Bit (TZNS) + * | | |0 = GFX clock Disabled. + * | | |1 = GFX clock Enabled. + * |[25] |VDECEN |VC8000 Clock Enable Bit (TZNS) + * | | |0 = VC8000 clock Disabled. + * | | |1 = VC8000 clock Enabled. + * |[26] |DCUEN |DC Ultra Clock Enable Bit (TZNS) + * | | |0 = DC Ultra clock Disabled. + * | | |1 = DC Ultra clock Enabled. + * |[27] |GMAC0EN |Gigabit Ethernet MAC 0 AXI Clock Enable Bit (TZNS) + * | | |0 = Gigabit Ethernet MAC 0 AXI clock Disabled. + * | | |1 = Gigabit Ethernet MAC 0 AXI clock Enabled. + * |[28] |GMAC1EN |Gigabit Ethernet MAC 1 AXI Clock Enable Bit (TZNS) + * | | |0 = Gigabit Ethernet MAC 1 AXI clock Disabled. + * | | |1 = Gigabit Ethernet MAC 1 AXI clock Enabled. + * |[29] |CCAP0EN |CCAP0 Clock Enable Bit (TZNS) + * | | |0 = CCAP0 clock Disabled. + * | | |1 = CCAP0 clock Enabled. + * |[30] |CCAP1EN |CCAP1 Clock Enable Bit (TZNS) + * | | |0 = CCAP1 clock Disabled. + * | | |1 = CCAP1 clock Enabled. + * @var CLK_T::SYSCLK1 + * Offset: 0x08 AXI and AHB Device Clock Enable Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PDMA0EN |PDMA0 Controller Clock Enable Bit + * | | |0 = PDMA0 peripheral clock Disabled. + * | | |1 = PDMA0 peripheral clock Enabled. + * |[1] |PDMA1EN |PDMA1 Controller Clock Enable Bit + * | | |0 = PDMA1 peripheral clock Disabled. + * | | |1 = PDMA1 peripheral clock Enabled. + * |[2] |PDMA2EN |PDMA2 Controller Clock Enable Bit + * | | |0 = PDMA2 peripheral clock Disabled. + * | | |1 = PDMA2 peripheral clock Enabled. + * |[3] |PDMA3EN |PDMA3 Controller Clock Enable Bit + * | | |0 = PDMA3 peripheral clock Disabled. + * | | |1 = PDMA3 peripheral clock Enabled. + * |[4] |WH0CKEN |Wormhole 0 Peripheral Clock Enable Bit (Write Protect, TZNS) + * | | |0 = Wormhole 0 clock Disabled. + * | | |1 = Wormhole 0 clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZNS register. + * |[5] |WH1CKEN |Wormhole 1 Peripheral Clock Enable Bit (Write Protect) + * | | |0 = Wormhole 1 clock Disabled. + * | | |1 = Wormhole 1 clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[6] |HWSCKEN |Hardware Semaphore Clock Enable Bit (Write Protect, TZNS) + * | | |0 = Hardware Semaphore peripheral clock Disabled. + * | | |1 = Hardware Semaphore clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZNS register. + * |[7] |EBICKEN |EBI Controller Clock Enable Bit + * | | |0 = EBI peripheral clock Disabled. + * | | |1 = EBI peripheral clock Enabled. + * |[8] |SRAM0CKEN |SRAM Bank0 Controller Clock Enable Bit (Write Protect) + * | | |0 = SRAM bank0 clock Disabled. + * | | |1 = SRAM bank0 clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[9] |SRAM1CKEN |SRAM Bank1 Controller Clock Enable Bit (Write Protect) + * | | |0 = SRAM bank1 clock Disabled. + * | | |1 = SRAM bank1 clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[10] |ROMCKEN |ROM AHB Clock Enable Bit (Write Protect) + * | | |0 = ROM AHB clock Disabled. + * | | |1 = ROM AHB clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[11] |TRACKEN |Coresight Trace Clock Enable Bit (Write Protect) + * | | |0 = Coresight trace clock Disabled. + * | | |1 = Coresight trace clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[12] |DBGCKEN |Coresight Debug Clock Enable Bit (Write Protect) + * | | |0 = Coresight debug clock Disabled. + * | | |1 = Coresight debug clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[13] |CLKOCKEN |CLKO Clock Enable Bit (Write Protect) + * | | |0 = CLKO clock Disabled. + * | | |1 = CLKO clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[14] |GTMRCKEN |Cortex A35 Generic Timer Clock Enable Bit (Write Protect) + * | | |0 = Cortex A35 Generic timer clock Disabled. + * | | |1 = Cortex A35 Generic timer clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[16] |GPACKEN |GPIOA AHB Clock Enable Bit + * | | |0 = GPIOA port clock Disabled. + * | | |1 = GPIOA port clock Enabled. + * |[17] |GPBCKEN |GPIOB AHB Clock Enable Bit + * | | |0 = GPIOB port clock Disabled. + * | | |1 = GPIOB port clock Enabled. + * |[18] |GPCCKEN |GPIOC AHB Clock Enable Bit + * | | |0 = GPIOC port clock Disabled. + * | | |1 = GPIOC port clock Enabled. + * |[19] |GPDCKEN |GPIOD AHB Clock Enable Bit + * | | |0 = GPIOD port clock Disabled. + * | | |1 = GPIOD port clock Enabled. + * |[20] |GPECKEN |GPIOE AHB Clock Enable Bit + * | | |0 = GPIOE port clock Disabled. + * | | |1 = GPIOE port clock Enabled. + * |[21] |GPFCKEN |GPIOF AHB Clock Enable Bit + * | | |0 = GPIOF port clock Disabled. + * | | |1 = GPIOF port clock Enabled. + * |[22] |GPGCKEN |GPIOG AHB Clock Enable Bit + * | | |0 = GPIOG port clock Disabled. + * | | |1 = GPIOG port clock Enabled. + * |[23] |GPHCKEN |GPIOH AHB Clock Enable Bit + * | | |0 = GPIOH port clock Disabled. + * | | |1 = GPIOH port clock Enabled. + * |[24] |GPICKEN |GPIOI AHB Clock Enable Bit + * | | |0 = GPIOI port clock Disabled. + * | | |1 = GPIOI port clock Enabled. + * |[25] |GPJCKEN |GPIOJ AHB Clock Enable Bit + * | | |0 = GPIOJ port clock Disabled. + * | | |1 = GPIOJ port clock Enabled. + * |[26] |GPKCKEN |GPIOK AHB Clock Enable Bit + * | | |0 = GPIOK port clock Disabled. + * | | |1 = GPIOK port clock Enabled. + * |[27] |GPLCKEN |GPIOL AHB Clock Enable Bit + * | | |0 = GPIOL port clock Disabled. + * | | |1 = GPIOL port clock Enabled. + * |[28] |GPMCKEN |GPIOM AHB Clock Enable Bit + * | | |0 = GPIOM port clock Disabled. + * | | |1 = GPIOM port clock Enabled. + * |[29] |GPNCKEN |GPION AHB Clock Enable Bit + * | | |0 = GPION port clock Disabled. + * | | |1 = GPION port clock Enabled. + * @var CLK_T::APBCLK0 + * Offset: 0x0C APB Devices Clock Enable Control Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TMR0CKEN |Timer0 Clock Enable Bit + * | | |0 = Timer0 clock Disabled. + * | | |1 = Timer0 clock Enabled. + * |[1] |TMR1CKEN |Timer1 Clock Enable Bit + * | | |0 = Timer1 clock Disabled. + * | | |1 = Timer1 clock Enabled. + * |[2] |TMR2CKEN |Timer2 Clock Enable Bit + * | | |0 = Timer2 clock Disabled. + * | | |1 = Timer2 clock Enabled. + * |[3] |TMR3CKEN |Timer3 Clock Enable Bit + * | | |0 = Timer3 clock Disabled. + * | | |1 = Timer3 clock Enabled. + * |[4] |TMR4CKEN |Timer4 Clock Enable Bit + * | | |0 = Timer4 clock Disabled. + * | | |1 = Timer4 clock Enabled. + * |[5] |TMR5CKEN |Timer5 Clock Enable Bit + * | | |0 = Timer5 clock Disabled. + * | | |1 = Timer5 clock Enabled. + * |[6] |TMR6CKEN |Timer6 Clock Enable Bit + * | | |0 = Timer6 clock Disabled. + * | | |1 = Timer6 clock Enabled. + * |[7] |TMR7CKEN |Timer7 Clock Enable Bit + * | | |0 = Timer7 clock Disabled. + * | | |1 = Timer7 clock Enabled. + * |[8] |TMR8CKEN |Timer8 Clock Enable Bit + * | | |0 = Timer8 clock Disabled. + * | | |1 = Timer8 clock Enabled. + * |[9] |TMR9CKEN |Timer9 Clock Enable Bit + * | | |0 = Timer9 clock Disabled. + * | | |1 = Timer9 clock Enabled. + * |[10] |TMR10CKEN |Timer10 Clock Enable Bit + * | | |0 = Timer10 clock Disabled. + * | | |1 = Timer10 clock Enabled. + * |[11] |TMR11CKEN |Timer11 Clock Enable Bit + * | | |0 = Timer11 clock Disabled. + * | | |1 = Timer11 clock Enabled. + * |[12] |UART0CKEN |UART0 Clock Enable Bit + * | | |0 = UART0 clock Disabled. + * | | |1 = UART0 clock Enabled. + * |[13] |UART1CKEN |UART1 Clock Enable Bit + * | | |0 = UART1 clock Disabled. + * | | |1 = UART1 clock Enabled. + * |[14] |UART2CKEN |UART2 Clock Enable Bit + * | | |0 = UART2 clock Disabled. + * | | |1 = UART2 clock Enabled. + * |[15] |UART3CKEN |UART3 Clock Enable Bit + * | | |0 = UART3 clock Disabled. + * | | |1 = UART3 clock Enabled. + * |[16] |UART4CKEN |UART4 Clock Enable Bit + * | | |0 = UART4 clock Disabled. + * | | |1 = UART4 clock Enabled. + * |[17] |UART5CKEN |UART5 Clock Enable Bit + * | | |0 = UART5 clock Disabled. + * | | |1 = UART5 clock Enabled. + * |[18] |UART6CKEN |UART6 Clock Enable Bit + * | | |0 = UART6 clock Disabled. + * | | |1 = UART6 clock Enabled. + * |[19] |UART7CKEN |UART7 Clock Enable Bit + * | | |0 = UART7 clock Disabled. + * | | |1 = UART7 clock Enabled. + * |[20] |UART8CKEN |UART8 Clock Enable Bit + * | | |0 = UART8 clock Disabled. + * | | |1 = UART8 clock Enabled. + * |[21] |UART9CKEN |UART9 Clock Enable Bit + * | | |0 = UART9 clock Disabled. + * | | |1 = UART9 clock Enabled. + * |[22] |UART10CKEN|UART10 Clock Enable Bit + * | | |0 = UART10 clock Disabled. + * | | |1 = UART10 clock Enabled. + * |[23] |UART11CKEN|UART11 Clock Enable Bit + * | | |0 = UART11 clock Disabled. + * | | |1 = UART11 clock Enabled. + * |[24] |UART12CKEN|UART12 Clock Enable Bit + * | | |0 = UART12 clock Disabled. + * | | |1 = UART12 clock Enabled. + * |[25] |UART13CKEN|UART13 Clock Enable Bit + * | | |0 = UART13 clock Disabled. + * | | |1 = UART13 clock Enabled. + * |[26] |UART14CKEN|UART14 Clock Enable Bit + * | | |0 = UART14 clock Disabled. + * | | |1 = UART14 clock Enabled. + * |[27] |UART15CKEN|UART15 Clock Enable Bit + * | | |0 = UART15 clock Disabled. + * | | |1 = UART15 clock Enabled. + * |[28] |UART16CKEN|UART16 Clock Enable Bit + * | | |0 = UART16 clock Disabled. + * | | |1 = UART16 clock Enabled. + * |[29] |RTCCKEN |RTC Clock Enable Bit (Shared) + * | | |0 = RTC Clock Disabled. + * | | |1 = RTC Clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[30] |DDRPCKEN |DDR PHY Utility Block Clock Enable Bit + * | | |0 = DDR PHY utility clock Disabled. + * | | |1 = DDR PHY utility clock Enabled. + * |[31] |KPICKEN |Keypad Interface Clock Enable Bit + * | | |0 = Keypad interface clock Disabled. + * | | |1 = Keypad interface clock Enabled. + * @var CLK_T::APBCLK1 + * Offset: 0x10 APB Devices Clock Enable Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |I2C0CKEN |I2C0 Clock Enable Bit + * | | |0 = I2C0 clock Disabled. + * | | |1 = I2C0 clock Enabled. + * |[1] |I2C1CKEN |I2C1 Clock Enable Bit + * | | |0 = I2C1 clock Disabled. + * | | |1 = I2C1 clock Enabled. + * |[2] |I2C2CKEN |I2C2 Clock Enable Bit + * | | |0 = I2C2 clock Disabled. + * | | |1 = I2C2 clock Enabled. + * |[3] |I2C3CKEN |I2C3 Clock Enable Bit + * | | |0 = I2C3 clock Disabled. + * | | |1 = I2C3 clock Enabled. + * |[4] |I2C4CKEN |I2C4 Clock Enable Bit + * | | |0 = I2C4 clock Disabled. + * | | |1 = I2C4 clock Enabled. + * |[5] |I2C5CKEN |I2C5 Clock Enable Bit + * | | |0 = I2C5 clock Disabled. + * | | |1 = I2C5 clock Enabled. + * |[6] |QSPI0CKEN |QSPI0 Clock Enable Bit + * | | |0 = QSPI0 clock Disabled. + * | | |1 = QSPI0 clock Enabled. + * |[7] |QSPI1CKEN |QSPI1 Clock Enable Bit + * | | |0 = QSPI1 clock Disabled. + * | | |1 = QSPI1 clock Enabled. + * |[12] |SC0CKEN |SC0 Clock Enable Bit + * | | |0 = SC0 clock Disabled. + * | | |1 = SC0 clock Enabled. + * |[13] |SC1CKEN |SC1 Clock Enable Bit + * | | |0 = SC1 clock Disabled. + * | | |1 = SC1 clock Enabled. + * |[16] |WDT0CKEN |Watchdog Timer 0 Clock Enable Bit (Write Protect) + * | | |0 = Watchdog timer 0 clock Disabled. + * | | |1 = Watchdog timer 0 clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[17] |WDT1CKEN |Watchdog Timer 1 Clock Enable Bit (Write Protect) + * | | |0 = Watchdog timer 1 clock Disabled. + * | | |1 = Watchdog timer 1 clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register or SYS_RLKTZNS register. + * |[18] |WDT2CKEN |Watchdog Timer 2 Clock Enable Bit (Write Protect, SUBM) + * | | |0 = Watchdog timer 2 clock Disabled. + * | | |1 = Watchdog timer 2 clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKSUBM register. + * |[24] |EPWM0CKEN |EPWM0 Clock Enable Bit + * | | |0 = EPWM0 clock Disabled. + * | | |1 = EPWM0 clock Enabled. + * |[25] |EPWM1CKEN |EPWM1 Clock Enable Bit + * | | |0 = EPWM1 clock Disabled. + * | | |1 = EPWM1 clock Enabled. + * |[26] |EPWM2CKEN |EPWM2 Clock Enable Bit + * | | |0 = EPWM2 clock Disabled. + * | | |1 = EPWM2 clock Enabled. + * @var CLK_T::APBCLK2 + * Offset: 0x14 APB Devices Clock Enable Control Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |I2S0CKEN |I2S0 Clock Enable Bit + * | | |0 = I2S0 Clock Disabled. + * | | |1 = I2S0 Clock Enabled. + * |[1] |I2S1CKEN |I2S1 Clock Enable Bit + * | | |0 = I2S1 Clock Disabled. + * | | |1 = I2S1 Clock Enabled. + * |[2] |SSMCCEN |SSMCC Clock Enable Bit (Write Protect) + * | | |0 = SSMCC clock Disabled. + * | | |1 = SSMCC clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[3] |SSPCCEN |SSPCC Clock Enable Bit (Write Protect) + * | | |0 = SSPCC clock Disabled. + * | | |1 = SSPCC clock Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[4] |SPI0CKEN |SPI0 Clock Enable Bit + * | | |0 = SPI0 clock Disabled. + * | | |1 = SPI0 clock Enabled. + * |[5] |SPI1CKEN |SPI1 Clock Enable Bit + * | | |0 = SPI1 clock Disabled. + * | | |1 = SPI1 clock Enabled. + * |[6] |SPI2CKEN |SPI2 Clock Enable Bit + * | | |0 = SPI2 clock Disabled. + * | | |1 = SPI2 clock Enabled. + * |[7] |SPI3CKEN |SPI3 Clock Enable Bit + * | | |0 = SPI3 clock Disabled. + * | | |1 = SPI3 clock Enabled. + * |[8] |ECAP0CKEN |ECAP0 Clock Enable Bit + * | | |0 = ECAP0 clock Disabled. + * | | |1 = ECAP0 clock Enabled. + * |[9] |ECAP1CKEN |ECAP1 Clock Enable Bit + * | | |0 = ECAP1 clock Disabled. + * | | |1 = ECAP1 clock Enabled. + * |[10] |ECAP2CKEN |ECAP2 Clock Enable Bit + * | | |0 = ECAP2 clock Disabled. + * | | |1 = ECAP2 clock Enabled. + * |[12] |QEI0CKEN |QEI0 Clock Enable Bit + * | | |0 = QEI0 clock Disabled. + * | | |1 = QEI0 clock Enabled. + * |[13] |QEI1CKEN |QEI1 Clock Enable Bit + * | | |0 = QEI1 clock Disabled. + * | | |1 = QEI1 clock Enabled. + * |[14] |QEI2CKEN |QEI2 Clock Enable Bit + * | | |0 = QEI2 clock Disabled. + * | | |1 = QEI2 clock Enabled. + * |[24] |ADCCKEN |ADC Clock Enable Bit + * | | |0 = ADC clock Disabled. + * | | |1 = ADC clock Enabled. + * |[25] |EADCCKEN |EADC Clock Enable Bit + * | | |0 = EADC clock Disabled. + * | | |1 = EADC clock Enabled. + * @var CLK_T::CLKSEL0 + * Offset: 0x18 Clock Source Select Control Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |CA35CKSEL |Cortex A35 CPU Clock Source Selection (Write Protect) + * | | |Before clock switching, the related clock sources (both pre-select and new-select) must be turned on. + * | | |00 = Clock source from HXT. + * | | |01 = Clock source from CA-PLL. + * | | |10 = Clock source from EPLL. + * | | |11 = Clock source from APLL. + * | | |Note 2: These bits are write protected. Refer to the SYS_RLKTZS register. + * |[2] |SYSCK0SEL |System Clock Source Selection (Write Protect) + * | | |Before clock switching, the related clock sources (both pre-select and new-select) must be turned on. + * | | |0 = Clock source from EPLL/2. + * | | |1 = Clock source from SYS-PLL. + * | | |Note: These bits are write protected. Refer to the SYS_RLKTZS register. + * |[3] |LVRDBSEL |LVR Debounce Clock Selection (Write Protect) + * | | |Before clock switching, the related clock sources (both pre-select and new-select) must be turned on. + * | | |0 = Clock source from LIRC. + * | | |1 = Clock source from HIRC. + * | | |Note: These bits are write protected. Refer to the SYS_RLKTZS register. + * |[5:4] |SYSCK1SEL |System Clock Source Selection (Write Protect) + * | | |Before clock switching, the related clock sources (both pre-select and new-select) must be turned on. + * | | |00 = Clock source from HXT. + * | | |01 = Clock source from SYS-PLL. + * | | |10 = Clock source from APLL. + * | | |11 = Clock source from APLL. + * | | |Note: These bits are write protected. Refer to the SYS_RLKTZS register. + * |[10:8] |RTPSTSEL |RTP CortexM4 SysTick Clock Source Selection (Write Protect, SUBM) + * | | |If SYST_CTRL[2]=0, SysTick uses listed clock source below. + * | | |000 = Clock source from HXT. + * | | |001 = Clock source from LXT. + * | | |010 = Clock source from HXT/2. + * | | |011 = Clock source from SYSCLK1/2. + * | | |Others = Clock source from HIRC. + * | | |Note 1: if SysTick clock source is not from HCLK (i.e + * | | |SYST_CTRL[2] = 0), SysTick need clock frequency must less than or equal to HCLK/2. + * | | |Note 2: These bits are write protected. Refer to the SYS_RLKSUBM register. + * |[13:12] |CCAP0SEL |CCAP0 Sensor Clock Source Selection (TZNS) + * | | |Before clock switching, the related clock sources (both pre-select and new-select) must be turned on. + * | | |00 = Clock source from HXT. + * | | |01 = Clock source from VPLL. + * | | |10 = Clock source from APLL. + * | | |11 = Clock source from SYS-PLL. + * |[15:14] |CCAP1SEL |CCAP1 Sensor Clock Source Selection (TZNS) + * | | |Before clock switching, the related clock sources (both pre-select and new-select) must be turned on. + * | | |00 = Clock source from HXT. + * | | |01 = Clock source from VPLL. + * | | |10 = Clock source from APLL. + * | | |11 = Clock source from SYS-PLL. + * |[17:16] |SD0SEL |SD HOST0 Controller Core Logic Clock Source Selection + * | | |Before clock switching, the related clock sources (both pre-select and new-select) must be turned on. + * | | |00 = Clock source from APLL. + * | | |01 = Clock source from VPLL. + * | | |10 = Clock source from SYS-PLL. + * | | |11 = Clock source from SYS-PLL. + * |[19:18] |SD1SEL |SD HOST1 Controller Core Logic Clock Source Selection + * | | |Before clock switching, the related clock sources (both pre-select and new-select) must be turned on. + * | | |00 = Clock source from APLL. + * | | |01 = Clock source from VPLL. + * | | |10 = Clock source from SYS-PLL. + * | | |11 = Clock source from SYS-PLL. + * |[24] |DCUSEL |Display Controller Ultra Core Clock Source Selection (TZNS) + * | | |Before clock switching, the related clock sources (both pre-select and new-select) must be turned on. + * | | |0 = Clock source from EPLL/2. + * | | |1 = Clock source from SYS-PLL. + * |[25] |DCUPSEL |Display Controller Ultra Pixel Clock Source Selection (TZNS) + * | | |Before clock switching, the related clock sources (both pre-select and new-select) must be turned on. + * | | |0 = Clock source from VPLL. + * | | |1 = Clock source from APLL. + * |[26] |GFXSEL |GFX Core Clock Source Selection (TZNS) + * | | |Before clock switching, the related clock sources (both pre-select and new-select) must be turned on. + * | | |0 = Clock source from EPLL. + * | | |1 = Clock source from SYS-PLL. + * |[27] |DBGSEL |Coresight DBG Clock Source Selection (Write Protect) + * | | |Before clock switching, the related clock sources (both pre-select and new-select) must be turned on. + * | | |0 = Clock source from HIRC.1. + * | | |1 = Clock source from SYS-PLL. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * @var CLK_T::CLKSEL1 + * Offset: 0x1C Clock Source Select Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |TMR0SEL |TIMER0 Clock Source Selection + * | | |000 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |001 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |010 = Clock source from PCLK0. + * | | |011 = Clock source from external clock TM0 pin. + * | | |101 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |111 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * | | |Others = Reserved. + * |[6:4] |TMR1SEL |TIMER1 Clock Source Selection + * | | |000 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |001 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |010 = Clock source from PCLK0. + * | | |011 = Clock source from external clock TM1 pin. + * | | |101 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |111 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * | | |Others = Reserved. + * |[10:8] |TMR2SEL |TIMER2 Clock Source Selection + * | | |000 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |001 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |010 = Clock source from PCLK1. + * | | |011 = Clock source from external clock TM2 pin. + * | | |101 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |111 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * | | |Others = Reserved. + * |[14:12] |TMR3SEL |TIMER3 Clock Source Selection + * | | |000 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |001 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |010 = Clock source from PCLK1. + * | | |011 = Clock source from external clock TM3 pin. + * | | |101 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |111 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * | | |Others = Reserved. + * |[18:16] |TMR4SEL |TIMER4 Clock Source Selection + * | | |000 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |001 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |010 = Clock source from PCLK2. + * | | |011 = Clock source from external clock TM4 pin. + * | | |101 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |111 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * | | |Others = Reserved. + * |[22:20] |TMR5SEL |TIMER5 Clock Source Selection + * | | |000 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |001 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |010 = Clock source from PCLK2. + * | | |011 = Clock source from external clock TM5 pin. + * | | |101 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |111 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * | | |Others = Reserved. + * |[26:24] |TMR6SEL |TIMER6 Clock Source Selection + * | | |000 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |001 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |010 = Clock source from PCLK0. + * | | |011 = Clock source from external clock TM6 pin. + * | | |101 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |111 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * | | |Others = Reserved. + * |[30:28] |TMR7SEL |TIMER7 Clock Source Selection + * | | |000 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |001 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |010 = Clock source from PCLK0. + * | | |011 = Clock source from external clock TM7 pin. + * | | |101 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |111 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * | | |Others = Reserved. + * @var CLK_T::CLKSEL2 + * Offset: 0x20 Clock Source Select Control Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |TMR8SEL |TIMER8 Clock Source Selection + * | | |000 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |001 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |010 = Clock source from PCLK1. + * | | |011 = Clock source from external clock TM8 pin. + * | | |101 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |111 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * | | |Others = Reserved. + * |[6:4] |TMR9SEL |TIMER9 Clock Source Selection + * | | |000 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |001 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |010 = Clock source from PCLK1. + * | | |011 = Clock source from external clock TM9 pin. + * | | |101 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |111 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * | | |Others = Reserved. + * |[10:8] |TMR10SEL |TIMER10 Clock Source Selection + * | | |000 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |001 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |010 = Clock source from PCLK2. + * | | |011 = Clock source from external clock TM10 pin. + * | | |101 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |111 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * | | |Others = Reserved. + * |[14:12] |TMR11SEL |TIMER11 Clock Source Selection + * | | |000 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |001 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |010 = Clock source from PCLK2. + * | | |011 = Clock source from external clock TM11 pin. + * | | |101 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |111 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * | | |Others = Reserved. + * |[17:16] |UART0SEL |UART0 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[19:18] |UART1SEL |UART1 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[21:20] |UART2SEL |UART2 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[23:22] |UART3SEL |UART3 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[25:24] |UART4SEL |UART4 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[27:26] |UART5SEL |UART5 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[29:28] |UART6SEL |UART6 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[31:30] |UART7SEL |UART7 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * @var CLK_T::CLKSEL3 + * Offset: 0x24 Clock Source Select Control Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |UART8SEL |UART8 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[3:2] |UART9SEL |UART6 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[5:4] |UART10SEL |UART10 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[7:6] |UART11SEL |UART11 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[9:8] |UART12SEL |UART12 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[11:10] |UART13SEL |UART13 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[13:12] |UART14SEL |UART14 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[15:14] |UART15SEL |UART15 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[17:16] |UART16SEL |UART16 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from SYSCLK1/2. + * | | |10 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[21:20] |WDT0SEL |Watchdog Timer Clock Source Selection (Write Protect) + * | | |01 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |10 = Clock source from PCLK3/4096. + * | | |11 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |Others = Reserved. + * | | |Note: These bits are write protected. Refer to the SYS_RLKTZS register. + * |[23:22] |WWDT0SEL |Window Watchdog Timer Clock Source Selection (Write Protect) + * | | |10 = Clock source from PCLK3/4096. + * | | |11 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |Others = Reserved. + * | | |Note: These bits are write protected. Refer to the SYS_RLKTZS register. + * |[25:24] |WDT1SEL |Watchdog Timer Clock Source Selection (Write Protect) + * | | |01 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |10 = Clock source from PCLK3/4096. + * | | |11 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |Others = Reserved. + * | | |Note: These bits are write protected. Refer to the SYS_RLKTZNS register or SYS_RLKTZS register. + * |[27:26] |WWDT1SEL |Window Watchdog Timer Clock Source Selection (Write Protect) + * | | |10 = Clock source from PCLK3/4096. + * | | |11 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |Others = Reserved. + * | | |Note: These bits are write protected. Refer to the SYS_RLKTZNS register or SYS_RLKTZS register. + * |[29:28] |WDT2SEL |Watchdog Timer Clock Source Selection (Write Protect, SUBM) + * | | |01 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * | | |10 = Clock source from PCLK4/4096. + * | | |11 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |Others = Reserved. + * | | |Note: These bits are write protected. Refer to the SYS_RLKTZNS register. + * |[31:30] |WWDT2SEL |Window Watchdog Timer Clock Source Selection (Write Protect, SUBM) + * | | |10 = Clock source from PCLK4/4096. + * | | |11 = Clock source from 32 kHz internal low speed RC oscillator (LIRC). + * | | |Others = Reserved. + * | | |Note: These bits are write protected. Refer to the SYS_RLKTZNS register. + * @var CLK_T::CLKSEL4 + * Offset: 0x28 Clock Source Select Control Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |SPI0SEL |SPI3 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from EPLL/4. + * | | |10 = Clock source from PCLK1. + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[3:2] |SPI1SEL |SPI1 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from EPLL/4. + * | | |10 = Clock source from PCLK2. + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[5:4] |SPI2SEL |SPI2 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from EPLL/4. + * | | |10 = Clock source from PCLK1. + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[7:6] |SPI3SEL |SPI3 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from EPLL/4. + * | | |10 = Clock source from PCLK2. + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[9:8] |QSPI0SEL |QSPI0 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from EPLL/4. + * | | |10 = Clock source from PCLK0. + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[11:10] |QSPI1SEL |QSPI1 Clock Source Selection + * | | |00 = Clock source from 24 MHz external high speed crystal oscillator (HXT). + * | | |01 = Clock source from EPLL/4. + * | | |10 = Clock source from PCLK0. + * | | |11 = Clock source from 12 MHz internal high speed RC oscillator (HIRC). + * |[13:12] |I2S0SEL |I2S0 Clock Source Selection + * | | |00 = Clock source from HXT clock. + * | | |01 = Clock source from APLL clock. + * | | |10 = Clock source from PCLK0. + * | | |11 = Clock source from HIRC clock. + * |[15:14] |I2S1SEL |I2S1 Clock Source Selection + * | | |00 = Clock source from HXT clock. + * | | |01 = Clock source from APLL clock. + * | | |10 = Clock source from PCLK2. + * | | |11 = Clock source from HIRC clock. + * |[16] |CANFD0SEL |CANFD0 Clock Source Selection + * | | |0 = Clock source from APLL clock. + * | | |1 = Clock source from VPLL clock. + * |[17] |CANFD1SEL |CANFD1 Clock Source Selection + * | | |0 = Clock source from APLL clock. + * | | |1 = Clock source from VPLL clock. + * |[18] |CANFD2SEL |CANFD2 Clock Source Selection + * | | |0 = Clock source from APLL clock. + * | | |1 = Clock source from VPLL clock. + * |[19] |CANFD3SEL |CANFD3 Clock Source Selection + * | | |0 = Clock source from APLL clock. + * | | |1 = Clock source from VPLL clock. + * |[27:24] |CKOSEL |Reference Clock Our Source Selection + * | | |This field selects which clock is used to be the source of reference clock output + * | | |0000 = Clock source from HXT. + * | | |0001 = Clock source from LXT. + * | | |0010 = Clock source from HIRC. + * | | |0011 = Clock source from LIRC. + * | | |0100 = Reserved.. + * | | |0101 = Clock source from SYS-PLL. + * | | |0110 = Clock source from DDR core CLK. + * | | |0111 = Clock source from EPLL/4. + * | | |1000 = Clock source from APLL. + * | | |1001 = Clock source from VPLL. + * | | |1010 = Clock source from CA CLK. + * | | |1011 = Clock source from AXI0 ACLK. + * | | |1100 = Clock source from SYSCLK0. + * | | |1101 = Clock source from SYSCLK1. + * | | |1110 = Clock source from PCLK3. + * | | |1111 = Clock source from PCLK4. + * | | |Others = Reserved. + * |[28] |SC0SEL |Smart Card 0 Clock Source Selection + * | | |0 = Clock source from 4~24 MHz external high speed crystal oscillator (HXT). + * | | |1 = Clock source from PCLK4. + * |[29] |SC1SEL |Smart Card 1 Clock Source Selection + * | | |0 = Clock source from 4~24 MHz external high speed crystal oscillator (HXT). + * | | |1 = Clock source from PCLK4. + * |[30] |KPISEL |Key Pad Interface Clock Source Selection + * | | |0 = Clock source from 4~24 MHz external high speed crystal oscillator (HXT). + * | | |1 = Clock source from 32.768 kHz external low speed crystal oscillator (LXT). + * @var CLK_T::CLKDIV0 + * Offset: 0x2C Clock Divider Number Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |CANFD0DIV |CANFD0 Clock Divide Number From CANFD0 Clock Source + * | | |00 = Clock source from CANFD0 Clock Source /2. + * | | |01 = Clock source from CANFD0 Clock Source /4. + * | | |10 = Clock source from CANFD0 Clock Source /8. + * | | |11 = Clock source from CANFD0 Clock Source /16. + * |[3:2] |CANFD1DIV |CANFD1 Clock Divide Number From CANFD1 Clock Source + * | | |00 = Clock source from CANFD1 Clock Source /2. + * | | |01 = Clock source from CANFD1 Clock Source /4. + * | | |10 = Clock source from CANFD1 Clock Source /8. + * | | |11 = Clock source from CANFD1 Clock Source /16. + * |[5:4] |CANFD2DIV |CANFD2 Clock Divide Number From CANFD2 Clock Source + * | | |00 = Clock source from CANFD2 Clock Source /2. + * | | |01 = Clock source from CANFD2 Clock Source /4. + * | | |10 = Clock source from CANFD2 Clock Source /8. + * | | |11 = Clock source from CANFD2 Clock Source /16. + * |[7:6] |CANFD3DIV |CANFD3 Clock Divide Number From CANFD3 Clock Source + * | | |00 = Clock source from CANFD3 Clock Source /2. + * | | |01 = Clock source from CANFD3 Clock Source /4. + * | | |10 = Clock source from CANFD3 Clock Source /8. + * | | |11 = Clock source from CANFD3 Clock Source /16. + * |[25:24] |DCUPDIV |Display Controller Ultra Pixel Divided Clock Source (Read Only) + * | | |00 = Clock source from Display Controller Ultra Pixel Clock Source /2. + * | | |01 = Clock source from Display Controller Ultra Pixel Clock Source /4. + * | | |10 = Clock source from Display Controller Ultra Pixel Clock Source /8. + * | | |11 = Clock source from Display Controller Ultra Pixel Clock Source /16. + * |[26] |ACLK0DIV |AXI0 Bus Clock Divide Number From CA-PLL Clock Source (Write Protect) + * | | |0 = Clock source from CA-PLL /2. + * | | |1 = Clock source from CA-PLL /4. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[29:28] |EMAC0DIV |EMAC0 TX Clock Divide Selection From EPLL Clock Source (Read Only) + * | | |00 = Clock source from EPLL /2.(RGMII). + * | | |01 = Clock source from EPLL /2.(RGMII). + * | | |10 = Clock source from EPLL /100 (RGMII). + * | | |11 = Clock source from EPLL /10 (RGMII). + * | | |X0 = Clock source from RMII reference clock /20 (RMII). + * | | |X1 = Clock source from RMII reference clock /2 (RMII). + * | | |Others = Reserved. + * | | |Note: This field definition depends on the Ethernet mac is RMII or not. + * |[31:30] |EMAC1DIV |EMAC1 TX Clock Divide Selection From EPLL Clock Source (Read Only) + * | | |00 = Clock source from EPLL /2.(RGMII). + * | | |01 = Clock source from EPLL /2.(RGMII). + * | | |10 = Clock source from EPLL /100 (RGMII). + * | | |11 = Clock source from EPLL /10 (RGMII). + * | | |X0 = Clock source from RMII reference clock /20 (RMII). + * | | |X1 = Clock source from RMII reference clock /2 (RMII). + * | | |Others = Reserved. + * | | |Note: This field definition depends on the Ethernet mac is RMII or not. + * @var CLK_T::CLKDIV1 + * Offset: 0x30 Clock Divider Number Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |SC0DIV |Smart Card 0 Clock Divide Number From SC0 Clock Source + * | | |SC0 clock frequency = (SC0 clock source frequency) / (SC0DIV + 1). + * |[7:4] |SC1DIV |Smart Card 1 Clock Divide Number From SC1 Clock Source + * | | |SC1 clock frequency = (SC1 clock source frequency) / (SC1DIV + 1). + * |[11:8] |CCAP0DIV |CCAP0 Clock Divide Number From CCAP0 Clock Source (TZNS) + * | | |CCAP0 clock frequency = (CCAP0 clock source frequency) / (CCAP0DIV + 1). + * |[15:12] |CCAP1DIV |CCAP1 Clock Divide Number From CCAP1 Clock Source (TZNS) + * | | |CCAP1 clock frequency = (CCAP1 clock source frequency) / (CCAP1DIV + 1). + * |[19:16] |UART0DIV |UART0 Clock Divide Number From UART0 Clock Source + * | | |UART0 clock frequency = (UART0 clock source frequency) / (UART0DIV + 1). + * |[23:20] |UART1DIV |UART1 Clock Divide Number From UART1 Clock Source + * | | |UART1 clock frequency = (UART1 clock source frequency) / (UART1DIV + 1). + * |[27:24] |UART2DIV |UART2 Clock Divide Number From UART2 Clock Source + * | | |UART2 clock frequency = (UART2 clock source frequency) / (UART2DIV + 1). + * |[31:28] |UART3DIV |UART3 Clock Divide Number From UART3 Clock Source + * | | |UART3 clock frequency = (UART3 clock source frequency) / (UART3DIV + 1). + * @var CLK_T::CLKDIV2 + * Offset: 0x34 Clock Divider Number Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |UART4DIV |UART4 Clock Divide Number From UART4 Clock Source + * | | |UART4 clock frequency = (UART4 clock source frequency) / (UART4DIV + 1). + * |[7:4] |UART5DIV |UART5 Clock Divide Number From UART5 Clock Source + * | | |UART5 clock frequency = (UART5 clock source frequency) / (UART5DIV + 1). + * |[11:8] |UART6DIV |UART6 Clock Divide Number From UART6 Clock Source + * | | |UART6 clock frequency = (UART6 clock source frequency) / (UART6DIV + 1). + * |[15:12] |UART7DIV |UART7 Clock Divide Number From UART7 Clock Source + * | | |UART7 clock frequency = (UART7 clock source frequency) / (UART7DIV + 1). + * |[19:16] |UART8DIV |UART8 Clock Divide Number From UART8 Clock Source + * | | |UART8 clock frequency = (UART8 clock source frequency) / (UART8DIV + 1). + * |[23:20] |UART9DIV |UART9 Clock Divide Number From UART9 Clock Source + * | | |UART9 clock frequency = (UART9 clock source frequency) / (UART9DIV + 1). + * |[27:24] |UART10DIV |UART10 Clock Divide Number From UART10 Clock Source + * | | |UART10 clock frequency = (UART10 clock source frequency) / (UART10DIV + 1). + * |[31:28] |UART11DIV |UART11 Clock Divide Number From UART11 Clock Source + * | | |UART11 clock frequency = (UART11 clock source frequency) / (UART11DIV + 1). + * @var CLK_T::CLKDIV3 + * Offset: 0x38 Clock Divider Number Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |UART12DIV |UART12 Clock Divide Number From UART12 Clock Source + * | | |UART12 clock frequency = (UART12 clock source frequency) / (UART12DIV + 1). + * |[7:4] |UART13DIV |UART13 Clock Divide Number From UART13 Clock Source + * | | |UART13 clock frequency = (UART13 clock source frequency) / (UART13DIV + 1). + * |[11:8] |UART14DIV |UART14 Clock Divide Number From UART14 Clock Source + * | | |UART14 clock frequency = (UART14 clock source frequency) / (UART14DIV + 1). + * |[15:12] |UART15DIV |UART15 Clock Divide Number From UART15 Clock Source + * | | |UART15 clock frequency = (UART15 clock source frequency) / (UART15DIV + 1). + * |[19:16] |UART16DIV |UART16 Clock Divide Number From UART16 Clock Source + * | | |UART16 clock frequency = (UART16 clock source frequency) / (UART16DIV + 1). + * @var CLK_T::CLKDIV4 + * Offset: 0x3C Clock Divider Number Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |EADCDIV |EADC Clock Divide Number From EADC Clock Source + * | | |EADC clock frequency = (EADC clock source frequency) / (EADCDIV + 1). + * |[20:4] |ADCDIV |ADC Clock Divide Number From ADC Clock Source + * | | |ADC clock frequency = (ADC clock source frequency) / (ADCDIV + 1). + * |[31:24] |KPIDIV |Keypad Interface Clock Divide Number From KPI Clock Source + * | | |KPI clock frequency = (KPI clock source frequency) / (KPIDIV + 1). + * @var CLK_T::CLKOCTL + * Offset: 0x40 Clock Output Control Register (Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |FREQSEL |Clock Output Frequency Selection + * | | |The formula of output frequency is + * | | |Fout = Fin/2(N+1). + * | | |Fin is the input clock frequency. + * | | |Fout is the frequency of divider output clock. + * | | |N is the 4-bit value of FREQSEL [3:0]. + * |[4] |CLKOEN |Clock Output Enable Bit + * | | |0 = Clock Output function Disabled. + * | | |1 = Clock Output function Enabled. + * |[5] |DIV1EN |Clock Output Divide One Enable Bit + * | | |0 = Clock Output will output clock with source frequency divided by FREQSEL. + * | | |1 = Clock Output will output clock with source frequency. + * @var CLK_T::STATUS + * Offset: 0x50 Clock Status Monitor Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |HXTSTB |HXT Clock Source Stable Flag (Read Only) + * | | |0 = 24 MHz external high speed crystal oscillator (HXT) clock is not stable or disabled. + * | | |1 = 24 MHz external high speed crystal oscillator (HXT) clock is stable and enabled. + * |[1] |LXTSTB |LXT Clock Source Stable Flag (Read Only) + * | | |LXT clock source can be selected as external LXT or LIRC32 by setting C32KS(RTC_LXTCTL[6]) + * | | |IfC32KS is set to 0 the LXT stable flag is set when external LXT clock source is stable + * | | |IfC32KS is set to 1 the LXT stable flag is set when LIRC32 clock source is stable. + * | | |0 = 32.768 kHz external low speed crystal oscillator (LXT) clock is not stable or disabled. + * | | |1 = 32.768 kHz external low speed crystal oscillator (LXT) clock is stabled and enabled. + * |[2] |SYSPLLSTB |SYS-PLL Clock Source Stable Flag (Read Only) + * | | |0 = SYS-PLL clock is not stable or disabled. + * | | |1 = SYS-PLL clock is stable and enabled. + * |[3] |LIRCSTB |LIRC Clock Source Stable Flag (Read Only) + * | | |0 = 32 kHz internal low speed RC oscillator (LIRC) clock is not stable or disabled. + * | | |1 = 32 kHz internal low speed RC oscillator (LIRC) clock is stable and enabled. + * |[4] |HIRCSTB |HIRC Clock Source Stable Flag (Read Only) + * | | |0 = 12 MHz internal high speed RC oscillator (HIRC) clock is not stable or disabled. + * | | |1 = 12 MHz internal high speed RC oscillator (HIRC) clock is stable and enabled. + * |[6] |CAPLLSTB |Cortex35 PLL Clock Source Stable Flag (Read Only) + * | | |0 = CA-PLL clock is not stable or disabled. + * | | |1 = CA-PLL clock is stable and enabled. + * |[8] |DDRPLLSTB |DDR-PLL Clock Source Stable Flag (Read Only) + * | | |0 = DDR-PLL clock is not stable or disabled. + * | | |1 = DDR-PLL clock is stable and enabled. + * |[9] |EPLLSTB |EPLL Clock Source Stable Flag (Read Only) + * | | |0 = EPLL clock is not stable or disabled. + * | | |1 = EPLL clock is stable and enabled. + * |[10] |APLLSTB |APLL Clock Source Stable Flag (Read Only) + * | | |0 = APLL clock is not stable or disabled. + * | | |1 = APLL clock is stable and enabled. + * |[11] |VPLLSTB |VPLL Clock Source Stable Flag (Read Only) + * | | |0 = VPLL clock is not stable or disabled. + * | | |1 = VPLL clock is stable and enabled. + * @var CLK_T::PLL0CTL0 + * Offset: 0x60 CA-PLL Control Register 0(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |FBDIV |PLL Feedback Divider Control (Write Protect) + * | | |Set the feedback divider factor (N) from 16 to 2047. + * | | |The N = FBDIV[10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[17:12] |INDIV |PLL Reference Input Divider Control (Write Protect) + * | | |Set the reference divider factor (M) from 1 to 63. + * | | |The M = INDIV[5:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[19:18] |MODE |Operation Mode Selection(Write Protect) + * | | |00 = Integer mode. + * | | |In this mode, the rising edges of the two clocks at the input of PFD are phase aligned + * | | |And the output clock frequency is at multiples of the input clock frequency contingent on the configuration of OUTDIV, INDIV and FBDIV. + * | | |01 = Fractional mode. + * | | |This mode is suitable for applications which need small output frequency steps, like 20 kHz + * | | |The jitter performance in this mode may be worse than in Integer Mode. + * | | |In this mode, the output clock frequency is at the fractional multiples of the input clock frequency + * | | |By setting the control pins FRAC [23:0], a small output frequency step is achieved.. + * | | |10 = Spread Spectrum Mode. + * | | |This mode is suitable for In this mode the output frequency of PLL will be modulated by triangle wave + * | | |It is for EMI consideration. + * | | |By setting SSRATE [10:0] and SLOPE [23:0], the modulation index and the modulation frequency can be programmed. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[30:20] |SSRATE |Spreading Frequency Control (Write Protect) + * | | |Set the spread step factor SSRATE from 0 to 2047, + * | | |SSRATE = SSRATE [10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL0CTL1 + * Offset: 0x64 CA-PLL Control Register 1(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PD |Power-down Mode (Write Protect) + * | | |0 = PLL is enable (in normal mode). + * | | |1 = PLL is disable (in Power-down mode) (default). + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[1] |BP |PLL Bypass Control (Write Protect) + * | | |0 = PLL is in normal mode (default). + * | | |1 = PLL clock output is same as PLL input clock Fref. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[6:4] |OUTDIV |PLL Output Divider Control (Write Protect) + * | | |Set the output divider factor (P) from 1 to 7. + * | | |P = OUTDIV[2:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[31:8] |FRAC |PLL Fractional Portion of DN Value (Write Protect) + * | | |Set the fraction part (X) of Fractional Portion of DN Value factor. + * | | |The X = FRAC[23:0] / 224. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL0CTL2 + * Offset: 0x68 CA-PLL Control Register 2(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |SLOPE |PLL Stable Counter Selection (Write Protect) + * | | |Set the spread step factor SLOPE from 0 to 16777215, + * | | |SLOPE = SLOPE[23:0]. + * | | |Note 1: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL1CTL0 + * Offset: 0x70 SYS-PLL Control Register 0(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |FBDIV |PLL Feedback Divider Control (Write Protect) + * | | |Set the feedback divider factor (N) from 16 to 2047. + * | | |The N = FBDIV[10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[17:12] |INDIV |PLL Reference Input Divider Control (Write Protect) + * | | |Set the reference divider factor (M) from 1 to 63. + * | | |The M = INDIV[5:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[19:18] |MODE |Operation Mode Selection(Write Protect) + * | | |00 = Integer mode. + * | | |In this mode, the rising edges of the two clocks at the input of PFD are phase aligned + * | | |And the output clock frequency is at multiples of the input clock frequency contingent on the configuration of OUTDIV, INDIV and FBDIV. + * | | |01 = Fractional mode. + * | | |This mode is suitable for applications which need small output frequency steps, like 20 kHz + * | | |The jitter performance in this mode may be worse than in Integer Mode. + * | | |In this mode, the output clock frequency is at the fractional multiples of the input clock frequency + * | | |By setting the control pins FRAC [23:0], a small output frequency step is achieved.. + * | | |10 = Spread Spectrum Mode. + * | | |This mode is suitable for In this mode the output frequency of PLL will be modulated by triangle wave + * | | |It is for EMI consideration. + * | | |By setting SSRATE [10:0] and SLOPE [23:0], the modulation index and the modulation frequency can be programmed. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[30:20] |SSRATE |Spreading Frequency Control (Write Protect) + * | | |Set the spread step factor SSRATE from 0 to 2047, + * | | |SSRATE = SSRATE [10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL1CTL1 + * Offset: 0x74 SYS-PLL Control Register 1(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PD |Power-down Mode (Write Protect) + * | | |0 = PLL is enable (in normal mode). + * | | |1 = PLL is disable (in Power-down mode) (default). + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[1] |BP |PLL Bypass Control (Write Protect) + * | | |0 = PLL is in normal mode (default). + * | | |1 = PLL clock output is same as PLL input clock Fref. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[6:4] |OUTDIV |PLL Output Divider Control (Write Protect) + * | | |Set the output divider factor (P) from 1 to 7. + * | | |P = OUTDIV[2:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[31:8] |FRAC |PLL Fractional Portion of DN Value (Write Protect) + * | | |Set the fraction part (X) of Fractional Portion of DN Value factor. + * | | |The X = FRAC[23:0] / 224. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL1CTL2 + * Offset: 0x78 SYS-PLL Control Register 2(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |SLOPE |PLL Stable Counter Selection (Write Protect) + * | | |Set the spread step factor SLOPE from 0 to 16777215, + * | | |SLOPE = SLOPE[23:0]. + * | | |Note 1: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL2CTL0 + * Offset: 0x80 DDR-PLL Control Register 0(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |FBDIV |PLL Feedback Divider Control (Write Protect) + * | | |Set the feedback divider factor (N) from 16 to 2047. + * | | |The N = FBDIV[10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[17:12] |INDIV |PLL Reference Input Divider Control (Write Protect) + * | | |Set the reference divider factor (M) from 1 to 63. + * | | |The M = INDIV[5:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[19:18] |MODE |Operation Mode Selection(Write Protect) + * | | |00 = Integer mode. + * | | |In this mode, the rising edges of the two clocks at the input of PFD are phase aligned + * | | |And the output clock frequency is at multiples of the input clock frequency contingent on the configuration of OUTDIV, INDIV and FBDIV. + * | | |01 = Fractional mode. + * | | |This mode is suitable for applications which need small output frequency steps, like 20 kHz + * | | |The jitter performance in this mode may be worse than in Integer Mode. + * | | |In this mode, the output clock frequency is at the fractional multiples of the input clock frequency + * | | |By setting the control pins FRAC [23:0], a small output frequency step is achieved.. + * | | |10 = Spread Spectrum Mode. + * | | |This mode is suitable for In this mode the output frequency of PLL will be modulated by triangle wave + * | | |It is for EMI consideration. + * | | |By setting SSRATE [10:0] and SLOPE [23:0], the modulation index and the modulation frequency can be programmed. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[30:20] |SSRATE |Spreading Frequency Control (Write Protect) + * | | |Set the spread step factor SSRATE from 0 to 2047, + * | | |SSRATE = SSRATE [10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL2CTL1 + * Offset: 0x84 DDR-PLL Control Register 1(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PD |Power-down Mode (Write Protect) + * | | |0 = PLL is enable (in normal mode). + * | | |1 = PLL is disable (in Power-down mode) (default). + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[1] |BP |PLL Bypass Control (Write Protect) + * | | |0 = PLL is in normal mode (default). + * | | |1 = PLL clock output is same as PLL input clock Fref. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[6:4] |OUTDIV |PLL Output Divider Control (Write Protect) + * | | |Set the output divider factor (P) from 1 to 7. + * | | |P = OUTDIV[2:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[31:8] |FRAC |PLL Fractional Portion of DN Value (Write Protect) + * | | |Set the fraction part (X) of Fractional Portion of DN Value factor. + * | | |The X = FRAC[23:0] / 224. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL2CTL2 + * Offset: 0x88 DDR-PLL Control Register 2(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |SLOPE |PLL Stable Counter Selection (Write Protect) + * | | |Set the spread step factor SLOPE from 0 to 16777215, + * | | |SLOPE = SLOPE[23:0]. + * | | |Note 1: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL3CTL0 + * Offset: 0x90 APLL Control Register 0(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |FBDIV |PLL Feedback Divider Control (Write Protect) + * | | |Set the feedback divider factor (N) from 16 to 2047. + * | | |The N = FBDIV[10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[17:12] |INDIV |PLL Reference Input Divider Control (Write Protect) + * | | |Set the reference divider factor (M) from 1 to 63. + * | | |The M = INDIV[5:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[19:18] |MODE |Operation Mode Selection(Write Protect) + * | | |00 = Integer mode. + * | | |In this mode, the rising edges of the two clocks at the input of PFD are phase aligned + * | | |And the output clock frequency is at multiples of the input clock frequency contingent on the configuration of OUTDIV, INDIV and FBDIV. + * | | |01 = Fractional mode. + * | | |This mode is suitable for applications which need small output frequency steps, like 20 kHz + * | | |The jitter performance in this mode may be worse than in Integer Mode. + * | | |In this mode, the output clock frequency is at the fractional multiples of the input clock frequency + * | | |By setting the control pins FRAC [23:0], a small output frequency step is achieved.. + * | | |10 = Spread Spectrum Mode. + * | | |This mode is suitable for In this mode the output frequency of PLL will be modulated by triangle wave + * | | |It is for EMI consideration. + * | | |By setting SSRATE [10:0] and SLOPE [23:0], the modulation index and the modulation frequency can be programmed. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[30:20] |SSRATE |Spreading Frequency Control (Write Protect) + * | | |Set the spread step factor SSRATE from 0 to 2047, + * | | |SSRATE = SSRATE [10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL3CTL1 + * Offset: 0x94 APLL Control Register 1(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PD |Power-down Mode (Write Protect) + * | | |0 = PLL is enable (in normal mode). + * | | |1 = PLL is disable (in Power-down mode) (default). + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[1] |BP |PLL Bypass Control (Write Protect) + * | | |0 = PLL is in normal mode (default). + * | | |1 = PLL clock output is same as PLL input clock Fref. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[6:4] |OUTDIV |PLL Output Divider Control (Write Protect) + * | | |Set the output divider factor (P) from 1 to 7. + * | | |P = OUTDIV[2:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[31:8] |FRAC |PLL Fractional Portion of DN Value (Write Protect) + * | | |Set the fraction part (X) of Fractional Portion of DN Value factor. + * | | |The X = FRAC[23:0] / 224. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL3CTL2 + * Offset: 0x98 APLL Control Register 2(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |SLOPE |PLL Stable Counter Selection (Write Protect) + * | | |Set the spread step factor SLOPE from 0 to 16777215, + * | | |SLOPE = SLOPE[23:0]. + * | | |Note 1: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL4CTL0 + * Offset: 0xA0 EPLL Control Register 0(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |FBDIV |PLL Feedback Divider Control (Write Protect) + * | | |Set the feedback divider factor (N) from 16 to 2047. + * | | |The N = FBDIV[10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[17:12] |INDIV |PLL Reference Input Divider Control (Write Protect) + * | | |Set the reference divider factor (M) from 1 to 63. + * | | |The M = INDIV[5:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[19:18] |MODE |Operation Mode Selection(Write Protect) + * | | |00 = Integer mode. + * | | |In this mode, the rising edges of the two clocks at the input of PFD are phase aligned + * | | |And the output clock frequency is at multiples of the input clock frequency contingent on the configuration of OUTDIV, INDIV and FBDIV. + * | | |01 = Fractional mode. + * | | |This mode is suitable for applications which need small output frequency steps, like 20 kHz + * | | |The jitter performance in this mode may be worse than in Integer Mode. + * | | |In this mode, the output clock frequency is at the fractional multiples of the input clock frequency + * | | |By setting the control pins FRAC [23:0], a small output frequency step is achieved.. + * | | |10 = Spread Spectrum Mode. + * | | |This mode is suitable for In this mode the output frequency of PLL will be modulated by triangle wave + * | | |It is for EMI consideration. + * | | |By setting SSRATE [10:0] and SLOPE [23:0], the modulation index and the modulation frequency can be programmed. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[30:20] |SSRATE |Spreading Frequency Control (Write Protect) + * | | |Set the spread step factor SSRATE from 0 to 2047, + * | | |SSRATE = SSRATE [10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL4CTL1 + * Offset: 0xA4 EPLL Control Register 1(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PD |Power-down Mode (Write Protect) + * | | |0 = PLL is enable (in normal mode). + * | | |1 = PLL is disable (in Power-down mode) (default). + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[1] |BP |PLL Bypass Control (Write Protect) + * | | |0 = PLL is in normal mode (default). + * | | |1 = PLL clock output is same as PLL input clock Fref. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[6:4] |OUTDIV |PLL Output Divider Control (Write Protect) + * | | |Set the output divider factor (P) from 1 to 7. + * | | |P = OUTDIV[2:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[31:8] |FRAC |PLL Fractional Portion of DN Value (Write Protect) + * | | |Set the fraction part (X) of Fractional Portion of DN Value factor. + * | | |The X = FRAC[23:0] / 224. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL4CTL2 + * Offset: 0xA8 EPLL Control Register 2(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |SLOPE |PLL Stable Counter Selection (Write Protect) + * | | |Set the spread step factor SLOPE from 0 to 16777215, + * | | |SLOPE = SLOPE[23:0]. + * | | |Note 1: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL5CTL0 + * Offset: 0xB0 VPLL Control Register 0(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |FBDIV |PLL Feedback Divider Control (Write Protect) + * | | |Set the feedback divider factor (N) from 16 to 2047. + * | | |The N = FBDIV[10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[17:12] |INDIV |PLL Reference Input Divider Control (Write Protect) + * | | |Set the reference divider factor (M) from 1 to 63. + * | | |The M = INDIV[5:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[19:18] |MODE |Operation Mode Selection(Write Protect) + * | | |00 = Integer mode. + * | | |In this mode, the rising edges of the two clocks at the input of PFD are phase aligned + * | | |And the output clock frequency is at multiples of the input clock frequency contingent on the configuration of OUTDIV, INDIV and FBDIV. + * | | |01 = Fractional mode. + * | | |This mode is suitable for applications which need small output frequency steps, like 20 kHz + * | | |The jitter performance in this mode may be worse than in Integer Mode. + * | | |In this mode, the output clock frequency is at the fractional multiples of the input clock frequency + * | | |By setting the control pins FRAC [23:0], a small output frequency step is achieved.. + * | | |10 = Spread Spectrum Mode. + * | | |This mode is suitable for In this mode the output frequency of PLL will be modulated by triangle wave + * | | |It is for EMI consideration. + * | | |By setting SSRATE [10:0] and SLOPE [23:0], the modulation index and the modulation frequency can be programmed. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[30:20] |SSRATE |Spreading Frequency Control (Write Protect) + * | | |Set the spread step factor SSRATE from 0 to 2047, + * | | |SSRATE = SSRATE [10:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL5CTL1 + * Offset: 0xB4 VPLL Control Register 1(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PD |Power-down Mode (Write Protect) + * | | |0 = PLL is enable (in normal mode). + * | | |1 = PLL is disable (in Power-down mode) (default). + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[1] |BP |PLL Bypass Control (Write Protect) + * | | |0 = PLL is in normal mode (default). + * | | |1 = PLL clock output is same as PLL input clock Fref. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[6:4] |OUTDIV |PLL Output Divider Control (Write Protect) + * | | |Set the output divider factor (P) from 1 to 7. + * | | |P = OUTDIV[2:0]. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * |[31:8] |FRAC |PLL Fractional Portion of DN Value (Write Protect) + * | | |Set the fraction part (X) of Fractional Portion of DN Value factor. + * | | |The X = FRAC[23:0] / 224. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::PLL5CTL2 + * Offset: 0xB8 VPLL Control Register 2(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |SLOPE |PLL Stable Counter Selection (Write Protect) + * | | |Set the spread step factor SLOPE from 0 to 16777215, + * | | |SLOPE = SLOPE[23:0]. + * | | |Note 1: This bit is write protected + * | | |Refer to the SYS_RLKTZS register + * | | |For PLL3, PLL4, and PLL5, user can also refer to the SYS_RLKTZNS register if SYSSIAEN is 1. + * @var CLK_T::CLKDCTL + * Offset: 0xC0 Clock Fail Detector Control Register(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4] |HXTFDEN |HXT Clock Fail Detector Enable Bit + * | | |0 = 24 MHz external high speed crystal oscillator (HXT) clock fail detector Disabled. + * | | |1 = 24 MHz external high speed crystal oscillator (HXT) clock fail detector Enabled. + * |[5] |HXTFIEN |HXT Clock Fail Interrupt Enable Bit + * | | |0 = 24 MHz external high speed crystal oscillator (HXT) clock fail interrupt Disabled. + * | | |1 = 24 MHz external high speed crystal oscillator (HXT) clock fail interrupt Enabled. + * |[12] |LXTFDEN |LXT Clock Fail Detector Enable Bit + * | | |0 = 32.768 kHz external low speed crystal oscillator (LXT) clock fail detector Disabled. + * | | |1 = 32.768 kHz external low speed crystal oscillator (LXT) clock fail detector Enabled. + * |[13] |LXTFIEN |LXT Clock Fail Interrupt Enable Bit + * | | |0 = 32.768 kHz external low speed crystal oscillator (LXT) clock fail interrupt Disabled. + * | | |1 = 32.768 kHz external low speed crystal oscillator (LXT) clock fail interrupt Enabled. + * |[16] |HXTFQDEN |HXT Clock Frequency Monitor Enable Bit + * | | |0 = 24 MHz external high speed crystal oscillator (HXT) clock frequency monitor Disabled. + * | | |1 = 24 MHz external high speed crystal oscillator (HXT) clock frequency monitor Enabled. + * |[17] |HXTFQIEN |HXT Clock Frequency Monitor Interrupt Enable Bit + * | | |0 = 24 MHz external high speed crystal oscillator (HXT) clock frequency monitor fail interrupt Disabled. + * | | |1 = 24 MHz external high speed crystal oscillator (HXT) clock frequency monitor fail interrupt Enabled. + * @var CLK_T::CLKDSTS + * Offset: 0xC4 Clock Fail Detector Status Register(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |HXTFIF |HXT Clock Fail Interrupt Flag (Write Protect, Write 1 to Clear) + * | | |0 = 24 MHz external high speed crystal oscillator (HXT) clock is normal. + * | | |1 = 24 MHz external high speed crystal oscillator (HXT) clock stops. + * | | |Note 1: Write 1 to clear the bit to 0. + * | | |Note 2: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[1] |LXTFIF |LXT Clock Fail Interrupt Flag (Write Protect, Write 1 to Clear) + * | | |0 = 32.768 kHz external low speed crystal oscillator (LXT) clock is normal. + * | | |1 = 32.768 kHz external low speed crystal oscillator (LXT) stops. + * | | |Note 1: Write 1 to clear the bit to 0. + * | | |Note 2: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[8] |HXTFQIF |HXT Clock Frequency Monitor Interrupt Flag (Write Protect, Write 1 to Clear) + * | | |0 = 24 MHz external high speed crystal oscillator (HXT) clock is normal. + * | | |1 = 24 MHz external high speed crystal oscillator (HXT) clock frequency is abnormal. + * | | |Note 1: Write 1 to clear the bit to 0. + * | | |Note 2: This bit is write protected. Refer to the SYS_RLKTZS register. + * @var CLK_T::CDUPB + * Offset: 0xC8 Clock Frequency Detector Upper Boundary Register(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |UPERBD |HXT Clock Frequency Detector Upper Boundary + * | | |The bits define the high value of frequency monitor window. + * | | |When HXT frequency monitor value higher than this register, the HXT frequency detect fail interrupt flag will set to 1. + * @var CLK_T::CDLOWB + * Offset: 0xCC Clock Frequency Detector Lower Boundary Register(Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |LOWERBD |HXT Clock Frequency Detector Lower Boundary + * | | |The bits define the low value of frequency monitor window. + * | | |When HXT frequency monitor value lower than this register, the HXT frequency detect fail interrupt flag will set to 1. + * @var CLK_T::CKFLTRCTL + * Offset: 0xD0 Clock Filter Control Register (Write Protect) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |HXTFLTREN |HXT Clock Filter Enable Control Bit (Write Protect) + * | | |0 = HXT clock filter function Disabled. + * | | |1 = HXT clock filter function Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[1] |HXTFLTRSEL|HXT Clock Filter Frequency Select + * | | |0 = HXT frequency is > 24 MHz. + * | | |1 = HXT frequency is <= 24 MHz. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[4] |HXTGTEN |HXT Clock Gating Enable Control Bit (Write Protect) + * | | |0 = HXT clock filter function Disabled. + * | | |1 = HXT clock filter function Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[5] |HXTBYPSEN |HXT Clock Bypass Enable Control Bit (Write Protect) + * | | |0 = HXT clock filter function Disabled. + * | | |1 = HXT clock filter function Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[8] |HIRCFLTREN|HIRC Clock Filter Enable Control Bit (Write Protect) + * | | |0 = HIRC clock filter function Disabled. + * | | |1 = HIRC clock filter function Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[9] |HIRCFLTRSEL|HIRC Clock Filter Frequency Select + * | | |0 = HIRC frequency is > 12 MHz. + * | | |1 = HIRC frequency is <= 12 MHz. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[12] |HIRCGTEN |HIRC Clock Gating Enable Control Bit (Write Protect) + * | | |0 = HIRC clock filter function Disabled. + * | | |1 = HIRC clock filter function Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + */ + __IO uint32_t PWRCTL; /*!< [0x0000] System Power-down Control Register */ + __IO uint32_t SYSCLK0; /*!< [0x0004] AXI and AHB Device Clock Enable Control Register 0 */ + __IO uint32_t SYSCLK1; /*!< [0x0008] AXI and AHB Device Clock Enable Control Register 1 */ + __IO uint32_t APBCLK0; /*!< [0x000c] APB Devices Clock Enable Control Register 0 */ + __IO uint32_t APBCLK1; /*!< [0x0010] APB Devices Clock Enable Control Register 1 */ + __IO uint32_t APBCLK2; /*!< [0x0014] APB Devices Clock Enable Control Register 2 */ + __IO uint32_t CLKSEL0; /*!< [0x0018] Clock Source Select Control Register 0 */ + __IO uint32_t CLKSEL1; /*!< [0x001c] Clock Source Select Control Register 1 */ + __IO uint32_t CLKSEL2; /*!< [0x0020] Clock Source Select Control Register 2 */ + __IO uint32_t CLKSEL3; /*!< [0x0024] Clock Source Select Control Register 3 */ + __IO uint32_t CLKSEL4; /*!< [0x0028] Clock Source Select Control Register 4 */ + __IO uint32_t CLKDIV0; /*!< [0x002c] Clock Divider Number Register 0 */ + __IO uint32_t CLKDIV1; /*!< [0x0030] Clock Divider Number Register 1 */ + __IO uint32_t CLKDIV2; /*!< [0x0034] Clock Divider Number Register 2 */ + __IO uint32_t CLKDIV3; /*!< [0x0038] Clock Divider Number Register 3 */ + __IO uint32_t CLKDIV4; /*!< [0x003c] Clock Divider Number Register 4 */ + __IO uint32_t CLKOCTL; /*!< [0x0040] Clock Output Control Register (Write Protect) */ + __I uint32_t RESERVE0[3]; + __I uint32_t STATUS; /*!< [0x0050] Clock Status Monitor Register */ + __I uint32_t RESERVE1[3]; + union + { + /* data */ + __IO uint32_t PLL0CTL0; /*!< [0x0060] CA-PLL Control Register 0 */ + PLL_T PLL[6]; /*!< [0x0080] PLL Control Registers (Write Protect) */ + }; + __IO uint32_t CLKDCTL; /*!< [0x00c0] Clock Fail Detector Control Register(Write Protect) */ + __IO uint32_t CLKDSTS; /*!< [0x00c4] Clock Fail Detector Status Register(Write Protect) */ + __IO uint32_t CDUPB; /*!< [0x00c8] Clock Frequency Detector Upper Boundary Register(Write Protect) */ + __IO uint32_t CDLOWB; /*!< [0x00cc] Clock Frequency Detector Lower Boundary Register(Write Protect) */ + __IO uint32_t CKFLTRCTL; /*!< [0x00d0] Clock Filter Control Register (Write Protect) */ + +} CLK_T; + +/** + @addtogroup CLK_CONST CLK Bit Field Definition + Constant Definitions for CLK Controller +@{ */ + +#define CLK_PWRCTL_HXTEN_Pos (0) /*!< CLK_T::PWRCTL: HXTEN Position */ +#define CLK_PWRCTL_HXTEN_Msk (0x1ul << CLK_PWRCTL_HXTEN_Pos) /*!< CLK_T::PWRCTL: HXTEN Mask */ + +#define CLK_PWRCTL_LXTEN_Pos (1) /*!< CLK_T::PWRCTL: LXTEN Position */ +#define CLK_PWRCTL_LXTEN_Msk (0x1ul << CLK_PWRCTL_LXTEN_Pos) /*!< CLK_T::PWRCTL: LXTEN Mask */ + +#define CLK_PWRCTL_HIRCEN_Pos (2) /*!< CLK_T::PWRCTL: HIRCEN Position */ +#define CLK_PWRCTL_HIRCEN_Msk (0x1ul << CLK_PWRCTL_HIRCEN_Pos) /*!< CLK_T::PWRCTL: HIRCEN Mask */ + +#define CLK_PWRCTL_LIRCEN_Pos (3) /*!< CLK_T::PWRCTL: LIRCEN Position */ +#define CLK_PWRCTL_LIRCEN_Msk (0x1ul << CLK_PWRCTL_LIRCEN_Pos) /*!< CLK_T::PWRCTL: LIRCEN Mask */ + +#define CLK_PWRCTL_HXTDS_Pos (10) /*!< CLK_T::PWRCTL: HXTDS Position */ +#define CLK_PWRCTL_HXTDS_Msk (0x1ul << CLK_PWRCTL_HXTDS_Pos) /*!< CLK_T::PWRCTL: HXTDS Mask */ + +#define CLK_PWRCTL_SYSPLLAPD_Pos (11) /*!< CLK_T::PWRCTL: SYSPLLAPD Position */ +#define CLK_PWRCTL_SYSPLLAPD_Msk (0x1ul << CLK_PWRCTL_SYSPLLAPD_Pos) /*!< CLK_T::PWRCTL: SYSPLLAPD Mask */ + +#define CLK_PWRCTL_CAPLLAPD_Pos (12) /*!< CLK_T::PWRCTL: CAPLLAPD Position */ +#define CLK_PWRCTL_CAPLLAPD_Msk (0x1ul << CLK_PWRCTL_CAPLLAPD_Pos) /*!< CLK_T::PWRCTL: CAPLLAPD Mask */ + +#define CLK_PWRCTL_DDRPLLAPD_Pos (13) /*!< CLK_T::PWRCTL: DDRPLLAPD Position */ +#define CLK_PWRCTL_DDRPLLAPD_Msk (0x1ul << CLK_PWRCTL_DDRPLLAPD_Pos) /*!< CLK_T::PWRCTL: DDRPLLAPD Mask */ + +#define CLK_PWRCTL_HXTAOFF_Pos (14) /*!< CLK_T::PWRCTL: HXTAOFF Position */ +#define CLK_PWRCTL_HXTAOFF_Msk (0x1ul << CLK_PWRCTL_HXTAOFF_Pos) /*!< CLK_T::PWRCTL: HXTAOFF Mask */ + +#define CLK_PWRCTL_HIRCAOFF_Pos (15) /*!< CLK_T::PWRCTL: HIRCAOFF Position */ +#define CLK_PWRCTL_HIRCAOFF_Msk (0x1ul << CLK_PWRCTL_HIRCAOFF_Pos) /*!< CLK_T::PWRCTL: HIRCAOFF Mask */ + +#define CLK_PWRCTL_LXTSTBS_Pos (16) /*!< CLK_T::PWRCTL: LXTSTBS Position */ +#define CLK_PWRCTL_LXTSTBS_Msk (0x3ul << CLK_PWRCTL_LXTSTBS_Pos) /*!< CLK_T::PWRCTL: LXTSTBS Mask */ + +#define CLK_PWRCTL_GICAOFF_Pos (21) /*!< CLK_T::PWRCTL: GICAOFF Position */ +#define CLK_PWRCTL_GICAOFF_Msk (0x1ul << CLK_PWRCTL_GICAOFF_Pos) /*!< CLK_T::PWRCTL: GICAOFF Mask */ + +#define CLK_PWRCTL_HXTAPD_Pos (22) /*!< CLK_T::PWRCTL: HXTAPD Position */ +#define CLK_PWRCTL_HXTAPD_Msk (0x1ul << CLK_PWRCTL_HXTAPD_Pos) /*!< CLK_T::PWRCTL: HXTAPD Mask */ + +#define CLK_PWRCTL_HIRCAPD_Pos (23) /*!< CLK_T::PWRCTL: HIRCAPD Position */ +#define CLK_PWRCTL_HIRCAPD_Msk (0x1ul << CLK_PWRCTL_HIRCAPD_Pos) /*!< CLK_T::PWRCTL: HIRCAPD Mask */ + +#define CLK_SYSCLK0_RTPEN_Pos (1) /*!< CLK_T::SYSCLK0: RTPEN Position */ +#define CLK_SYSCLK0_RTPEN_Msk (0x1ul << CLK_SYSCLK0_RTPEN_Pos) /*!< CLK_T::SYSCLK0: RTPEN Mask */ + +#define CLK_SYSCLK0_TAHBCKEN_Pos (2) /*!< CLK_T::SYSCLK0: TAHBCKEN Position */ +#define CLK_SYSCLK0_TAHBCKEN_Msk (0x1ul << CLK_SYSCLK0_TAHBCKEN_Pos) /*!< CLK_T::SYSCLK0: TAHBCKEN Mask */ + +#define CLK_SYSCLK0_LVRDBEN_Pos (3) /*!< CLK_T::SYSCLK0: LVRDBEN Position */ +#define CLK_SYSCLK0_LVRDBEN_Msk (0x1ul << CLK_SYSCLK0_LVRDBEN_Pos) /*!< CLK_T::SYSCLK0: LVRDBEN Mask */ + +#define CLK_SYSCLK0_DDR0CKEN_Pos (4) /*!< CLK_T::SYSCLK0: DDR0CKEN Position */ +#define CLK_SYSCLK0_DDR0CKEN_Msk (0x1ul << CLK_SYSCLK0_DDR0CKEN_Pos) /*!< CLK_T::SYSCLK0: DDR0CKEN Mask */ + +#define CLK_SYSCLK0_DDR6CKEN_Pos (5) /*!< CLK_T::SYSCLK0: DDR6CKEN Position */ +#define CLK_SYSCLK0_DDR6CKEN_Msk (0x1ul << CLK_SYSCLK0_DDR6CKEN_Pos) /*!< CLK_T::SYSCLK0: DDR6CKEN Mask */ + +#define CLK_SYSCLK0_CANFD0CKEN_Pos (8) /*!< CLK_T::SYSCLK0: CANFD0CKEN Position */ +#define CLK_SYSCLK0_CANFD0CKEN_Msk (0x1ul << CLK_SYSCLK0_CANFD0CKEN_Pos) /*!< CLK_T::SYSCLK0: CANFD0CKEN Mask */ + +#define CLK_SYSCLK0_CANFD1CKEN_Pos (9) /*!< CLK_T::SYSCLK0: CANFD1CKEN Position */ +#define CLK_SYSCLK0_CANFD1CKEN_Msk (0x1ul << CLK_SYSCLK0_CANFD1CKEN_Pos) /*!< CLK_T::SYSCLK0: CANFD1CKEN Mask */ + +#define CLK_SYSCLK0_CANFD2CKEN_Pos (10) /*!< CLK_T::SYSCLK0: CANFD2CKEN Position */ +#define CLK_SYSCLK0_CANFD2CKEN_Msk (0x1ul << CLK_SYSCLK0_CANFD2CKEN_Pos) /*!< CLK_T::SYSCLK0: CANFD2CKEN Mask */ + +#define CLK_SYSCLK0_CANFD3CKEN_Pos (11) /*!< CLK_T::SYSCLK0: CANFD3CKEN Position */ +#define CLK_SYSCLK0_CANFD3CKEN_Msk (0x1ul << CLK_SYSCLK0_CANFD3CKEN_Pos) /*!< CLK_T::SYSCLK0: CANFD3CKEN Mask */ + +#define CLK_SYSCLK0_SDH0EN_Pos (16) /*!< CLK_T::SYSCLK0: SDH0EN Position */ +#define CLK_SYSCLK0_SDH0EN_Msk (0x1ul << CLK_SYSCLK0_SDH0EN_Pos) /*!< CLK_T::SYSCLK0: SDH0EN Mask */ + +#define CLK_SYSCLK0_SDH1EN_Pos (17) /*!< CLK_T::SYSCLK0: SDH1EN Position */ +#define CLK_SYSCLK0_SDH1EN_Msk (0x1ul << CLK_SYSCLK0_SDH1EN_Pos) /*!< CLK_T::SYSCLK0: SDH1EN Mask */ + +#define CLK_SYSCLK0_NANDEN_Pos (18) /*!< CLK_T::SYSCLK0: NANDEN Position */ +#define CLK_SYSCLK0_NANDEN_Msk (0x1ul << CLK_SYSCLK0_NANDEN_Pos) /*!< CLK_T::SYSCLK0: NANDEN Mask */ + +#define CLK_SYSCLK0_USBDEN_Pos (19) /*!< CLK_T::SYSCLK0: USBDEN Position */ +#define CLK_SYSCLK0_USBDEN_Msk (0x1ul << CLK_SYSCLK0_USBDEN_Pos) /*!< CLK_T::SYSCLK0: USBDEN Mask */ + +#define CLK_SYSCLK0_USBHEN_Pos (20) /*!< CLK_T::SYSCLK0: USBHEN Position */ +#define CLK_SYSCLK0_USBHEN_Msk (0x1ul << CLK_SYSCLK0_USBHEN_Pos) /*!< CLK_T::SYSCLK0: USBHEN Mask */ + +#define CLK_SYSCLK0_HUSBH0EN_Pos (21) /*!< CLK_T::SYSCLK0: HUSBH0EN Position */ +#define CLK_SYSCLK0_HUSBH0EN_Msk (0x1ul << CLK_SYSCLK0_HUSBH0EN_Pos) /*!< CLK_T::SYSCLK0: HUSBH0EN Mask */ + +#define CLK_SYSCLK0_HUSBH1EN_Pos (22) /*!< CLK_T::SYSCLK0: HUSBH1EN Position */ +#define CLK_SYSCLK0_HUSBH1EN_Msk (0x1ul << CLK_SYSCLK0_HUSBH1EN_Pos) /*!< CLK_T::SYSCLK0: HUSBH1EN Mask */ + +#define CLK_SYSCLK0_GFXEN_Pos (24) /*!< CLK_T::SYSCLK0: GFXEN Position */ +#define CLK_SYSCLK0_GFXEN_Msk (0x1ul << CLK_SYSCLK0_GFXEN_Pos) /*!< CLK_T::SYSCLK0: GFXEN Mask */ + +#define CLK_SYSCLK0_VDECEN_Pos (25) /*!< CLK_T::SYSCLK0: VDECEN Position */ +#define CLK_SYSCLK0_VDECEN_Msk (0x1ul << CLK_SYSCLK0_VDECEN_Pos) /*!< CLK_T::SYSCLK0: VDECEN Mask */ + +#define CLK_SYSCLK0_DCUEN_Pos (26) /*!< CLK_T::SYSCLK0: DCUEN Position */ +#define CLK_SYSCLK0_DCUEN_Msk (0x1ul << CLK_SYSCLK0_DCUEN_Pos) /*!< CLK_T::SYSCLK0: DCUEN Mask */ + +#define CLK_SYSCLK0_GMAC0EN_Pos (27) /*!< CLK_T::SYSCLK0: GMAC0EN Position */ +#define CLK_SYSCLK0_GMAC0EN_Msk (0x1ul << CLK_SYSCLK0_GMAC0EN_Pos) /*!< CLK_T::SYSCLK0: GMAC0EN Mask */ + +#define CLK_SYSCLK0_GMAC1EN_Pos (28) /*!< CLK_T::SYSCLK0: GMAC1EN Position */ +#define CLK_SYSCLK0_GMAC1EN_Msk (0x1ul << CLK_SYSCLK0_GMAC1EN_Pos) /*!< CLK_T::SYSCLK0: GMAC1EN Mask */ + +#define CLK_SYSCLK0_CCAP0EN_Pos (29) /*!< CLK_T::SYSCLK0: CCAP0EN Position */ +#define CLK_SYSCLK0_CCAP0EN_Msk (0x1ul << CLK_SYSCLK0_CCAP0EN_Pos) /*!< CLK_T::SYSCLK0: CCAP0EN Mask */ + +#define CLK_SYSCLK0_CCAP1EN_Pos (30) /*!< CLK_T::SYSCLK0: CCAP1EN Position */ +#define CLK_SYSCLK0_CCAP1EN_Msk (0x1ul << CLK_SYSCLK0_CCAP1EN_Pos) /*!< CLK_T::SYSCLK0: CCAP1EN Mask */ + +#define CLK_SYSCLK1_PDMA0EN_Pos (0) /*!< CLK_T::SYSCLK1: PDMA0EN Position */ +#define CLK_SYSCLK1_PDMA0EN_Msk (0x1ul << CLK_SYSCLK1_PDMA0EN_Pos) /*!< CLK_T::SYSCLK1: PDMA0EN Mask */ + +#define CLK_SYSCLK1_PDMA1EN_Pos (1) /*!< CLK_T::SYSCLK1: PDMA1EN Position */ +#define CLK_SYSCLK1_PDMA1EN_Msk (0x1ul << CLK_SYSCLK1_PDMA1EN_Pos) /*!< CLK_T::SYSCLK1: PDMA1EN Mask */ + +#define CLK_SYSCLK1_PDMA2EN_Pos (2) /*!< CLK_T::SYSCLK1: PDMA2EN Position */ +#define CLK_SYSCLK1_PDMA2EN_Msk (0x1ul << CLK_SYSCLK1_PDMA2EN_Pos) /*!< CLK_T::SYSCLK1: PDMA2EN Mask */ + +#define CLK_SYSCLK1_PDMA3EN_Pos (3) /*!< CLK_T::SYSCLK1: PDMA3EN Position */ +#define CLK_SYSCLK1_PDMA3EN_Msk (0x1ul << CLK_SYSCLK1_PDMA3EN_Pos) /*!< CLK_T::SYSCLK1: PDMA3EN Mask */ + +#define CLK_SYSCLK1_WH0CKEN_Pos (4) /*!< CLK_T::SYSCLK1: WH0CKEN Position */ +#define CLK_SYSCLK1_WH0CKEN_Msk (0x1ul << CLK_SYSCLK1_WH0CKEN_Pos) /*!< CLK_T::SYSCLK1: WH0CKEN Mask */ + +#define CLK_SYSCLK1_WH1CKEN_Pos (5) /*!< CLK_T::SYSCLK1: WH1CKEN Position */ +#define CLK_SYSCLK1_WH1CKEN_Msk (0x1ul << CLK_SYSCLK1_WH1CKEN_Pos) /*!< CLK_T::SYSCLK1: WH1CKEN Mask */ + +#define CLK_SYSCLK1_HWSCKEN_Pos (6) /*!< CLK_T::SYSCLK1: HWSCKEN Position */ +#define CLK_SYSCLK1_HWSCKEN_Msk (0x1ul << CLK_SYSCLK1_HWSCKEN_Pos) /*!< CLK_T::SYSCLK1: HWSCKEN Mask */ + +#define CLK_SYSCLK1_EBICKEN_Pos (7) /*!< CLK_T::SYSCLK1: EBICKEN Position */ +#define CLK_SYSCLK1_EBICKEN_Msk (0x1ul << CLK_SYSCLK1_EBICKEN_Pos) /*!< CLK_T::SYSCLK1: EBICKEN Mask */ + +#define CLK_SYSCLK1_SRAM0CKEN_Pos (8) /*!< CLK_T::SYSCLK1: SRAM0CKEN Position */ +#define CLK_SYSCLK1_SRAM0CKEN_Msk (0x1ul << CLK_SYSCLK1_SRAM0CKEN_Pos) /*!< CLK_T::SYSCLK1: SRAM0CKEN Mask */ + +#define CLK_SYSCLK1_SRAM1CKEN_Pos (9) /*!< CLK_T::SYSCLK1: SRAM1CKEN Position */ +#define CLK_SYSCLK1_SRAM1CKEN_Msk (0x1ul << CLK_SYSCLK1_SRAM1CKEN_Pos) /*!< CLK_T::SYSCLK1: SRAM1CKEN Mask */ + +#define CLK_SYSCLK1_ROMCKEN_Pos (10) /*!< CLK_T::SYSCLK1: ROMCKEN Position */ +#define CLK_SYSCLK1_ROMCKEN_Msk (0x1ul << CLK_SYSCLK1_ROMCKEN_Pos) /*!< CLK_T::SYSCLK1: ROMCKEN Mask */ + +#define CLK_SYSCLK1_TRACKEN_Pos (11) /*!< CLK_T::SYSCLK1: TRACKEN Position */ +#define CLK_SYSCLK1_TRACKEN_Msk (0x1ul << CLK_SYSCLK1_TRACKEN_Pos) /*!< CLK_T::SYSCLK1: TRACKEN Mask */ + +#define CLK_SYSCLK1_DBGCKEN_Pos (12) /*!< CLK_T::SYSCLK1: DBGCKEN Position */ +#define CLK_SYSCLK1_DBGCKEN_Msk (0x1ul << CLK_SYSCLK1_DBGCKEN_Pos) /*!< CLK_T::SYSCLK1: DBGCKEN Mask */ + +#define CLK_SYSCLK1_CLKOCKEN_Pos (13) /*!< CLK_T::SYSCLK1: CLKOCKEN Position */ +#define CLK_SYSCLK1_CLKOCKEN_Msk (0x1ul << CLK_SYSCLK1_CLKOCKEN_Pos) /*!< CLK_T::SYSCLK1: CLKOCKEN Mask */ + +#define CLK_SYSCLK1_GTMRCKEN_Pos (14) /*!< CLK_T::SYSCLK1: GTMRCKEN Position */ +#define CLK_SYSCLK1_GTMRCKEN_Msk (0x1ul << CLK_SYSCLK1_GTMRCKEN_Pos) /*!< CLK_T::SYSCLK1: GTMRCKEN Mask */ + +#define CLK_SYSCLK1_GPACKEN_Pos (16) /*!< CLK_T::SYSCLK1: GPACKEN Position */ +#define CLK_SYSCLK1_GPACKEN_Msk (0x1ul << CLK_SYSCLK1_GPACKEN_Pos) /*!< CLK_T::SYSCLK1: GPACKEN Mask */ + +#define CLK_SYSCLK1_GPBCKEN_Pos (17) /*!< CLK_T::SYSCLK1: GPBCKEN Position */ +#define CLK_SYSCLK1_GPBCKEN_Msk (0x1ul << CLK_SYSCLK1_GPBCKEN_Pos) /*!< CLK_T::SYSCLK1: GPBCKEN Mask */ + +#define CLK_SYSCLK1_GPCCKEN_Pos (18) /*!< CLK_T::SYSCLK1: GPCCKEN Position */ +#define CLK_SYSCLK1_GPCCKEN_Msk (0x1ul << CLK_SYSCLK1_GPCCKEN_Pos) /*!< CLK_T::SYSCLK1: GPCCKEN Mask */ + +#define CLK_SYSCLK1_GPDCKEN_Pos (19) /*!< CLK_T::SYSCLK1: GPDCKEN Position */ +#define CLK_SYSCLK1_GPDCKEN_Msk (0x1ul << CLK_SYSCLK1_GPDCKEN_Pos) /*!< CLK_T::SYSCLK1: GPDCKEN Mask */ + +#define CLK_SYSCLK1_GPECKEN_Pos (20) /*!< CLK_T::SYSCLK1: GPECKEN Position */ +#define CLK_SYSCLK1_GPECKEN_Msk (0x1ul << CLK_SYSCLK1_GPECKEN_Pos) /*!< CLK_T::SYSCLK1: GPECKEN Mask */ + +#define CLK_SYSCLK1_GPFCKEN_Pos (21) /*!< CLK_T::SYSCLK1: GPFCKEN Position */ +#define CLK_SYSCLK1_GPFCKEN_Msk (0x1ul << CLK_SYSCLK1_GPFCKEN_Pos) /*!< CLK_T::SYSCLK1: GPFCKEN Mask */ + +#define CLK_SYSCLK1_GPGCKEN_Pos (22) /*!< CLK_T::SYSCLK1: GPGCKEN Position */ +#define CLK_SYSCLK1_GPGCKEN_Msk (0x1ul << CLK_SYSCLK1_GPGCKEN_Pos) /*!< CLK_T::SYSCLK1: GPGCKEN Mask */ + +#define CLK_SYSCLK1_GPHCKEN_Pos (23) /*!< CLK_T::SYSCLK1: GPHCKEN Position */ +#define CLK_SYSCLK1_GPHCKEN_Msk (0x1ul << CLK_SYSCLK1_GPHCKEN_Pos) /*!< CLK_T::SYSCLK1: GPHCKEN Mask */ + +#define CLK_SYSCLK1_GPICKEN_Pos (24) /*!< CLK_T::SYSCLK1: GPICKEN Position */ +#define CLK_SYSCLK1_GPICKEN_Msk (0x1ul << CLK_SYSCLK1_GPICKEN_Pos) /*!< CLK_T::SYSCLK1: GPICKEN Mask */ + +#define CLK_SYSCLK1_GPJCKEN_Pos (25) /*!< CLK_T::SYSCLK1: GPJCKEN Position */ +#define CLK_SYSCLK1_GPJCKEN_Msk (0x1ul << CLK_SYSCLK1_GPJCKEN_Pos) /*!< CLK_T::SYSCLK1: GPJCKEN Mask */ + +#define CLK_SYSCLK1_GPKCKEN_Pos (26) /*!< CLK_T::SYSCLK1: GPKCKEN Position */ +#define CLK_SYSCLK1_GPKCKEN_Msk (0x1ul << CLK_SYSCLK1_GPKCKEN_Pos) /*!< CLK_T::SYSCLK1: GPKCKEN Mask */ + +#define CLK_SYSCLK1_GPLCKEN_Pos (27) /*!< CLK_T::SYSCLK1: GPLCKEN Position */ +#define CLK_SYSCLK1_GPLCKEN_Msk (0x1ul << CLK_SYSCLK1_GPLCKEN_Pos) /*!< CLK_T::SYSCLK1: GPLCKEN Mask */ + +#define CLK_SYSCLK1_GPMCKEN_Pos (28) /*!< CLK_T::SYSCLK1: GPMCKEN Position */ +#define CLK_SYSCLK1_GPMCKEN_Msk (0x1ul << CLK_SYSCLK1_GPMCKEN_Pos) /*!< CLK_T::SYSCLK1: GPMCKEN Mask */ + +#define CLK_SYSCLK1_GPNCKEN_Pos (29) /*!< CLK_T::SYSCLK1: GPNCKEN Position */ +#define CLK_SYSCLK1_GPNCKEN_Msk (0x1ul << CLK_SYSCLK1_GPNCKEN_Pos) /*!< CLK_T::SYSCLK1: GPNCKEN Mask */ + +#define CLK_APBCLK0_TMR0CKEN_Pos (0) /*!< CLK_T::APBCLK0: TMR0CKEN Position */ +#define CLK_APBCLK0_TMR0CKEN_Msk (0x1ul << CLK_APBCLK0_TMR0CKEN_Pos) /*!< CLK_T::APBCLK0: TMR0CKEN Mask */ + +#define CLK_APBCLK0_TMR1CKEN_Pos (1) /*!< CLK_T::APBCLK0: TMR1CKEN Position */ +#define CLK_APBCLK0_TMR1CKEN_Msk (0x1ul << CLK_APBCLK0_TMR1CKEN_Pos) /*!< CLK_T::APBCLK0: TMR1CKEN Mask */ + +#define CLK_APBCLK0_TMR2CKEN_Pos (2) /*!< CLK_T::APBCLK0: TMR2CKEN Position */ +#define CLK_APBCLK0_TMR2CKEN_Msk (0x1ul << CLK_APBCLK0_TMR2CKEN_Pos) /*!< CLK_T::APBCLK0: TMR2CKEN Mask */ + +#define CLK_APBCLK0_TMR3CKEN_Pos (3) /*!< CLK_T::APBCLK0: TMR3CKEN Position */ +#define CLK_APBCLK0_TMR3CKEN_Msk (0x1ul << CLK_APBCLK0_TMR3CKEN_Pos) /*!< CLK_T::APBCLK0: TMR3CKEN Mask */ + +#define CLK_APBCLK0_TMR4CKEN_Pos (4) /*!< CLK_T::APBCLK0: TMR4CKEN Position */ +#define CLK_APBCLK0_TMR4CKEN_Msk (0x1ul << CLK_APBCLK0_TMR4CKEN_Pos) /*!< CLK_T::APBCLK0: TMR4CKEN Mask */ + +#define CLK_APBCLK0_TMR5CKEN_Pos (5) /*!< CLK_T::APBCLK0: TMR5CKEN Position */ +#define CLK_APBCLK0_TMR5CKEN_Msk (0x1ul << CLK_APBCLK0_TMR5CKEN_Pos) /*!< CLK_T::APBCLK0: TMR5CKEN Mask */ + +#define CLK_APBCLK0_TMR6CKEN_Pos (6) /*!< CLK_T::APBCLK0: TMR6CKEN Position */ +#define CLK_APBCLK0_TMR6CKEN_Msk (0x1ul << CLK_APBCLK0_TMR6CKEN_Pos) /*!< CLK_T::APBCLK0: TMR6CKEN Mask */ + +#define CLK_APBCLK0_TMR7CKEN_Pos (7) /*!< CLK_T::APBCLK0: TMR7CKEN Position */ +#define CLK_APBCLK0_TMR7CKEN_Msk (0x1ul << CLK_APBCLK0_TMR7CKEN_Pos) /*!< CLK_T::APBCLK0: TMR7CKEN Mask */ + +#define CLK_APBCLK0_TMR8CKEN_Pos (8) /*!< CLK_T::APBCLK0: TMR8CKEN Position */ +#define CLK_APBCLK0_TMR8CKEN_Msk (0x1ul << CLK_APBCLK0_TMR8CKEN_Pos) /*!< CLK_T::APBCLK0: TMR8CKEN Mask */ + +#define CLK_APBCLK0_TMR9CKEN_Pos (9) /*!< CLK_T::APBCLK0: TMR9CKEN Position */ +#define CLK_APBCLK0_TMR9CKEN_Msk (0x1ul << CLK_APBCLK0_TMR9CKEN_Pos) /*!< CLK_T::APBCLK0: TMR9CKEN Mask */ + +#define CLK_APBCLK0_TMR10CKEN_Pos (10) /*!< CLK_T::APBCLK0: TMR10CKEN Position */ +#define CLK_APBCLK0_TMR10CKEN_Msk (0x1ul << CLK_APBCLK0_TMR10CKEN_Pos) /*!< CLK_T::APBCLK0: TMR10CKEN Mask */ + +#define CLK_APBCLK0_TMR11CKEN_Pos (11) /*!< CLK_T::APBCLK0: TMR11CKEN Position */ +#define CLK_APBCLK0_TMR11CKEN_Msk (0x1ul << CLK_APBCLK0_TMR11CKEN_Pos) /*!< CLK_T::APBCLK0: TMR11CKEN Mask */ + +#define CLK_APBCLK0_UART0CKEN_Pos (12) /*!< CLK_T::APBCLK0: UART0CKEN Position */ +#define CLK_APBCLK0_UART0CKEN_Msk (0x1ul << CLK_APBCLK0_UART0CKEN_Pos) /*!< CLK_T::APBCLK0: UART0CKEN Mask */ + +#define CLK_APBCLK0_UART1CKEN_Pos (13) /*!< CLK_T::APBCLK0: UART1CKEN Position */ +#define CLK_APBCLK0_UART1CKEN_Msk (0x1ul << CLK_APBCLK0_UART1CKEN_Pos) /*!< CLK_T::APBCLK0: UART1CKEN Mask */ + +#define CLK_APBCLK0_UART2CKEN_Pos (14) /*!< CLK_T::APBCLK0: UART2CKEN Position */ +#define CLK_APBCLK0_UART2CKEN_Msk (0x1ul << CLK_APBCLK0_UART2CKEN_Pos) /*!< CLK_T::APBCLK0: UART2CKEN Mask */ + +#define CLK_APBCLK0_UART3CKEN_Pos (15) /*!< CLK_T::APBCLK0: UART3CKEN Position */ +#define CLK_APBCLK0_UART3CKEN_Msk (0x1ul << CLK_APBCLK0_UART3CKEN_Pos) /*!< CLK_T::APBCLK0: UART3CKEN Mask */ + +#define CLK_APBCLK0_UART4CKEN_Pos (16) /*!< CLK_T::APBCLK0: UART4CKEN Position */ +#define CLK_APBCLK0_UART4CKEN_Msk (0x1ul << CLK_APBCLK0_UART4CKEN_Pos) /*!< CLK_T::APBCLK0: UART4CKEN Mask */ + +#define CLK_APBCLK0_UART5CKEN_Pos (17) /*!< CLK_T::APBCLK0: UART5CKEN Position */ +#define CLK_APBCLK0_UART5CKEN_Msk (0x1ul << CLK_APBCLK0_UART5CKEN_Pos) /*!< CLK_T::APBCLK0: UART5CKEN Mask */ + +#define CLK_APBCLK0_UART6CKEN_Pos (18) /*!< CLK_T::APBCLK0: UART6CKEN Position */ +#define CLK_APBCLK0_UART6CKEN_Msk (0x1ul << CLK_APBCLK0_UART6CKEN_Pos) /*!< CLK_T::APBCLK0: UART6CKEN Mask */ + +#define CLK_APBCLK0_UART7CKEN_Pos (19) /*!< CLK_T::APBCLK0: UART7CKEN Position */ +#define CLK_APBCLK0_UART7CKEN_Msk (0x1ul << CLK_APBCLK0_UART7CKEN_Pos) /*!< CLK_T::APBCLK0: UART7CKEN Mask */ + +#define CLK_APBCLK0_UART8CKEN_Pos (20) /*!< CLK_T::APBCLK0: UART8CKEN Position */ +#define CLK_APBCLK0_UART8CKEN_Msk (0x1ul << CLK_APBCLK0_UART8CKEN_Pos) /*!< CLK_T::APBCLK0: UART8CKEN Mask */ + +#define CLK_APBCLK0_UART9CKEN_Pos (21) /*!< CLK_T::APBCLK0: UART9CKEN Position */ +#define CLK_APBCLK0_UART9CKEN_Msk (0x1ul << CLK_APBCLK0_UART9CKEN_Pos) /*!< CLK_T::APBCLK0: UART9CKEN Mask */ + +#define CLK_APBCLK0_UART10CKEN_Pos (22) /*!< CLK_T::APBCLK0: UART10CKEN Position */ +#define CLK_APBCLK0_UART10CKEN_Msk (0x1ul << CLK_APBCLK0_UART10CKEN_Pos) /*!< CLK_T::APBCLK0: UART10CKEN Mask */ + +#define CLK_APBCLK0_UART11CKEN_Pos (23) /*!< CLK_T::APBCLK0: UART11CKEN Position */ +#define CLK_APBCLK0_UART11CKEN_Msk (0x1ul << CLK_APBCLK0_UART11CKEN_Pos) /*!< CLK_T::APBCLK0: UART11CKEN Mask */ + +#define CLK_APBCLK0_UART12CKEN_Pos (24) /*!< CLK_T::APBCLK0: UART12CKEN Position */ +#define CLK_APBCLK0_UART12CKEN_Msk (0x1ul << CLK_APBCLK0_UART12CKEN_Pos) /*!< CLK_T::APBCLK0: UART12CKEN Mask */ + +#define CLK_APBCLK0_UART13CKEN_Pos (25) /*!< CLK_T::APBCLK0: UART13CKEN Position */ +#define CLK_APBCLK0_UART13CKEN_Msk (0x1ul << CLK_APBCLK0_UART13CKEN_Pos) /*!< CLK_T::APBCLK0: UART13CKEN Mask */ + +#define CLK_APBCLK0_UART14CKEN_Pos (26) /*!< CLK_T::APBCLK0: UART14CKEN Position */ +#define CLK_APBCLK0_UART14CKEN_Msk (0x1ul << CLK_APBCLK0_UART14CKEN_Pos) /*!< CLK_T::APBCLK0: UART14CKEN Mask */ + +#define CLK_APBCLK0_UART15CKEN_Pos (27) /*!< CLK_T::APBCLK0: UART15CKEN Position */ +#define CLK_APBCLK0_UART15CKEN_Msk (0x1ul << CLK_APBCLK0_UART15CKEN_Pos) /*!< CLK_T::APBCLK0: UART15CKEN Mask */ + +#define CLK_APBCLK0_UART16CKEN_Pos (28) /*!< CLK_T::APBCLK0: UART16CKEN Position */ +#define CLK_APBCLK0_UART16CKEN_Msk (0x1ul << CLK_APBCLK0_UART16CKEN_Pos) /*!< CLK_T::APBCLK0: UART16CKEN Mask */ + +#define CLK_APBCLK0_RTCCKEN_Pos (29) /*!< CLK_T::APBCLK0: RTCCKEN Position */ +#define CLK_APBCLK0_RTCCKEN_Msk (0x1ul << CLK_APBCLK0_RTCCKEN_Pos) /*!< CLK_T::APBCLK0: RTCCKEN Mask */ + +#define CLK_APBCLK0_DDRPCKEN_Pos (30) /*!< CLK_T::APBCLK0: DDRPCKEN Position */ +#define CLK_APBCLK0_DDRPCKEN_Msk (0x1ul << CLK_APBCLK0_DDRPCKEN_Pos) /*!< CLK_T::APBCLK0: DDRPCKEN Mask */ + +#define CLK_APBCLK0_KPICKEN_Pos (31) /*!< CLK_T::APBCLK0: KPICKEN Position */ +#define CLK_APBCLK0_KPICKEN_Msk (0x1ul << CLK_APBCLK0_KPICKEN_Pos) /*!< CLK_T::APBCLK0: KPICKEN Mask */ + +#define CLK_APBCLK1_I2C0CKEN_Pos (0) /*!< CLK_T::APBCLK1: I2C0CKEN Position */ +#define CLK_APBCLK1_I2C0CKEN_Msk (0x1ul << CLK_APBCLK1_I2C0CKEN_Pos) /*!< CLK_T::APBCLK1: I2C0CKEN Mask */ + +#define CLK_APBCLK1_I2C1CKEN_Pos (1) /*!< CLK_T::APBCLK1: I2C1CKEN Position */ +#define CLK_APBCLK1_I2C1CKEN_Msk (0x1ul << CLK_APBCLK1_I2C1CKEN_Pos) /*!< CLK_T::APBCLK1: I2C1CKEN Mask */ + +#define CLK_APBCLK1_I2C2CKEN_Pos (2) /*!< CLK_T::APBCLK1: I2C2CKEN Position */ +#define CLK_APBCLK1_I2C2CKEN_Msk (0x1ul << CLK_APBCLK1_I2C2CKEN_Pos) /*!< CLK_T::APBCLK1: I2C2CKEN Mask */ + +#define CLK_APBCLK1_I2C3CKEN_Pos (3) /*!< CLK_T::APBCLK1: I2C3CKEN Position */ +#define CLK_APBCLK1_I2C3CKEN_Msk (0x1ul << CLK_APBCLK1_I2C3CKEN_Pos) /*!< CLK_T::APBCLK1: I2C3CKEN Mask */ + +#define CLK_APBCLK1_I2C4CKEN_Pos (4) /*!< CLK_T::APBCLK1: I2C4CKEN Position */ +#define CLK_APBCLK1_I2C4CKEN_Msk (0x1ul << CLK_APBCLK1_I2C4CKEN_Pos) /*!< CLK_T::APBCLK1: I2C4CKEN Mask */ + +#define CLK_APBCLK1_I2C5CKEN_Pos (5) /*!< CLK_T::APBCLK1: I2C5CKEN Position */ +#define CLK_APBCLK1_I2C5CKEN_Msk (0x1ul << CLK_APBCLK1_I2C5CKEN_Pos) /*!< CLK_T::APBCLK1: I2C5CKEN Mask */ + +#define CLK_APBCLK1_QSPI0CKEN_Pos (6) /*!< CLK_T::APBCLK1: QSPI0CKEN Position */ +#define CLK_APBCLK1_QSPI0CKEN_Msk (0x1ul << CLK_APBCLK1_QSPI0CKEN_Pos) /*!< CLK_T::APBCLK1: QSPI0CKEN Mask */ + +#define CLK_APBCLK1_QSPI1CKEN_Pos (7) /*!< CLK_T::APBCLK1: QSPI1CKEN Position */ +#define CLK_APBCLK1_QSPI1CKEN_Msk (0x1ul << CLK_APBCLK1_QSPI1CKEN_Pos) /*!< CLK_T::APBCLK1: QSPI1CKEN Mask */ + +#define CLK_APBCLK1_SC0CKEN_Pos (12) /*!< CLK_T::APBCLK1: SC0CKEN Position */ +#define CLK_APBCLK1_SC0CKEN_Msk (0x1ul << CLK_APBCLK1_SC0CKEN_Pos) /*!< CLK_T::APBCLK1: SC0CKEN Mask */ + +#define CLK_APBCLK1_SC1CKEN_Pos (13) /*!< CLK_T::APBCLK1: SC1CKEN Position */ +#define CLK_APBCLK1_SC1CKEN_Msk (0x1ul << CLK_APBCLK1_SC1CKEN_Pos) /*!< CLK_T::APBCLK1: SC1CKEN Mask */ + +#define CLK_APBCLK1_WDT0CKEN_Pos (16) /*!< CLK_T::APBCLK1: WDT0CKEN Position */ +#define CLK_APBCLK1_WDT0CKEN_Msk (0x1ul << CLK_APBCLK1_WDT0CKEN_Pos) /*!< CLK_T::APBCLK1: WDT0CKEN Mask */ + +#define CLK_APBCLK1_WDT1CKEN_Pos (17) /*!< CLK_T::APBCLK1: WDT1CKEN Position */ +#define CLK_APBCLK1_WDT1CKEN_Msk (0x1ul << CLK_APBCLK1_WDT1CKEN_Pos) /*!< CLK_T::APBCLK1: WDT1CKEN Mask */ + +#define CLK_APBCLK1_WDT2CKEN_Pos (18) /*!< CLK_T::APBCLK1: WDT2CKEN Position */ +#define CLK_APBCLK1_WDT2CKEN_Msk (0x1ul << CLK_APBCLK1_WDT2CKEN_Pos) /*!< CLK_T::APBCLK1: WDT2CKEN Mask */ + +#define CLK_APBCLK1_EPWM0CKEN_Pos (24) /*!< CLK_T::APBCLK1: EPWM0CKEN Position */ +#define CLK_APBCLK1_EPWM0CKEN_Msk (0x1ul << CLK_APBCLK1_EPWM0CKEN_Pos) /*!< CLK_T::APBCLK1: EPWM0CKEN Mask */ + +#define CLK_APBCLK1_EPWM1CKEN_Pos (25) /*!< CLK_T::APBCLK1: EPWM1CKEN Position */ +#define CLK_APBCLK1_EPWM1CKEN_Msk (0x1ul << CLK_APBCLK1_EPWM1CKEN_Pos) /*!< CLK_T::APBCLK1: EPWM1CKEN Mask */ + +#define CLK_APBCLK1_EPWM2CKEN_Pos (26) /*!< CLK_T::APBCLK1: EPWM2CKEN Position */ +#define CLK_APBCLK1_EPWM2CKEN_Msk (0x1ul << CLK_APBCLK1_EPWM2CKEN_Pos) /*!< CLK_T::APBCLK1: EPWM2CKEN Mask */ + +#define CLK_APBCLK2_I2S0CKEN_Pos (0) /*!< CLK_T::APBCLK2: I2S0CKEN Position */ +#define CLK_APBCLK2_I2S0CKEN_Msk (0x1ul << CLK_APBCLK2_I2S0CKEN_Pos) /*!< CLK_T::APBCLK2: I2S0CKEN Mask */ + +#define CLK_APBCLK2_I2S1CKEN_Pos (1) /*!< CLK_T::APBCLK2: I2S1CKEN Position */ +#define CLK_APBCLK2_I2S1CKEN_Msk (0x1ul << CLK_APBCLK2_I2S1CKEN_Pos) /*!< CLK_T::APBCLK2: I2S1CKEN Mask */ + +#define CLK_APBCLK2_SSMCCEN_Pos (2) /*!< CLK_T::APBCLK2: SSMCCEN Position */ +#define CLK_APBCLK2_SSMCCEN_Msk (0x1ul << CLK_APBCLK2_SSMCCEN_Pos) /*!< CLK_T::APBCLK2: SSMCCEN Mask */ + +#define CLK_APBCLK2_SSPCCEN_Pos (3) /*!< CLK_T::APBCLK2: SSPCCEN Position */ +#define CLK_APBCLK2_SSPCCEN_Msk (0x1ul << CLK_APBCLK2_SSPCCEN_Pos) /*!< CLK_T::APBCLK2: SSPCCEN Mask */ + +#define CLK_APBCLK2_SPI0CKEN_Pos (4) /*!< CLK_T::APBCLK2: SPI0CKEN Position */ +#define CLK_APBCLK2_SPI0CKEN_Msk (0x1ul << CLK_APBCLK2_SPI0CKEN_Pos) /*!< CLK_T::APBCLK2: SPI0CKEN Mask */ + +#define CLK_APBCLK2_SPI1CKEN_Pos (5) /*!< CLK_T::APBCLK2: SPI1CKEN Position */ +#define CLK_APBCLK2_SPI1CKEN_Msk (0x1ul << CLK_APBCLK2_SPI1CKEN_Pos) /*!< CLK_T::APBCLK2: SPI1CKEN Mask */ + +#define CLK_APBCLK2_SPI2CKEN_Pos (6) /*!< CLK_T::APBCLK2: SPI2CKEN Position */ +#define CLK_APBCLK2_SPI2CKEN_Msk (0x1ul << CLK_APBCLK2_SPI2CKEN_Pos) /*!< CLK_T::APBCLK2: SPI2CKEN Mask */ + +#define CLK_APBCLK2_SPI3CKEN_Pos (7) /*!< CLK_T::APBCLK2: SPI3CKEN Position */ +#define CLK_APBCLK2_SPI3CKEN_Msk (0x1ul << CLK_APBCLK2_SPI3CKEN_Pos) /*!< CLK_T::APBCLK2: SPI3CKEN Mask */ + +#define CLK_APBCLK2_ECAP0CKEN_Pos (8) /*!< CLK_T::APBCLK2: ECAP0CKEN Position */ +#define CLK_APBCLK2_ECAP0CKEN_Msk (0x1ul << CLK_APBCLK2_ECAP0CKEN_Pos) /*!< CLK_T::APBCLK2: ECAP0CKEN Mask */ + +#define CLK_APBCLK2_ECAP1CKEN_Pos (9) /*!< CLK_T::APBCLK2: ECAP1CKEN Position */ +#define CLK_APBCLK2_ECAP1CKEN_Msk (0x1ul << CLK_APBCLK2_ECAP1CKEN_Pos) /*!< CLK_T::APBCLK2: ECAP1CKEN Mask */ + +#define CLK_APBCLK2_ECAP2CKEN_Pos (10) /*!< CLK_T::APBCLK2: ECAP2CKEN Position */ +#define CLK_APBCLK2_ECAP2CKEN_Msk (0x1ul << CLK_APBCLK2_ECAP2CKEN_Pos) /*!< CLK_T::APBCLK2: ECAP2CKEN Mask */ + +#define CLK_APBCLK2_QEI0CKEN_Pos (12) /*!< CLK_T::APBCLK2: QEI0CKEN Position */ +#define CLK_APBCLK2_QEI0CKEN_Msk (0x1ul << CLK_APBCLK2_QEI0CKEN_Pos) /*!< CLK_T::APBCLK2: QEI0CKEN Mask */ + +#define CLK_APBCLK2_QEI1CKEN_Pos (13) /*!< CLK_T::APBCLK2: QEI1CKEN Position */ +#define CLK_APBCLK2_QEI1CKEN_Msk (0x1ul << CLK_APBCLK2_QEI1CKEN_Pos) /*!< CLK_T::APBCLK2: QEI1CKEN Mask */ + +#define CLK_APBCLK2_QEI2CKEN_Pos (14) /*!< CLK_T::APBCLK2: QEI2CKEN Position */ +#define CLK_APBCLK2_QEI2CKEN_Msk (0x1ul << CLK_APBCLK2_QEI2CKEN_Pos) /*!< CLK_T::APBCLK2: QEI2CKEN Mask */ + +#define CLK_APBCLK2_ADCCKEN_Pos (24) /*!< CLK_T::APBCLK2: ADCCKEN Position */ +#define CLK_APBCLK2_ADCCKEN_Msk (0x1ul << CLK_APBCLK2_ADCCKEN_Pos) /*!< CLK_T::APBCLK2: ADCCKEN Mask */ + +#define CLK_APBCLK2_EADCCKEN_Pos (25) /*!< CLK_T::APBCLK2: EADCCKEN Position */ +#define CLK_APBCLK2_EADCCKEN_Msk (0x1ul << CLK_APBCLK2_EADCCKEN_Pos) /*!< CLK_T::APBCLK2: EADCCKEN Mask */ + +#define CLK_CLKSEL0_CA35CKSEL_Pos (0) /*!< CLK_T::CLKSEL0: CA35CKSEL Position */ +#define CLK_CLKSEL0_CA35CKSEL_Msk (0x3ul << CLK_CLKSEL0_CA35CKSEL_Pos) /*!< CLK_T::CLKSEL0: CA35CKSEL Mask */ + +#define CLK_CLKSEL0_SYSCK0SEL_Pos (2) /*!< CLK_T::CLKSEL0: SYSCK0SEL Position */ +#define CLK_CLKSEL0_SYSCK0SEL_Msk (0x1ul << CLK_CLKSEL0_SYSCK0SEL_Pos) /*!< CLK_T::CLKSEL0: SYSCK0SEL Mask */ + +#define CLK_CLKSEL0_LVRDBSEL_Pos (3) /*!< CLK_T::CLKSEL0: LVRDBSEL Position */ +#define CLK_CLKSEL0_LVRDBSEL_Msk (0x1ul << CLK_CLKSEL0_LVRDBSEL_Pos) /*!< CLK_T::CLKSEL0: LVRDBSEL Mask */ + +#define CLK_CLKSEL0_SYSCK1SEL_Pos (4) /*!< CLK_T::CLKSEL0: SYSCK1SEL Position */ +#define CLK_CLKSEL0_SYSCK1SEL_Msk (0x1ul << CLK_CLKSEL0_SYSCK1SEL_Pos) /*!< CLK_T::CLKSEL0: SYSCK1SEL Mask */ + +#define CLK_CLKSEL0_RTPSTSEL_Pos (8) /*!< CLK_T::CLKSEL0: RTPSTSEL Position */ +#define CLK_CLKSEL0_RTPSTSEL_Msk (0x7ul << CLK_CLKSEL0_RTPSTSEL_Pos) /*!< CLK_T::CLKSEL0: RTPSTSEL Mask */ + +#define CLK_CLKSEL0_CCAP0SEL_Pos (12) /*!< CLK_T::CLKSEL0: CCAP0SEL Position */ +#define CLK_CLKSEL0_CCAP0SEL_Msk (0x3ul << CLK_CLKSEL0_CCAP0SEL_Pos) /*!< CLK_T::CLKSEL0: CCAP0SEL Mask */ + +#define CLK_CLKSEL0_CCAP1SEL_Pos (14) /*!< CLK_T::CLKSEL0: CCAP1SEL Position */ +#define CLK_CLKSEL0_CCAP1SEL_Msk (0x3ul << CLK_CLKSEL0_CCAP1SEL_Pos) /*!< CLK_T::CLKSEL0: CCAP1SEL Mask */ + +#define CLK_CLKSEL0_SD0SEL_Pos (16) /*!< CLK_T::CLKSEL0: SD0SEL Position */ +#define CLK_CLKSEL0_SD0SEL_Msk (0x3ul << CLK_CLKSEL0_SD0SEL_Pos) /*!< CLK_T::CLKSEL0: SD0SEL Mask */ + +#define CLK_CLKSEL0_SD1SEL_Pos (18) /*!< CLK_T::CLKSEL0: SD1SEL Position */ +#define CLK_CLKSEL0_SD1SEL_Msk (0x3ul << CLK_CLKSEL0_SD1SEL_Pos) /*!< CLK_T::CLKSEL0: SD1SEL Mask */ + +#define CLK_CLKSEL0_DCUSEL_Pos (24) /*!< CLK_T::CLKSEL0: DCUSEL Position */ +#define CLK_CLKSEL0_DCUSEL_Msk (0x1ul << CLK_CLKSEL0_DCUSEL_Pos) /*!< CLK_T::CLKSEL0: DCUSEL Mask */ + +#define CLK_CLKSEL0_GFXSEL_Pos (26) /*!< CLK_T::CLKSEL0: GFXSEL Position */ +#define CLK_CLKSEL0_GFXSEL_Msk (0x1ul << CLK_CLKSEL0_GFXSEL_Pos) /*!< CLK_T::CLKSEL0: GFXSEL Mask */ + +#define CLK_CLKSEL0_DBGSEL_Pos (27) /*!< CLK_T::CLKSEL0: DBGSEL Position */ +#define CLK_CLKSEL0_DBGSEL_Msk (0x1ul << CLK_CLKSEL0_DBGSEL_Pos) /*!< CLK_T::CLKSEL0: DBGSEL Mask */ + +#define CLK_CLKSEL1_TMR0SEL_Pos (0) /*!< CLK_T::CLKSEL1: TMR0SEL Position */ +#define CLK_CLKSEL1_TMR0SEL_Msk (0x7ul << CLK_CLKSEL1_TMR0SEL_Pos) /*!< CLK_T::CLKSEL1: TMR0SEL Mask */ + +#define CLK_CLKSEL1_TMR1SEL_Pos (4) /*!< CLK_T::CLKSEL1: TMR1SEL Position */ +#define CLK_CLKSEL1_TMR1SEL_Msk (0x7ul << CLK_CLKSEL1_TMR1SEL_Pos) /*!< CLK_T::CLKSEL1: TMR1SEL Mask */ + +#define CLK_CLKSEL1_TMR2SEL_Pos (8) /*!< CLK_T::CLKSEL1: TMR2SEL Position */ +#define CLK_CLKSEL1_TMR2SEL_Msk (0x7ul << CLK_CLKSEL1_TMR2SEL_Pos) /*!< CLK_T::CLKSEL1: TMR2SEL Mask */ + +#define CLK_CLKSEL1_TMR3SEL_Pos (12) /*!< CLK_T::CLKSEL1: TMR3SEL Position */ +#define CLK_CLKSEL1_TMR3SEL_Msk (0x7ul << CLK_CLKSEL1_TMR3SEL_Pos) /*!< CLK_T::CLKSEL1: TMR3SEL Mask */ + +#define CLK_CLKSEL1_TMR4SEL_Pos (16) /*!< CLK_T::CLKSEL1: TMR4SEL Position */ +#define CLK_CLKSEL1_TMR4SEL_Msk (0x7ul << CLK_CLKSEL1_TMR4SEL_Pos) /*!< CLK_T::CLKSEL1: TMR4SEL Mask */ + +#define CLK_CLKSEL1_TMR5SEL_Pos (20) /*!< CLK_T::CLKSEL1: TMR5SEL Position */ +#define CLK_CLKSEL1_TMR5SEL_Msk (0x7ul << CLK_CLKSEL1_TMR5SEL_Pos) /*!< CLK_T::CLKSEL1: TMR5SEL Mask */ + +#define CLK_CLKSEL1_TMR6SEL_Pos (24) /*!< CLK_T::CLKSEL1: TMR6SEL Position */ +#define CLK_CLKSEL1_TMR6SEL_Msk (0x7ul << CLK_CLKSEL1_TMR6SEL_Pos) /*!< CLK_T::CLKSEL1: TMR6SEL Mask */ + +#define CLK_CLKSEL1_TMR7SEL_Pos (28) /*!< CLK_T::CLKSEL1: TMR7SEL Position */ +#define CLK_CLKSEL1_TMR7SEL_Msk (0x7ul << CLK_CLKSEL1_TMR7SEL_Pos) /*!< CLK_T::CLKSEL1: TMR7SEL Mask */ + +#define CLK_CLKSEL2_TMR8SEL_Pos (0) /*!< CLK_T::CLKSEL2: TMR8SEL Position */ +#define CLK_CLKSEL2_TMR8SEL_Msk (0x7ul << CLK_CLKSEL2_TMR8SEL_Pos) /*!< CLK_T::CLKSEL2: TMR8SEL Mask */ + +#define CLK_CLKSEL2_TMR9SEL_Pos (4) /*!< CLK_T::CLKSEL2: TMR9SEL Position */ +#define CLK_CLKSEL2_TMR9SEL_Msk (0x7ul << CLK_CLKSEL2_TMR9SEL_Pos) /*!< CLK_T::CLKSEL2: TMR9SEL Mask */ + +#define CLK_CLKSEL2_TMR10SEL_Pos (8) /*!< CLK_T::CLKSEL2: TMR10SEL Position */ +#define CLK_CLKSEL2_TMR10SEL_Msk (0x7ul << CLK_CLKSEL2_TMR10SEL_Pos) /*!< CLK_T::CLKSEL2: TMR10SEL Mask */ + +#define CLK_CLKSEL2_TMR11SEL_Pos (12) /*!< CLK_T::CLKSEL2: TMR11SEL Position */ +#define CLK_CLKSEL2_TMR11SEL_Msk (0x7ul << CLK_CLKSEL2_TMR11SEL_Pos) /*!< CLK_T::CLKSEL2: TMR11SEL Mask */ + +#define CLK_CLKSEL2_UART0SEL_Pos (16) /*!< CLK_T::CLKSEL2: UART0SEL Position */ +#define CLK_CLKSEL2_UART0SEL_Msk (0x3ul << CLK_CLKSEL2_UART0SEL_Pos) /*!< CLK_T::CLKSEL2: UART0SEL Mask */ + +#define CLK_CLKSEL2_UART1SEL_Pos (18) /*!< CLK_T::CLKSEL2: UART1SEL Position */ +#define CLK_CLKSEL2_UART1SEL_Msk (0x3ul << CLK_CLKSEL2_UART1SEL_Pos) /*!< CLK_T::CLKSEL2: UART1SEL Mask */ + +#define CLK_CLKSEL2_UART2SEL_Pos (20) /*!< CLK_T::CLKSEL2: UART2SEL Position */ +#define CLK_CLKSEL2_UART2SEL_Msk (0x3ul << CLK_CLKSEL2_UART2SEL_Pos) /*!< CLK_T::CLKSEL2: UART2SEL Mask */ + +#define CLK_CLKSEL2_UART3SEL_Pos (22) /*!< CLK_T::CLKSEL2: UART3SEL Position */ +#define CLK_CLKSEL2_UART3SEL_Msk (0x3ul << CLK_CLKSEL2_UART3SEL_Pos) /*!< CLK_T::CLKSEL2: UART3SEL Mask */ + +#define CLK_CLKSEL2_UART4SEL_Pos (24) /*!< CLK_T::CLKSEL2: UART4SEL Position */ +#define CLK_CLKSEL2_UART4SEL_Msk (0x3ul << CLK_CLKSEL2_UART4SEL_Pos) /*!< CLK_T::CLKSEL2: UART4SEL Mask */ + +#define CLK_CLKSEL2_UART5SEL_Pos (26) /*!< CLK_T::CLKSEL2: UART5SEL Position */ +#define CLK_CLKSEL2_UART5SEL_Msk (0x3ul << CLK_CLKSEL2_UART5SEL_Pos) /*!< CLK_T::CLKSEL2: UART5SEL Mask */ + +#define CLK_CLKSEL2_UART6SEL_Pos (28) /*!< CLK_T::CLKSEL2: UART6SEL Position */ +#define CLK_CLKSEL2_UART6SEL_Msk (0x3ul << CLK_CLKSEL2_UART6SEL_Pos) /*!< CLK_T::CLKSEL2: UART6SEL Mask */ + +#define CLK_CLKSEL2_UART7SEL_Pos (30) /*!< CLK_T::CLKSEL2: UART7SEL Position */ +#define CLK_CLKSEL2_UART7SEL_Msk (0x3ul << CLK_CLKSEL2_UART7SEL_Pos) /*!< CLK_T::CLKSEL2: UART7SEL Mask */ + +#define CLK_CLKSEL3_UART8SEL_Pos (0) /*!< CLK_T::CLKSEL3: UART8SEL Position */ +#define CLK_CLKSEL3_UART8SEL_Msk (0x3ul << CLK_CLKSEL3_UART8SEL_Pos) /*!< CLK_T::CLKSEL3: UART8SEL Mask */ + +#define CLK_CLKSEL3_UART9SEL_Pos (2) /*!< CLK_T::CLKSEL3: UART9SEL Position */ +#define CLK_CLKSEL3_UART9SEL_Msk (0x3ul << CLK_CLKSEL3_UART9SEL_Pos) /*!< CLK_T::CLKSEL3: UART9SEL Mask */ + +#define CLK_CLKSEL3_UART10SEL_Pos (4) /*!< CLK_T::CLKSEL3: UART10SEL Position */ +#define CLK_CLKSEL3_UART10SEL_Msk (0x3ul << CLK_CLKSEL3_UART10SEL_Pos) /*!< CLK_T::CLKSEL3: UART10SEL Mask */ + +#define CLK_CLKSEL3_UART11SEL_Pos (6) /*!< CLK_T::CLKSEL3: UART11SEL Position */ +#define CLK_CLKSEL3_UART11SEL_Msk (0x3ul << CLK_CLKSEL3_UART11SEL_Pos) /*!< CLK_T::CLKSEL3: UART11SEL Mask */ + +#define CLK_CLKSEL3_UART12SEL_Pos (8) /*!< CLK_T::CLKSEL3: UART12SEL Position */ +#define CLK_CLKSEL3_UART12SEL_Msk (0x3ul << CLK_CLKSEL3_UART12SEL_Pos) /*!< CLK_T::CLKSEL3: UART12SEL Mask */ + +#define CLK_CLKSEL3_UART13SEL_Pos (10) /*!< CLK_T::CLKSEL3: UART13SEL Position */ +#define CLK_CLKSEL3_UART13SEL_Msk (0x3ul << CLK_CLKSEL3_UART13SEL_Pos) /*!< CLK_T::CLKSEL3: UART13SEL Mask */ + +#define CLK_CLKSEL3_UART14SEL_Pos (12) /*!< CLK_T::CLKSEL3: UART14SEL Position */ +#define CLK_CLKSEL3_UART14SEL_Msk (0x3ul << CLK_CLKSEL3_UART14SEL_Pos) /*!< CLK_T::CLKSEL3: UART14SEL Mask */ + +#define CLK_CLKSEL3_UART15SEL_Pos (14) /*!< CLK_T::CLKSEL3: UART15SEL Position */ +#define CLK_CLKSEL3_UART15SEL_Msk (0x3ul << CLK_CLKSEL3_UART15SEL_Pos) /*!< CLK_T::CLKSEL3: UART15SEL Mask */ + +#define CLK_CLKSEL3_UART16SEL_Pos (16) /*!< CLK_T::CLKSEL3: UART16SEL Position */ +#define CLK_CLKSEL3_UART16SEL_Msk (0x3ul << CLK_CLKSEL3_UART16SEL_Pos) /*!< CLK_T::CLKSEL3: UART16SEL Mask */ + +#define CLK_CLKSEL3_WDT0SEL_Pos (20) /*!< CLK_T::CLKSEL3: WDT0SEL Position */ +#define CLK_CLKSEL3_WDT0SEL_Msk (0x3ul << CLK_CLKSEL3_WDT0SEL_Pos) /*!< CLK_T::CLKSEL3: WDT0SEL Mask */ + +#define CLK_CLKSEL3_WWDT0SEL_Pos (22) /*!< CLK_T::CLKSEL3: WWDT0SEL Position */ +#define CLK_CLKSEL3_WWDT0SEL_Msk (0x3ul << CLK_CLKSEL3_WWDT0SEL_Pos) /*!< CLK_T::CLKSEL3: WWDT0SEL Mask */ + +#define CLK_CLKSEL3_WDT1SEL_Pos (24) /*!< CLK_T::CLKSEL3: WDT1SEL Position */ +#define CLK_CLKSEL3_WDT1SEL_Msk (0x3ul << CLK_CLKSEL3_WDT1SEL_Pos) /*!< CLK_T::CLKSEL3: WDT1SEL Mask */ + +#define CLK_CLKSEL3_WWDT1SEL_Pos (26) /*!< CLK_T::CLKSEL3: WWDT1SEL Position */ +#define CLK_CLKSEL3_WWDT1SEL_Msk (0x3ul << CLK_CLKSEL3_WWDT1SEL_Pos) /*!< CLK_T::CLKSEL3: WWDT1SEL Mask */ + +#define CLK_CLKSEL3_WDT2SEL_Pos (28) /*!< CLK_T::CLKSEL3: WDT2SEL Position */ +#define CLK_CLKSEL3_WDT2SEL_Msk (0x3ul << CLK_CLKSEL3_WDT2SEL_Pos) /*!< CLK_T::CLKSEL3: WDT2SEL Mask */ + +#define CLK_CLKSEL3_WWDT2SEL_Pos (30) /*!< CLK_T::CLKSEL3: WWDT2SEL Position */ +#define CLK_CLKSEL3_WWDT2SEL_Msk (0x3ul << CLK_CLKSEL3_WWDT2SEL_Pos) /*!< CLK_T::CLKSEL3: WWDT2SEL Mask */ + +#define CLK_CLKSEL4_SPI0SEL_Pos (0) /*!< CLK_T::CLKSEL4: SPI0SEL Position */ +#define CLK_CLKSEL4_SPI0SEL_Msk (0x3ul << CLK_CLKSEL4_SPI0SEL_Pos) /*!< CLK_T::CLKSEL4: SPI0SEL Mask */ + +#define CLK_CLKSEL4_SPI1SEL_Pos (2) /*!< CLK_T::CLKSEL4: SPI1SEL Position */ +#define CLK_CLKSEL4_SPI1SEL_Msk (0x3ul << CLK_CLKSEL4_SPI1SEL_Pos) /*!< CLK_T::CLKSEL4: SPI1SEL Mask */ + +#define CLK_CLKSEL4_SPI2SEL_Pos (4) /*!< CLK_T::CLKSEL4: SPI2SEL Position */ +#define CLK_CLKSEL4_SPI2SEL_Msk (0x3ul << CLK_CLKSEL4_SPI2SEL_Pos) /*!< CLK_T::CLKSEL4: SPI2SEL Mask */ + +#define CLK_CLKSEL4_SPI3SEL_Pos (6) /*!< CLK_T::CLKSEL4: SPI3SEL Position */ +#define CLK_CLKSEL4_SPI3SEL_Msk (0x3ul << CLK_CLKSEL4_SPI3SEL_Pos) /*!< CLK_T::CLKSEL4: SPI3SEL Mask */ + +#define CLK_CLKSEL4_QSPI0SEL_Pos (8) /*!< CLK_T::CLKSEL4: QSPI0SEL Position */ +#define CLK_CLKSEL4_QSPI0SEL_Msk (0x3ul << CLK_CLKSEL4_QSPI0SEL_Pos) /*!< CLK_T::CLKSEL4: QSPI0SEL Mask */ + +#define CLK_CLKSEL4_QSPI1SEL_Pos (10) /*!< CLK_T::CLKSEL4: QSPI1SEL Position */ +#define CLK_CLKSEL4_QSPI1SEL_Msk (0x3ul << CLK_CLKSEL4_QSPI1SEL_Pos) /*!< CLK_T::CLKSEL4: QSPI1SEL Mask */ + +#define CLK_CLKSEL4_I2S0SEL_Pos (12) /*!< CLK_T::CLKSEL4: I2S0SEL Position */ +#define CLK_CLKSEL4_I2S0SEL_Msk (0x3ul << CLK_CLKSEL4_I2S0SEL_Pos) /*!< CLK_T::CLKSEL4: I2S0SEL Mask */ + +#define CLK_CLKSEL4_I2S1SEL_Pos (14) /*!< CLK_T::CLKSEL4: I2S1SEL Position */ +#define CLK_CLKSEL4_I2S1SEL_Msk (0x3ul << CLK_CLKSEL4_I2S1SEL_Pos) /*!< CLK_T::CLKSEL4: I2S1SEL Mask */ + +#define CLK_CLKSEL4_CANFD0SEL_Pos (16) /*!< CLK_T::CLKSEL4: CANFD0SEL Position */ +#define CLK_CLKSEL4_CANFD0SEL_Msk (0x1ul << CLK_CLKSEL4_CANFD0SEL_Pos) /*!< CLK_T::CLKSEL4: CANFD0SEL Mask */ + +#define CLK_CLKSEL4_CANFD1SEL_Pos (17) /*!< CLK_T::CLKSEL4: CANFD1SEL Position */ +#define CLK_CLKSEL4_CANFD1SEL_Msk (0x1ul << CLK_CLKSEL4_CANFD1SEL_Pos) /*!< CLK_T::CLKSEL4: CANFD1SEL Mask */ + +#define CLK_CLKSEL4_CANFD2SEL_Pos (18) /*!< CLK_T::CLKSEL4: CANFD2SEL Position */ +#define CLK_CLKSEL4_CANFD2SEL_Msk (0x1ul << CLK_CLKSEL4_CANFD2SEL_Pos) /*!< CLK_T::CLKSEL4: CANFD2SEL Mask */ + +#define CLK_CLKSEL4_CANFD3SEL_Pos (19) /*!< CLK_T::CLKSEL4: CANFD3SEL Position */ +#define CLK_CLKSEL4_CANFD3SEL_Msk (0x1ul << CLK_CLKSEL4_CANFD3SEL_Pos) /*!< CLK_T::CLKSEL4: CANFD3SEL Mask */ + +#define CLK_CLKSEL4_CKOSEL_Pos (24) /*!< CLK_T::CLKSEL4: CKOSEL Position */ +#define CLK_CLKSEL4_CKOSEL_Msk (0xful << CLK_CLKSEL4_CKOSEL_Pos) /*!< CLK_T::CLKSEL4: CKOSEL Mask */ + +#define CLK_CLKSEL4_SC0SEL_Pos (28) /*!< CLK_T::CLKSEL4: SC0SEL Position */ +#define CLK_CLKSEL4_SC0SEL_Msk (0x1ul << CLK_CLKSEL4_SC0SEL_Pos) /*!< CLK_T::CLKSEL4: SC0SEL Mask */ + +#define CLK_CLKSEL4_SC1SEL_Pos (29) /*!< CLK_T::CLKSEL4: SC1SEL Position */ +#define CLK_CLKSEL4_SC1SEL_Msk (0x1ul << CLK_CLKSEL4_SC1SEL_Pos) /*!< CLK_T::CLKSEL4: SC1SEL Mask */ + +#define CLK_CLKSEL4_KPISEL_Pos (30) /*!< CLK_T::CLKSEL4: KPISEL Position */ +#define CLK_CLKSEL4_KPISEL_Msk (0x1ul << CLK_CLKSEL4_KPISEL_Pos) /*!< CLK_T::CLKSEL4: KPISEL Mask */ + +#define CLK_CLKDIV0_CANFD0DIV_Pos (0) /*!< CLK_T::CLKDIV0: CANFD0DIV Position */ +#define CLK_CLKDIV0_CANFD0DIV_Msk (0x7ul << CLK_CLKDIV0_CANFD0DIV_Pos) /*!< CLK_T::CLKDIV0: CANFD0DIV Mask */ + +#define CLK_CLKDIV0_CANFD1DIV_Pos (4) /*!< CLK_T::CLKDIV0: CANFD1DIV Position */ +#define CLK_CLKDIV0_CANFD1DIV_Msk (0x7ul << CLK_CLKDIV0_CANFD1DIV_Pos) /*!< CLK_T::CLKDIV0: CANFD1DIV Mask */ + +#define CLK_CLKDIV0_CANFD2DIV_Pos (8) /*!< CLK_T::CLKDIV0: CANFD2DIV Position */ +#define CLK_CLKDIV0_CANFD2DIV_Msk (0x7ul << CLK_CLKDIV0_CANFD2DIV_Pos) /*!< CLK_T::CLKDIV0: CANFD2DIV Mask */ + +#define CLK_CLKDIV0_CANFD3DIV_Pos (12) /*!< CLK_T::CLKDIV0: CANFD3DIV Position */ +#define CLK_CLKDIV0_CANFD3DIV_Msk (0x7ul << CLK_CLKDIV0_CANFD3DIV_Pos) /*!< CLK_T::CLKDIV0: CANFD3DIV Mask */ + +#define CLK_CLKDIV0_DCUPDIV_Pos (16) /*!< CLK_T::CLKDIV0: DCUPDIV Position */ +#define CLK_CLKDIV0_DCUPDIV_Msk (0x7ul << CLK_CLKDIV0_DCUPDIV_Pos) /*!< CLK_T::CLKDIV0: DCUPDIV Mask */ + +#define CLK_CLKDIV0_ACLK0DIV_Pos (26) /*!< CLK_T::CLKDIV0: ACLK0DIV Position */ +#define CLK_CLKDIV0_ACLK0DIV_Msk (0x1ul << CLK_CLKDIV0_ACLK0DIV_Pos) /*!< CLK_T::CLKDIV0: ACLK0DIV Mask */ + +#define CLK_CLKDIV0_EMAC0DIV_Pos (28) /*!< CLK_T::CLKDIV0: EMAC0DIV Position */ +#define CLK_CLKDIV0_EMAC0DIV_Msk (0x3ul << CLK_CLKDIV0_EMAC0DIV_Pos) /*!< CLK_T::CLKDIV0: EMAC0DIV Mask */ + +#define CLK_CLKDIV0_EMAC1DIV_Pos (30) /*!< CLK_T::CLKDIV0: EMAC1DIV Position */ +#define CLK_CLKDIV0_EMAC1DIV_Msk (0x3ul << CLK_CLKDIV0_EMAC1DIV_Pos) /*!< CLK_T::CLKDIV0: EMAC1DIV Mask */ + +#define CLK_CLKDIV1_SC0DIV_Pos (0) /*!< CLK_T::CLKDIV1: SC0DIV Position */ +#define CLK_CLKDIV1_SC0DIV_Msk (0xful << CLK_CLKDIV1_SC0DIV_Pos) /*!< CLK_T::CLKDIV1: SC0DIV Mask */ + +#define CLK_CLKDIV1_SC1DIV_Pos (4) /*!< CLK_T::CLKDIV1: SC1DIV Position */ +#define CLK_CLKDIV1_SC1DIV_Msk (0xful << CLK_CLKDIV1_SC1DIV_Pos) /*!< CLK_T::CLKDIV1: SC1DIV Mask */ + +#define CLK_CLKDIV1_CCAP0DIV_Pos (8) /*!< CLK_T::CLKDIV1: CCAP0DIV Position */ +#define CLK_CLKDIV1_CCAP0DIV_Msk (0xful << CLK_CLKDIV1_CCAP0DIV_Pos) /*!< CLK_T::CLKDIV1: CCAP0DIV Mask */ + +#define CLK_CLKDIV1_CCAP1DIV_Pos (12) /*!< CLK_T::CLKDIV1: CCAP1DIV Position */ +#define CLK_CLKDIV1_CCAP1DIV_Msk (0xful << CLK_CLKDIV1_CCAP1DIV_Pos) /*!< CLK_T::CLKDIV1: CCAP1DIV Mask */ + +#define CLK_CLKDIV1_UART0DIV_Pos (16) /*!< CLK_T::CLKDIV1: UART0DIV Position */ +#define CLK_CLKDIV1_UART0DIV_Msk (0xful << CLK_CLKDIV1_UART0DIV_Pos) /*!< CLK_T::CLKDIV1: UART0DIV Mask */ + +#define CLK_CLKDIV1_UART1DIV_Pos (20) /*!< CLK_T::CLKDIV1: UART1DIV Position */ +#define CLK_CLKDIV1_UART1DIV_Msk (0xful << CLK_CLKDIV1_UART1DIV_Pos) /*!< CLK_T::CLKDIV1: UART1DIV Mask */ + +#define CLK_CLKDIV1_UART2DIV_Pos (24) /*!< CLK_T::CLKDIV1: UART2DIV Position */ +#define CLK_CLKDIV1_UART2DIV_Msk (0xful << CLK_CLKDIV1_UART2DIV_Pos) /*!< CLK_T::CLKDIV1: UART2DIV Mask */ + +#define CLK_CLKDIV1_UART3DIV_Pos (28) /*!< CLK_T::CLKDIV1: UART3DIV Position */ +#define CLK_CLKDIV1_UART3DIV_Msk (0xful << CLK_CLKDIV1_UART3DIV_Pos) /*!< CLK_T::CLKDIV1: UART3DIV Mask */ + +#define CLK_CLKDIV2_UART4DIV_Pos (0) /*!< CLK_T::CLKDIV2: UART4DIV Position */ +#define CLK_CLKDIV2_UART4DIV_Msk (0xful << CLK_CLKDIV2_UART4DIV_Pos) /*!< CLK_T::CLKDIV2: UART4DIV Mask */ + +#define CLK_CLKDIV2_UART5DIV_Pos (4) /*!< CLK_T::CLKDIV2: UART5DIV Position */ +#define CLK_CLKDIV2_UART5DIV_Msk (0xful << CLK_CLKDIV2_UART5DIV_Pos) /*!< CLK_T::CLKDIV2: UART5DIV Mask */ + +#define CLK_CLKDIV2_UART6DIV_Pos (8) /*!< CLK_T::CLKDIV2: UART6DIV Position */ +#define CLK_CLKDIV2_UART6DIV_Msk (0xful << CLK_CLKDIV2_UART6DIV_Pos) /*!< CLK_T::CLKDIV2: UART6DIV Mask */ + +#define CLK_CLKDIV2_UART7DIV_Pos (12) /*!< CLK_T::CLKDIV2: UART7DIV Position */ +#define CLK_CLKDIV2_UART7DIV_Msk (0xful << CLK_CLKDIV2_UART7DIV_Pos) /*!< CLK_T::CLKDIV2: UART7DIV Mask */ + +#define CLK_CLKDIV2_UART8DIV_Pos (16) /*!< CLK_T::CLKDIV2: UART8DIV Position */ +#define CLK_CLKDIV2_UART8DIV_Msk (0xful << CLK_CLKDIV2_UART8DIV_Pos) /*!< CLK_T::CLKDIV2: UART8DIV Mask */ + +#define CLK_CLKDIV2_UART9DIV_Pos (20) /*!< CLK_T::CLKDIV2: UART9DIV Position */ +#define CLK_CLKDIV2_UART9DIV_Msk (0xful << CLK_CLKDIV2_UART9DIV_Pos) /*!< CLK_T::CLKDIV2: UART9DIV Mask */ + +#define CLK_CLKDIV2_UART10DIV_Pos (24) /*!< CLK_T::CLKDIV2: UART10DIV Position */ +#define CLK_CLKDIV2_UART10DIV_Msk (0xful << CLK_CLKDIV2_UART10DIV_Pos) /*!< CLK_T::CLKDIV2: UART10DIV Mask */ + +#define CLK_CLKDIV2_UART11DIV_Pos (28) /*!< CLK_T::CLKDIV2: UART11DIV Position */ +#define CLK_CLKDIV2_UART11DIV_Msk (0xful << CLK_CLKDIV2_UART11DIV_Pos) /*!< CLK_T::CLKDIV2: UART11DIV Mask */ + +#define CLK_CLKDIV3_UART12DIV_Pos (0) /*!< CLK_T::CLKDIV3: UART12DIV Position */ +#define CLK_CLKDIV3_UART12DIV_Msk (0xful << CLK_CLKDIV3_UART12DIV_Pos) /*!< CLK_T::CLKDIV3: UART12DIV Mask */ + +#define CLK_CLKDIV3_UART13DIV_Pos (4) /*!< CLK_T::CLKDIV3: UART13DIV Position */ +#define CLK_CLKDIV3_UART13DIV_Msk (0xful << CLK_CLKDIV3_UART13DIV_Pos) /*!< CLK_T::CLKDIV3: UART13DIV Mask */ + +#define CLK_CLKDIV3_UART14DIV_Pos (8) /*!< CLK_T::CLKDIV3: UART14DIV Position */ +#define CLK_CLKDIV3_UART14DIV_Msk (0xful << CLK_CLKDIV3_UART14DIV_Pos) /*!< CLK_T::CLKDIV3: UART14DIV Mask */ + +#define CLK_CLKDIV3_UART15DIV_Pos (12) /*!< CLK_T::CLKDIV3: UART15DIV Position */ +#define CLK_CLKDIV3_UART15DIV_Msk (0xful << CLK_CLKDIV3_UART15DIV_Pos) /*!< CLK_T::CLKDIV3: UART15DIV Mask */ + +#define CLK_CLKDIV3_UART16DIV_Pos (16) /*!< CLK_T::CLKDIV3: UART16DIV Position */ +#define CLK_CLKDIV3_UART16DIV_Msk (0xful << CLK_CLKDIV3_UART16DIV_Pos) /*!< CLK_T::CLKDIV3: UART16DIV Mask */ + +#define CLK_CLKDIV4_EADCDIV_Pos (0) /*!< CLK_T::CLKDIV4: EADCDIV Position */ +#define CLK_CLKDIV4_EADCDIV_Msk (0xful << CLK_CLKDIV4_EADCDIV_Pos) /*!< CLK_T::CLKDIV4: EADCDIV Mask */ + +#define CLK_CLKDIV4_ADCDIV_Pos (4) /*!< CLK_T::CLKDIV4: ADCDIV Position */ +#define CLK_CLKDIV4_ADCDIV_Msk (0x1fffful << CLK_CLKDIV4_ADCDIV_Pos) /*!< CLK_T::CLKDIV4: ADCDIV Mask */ + +#define CLK_CLKDIV4_KPIDIV_Pos (24) /*!< CLK_T::CLKDIV4: KPIDIV Position */ +#define CLK_CLKDIV4_KPIDIV_Msk (0xfful << CLK_CLKDIV4_KPIDIV_Pos) /*!< CLK_T::CLKDIV4: KPIDIV Mask */ + +#define CLK_CLKOCTL_FREQSEL_Pos (0) /*!< CLK_T::CLKOCTL: FREQSEL Position */ +#define CLK_CLKOCTL_FREQSEL_Msk (0xful << CLK_CLKOCTL_FREQSEL_Pos) /*!< CLK_T::CLKOCTL: FREQSEL Mask */ + +#define CLK_CLKOCTL_CLKOEN_Pos (4) /*!< CLK_T::CLKOCTL: CLKOEN Position */ +#define CLK_CLKOCTL_CLKOEN_Msk (0x1ul << CLK_CLKOCTL_CLKOEN_Pos) /*!< CLK_T::CLKOCTL: CLKOEN Mask */ + +#define CLK_CLKOCTL_DIV1EN_Pos (5) /*!< CLK_T::CLKOCTL: DIV1EN Position */ +#define CLK_CLKOCTL_DIV1EN_Msk (0x1ul << CLK_CLKOCTL_DIV1EN_Pos) /*!< CLK_T::CLKOCTL: DIV1EN Mask */ + +#define CLK_STATUS_HXTSTB_Pos (0) /*!< CLK_T::STATUS: HXTSTB Position */ +#define CLK_STATUS_HXTSTB_Msk (0x1ul << CLK_STATUS_HXTSTB_Pos) /*!< CLK_T::STATUS: HXTSTB Mask */ + +#define CLK_STATUS_LXTSTB_Pos (1) /*!< CLK_T::STATUS: LXTSTB Position */ +#define CLK_STATUS_LXTSTB_Msk (0x1ul << CLK_STATUS_LXTSTB_Pos) /*!< CLK_T::STATUS: LXTSTB Mask */ + +#define CLK_STATUS_SYSPLLSTB_Pos (2) /*!< CLK_T::STATUS: SYSPLLSTB Position */ +#define CLK_STATUS_SYSPLLSTB_Msk (0x1ul << CLK_STATUS_SYSPLLSTB_Pos) /*!< CLK_T::STATUS: SYSPLLSTB Mask */ + +#define CLK_STATUS_LIRCSTB_Pos (3) /*!< CLK_T::STATUS: LIRCSTB Position */ +#define CLK_STATUS_LIRCSTB_Msk (0x1ul << CLK_STATUS_LIRCSTB_Pos) /*!< CLK_T::STATUS: LIRCSTB Mask */ + +#define CLK_STATUS_HIRCSTB_Pos (4) /*!< CLK_T::STATUS: HIRCSTB Position */ +#define CLK_STATUS_HIRCSTB_Msk (0x1ul << CLK_STATUS_HIRCSTB_Pos) /*!< CLK_T::STATUS: HIRCSTB Mask */ + +#define CLK_STATUS_CAPLLSTB_Pos (6) /*!< CLK_T::STATUS: CAPLLSTB Position */ +#define CLK_STATUS_CAPLLSTB_Msk (0x1ul << CLK_STATUS_CAPLLSTB_Pos) /*!< CLK_T::STATUS: CAPLLSTB Mask */ + +#define CLK_STATUS_DDRPLLSTB_Pos (8) /*!< CLK_T::STATUS: DDRPLLSTB Position */ +#define CLK_STATUS_DDRPLLSTB_Msk (0x1ul << CLK_STATUS_DDRPLLSTB_Pos) /*!< CLK_T::STATUS: DDRPLLSTB Mask */ + +#define CLK_STATUS_EPLLSTB_Pos (9) /*!< CLK_T::STATUS: EPLLSTB Position */ +#define CLK_STATUS_EPLLSTB_Msk (0x1ul << CLK_STATUS_EPLLSTB_Pos) /*!< CLK_T::STATUS: EPLLSTB Mask */ + +#define CLK_STATUS_APLLSTB_Pos (10) /*!< CLK_T::STATUS: APLLSTB Position */ +#define CLK_STATUS_APLLSTB_Msk (0x1ul << CLK_STATUS_APLLSTB_Pos) /*!< CLK_T::STATUS: APLLSTB Mask */ + +#define CLK_STATUS_VPLLSTB_Pos (11) /*!< CLK_T::STATUS: VPLLSTB Position */ +#define CLK_STATUS_VPLLSTB_Msk (0x1ul << CLK_STATUS_VPLLSTB_Pos) /*!< CLK_T::STATUS: VPLLSTB Mask */ + +#define CLK_PLL0CTL0_FBDIV_Pos (0) /*!< CLK_T::PLL0CTL0: FBDIV Position */ +#define CLK_PLL0CTL0_FBDIV_Msk (0xfful << CLK_PLL0CTL0_FBDIV_Pos) /*!< CLK_T::PLL0CTL0: FBDIV Mask */ + +#define CLK_PLL0CTL0_INDIV_Pos (8) /*!< CLK_T::PLL0CTL0: INDIV Position */ +#define CLK_PLL0CTL0_INDIV_Msk (0xful << CLK_PLL0CTL0_INDIV_Pos) /*!< CLK_T::PLL0CTL0: INDIV Mask */ + +#define CLK_PLL0CTL0_OUTDIV_Pos (12) /*!< CLK_T::PLL0CTL0: MODE Position */ +#define CLK_PLL0CTL0_OUTDIV_Msk (0x3ul << CLK_PLL0CTL0_OUTDIV_Pos) /*!< CLK_T::PLL0CTL0: MODE Mask */ + +#define CLK_PLL0CTL0_PD_Pos (16) /*!< CLK_T::PLL0CTL0: PD Position */ +#define CLK_PLL0CTL0_PD_Msk (0x1ul << CLK_PLL0CTL0_PD_Pos) /*!< CLK_T::PLL0CTL0: PD Mask */ + +#define CLK_PLL0CTL0_BP_Pos (17) /*!< CLK_T::PLL0CTL0: BP Position */ +#define CLK_PLL0CTL0_BP_Msk (0x1ul << CLK_PLL0CTL0_BP_Pos) /*!< CLK_T::PLL0CTL0: BP Mask */ + +/* For PLL2 ~ PLL5 */ +#define CLK_PLLnCTL0_FBDIV_Pos (0) /*!< CLK_T::PLLnCTL0: FBDIV Position */ +#define CLK_PLLnCTL0_FBDIV_Msk (0x7fful << CLK_PLLnCTL0_FBDIV_Pos) /*!< CLK_T::PLLnCTL0: FBDIV Mask */ + +#define CLK_PLLnCTL0_INDIV_Pos (12) /*!< CLK_T::PLLnCTL0: INDIV Position */ +#define CLK_PLLnCTL0_INDIV_Msk (0x3ful << CLK_PLLnCTL0_INDIV_Pos) /*!< CLK_T::PLLnCTL0: INDIV Mask */ + +#define CLK_PLLnCTL0_MODE_Pos (18) /*!< CLK_T::PLLnCTL0: MODE Position */ +#define CLK_PLLnCTL0_MODE_Msk (0x3ul << CLK_PLLnCTL0_MODE_Pos) /*!< CLK_T::PLLnCTL0: MODE Mask */ + +#define CLK_PLLnCTL0_SSRATE_Pos (20) /*!< CLK_T::PLLnCTL0: SSRATE Position */ +#define CLK_PLLnCTL0_SSRATE_Msk (0x7fful << CLK_PLLnCTL0_SSRATE_Pos) /*!< CLK_T::PLLnCTL0: SSRATE Mask */ + +#define CLK_PLLnCTL1_PD_Pos (0) /*!< CLK_T::PLLnCTL1: PD Position */ +#define CLK_PLLnCTL1_PD_Msk (0x1ul << CLK_PLLnCTL1_PD_Pos) /*!< CLK_T::PLLnCTL1: PD Mask */ + +#define CLK_PLLnCTL1_BP_Pos (1) /*!< CLK_T::PLLnCTL1: BP Position */ +#define CLK_PLLnCTL1_BP_Msk (0x1ul << CLK_PLLnCTL1_BP_Pos) /*!< CLK_T::PLLnCTL1: BP Mask */ + +#define CLK_PLLnCTL1_OUTDIV_Pos (4) /*!< CLK_T::PLLnCTL1: OUTDIV Position */ +#define CLK_PLLnCTL1_OUTDIV_Msk (0x7ul << CLK_PLLnCTL1_OUTDIV_Pos) /*!< CLK_T::PLLnCTL1: OUTDIV Mask */ + +#define CLK_PLLnCTL1_FRAC_Pos (8) /*!< CLK_T::PLLnCTL1: FRAC Position */ +#define CLK_PLLnCTL1_FRAC_Msk (0xfffffful << CLK_PLLnCTL1_FRAC_Pos) /*!< CLK_T::PLLnCTL1: FRAC Mask */ + +#define CLK_PLLnCTL2_SLOPE_Pos (0) /*!< CLK_T::PLLnCTL2: SLOPE Position */ +#define CLK_PLLnCTL2_SLOPE_Msk (0xfffffful << CLK_PLLnCTL2_SLOPE_Pos) /*!< CLK_T::PLLnCTL2: SLOPE Mask */ + +#define CLK_CLKDCTL_HXTFDEN_Pos (4) /*!< CLK_T::CLKDCTL: HXTFDEN Position */ +#define CLK_CLKDCTL_HXTFDEN_Msk (0x1ul << CLK_CLKDCTL_HXTFDEN_Pos) /*!< CLK_T::CLKDCTL: HXTFDEN Mask */ + +#define CLK_CLKDCTL_HXTFIEN_Pos (5) /*!< CLK_T::CLKDCTL: HXTFIEN Position */ +#define CLK_CLKDCTL_HXTFIEN_Msk (0x1ul << CLK_CLKDCTL_HXTFIEN_Pos) /*!< CLK_T::CLKDCTL: HXTFIEN Mask */ + +#define CLK_CLKDCTL_LXTFDEN_Pos (12) /*!< CLK_T::CLKDCTL: LXTFDEN Position */ +#define CLK_CLKDCTL_LXTFDEN_Msk (0x1ul << CLK_CLKDCTL_LXTFDEN_Pos) /*!< CLK_T::CLKDCTL: LXTFDEN Mask */ + +#define CLK_CLKDCTL_LXTFIEN_Pos (13) /*!< CLK_T::CLKDCTL: LXTFIEN Position */ +#define CLK_CLKDCTL_LXTFIEN_Msk (0x1ul << CLK_CLKDCTL_LXTFIEN_Pos) /*!< CLK_T::CLKDCTL: LXTFIEN Mask */ + +#define CLK_CLKDCTL_HXTFQDEN_Pos (16) /*!< CLK_T::CLKDCTL: HXTFQDEN Position */ +#define CLK_CLKDCTL_HXTFQDEN_Msk (0x1ul << CLK_CLKDCTL_HXTFQDEN_Pos) /*!< CLK_T::CLKDCTL: HXTFQDEN Mask */ + +#define CLK_CLKDCTL_HXTFQIEN_Pos (17) /*!< CLK_T::CLKDCTL: HXTFQIEN Position */ +#define CLK_CLKDCTL_HXTFQIEN_Msk (0x1ul << CLK_CLKDCTL_HXTFQIEN_Pos) /*!< CLK_T::CLKDCTL: HXTFQIEN Mask */ + +#define CLK_CLKDSTS_HXTFIF_Pos (0) /*!< CLK_T::CLKDSTS: HXTFIF Position */ +#define CLK_CLKDSTS_HXTFIF_Msk (0x1ul << CLK_CLKDSTS_HXTFIF_Pos) /*!< CLK_T::CLKDSTS: HXTFIF Mask */ + +#define CLK_CLKDSTS_LXTFIF_Pos (1) /*!< CLK_T::CLKDSTS: LXTFIF Position */ +#define CLK_CLKDSTS_LXTFIF_Msk (0x1ul << CLK_CLKDSTS_LXTFIF_Pos) /*!< CLK_T::CLKDSTS: LXTFIF Mask */ + +#define CLK_CLKDSTS_HXTFQIF_Pos (8) /*!< CLK_T::CLKDSTS: HXTFQIF Position */ +#define CLK_CLKDSTS_HXTFQIF_Msk (0x1ul << CLK_CLKDSTS_HXTFQIF_Pos) /*!< CLK_T::CLKDSTS: HXTFQIF Mask */ + +#define CLK_CDUPB_UPERBD_Pos (0) /*!< CLK_T::CDUPB: UPERBD Position */ +#define CLK_CDUPB_UPERBD_Msk (0x3fful << CLK_CDUPB_UPERBD_Pos) /*!< CLK_T::CDUPB: UPERBD Mask */ + +#define CLK_CDLOWB_LOWERBD_Pos (0) /*!< CLK_T::CDLOWB: LOWERBD Position */ +#define CLK_CDLOWB_LOWERBD_Msk (0x3fful << CLK_CDLOWB_LOWERBD_Pos) /*!< CLK_T::CDLOWB: LOWERBD Mask */ + +#define CLK_CKFLTRCTL_HXTFLTREN_Pos (0) /*!< CLK_T::CKFLTRCTL: HXTFLTREN Position */ +#define CLK_CKFLTRCTL_HXTFLTREN_Msk (0x1ul << CLK_CKFLTRCTL_HXTFLTREN_Pos) /*!< CLK_T::CKFLTRCTL: HXTFLTREN Mask */ + +#define CLK_CKFLTRCTL_HXTFLTRSEL_Pos (1) /*!< CLK_T::CKFLTRCTL: HXTFLTRSEL Position */ +#define CLK_CKFLTRCTL_HXTFLTRSEL_Msk (0x1ul << CLK_CKFLTRCTL_HXTFLTRSEL_Pos) /*!< CLK_T::CKFLTRCTL: HXTFLTRSEL Mask */ + +#define CLK_CKFLTRCTL_HXTGTEN_Pos (4) /*!< CLK_T::CKFLTRCTL: HXTGTEN Position */ +#define CLK_CKFLTRCTL_HXTGTEN_Msk (0x1ul << CLK_CKFLTRCTL_HXTGTEN_Pos) /*!< CLK_T::CKFLTRCTL: HXTGTEN Mask */ + +#define CLK_CKFLTRCTL_HXTBYPSEN_Pos (5) /*!< CLK_T::CKFLTRCTL: HXTBYPSEN Position */ +#define CLK_CKFLTRCTL_HXTBYPSEN_Msk (0x1ul << CLK_CKFLTRCTL_HXTBYPSEN_Pos) /*!< CLK_T::CKFLTRCTL: HXTBYPSEN Mask */ + +#define CLK_CKFLTRCTL_HIRCFLTREN_Pos (8) /*!< CLK_T::CKFLTRCTL: HIRCFLTREN Position */ +#define CLK_CKFLTRCTL_HIRCFLTREN_Msk (0x1ul << CLK_CKFLTRCTL_HIRCFLTREN_Pos) /*!< CLK_T::CKFLTRCTL: HIRCFLTREN Mask */ + +#define CLK_CKFLTRCTL_HIRCFLTRSEL_Pos (9) /*!< CLK_T::CKFLTRCTL: HIRCFLTRSEL Position */ +#define CLK_CKFLTRCTL_HIRCFLTRSEL_Msk (0x1ul << CLK_CKFLTRCTL_HIRCFLTRSEL_Pos) /*!< CLK_T::CKFLTRCTL: HIRCFLTRSEL Mask */ + +#define CLK_CKFLTRCTL_HIRCGTEN_Pos (12) /*!< CLK_T::CKFLTRCTL: HIRCGTEN Position */ +#define CLK_CKFLTRCTL_HIRCGTEN_Msk (0x1ul << CLK_CKFLTRCTL_HIRCGTEN_Pos) /*!< CLK_T::CKFLTRCTL: HIRCGTEN Mask */ + +/**@}*/ /* CLK_CONST */ +/**@}*/ /* end of CLK register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __CLK_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/crypto_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/crypto_reg.h new file mode 100644 index 0000000000..dd621e1844 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/crypto_reg.h @@ -0,0 +1,7135 @@ +/**************************************************************************//** + * @file crypto_reg.h + * @brief Cryptographic Accelerator definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __CRYPTO_REG_H__ +#define __CRYPTO_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/*---------------------- Cryptographic Accelerator -------------------------*/ +/** + @addtogroup CRYPTO Cryptographic Accelerator(CRYPTO) + Memory Mapped Structure for Cryptographic Accelerator +@{ */ + +typedef struct +{ + + /** + * @var CRYPTO_T::INTEN + * Offset: 0x00 Crypto Interrupt Enable Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |AESIEN |AES Interrupt Enable Bit + * | | |0 = AES interrupt Disabled. + * | | |1 = AES interrupt Enabled. + * | | |Note: In DMA mode, an interrupt will be triggered when an amount of data set in AES_DMA_CNT is fed into the AES engine. + * | | |In Non-DMA mode, an interrupt will be triggered when the AES engine finishes the operation. + * |[1] |AESEIEN |AES Error Flag Enable Bit + * | | |0 = AES error interrupt flag Disabled. + * | | |1 = AES error interrupt flag Enabled. + * |[16] |PRNGIEN |PRNG Interrupt Enable Bit + * | | |0 = PRNG interrupt Disabled. + * | | |1 = PRNG interrupt Enabled. + * |[17] |PRNGEIEN |PRNG Error Flag Enable Bit + * | | |0 = PRNG error interrupt flag Disabled. + * | | |1 = PRNG error interrupt flag Enabled. + * |[22] |ECCIEN |ECC Interrupt Enable Bit + * | | |0 = ECC interrupt Disabled. + * | | |1 = ECC interrupt Enabled. + * | | |Note: In DMA mode, an interrupt will be triggered when an amount of data set in ECC_DMA_CNT is fed into the ECC engine + * | | |In Non-DMA mode, an interrupt will be triggered when the ECC engine finishes the operation. + * |[23] |ECCEIEN |ECC Error Interrupt Enable Bit + * | | |0 = ECC error interrupt flag Disabled. + * | | |1 = ECC error interrupt flag Enabled. + * |[24] |HMACIEN |SHA/HMAC Interrupt Enable Bit + * | | |0 = SHA/HMAC interrupt Disabled. + * | | |1 = SHA/HMAC interrupt Enabled. + * | | |Note: In DMA mode, an interrupt will be triggered when an amount of data set in HMAC_DMA_CNT is fed into the SHA/HMAC engine + * | | |In Non-DMA mode, an interrupt will be triggered when the SHA/HMAC engine finishes the operation. + * |[25] |HMACEIEN |SHA/HMAC Error Interrupt Enable Bit + * | | |0 = SHA/HMAC error interrupt flag Disabled. + * | | |1 = HMAC error interrupt flag Enabled. + * |[30] |RSAIEN |RSA Interrupt Enable Bit + * | | |0 = RSA interrupt Disabled. + * | | |1 = RSA interrupt Enabled. + * |[31] |RSAEIEN |RSA Error Interrupt Enable Bit + * | | |0 = RSA error interrupt flag Disabled. + * | | |1 = RSA error interrupt flag Enabled. + * @var CRYPTO_T::INTSTS + * Offset: 0x04 Crypto Interrupt Flag + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |AESIF |AES Finish Interrupt Flag + * | | |0 = No AES interrupt. + * | | |1 = AES encryption/decryption done interrupt. + * | | |Note: This bit is cleared by writing 1, and it has no effect by writing 0. + * |[1] |AESEIF |AES Error Flag + * | | |0 = No AES error. + * | | |1 = AES encryption/decryption error interrupt. + * | | |Note: This bit is cleared by writing 1, and it has no effect by writing 0. + * |[16] |PRNGIF |PRNG Finish Interrupt Flag + * | | |0 = No PRNG interrupt. + * | | |1 = PRNG key generation done interrupt. + * | | |Note: This bit is cleared by writing 1, and it has no effect by writing 0. + * |[17] |PRNGEIF |PRNG Error Flag + * | | |0 = No PRNG error. + * | | |1 = PRNG key generation error interrupt. + * | | |Note: This bit is cleared by writing 1, and it has no effect by writing 0. + * |[22] |ECCIF |ECC Finish Interrupt Flag + * | | |0 = No ECC interrupt. + * | | |1 = ECC operation done interrupt. + * | | |Note: This bit is cleared by writing 1, and it has no effect by writing 0. + * |[23] |ECCEIF |ECC Error Flag + * | | |This register includes operating and setting error + * | | |The detail flag is shown in CRYPTO_ECC_STS register. + * | | |0 = No ECC error. + * | | |1 = ECC error interrupt. + * | | |Note: This bit is cleared by writing 1, and it has no effect by writing 0. + * |[24] |HMACIF |SHA/HMAC Finish Interrupt Flag + * | | |0 = No SHA/HMAC interrupt. + * | | |1 = SHA/HMAC operation done interrupt. + * | | |Note: This bit is cleared by writing 1, and it has no effect by writing 0. + * |[25] |HMACEIF |SHA/HMAC Error Flag + * | | |This register includes operating and setting error + * | | |The detail flag is shown in CRYPTO_HMAC_STS register. + * | | |0 = No SHA/HMAC error. + * | | |1 = SHA/HMAC error interrupt. + * | | |Note: This bit is cleared by writing 1, and it has no effect by writing 0. + * |[30] |RSAIF |RSA Finish Interrupt Flag + * | | |0 = No RSA interrupt. + * | | |1 = RSA operation done interrupt. + * | | |Note: This bit is cleared by writing 1, and it has no effect by writing 0. + * |[31] |RSAEIF |RSA Error Interrupt Flag + * | | |This register includes operating and setting error + * | | |The detail flag is shown in CRYPTO_RSA_STS register. + * | | |0 = No RSA error. + * | | |1 = RSA error interrupt. + * | | |Note: This bit is cleared by writing 1, and it has no effect by writing 0. + * @var CRYPTO_T::PRNG_CTL + * Offset: 0x08 PRNG Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |START |Start PRNG Engine + * | | |0 = Stop PRNG engine. + * | | |1 = Generate new key and store the new key to register CRYPTO_PRNG_KEYx, which will be cleared when the new key is generated. + * |[1] |SEEDRLD |Reload New Seed for PRNG Engine + * | | |0 = Generating key based on the current seed. + * | | |1 = Reload new seed. + * |[5:2] |KEYSZ |PRNG Generate Key Size + * | | |0000 = 128 bits. + * | | |0001 = 163 bits. + * | | |0010 = 192 bits. + * | | |0011 = 224 bits. + * | | |0100 = 233 bits. + * | | |0101 = 255 bits. + * | | |0110 = 256 bits. + * | | |0111 = 283 bits (only for KS). + * | | |1000 = 384 bits (only for KS). + * | | |1001 = 409 bits (only for KS). + * | | |1010 = 512 bits (only for KS). + * | | |1011 = 521 bits (only for KS). + * | | |1100 = 571 bits (only for KS). + * | | |1101 = Reserved. + * | | |1110 = Reserved. + * | | |1111 = Reserved. + * | | |Note: 283~571 bits are only generated for key store. + * |[8] |BUSY |PRNG Busy (Read Only) + * | | |0 = PRNG engine is idle. + * | | |1 = PRNG engine is generating CRYPTO_PRNG_KEYx. + * |[16] |SEEDSRC |Seed Source + * | | |0 = Seed is from TRNG. + * | | |1 = Seed is from PRNG seed register. + * | | |Note: When SEEDRLD is set to 0, this bit (SEEDSRC) is meaningless. + * @var CRYPTO_T::PRNG_SEED + * Offset: 0x0C Seed for PRNG + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |Seed for PRNG (Write Only) + * | | |The bits store the seed for PRNG engine. + * | | |Note: In TRNG+PRNG mode, the seed is from TRNG engine, and it will not be stored in this register. + * @var CRYPTO_T::PRNG_KEY0 + * Offset: 0x10 PRNG Generated Key0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Store PRNG Generated Key (Read Only) + * | | |The bits store the key that is generated by PRNG. + * @var CRYPTO_T::PRNG_KEY1 + * Offset: 0x14 PRNG Generated Key1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Store PRNG Generated Key (Read Only) + * | | |The bits store the key that is generated by PRNG. + * @var CRYPTO_T::PRNG_KEY2 + * Offset: 0x18 PRNG Generated Key2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Store PRNG Generated Key (Read Only) + * | | |The bits store the key that is generated by PRNG. + * @var CRYPTO_T::PRNG_KEY3 + * Offset: 0x1C PRNG Generated Key3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Store PRNG Generated Key (Read Only) + * | | |The bits store the key that is generated by PRNG. + * @var CRYPTO_T::PRNG_KEY4 + * Offset: 0x20 PRNG Generated Key4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Store PRNG Generated Key (Read Only) + * | | |The bits store the key that is generated by PRNG. + * @var CRYPTO_T::PRNG_KEY5 + * Offset: 0x24 PRNG Generated Key5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Store PRNG Generated Key (Read Only) + * | | |The bits store the key that is generated by PRNG. + * @var CRYPTO_T::PRNG_KEY6 + * Offset: 0x28 PRNG Generated Key6 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Store PRNG Generated Key (Read Only) + * | | |The bits store the key that is generated by PRNG. + * @var CRYPTO_T::PRNG_KEY7 + * Offset: 0x2C PRNG Generated Key7 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Store PRNG Generated Key (Read Only) + * | | |The bits store the key that is generated by PRNG. + * @var CRYPTO_T::PRNG_STS + * Offset: 0x30 PRNG Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BUSY |PRNG Busy Flag + * | | |0 = PRNG engine is idle. + * | | |1 = PRNG engine is generating CRYPTO_PRNG_KEYx. + * |[16] |KCTLERR |PRNG Key Control Register Error Flag + * | | |0 = No error. + * | | |1 = PRNG key control error + * | | |When PRNG execute ECDSA or ECDH, but PRNG seed not from TRNG or key is not written to the SRAM of key store (WSDST, CRYPTO_PRNG_KSCTL[23:22] is not equal to '00'). + * |[17] |KSERR |PRNG Access Key Store Error Flag + * | | |0 = No error. + * | | |1 = Access key store failed. + * |[18] |TRNGERR |True Random Number Generator Error Flag + * | | |0 = No error. + * | | |1 = Getting random number or seed failed. + * | | |Note: When TRNGERR becomes 1, TRNG may be BUSY, in TESTMODE or in wrong state. + * @var CRYPTO_T::AES_FDBCK0 + * Offset: 0x50 AES Engine Output Feedback Data After Cryptographic Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |AES Feedback Information + * | | |The feedback value is 128 bits in size. + * | | |The AES engine uses the data from CRYPTO_AES_FDBCKx as the data inputted to CRYPTO_AES_IVx for the next block in DMA cascade mode. + * | | |The AES engine outputs feedback information for IV in the next block's operation + * | | |Software can use this feedback information to implement more than four DMA channels + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_AES_IVx in the same channel operation, and then continue the operation with the original setting. + * @var CRYPTO_T::AES_FDBCK1 + * Offset: 0x54 AES Engine Output Feedback Data After Cryptographic Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |AES Feedback Information + * | | |The feedback value is 128 bits in size. + * | | |The AES engine uses the data from CRYPTO_AES_FDBCKx as the data inputted to CRYPTO_AES_IVx for the next block in DMA cascade mode. + * | | |The AES engine outputs feedback information for IV in the next block's operation + * | | |Software can use this feedback information to implement more than four DMA channels + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_AES_IVx in the same channel operation, and then continue the operation with the original setting. + * @var CRYPTO_T::AES_FDBCK2 + * Offset: 0x58 AES Engine Output Feedback Data After Cryptographic Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |AES Feedback Information + * | | |The feedback value is 128 bits in size. + * | | |The AES engine uses the data from CRYPTO_AES_FDBCKx as the data inputted to CRYPTO_AES_IVx for the next block in DMA cascade mode. + * | | |The AES engine outputs feedback information for IV in the next block's operation + * | | |Software can use this feedback information to implement more than four DMA channels + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_AES_IVx in the same channel operation, and then continue the operation with the original setting. + * @var CRYPTO_T::AES_FDBCK3 + * Offset: 0x5C AES Engine Output Feedback Data After Cryptographic Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |AES Feedback Information + * | | |The feedback value is 128 bits in size. + * | | |The AES engine uses the data from CRYPTO_AES_FDBCKx as the data inputted to CRYPTO_AES_IVx for the next block in DMA cascade mode. + * | | |The AES engine outputs feedback information for IV in the next block's operation + * | | |Software can use this feedback information to implement more than four DMA channels + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_AES_IVx in the same channel operation, and then continue the operation with the original setting. + * @var CRYPTO_T::AES_GCM_IVCNT0 + * Offset: 0x80 AES GCM IV Byte Count Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CNT |AES GCM IV Byte Count + * | | |The bit length of IV is 64 bits for AES GCM mode + * | | |The CRYPTO_AES_GCM_IVCNT0 keeps the low weight byte count of initial vector (i.e., len(IV)[34:3]) of AES GCM mode and can be read and written. + * @var CRYPTO_T::AES_GCM_IVCNT1 + * Offset: 0x84 AES GCM IV Byte Count Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[28:0] |CNT |AES GCM IV Byte Count + * | | |The bit length of IV is 64 bits for AES GCM mode + * | | |The CRYPTO_AES_GCM_IVCNT1 keeps the high weight byte count of initial vector (i.e., len(IV)[64:35]) of AES GCM mode and can be read and written. + * @var CRYPTO_T::AES_GCM_ACNT0 + * Offset: 0x88 AES GCM A Byte Count Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CNT |AES GCM a Byte Count + * | | |The bit length of A is 64 bits for AES GCM mode + * | | |The CRYPTO_AES_GCM_ACNT0 keeps the low weight byte count of the additional authenticated data (i.e., len(A)[34:3]) of AES GCM mode and can be read and written. + * @var CRYPTO_T::AES_GCM_ACNT1 + * Offset: 0x8C AES GCM A Byte Count Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[28:0] |CNT |AES GCM a Byte Count + * | | |The bit length of A is 64 bits for AES GCM mode + * | | |The CRYPTO_AES_GCM_ACNT0 keeps the high weight byte count of the additional authenticated data (i.e., len(A)[63:35]) of AES GCM mode and can be read and written. + * @var CRYPTO_T::AES_GCM_PCNT0 + * Offset: 0x90 AES GCM P Byte Count Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CNT |AES GCM P Byte Count + * | | |The bit length of Por C is 39 bits for AES GCM mode + * | | |The CRYPTO_AES_GCM_PCNT0 keeps the low weight byte count of the plaintext or ciphertext (i.e., len(P)[34:3] or len(C)[34:3]) of AES GCM mode and can be read and written. + * @var CRYPTO_T::AES_GCM_PCNT1 + * Offset: 0x94 AES GCM P Byte Count Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[28:0] |CNT |AES GCM P Byte Count + * | | |The bit length of Por C is 39 bits for AES GCM mode + * | | |The CRYPTO_AES_GCM_PCNT1 keeps the high weight byte count of the plaintext or ciphertext (i.e., len(P)[38:35] or len(C)[38:35]) of AES GCM mode and can be read and written. + * | | |The bit length of Por C is 64 bits for AES CCM mode + * | | |The CRYPTO_AES_GCM_PCNT1 keeps the high weight byte count of the plaintext or ciphertext (i.e., len(P)[63:35] or len(C)[63:35]) of AES CCM mode and can be read and written. + * @var CRYPTO_T::AES_FBADDR + * Offset: 0xA0 AES DMA Feedback Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FBADDR |AES DMA Feedback Address + * | | |In DMA cascade mode, software can update DMA feedback address register for automatically reading and writing feedback values via DMA + * | | |The FBADDR keeps the feedback address of the feedback data for the next cascade operation + * | | |Based on the feedback address, the AES accelerator can read the feedback data of the last cascade operation from SRAM memory space and write the feedback data of the current cascade operation to SRAM memory space + * | | |The start of feedback address should be located at word boundary + * | | |In other words, bit 1 and 0 of FBADDR are ignored. + * | | |FBADDR can be read and written. + * | | |In DMA mode, software can update the next CRYPTO_AES_FBADDR before triggering START. + * @var CRYPTO_T::AES_CTL + * Offset: 0x100 AES Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |START |AES Engine Start + * | | |0 = No effect. + * | | |1 = Start AES engine. BUSY flag will be set. + * | | |Note: This bit is always 0 when it is read back. + * |[1] |STOP |AES Engine Stop + * | | |0 = No effect. + * | | |1 = Stop AES engine. + * | | |Note: This bit is always 0 when it is read back. + * |[3:2] |KEYSZ |AES Key Size + * | | |This bit defines three different key size for AES operation. + * | | |2'b00 = 128 bits key. + * | | |2'b01 = 192 bits key. + * | | |2'b10 = 256 bits key. + * | | |2'b11 = Reserved. + * | | |If the AES accelerator is operating and the corresponding flag BUSY is 1, updating this register has no effect. + * | | |Note: When SM4EN=1, the key size of AES must be 128. + * |[5] |DMALAST |AES Last Block + * | | |In DMA mode, this bit must be set as beginning the last DMA cascade round. + * | | |In Non-DMA mode, this bit must be set when feeding in the last block of data in ECB, CBC, CTR, OFB, and CFB mode, and feeding in the (last-1) block of data at CBC-CS1, CBC-CS2, and CBC-CS3 mode. + * | | |This bit is always 0 when it is read back, and must be written again once START is triggered. + * |[6] |DMACSCAD |AES Engine DMA with Cascade Mode + * | | |0 = DMA cascade function Disabled. + * | | |1 = In DMA cascade mode, software can update DMA source address register, destination address register, and byte count register during a cascade operation, without finishing the accelerator operation. + * |[7] |DMAEN |AES Engine DMA Enable Bit + * | | |0 = AES DMA engine Disabled. + * | | |The AES engine operates in Non-DMA mode. The data need to be written in CRYPTO_AES_DATIN. + * | | |1 = AES_DMA engine Enabled. + * | | |The AES engine operates in DMA mode, and data movement from/to the engine is done by DMA logic. + * |[15:8] |OPMODE |AES Engine Operation Modes + * | | |0x00 = ECB (Electronic Codebook Mode) 0x01 = CBC (Cipher Block Chaining Mode). + * | | |0x02 = CFB (Cipher Feedback Mode). + * | | |0x03 = OFB (Output Feedback Mode). + * | | |0x04 = CTR (Counter Mode). + * | | |0x10 = CBC-CS1 (CBC Ciphertext-Stealing 1 Mode). + * | | |0x11 = CBC-CS2 (CBC Ciphertext-Stealing 2 Mode). + * | | |0x12 = CBC-CS3 (CBC Ciphertext-Stealing 3 Mode). + * | | |0x20 = GCM (Galois/Counter Mode). + * | | |0x21 = GHASH (Galois Hash Function). + * | | |0x22 = CCM (Counter with CBC-MAC Mode). + * |[16] |ENCRYPTO |AES Encryption/Decryption + * | | |0 = AES engine executes decryption operation. + * | | |1 = AES engine executes encryption operation. + * |[17] |SM4EN |SM4 Engine Enable + * | | |0 = AES engine Enabled. + * | | |1 = SM4 engine Enabled. + * |[19] |DFAPEN |AES Differential Fault Attack Protection Enable + * | | |0 = AES Differential Fault Attack Protection Disabled. + * | | |1 = AES Differential Fault Attack Protection Enabled. + * |[20] |FBIN |Feedback Input to AES Via DMA Automatically + * | | |0 = DMA automatic feedback input function Disabled. + * | | |1 = DMA automatic feedback input function Enabled when DMAEN = 1. + * |[21] |FBOUT |Feedback Output From AES Via DMA Automatically + * | | |0 = DMA automatic feedback output function Disabled. + * | | |1 = DMA automatic feedback output function Enabled when DMAEN = 1. + * |[22] |OUTSWAP |AES Engine Output Data Swap + * | | |0 = Keep the original order. + * | | |1 = The order that CPU reads data from the accelerator will be changed from {byte3, byte2, byte1, byte0} to {byte0, byte1, byte2, byte3}. + * |[23] |INSWAP |AES Engine Input Data Swap + * | | |0 = Keep the original order. + * | | |1 = The order that CPU feeds data to the accelerator will be changed from {byte3, byte2, byte1, byte0} to {byte0, byte1, byte2, byte3}. + * |[24] |KOUTSWAP |AES Engine Output Key, Initial Vector and Feedback Swap + * | | |0 = Keep the original order. + * | | |1 = The order that CPU reads key, initial vector and feedback from the accelerator will be changed from {byte3, byte2, byte1, byte0} to {byte0, byte1, byte2, byte3}. + * |[25] |KINSWAP |AES Engine Input Key and Initial Vector Swap + * | | |0 = Keep the original order. + * | | |1 = The order that CPU feeds key and initial vector to the accelerator will be changed from {byte3, byte2, byte1, byte0} to {byte0, byte1, byte2, byte3}. + * |[30:26] |KEYUNPRT |Unprotect Key + * | | |Writing 0 to CRYPTO_AES_CTL[31] and "10110" to CRYPTO_AES_CTL[30:26] is to unprotect the AES key. + * | | |The KEYUNPRT can be read and written + * | | |When it is written as the AES engine is operating, BUSY flag is 1, there would be no effect on KEYUNPRT. + * |[31] |KEYPRT |Protect Key + * | | |Read as a flag to reflect KEYPRT. + * | | |0 = No effect. + * | | |1 = Protect the content of the AES key from reading + * | | |The return value for reading CRYPTO_AES_KEYx is not the content of the registers CRYPTO_AES_KEYx + * | | |Once it is set, it can be cleared by asserting KEYUNPRT + * | | |The key content would be cleared as well. + * @var CRYPTO_T::AES_STS + * Offset: 0x104 AES Engine Flag + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BUSY |AES Engine Busy + * | | |0 = The AES engine is idle or finished. + * | | |1 = The AES engine is under processing. + * |[8] |INBUFEMPTY|AES Input Buffer Empty + * | | |0 = There are some data in input buffer waiting for the AES engine to process. + * | | |1 = AES input buffer is empty + * | | |Software needs to feed data to the AES engine + * | | |Otherwise, the AES engine will be pending to wait for input data. + * |[9] |INBUFFULL |AES Input Buffer Full Flag + * | | |0 = AES input buffer is not full. Software can feed the data into the AES engine. + * | | |1 = AES input buffer is full + * | | |Software cannot feed data to the AES engine + * | | |Otherwise, the flag INBUFERR will be set to 1. + * |[10] |INBUFERR |AES Input Buffer Error Flag + * | | |0 = No error. + * | | |1 = Error happened during feeding data to the AES engine. + * |[12] |CNTERR |CRYPTO_AES_CNT Setting Error + * | | |0 = No error in CRYPTO_AES_CNT setting. + * | | |1 = CRYPTO_AES_CNT is 0 if DMAEN (CRYPTO_AES_CTL[7]) is enabled. + * |[16] |OUTBUFEMPTY|AES Out Buffer Empty + * | | |0 = AES output buffer is not empty. There are some valid data kept in output buffer. + * | | |1 = AES output buffer is empty + * | | |Software cannot get data from CRYPTO_AES_DATOUT + * | | |Otherwise, the flag OUTBUFERR will be set to 1 since the output buffer is empty. + * |[17] |OUTBUFFULL|AES Out Buffer Full Flag + * | | |0 = AES output buffer is not full. + * | | |1 = AES output buffer is full, and software needs to get data from CRYPTO_AES_DATOUT + * | | |Otherwise, the AES engine will be pending since the output buffer is full. + * |[18] |OUTBUFERR |AES Out Buffer Error Flag + * | | |0 = No error. + * | | |1 = Error happened during getting the result from AES engine. + * |[20] |BUSERR |AES DMA Access Bus Error Flag + * | | |0 = No error. + * | | |1 = Bus error will stop DMA operation and AES engine. + * |[21] |KSERR |AES Engine Access Key Store Error Flag + * | | |0 = No error. + * | | |1 = Key store access error will stop AES engine. + * |[22] |DFAERR |AES Engine Differential Fault Attack Error Flag + * | | |0 = No error. + * | | |1 = Differential Fault Attack happened in AES engine. The results from AES engine are wrong. + * @var CRYPTO_T::AES_DATIN + * Offset: 0x108 AES Engine Data Input Port Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATIN |AES Engine Input Port + * | | |CPU feeds data to AES engine through this port by checking CRYPTO_AES_STS. Feed data as INBUFFULL is 0. + * @var CRYPTO_T::AES_DATOUT + * Offset: 0x10C AES Engine Data Output Port Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATOUT |AES Engine Output Port + * | | |CPU gets results from the AES engine through this port by checking CRYPTO_AES_STS + * | | |Get data as OUTBUFEMPTY is 0. + * @var CRYPTO_T::AES_KEY0 + * Offset: 0x110 AES Key Word 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |CRYPTO_AES_KEYx + * | | |The KEY keeps the security key for AES operation. + * | | |x = 0, 1..7. + * | | |The security key for AES accelerator can be 128, 192, or 256 bits and four, six, or eight 32-bit registers are to store each security key. + * | | |{CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 128-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 192-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY7, CRYPTO_AES_KEY6, CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 256-bit security key for AES operation. + * @var CRYPTO_T::AES_KEY1 + * Offset: 0x114 AES Key Word 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |CRYPTO_AES_KEYx + * | | |The KEY keeps the security key for AES operation. + * | | |x = 0, 1..7. + * | | |The security key for AES accelerator can be 128, 192, or 256 bits and four, six, or eight 32-bit registers are to store each security key. + * | | |{CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 128-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 192-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY7, CRYPTO_AES_KEY6, CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 256-bit security key for AES operation. + * @var CRYPTO_T::AES_KEY2 + * Offset: 0x118 AES Key Word 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |CRYPTO_AES_KEYx + * | | |The KEY keeps the security key for AES operation. + * | | |x = 0, 1..7. + * | | |The security key for AES accelerator can be 128, 192, or 256 bits and four, six, or eight 32-bit registers are to store each security key. + * | | |{CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 128-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 192-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY7, CRYPTO_AES_KEY6, CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 256-bit security key for AES operation. + * @var CRYPTO_T::AES_KEY3 + * Offset: 0x11C AES Key Word 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |CRYPTO_AES_KEYx + * | | |The KEY keeps the security key for AES operation. + * | | |x = 0, 1..7. + * | | |The security key for AES accelerator can be 128, 192, or 256 bits and four, six, or eight 32-bit registers are to store each security key. + * | | |{CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 128-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 192-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY7, CRYPTO_AES_KEY6, CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 256-bit security key for AES operation. + * @var CRYPTO_T::AES_KEY4 + * Offset: 0x120 AES Key Word 4 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |CRYPTO_AES_KEYx + * | | |The KEY keeps the security key for AES operation. + * | | |x = 0, 1..7. + * | | |The security key for AES accelerator can be 128, 192, or 256 bits and four, six, or eight 32-bit registers are to store each security key. + * | | |{CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 128-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 192-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY7, CRYPTO_AES_KEY6, CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 256-bit security key for AES operation. + * @var CRYPTO_T::AES_KEY5 + * Offset: 0x124 AES Key Word 5 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |CRYPTO_AES_KEYx + * | | |The KEY keeps the security key for AES operation. + * | | |x = 0, 1..7. + * | | |The security key for AES accelerator can be 128, 192, or 256 bits and four, six, or eight 32-bit registers are to store each security key. + * | | |{CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 128-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 192-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY7, CRYPTO_AES_KEY6, CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 256-bit security key for AES operation. + * @var CRYPTO_T::AES_KEY6 + * Offset: 0x128 AES Key Word 6 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |CRYPTO_AES_KEYx + * | | |The KEY keeps the security key for AES operation. + * | | |x = 0, 1..7. + * | | |The security key for AES accelerator can be 128, 192, or 256 bits and four, six, or eight 32-bit registers are to store each security key. + * | | |{CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 128-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 192-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY7, CRYPTO_AES_KEY6, CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 256-bit security key for AES operation. + * @var CRYPTO_T::AES_KEY7 + * Offset: 0x12C AES Key Word 7 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |CRYPTO_AES_KEYx + * | | |The KEY keeps the security key for AES operation. + * | | |x = 0, 1..7. + * | | |The security key for AES accelerator can be 128, 192, or 256 bits and four, six, or eight 32-bit registers are to store each security key. + * | | |{CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 128-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 192-bit security key for AES operation. + * | | |{CRYPTO_AES_KEY7, CRYPTO_AES_KEY6, CRYPTO_AES_KEY5, CRYPTO_AES_KEY4, CRYPTO_AES_KEY3, CRYPTO_AES_KEY2, CRYPTO_AES_KEY1, CRYPTO_AES_KEY0} stores the 256-bit security key for AES operation. + * @var CRYPTO_T::AES_IV0 + * Offset: 0x130 AES Initial Vector Word 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |IV |AES Initial Vectors + * | | |x = 0, 1..3. + * | | |Four initial vectors (CRYPTO_AES_IV0, CRYPTO_AES_IV1, CRYPTO_AES_IV2, and CRYPTO_AES_IV3) are for AES operating in CBC, CFB, and OFB mode + * | | |Four registers (CRYPTO_AES_IV0, CRYPTO_AES_IV1, CRYPTO_AES_IV2, and CRYPTO_AES_IV3) act as Nonce counter when the AES engine is operating in CTR mode. + * @var CRYPTO_T::AES_IV1 + * Offset: 0x134 AES Initial Vector Word 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |IV |AES Initial Vectors + * | | |x = 0, 1..3. + * | | |Four initial vectors (CRYPTO_AES_IV0, CRYPTO_AES_IV1, CRYPTO_AES_IV2, and CRYPTO_AES_IV3) are for AES operating in CBC, CFB, and OFB mode + * | | |Four registers (CRYPTO_AES_IV0, CRYPTO_AES_IV1, CRYPTO_AES_IV2, and CRYPTO_AES_IV3) act as Nonce counter when the AES engine is operating in CTR mode. + * @var CRYPTO_T::AES_IV2 + * Offset: 0x138 AES Initial Vector Word 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |IV |AES Initial Vectors + * | | |x = 0, 1..3. + * | | |Four initial vectors (CRYPTO_AES_IV0, CRYPTO_AES_IV1, CRYPTO_AES_IV2, and CRYPTO_AES_IV3) are for AES operating in CBC, CFB, and OFB mode + * | | |Four registers (CRYPTO_AES_IV0, CRYPTO_AES_IV1, CRYPTO_AES_IV2, and CRYPTO_AES_IV3) act as Nonce counter when the AES engine is operating in CTR mode. + * @var CRYPTO_T::AES_IV3 + * Offset: 0x13C AES Initial Vector Word 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |IV |AES Initial Vectors + * | | |x = 0, 1..3. + * | | |Four initial vectors (CRYPTO_AES_IV0, CRYPTO_AES_IV1, CRYPTO_AES_IV2, and CRYPTO_AES_IV3) are for AES operating in CBC, CFB, and OFB mode + * | | |Four registers (CRYPTO_AES_IV0, CRYPTO_AES_IV1, CRYPTO_AES_IV2, and CRYPTO_AES_IV3) act as Nonce counter when the AES engine is operating in CTR mode. + * @var CRYPTO_T::AES_SADDR + * Offset: 0x140 AES DMA Source Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SADDR |AES DMA Source Address + * | | |The AES accelerator supports DMA function to transfer the plain text between SRAM memory space and embedded FIFO + * | | |The SADDR keeps the source address of the data buffer where the source text is stored + * | | |Based on the source address, the AES accelerator can read the plain text (encryption) / cipher text (decryption) from SRAM memory space and do AES operation + * | | |The start of source address should be located at word boundary + * | | |In other words, bit 1 and 0 of SADDR are ignored. + * | | |SADDR can be read and written + * | | |Writing to SADDR while the AES accelerator is operating doesn't affect the current AES operation + * | | |But the value of SADDR will be updated later on + * | | |Consequently, software can prepare the DMA source address for the next AES operation. + * | | |In DMA mode, software can update the next CRYPTO_AES_SADDR before triggering START. + * | | |The value of CRYPTO_AES_SADDR and CRYPTO_AES_DADDR can be the same. + * @var CRYPTO_T::AES_DADDR + * Offset: 0x144 AES DMA Destination Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DADDR |AES DMA Destination Address + * | | |The AES accelerator supports DMA function to transfer the cipher text between SRAM memory space and embedded FIFO + * | | |The DADDR keeps the destination address of the data buffer where the engine output's text will be stored + * | | |Based on the destination address, the AES accelerator can write the cipher text (encryption) / plain text (decryption) back to SRAM memory space after the AES operation is finished + * | | |The start of destination address should be located at word boundary + * | | |In other words, bit 1 and 0 of DADDR are ignored. + * | | |DADDR can be read and written + * | | |Writing to DADDR while the AES accelerator is operating doesn't affect the current AES operation + * | | |But the value of DADDR will be updated later on + * | | |Consequently, software can prepare the destination address for the next AES operation. + * | | |In DMA mode, software can update the next CRYPTO_AES_DADDR before triggering START. + * | | |The value of CRYPTO_AES_SADDR and CRYPTO_AES_DADDR can be the same. + * @var CRYPTO_T::AES_CNT + * Offset: 0x148 AES Byte Count Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CNT |AES Byte Count + * | | |The CRYPTO_AES_CNT keeps the byte count of source text that is for the AES engine operating in DMA mode + * | | |The CRYPTO_AES_CNT is 32-bit and the maximum of byte count is 4G bytes. + * | | |CRYPTO_AES_CNT can be read and written + * | | |Writing to CRYPTO_AES_CNT while the AES accelerator is operating doesn't affect the current AES operation + * | | |But the value of CRYPTO_AES_CNT will be updated later on + * | | |Consequently, software can prepare the byte count of data for the next AES operation. + * | | |According to CBC-CS1, CBC-CS2, and CBC-CS3 standard, the count of operation data must be more than 16 bytes + * | | |Operations that are qual or less than one block will output unexpected result. + * | | |In Non-DMA ECB, CBC, CFB, OFB, CTR, CCM and GCM mode, CRYPTO_AES_CNT must be set as byte count for the last block of data before feeding in the last block of data + * | | |In Non-DMA CBC-CS1, CBC-CS2, and CBC-CS3 mode, CRYPTO_AES_CNT must be set as byte count for the last two blocks of data before feeding in the last two blocks of data. + * | | |In AES GCM mode without DMA cascade function, the value of CRYPTO_AES_CNT is equal to the total value of {CRYPTO_AES_GCM_IVCNT1, CRYPTO_AES_GCM_IVCNT0}, {CRYPTO_AES_GCM_ACNT1, CRYPTO_AES_GCM_ACNT0} and {CRYPTO_AES_GCM_PCNT1, CRYPTO_AES_GCM_PCNT0}. + * | | |In AES GCM mode with DMA cascade function, the value of CRYPTO_AES_CNT represents the byte count of source text in this cascade function + * | | |Thus, the value of CRYPTO_AES_CNT is less than or equal to the total value of {CRYPTO_AES_GCM_IVCNT1, CRYPTO_AES_GCM_IVCNT0}, {CRYPTO_AES_GCM_ACNT1, CRYPTO_AES_GCM_ACNT0} and {CRYPTO_AES_GCM_PCNT1, CRYPTO_AES_GCM_PCNT0} and must be block alignment. + * | | |In AES CCM mode without DMA cascade function, the value of CRYPTO_AES_CNT is equal to the total value of {CRYPTO_AES_GCM_ACNT1, CRYPTO_AES_GCM_ACNT0} and {CRYPTO_AES_GCM_PCNT1, CRYPTO_AES_GCM_PCNT0}. + * | | |In AES CCM mode with DMA cascade function, the value of CRYPTO_AES_CNT represents the byte count of source text in this cascade function + * | | |Thus, the value of CRYPTO_AES_CNT is less than or equal to the total value of {CRYPTO_AES_GCM_ACNT1, CRYPTO_AES_GCM_ACNT0} and {CRYPTO_AES_GCM_PCNT1, CRYPTO_AES_GCM_PCNT0} and must be block alignment, except for the last block of plaintext or ciphertext. + * @var CRYPTO_T::HMAC_CTL + * Offset: 0x300 SHA/HMAC Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |START |SHA/HMAC Engine Start + * | | |0 = No effect. + * | | |1 = Start SHA/HMAC engine. BUSY flag will be set. + * | | |Note: This bit is always 0 when it is read back. + * |[1] |STOP |SHA/HMAC Engine Stop + * | | |0 = No effect. + * | | |1 = Stop SHA/HMAC engine. + * | | |Note: This bit is always 0 when it is read back. + * |[4] |DMAFIRST |SHA/HMAC First Block in Cascade function + * | | |This bit must be set as feeding in first byte of data. + * |[5] |DMALAST |SHA/HMAC Last Block + * | | |This bit must be set as feeding in last byte of data. + * |[6] |DMACSCAD |SHA/HMAC Engine DMA with Cascade Mode + * | | |0 = DMA cascade function Disabled. + * | | |1 = In DMA cascade mode, software can update DMA source address register, destination address register, and byte count register during a cascade operation, without finishing the accelerator operation. + * |[7] |DMAEN |SHA/HMAC Engine DMA Enable Bit + * | | |0 = SHA/HMAC DMA engine Disabled. + * | | |SHA/HMAC engine operates in Non-DMA mode. The data need to be written in CRYPTO_HMAC_DATIN. + * | | |1 = SHA/HMAC DMA engine Enabled. + * | | |SHA/HMAC engine operates in DMA mode, and data movement from/to the engine is done by DMA logic. + * |[10:8] |OPMODE |SHA/HMAC Engine Operation Modes + * | | |When SHA3EN=0,. + * | | |0x0xx: SHA1-160 + * | | |0x100: SHA2-256 + * | | |0x101: SHA2-224 + * | | |0x110: SHA2-512 + * | | |0x111: SHA2-384 + * | | |When SHA3EN=1,. + * | | |0x100: SHA3-256 + * | | |0x101: SHA3-224 + * | | |0x110: SHA3-512 + * | | |0x111: SHA3-384 + * | | |0x000: SHAKE128 + * | | |0x001: SHAKE256 + * | | |Note: These bits can be read and written. But writing to them wouldn't take effect as BUSY is 1. + * | | |Note: When SM3EN=1, SHA/HMAC only execute SM3 and then generate 256 bits digest. + * | | |Note: When MD5EN=1, SHA/HMAC only execute MD5 and then generate 128 bits digest. + * |[11] |HMACEN |HMAC_SHA Engine Operating Mode + * | | |0 = Execute SHA function. + * | | |1 = Execute HMAC function. + * |[12] |SHA3EN |SHA3 Engine Enable Bit + * | | |0 = Execute other function. + * | | |1 = Execute SHA3 function if SM3EN=0 and MD5EN=0. + * |[13] |SM3EN |SM3 Engine Enable Bit + * | | |0 = Execute other function. + * | | |1 = Execute SM3 function if SHA3EN=0 and MD5EN=0. + * |[14] |MD5EN |MD5 Engine Enable Bit + * | | |0 = Execute other function. + * | | |1 = Execute MD5 function if SHA3EN=0 and SM3EN=0. + * |[20] |FBIN |Feedback Input to SHA/HMAC Via DMA Automatically + * | | |0 = DMA automatic feedback input function Disabled. + * | | |1 = DMA automatic feedback input function Enabled when DMAEN = 1. + * |[21] |FBOUT |Feedback Output From SHA/HMAC Via DMA Automatically + * | | |0 = DMA automatic feedback output function Disabled. + * | | |1 = DMA automatic feedback output function Enabled when DMAEN = 1. + * |[22] |OUTSWAP |SHA/HMAC Engine Output Data Swap + * | | |0 = Keep the original order. + * | | |1 = The order that CPU feeds data to the accelerator will be changed from {byte3, byte2, byte1, byte0} to {byte0, byte1, byte2, byte3}. + * |[23] |INSWAP |SHA/HMAC Engine Input Data Swap + * | | |0 = Keep the original order. + * | | |1 = The order that CPU feeds data to the accelerator will be changed from {byte3, byte2, byte1, byte0} to {byte0, byte1, byte2, byte3}. + * |[24] |NEXTDGST |SHAKE128/256 Next Digest Start + * | | |0 = No effect. + * | | |1 = Start SHAKE engine to generate the next digest only when SHAKEBUSY is 0 + * | | |BUSY and SHAKEBUSY flag will be set. + * |[25] |FINISHDGST|SHAKE128/256 Next Digest Finish + * | | |0 = No effect. + * | | |1 = finish generating the next digest. + * @var CRYPTO_T::HMAC_STS + * Offset: 0x304 SHA/HMAC Status Flag + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BUSY |SHA/HMAC Engine Busy + * | | |0 = SHA/HMAC engine is idle or finished. + * | | |1 = SHA/HMAC engine is busy. + * |[1] |DMABUSY |SHA/HMAC Engine DMA Busy Flag + * | | |0 = SHA/HMAC DMA engine is idle or finished. + * | | |1 = SHA/HMAC DMA engine is busy. + * |[2] |SHAKEBUSY |SHAKE Engine Busy Flag + * | | |0 = SHAKE engine is idle or finished. + * | | |1 = SHAKE engine is busy. + * |[8] |DMAERR |SHA/HMAC Engine DMA Error Flag + * | | |0 = Show the SHA/HMAC engine access normal. + * | | |1 = Show the SHA/HMAC engine access error. + * |[9] |KSERR |HMAC Engine Access Key Store Error Flag + * | | |0 = No error. + * | | |1 = Access error will stop HMAC engine. + * |[16] |DATINREQ |SHA/HMAC Non-DMA Mode Data Input Request + * | | |0 = No effect. + * | | |1 = Request SHA/HMAC Non-DMA mode data input. + * @var CRYPTO_T::HMAC_DGST0 + * Offset: 0x308 SHA/HMAC Output Feedback Data 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST1 + * Offset: 0x30C SHA/HMAC Output Feedback Data 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST2 + * Offset: 0x310 SHA/HMAC Output Feedback Data 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST3 + * Offset: 0x314 SHA/HMAC Output Feedback Data 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST4 + * Offset: 0x318 SHA/HMAC Output Feedback Data 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST5 + * Offset: 0x31C SHA/HMAC Output Feedback Data 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST6 + * Offset: 0x320 SHA/HMAC Output Feedback Data 6 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST7 + * Offset: 0x324 SHA/HMAC Output Feedback Data 7 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST8 + * Offset: 0x328 SHA/HMAC Output Feedback Data 8 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST9 + * Offset: 0x32C SHA/HMAC Output Feedback Data 9 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST10 + * Offset: 0x330 SHA/HMAC Output Feedback Data 10 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST11 + * Offset: 0x334 SHA/HMAC Output Feedback Data 11 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST12 + * Offset: 0x338 SHA/HMAC Output Feedback Data 12 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST13 + * Offset: 0x33C SHA/HMAC Output Feedback Data 13 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST14 + * Offset: 0x340 SHA/HMAC Output Feedback Data 14 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_DGST15 + * Offset: 0x344 SHA/HMAC Output Feedback Data 15 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC Output Feedback Data Output Register + * | | |For SHA-160, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST4. + * | | |For SHA-224, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST6. + * | | |For SHA-256, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST7. + * | | |For SHA-384, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST11. + * | | |For SHA-512, the digest is stored in CRYPTO_HMAC_DGST0 ~ CRYPTO_HMAC_DGST15. + * @var CRYPTO_T::HMAC_KEYCNT + * Offset: 0x348 SHA/HMAC Key Byte Count Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEYCNT |SHA/HMAC Key Byte Count + * | | |The CRYPTO_HMAC_KEYCNT keeps the byte count of key that SHA/HMAC engine operates + * | | |The register is 32-bit and the maximum byte count is 4G bytes + * | | |It can be read and written. + * | | |Writing to the register CRYPTO_HMAC_KEYCNT as the SHA/HMAC accelerator operating doesn't affect the current SHA/HMAC operation + * | | |But the value of CRYPTO_HMAC_KEYCNT will be updated later on + * | | |Consequently, software can prepare the key count for the next SHA/HMAC operation. + * @var CRYPTO_T::HMAC_SADDR + * Offset: 0x34C SHA/HMAC DMA Source Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SADDR |SHA/HMAC DMA Source Address + * | | |The SHA/HMAC accelerator supports DMA function to transfer the plain text between SRAM memory space and embedded FIFO + * | | |The CRYPTO_HMAC_SADDR keeps the source address of the data buffer where the source text is stored + * | | |Based on the source address, the SHA/HMAC accelerator can read the plain text from SRAM memory space and do SHA/HMAC operation + * | | |The start of source address should be located at word boundary + * | | |In other words, bit 1 and 0 of CRYPTO_HMAC_SADDR are ignored. + * | | |CRYPTO_HMAC_SADDR can be read and written + * | | |Writing to CRYPTO_HMAC_SADDR while the SHA/HMAC accelerator is operating doesn't affect the current SHA/HMAC operation + * | | |But the value of CRYPTO_HMAC_SADDR will be updated later on + * | | |Consequently, software can prepare the DMA source address for the next SHA/HMAC operation. + * | | |In DMA mode, software can update the next CRYPTO_HMAC_SADDR before triggering START. + * | | |CRYPTO_HMAC_SADDR and CRYPTO_HMAC_DADDR can be the same in the value. + * @var CRYPTO_T::HMAC_DMACNT + * Offset: 0x350 SHA/HMAC Byte Count Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DMACNT |SHA/HMAC Operation Byte Count + * | | |The CRYPTO_HMAC_DMACNT keeps the byte count of source text that is for the SHA/HMAC engine operating in DMA mode + * | | |The CRYPTO_HMAC_DMACNT is 32-bit and the maximum of byte count is 4G bytes. + * | | |CRYPTO_HMAC_DMACNT can be read and written + * | | |Writing to CRYPTO_HMAC_DMACNT while the SHA/HMAC accelerator is operating doesn't affect the current SHA/HMAC operation + * | | |But the value of CRYPTO_HMAC_DMACNT will be updated later on + * | | |Consequently, software can prepare the byte count of data for the next SHA/HMAC operation. + * | | |In Non-DMA mode, CRYPTO_HMAC_DMACNT must be set as the byte count of the last block before feeding in the last block of data. + * @var CRYPTO_T::HMAC_DATIN + * Offset: 0x354 SHA/HMAC Engine Non-DMA Mode Data Input Port Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATIN |SHA/HMAC Engine Input Port + * | | |CPU feeds data to SHA/HMAC engine through this port by checking CRYPTO_HMAC_STS + * | | |Feed data as DATINREQ is 1. + * @var CRYPTO_T::HMAC_FDBCK0 + * Offset: 0x358 SHA/HMAC Output Feedback Data 0 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK1 + * Offset: 0x35C SHA/HMAC Output Feedback Data 1 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK2 + * Offset: 0x360 SHA/HMAC Output Feedback Data 2 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK3 + * Offset: 0x364 SHA/HMAC Output Feedback Data 3 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK4 + * Offset: 0x368 SHA/HMAC Output Feedback Data 4 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK5 + * Offset: 0x36C SHA/HMAC Output Feedback Data 5 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK6 + * Offset: 0x370 SHA/HMAC Output Feedback Data 6 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK7 + * Offset: 0x374 SHA/HMAC Output Feedback Data 7 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK8 + * Offset: 0x378 SHA/HMAC Output Feedback Data 8 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK9 + * Offset: 0x37C SHA/HMAC Output Feedback Data 9 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK10 + * Offset: 0x380 SHA/HMAC Output Feedback Data 10 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK11 + * Offset: 0x384 SHA/HMAC Output Feedback Data 11 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK12 + * Offset: 0x388 SHA/HMAC Output Feedback Data 12 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK13 + * Offset: 0x38C SHA/HMAC Output Feedback Data 13 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK14 + * Offset: 0x390 SHA/HMAC Output Feedback Data 14 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK15 + * Offset: 0x394 SHA/HMAC Output Feedback Data 15 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK16 + * Offset: 0x398 SHA/HMAC Output Feedback Data 16 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK17 + * Offset: 0x39C SHA/HMAC Output Feedback Data 17 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK18 + * Offset: 0x3A0 SHA/HMAC Output Feedback Data 18 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK19 + * Offset: 0x3A4 SHA/HMAC Output Feedback Data 19 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK20 + * Offset: 0x3A8 SHA/HMAC Output Feedback Data 20 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK21 + * Offset: 0x3AC SHA/HMAC Output Feedback Data 21 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK22 + * Offset: 0x3B0 SHA/HMAC Output Feedback Data 22 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK23 + * Offset: 0x3B4 SHA/HMAC Output Feedback Data 23 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK24 + * Offset: 0x3B8 SHA/HMAC Output Feedback Data 24 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK25 + * Offset: 0x3BC SHA/HMAC Output Feedback Data 25 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK26 + * Offset: 0x3C0 SHA/HMAC Output Feedback Data 26 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK27 + * Offset: 0x3C4 SHA/HMAC Output Feedback Data 27 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK28 + * Offset: 0x3C8 SHA/HMAC Output Feedback Data 28 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK29 + * Offset: 0x3CC SHA/HMAC Output Feedback Data 29 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK30 + * Offset: 0x3D0 SHA/HMAC Output Feedback Data 30 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK31 + * Offset: 0x3D4 SHA/HMAC Output Feedback Data 31 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK32 + * Offset: 0x3D8 SHA/HMAC Output Feedback Data 32 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK33 + * Offset: 0x3DC SHA/HMAC Output Feedback Data 33 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK34 + * Offset: 0x3E0 SHA/HMAC Output Feedback Data 34 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK35 + * Offset: 0x3E4 SHA/HMAC Output Feedback Data 35 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK36 + * Offset: 0x3E8 SHA/HMAC Output Feedback Data 36 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK37 + * Offset: 0x3EC SHA/HMAC Output Feedback Data 37 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK38 + * Offset: 0x3F0 SHA/HMAC Output Feedback Data 38 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK39 + * Offset: 0x3F4 SHA/HMAC Output Feedback Data 39 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK40 + * Offset: 0x3F8 SHA/HMAC Output Feedback Data 40 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK41 + * Offset: 0x3FC SHA/HMAC Output Feedback Data 41 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK42 + * Offset: 0x400 SHA/HMAC Output Feedback Data 42 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK43 + * Offset: 0x404 SHA/HMAC Output Feedback Data 43 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK44 + * Offset: 0x408 SHA/HMAC Output Feedback Data 44 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK45 + * Offset: 0x40C SHA/HMAC Output Feedback Data 45 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK46 + * Offset: 0x410 SHA/HMAC Output Feedback Data 46 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK47 + * Offset: 0x414 SHA/HMAC Output Feedback Data 47 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK48 + * Offset: 0x418 SHA/HMAC Output Feedback Data 48 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK49 + * Offset: 0x41C SHA/HMAC Output Feedback Data 49 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK50 + * Offset: 0x420 SHA/HMAC Output Feedback Data 50 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK51 + * Offset: 0x424 SHA/HMAC Output Feedback Data 51 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK52 + * Offset: 0x428 SHA/HMAC Output Feedback Data 52 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK53 + * Offset: 0x42C SHA/HMAC Output Feedback Data 53 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK54 + * Offset: 0x430 SHA/HMAC Output Feedback Data 54 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK55 + * Offset: 0x434 SHA/HMAC Output Feedback Data 55 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK56 + * Offset: 0x438 SHA/HMAC Output Feedback Data 56 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK57 + * Offset: 0x43C SHA/HMAC Output Feedback Data 57 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK58 + * Offset: 0x440 SHA/HMAC Output Feedback Data 58 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK59 + * Offset: 0x444 SHA/HMAC Output Feedback Data 59 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK60 + * Offset: 0x448 SHA/HMAC Output Feedback Data 60 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK61 + * Offset: 0x44C SHA/HMAC Output Feedback Data 61 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK62 + * Offset: 0x450 SHA/HMAC Output Feedback Data 62 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK63 + * Offset: 0x454 SHA/HMAC Output Feedback Data 63 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK64 + * Offset: 0x458 SHA/HMAC Output Feedback Data 64 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK65 + * Offset: 0x45C SHA/HMAC Output Feedback Data 65 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK66 + * Offset: 0x460 SHA/HMAC Output Feedback Data 66 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK67 + * Offset: 0x464 SHA/HMAC Output Feedback Data 67 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK68 + * Offset: 0x468 SHA/HMAC Output Feedback Data 68 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK69 + * Offset: 0x46C SHA/HMAC Output Feedback Data 69 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK70 + * Offset: 0x470 SHA/HMAC Output Feedback Data 70 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK71 + * Offset: 0x474 SHA/HMAC Output Feedback Data 71 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK72 + * Offset: 0x478 SHA/HMAC Output Feedback Data 72 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK73 + * Offset: 0x47C SHA/HMAC Output Feedback Data 73 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK74 + * Offset: 0x480 SHA/HMAC Output Feedback Data 74 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK75 + * Offset: 0x484 SHA/HMAC Output Feedback Data 75 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK76 + * Offset: 0x488 SHA/HMAC Output Feedback Data 76 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK77 + * Offset: 0x48C SHA/HMAC Output Feedback Data 77 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK78 + * Offset: 0x490 SHA/HMAC Output Feedback Data 78 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK79 + * Offset: 0x494 SHA/HMAC Output Feedback Data 79 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK80 + * Offset: 0x498 SHA/HMAC Output Feedback Data 80 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK81 + * Offset: 0x49C SHA/HMAC Output Feedback Data 81 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK82 + * Offset: 0x4A0 SHA/HMAC Output Feedback Data 82 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK83 + * Offset: 0x4A4 SHA/HMAC Output Feedback Data 83 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK84 + * Offset: 0x4A8 SHA/HMAC Output Feedback Data 84 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK85 + * Offset: 0x4AC SHA/HMAC Output Feedback Data 85 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK86 + * Offset: 0x4B0 SHA/HMAC Output Feedback Data 86 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_FDBCK87 + * Offset: 0x4B4 SHA/HMAC Output Feedback Data 87 After SHA/HMAC Operation + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FDBCK |SHA/HMAC Feedback Information + * | | |The feedback value is 1728 bits in size for SHA1/2 and 2784 bits in size for SHA3. + * | | |The SHA/HMAC engine uses the data from CRYPTO_HMAC_FDBCKx as the data inputted to CRYPTO_HMAC_FDBCKx for the next block in DMA cascade mode. + * | | |The SHA/HMAC engine outputs feedback information for initial setting in the next block's operation + * | | |Software can store that feedback value temporarily + * | | |After switching back, fill the stored feedback value to CRYPTO_HMAC_FDBCKx in the same operation, and then continue the operation with the original setting. + * @var CRYPTO_T::HMAC_SHA512T + * Offset: 0x4F8 SHA/HMAC SHA512T Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SHA512TEN |SHA512T Engine Enable Bit + * | | |0 = Execute other function. + * | | |1 = Execute SHA512T function if SHA3EN=0, MD5EN=0 and SM3EN=0. + * | | |Note: When SHA512TEN=1, SHA/HMAC only execute SHA2-512. + * |[16:8] |TLEN |SHA512T output digest length + * | | |The TLEN is equal to value t of SHA512T. It also means the output digest length of SHA512T. + * | | |Note: TLEN < 512, and TLEN is not 384 + * @var CRYPTO_T::HMAC_FBADDR + * Offset: 0x4FC SHA/HMAC DMA Feedback Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |FBADDR |SHA/HMAC DMA Feedback Address + * | | |In DMA cascade mode, software can update DMA feedback address register for automatically reading and writing feedback values via DMA + * | | |The FBADDR keeps the feedback address of the feedback data for the next cascade operation + * | | |Based on the feedback address, the SHA/HMAC accelerator can read the feedback data of the last cascade operation from SRAM memory space and write the feedback data of the current cascade operation to SRAM memory space + * | | |The start of feedback address should be located at word boundary + * | | |In other words, bit 1 and 0 of FBADDR are ignored. + * | | |FBADDR can be read and written. + * | | |In DMA mode, software can update the next CRYPTO_HMAC_FBADDR before triggering START. + * @var CRYPTO_T::HMAC_SHAKEDGST0 + * Offset: 0x500 SHA/HMAC SHAKE Digest Message 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST1 + * Offset: 0x504 SHA/HMAC SHAKE Digest Message 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST2 + * Offset: 0x508 SHA/HMAC SHAKE Digest Message 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST3 + * Offset: 0x50C SHA/HMAC SHAKE Digest Message 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST4 + * Offset: 0x510 SHA/HMAC SHAKE Digest Message 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST5 + * Offset: 0x514 SHA/HMAC SHAKE Digest Message 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST6 + * Offset: 0x518 SHA/HMAC SHAKE Digest Message 6 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST7 + * Offset: 0x51C SHA/HMAC SHAKE Digest Message 7 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST8 + * Offset: 0x520 SHA/HMAC SHAKE Digest Message 8 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST9 + * Offset: 0x524 SHA/HMAC SHAKE Digest Message 9 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST10 + * Offset: 0x528 SHA/HMAC SHAKE Digest Message 10 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST11 + * Offset: 0x52C SHA/HMAC SHAKE Digest Message 11 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST12 + * Offset: 0x530 SHA/HMAC SHAKE Digest Message 12 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST13 + * Offset: 0x534 SHA/HMAC SHAKE Digest Message 13 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST14 + * Offset: 0x538 SHA/HMAC SHAKE Digest Message 14 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST15 + * Offset: 0x53C SHA/HMAC SHAKE Digest Message 15 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST16 + * Offset: 0x540 SHA/HMAC SHAKE Digest Message 16 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST17 + * Offset: 0x544 SHA/HMAC SHAKE Digest Message 17 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST18 + * Offset: 0x548 SHA/HMAC SHAKE Digest Message 18 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST19 + * Offset: 0x54C SHA/HMAC SHAKE Digest Message 19 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST20 + * Offset: 0x550 SHA/HMAC SHAKE Digest Message 20 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST21 + * Offset: 0x554 SHA/HMAC SHAKE Digest Message 21 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST22 + * Offset: 0x558 SHA/HMAC SHAKE Digest Message 22 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST23 + * Offset: 0x55C SHA/HMAC SHAKE Digest Message 23 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST24 + * Offset: 0x560 SHA/HMAC SHAKE Digest Message 24 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST25 + * Offset: 0x564 SHA/HMAC SHAKE Digest Message 25 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST26 + * Offset: 0x568 SHA/HMAC SHAKE Digest Message 26 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST27 + * Offset: 0x56C SHA/HMAC SHAKE Digest Message 27 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST28 + * Offset: 0x570 SHA/HMAC SHAKE Digest Message 28 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST29 + * Offset: 0x574 SHA/HMAC SHAKE Digest Message 29 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST30 + * Offset: 0x578 SHA/HMAC SHAKE Digest Message 30 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST31 + * Offset: 0x57C SHA/HMAC SHAKE Digest Message 31 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST32 + * Offset: 0x580 SHA/HMAC SHAKE Digest Message 32 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST33 + * Offset: 0x584 SHA/HMAC SHAKE Digest Message 33 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST34 + * Offset: 0x588 SHA/HMAC SHAKE Digest Message 34 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST35 + * Offset: 0x58C SHA/HMAC SHAKE Digest Message 35 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST36 + * Offset: 0x590 SHA/HMAC SHAKE Digest Message 36 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST37 + * Offset: 0x594 SHA/HMAC SHAKE Digest Message 37 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST38 + * Offset: 0x598 SHA/HMAC SHAKE Digest Message 38 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST39 + * Offset: 0x59C SHA/HMAC SHAKE Digest Message 39 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST40 + * Offset: 0x5A0 SHA/HMAC SHAKE Digest Message 40 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::HMAC_SHAKEDGST41 + * Offset: 0x5A4 SHA/HMAC SHAKE Digest Message 41 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DGST |SHA/HMAC SHAKE Digest Message Register + * | | |For SHAKE-128, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 41. + * | | |For SHAKE-256, the digest is stored in CRYPTO_HMAC_SHAKEDGST0 0 ~ CRYPTO_HMAC_ SHAKEDGST0 33. + * @var CRYPTO_T::ECC_CTL + * Offset: 0x800 ECC Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |START |ECC Accelerator Start + * | | |0 = No effect. + * | | |1 = Start ECC accelerator. BUSY flag will be set. + * | | |This bit is always 0 when it is read back. + * | | |ECC accelerator will ignore this START signal when BUSY flag is 1. + * |[1] |STOP |ECC Accelerator Stop + * | | |0 = No effect. + * | | |1 = Abort ECC accelerator and make it into idle state. + * | | |This bit is always 0 when it is read back. + * | | |Remember to clear ECC interrupt flag after stopping ECC accelerator. + * |[4] |ECDSAS |Generate S in ECDSA Signature Generation + * | | |0 = No effect. + * | | |1 = Formula for generating S. + * | | |POINTX1 = ((POINTX2 * POINTY1 + POINTY2 ) / POINTX1) % CURVEN. + * |[5] |ECDSAR |Generate R in ECDSA Signature Generation + * | | |0 = No effect. + * | | |1 = Formula for generating R. + * | | |(POINTX1, POINTY1) = SCALARK * (POINTX1, POINTY1). + * |[7] |DMAEN |ECC Accelerator DMA Enable Bit + * | | |0 = ECC DMA engine Disabled. + * | | |1 = ECC DMA engine Enabled. + * | | |Only when START and DMAEN are 1, ECC DMA engine will be active. + * |[8] |FSEL |Field Selection + * | | |0 = Binary Field (GF(2m )). + * | | |1 = Prime Field (GF(p)). + * |[10:9] |ECCOP |Point Operation for BF and PF + * | | |00 = Point multiplication:. + * | | |(POINTX1, POINTY1) = SCALARK * (POINTX1, POINTY1). + * | | |01 = Modulus operation: choose by MODOP (CRYPTO_ECC_CTL[12:11]). + * | | |10 = Point addition:. + * | | |(POINTX1, POINTY1) = (POINTX1, POINTY1) +. + * | | |(POINTX2, POINTY2) + * | | |11 = Point doubling:. + * | | |(POINTX1, POINTY1) = 2 * (POINTX1, POINTY1). + * | | |Besides above three input data, point operations still need the parameters of elliptic curve (CURVEA, CURVEB, CURVEN and CURVEM) as shown in Figure 6.27-11 + * |[12:11] |MODOP |Modulus Operation for PF + * | | |00 = Division:. + * | | |POINTX1 = (POINTY1 / POINTX1) % CURVEN. + * | | |01 = Multiplication:. + * | | |POINTX1 = (POINTX1 * POINTY1) % CURVEN. + * | | |10 = Addition:. + * | | |POINTX1 = (POINTX1 + POINTY1) % CURVEN. + * | | |11 = Subtraction:. + * | | |POINTX1 = (POINTX1 - POINTY1) % CURVEN. + * | | |MODOP is active only when ECCOP = 01. + * |[13] |CSEL |Curve Selection + * | | |0 = NIST suggested curve. + * | | |1 = Montgomery curve. + * |[14] |SCAP |Side-channel Attack Protection + * | | |0 = Full speed without side-channel protection. + * | | |1 = Less speed with side-channel protection. + * |[15] |ASCAP |Advance Side-channel Attack Protection + * | | |0 = Advance side-channel protection Disabled. + * | | |1 = Advance side-channel protection Enabled. + * | | |ASCAP is active only when SCAP = 1. + * |[16] |LDP1 |The Control Signal of Register POINTX1 and POINTY1 for the x and Y Coordinate of the First Point + * | | |0 = The register for POINTX1 and POINTY1 is not modified by DMA or user. + * | | |1 = The register for POINTX1 and POINTY1 is modified by DMA or user. + * |[17] |LDP2 |The Control Signal of Register POINTX2 and POINTY2 for the x and Y Coordinate of the Second Point + * | | |0 = The register for POINTX2 and POINTY2 is not modified by DMA or user. + * | | |1 = The register for POINTX2 and POINTY2 is modified by DMA or user. + * |[18] |LDA |The Control Signal of Register for the Parameter CURVEA of Elliptic Curve + * | | |0 = The register for CURVEA is not modified by DMA or user. + * | | |1 = The register for CURVEA is modified by DMA or user. + * |[19] |LDB |The Control Signal of Register for the Parameter CURVEB of Elliptic Curve + * | | |0 = The register for CURVEB is not modified by DMA or user. + * | | |1 = The register for CURVEB is modified by DMA or user. + * |[20] |LDN |The Control Signal of Register for the Parameter CURVEN of Elliptic Curve + * | | |0 = The register for CURVEN is not modified by DMA or user. + * | | |1 = The register for CURVEN is modified by DMA or user. + * |[21] |LDK |The Control Signal of Register for SCALARK + * | | |0 = The register for SCALARK is not modified by DMA or user. + * | | |1 = The register for SCALARK is modified by DMA or user. + * |[31:22] |CURVEM |The key length of elliptic curve. + * @var CRYPTO_T::ECC_STS + * Offset: 0x804 ECC Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BUSY |ECC Accelerator Busy Flag + * | | |0 = The ECC accelerator is idle or finished. + * | | |1 = The ECC accelerator is under processing and protects all registers. + * | | |Note: Remember to clear ECC interrupt flag after ECC accelerator is finished + * |[1] |DMABUSY |ECC DMA Busy Flag + * | | |0 = ECC DMA is idle or finished. + * | | |1 = ECC DMA is busy. + * |[16] |BUSERR |ECC DMA Access Bus Error Flag + * | | |0 = No error. + * | | |1 = Bus error will stop DMA operation and ECC accelerator. + * |[17] |KSERR |ECC Engine Access Key Store Error Flag + * | | |0 = No error. + * | | |1 = Access error will stop ECC engine. + * |[18] |DFAERR |ECC Engine Differential Fault Attack Error Flag + * | | |0 = No error. + * | | |1 = Differential Fault Attack happened in ECC engine. The results from ECC engine are wrong. + * @var CRYPTO_T::ECC_X1_00 + * Offset: 0x808 ECC the X-coordinate Word0 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_01 + * Offset: 0x80C ECC the X-coordinate Word1 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_02 + * Offset: 0x810 ECC the X-coordinate Word2 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_03 + * Offset: 0x814 ECC the X-coordinate Word3 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_04 + * Offset: 0x818 ECC the X-coordinate Word4 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_05 + * Offset: 0x81C ECC the X-coordinate Word5 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_06 + * Offset: 0x820 ECC the X-coordinate Word6 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_07 + * Offset: 0x824 ECC the X-coordinate Word7 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_08 + * Offset: 0x828 ECC the X-coordinate Word8 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_09 + * Offset: 0x82C ECC the X-coordinate Word9 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_10 + * Offset: 0x830 ECC the X-coordinate Word10 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_11 + * Offset: 0x834 ECC the X-coordinate Word11 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_12 + * Offset: 0x838 ECC the X-coordinate Word12 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_13 + * Offset: 0x83C ECC the X-coordinate Word13 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_14 + * Offset: 0x840 ECC the X-coordinate Word14 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_15 + * Offset: 0x844 ECC the X-coordinate Word15 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_16 + * Offset: 0x848 ECC the X-coordinate Word16 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_X1_17 + * Offset: 0x84C ECC the X-coordinate Word17 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX1 |ECC the X-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For B-233 or K-233, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For B-283 or K-283, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_08 + * | | |For B-409 or K-409, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_12 + * | | |For B-571 or K-571, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_17 + * | | |For P-192, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_05 + * | | |For P-224, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_06 + * | | |For P-256 or SM2, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_07 + * | | |For P-384, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_11 + * | | |For P-521, POINTX1 is stored in CRYPTO_ECC_X1_00~CRYPTO_ECC_X1_16 + * @var CRYPTO_T::ECC_Y1_00 + * Offset: 0x850 ECC the Y-coordinate Word0 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_01 + * Offset: 0x854 ECC the Y-coordinate Word1 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_02 + * Offset: 0x858 ECC the Y-coordinate Word2 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_03 + * Offset: 0x85C ECC the Y-coordinate Word3 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_04 + * Offset: 0x860 ECC the Y-coordinate Word4 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_05 + * Offset: 0x864 ECC the Y-coordinate Word5 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_06 + * Offset: 0x868 ECC the Y-coordinate Word6 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_07 + * Offset: 0x86C ECC the Y-coordinate Word7 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_08 + * Offset: 0x870 ECC the Y-coordinate Word8 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_09 + * Offset: 0x874 ECC the Y-coordinate Word9 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_10 + * Offset: 0x878 ECC the Y-coordinate Word10 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_11 + * Offset: 0x87C ECC the Y-coordinate Word11 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_12 + * Offset: 0x880 ECC the Y-coordinate Word12 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_13 + * Offset: 0x884 ECC the Y-coordinate Word13 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_14 + * Offset: 0x888 ECC the Y-coordinate Word14 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_15 + * Offset: 0x88C ECC the Y-coordinate Word15 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_16 + * Offset: 0x890 ECC the Y-coordinate Word16 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_Y1_17 + * Offset: 0x894 ECC the Y-coordinate Word17 of the First Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY1 |ECC the Y-coordinate Value of the First Point + * | | |For B-163 or K-163, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For B-233 or K-233, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For B-283 or K-283, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_08 + * | | |For B-409 or K-409, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_12 + * | | |For B-571 or K-571, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_17 + * | | |For P-192, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_05 + * | | |For P-224, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_06 + * | | |For P-256 or SM2, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_07 + * | | |For P-384, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_11 + * | | |For P-521, POINTY1 is stored in CRYPTO_ECC_Y1_00~CRYPTO_ECC_Y1_16 + * @var CRYPTO_T::ECC_X2_00 + * Offset: 0x898 ECC the X-coordinate Word0 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_01 + * Offset: 0x89C ECC the X-coordinate Word1 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_02 + * Offset: 0x8A0 ECC the X-coordinate Word2 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_03 + * Offset: 0x8A4 ECC the X-coordinate Word3 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_04 + * Offset: 0x8A8 ECC the X-coordinate Word4 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_05 + * Offset: 0x8AC ECC the X-coordinate Word5 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_06 + * Offset: 0x8B0 ECC the X-coordinate Word6 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_07 + * Offset: 0x8B4 ECC the X-coordinate Word7 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_08 + * Offset: 0x8B8 ECC the X-coordinate Word8 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_09 + * Offset: 0x8BC ECC the X-coordinate Word9 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_10 + * Offset: 0x8C0 ECC the X-coordinate Word10 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_11 + * Offset: 0x8C4 ECC the X-coordinate Word11 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_12 + * Offset: 0x8C8 ECC the X-coordinate Word12 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_13 + * Offset: 0x8CC ECC the X-coordinate Word13 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_14 + * Offset: 0x8D0 ECC the X-coordinate Word14 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_15 + * Offset: 0x8D4 ECC the X-coordinate Word15 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_16 + * Offset: 0x8D8 ECC the X-coordinate Word16 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_X2_17 + * Offset: 0x8DC ECC the X-coordinate Word17 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTX2 |ECC the X-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For B-233 or K-233, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For B-283 or K-283, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_08 + * | | |For B-409 or K-409, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_12 + * | | |For B-571 or K-571, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_17 + * | | |For P-192, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_05 + * | | |For P-224, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_06 + * | | |For P-256 or SM2, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_07 + * | | |For P-384, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_11 + * | | |For P-521, POINTX2 is stored in CRYPTO_ECC_X2_00~CRYPTO_ECC_X2_16 + * @var CRYPTO_T::ECC_Y2_00 + * Offset: 0x8E0 ECC the Y-coordinate Word0 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_01 + * Offset: 0x8E4 ECC the Y-coordinate Word1 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_02 + * Offset: 0x8E8 ECC the Y-coordinate Word2 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_03 + * Offset: 0x8EC ECC the Y-coordinate Word3 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_04 + * Offset: 0x8F0 ECC the Y-coordinate Word4 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_05 + * Offset: 0x8F4 ECC the Y-coordinate Word5 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_06 + * Offset: 0x8F8 ECC the Y-coordinate Word6 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_07 + * Offset: 0x8FC ECC the Y-coordinate Word7 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_08 + * Offset: 0x900 ECC the Y-coordinate Word8 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_09 + * Offset: 0x904 ECC the Y-coordinate Word9 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_10 + * Offset: 0x908 ECC the Y-coordinate Word10 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_11 + * Offset: 0x90C ECC the Y-coordinate Word11 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_12 + * Offset: 0x910 ECC the Y-coordinate Word12 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_13 + * Offset: 0x914 ECC the Y-coordinate Word13 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_14 + * Offset: 0x918 ECC the Y-coordinate Word14 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_15 + * Offset: 0x91C ECC the Y-coordinate Word15 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_16 + * Offset: 0x920 ECC the Y-coordinate Word16 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_Y2_17 + * Offset: 0x924 ECC the Y-coordinate Word17 of the Second Point + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |POINTY2 |ECC the Y-coordinate Value of the Second Point + * | | |For B-163 or K-163, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For B-233 or K-233, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For B-283 or K-283, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_08 + * | | |For B-409 or K-409, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_12 + * | | |For B-571 or K-571, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_17 + * | | |For P-192, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_05 + * | | |For P-224, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_06 + * | | |For P-256 or SM2, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_07 + * | | |For P-384, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_11 + * | | |For P-521, POINTY2 is stored in CRYPTO_ECC_Y2_00~CRYPTO_ECC_Y2_16 + * @var CRYPTO_T::ECC_A_00 + * Offset: 0x928 ECC the Parameter CURVEA Word0 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_01 + * Offset: 0x92C ECC the Parameter CURVEA Word1 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_02 + * Offset: 0x930 ECC the Parameter CURVEA Word2 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_03 + * Offset: 0x934 ECC the Parameter CURVEA Word3 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_04 + * Offset: 0x938 ECC the Parameter CURVEA Word4 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_05 + * Offset: 0x93C ECC the Parameter CURVEA Word5 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_06 + * Offset: 0x940 ECC the Parameter CURVEA Word6 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_07 + * Offset: 0x944 ECC the Parameter CURVEA Word7 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_08 + * Offset: 0x948 ECC the Parameter CURVEA Word8 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_09 + * Offset: 0x94C ECC the Parameter CURVEA Word9 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_10 + * Offset: 0x950 ECC the Parameter CURVEA Word10 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_11 + * Offset: 0x954 ECC the Parameter CURVEA Word11 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_12 + * Offset: 0x958 ECC the Parameter CURVEA Word12 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_13 + * Offset: 0x95C ECC the Parameter CURVEA Word13 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_14 + * Offset: 0x960 ECC the Parameter CURVEA Word14 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_15 + * Offset: 0x964 ECC the Parameter CURVEA Word15 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_16 + * Offset: 0x968 ECC the Parameter CURVEA Word16 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_A_17 + * Offset: 0x96C ECC the Parameter CURVEA Word17 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEA |ECC the Parameter CURVEA Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For B-233 or K-233, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For B-283 or K-283, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_08 + * | | |For B-409 or K-409, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_12 + * | | |For B-571 or K-571, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_17 + * | | |For P-192, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_05 + * | | |For P-224, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_06 + * | | |For P-256 or SM2, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_07 + * | | |For P-384, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_11 + * | | |For P-521, CURVEA is stored in CRYPTO_ECC_A_00~CRYPTO_ECC_A_16 + * @var CRYPTO_T::ECC_B_00 + * Offset: 0x970 ECC the Parameter CURVEB Word0 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_01 + * Offset: 0x974 ECC the Parameter CURVEB Word1 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_02 + * Offset: 0x978 ECC the Parameter CURVEB Word2 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_03 + * Offset: 0x97C ECC the Parameter CURVEB Word3 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_04 + * Offset: 0x980 ECC the Parameter CURVEB Word4 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_05 + * Offset: 0x984 ECC the Parameter CURVEB Word5 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_06 + * Offset: 0x988 ECC the Parameter CURVEB Word6 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_07 + * Offset: 0x98C ECC the Parameter CURVEB Word7 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_08 + * Offset: 0x990 ECC the Parameter CURVEB Word8 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_09 + * Offset: 0x994 ECC the Parameter CURVEB Word9 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_10 + * Offset: 0x998 ECC the Parameter CURVEB Word10 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_11 + * Offset: 0x99C ECC the Parameter CURVEB Word11 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_12 + * Offset: 0x9A0 ECC the Parameter CURVEB Word12 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_13 + * Offset: 0x9A4 ECC the Parameter CURVEB Word13 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_14 + * Offset: 0x9A8 ECC the Parameter CURVEB Word14 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_15 + * Offset: 0x9AC ECC the Parameter CURVEB Word15 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_16 + * Offset: 0x9B0 ECC the Parameter CURVEB Word16 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_B_17 + * Offset: 0x9B4 ECC the Parameter CURVEB Word17 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEB |ECC the Parameter CURVEB Value of Elliptic Curve + * | | |The formula of elliptic curve is y2=x3+CURVEA*x+CURVEB in GF(p) and y2+x*y=x3+CURVEA*x2+CURVEB in GF(2m). + * | | |For B-163 or K-163, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For B-233 or K-233, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For B-283 or K-283, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_08 + * | | |For B-409 or K-409, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_12 + * | | |For B-521 or K-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_17 + * | | |For P-192, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_05 + * | | |For P-224, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_06 + * | | |For P-256 or SM2, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_07 + * | | |For P-384, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_11 + * | | |For P-521, CURVEB is stored in CRYPTO_ECC_B_00~CRYPTO_ECC_B_16 + * @var CRYPTO_T::ECC_N_00 + * Offset: 0x9B8 ECC the Parameter CURVEN Word0 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_01 + * Offset: 0x9BC ECC the Parameter CURVEN Word1 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_02 + * Offset: 0x9C0 ECC the Parameter CURVEN Word2 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_03 + * Offset: 0x9C4 ECC the Parameter CURVEN Word3 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_04 + * Offset: 0x9C8 ECC the Parameter CURVEN Word4 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_05 + * Offset: 0x9CC ECC the Parameter CURVEN Word5 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_06 + * Offset: 0x9D0 ECC the Parameter CURVEN Word6 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_07 + * Offset: 0x9D4 ECC the Parameter CURVEN Word7 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_08 + * Offset: 0x9D8 ECC the Parameter CURVEN Word8 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_09 + * Offset: 0x9DC ECC the Parameter CURVEN Word9 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_10 + * Offset: 0x9E0 ECC the Parameter CURVEN Word10 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_11 + * Offset: 0x9E4 ECC the Parameter CURVEN Word11 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_12 + * Offset: 0x9E8 ECC the Parameter CURVEN Word12 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_13 + * Offset: 0x9EC ECC the Parameter CURVEN Word13 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_14 + * Offset: 0x9F0 ECC the Parameter CURVEN Word14 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_15 + * Offset: 0x9F4 ECC the Parameter CURVEN Word15 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_16 + * Offset: 0x9F8 ECC the Parameter CURVEN Word16 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_N_17 + * Offset: 0x9FC ECC the Parameter CURVEN Word17 of Elliptic Curve + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURVEN |ECC the Parameter CURVEN Value of Elliptic Curve + * | | |In GF(p), CURVEN is the prime p. + * | | |In GF(2m), CURVEN is the irreducible polynomial. + * | | |For B-163 or K-163, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For B-233 or K-233, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For B-283 or K-283, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_08 + * | | |For B-409 or K-409, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_12 + * | | |For B-571 or K-571, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_17 + * | | |For P-192, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_05 + * | | |For P-224, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_06 + * | | |For P-256 or SM2, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_07 + * | | |For P-384, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_11 + * | | |For P-521, CURVEN is stored in CRYPTO_ECC_N_00~CRYPTO_ECC_N_16 + * @var CRYPTO_T::ECC_K_00 + * Offset: 0xA00 ECC the Scalar SCALARK Word0 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_01 + * Offset: 0xA04 ECC the Scalar SCALARK Word1 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_02 + * Offset: 0xA08 ECC the Scalar SCALARK Word2 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_03 + * Offset: 0xA0C ECC the Scalar SCALARK Word3 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_04 + * Offset: 0xA10 ECC the Scalar SCALARK Word4 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_05 + * Offset: 0xA14 ECC the Scalar SCALARK Word5 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_06 + * Offset: 0xA18 ECC the Scalar SCALARK Word6 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_07 + * Offset: 0xA1C ECC the Scalar SCALARK Word7 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_08 + * Offset: 0xA20 ECC the Scalar SCALARK Word8 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_09 + * Offset: 0xA24 ECC the Scalar SCALARK Word9 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_10 + * Offset: 0xA28 ECC the Scalar SCALARK Word10 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_11 + * Offset: 0xA2C ECC the Scalar SCALARK Word11 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_12 + * Offset: 0xA30 ECC the Scalar SCALARK Word12 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_13 + * Offset: 0xA34 ECC the Scalar SCALARK Word13 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_14 + * Offset: 0xA38 ECC the Scalar SCALARK Word14 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_15 + * Offset: 0xA3C ECC the Scalar SCALARK Word15 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_16 + * Offset: 0xA40 ECC the Scalar SCALARK Word16 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_K_17 + * Offset: 0xA44 ECC the Scalar SCALARK Word17 of Point Multiplication + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCALARK |ECC the Scalar SCALARK Value of Point Multiplication + * | | |Because the SCALARK usually stores the private key, ECC accelerator do not allow to read the register SCALARK. + * | | |For B-163 or K-163, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For B-233 or K-233, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For B-283 or K-283, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_08 + * | | |For B-409 or K-409, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_12 + * | | |For B-571 or K-571, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_17 + * | | |For P-192, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_05 + * | | |For P-224, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_06 + * | | |For P-256 or SM2, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_07 + * | | |For P-384, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_11 + * | | |For P-521, SCALARK is stored in CRYPTO_ECC_K_00~CRYPTO_ECC_K_16 + * @var CRYPTO_T::ECC_SADDR + * Offset: 0xA48 ECC DMA Source Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var CRYPTO_T::ECC_DADDR + * Offset: 0xA4C ECC DMA Destination Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DADDR |ECC DMA Destination Address + * | | |The ECC accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory and ECC accelerator + * | | |The DADDR keeps the destination address of the data buffer where output data of ECC engine will be stored + * | | |Based on the destination address, the ECC accelerator can write the result data back to SRAM memory space after the ECC operation is finished + * | | |The start of destination address should be located at word boundary + * | | |That is, bit 1 and 0 of DADDR are ignored + * | | |DADDR can be read and written + * | | |In DMA mode, software must update the CRYPTO_ECC_DADDR before triggering START + * @var CRYPTO_T::ECC_STARTREG + * Offset: 0xA50 ECC Starting Address of Updated Registers + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |STARTREG |ECC Starting Address of Updated Registers + * | | |The address of the updated registers that DMA feeds the first data or parameter to ECC engine + * | | |When ECC engine is active, ECC accelerator does not allow users to modify STARTRE.G + * | | |For example, to update input data from register CRYPTO_ECC POINTX1 + * | | |Thus, the value of STARTREG is 0x808. + * @var CRYPTO_T::ECC_WORDCNT + * Offset: 0xA54 ECC DMA Word Count + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |WORDCNT |ECC DMA Word Count + * | | |The CRYPTO_ECC_WORDCNT keeps the word count of source data that is for the required input data of ECC accelerator with various operations in DMA mode + * | | |Although CRYPTO_ECC_WORDCNT is 32-bit, the maximum of word count in ECC accelerator is 144 words + * | | |CRYPTO_ECC_WORDCNT can be read and written + * @var CRYPTO_T::RSA_CTL + * Offset: 0xB00 RSA Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |START |RSA Accelerator Start + * | | |0 = No effect. + * | | |1 = Start RSA accelerator. BUSY flag will be set. + * | | |This bit is always 0 when it is read back. + * | | |RSA accelerator will ignore this START signal when BUSY flag is 1. + * |[1] |STOP |RSA Accelerator Stop + * | | |0 = No effect. + * | | |1 = Abort RSA accelerator and make it into initial state. + * | | |This bit is always 0 when it is read back. + * | | |Remember to clear RSA interrupt flag after stopping RSA accelerator. + * |[2] |CRT |CRT Enable Control + * | | |0 = CRT Disabled. + * | | |1 = CRT Enabled. + * | | |CRT is only used in decryption with key length 2048, 3072,4096 bits. + * |[3] |CRTBYP |CRT Bypass Enable Control + * | | |0 = CRT Bypass Disabled. + * | | |1 = CRT Bypass Enabled. + * | | |CRT bypass is only used in CRT decryption with the same key. + * | | |Note: If users want to decrypt repeatedly with the same key, they can execute CRT bypass mode after the first time CRT decryption (means the second time to the latest time), but they cannot set CRTBYP to 1 in non-CRT mode. + * |[5:4] |KEYLENG |The Key Length of RSA Operation + * | | |00 = 1024-bits. + * | | |01 = 2048-bits. + * | | |10 = 3072-bits. + * | | |11 = 4096-bits. + * |[8] |SCAP |Side Channel Attack Protection Enable Control + * | | |0 = Side Channel Attack Protection Disabled. + * | | |1 = Side Channel Attack Protection Enabled. + * @var CRYPTO_T::RSA_STS + * Offset: 0xB04 RSA Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BUSY |RSA Accelerator Busy Flag + * | | |0 = The RSA accelerator is idle or finished. + * | | |1 = The RSA accelerator is under processing and protects all registers. + * | | |Remember to clear RSA interrupt flag after RSA accelerator finished. + * |[1] |DMABUSY |RSA DMA Busy Flag + * | | |0 = RSA DMA is idle or finished. + * | | |1 = RSA DMA is busy. + * |[16] |BUSERR |RSA DMA Access Bus Error Flag + * | | |0 = No error. + * | | |1 = Bus error will stop DMA operation and RSA accelerator. + * |[17] |CTLERR |RSA Control Register Error Flag + * | | |0 = No error. + * | | |1 = RSA control error. RSA will not start in the unsupported situation. + * | | |Note: If users use the error combination of control, even though they don't set START(CRYPTO_RSA_CTL[0]) to 1, CTLERR still be set to 1. + * |[18] |KSERR |RSA Engine Access Key Store Error Flag + * | | |0 = No error. + * | | |1 = Access error will stop RSA engine. + * @var CRYPTO_T::RSA_SADDR0 + * Offset: 0xB08 RSA DMA Source Address Register0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SADDR0 |RSA DMA Source Address Register0 + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * | | |This register is stored the address of RSA the Base of Exponentiation (M). + * @var CRYPTO_T::RSA_SADDR1 + * Offset: 0xB0C RSA DMA Source Address Register1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SADDR1 |RSA DMA Source Address Register1 + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * | | |This register is stored the address of RSA the Base of Modulus Operation (N). + * @var CRYPTO_T::RSA_SADDR2 + * Offset: 0xB10 RSA DMA Source Address Register2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SADDR2 |RSA DMA Source Address Register2 + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * | | |This register is stored the address of RSA the Exponent of Exponentiation (E). + * @var CRYPTO_T::RSA_SADDR3 + * Offset: 0xB14 RSA DMA Source Address Register3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SADDR3 |RSA DMA Source Address Register3 + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * | | |This register is stored the address of RSA the Factor of Modulus Operation (p). + * @var CRYPTO_T::RSA_SADDR4 + * Offset: 0xB18 RSA DMA Source Address Register4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SADDR4 |RSA DMA Source Address Register4 + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * | | |This register is stored the address of RSA the Factor of Modulus Operation (q). + * @var CRYPTO_T::RSA_DADDR + * Offset: 0xB1C RSA DMA Destination Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DADDR |RSA DMA Destination Address Register + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * | | |This register is stored the address of RSA DMA Destination Address Register (Ans). + * @var CRYPTO_T::RSA_MADDR0 + * Offset: 0xB20 RSA DMA Middle Address Register0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |MADDR0 |RSA DMA Middle Address Register0 + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * @var CRYPTO_T::RSA_MADDR1 + * Offset: 0xB24 RSA DMA Middle Address Register1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |MADDR1 |RSA DMA Middle Address Register1 + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * @var CRYPTO_T::RSA_MADDR2 + * Offset: 0xB28 RSA DMA Middle Address Register2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |MADDR2 |RSA DMA Middle Address Register2 + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * @var CRYPTO_T::RSA_MADDR3 + * Offset: 0xB2C RSA DMA Middle Address Register3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |MADDR3 |RSA DMA Middle Address Register3 + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * @var CRYPTO_T::RSA_MADDR4 + * Offset: 0xB30 RSA DMA Middle Address Register4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |MADDR4 |RSA DMA Middle Address Register4 + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * @var CRYPTO_T::RSA_MADDR5 + * Offset: 0xB34 RSA DMA Middle Address Register5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |MADDR5 |RSA DMA Middle Address Register5 + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * @var CRYPTO_T::RSA_MADDR6 + * Offset: 0xB38 RSA DMA Middle Address Register6 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |MADDR6 |RSA DMA Middle Address Register6 + * | | |The RSA accelerator supports DMA function to transfer the DATA and PARAMETER between SRAM memory space and RSA accelerator. + * @var CRYPTO_T::PRNG_KSCTL + * Offset: 0xF00 PRNG Key Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |NUM |Write Key Number + * | | |The key number is sent to key store + * | | |Note: Only for destination Is OTP of key store. + * |[8] |KEYSRC |Key Source + * | | |0 = Key (random number) is from PRNG engine. + * | | |1 = Key (random number) is from TRNG engine (skip PRNG operation). + * | | |Note: When KEYSRC is set to 1, PRNG operation will be skipped, it indicates that the bit (SEEDRLD) is meaningless. + * |[16] |TRUST |Write Key Trust Selection Bit + * | | |0 = Set written key as the non-secure key. + * | | |1 = Set written key as the secure key. + * |[19] |ECDH |ECDH Control Bit + * | | |0 = reserved. + * | | |1 = key is written to key store and used in ECDH. + * | | |Note: When ECDH was set to '1', 1 + * | | |PRNG seed must from TRNG and key is must written to the SRAM of key store (WSDST, CRYPTO_PRNG_KSCTL[23:22] must set to '00') + * | | |Otherwise, KCTLERR will become '1'(CRYPTO_PRNG_KSSTS[16]) + * | | |2 + * | | |Key must in the interval [1, n-1] (the parameter n is from ECC) + * | | |The value of n cannot be 0 or 1, otherwise, PRNG will always keep busy. + * |[20] |ECDSA |ECDSA Control Bit + * | | |0 = reserved. + * | | |1 = key is written to key store and used in ECDSA. + * | | |Note: When ECDSA was set to '1', 1 + * | | |PRNG seed must from TRNG and key is must written to the SRAM of key store (WSDST, CRYPTO_PRNG_KSCTL[23:22] must set to '00') + * | | |Otherwise, KCTLERR will become '1'(CRYPTO_PRNG_KSSTS[16]) + * | | |2 + * | | |Key must in the interval [1, n-1] (the parameter n is from ECC) + * | | |The value of n cannot be 0 or 1, otherwise, PRNG will always keep busy. + * |[21] |WDST |Write Key Destination + * | | |0 = key is written to registers CRYPTO_PRNG_KEYx. + * | | |1 = key is written to key store. + * |[23:22] |WSDST |Write Key Store Destination + * | | |00 = key is written to the SRAM of key store. + * | | |10 = key is written to the OTP of key store. + * | | |Others = reserved. + * |[26:24] |OWNER |Write Key Owner Selection Bits + * | | |000 = Only for AES used. + * | | |001 = Only for HMAC engine used. + * | | |100 = Only for ECC engine used. + * | | |101 = Only for CPU engine use. + * | | |Others = reserved. + * @var CRYPTO_T::PRNG_KSSTS + * Offset: 0xF04 PRNG Key Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |NUM |Key Number + * | | |The key number is generated by key store + * @var CRYPTO_T::AES_KSCTL + * Offset: 0xF10 AES Key Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |NUM |Read Key Number + * | | |The key number is sent to key store + * |[5] |RSRC |Read Key Source + * | | |0 = key is read from registers CRYPTO_AESx_KEYx. + * | | |1 = key is read from key store. + * |[7:6] |RSSRC |Read Key Store Source + * | | |00 = key is read from the SRAM of key store. + * | | |10 = key is read from the OTP of key store. + * | | |Others = reserved. + * @var CRYPTO_T::HMAC_KSCTL + * Offset: 0xF30 HMAC Key Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |NUM |Read Key Number + * | | |The key number is sent to key store + * |[5] |RSRC |Read Key Source + * | | |0 = key is read from HMAC registers. + * | | |1 = key is read from key store. + * |[7:6] |RSSRC |Read Key Store Source + * | | |00 = key is read from the SRAM of key store. + * | | |10 = key is read from the OTP of key store. + * | | |Others = reserved. + * @var CRYPTO_T::ECC_KSCTL + * Offset: 0xF40 ECC Key Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |NUMK |Read Key Number K + * | | |The key number of CRYPTO_ECC_K is sent to key store when RSRCK =1. + * |[5] |RSRCK |Read Key Source for Key Number K + * | | |0 = key is read from ECC registers. + * | | |1 = key is read from key store. + * |[7:6] |RSSRCK |Read Key Store Source for Key Number K + * | | |00 = key is read from the SRAM of key store. + * | | |10 = key is read from the OTP of key store. + * | | |Others = reserved. + * |[14] |ECDH |ECDH Control Bit + * | | |0 = reserved. + * | | |1 = Set ECC operation is in ECDH + * | | |When this bit and RSRCK are equal to 0x1, ECC will read ECDH private key to CRYPTO_ECC_K from key store. + * |[16] |TRUST |Write Key Trust Selection Bit + * | | |0 = Set ECDH written key as the non-secure key. + * | | |1 = Set ECDH written key as the secure key. + * |[20] |XY |ECDH Output Select Bit + * | | |0 = The ECDH written key is from X-coordinate Value. + * | | |1 = The ECDH written key is from Y-coordinate Value. + * |[21] |WDST |Write Key Destination + * | | |0 = The ECDH written key is in registers CRYPTO_ECC_X1 and CRYPTO_ECC_Y. + * | | |1 = The ECDH written key is written to key store. + * |[23:22] |WSDST |Write Key Store Destination + * | | |00 = The ECDH written key is written to the SRAM of key store. + * | | |10 = The ECDH written key is written to the OTP of key store. + * | | |Others = reserved. + * |[26:24] |OWNER |Write Key Owner Selection Bits + * | | |000 = The ECDH written key is only for AES used. + * | | |001 = The ECDH written key is only for HMAC engine used. + * | | |100 = The ECDH written key is only for ECC engine used. + * | | |101 = The ECDH written key is only for CPU engine use. + * | | |Others = reserved. + * @var CRYPTO_T::ECC_KSSTS + * Offset: 0xF44 ECC Key Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |NUM |Key Number + * | | |The key number is generated by key store after ECDH. + * @var CRYPTO_T::ECC_KSXY + * Offset: 0xF48 ECC XY Number Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |NUMX |Read Key Number X + * | | |The key number of CRYPTO_ECC_X1 is sent to key store when RSRCXY =1. + * |[5] |RSRCXY |Read Key Source for Key Number x and Y + * | | |0 = Key is read from ECC registers. + * | | |1 = Key is read from key store. + * |[7:6] |RSSRCX |Read Key Store Source for Key Number X + * | | |00 = Key is read from the SRAM of key store. + * | | |10 = Key is read from the OTP of key store. + * | | |Others = reserved. + * |[12:8] |NUMY |Read Key Number Y + * | | |The key number of CRYPTO_ECC_Y1 is sent to key store when RSRCXY =1. + * |[15:14] |RSSRCY |Read Key Store Source for Key Number Y + * | | |00 = Key is read from the SRAM of key store. + * | | |10 = Key is read from the OTP of key store. + * | | |Others = reserved. + * @var CRYPTO_T::RSA_KSCTL + * Offset: 0xF50 RSA Key Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |NUM |Read Key Number + * | | |The key number is sent to key store + * |[5] |RSRC |Read Key Source + * | | |0 = Key is read from RSA engine. + * | | |1 = Key is read from key store. + * |[7:6] |RSSRC |Read Key Store Source + * | | |00 = Key is read from the SRAM of key store. + * | | |Others = Reserved. + * |[12:8] |BKNUM |Read Exponent Blind Key Number + * | | |The key number is sent to key store, and its destination always be the SRAM of key store + * | | |CPU cannot read the exponent blind key. + * | | |Note: Use this key number, only when executing SCA protection but no-CRT mode + * | | |When allocate space of key store, key owner selection bits(KS_METADATA[18:16]) should be '010'. + * @var CRYPTO_T::RSA_KSSTS0 + * Offset: 0xF54 RSA Key Status Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |NUM0 |Key Number0 + * | | |The key number is generated by key store, RSA can get complete p by key number in key store while operating. + * | | |Note: The size of this key as half key length. + * |[12:8] |NUM1 |Key Number1 + * | | |The key number is generated by key store, RSA can get complete q by key number in Key Store while operating. + * | | |Note: The size of this key as half key length. + * |[20:16] |NUM2 |Key Number2 + * | | |The key number is generated by key store, RSA can get or store the intermediate temporary value by key number in the key store while operating. + * | | |Note: The size of this key as key length. + * |[28:24] |NUM3 |Key Number3 + * | | |The key number is generated by key store, RSA can get or store the intermediate temporary value by key number in the key store while operating. + * | | |Note: The size of this key as key length. + * @var CRYPTO_T::RSA_KSSTS1 + * Offset: 0xF58 RSA Key Status Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |NUM4 |Key Number4 + * | | |The key number is generated by key store, RSA can get or store the intermediate temporary value by key number in key store while operating. + * | | |Note: The size of this key as half key length. + * |[12:8] |NUM5 |Key Number5 + * | | |The key number is generated by key store, RSA can get or store the intermediate temporary value by key number in key store while operating. + * | | |Note: The size of this key as half key length. + * |[20:16] |NUM6 |Key Number6 + * | | |The key number is generated by key store, RSA can get or store the intermediate temporary value by key number in key store while operating. + * | | |Note: The size of this key as key length. + * |[28:24] |NUM7 |Key Number7 + * | | |The key number is generated by key store, RSA can get or store the intermediate temporary value by key number in key store while operating. + * | | |Note: The size of this key as key length. + */ + __IO uint32_t INTEN; /*!< [0x0000] Crypto Interrupt Enable Control Register */ + __IO uint32_t INTSTS; /*!< [0x0004] Crypto Interrupt Flag */ + __IO uint32_t PRNG_CTL; /*!< [0x0008] PRNG Control Register */ + __O uint32_t PRNG_SEED; /*!< [0x000c] Seed for PRNG */ + __I uint32_t PRNG_KEY0; /*!< [0x0010] PRNG Generated Key0 */ + __I uint32_t PRNG_KEY1; /*!< [0x0014] PRNG Generated Key1 */ + __I uint32_t PRNG_KEY2; /*!< [0x0018] PRNG Generated Key2 */ + __I uint32_t PRNG_KEY3; /*!< [0x001c] PRNG Generated Key3 */ + __I uint32_t PRNG_KEY4; /*!< [0x0020] PRNG Generated Key4 */ + __I uint32_t PRNG_KEY5; /*!< [0x0024] PRNG Generated Key5 */ + __I uint32_t PRNG_KEY6; /*!< [0x0028] PRNG Generated Key6 */ + __I uint32_t PRNG_KEY7; /*!< [0x002c] PRNG Generated Key7 */ + __I uint32_t PRNG_STS; /*!< [0x0030] PRNG Status Register */ + __I uint32_t RESERVE0[7]; + __I uint32_t AES_FDBCK0; /*!< [0x0050] AES Engine Output Feedback Data After Cryptographic Operation */ + __I uint32_t AES_FDBCK1; /*!< [0x0054] AES Engine Output Feedback Data After Cryptographic Operation */ + __I uint32_t AES_FDBCK2; /*!< [0x0058] AES Engine Output Feedback Data After Cryptographic Operation */ + __I uint32_t AES_FDBCK3; /*!< [0x005c] AES Engine Output Feedback Data After Cryptographic Operation */ + __I uint32_t RESERVE1[8]; + __IO uint32_t AES_GCM_IVCNT0; /*!< [0x0080] AES GCM IV Byte Count Register 0 */ + __IO uint32_t AES_GCM_IVCNT1; /*!< [0x0084] AES GCM IV Byte Count Register 1 */ + __IO uint32_t AES_GCM_ACNT0; /*!< [0x0088] AES GCM A Byte Count Register 0 */ + __IO uint32_t AES_GCM_ACNT1; /*!< [0x008c] AES GCM A Byte Count Register 1 */ + __IO uint32_t AES_GCM_PCNT0; /*!< [0x0090] AES GCM P Byte Count Register 0 */ + __IO uint32_t AES_GCM_PCNT1; /*!< [0x0094] AES GCM P Byte Count Register 1 */ + __I uint32_t RESERVE2[2]; + __IO uint32_t AES_FBADDR; /*!< [0x00a0] AES DMA Feedback Address Register */ + __I uint32_t RESERVE3[23]; + __IO uint32_t AES_CTL; /*!< [0x0100] AES Control Register */ + __I uint32_t AES_STS; /*!< [0x0104] AES Engine Flag */ + __IO uint32_t AES_DATIN; /*!< [0x0108] AES Engine Data Input Port Register */ + __I uint32_t AES_DATOUT; /*!< [0x010c] AES Engine Data Output Port Register */ + __IO uint32_t AES_KEY0; /*!< [0x0110] AES Key Word 0 Register */ + __IO uint32_t AES_KEY1; /*!< [0x0114] AES Key Word 1 Register */ + __IO uint32_t AES_KEY2; /*!< [0x0118] AES Key Word 2 Register */ + __IO uint32_t AES_KEY3; /*!< [0x011c] AES Key Word 3 Register */ + __IO uint32_t AES_KEY4; /*!< [0x0120] AES Key Word 4 Register */ + __IO uint32_t AES_KEY5; /*!< [0x0124] AES Key Word 5 Register */ + __IO uint32_t AES_KEY6; /*!< [0x0128] AES Key Word 6 Register */ + __IO uint32_t AES_KEY7; /*!< [0x012c] AES Key Word 7 Register */ + __IO uint32_t AES_IV0; /*!< [0x0130] AES Initial Vector Word 0 Register */ + __IO uint32_t AES_IV1; /*!< [0x0134] AES Initial Vector Word 1 Register */ + __IO uint32_t AES_IV2; /*!< [0x0138] AES Initial Vector Word 2 Register */ + __IO uint32_t AES_IV3; /*!< [0x013c] AES Initial Vector Word 3 Register */ + __IO uint32_t AES_SADDR; /*!< [0x0140] AES DMA Source Address Register */ + __IO uint32_t AES_DADDR; /*!< [0x0144] AES DMA Destination Address Register */ + __IO uint32_t AES_CNT; /*!< [0x0148] AES Byte Count Register */ + __I uint32_t RESERVE4[109]; + __IO uint32_t HMAC_CTL; /*!< [0x0300] SHA/HMAC Control Register */ + __I uint32_t HMAC_STS; /*!< [0x0304] SHA/HMAC Status Flag */ + __I uint32_t HMAC_DGST0; /*!< [0x0308] SHA/HMAC Output Feedback Data 0 */ + __I uint32_t HMAC_DGST1; /*!< [0x030c] SHA/HMAC Output Feedback Data 1 */ + __I uint32_t HMAC_DGST2; /*!< [0x0310] SHA/HMAC Output Feedback Data 2 */ + __I uint32_t HMAC_DGST3; /*!< [0x0314] SHA/HMAC Output Feedback Data 3 */ + __I uint32_t HMAC_DGST4; /*!< [0x0318] SHA/HMAC Output Feedback Data 4 */ + __I uint32_t HMAC_DGST5; /*!< [0x031c] SHA/HMAC Output Feedback Data 5 */ + __I uint32_t HMAC_DGST6; /*!< [0x0320] SHA/HMAC Output Feedback Data 6 */ + __I uint32_t HMAC_DGST7; /*!< [0x0324] SHA/HMAC Output Feedback Data 7 */ + __I uint32_t HMAC_DGST8; /*!< [0x0328] SHA/HMAC Output Feedback Data 8 */ + __I uint32_t HMAC_DGST9; /*!< [0x032c] SHA/HMAC Output Feedback Data 9 */ + __I uint32_t HMAC_DGST10; /*!< [0x0330] SHA/HMAC Output Feedback Data 10 */ + __I uint32_t HMAC_DGST11; /*!< [0x0334] SHA/HMAC Output Feedback Data 11 */ + __I uint32_t HMAC_DGST12; /*!< [0x0338] SHA/HMAC Output Feedback Data 12 */ + __I uint32_t HMAC_DGST13; /*!< [0x033c] SHA/HMAC Output Feedback Data 13 */ + __I uint32_t HMAC_DGST14; /*!< [0x0340] SHA/HMAC Output Feedback Data 14 */ + __I uint32_t HMAC_DGST15; /*!< [0x0344] SHA/HMAC Output Feedback Data 15 */ + __IO uint32_t HMAC_KEYCNT; /*!< [0x0348] SHA/HMAC Key Byte Count Register */ + __IO uint32_t HMAC_SADDR; /*!< [0x034c] SHA/HMAC DMA Source Address Register */ + __IO uint32_t HMAC_DMACNT; /*!< [0x0350] SHA/HMAC Byte Count Register */ + __IO uint32_t HMAC_DATIN; /*!< [0x0354] SHA/HMAC Engine Non-DMA Mode Data Input Port Register */ + __IO uint32_t HMAC_FDBCK0; /*!< [0x0358] SHA/HMAC Output Feedback Data 0 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK1; /*!< [0x035c] SHA/HMAC Output Feedback Data 1 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK2; /*!< [0x0360] SHA/HMAC Output Feedback Data 2 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK3; /*!< [0x0364] SHA/HMAC Output Feedback Data 3 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK4; /*!< [0x0368] SHA/HMAC Output Feedback Data 4 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK5; /*!< [0x036c] SHA/HMAC Output Feedback Data 5 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK6; /*!< [0x0370] SHA/HMAC Output Feedback Data 6 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK7; /*!< [0x0374] SHA/HMAC Output Feedback Data 7 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK8; /*!< [0x0378] SHA/HMAC Output Feedback Data 8 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK9; /*!< [0x037c] SHA/HMAC Output Feedback Data 9 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK10; /*!< [0x0380] SHA/HMAC Output Feedback Data 10 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK11; /*!< [0x0384] SHA/HMAC Output Feedback Data 11 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK12; /*!< [0x0388] SHA/HMAC Output Feedback Data 12 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK13; /*!< [0x038c] SHA/HMAC Output Feedback Data 13 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK14; /*!< [0x0390] SHA/HMAC Output Feedback Data 14 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK15; /*!< [0x0394] SHA/HMAC Output Feedback Data 15 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK16; /*!< [0x0398] SHA/HMAC Output Feedback Data 16 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK17; /*!< [0x039c] SHA/HMAC Output Feedback Data 17 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK18; /*!< [0x03a0] SHA/HMAC Output Feedback Data 18 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK19; /*!< [0x03a4] SHA/HMAC Output Feedback Data 19 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK20; /*!< [0x03a8] SHA/HMAC Output Feedback Data 20 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK21; /*!< [0x03ac] SHA/HMAC Output Feedback Data 21 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK22; /*!< [0x03b0] SHA/HMAC Output Feedback Data 22 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK23; /*!< [0x03b4] SHA/HMAC Output Feedback Data 23 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK24; /*!< [0x03b8] SHA/HMAC Output Feedback Data 24 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK25; /*!< [0x03bc] SHA/HMAC Output Feedback Data 25 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK26; /*!< [0x03c0] SHA/HMAC Output Feedback Data 26 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK27; /*!< [0x03c4] SHA/HMAC Output Feedback Data 27 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK28; /*!< [0x03c8] SHA/HMAC Output Feedback Data 28 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK29; /*!< [0x03cc] SHA/HMAC Output Feedback Data 29 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK30; /*!< [0x03d0] SHA/HMAC Output Feedback Data 30 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK31; /*!< [0x03d4] SHA/HMAC Output Feedback Data 31 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK32; /*!< [0x03d8] SHA/HMAC Output Feedback Data 32 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK33; /*!< [0x03dc] SHA/HMAC Output Feedback Data 33 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK34; /*!< [0x03e0] SHA/HMAC Output Feedback Data 34 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK35; /*!< [0x03e4] SHA/HMAC Output Feedback Data 35 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK36; /*!< [0x03e8] SHA/HMAC Output Feedback Data 36 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK37; /*!< [0x03ec] SHA/HMAC Output Feedback Data 37 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK38; /*!< [0x03f0] SHA/HMAC Output Feedback Data 38 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK39; /*!< [0x03f4] SHA/HMAC Output Feedback Data 39 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK40; /*!< [0x03f8] SHA/HMAC Output Feedback Data 40 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK41; /*!< [0x03fc] SHA/HMAC Output Feedback Data 41 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK42; /*!< [0x0400] SHA/HMAC Output Feedback Data 42 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK43; /*!< [0x0404] SHA/HMAC Output Feedback Data 43 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK44; /*!< [0x0408] SHA/HMAC Output Feedback Data 44 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK45; /*!< [0x040c] SHA/HMAC Output Feedback Data 45 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK46; /*!< [0x0410] SHA/HMAC Output Feedback Data 46 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK47; /*!< [0x0414] SHA/HMAC Output Feedback Data 47 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK48; /*!< [0x0418] SHA/HMAC Output Feedback Data 48 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK49; /*!< [0x041c] SHA/HMAC Output Feedback Data 49 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK50; /*!< [0x0420] SHA/HMAC Output Feedback Data 50 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK51; /*!< [0x0424] SHA/HMAC Output Feedback Data 51 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK52; /*!< [0x0428] SHA/HMAC Output Feedback Data 52 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK53; /*!< [0x042c] SHA/HMAC Output Feedback Data 53 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK54; /*!< [0x0430] SHA/HMAC Output Feedback Data 54 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK55; /*!< [0x0434] SHA/HMAC Output Feedback Data 55 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK56; /*!< [0x0438] SHA/HMAC Output Feedback Data 56 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK57; /*!< [0x043c] SHA/HMAC Output Feedback Data 57 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK58; /*!< [0x0440] SHA/HMAC Output Feedback Data 58 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK59; /*!< [0x0444] SHA/HMAC Output Feedback Data 59 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK60; /*!< [0x0448] SHA/HMAC Output Feedback Data 60 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK61; /*!< [0x044c] SHA/HMAC Output Feedback Data 61 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK62; /*!< [0x0450] SHA/HMAC Output Feedback Data 62 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK63; /*!< [0x0454] SHA/HMAC Output Feedback Data 63 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK64; /*!< [0x0458] SHA/HMAC Output Feedback Data 64 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK65; /*!< [0x045c] SHA/HMAC Output Feedback Data 65 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK66; /*!< [0x0460] SHA/HMAC Output Feedback Data 66 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK67; /*!< [0x0464] SHA/HMAC Output Feedback Data 67 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK68; /*!< [0x0468] SHA/HMAC Output Feedback Data 68 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK69; /*!< [0x046c] SHA/HMAC Output Feedback Data 69 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK70; /*!< [0x0470] SHA/HMAC Output Feedback Data 70 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK71; /*!< [0x0474] SHA/HMAC Output Feedback Data 71 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK72; /*!< [0x0478] SHA/HMAC Output Feedback Data 72 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK73; /*!< [0x047c] SHA/HMAC Output Feedback Data 73 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK74; /*!< [0x0480] SHA/HMAC Output Feedback Data 74 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK75; /*!< [0x0484] SHA/HMAC Output Feedback Data 75 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK76; /*!< [0x0488] SHA/HMAC Output Feedback Data 76 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK77; /*!< [0x048c] SHA/HMAC Output Feedback Data 77 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK78; /*!< [0x0490] SHA/HMAC Output Feedback Data 78 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK79; /*!< [0x0494] SHA/HMAC Output Feedback Data 79 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK80; /*!< [0x0498] SHA/HMAC Output Feedback Data 80 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK81; /*!< [0x049c] SHA/HMAC Output Feedback Data 81 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK82; /*!< [0x04a0] SHA/HMAC Output Feedback Data 82 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK83; /*!< [0x04a4] SHA/HMAC Output Feedback Data 83 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK84; /*!< [0x04a8] SHA/HMAC Output Feedback Data 84 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK85; /*!< [0x04ac] SHA/HMAC Output Feedback Data 85 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK86; /*!< [0x04b0] SHA/HMAC Output Feedback Data 86 After SHA/HMAC Operation */ + __IO uint32_t HMAC_FDBCK87; /*!< [0x04b4] SHA/HMAC Output Feedback Data 87 After SHA/HMAC Operation */ + __I uint32_t RESERVE5[16]; + __IO uint32_t HMAC_SHA512T; /*!< [0x04f8] SHA/HMAC SHA512T Control Register */ + __IO uint32_t HMAC_FBADDR; /*!< [0x04fc] SHA/HMAC DMA Feedback Address Register */ + __I uint32_t HMAC_SHAKEDGST0; /*!< [0x0500] SHA/HMAC SHAKE Digest Message 0 */ + __I uint32_t HMAC_SHAKEDGST1; /*!< [0x0504] SHA/HMAC SHAKE Digest Message 1 */ + __I uint32_t HMAC_SHAKEDGST2; /*!< [0x0508] SHA/HMAC SHAKE Digest Message 2 */ + __I uint32_t HMAC_SHAKEDGST3; /*!< [0x050c] SHA/HMAC SHAKE Digest Message 3 */ + __I uint32_t HMAC_SHAKEDGST4; /*!< [0x0510] SHA/HMAC SHAKE Digest Message 4 */ + __I uint32_t HMAC_SHAKEDGST5; /*!< [0x0514] SHA/HMAC SHAKE Digest Message 5 */ + __I uint32_t HMAC_SHAKEDGST6; /*!< [0x0518] SHA/HMAC SHAKE Digest Message 6 */ + __I uint32_t HMAC_SHAKEDGST7; /*!< [0x051c] SHA/HMAC SHAKE Digest Message 7 */ + __I uint32_t HMAC_SHAKEDGST8; /*!< [0x0520] SHA/HMAC SHAKE Digest Message 8 */ + __I uint32_t HMAC_SHAKEDGST9; /*!< [0x0524] SHA/HMAC SHAKE Digest Message 9 */ + __I uint32_t HMAC_SHAKEDGST10; /*!< [0x0528] SHA/HMAC SHAKE Digest Message 10 */ + __I uint32_t HMAC_SHAKEDGST11; /*!< [0x052c] SHA/HMAC SHAKE Digest Message 11 */ + __I uint32_t HMAC_SHAKEDGST12; /*!< [0x0530] SHA/HMAC SHAKE Digest Message 12 */ + __I uint32_t HMAC_SHAKEDGST13; /*!< [0x0534] SHA/HMAC SHAKE Digest Message 13 */ + __I uint32_t HMAC_SHAKEDGST14; /*!< [0x0538] SHA/HMAC SHAKE Digest Message 14 */ + __I uint32_t HMAC_SHAKEDGST15; /*!< [0x053c] SHA/HMAC SHAKE Digest Message 15 */ + __I uint32_t HMAC_SHAKEDGST16; /*!< [0x0540] SHA/HMAC SHAKE Digest Message 16 */ + __I uint32_t HMAC_SHAKEDGST17; /*!< [0x0544] SHA/HMAC SHAKE Digest Message 17 */ + __I uint32_t HMAC_SHAKEDGST18; /*!< [0x0548] SHA/HMAC SHAKE Digest Message 18 */ + __I uint32_t HMAC_SHAKEDGST19; /*!< [0x054c] SHA/HMAC SHAKE Digest Message 19 */ + __I uint32_t HMAC_SHAKEDGST20; /*!< [0x0550] SHA/HMAC SHAKE Digest Message 20 */ + __I uint32_t HMAC_SHAKEDGST21; /*!< [0x0554] SHA/HMAC SHAKE Digest Message 21 */ + __I uint32_t HMAC_SHAKEDGST22; /*!< [0x0558] SHA/HMAC SHAKE Digest Message 22 */ + __I uint32_t HMAC_SHAKEDGST23; /*!< [0x055c] SHA/HMAC SHAKE Digest Message 23 */ + __I uint32_t HMAC_SHAKEDGST24; /*!< [0x0560] SHA/HMAC SHAKE Digest Message 24 */ + __I uint32_t HMAC_SHAKEDGST25; /*!< [0x0564] SHA/HMAC SHAKE Digest Message 25 */ + __I uint32_t HMAC_SHAKEDGST26; /*!< [0x0568] SHA/HMAC SHAKE Digest Message 26 */ + __I uint32_t HMAC_SHAKEDGST27; /*!< [0x056c] SHA/HMAC SHAKE Digest Message 27 */ + __I uint32_t HMAC_SHAKEDGST28; /*!< [0x0570] SHA/HMAC SHAKE Digest Message 28 */ + __I uint32_t HMAC_SHAKEDGST29; /*!< [0x0574] SHA/HMAC SHAKE Digest Message 29 */ + __I uint32_t HMAC_SHAKEDGST30; /*!< [0x0578] SHA/HMAC SHAKE Digest Message 30 */ + __I uint32_t HMAC_SHAKEDGST31; /*!< [0x057c] SHA/HMAC SHAKE Digest Message 31 */ + __I uint32_t HMAC_SHAKEDGST32; /*!< [0x0580] SHA/HMAC SHAKE Digest Message 32 */ + __I uint32_t HMAC_SHAKEDGST33; /*!< [0x0584] SHA/HMAC SHAKE Digest Message 33 */ + __I uint32_t HMAC_SHAKEDGST34; /*!< [0x0588] SHA/HMAC SHAKE Digest Message 34 */ + __I uint32_t HMAC_SHAKEDGST35; /*!< [0x058c] SHA/HMAC SHAKE Digest Message 35 */ + __I uint32_t HMAC_SHAKEDGST36; /*!< [0x0590] SHA/HMAC SHAKE Digest Message 36 */ + __I uint32_t HMAC_SHAKEDGST37; /*!< [0x0594] SHA/HMAC SHAKE Digest Message 37 */ + __I uint32_t HMAC_SHAKEDGST38; /*!< [0x0598] SHA/HMAC SHAKE Digest Message 38 */ + __I uint32_t HMAC_SHAKEDGST39; /*!< [0x059c] SHA/HMAC SHAKE Digest Message 39 */ + __I uint32_t HMAC_SHAKEDGST40; /*!< [0x05a0] SHA/HMAC SHAKE Digest Message 40 */ + __I uint32_t HMAC_SHAKEDGST41; /*!< [0x05a4] SHA/HMAC SHAKE Digest Message 41 */ + __I uint32_t RESERVE6[150]; + __IO uint32_t ECC_CTL; /*!< [0x0800] ECC Control Register */ + __I uint32_t ECC_STS; /*!< [0x0804] ECC Status Register */ + __IO uint32_t ECC_X1_00; /*!< [0x0808] ECC the X-coordinate Word0 of the First Point */ + __IO uint32_t ECC_X1_01; /*!< [0x080c] ECC the X-coordinate Word1 of the First Point */ + __IO uint32_t ECC_X1_02; /*!< [0x0810] ECC the X-coordinate Word2 of the First Point */ + __IO uint32_t ECC_X1_03; /*!< [0x0814] ECC the X-coordinate Word3 of the First Point */ + __IO uint32_t ECC_X1_04; /*!< [0x0818] ECC the X-coordinate Word4 of the First Point */ + __IO uint32_t ECC_X1_05; /*!< [0x081c] ECC the X-coordinate Word5 of the First Point */ + __IO uint32_t ECC_X1_06; /*!< [0x0820] ECC the X-coordinate Word6 of the First Point */ + __IO uint32_t ECC_X1_07; /*!< [0x0824] ECC the X-coordinate Word7 of the First Point */ + __IO uint32_t ECC_X1_08; /*!< [0x0828] ECC the X-coordinate Word8 of the First Point */ + __IO uint32_t ECC_X1_09; /*!< [0x082c] ECC the X-coordinate Word9 of the First Point */ + __IO uint32_t ECC_X1_10; /*!< [0x0830] ECC the X-coordinate Word10 of the First Point */ + __IO uint32_t ECC_X1_11; /*!< [0x0834] ECC the X-coordinate Word11 of the First Point */ + __IO uint32_t ECC_X1_12; /*!< [0x0838] ECC the X-coordinate Word12 of the First Point */ + __IO uint32_t ECC_X1_13; /*!< [0x083c] ECC the X-coordinate Word13 of the First Point */ + __IO uint32_t ECC_X1_14; /*!< [0x0840] ECC the X-coordinate Word14 of the First Point */ + __IO uint32_t ECC_X1_15; /*!< [0x0844] ECC the X-coordinate Word15 of the First Point */ + __IO uint32_t ECC_X1_16; /*!< [0x0848] ECC the X-coordinate Word16 of the First Point */ + __IO uint32_t ECC_X1_17; /*!< [0x084c] ECC the X-coordinate Word17 of the First Point */ + __IO uint32_t ECC_Y1_00; /*!< [0x0850] ECC the Y-coordinate Word0 of the First Point */ + __IO uint32_t ECC_Y1_01; /*!< [0x0854] ECC the Y-coordinate Word1 of the First Point */ + __IO uint32_t ECC_Y1_02; /*!< [0x0858] ECC the Y-coordinate Word2 of the First Point */ + __IO uint32_t ECC_Y1_03; /*!< [0x085c] ECC the Y-coordinate Word3 of the First Point */ + __IO uint32_t ECC_Y1_04; /*!< [0x0860] ECC the Y-coordinate Word4 of the First Point */ + __IO uint32_t ECC_Y1_05; /*!< [0x0864] ECC the Y-coordinate Word5 of the First Point */ + __IO uint32_t ECC_Y1_06; /*!< [0x0868] ECC the Y-coordinate Word6 of the First Point */ + __IO uint32_t ECC_Y1_07; /*!< [0x086c] ECC the Y-coordinate Word7 of the First Point */ + __IO uint32_t ECC_Y1_08; /*!< [0x0870] ECC the Y-coordinate Word8 of the First Point */ + __IO uint32_t ECC_Y1_09; /*!< [0x0874] ECC the Y-coordinate Word9 of the First Point */ + __IO uint32_t ECC_Y1_10; /*!< [0x0878] ECC the Y-coordinate Word10 of the First Point */ + __IO uint32_t ECC_Y1_11; /*!< [0x087c] ECC the Y-coordinate Word11 of the First Point */ + __IO uint32_t ECC_Y1_12; /*!< [0x0880] ECC the Y-coordinate Word12 of the First Point */ + __IO uint32_t ECC_Y1_13; /*!< [0x0884] ECC the Y-coordinate Word13 of the First Point */ + __IO uint32_t ECC_Y1_14; /*!< [0x0888] ECC the Y-coordinate Word14 of the First Point */ + __IO uint32_t ECC_Y1_15; /*!< [0x088c] ECC the Y-coordinate Word15 of the First Point */ + __IO uint32_t ECC_Y1_16; /*!< [0x0890] ECC the Y-coordinate Word16 of the First Point */ + __IO uint32_t ECC_Y1_17; /*!< [0x0894] ECC the Y-coordinate Word17 of the First Point */ + __IO uint32_t ECC_X2_00; /*!< [0x0898] ECC the X-coordinate Word0 of the Second Point */ + __IO uint32_t ECC_X2_01; /*!< [0x089c] ECC the X-coordinate Word1 of the Second Point */ + __IO uint32_t ECC_X2_02; /*!< [0x08a0] ECC the X-coordinate Word2 of the Second Point */ + __IO uint32_t ECC_X2_03; /*!< [0x08a4] ECC the X-coordinate Word3 of the Second Point */ + __IO uint32_t ECC_X2_04; /*!< [0x08a8] ECC the X-coordinate Word4 of the Second Point */ + __IO uint32_t ECC_X2_05; /*!< [0x08ac] ECC the X-coordinate Word5 of the Second Point */ + __IO uint32_t ECC_X2_06; /*!< [0x08b0] ECC the X-coordinate Word6 of the Second Point */ + __IO uint32_t ECC_X2_07; /*!< [0x08b4] ECC the X-coordinate Word7 of the Second Point */ + __IO uint32_t ECC_X2_08; /*!< [0x08b8] ECC the X-coordinate Word8 of the Second Point */ + __IO uint32_t ECC_X2_09; /*!< [0x08bc] ECC the X-coordinate Word9 of the Second Point */ + __IO uint32_t ECC_X2_10; /*!< [0x08c0] ECC the X-coordinate Word10 of the Second Point */ + __IO uint32_t ECC_X2_11; /*!< [0x08c4] ECC the X-coordinate Word11 of the Second Point */ + __IO uint32_t ECC_X2_12; /*!< [0x08c8] ECC the X-coordinate Word12 of the Second Point */ + __IO uint32_t ECC_X2_13; /*!< [0x08cc] ECC the X-coordinate Word13 of the Second Point */ + __IO uint32_t ECC_X2_14; /*!< [0x08d0] ECC the X-coordinate Word14 of the Second Point */ + __IO uint32_t ECC_X2_15; /*!< [0x08d4] ECC the X-coordinate Word15 of the Second Point */ + __IO uint32_t ECC_X2_16; /*!< [0x08d8] ECC the X-coordinate Word16 of the Second Point */ + __IO uint32_t ECC_X2_17; /*!< [0x08dc] ECC the X-coordinate Word17 of the Second Point */ + __IO uint32_t ECC_Y2_00; /*!< [0x08e0] ECC the Y-coordinate Word0 of the Second Point */ + __IO uint32_t ECC_Y2_01; /*!< [0x08e4] ECC the Y-coordinate Word1 of the Second Point */ + __IO uint32_t ECC_Y2_02; /*!< [0x08e8] ECC the Y-coordinate Word2 of the Second Point */ + __IO uint32_t ECC_Y2_03; /*!< [0x08ec] ECC the Y-coordinate Word3 of the Second Point */ + __IO uint32_t ECC_Y2_04; /*!< [0x08f0] ECC the Y-coordinate Word4 of the Second Point */ + __IO uint32_t ECC_Y2_05; /*!< [0x08f4] ECC the Y-coordinate Word5 of the Second Point */ + __IO uint32_t ECC_Y2_06; /*!< [0x08f8] ECC the Y-coordinate Word6 of the Second Point */ + __IO uint32_t ECC_Y2_07; /*!< [0x08fc] ECC the Y-coordinate Word7 of the Second Point */ + __IO uint32_t ECC_Y2_08; /*!< [0x0900] ECC the Y-coordinate Word8 of the Second Point */ + __IO uint32_t ECC_Y2_09; /*!< [0x0904] ECC the Y-coordinate Word9 of the Second Point */ + __IO uint32_t ECC_Y2_10; /*!< [0x0908] ECC the Y-coordinate Word10 of the Second Point */ + __IO uint32_t ECC_Y2_11; /*!< [0x090c] ECC the Y-coordinate Word11 of the Second Point */ + __IO uint32_t ECC_Y2_12; /*!< [0x0910] ECC the Y-coordinate Word12 of the Second Point */ + __IO uint32_t ECC_Y2_13; /*!< [0x0914] ECC the Y-coordinate Word13 of the Second Point */ + __IO uint32_t ECC_Y2_14; /*!< [0x0918] ECC the Y-coordinate Word14 of the Second Point */ + __IO uint32_t ECC_Y2_15; /*!< [0x091c] ECC the Y-coordinate Word15 of the Second Point */ + __IO uint32_t ECC_Y2_16; /*!< [0x0920] ECC the Y-coordinate Word16 of the Second Point */ + __IO uint32_t ECC_Y2_17; /*!< [0x0924] ECC the Y-coordinate Word17 of the Second Point */ + __IO uint32_t ECC_A_00; /*!< [0x0928] ECC the Parameter CURVEA Word0 of Elliptic Curve */ + __IO uint32_t ECC_A_01; /*!< [0x092c] ECC the Parameter CURVEA Word1 of Elliptic Curve */ + __IO uint32_t ECC_A_02; /*!< [0x0930] ECC the Parameter CURVEA Word2 of Elliptic Curve */ + __IO uint32_t ECC_A_03; /*!< [0x0934] ECC the Parameter CURVEA Word3 of Elliptic Curve */ + __IO uint32_t ECC_A_04; /*!< [0x0938] ECC the Parameter CURVEA Word4 of Elliptic Curve */ + __IO uint32_t ECC_A_05; /*!< [0x093c] ECC the Parameter CURVEA Word5 of Elliptic Curve */ + __IO uint32_t ECC_A_06; /*!< [0x0940] ECC the Parameter CURVEA Word6 of Elliptic Curve */ + __IO uint32_t ECC_A_07; /*!< [0x0944] ECC the Parameter CURVEA Word7 of Elliptic Curve */ + __IO uint32_t ECC_A_08; /*!< [0x0948] ECC the Parameter CURVEA Word8 of Elliptic Curve */ + __IO uint32_t ECC_A_09; /*!< [0x094c] ECC the Parameter CURVEA Word9 of Elliptic Curve */ + __IO uint32_t ECC_A_10; /*!< [0x0950] ECC the Parameter CURVEA Word10 of Elliptic Curve */ + __IO uint32_t ECC_A_11; /*!< [0x0954] ECC the Parameter CURVEA Word11 of Elliptic Curve */ + __IO uint32_t ECC_A_12; /*!< [0x0958] ECC the Parameter CURVEA Word12 of Elliptic Curve */ + __IO uint32_t ECC_A_13; /*!< [0x095c] ECC the Parameter CURVEA Word13 of Elliptic Curve */ + __IO uint32_t ECC_A_14; /*!< [0x0960] ECC the Parameter CURVEA Word14 of Elliptic Curve */ + __IO uint32_t ECC_A_15; /*!< [0x0964] ECC the Parameter CURVEA Word15 of Elliptic Curve */ + __IO uint32_t ECC_A_16; /*!< [0x0968] ECC the Parameter CURVEA Word16 of Elliptic Curve */ + __IO uint32_t ECC_A_17; /*!< [0x096c] ECC the Parameter CURVEA Word17 of Elliptic Curve */ + __IO uint32_t ECC_B_00; /*!< [0x0970] ECC the Parameter CURVEB Word0 of Elliptic Curve */ + __IO uint32_t ECC_B_01; /*!< [0x0974] ECC the Parameter CURVEB Word1 of Elliptic Curve */ + __IO uint32_t ECC_B_02; /*!< [0x0978] ECC the Parameter CURVEB Word2 of Elliptic Curve */ + __IO uint32_t ECC_B_03; /*!< [0x097c] ECC the Parameter CURVEB Word3 of Elliptic Curve */ + __IO uint32_t ECC_B_04; /*!< [0x0980] ECC the Parameter CURVEB Word4 of Elliptic Curve */ + __IO uint32_t ECC_B_05; /*!< [0x0984] ECC the Parameter CURVEB Word5 of Elliptic Curve */ + __IO uint32_t ECC_B_06; /*!< [0x0988] ECC the Parameter CURVEB Word6 of Elliptic Curve */ + __IO uint32_t ECC_B_07; /*!< [0x098c] ECC the Parameter CURVEB Word7 of Elliptic Curve */ + __IO uint32_t ECC_B_08; /*!< [0x0990] ECC the Parameter CURVEB Word8 of Elliptic Curve */ + __IO uint32_t ECC_B_09; /*!< [0x0994] ECC the Parameter CURVEB Word9 of Elliptic Curve */ + __IO uint32_t ECC_B_10; /*!< [0x0998] ECC the Parameter CURVEB Word10 of Elliptic Curve */ + __IO uint32_t ECC_B_11; /*!< [0x099c] ECC the Parameter CURVEB Word11 of Elliptic Curve */ + __IO uint32_t ECC_B_12; /*!< [0x09a0] ECC the Parameter CURVEB Word12 of Elliptic Curve */ + __IO uint32_t ECC_B_13; /*!< [0x09a4] ECC the Parameter CURVEB Word13 of Elliptic Curve */ + __IO uint32_t ECC_B_14; /*!< [0x09a8] ECC the Parameter CURVEB Word14 of Elliptic Curve */ + __IO uint32_t ECC_B_15; /*!< [0x09ac] ECC the Parameter CURVEB Word15 of Elliptic Curve */ + __IO uint32_t ECC_B_16; /*!< [0x09b0] ECC the Parameter CURVEB Word16 of Elliptic Curve */ + __IO uint32_t ECC_B_17; /*!< [0x09b4] ECC the Parameter CURVEB Word17 of Elliptic Curve */ + __IO uint32_t ECC_N_00; /*!< [0x09b8] ECC the Parameter CURVEN Word0 of Elliptic Curve */ + __IO uint32_t ECC_N_01; /*!< [0x09bc] ECC the Parameter CURVEN Word1 of Elliptic Curve */ + __IO uint32_t ECC_N_02; /*!< [0x09c0] ECC the Parameter CURVEN Word2 of Elliptic Curve */ + __IO uint32_t ECC_N_03; /*!< [0x09c4] ECC the Parameter CURVEN Word3 of Elliptic Curve */ + __IO uint32_t ECC_N_04; /*!< [0x09c8] ECC the Parameter CURVEN Word4 of Elliptic Curve */ + __IO uint32_t ECC_N_05; /*!< [0x09cc] ECC the Parameter CURVEN Word5 of Elliptic Curve */ + __IO uint32_t ECC_N_06; /*!< [0x09d0] ECC the Parameter CURVEN Word6 of Elliptic Curve */ + __IO uint32_t ECC_N_07; /*!< [0x09d4] ECC the Parameter CURVEN Word7 of Elliptic Curve */ + __IO uint32_t ECC_N_08; /*!< [0x09d8] ECC the Parameter CURVEN Word8 of Elliptic Curve */ + __IO uint32_t ECC_N_09; /*!< [0x09dc] ECC the Parameter CURVEN Word9 of Elliptic Curve */ + __IO uint32_t ECC_N_10; /*!< [0x09e0] ECC the Parameter CURVEN Word10 of Elliptic Curve */ + __IO uint32_t ECC_N_11; /*!< [0x09e4] ECC the Parameter CURVEN Word11 of Elliptic Curve */ + __IO uint32_t ECC_N_12; /*!< [0x09e8] ECC the Parameter CURVEN Word12 of Elliptic Curve */ + __IO uint32_t ECC_N_13; /*!< [0x09ec] ECC the Parameter CURVEN Word13 of Elliptic Curve */ + __IO uint32_t ECC_N_14; /*!< [0x09f0] ECC the Parameter CURVEN Word14 of Elliptic Curve */ + __IO uint32_t ECC_N_15; /*!< [0x09f4] ECC the Parameter CURVEN Word15 of Elliptic Curve */ + __IO uint32_t ECC_N_16; /*!< [0x09f8] ECC the Parameter CURVEN Word16 of Elliptic Curve */ + __IO uint32_t ECC_N_17; /*!< [0x09fc] ECC the Parameter CURVEN Word17 of Elliptic Curve */ + __O uint32_t ECC_K_00; /*!< [0x0a00] ECC the Scalar SCALARK Word0 of Point Multiplication */ + __O uint32_t ECC_K_01; /*!< [0x0a04] ECC the Scalar SCALARK Word1 of Point Multiplication */ + __O uint32_t ECC_K_02; /*!< [0x0a08] ECC the Scalar SCALARK Word2 of Point Multiplication */ + __O uint32_t ECC_K_03; /*!< [0x0a0c] ECC the Scalar SCALARK Word3 of Point Multiplication */ + __O uint32_t ECC_K_04; /*!< [0x0a10] ECC the Scalar SCALARK Word4 of Point Multiplication */ + __O uint32_t ECC_K_05; /*!< [0x0a14] ECC the Scalar SCALARK Word5 of Point Multiplication */ + __O uint32_t ECC_K_06; /*!< [0x0a18] ECC the Scalar SCALARK Word6 of Point Multiplication */ + __O uint32_t ECC_K_07; /*!< [0x0a1c] ECC the Scalar SCALARK Word7 of Point Multiplication */ + __O uint32_t ECC_K_08; /*!< [0x0a20] ECC the Scalar SCALARK Word8 of Point Multiplication */ + __O uint32_t ECC_K_09; /*!< [0x0a24] ECC the Scalar SCALARK Word9 of Point Multiplication */ + __O uint32_t ECC_K_10; /*!< [0x0a28] ECC the Scalar SCALARK Word10 of Point Multiplication */ + __O uint32_t ECC_K_11; /*!< [0x0a2c] ECC the Scalar SCALARK Word11 of Point Multiplication */ + __O uint32_t ECC_K_12; /*!< [0x0a30] ECC the Scalar SCALARK Word12 of Point Multiplication */ + __O uint32_t ECC_K_13; /*!< [0x0a34] ECC the Scalar SCALARK Word13 of Point Multiplication */ + __O uint32_t ECC_K_14; /*!< [0x0a38] ECC the Scalar SCALARK Word14 of Point Multiplication */ + __O uint32_t ECC_K_15; /*!< [0x0a3c] ECC the Scalar SCALARK Word15 of Point Multiplication */ + __O uint32_t ECC_K_16; /*!< [0x0a40] ECC the Scalar SCALARK Word16 of Point Multiplication */ + __O uint32_t ECC_K_17; /*!< [0x0a44] ECC the Scalar SCALARK Word17 of Point Multiplication */ + __IO uint32_t ECC_SADDR; /*!< [0x0a48] ECC DMA Source Address Register */ + __IO uint32_t ECC_DADDR; /*!< [0x0a4c] ECC DMA Destination Address Register */ + __IO uint32_t ECC_STARTREG; /*!< [0x0a50] ECC Starting Address of Updated Registers */ + __IO uint32_t ECC_WORDCNT; /*!< [0x0a54] ECC DMA Word Count */ + __I uint32_t RESERVE7[42]; + __IO uint32_t RSA_CTL; /*!< [0x0b00] RSA Control Register */ + __I uint32_t RSA_STS; /*!< [0x0b04] RSA Status Register */ + __IO uint32_t RSA_SADDR0; /*!< [0x0b08] RSA DMA Source Address Register0 */ + __IO uint32_t RSA_SADDR1; /*!< [0x0b0c] RSA DMA Source Address Register1 */ + __IO uint32_t RSA_SADDR2; /*!< [0x0b10] RSA DMA Source Address Register2 */ + __IO uint32_t RSA_SADDR3; /*!< [0x0b14] RSA DMA Source Address Register3 */ + __IO uint32_t RSA_SADDR4; /*!< [0x0b18] RSA DMA Source Address Register4 */ + __IO uint32_t RSA_DADDR; /*!< [0x0b1c] RSA DMA Destination Address Register */ + __IO uint32_t RSA_MADDR0; /*!< [0x0b20] RSA DMA Middle Address Register0 */ + __IO uint32_t RSA_MADDR1; /*!< [0x0b24] RSA DMA Middle Address Register1 */ + __IO uint32_t RSA_MADDR2; /*!< [0x0b28] RSA DMA Middle Address Register2 */ + __IO uint32_t RSA_MADDR3; /*!< [0x0b2c] RSA DMA Middle Address Register3 */ + __IO uint32_t RSA_MADDR4; /*!< [0x0b30] RSA DMA Middle Address Register4 */ + __IO uint32_t RSA_MADDR5; /*!< [0x0b34] RSA DMA Middle Address Register5 */ + __IO uint32_t RSA_MADDR6; /*!< [0x0b38] RSA DMA Middle Address Register6 */ + __I uint32_t RESERVE8[241]; + __O uint32_t PRNG_KSCTL; /*!< [0x0f00] PRNG Key Control Register */ + __I uint32_t PRNG_KSSTS; /*!< [0x0f04] PRNG Key Status Register */ + __I uint32_t RESERVE9[2]; + __O uint32_t AES_KSCTL; /*!< [0x0f10] AES Key Control Register */ + __I uint32_t RESERVE10[7]; + __O uint32_t HMAC_KSCTL; /*!< [0x0f30] HMAC Key Control Register */ + __I uint32_t RESERVE11[3]; + __O uint32_t ECC_KSCTL; /*!< [0x0f40] ECC Key Control Register */ + __I uint32_t ECC_KSSTS; /*!< [0x0f44] ECC Key Status Register */ + __O uint32_t ECC_KSXY; /*!< [0x0f48] ECC XY Number Register */ + __I uint32_t RESERVE12[1]; + __O uint32_t RSA_KSCTL; /*!< [0x0f50] RSA Key Control Register */ + __IO uint32_t RSA_KSSTS0; /*!< [0x0f54] RSA Key Status Register 0 */ + __IO uint32_t RSA_KSSTS1; /*!< [0x0f58] RSA Key Status Register 1 */ + +} CRYPTO_T; + +/** + @addtogroup CRYPTO_CONST CRYPTO Bit Field Definition + Constant Definitions for CRYPTO Controller +@{ */ + +#define CRYPTO_INTEN_AESIEN_Pos (0) /*!< CRYPTO_T::INTEN: AESIEN Position */ +#define CRYPTO_INTEN_AESIEN_Msk (0x1ul << CRYPTO_INTEN_AESIEN_Pos) /*!< CRYPTO_T::INTEN: AESIEN Mask */ + +#define CRYPTO_INTEN_AESEIEN_Pos (1) /*!< CRYPTO_T::INTEN: AESEIEN Position */ +#define CRYPTO_INTEN_AESEIEN_Msk (0x1ul << CRYPTO_INTEN_AESEIEN_Pos) /*!< CRYPTO_T::INTEN: AESEIEN Mask */ + +#define CRYPTO_INTEN_PRNGIEN_Pos (16) /*!< CRYPTO_T::INTEN: PRNGIEN Position */ +#define CRYPTO_INTEN_PRNGIEN_Msk (0x1ul << CRYPTO_INTEN_PRNGIEN_Pos) /*!< CRYPTO_T::INTEN: PRNGIEN Mask */ + +#define CRYPTO_INTEN_PRNGEIEN_Pos (17) /*!< CRYPTO_T::INTEN: PRNGEIEN Position */ +#define CRYPTO_INTEN_PRNGEIEN_Msk (0x1ul << CRYPTO_INTEN_PRNGEIEN_Pos) /*!< CRYPTO_T::INTEN: PRNGEIEN Mask */ + +#define CRYPTO_INTEN_ECCIEN_Pos (22) /*!< CRYPTO_T::INTEN: ECCIEN Position */ +#define CRYPTO_INTEN_ECCIEN_Msk (0x1ul << CRYPTO_INTEN_ECCIEN_Pos) /*!< CRYPTO_T::INTEN: ECCIEN Mask */ + +#define CRYPTO_INTEN_ECCEIEN_Pos (23) /*!< CRYPTO_T::INTEN: ECCEIEN Position */ +#define CRYPTO_INTEN_ECCEIEN_Msk (0x1ul << CRYPTO_INTEN_ECCEIEN_Pos) /*!< CRYPTO_T::INTEN: ECCEIEN Mask */ + +#define CRYPTO_INTEN_HMACIEN_Pos (24) /*!< CRYPTO_T::INTEN: HMACIEN Position */ +#define CRYPTO_INTEN_HMACIEN_Msk (0x1ul << CRYPTO_INTEN_HMACIEN_Pos) /*!< CRYPTO_T::INTEN: HMACIEN Mask */ + +#define CRYPTO_INTEN_HMACEIEN_Pos (25) /*!< CRYPTO_T::INTEN: HMACEIEN Position */ +#define CRYPTO_INTEN_HMACEIEN_Msk (0x1ul << CRYPTO_INTEN_HMACEIEN_Pos) /*!< CRYPTO_T::INTEN: HMACEIEN Mask */ + +#define CRYPTO_INTEN_RSAIEN_Pos (30) /*!< CRYPTO_T::INTEN: RSAIEN Position */ +#define CRYPTO_INTEN_RSAIEN_Msk (0x1ul << CRYPTO_INTEN_RSAIEN_Pos) /*!< CRYPTO_T::INTEN: RSAIEN Mask */ + +#define CRYPTO_INTEN_RSAEIEN_Pos (31) /*!< CRYPTO_T::INTEN: RSAEIEN Position */ +#define CRYPTO_INTEN_RSAEIEN_Msk (0x1ul << CRYPTO_INTEN_RSAEIEN_Pos) /*!< CRYPTO_T::INTEN: RSAEIEN Mask */ + +#define CRYPTO_INTSTS_AESIF_Pos (0) /*!< CRYPTO_T::INTSTS: AESIF Position */ +#define CRYPTO_INTSTS_AESIF_Msk (0x1ul << CRYPTO_INTSTS_AESIF_Pos) /*!< CRYPTO_T::INTSTS: AESIF Mask */ + +#define CRYPTO_INTSTS_AESEIF_Pos (1) /*!< CRYPTO_T::INTSTS: AESEIF Position */ +#define CRYPTO_INTSTS_AESEIF_Msk (0x1ul << CRYPTO_INTSTS_AESEIF_Pos) /*!< CRYPTO_T::INTSTS: AESEIF Mask */ + +#define CRYPTO_INTSTS_PRNGIF_Pos (16) /*!< CRYPTO_T::INTSTS: PRNGIF Position */ +#define CRYPTO_INTSTS_PRNGIF_Msk (0x1ul << CRYPTO_INTSTS_PRNGIF_Pos) /*!< CRYPTO_T::INTSTS: PRNGIF Mask */ + +#define CRYPTO_INTSTS_PRNGEIF_Pos (17) /*!< CRYPTO_T::INTSTS: PRNGEIF Position */ +#define CRYPTO_INTSTS_PRNGEIF_Msk (0x1ul << CRYPTO_INTSTS_PRNGEIF_Pos) /*!< CRYPTO_T::INTSTS: PRNGEIF Mask */ + +#define CRYPTO_INTSTS_ECCIF_Pos (22) /*!< CRYPTO_T::INTSTS: ECCIF Position */ +#define CRYPTO_INTSTS_ECCIF_Msk (0x1ul << CRYPTO_INTSTS_ECCIF_Pos) /*!< CRYPTO_T::INTSTS: ECCIF Mask */ + +#define CRYPTO_INTSTS_ECCEIF_Pos (23) /*!< CRYPTO_T::INTSTS: ECCEIF Position */ +#define CRYPTO_INTSTS_ECCEIF_Msk (0x1ul << CRYPTO_INTSTS_ECCEIF_Pos) /*!< CRYPTO_T::INTSTS: ECCEIF Mask */ + +#define CRYPTO_INTSTS_HMACIF_Pos (24) /*!< CRYPTO_T::INTSTS: HMACIF Position */ +#define CRYPTO_INTSTS_HMACIF_Msk (0x1ul << CRYPTO_INTSTS_HMACIF_Pos) /*!< CRYPTO_T::INTSTS: HMACIF Mask */ + +#define CRYPTO_INTSTS_HMACEIF_Pos (25) /*!< CRYPTO_T::INTSTS: HMACEIF Position */ +#define CRYPTO_INTSTS_HMACEIF_Msk (0x1ul << CRYPTO_INTSTS_HMACEIF_Pos) /*!< CRYPTO_T::INTSTS: HMACEIF Mask */ + +#define CRYPTO_INTSTS_RSAIF_Pos (30) /*!< CRYPTO_T::INTSTS: RSAIF Position */ +#define CRYPTO_INTSTS_RSAIF_Msk (0x1ul << CRYPTO_INTSTS_RSAIF_Pos) /*!< CRYPTO_T::INTSTS: RSAIF Mask */ + +#define CRYPTO_INTSTS_RSAEIF_Pos (31) /*!< CRYPTO_T::INTSTS: RSAEIF Position */ +#define CRYPTO_INTSTS_RSAEIF_Msk (0x1ul << CRYPTO_INTSTS_RSAEIF_Pos) /*!< CRYPTO_T::INTSTS: RSAEIF Mask */ + +#define CRYPTO_PRNG_CTL_START_Pos (0) /*!< CRYPTO_T::PRNG_CTL: START Position */ +#define CRYPTO_PRNG_CTL_START_Msk (0x1ul << CRYPTO_PRNG_CTL_START_Pos) /*!< CRYPTO_T::PRNG_CTL: START Mask */ + +#define CRYPTO_PRNG_CTL_SEEDRLD_Pos (1) /*!< CRYPTO_T::PRNG_CTL: SEEDRLD Position */ +#define CRYPTO_PRNG_CTL_SEEDRLD_Msk (0x1ul << CRYPTO_PRNG_CTL_SEEDRLD_Pos) /*!< CRYPTO_T::PRNG_CTL: SEEDRLD Mask */ + +#define CRYPTO_PRNG_CTL_KEYSZ_Pos (2) /*!< CRYPTO_T::PRNG_CTL: KEYSZ Position */ +#define CRYPTO_PRNG_CTL_KEYSZ_Msk (0xful << CRYPTO_PRNG_CTL_KEYSZ_Pos) /*!< CRYPTO_T::PRNG_CTL: KEYSZ Mask */ + +#define CRYPTO_PRNG_CTL_BUSY_Pos (8) /*!< CRYPTO_T::PRNG_CTL: BUSY Position */ +#define CRYPTO_PRNG_CTL_BUSY_Msk (0x1ul << CRYPTO_PRNG_CTL_BUSY_Pos) /*!< CRYPTO_T::PRNG_CTL: BUSY Mask */ + +#define CRYPTO_PRNG_CTL_SEEDSRC_Pos (16) /*!< CRYPTO_T::PRNG_CTL: SEEDSRC Position */ +#define CRYPTO_PRNG_CTL_SEEDSRC_Msk (0x1ul << CRYPTO_PRNG_CTL_SEEDSRC_Pos) /*!< CRYPTO_T::PRNG_CTL: SEEDSRC Mask */ + +#define CRYPTO_PRNG_SEED_SEED_Pos (0) /*!< CRYPTO_T::PRNG_SEED: SEED Position */ +#define CRYPTO_PRNG_SEED_SEED_Msk (0xfffffffful << CRYPTO_PRNG_SEED_SEED_Pos) /*!< CRYPTO_T::PRNG_SEED: SEED Mask */ + +#define CRYPTO_PRNG_KEY0_KEY_Pos (0) /*!< CRYPTO_T::PRNG_KEY0: KEY Position */ +#define CRYPTO_PRNG_KEY0_KEY_Msk (0xfffffffful << CRYPTO_PRNG_KEY0_KEY_Pos) /*!< CRYPTO_T::PRNG_KEY0: KEY Mask */ + +#define CRYPTO_PRNG_KEY1_KEY_Pos (0) /*!< CRYPTO_T::PRNG_KEY1: KEY Position */ +#define CRYPTO_PRNG_KEY1_KEY_Msk (0xfffffffful << CRYPTO_PRNG_KEY1_KEY_Pos) /*!< CRYPTO_T::PRNG_KEY1: KEY Mask */ + +#define CRYPTO_PRNG_KEY2_KEY_Pos (0) /*!< CRYPTO_T::PRNG_KEY2: KEY Position */ +#define CRYPTO_PRNG_KEY2_KEY_Msk (0xfffffffful << CRYPTO_PRNG_KEY2_KEY_Pos) /*!< CRYPTO_T::PRNG_KEY2: KEY Mask */ + +#define CRYPTO_PRNG_KEY3_KEY_Pos (0) /*!< CRYPTO_T::PRNG_KEY3: KEY Position */ +#define CRYPTO_PRNG_KEY3_KEY_Msk (0xfffffffful << CRYPTO_PRNG_KEY3_KEY_Pos) /*!< CRYPTO_T::PRNG_KEY3: KEY Mask */ + +#define CRYPTO_PRNG_KEY4_KEY_Pos (0) /*!< CRYPTO_T::PRNG_KEY4: KEY Position */ +#define CRYPTO_PRNG_KEY4_KEY_Msk (0xfffffffful << CRYPTO_PRNG_KEY4_KEY_Pos) /*!< CRYPTO_T::PRNG_KEY4: KEY Mask */ + +#define CRYPTO_PRNG_KEY5_KEY_Pos (0) /*!< CRYPTO_T::PRNG_KEY5: KEY Position */ +#define CRYPTO_PRNG_KEY5_KEY_Msk (0xfffffffful << CRYPTO_PRNG_KEY5_KEY_Pos) /*!< CRYPTO_T::PRNG_KEY5: KEY Mask */ + +#define CRYPTO_PRNG_KEY6_KEY_Pos (0) /*!< CRYPTO_T::PRNG_KEY6: KEY Position */ +#define CRYPTO_PRNG_KEY6_KEY_Msk (0xfffffffful << CRYPTO_PRNG_KEY6_KEY_Pos) /*!< CRYPTO_T::PRNG_KEY6: KEY Mask */ + +#define CRYPTO_PRNG_KEY7_KEY_Pos (0) /*!< CRYPTO_T::PRNG_KEY7: KEY Position */ +#define CRYPTO_PRNG_KEY7_KEY_Msk (0xfffffffful << CRYPTO_PRNG_KEY7_KEY_Pos) /*!< CRYPTO_T::PRNG_KEY7: KEY Mask */ + +#define CRYPTO_PRNG_STS_BUSY_Pos (0) /*!< CRYPTO_T::PRNG_STS: BUSY Position */ +#define CRYPTO_PRNG_STS_BUSY_Msk (0x1ul << CRYPTO_PRNG_STS_BUSY_Pos) /*!< CRYPTO_T::PRNG_STS: BUSY Mask */ + +#define CRYPTO_PRNG_STS_KCTLERR_Pos (16) /*!< CRYPTO_T::PRNG_STS: KCTLERR Position */ +#define CRYPTO_PRNG_STS_KCTLERR_Msk (0x1ul << CRYPTO_PRNG_STS_KCTLERR_Pos) /*!< CRYPTO_T::PRNG_STS: KCTLERR Mask */ + +#define CRYPTO_PRNG_STS_KSERR_Pos (17) /*!< CRYPTO_T::PRNG_STS: KSERR Position */ +#define CRYPTO_PRNG_STS_KSERR_Msk (0x1ul << CRYPTO_PRNG_STS_KSERR_Pos) /*!< CRYPTO_T::PRNG_STS: KSERR Mask */ + +#define CRYPTO_PRNG_STS_TRNGERR_Pos (18) /*!< CRYPTO_T::PRNG_STS: TRNGERR Position */ +#define CRYPTO_PRNG_STS_TRNGERR_Msk (0x1ul << CRYPTO_PRNG_STS_TRNGERR_Pos) /*!< CRYPTO_T::PRNG_STS: TRNGERR Mask */ + +#define CRYPTO_AES_FDBCK0_FDBCK_Pos (0) /*!< CRYPTO_T::AES_FDBCK0: FDBCK Position */ +#define CRYPTO_AES_FDBCK0_FDBCK_Msk (0xfffffffful << CRYPTO_AES_FDBCK0_FDBCK_Pos) /*!< CRYPTO_T::AES_FDBCK0: FDBCK Mask */ + +#define CRYPTO_AES_FDBCK1_FDBCK_Pos (0) /*!< CRYPTO_T::AES_FDBCK1: FDBCK Position */ +#define CRYPTO_AES_FDBCK1_FDBCK_Msk (0xfffffffful << CRYPTO_AES_FDBCK1_FDBCK_Pos) /*!< CRYPTO_T::AES_FDBCK1: FDBCK Mask */ + +#define CRYPTO_AES_FDBCK2_FDBCK_Pos (0) /*!< CRYPTO_T::AES_FDBCK2: FDBCK Position */ +#define CRYPTO_AES_FDBCK2_FDBCK_Msk (0xfffffffful << CRYPTO_AES_FDBCK2_FDBCK_Pos) /*!< CRYPTO_T::AES_FDBCK2: FDBCK Mask */ + +#define CRYPTO_AES_FDBCK3_FDBCK_Pos (0) /*!< CRYPTO_T::AES_FDBCK3: FDBCK Position */ +#define CRYPTO_AES_FDBCK3_FDBCK_Msk (0xfffffffful << CRYPTO_AES_FDBCK3_FDBCK_Pos) /*!< CRYPTO_T::AES_FDBCK3: FDBCK Mask */ + +#define CRYPTO_AES_GCM_IVCNT0_CNT_Pos (0) /*!< CRYPTO_T::AES_GCM_IVCNT0: CNT Position */ +#define CRYPTO_AES_GCM_IVCNT0_CNT_Msk (0xfffffffful << CRYPTO_AES_GCM_IVCNT0_CNT_Pos) /*!< CRYPTO_T::AES_GCM_IVCNT0: CNT Mask */ + +#define CRYPTO_AES_GCM_IVCNT1_CNT_Pos (0) /*!< CRYPTO_T::AES_GCM_IVCNT1: CNT Position */ +#define CRYPTO_AES_GCM_IVCNT1_CNT_Msk (0x1ffffffful << CRYPTO_AES_GCM_IVCNT1_CNT_Pos) /*!< CRYPTO_T::AES_GCM_IVCNT1: CNT Mask */ + +#define CRYPTO_AES_GCM_ACNT0_CNT_Pos (0) /*!< CRYPTO_T::AES_GCM_ACNT0: CNT Position */ +#define CRYPTO_AES_GCM_ACNT0_CNT_Msk (0xfffffffful << CRYPTO_AES_GCM_ACNT0_CNT_Pos) /*!< CRYPTO_T::AES_GCM_ACNT0: CNT Mask */ + +#define CRYPTO_AES_GCM_ACNT1_CNT_Pos (0) /*!< CRYPTO_T::AES_GCM_ACNT1: CNT Position */ +#define CRYPTO_AES_GCM_ACNT1_CNT_Msk (0x1ffffffful << CRYPTO_AES_GCM_ACNT1_CNT_Pos) /*!< CRYPTO_T::AES_GCM_ACNT1: CNT Mask */ + +#define CRYPTO_AES_GCM_PCNT0_CNT_Pos (0) /*!< CRYPTO_T::AES_GCM_PCNT0: CNT Position */ +#define CRYPTO_AES_GCM_PCNT0_CNT_Msk (0xfffffffful << CRYPTO_AES_GCM_PCNT0_CNT_Pos) /*!< CRYPTO_T::AES_GCM_PCNT0: CNT Mask */ + +#define CRYPTO_AES_GCM_PCNT1_CNT_Pos (0) /*!< CRYPTO_T::AES_GCM_PCNT1: CNT Position */ +#define CRYPTO_AES_GCM_PCNT1_CNT_Msk (0x1ffffffful << CRYPTO_AES_GCM_PCNT1_CNT_Pos) /*!< CRYPTO_T::AES_GCM_PCNT1: CNT Mask */ + +#define CRYPTO_AES_FBADDR_FBADDR_Pos (0) /*!< CRYPTO_T::AES_FBADDR: FBADDR Position */ +#define CRYPTO_AES_FBADDR_FBADDR_Msk (0xfffffffful << CRYPTO_AES_FBADDR_FBADDR_Pos) /*!< CRYPTO_T::AES_FBADDR: FBADDR Mask */ + +#define CRYPTO_AES_CTL_START_Pos (0) /*!< CRYPTO_T::AES_CTL: START Position */ +#define CRYPTO_AES_CTL_START_Msk (0x1ul << CRYPTO_AES_CTL_START_Pos) /*!< CRYPTO_T::AES_CTL: START Mask */ + +#define CRYPTO_AES_CTL_STOP_Pos (1) /*!< CRYPTO_T::AES_CTL: STOP Position */ +#define CRYPTO_AES_CTL_STOP_Msk (0x1ul << CRYPTO_AES_CTL_STOP_Pos) /*!< CRYPTO_T::AES_CTL: STOP Mask */ + +#define CRYPTO_AES_CTL_KEYSZ_Pos (2) /*!< CRYPTO_T::AES_CTL: KEYSZ Position */ +#define CRYPTO_AES_CTL_KEYSZ_Msk (0x3ul << CRYPTO_AES_CTL_KEYSZ_Pos) /*!< CRYPTO_T::AES_CTL: KEYSZ Mask */ + +#define CRYPTO_AES_CTL_DMALAST_Pos (5) /*!< CRYPTO_T::AES_CTL: DMALAST Position */ +#define CRYPTO_AES_CTL_DMALAST_Msk (0x1ul << CRYPTO_AES_CTL_DMALAST_Pos) /*!< CRYPTO_T::AES_CTL: DMALAST Mask */ + +#define CRYPTO_AES_CTL_DMACSCAD_Pos (6) /*!< CRYPTO_T::AES_CTL: DMACSCAD Position */ +#define CRYPTO_AES_CTL_DMACSCAD_Msk (0x1ul << CRYPTO_AES_CTL_DMACSCAD_Pos) /*!< CRYPTO_T::AES_CTL: DMACSCAD Mask */ + +#define CRYPTO_AES_CTL_DMAEN_Pos (7) /*!< CRYPTO_T::AES_CTL: DMAEN Position */ +#define CRYPTO_AES_CTL_DMAEN_Msk (0x1ul << CRYPTO_AES_CTL_DMAEN_Pos) /*!< CRYPTO_T::AES_CTL: DMAEN Mask */ + +#define CRYPTO_AES_CTL_OPMODE_Pos (8) /*!< CRYPTO_T::AES_CTL: OPMODE Position */ +#define CRYPTO_AES_CTL_OPMODE_Msk (0xfful << CRYPTO_AES_CTL_OPMODE_Pos) /*!< CRYPTO_T::AES_CTL: OPMODE Mask */ + +#define CRYPTO_AES_CTL_ENCRYPTO_Pos (16) /*!< CRYPTO_T::AES_CTL: ENCRYPTO Position */ +#define CRYPTO_AES_CTL_ENCRYPTO_Msk (0x1ul << CRYPTO_AES_CTL_ENCRYPTO_Pos) /*!< CRYPTO_T::AES_CTL: ENCRYPTO Mask */ + +#define CRYPTO_AES_CTL_SM4EN_Pos (17) /*!< CRYPTO_T::AES_CTL: SM4EN Position */ +#define CRYPTO_AES_CTL_SM4EN_Msk (0x1ul << CRYPTO_AES_CTL_SM4EN_Pos) /*!< CRYPTO_T::AES_CTL: SM4EN Mask */ + +#define CRYPTO_AES_CTL_DFAPEN_Pos (19) /*!< CRYPTO_T::AES_CTL: DFAPEN Position */ +#define CRYPTO_AES_CTL_DFAPEN_Msk (0x1ul << CRYPTO_AES_CTL_DFAPEN_Pos) /*!< CRYPTO_T::AES_CTL: DFAPEN Mask */ + +#define CRYPTO_AES_CTL_FBIN_Pos (20) /*!< CRYPTO_T::AES_CTL: FBIN Position */ +#define CRYPTO_AES_CTL_FBIN_Msk (0x1ul << CRYPTO_AES_CTL_FBIN_Pos) /*!< CRYPTO_T::AES_CTL: FBIN Mask */ + +#define CRYPTO_AES_CTL_FBOUT_Pos (21) /*!< CRYPTO_T::AES_CTL: FBOUT Position */ +#define CRYPTO_AES_CTL_FBOUT_Msk (0x1ul << CRYPTO_AES_CTL_FBOUT_Pos) /*!< CRYPTO_T::AES_CTL: FBOUT Mask */ + +#define CRYPTO_AES_CTL_OUTSWAP_Pos (22) /*!< CRYPTO_T::AES_CTL: OUTSWAP Position */ +#define CRYPTO_AES_CTL_OUTSWAP_Msk (0x1ul << CRYPTO_AES_CTL_OUTSWAP_Pos) /*!< CRYPTO_T::AES_CTL: OUTSWAP Mask */ + +#define CRYPTO_AES_CTL_INSWAP_Pos (23) /*!< CRYPTO_T::AES_CTL: INSWAP Position */ +#define CRYPTO_AES_CTL_INSWAP_Msk (0x1ul << CRYPTO_AES_CTL_INSWAP_Pos) /*!< CRYPTO_T::AES_CTL: INSWAP Mask */ + +#define CRYPTO_AES_CTL_KOUTSWAP_Pos (24) /*!< CRYPTO_T::AES_CTL: KOUTSWAP Position */ +#define CRYPTO_AES_CTL_KOUTSWAP_Msk (0x1ul << CRYPTO_AES_CTL_KOUTSWAP_Pos) /*!< CRYPTO_T::AES_CTL: KOUTSWAP Mask */ + +#define CRYPTO_AES_CTL_KINSWAP_Pos (25) /*!< CRYPTO_T::AES_CTL: KINSWAP Position */ +#define CRYPTO_AES_CTL_KINSWAP_Msk (0x1ul << CRYPTO_AES_CTL_KINSWAP_Pos) /*!< CRYPTO_T::AES_CTL: KINSWAP Mask */ + +#define CRYPTO_AES_CTL_KEYUNPRT_Pos (26) /*!< CRYPTO_T::AES_CTL: KEYUNPRT Position */ +#define CRYPTO_AES_CTL_KEYUNPRT_Msk (0x1ful << CRYPTO_AES_CTL_KEYUNPRT_Pos) /*!< CRYPTO_T::AES_CTL: KEYUNPRT Mask */ + +#define CRYPTO_AES_CTL_KEYPRT_Pos (31) /*!< CRYPTO_T::AES_CTL: KEYPRT Position */ +#define CRYPTO_AES_CTL_KEYPRT_Msk (0x1ul << CRYPTO_AES_CTL_KEYPRT_Pos) /*!< CRYPTO_T::AES_CTL: KEYPRT Mask */ + +#define CRYPTO_AES_STS_BUSY_Pos (0) /*!< CRYPTO_T::AES_STS: BUSY Position */ +#define CRYPTO_AES_STS_BUSY_Msk (0x1ul << CRYPTO_AES_STS_BUSY_Pos) /*!< CRYPTO_T::AES_STS: BUSY Mask */ + +#define CRYPTO_AES_STS_INBUFEMPTY_Pos (8) /*!< CRYPTO_T::AES_STS: INBUFEMPTY Position */ +#define CRYPTO_AES_STS_INBUFEMPTY_Msk (0x1ul << CRYPTO_AES_STS_INBUFEMPTY_Pos) /*!< CRYPTO_T::AES_STS: INBUFEMPTY Mask */ + +#define CRYPTO_AES_STS_INBUFFULL_Pos (9) /*!< CRYPTO_T::AES_STS: INBUFFULL Position */ +#define CRYPTO_AES_STS_INBUFFULL_Msk (0x1ul << CRYPTO_AES_STS_INBUFFULL_Pos) /*!< CRYPTO_T::AES_STS: INBUFFULL Mask */ + +#define CRYPTO_AES_STS_INBUFERR_Pos (10) /*!< CRYPTO_T::AES_STS: INBUFERR Position */ +#define CRYPTO_AES_STS_INBUFERR_Msk (0x1ul << CRYPTO_AES_STS_INBUFERR_Pos) /*!< CRYPTO_T::AES_STS: INBUFERR Mask */ + +#define CRYPTO_AES_STS_CNTERR_Pos (12) /*!< CRYPTO_T::AES_STS: CNTERR Position */ +#define CRYPTO_AES_STS_CNTERR_Msk (0x1ul << CRYPTO_AES_STS_CNTERR_Pos) /*!< CRYPTO_T::AES_STS: CNTERR Mask */ + +#define CRYPTO_AES_STS_OUTBUFEMPTY_Pos (16) /*!< CRYPTO_T::AES_STS: OUTBUFEMPTY Position*/ +#define CRYPTO_AES_STS_OUTBUFEMPTY_Msk (0x1ul << CRYPTO_AES_STS_OUTBUFEMPTY_Pos) /*!< CRYPTO_T::AES_STS: OUTBUFEMPTY Mask */ + +#define CRYPTO_AES_STS_OUTBUFFULL_Pos (17) /*!< CRYPTO_T::AES_STS: OUTBUFFULL Position */ +#define CRYPTO_AES_STS_OUTBUFFULL_Msk (0x1ul << CRYPTO_AES_STS_OUTBUFFULL_Pos) /*!< CRYPTO_T::AES_STS: OUTBUFFULL Mask */ + +#define CRYPTO_AES_STS_OUTBUFERR_Pos (18) /*!< CRYPTO_T::AES_STS: OUTBUFERR Position */ +#define CRYPTO_AES_STS_OUTBUFERR_Msk (0x1ul << CRYPTO_AES_STS_OUTBUFERR_Pos) /*!< CRYPTO_T::AES_STS: OUTBUFERR Mask */ + +#define CRYPTO_AES_STS_BUSERR_Pos (20) /*!< CRYPTO_T::AES_STS: BUSERR Position */ +#define CRYPTO_AES_STS_BUSERR_Msk (0x1ul << CRYPTO_AES_STS_BUSERR_Pos) /*!< CRYPTO_T::AES_STS: BUSERR Mask */ + +#define CRYPTO_AES_STS_KSERR_Pos (21) /*!< CRYPTO_T::AES_STS: KSERR Position */ +#define CRYPTO_AES_STS_KSERR_Msk (0x1ul << CRYPTO_AES_STS_KSERR_Pos) /*!< CRYPTO_T::AES_STS: KSERR Mask */ + +#define CRYPTO_AES_STS_DFAERR_Pos (22) /*!< CRYPTO_T::AES_STS: DFAERR Position */ +#define CRYPTO_AES_STS_DFAERR_Msk (0x1ul << CRYPTO_AES_STS_DFAERR_Pos) /*!< CRYPTO_T::AES_STS: DFAERR Mask */ + +#define CRYPTO_AES_DATIN_DATIN_Pos (0) /*!< CRYPTO_T::AES_DATIN: DATIN Position */ +#define CRYPTO_AES_DATIN_DATIN_Msk (0xfffffffful << CRYPTO_AES_DATIN_DATIN_Pos) /*!< CRYPTO_T::AES_DATIN: DATIN Mask */ + +#define CRYPTO_AES_DATOUT_DATOUT_Pos (0) /*!< CRYPTO_T::AES_DATOUT: DATOUT Position */ +#define CRYPTO_AES_DATOUT_DATOUT_Msk (0xfffffffful << CRYPTO_AES_DATOUT_DATOUT_Pos) /*!< CRYPTO_T::AES_DATOUT: DATOUT Mask */ + +#define CRYPTO_AES_KEY0_KEY_Pos (0) /*!< CRYPTO_T::AES_KEY0: KEY Position */ +#define CRYPTO_AES_KEY0_KEY_Msk (0xfffffffful << CRYPTO_AES_KEY0_KEY_Pos) /*!< CRYPTO_T::AES_KEY0: KEY Mask */ + +#define CRYPTO_AES_KEY1_KEY_Pos (0) /*!< CRYPTO_T::AES_KEY1: KEY Position */ +#define CRYPTO_AES_KEY1_KEY_Msk (0xfffffffful << CRYPTO_AES_KEY1_KEY_Pos) /*!< CRYPTO_T::AES_KEY1: KEY Mask */ + +#define CRYPTO_AES_KEY2_KEY_Pos (0) /*!< CRYPTO_T::AES_KEY2: KEY Position */ +#define CRYPTO_AES_KEY2_KEY_Msk (0xfffffffful << CRYPTO_AES_KEY2_KEY_Pos) /*!< CRYPTO_T::AES_KEY2: KEY Mask */ + +#define CRYPTO_AES_KEY3_KEY_Pos (0) /*!< CRYPTO_T::AES_KEY3: KEY Position */ +#define CRYPTO_AES_KEY3_KEY_Msk (0xfffffffful << CRYPTO_AES_KEY3_KEY_Pos) /*!< CRYPTO_T::AES_KEY3: KEY Mask */ + +#define CRYPTO_AES_KEY4_KEY_Pos (0) /*!< CRYPTO_T::AES_KEY4: KEY Position */ +#define CRYPTO_AES_KEY4_KEY_Msk (0xfffffffful << CRYPTO_AES_KEY4_KEY_Pos) /*!< CRYPTO_T::AES_KEY4: KEY Mask */ + +#define CRYPTO_AES_KEY5_KEY_Pos (0) /*!< CRYPTO_T::AES_KEY5: KEY Position */ +#define CRYPTO_AES_KEY5_KEY_Msk (0xfffffffful << CRYPTO_AES_KEY5_KEY_Pos) /*!< CRYPTO_T::AES_KEY5: KEY Mask */ + +#define CRYPTO_AES_KEY6_KEY_Pos (0) /*!< CRYPTO_T::AES_KEY6: KEY Position */ +#define CRYPTO_AES_KEY6_KEY_Msk (0xfffffffful << CRYPTO_AES_KEY6_KEY_Pos) /*!< CRYPTO_T::AES_KEY6: KEY Mask */ + +#define CRYPTO_AES_KEY7_KEY_Pos (0) /*!< CRYPTO_T::AES_KEY7: KEY Position */ +#define CRYPTO_AES_KEY7_KEY_Msk (0xfffffffful << CRYPTO_AES_KEY7_KEY_Pos) /*!< CRYPTO_T::AES_KEY7: KEY Mask */ + +#define CRYPTO_AES_IV0_IV_Pos (0) /*!< CRYPTO_T::AES_IV0: IV Position */ +#define CRYPTO_AES_IV0_IV_Msk (0xfffffffful << CRYPTO_AES_IV0_IV_Pos) /*!< CRYPTO_T::AES_IV0: IV Mask */ + +#define CRYPTO_AES_IV1_IV_Pos (0) /*!< CRYPTO_T::AES_IV1: IV Position */ +#define CRYPTO_AES_IV1_IV_Msk (0xfffffffful << CRYPTO_AES_IV1_IV_Pos) /*!< CRYPTO_T::AES_IV1: IV Mask */ + +#define CRYPTO_AES_IV2_IV_Pos (0) /*!< CRYPTO_T::AES_IV2: IV Position */ +#define CRYPTO_AES_IV2_IV_Msk (0xfffffffful << CRYPTO_AES_IV2_IV_Pos) /*!< CRYPTO_T::AES_IV2: IV Mask */ + +#define CRYPTO_AES_IV3_IV_Pos (0) /*!< CRYPTO_T::AES_IV3: IV Position */ +#define CRYPTO_AES_IV3_IV_Msk (0xfffffffful << CRYPTO_AES_IV3_IV_Pos) /*!< CRYPTO_T::AES_IV3: IV Mask */ + +#define CRYPTO_AES_SADDR_SADDR_Pos (0) /*!< CRYPTO_T::AES_SADDR: SADDR Position */ +#define CRYPTO_AES_SADDR_SADDR_Msk (0xfffffffful << CRYPTO_AES_SADDR_SADDR_Pos) /*!< CRYPTO_T::AES_SADDR: SADDR Mask */ + +#define CRYPTO_AES_DADDR_DADDR_Pos (0) /*!< CRYPTO_T::AES_DADDR: DADDR Position */ +#define CRYPTO_AES_DADDR_DADDR_Msk (0xfffffffful << CRYPTO_AES_DADDR_DADDR_Pos) /*!< CRYPTO_T::AES_DADDR: DADDR Mask */ + +#define CRYPTO_AES_CNT_CNT_Pos (0) /*!< CRYPTO_T::AES_CNT: CNT Position */ +#define CRYPTO_AES_CNT_CNT_Msk (0xfffffffful << CRYPTO_AES_CNT_CNT_Pos) /*!< CRYPTO_T::AES_CNT: CNT Mask */ + +#define CRYPTO_HMAC_CTL_START_Pos (0) /*!< CRYPTO_T::HMAC_CTL: START Position */ +#define CRYPTO_HMAC_CTL_START_Msk (0x1ul << CRYPTO_HMAC_CTL_START_Pos) /*!< CRYPTO_T::HMAC_CTL: START Mask */ + +#define CRYPTO_HMAC_CTL_STOP_Pos (1) /*!< CRYPTO_T::HMAC_CTL: STOP Position */ +#define CRYPTO_HMAC_CTL_STOP_Msk (0x1ul << CRYPTO_HMAC_CTL_STOP_Pos) /*!< CRYPTO_T::HMAC_CTL: STOP Mask */ + +#define CRYPTO_HMAC_CTL_DMAFIRST_Pos (4) /*!< CRYPTO_T::HMAC_CTL: DMAFIRST Position */ +#define CRYPTO_HMAC_CTL_DMAFIRST_Msk (0x1ul << CRYPTO_HMAC_CTL_DMAFIRST_Pos) /*!< CRYPTO_T::HMAC_CTL: DMAFIRST Mask */ + +#define CRYPTO_HMAC_CTL_DMALAST_Pos (5) /*!< CRYPTO_T::HMAC_CTL: DMALAST Position */ +#define CRYPTO_HMAC_CTL_DMALAST_Msk (0x1ul << CRYPTO_HMAC_CTL_DMALAST_Pos) /*!< CRYPTO_T::HMAC_CTL: DMALAST Mask */ + +#define CRYPTO_HMAC_CTL_DMACSCAD_Pos (6) /*!< CRYPTO_T::HMAC_CTL: DMACSCAD Position */ +#define CRYPTO_HMAC_CTL_DMACSCAD_Msk (0x1ul << CRYPTO_HMAC_CTL_DMACSCAD_Pos) /*!< CRYPTO_T::HMAC_CTL: DMACSCAD Mask */ + +#define CRYPTO_HMAC_CTL_DMAEN_Pos (7) /*!< CRYPTO_T::HMAC_CTL: DMAEN Position */ +#define CRYPTO_HMAC_CTL_DMAEN_Msk (0x1ul << CRYPTO_HMAC_CTL_DMAEN_Pos) /*!< CRYPTO_T::HMAC_CTL: DMAEN Mask */ + +#define CRYPTO_HMAC_CTL_OPMODE_Pos (8) /*!< CRYPTO_T::HMAC_CTL: OPMODE Position */ +#define CRYPTO_HMAC_CTL_OPMODE_Msk (0x7ul << CRYPTO_HMAC_CTL_OPMODE_Pos) /*!< CRYPTO_T::HMAC_CTL: OPMODE Mask */ + +#define CRYPTO_HMAC_CTL_HMACEN_Pos (11) /*!< CRYPTO_T::HMAC_CTL: HMACEN Position */ +#define CRYPTO_HMAC_CTL_HMACEN_Msk (0x1ul << CRYPTO_HMAC_CTL_HMACEN_Pos) /*!< CRYPTO_T::HMAC_CTL: HMACEN Mask */ + +#define CRYPTO_HMAC_CTL_SHA3EN_Pos (12) /*!< CRYPTO_T::HMAC_CTL: SHA3EN Position */ +#define CRYPTO_HMAC_CTL_SHA3EN_Msk (0x1ul << CRYPTO_HMAC_CTL_SHA3EN_Pos) /*!< CRYPTO_T::HMAC_CTL: SHA3EN Mask */ + +#define CRYPTO_HMAC_CTL_SM3EN_Pos (13) /*!< CRYPTO_T::HMAC_CTL: SM3EN Position */ +#define CRYPTO_HMAC_CTL_SM3EN_Msk (0x1ul << CRYPTO_HMAC_CTL_SM3EN_Pos) /*!< CRYPTO_T::HMAC_CTL: SM3EN Mask */ + +#define CRYPTO_HMAC_CTL_MD5EN_Pos (14) /*!< CRYPTO_T::HMAC_CTL: MD5EN Position */ +#define CRYPTO_HMAC_CTL_MD5EN_Msk (0x1ul << CRYPTO_HMAC_CTL_MD5EN_Pos) /*!< CRYPTO_T::HMAC_CTL: MD5EN Mask */ + +#define CRYPTO_HMAC_CTL_FBIN_Pos (20) /*!< CRYPTO_T::HMAC_CTL: FBIN Position */ +#define CRYPTO_HMAC_CTL_FBIN_Msk (0x1ul << CRYPTO_HMAC_CTL_FBIN_Pos) /*!< CRYPTO_T::HMAC_CTL: FBIN Mask */ + +#define CRYPTO_HMAC_CTL_FBOUT_Pos (21) /*!< CRYPTO_T::HMAC_CTL: FBOUT Position */ +#define CRYPTO_HMAC_CTL_FBOUT_Msk (0x1ul << CRYPTO_HMAC_CTL_FBOUT_Pos) /*!< CRYPTO_T::HMAC_CTL: FBOUT Mask */ + +#define CRYPTO_HMAC_CTL_OUTSWAP_Pos (22) /*!< CRYPTO_T::HMAC_CTL: OUTSWAP Position */ +#define CRYPTO_HMAC_CTL_OUTSWAP_Msk (0x1ul << CRYPTO_HMAC_CTL_OUTSWAP_Pos) /*!< CRYPTO_T::HMAC_CTL: OUTSWAP Mask */ + +#define CRYPTO_HMAC_CTL_INSWAP_Pos (23) /*!< CRYPTO_T::HMAC_CTL: INSWAP Position */ +#define CRYPTO_HMAC_CTL_INSWAP_Msk (0x1ul << CRYPTO_HMAC_CTL_INSWAP_Pos) /*!< CRYPTO_T::HMAC_CTL: INSWAP Mask */ + +#define CRYPTO_HMAC_CTL_NEXTDGST_Pos (24) /*!< CRYPTO_T::HMAC_CTL: NEXTDGST Position */ +#define CRYPTO_HMAC_CTL_NEXTDGST_Msk (0x1ul << CRYPTO_HMAC_CTL_NEXTDGST_Pos) /*!< CRYPTO_T::HMAC_CTL: NEXTDGST Mask */ + +#define CRYPTO_HMAC_CTL_FINISHDGST_Pos (25) /*!< CRYPTO_T::HMAC_CTL: FINISHDGST Position*/ +#define CRYPTO_HMAC_CTL_FINISHDGST_Msk (0x1ul << CRYPTO_HMAC_CTL_FINISHDGST_Pos) /*!< CRYPTO_T::HMAC_CTL: FINISHDGST Mask */ + +#define CRYPTO_HMAC_STS_BUSY_Pos (0) /*!< CRYPTO_T::HMAC_STS: BUSY Position */ +#define CRYPTO_HMAC_STS_BUSY_Msk (0x1ul << CRYPTO_HMAC_STS_BUSY_Pos) /*!< CRYPTO_T::HMAC_STS: BUSY Mask */ + +#define CRYPTO_HMAC_STS_DMABUSY_Pos (1) /*!< CRYPTO_T::HMAC_STS: DMABUSY Position */ +#define CRYPTO_HMAC_STS_DMABUSY_Msk (0x1ul << CRYPTO_HMAC_STS_DMABUSY_Pos) /*!< CRYPTO_T::HMAC_STS: DMABUSY Mask */ + +#define CRYPTO_HMAC_STS_SHAKEBUSY_Pos (2) /*!< CRYPTO_T::HMAC_STS: SHAKEBUSY Position */ +#define CRYPTO_HMAC_STS_SHAKEBUSY_Msk (0x1ul << CRYPTO_HMAC_STS_SHAKEBUSY_Pos) /*!< CRYPTO_T::HMAC_STS: SHAKEBUSY Mask */ + +#define CRYPTO_HMAC_STS_DMAERR_Pos (8) /*!< CRYPTO_T::HMAC_STS: DMAERR Position */ +#define CRYPTO_HMAC_STS_DMAERR_Msk (0x1ul << CRYPTO_HMAC_STS_DMAERR_Pos) /*!< CRYPTO_T::HMAC_STS: DMAERR Mask */ + +#define CRYPTO_HMAC_STS_KSERR_Pos (9) /*!< CRYPTO_T::HMAC_STS: KSERR Position */ +#define CRYPTO_HMAC_STS_KSERR_Msk (0x1ul << CRYPTO_HMAC_STS_KSERR_Pos) /*!< CRYPTO_T::HMAC_STS: KSERR Mask */ + +#define CRYPTO_HMAC_STS_DATINREQ_Pos (16) /*!< CRYPTO_T::HMAC_STS: DATINREQ Position */ +#define CRYPTO_HMAC_STS_DATINREQ_Msk (0x1ul << CRYPTO_HMAC_STS_DATINREQ_Pos) /*!< CRYPTO_T::HMAC_STS: DATINREQ Mask */ + +#define CRYPTO_HMAC_DGST0_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST0: DGST Position */ +#define CRYPTO_HMAC_DGST0_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST0_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST0: DGST Mask */ + +#define CRYPTO_HMAC_DGST1_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST1: DGST Position */ +#define CRYPTO_HMAC_DGST1_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST1_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST1: DGST Mask */ + +#define CRYPTO_HMAC_DGST2_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST2: DGST Position */ +#define CRYPTO_HMAC_DGST2_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST2_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST2: DGST Mask */ + +#define CRYPTO_HMAC_DGST3_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST3: DGST Position */ +#define CRYPTO_HMAC_DGST3_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST3_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST3: DGST Mask */ + +#define CRYPTO_HMAC_DGST4_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST4: DGST Position */ +#define CRYPTO_HMAC_DGST4_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST4_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST4: DGST Mask */ + +#define CRYPTO_HMAC_DGST5_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST5: DGST Position */ +#define CRYPTO_HMAC_DGST5_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST5_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST5: DGST Mask */ + +#define CRYPTO_HMAC_DGST6_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST6: DGST Position */ +#define CRYPTO_HMAC_DGST6_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST6_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST6: DGST Mask */ + +#define CRYPTO_HMAC_DGST7_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST7: DGST Position */ +#define CRYPTO_HMAC_DGST7_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST7_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST7: DGST Mask */ + +#define CRYPTO_HMAC_DGST8_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST8: DGST Position */ +#define CRYPTO_HMAC_DGST8_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST8_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST8: DGST Mask */ + +#define CRYPTO_HMAC_DGST9_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST9: DGST Position */ +#define CRYPTO_HMAC_DGST9_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST9_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST9: DGST Mask */ + +#define CRYPTO_HMAC_DGST10_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST10: DGST Position */ +#define CRYPTO_HMAC_DGST10_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST10_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST10: DGST Mask */ + +#define CRYPTO_HMAC_DGST11_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST11: DGST Position */ +#define CRYPTO_HMAC_DGST11_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST11_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST11: DGST Mask */ + +#define CRYPTO_HMAC_DGST12_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST12: DGST Position */ +#define CRYPTO_HMAC_DGST12_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST12_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST12: DGST Mask */ + +#define CRYPTO_HMAC_DGST13_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST13: DGST Position */ +#define CRYPTO_HMAC_DGST13_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST13_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST13: DGST Mask */ + +#define CRYPTO_HMAC_DGST14_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST14: DGST Position */ +#define CRYPTO_HMAC_DGST14_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST14_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST14: DGST Mask */ + +#define CRYPTO_HMAC_DGST15_DGST_Pos (0) /*!< CRYPTO_T::HMAC_DGST15: DGST Position */ +#define CRYPTO_HMAC_DGST15_DGST_Msk (0xfffffffful << CRYPTO_HMAC_DGST15_DGST_Pos) /*!< CRYPTO_T::HMAC_DGST15: DGST Mask */ + +#define CRYPTO_HMAC_KEYCNT_KEYCNT_Pos (0) /*!< CRYPTO_T::HMAC_KEYCNT: KEYCNT Position */ +#define CRYPTO_HMAC_KEYCNT_KEYCNT_Msk (0xfffffffful << CRYPTO_HMAC_KEYCNT_KEYCNT_Pos) /*!< CRYPTO_T::HMAC_KEYCNT: KEYCNT Mask */ + +#define CRYPTO_HMAC_SADDR_SADDR_Pos (0) /*!< CRYPTO_T::HMAC_SADDR: SADDR Position */ +#define CRYPTO_HMAC_SADDR_SADDR_Msk (0xfffffffful << CRYPTO_HMAC_SADDR_SADDR_Pos) /*!< CRYPTO_T::HMAC_SADDR: SADDR Mask */ + +#define CRYPTO_HMAC_DMACNT_DMACNT_Pos (0) /*!< CRYPTO_T::HMAC_DMACNT: DMACNT Position */ +#define CRYPTO_HMAC_DMACNT_DMACNT_Msk (0xfffffffful << CRYPTO_HMAC_DMACNT_DMACNT_Pos) /*!< CRYPTO_T::HMAC_DMACNT: DMACNT Mask */ + +#define CRYPTO_HMAC_DATIN_DATIN_Pos (0) /*!< CRYPTO_T::HMAC_DATIN: DATIN Position */ +#define CRYPTO_HMAC_DATIN_DATIN_Msk (0xfffffffful << CRYPTO_HMAC_DATIN_DATIN_Pos) /*!< CRYPTO_T::HMAC_DATIN: DATIN Mask */ + +#define CRYPTO_HMAC_FDBCK0_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK0: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK0_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK0_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK0: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK1_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK1: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK1_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK1_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK1: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK2_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK2: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK2_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK2_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK2: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK3_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK3: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK3_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK3_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK3: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK4_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK4: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK4_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK4_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK4: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK5_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK5: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK5_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK5_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK5: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK6_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK6: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK6_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK6_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK6: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK7_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK7: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK7_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK7_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK7: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK8_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK8: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK8_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK8_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK8: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK9_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK9: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK9_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK9_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK9: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK10_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK10: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK10_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK10_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK10: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK11_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK11: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK11_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK11_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK11: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK12_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK12: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK12_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK12_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK12: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK13_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK13: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK13_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK13_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK13: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK14_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK14: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK14_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK14_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK14: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK15_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK15: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK15_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK15_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK15: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK16_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK16: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK16_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK16_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK16: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK17_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK17: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK17_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK17_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK17: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK18_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK18: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK18_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK18_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK18: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK19_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK19: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK19_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK19_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK19: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK20_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK20: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK20_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK20_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK20: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK21_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK21: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK21_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK21_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK21: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK22_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK22: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK22_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK22_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK22: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK23_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK23: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK23_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK23_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK23: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK24_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK24: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK24_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK24_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK24: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK25_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK25: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK25_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK25_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK25: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK26_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK26: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK26_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK26_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK26: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK27_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK27: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK27_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK27_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK27: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK28_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK28: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK28_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK28_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK28: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK29_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK29: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK29_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK29_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK29: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK30_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK30: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK30_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK30_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK30: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK31_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK31: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK31_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK31_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK31: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK32_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK32: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK32_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK32_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK32: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK33_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK33: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK33_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK33_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK33: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK34_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK34: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK34_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK34_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK34: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK35_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK35: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK35_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK35_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK35: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK36_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK36: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK36_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK36_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK36: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK37_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK37: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK37_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK37_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK37: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK38_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK38: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK38_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK38_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK38: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK39_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK39: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK39_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK39_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK39: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK40_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK40: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK40_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK40_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK40: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK41_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK41: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK41_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK41_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK41: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK42_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK42: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK42_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK42_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK42: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK43_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK43: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK43_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK43_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK43: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK44_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK44: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK44_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK44_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK44: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK45_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK45: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK45_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK45_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK45: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK46_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK46: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK46_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK46_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK46: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK47_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK47: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK47_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK47_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK47: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK48_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK48: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK48_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK48_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK48: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK49_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK49: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK49_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK49_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK49: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK50_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK50: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK50_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK50_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK50: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK51_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK51: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK51_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK51_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK51: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK52_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK52: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK52_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK52_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK52: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK53_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK53: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK53_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK53_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK53: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK54_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK54: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK54_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK54_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK54: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK55_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK55: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK55_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK55_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK55: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK56_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK56: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK56_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK56_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK56: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK57_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK57: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK57_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK57_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK57: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK58_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK58: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK58_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK58_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK58: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK59_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK59: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK59_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK59_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK59: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK60_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK60: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK60_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK60_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK60: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK61_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK61: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK61_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK61_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK61: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK62_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK62: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK62_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK62_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK62: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK63_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK63: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK63_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK63_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK63: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK64_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK64: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK64_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK64_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK64: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK65_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK65: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK65_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK65_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK65: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK66_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK66: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK66_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK66_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK66: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK67_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK67: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK67_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK67_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK67: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK68_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK68: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK68_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK68_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK68: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK69_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK69: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK69_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK69_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK69: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK70_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK70: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK70_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK70_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK70: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK71_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK71: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK71_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK71_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK71: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK72_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK72: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK72_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK72_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK72: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK73_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK73: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK73_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK73_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK73: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK74_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK74: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK74_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK74_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK74: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK75_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK75: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK75_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK75_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK75: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK76_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK76: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK76_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK76_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK76: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK77_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK77: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK77_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK77_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK77: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK78_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK78: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK78_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK78_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK78: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK79_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK79: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK79_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK79_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK79: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK80_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK80: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK80_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK80_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK80: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK81_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK81: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK81_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK81_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK81: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK82_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK82: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK82_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK82_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK82: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK83_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK83: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK83_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK83_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK83: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK84_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK84: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK84_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK84_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK84: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK85_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK85: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK85_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK85_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK85: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK86_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK86: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK86_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK86_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK86: FDBCK Mask */ + +#define CRYPTO_HMAC_FDBCK87_FDBCK_Pos (0) /*!< CRYPTO_T::HMAC_FDBCK87: FDBCK Position */ +#define CRYPTO_HMAC_FDBCK87_FDBCK_Msk (0xfffffffful << CRYPTO_HMAC_FDBCK87_FDBCK_Pos) /*!< CRYPTO_T::HMAC_FDBCK87: FDBCK Mask */ + +#define CRYPTO_HMAC_SHA512T_SHA512TEN_Pos (0) /*!< CRYPTO_T::HMAC_SHA512T: SHA512TEN Position*/ +#define CRYPTO_HMAC_SHA512T_SHA512TEN_Msk (0x1ul << CRYPTO_HMAC_SHA512T_SHA512TEN_Pos) /*!< CRYPTO_T::HMAC_SHA512T: SHA512TEN Mask */ + +#define CRYPTO_HMAC_SHA512T_TLEN_Pos (8) /*!< CRYPTO_T::HMAC_SHA512T: TLEN Position */ +#define CRYPTO_HMAC_SHA512T_TLEN_Msk (0x1fful << CRYPTO_HMAC_SHA512T_TLEN_Pos) /*!< CRYPTO_T::HMAC_SHA512T: TLEN Mask */ + +#define CRYPTO_HMAC_FBADDR_FBADDR_Pos (0) /*!< CRYPTO_T::HMAC_FBADDR: FBADDR Position */ +#define CRYPTO_HMAC_FBADDR_FBADDR_Msk (0xfffffffful << CRYPTO_HMAC_FBADDR_FBADDR_Pos) /*!< CRYPTO_T::HMAC_FBADDR: FBADDR Mask */ + +#define CRYPTO_HMAC_SHAKEDGST0_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST0: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST0_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST0_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST0: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST1_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST1: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST1_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST1_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST1: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST2_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST2: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST2_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST2_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST2: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST3_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST3: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST3_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST3_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST3: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST4_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST4: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST4_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST4_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST4: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST5_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST5: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST5_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST5_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST5: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST6_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST6: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST6_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST6_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST6: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST7_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST7: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST7_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST7_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST7: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST8_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST8: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST8_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST8_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST8: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST9_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST9: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST9_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST9_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST9: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST10_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST10: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST10_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST10_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST10: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST11_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST11: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST11_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST11_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST11: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST12_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST12: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST12_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST12_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST12: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST13_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST13: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST13_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST13_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST13: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST14_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST14: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST14_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST14_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST14: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST15_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST15: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST15_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST15_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST15: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST16_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST16: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST16_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST16_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST16: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST17_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST17: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST17_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST17_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST17: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST18_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST18: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST18_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST18_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST18: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST19_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST19: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST19_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST19_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST19: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST20_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST20: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST20_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST20_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST20: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST21_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST21: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST21_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST21_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST21: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST22_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST22: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST22_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST22_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST22: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST23_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST23: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST23_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST23_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST23: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST24_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST24: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST24_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST24_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST24: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST25_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST25: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST25_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST25_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST25: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST26_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST26: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST26_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST26_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST26: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST27_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST27: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST27_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST27_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST27: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST28_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST28: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST28_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST28_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST28: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST29_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST29: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST29_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST29_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST29: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST30_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST30: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST30_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST30_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST30: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST31_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST31: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST31_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST31_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST31: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST32_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST32: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST32_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST32_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST32: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST33_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST33: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST33_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST33_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST33: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST34_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST34: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST34_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST34_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST34: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST35_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST35: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST35_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST35_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST35: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST36_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST36: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST36_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST36_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST36: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST37_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST37: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST37_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST37_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST37: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST38_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST38: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST38_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST38_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST38: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST39_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST39: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST39_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST39_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST39: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST40_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST40: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST40_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST40_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST40: DGST Mask */ + +#define CRYPTO_HMAC_SHAKEDGST41_DGST_Pos (0) /*!< CRYPTO_T::HMAC_SHAKEDGST41: DGST Position*/ +#define CRYPTO_HMAC_SHAKEDGST41_DGST_Msk (0xfffffffful << CRYPTO_HMAC_SHAKEDGST41_DGST_Pos) /*!< CRYPTO_T::HMAC_SHAKEDGST41: DGST Mask */ + +#define CRYPTO_ECC_CTL_START_Pos (0) /*!< CRYPTO_T::ECC_CTL: START Position */ +#define CRYPTO_ECC_CTL_START_Msk (0x1ul << CRYPTO_ECC_CTL_START_Pos) /*!< CRYPTO_T::ECC_CTL: START Mask */ + +#define CRYPTO_ECC_CTL_STOP_Pos (1) /*!< CRYPTO_T::ECC_CTL: STOP Position */ +#define CRYPTO_ECC_CTL_STOP_Msk (0x1ul << CRYPTO_ECC_CTL_STOP_Pos) /*!< CRYPTO_T::ECC_CTL: STOP Mask */ + +#define CRYPTO_ECC_CTL_ECDSAS_Pos (4) /*!< CRYPTO_T::ECC_CTL: ECDSAS Position */ +#define CRYPTO_ECC_CTL_ECDSAS_Msk (0x1ul << CRYPTO_ECC_CTL_ECDSAS_Pos) /*!< CRYPTO_T::ECC_CTL: ECDSAS Mask */ + +#define CRYPTO_ECC_CTL_ECDSAR_Pos (5) /*!< CRYPTO_T::ECC_CTL: ECDSAR Position */ +#define CRYPTO_ECC_CTL_ECDSAR_Msk (0x1ul << CRYPTO_ECC_CTL_ECDSAR_Pos) /*!< CRYPTO_T::ECC_CTL: ECDSAR Mask */ + +#define CRYPTO_ECC_CTL_DMAEN_Pos (7) /*!< CRYPTO_T::ECC_CTL: DMAEN Position */ +#define CRYPTO_ECC_CTL_DMAEN_Msk (0x1ul << CRYPTO_ECC_CTL_DMAEN_Pos) /*!< CRYPTO_T::ECC_CTL: DMAEN Mask */ + +#define CRYPTO_ECC_CTL_FSEL_Pos (8) /*!< CRYPTO_T::ECC_CTL: FSEL Position */ +#define CRYPTO_ECC_CTL_FSEL_Msk (0x1ul << CRYPTO_ECC_CTL_FSEL_Pos) /*!< CRYPTO_T::ECC_CTL: FSEL Mask */ + +#define CRYPTO_ECC_CTL_ECCOP_Pos (9) /*!< CRYPTO_T::ECC_CTL: ECCOP Position */ +#define CRYPTO_ECC_CTL_ECCOP_Msk (0x3ul << CRYPTO_ECC_CTL_ECCOP_Pos) /*!< CRYPTO_T::ECC_CTL: ECCOP Mask */ + +#define CRYPTO_ECC_CTL_MODOP_Pos (11) /*!< CRYPTO_T::ECC_CTL: MODOP Position */ +#define CRYPTO_ECC_CTL_MODOP_Msk (0x3ul << CRYPTO_ECC_CTL_MODOP_Pos) /*!< CRYPTO_T::ECC_CTL: MODOP Mask */ + +#define CRYPTO_ECC_CTL_CSEL_Pos (13) /*!< CRYPTO_T::ECC_CTL: CSEL Position */ +#define CRYPTO_ECC_CTL_CSEL_Msk (0x1ul << CRYPTO_ECC_CTL_CSEL_Pos) /*!< CRYPTO_T::ECC_CTL: CSEL Mask */ + +#define CRYPTO_ECC_CTL_SCAP_Pos (14) /*!< CRYPTO_T::ECC_CTL: SCAP Position */ +#define CRYPTO_ECC_CTL_SCAP_Msk (0x1ul << CRYPTO_ECC_CTL_SCAP_Pos) /*!< CRYPTO_T::ECC_CTL: SCAP Mask */ + +#define CRYPTO_ECC_CTL_ASCAP_Pos (15) /*!< CRYPTO_T::ECC_CTL: ASCAP Position */ +#define CRYPTO_ECC_CTL_ASCAP_Msk (0x1ul << CRYPTO_ECC_CTL_ASCAP_Pos) /*!< CRYPTO_T::ECC_CTL: ASCAP Mask */ + +#define CRYPTO_ECC_CTL_LDP1_Pos (16) /*!< CRYPTO_T::ECC_CTL: LDP1 Position */ +#define CRYPTO_ECC_CTL_LDP1_Msk (0x1ul << CRYPTO_ECC_CTL_LDP1_Pos) /*!< CRYPTO_T::ECC_CTL: LDP1 Mask */ + +#define CRYPTO_ECC_CTL_LDP2_Pos (17) /*!< CRYPTO_T::ECC_CTL: LDP2 Position */ +#define CRYPTO_ECC_CTL_LDP2_Msk (0x1ul << CRYPTO_ECC_CTL_LDP2_Pos) /*!< CRYPTO_T::ECC_CTL: LDP2 Mask */ + +#define CRYPTO_ECC_CTL_LDA_Pos (18) /*!< CRYPTO_T::ECC_CTL: LDA Position */ +#define CRYPTO_ECC_CTL_LDA_Msk (0x1ul << CRYPTO_ECC_CTL_LDA_Pos) /*!< CRYPTO_T::ECC_CTL: LDA Mask */ + +#define CRYPTO_ECC_CTL_LDB_Pos (19) /*!< CRYPTO_T::ECC_CTL: LDB Position */ +#define CRYPTO_ECC_CTL_LDB_Msk (0x1ul << CRYPTO_ECC_CTL_LDB_Pos) /*!< CRYPTO_T::ECC_CTL: LDB Mask */ + +#define CRYPTO_ECC_CTL_LDN_Pos (20) /*!< CRYPTO_T::ECC_CTL: LDN Position */ +#define CRYPTO_ECC_CTL_LDN_Msk (0x1ul << CRYPTO_ECC_CTL_LDN_Pos) /*!< CRYPTO_T::ECC_CTL: LDN Mask */ + +#define CRYPTO_ECC_CTL_LDK_Pos (21) /*!< CRYPTO_T::ECC_CTL: LDK Position */ +#define CRYPTO_ECC_CTL_LDK_Msk (0x1ul << CRYPTO_ECC_CTL_LDK_Pos) /*!< CRYPTO_T::ECC_CTL: LDK Mask */ + +#define CRYPTO_ECC_CTL_CURVEM_Pos (22) /*!< CRYPTO_T::ECC_CTL: CURVEM Position */ +#define CRYPTO_ECC_CTL_CURVEM_Msk (0x3fful << CRYPTO_ECC_CTL_CURVEM_Pos) /*!< CRYPTO_T::ECC_CTL: CURVEM Mask */ + +#define CRYPTO_ECC_STS_BUSY_Pos (0) /*!< CRYPTO_T::ECC_STS: BUSY Position */ +#define CRYPTO_ECC_STS_BUSY_Msk (0x1ul << CRYPTO_ECC_STS_BUSY_Pos) /*!< CRYPTO_T::ECC_STS: BUSY Mask */ + +#define CRYPTO_ECC_STS_DMABUSY_Pos (1) /*!< CRYPTO_T::ECC_STS: DMABUSY Position */ +#define CRYPTO_ECC_STS_DMABUSY_Msk (0x1ul << CRYPTO_ECC_STS_DMABUSY_Pos) /*!< CRYPTO_T::ECC_STS: DMABUSY Mask */ + +#define CRYPTO_ECC_STS_BUSERR_Pos (16) /*!< CRYPTO_T::ECC_STS: BUSERR Position */ +#define CRYPTO_ECC_STS_BUSERR_Msk (0x1ul << CRYPTO_ECC_STS_BUSERR_Pos) /*!< CRYPTO_T::ECC_STS: BUSERR Mask */ + +#define CRYPTO_ECC_STS_KSERR_Pos (17) /*!< CRYPTO_T::ECC_STS: KSERR Position */ +#define CRYPTO_ECC_STS_KSERR_Msk (0x1ul << CRYPTO_ECC_STS_KSERR_Pos) /*!< CRYPTO_T::ECC_STS: KSERR Mask */ + +#define CRYPTO_ECC_STS_DFAERR_Pos (18) /*!< CRYPTO_T::ECC_STS: DFAERR Position */ +#define CRYPTO_ECC_STS_DFAERR_Msk (0x1ul << CRYPTO_ECC_STS_DFAERR_Pos) /*!< CRYPTO_T::ECC_STS: DFAERR Mask */ + +#define CRYPTO_ECC_X1_00_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_00: POINTX1 Position */ +#define CRYPTO_ECC_X1_00_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_00_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_00: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_01_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_01: POINTX1 Position */ +#define CRYPTO_ECC_X1_01_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_01_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_01: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_02_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_02: POINTX1 Position */ +#define CRYPTO_ECC_X1_02_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_02_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_02: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_03_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_03: POINTX1 Position */ +#define CRYPTO_ECC_X1_03_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_03_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_03: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_04_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_04: POINTX1 Position */ +#define CRYPTO_ECC_X1_04_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_04_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_04: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_05_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_05: POINTX1 Position */ +#define CRYPTO_ECC_X1_05_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_05_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_05: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_06_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_06: POINTX1 Position */ +#define CRYPTO_ECC_X1_06_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_06_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_06: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_07_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_07: POINTX1 Position */ +#define CRYPTO_ECC_X1_07_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_07_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_07: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_08_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_08: POINTX1 Position */ +#define CRYPTO_ECC_X1_08_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_08_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_08: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_09_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_09: POINTX1 Position */ +#define CRYPTO_ECC_X1_09_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_09_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_09: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_10_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_10: POINTX1 Position */ +#define CRYPTO_ECC_X1_10_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_10_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_10: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_11_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_11: POINTX1 Position */ +#define CRYPTO_ECC_X1_11_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_11_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_11: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_12_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_12: POINTX1 Position */ +#define CRYPTO_ECC_X1_12_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_12_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_12: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_13_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_13: POINTX1 Position */ +#define CRYPTO_ECC_X1_13_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_13_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_13: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_14_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_14: POINTX1 Position */ +#define CRYPTO_ECC_X1_14_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_14_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_14: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_15_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_15: POINTX1 Position */ +#define CRYPTO_ECC_X1_15_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_15_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_15: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_16_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_16: POINTX1 Position */ +#define CRYPTO_ECC_X1_16_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_16_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_16: POINTX1 Mask */ + +#define CRYPTO_ECC_X1_17_POINTX1_Pos (0) /*!< CRYPTO_T::ECC_X1_17: POINTX1 Position */ +#define CRYPTO_ECC_X1_17_POINTX1_Msk (0xfffffffful << CRYPTO_ECC_X1_17_POINTX1_Pos) /*!< CRYPTO_T::ECC_X1_17: POINTX1 Mask */ + +#define CRYPTO_ECC_Y1_00_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_00: POINTY1 Position */ +#define CRYPTO_ECC_Y1_00_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_00_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_00: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_01_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_01: POINTY1 Position */ +#define CRYPTO_ECC_Y1_01_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_01_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_01: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_02_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_02: POINTY1 Position */ +#define CRYPTO_ECC_Y1_02_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_02_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_02: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_03_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_03: POINTY1 Position */ +#define CRYPTO_ECC_Y1_03_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_03_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_03: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_04_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_04: POINTY1 Position */ +#define CRYPTO_ECC_Y1_04_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_04_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_04: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_05_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_05: POINTY1 Position */ +#define CRYPTO_ECC_Y1_05_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_05_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_05: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_06_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_06: POINTY1 Position */ +#define CRYPTO_ECC_Y1_06_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_06_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_06: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_07_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_07: POINTY1 Position */ +#define CRYPTO_ECC_Y1_07_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_07_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_07: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_08_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_08: POINTY1 Position */ +#define CRYPTO_ECC_Y1_08_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_08_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_08: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_09_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_09: POINTY1 Position */ +#define CRYPTO_ECC_Y1_09_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_09_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_09: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_10_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_10: POINTY1 Position */ +#define CRYPTO_ECC_Y1_10_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_10_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_10: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_11_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_11: POINTY1 Position */ +#define CRYPTO_ECC_Y1_11_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_11_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_11: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_12_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_12: POINTY1 Position */ +#define CRYPTO_ECC_Y1_12_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_12_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_12: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_13_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_13: POINTY1 Position */ +#define CRYPTO_ECC_Y1_13_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_13_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_13: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_14_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_14: POINTY1 Position */ +#define CRYPTO_ECC_Y1_14_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_14_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_14: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_15_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_15: POINTY1 Position */ +#define CRYPTO_ECC_Y1_15_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_15_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_15: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_16_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_16: POINTY1 Position */ +#define CRYPTO_ECC_Y1_16_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_16_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_16: POINTY1 Mask */ + +#define CRYPTO_ECC_Y1_17_POINTY1_Pos (0) /*!< CRYPTO_T::ECC_Y1_17: POINTY1 Position */ +#define CRYPTO_ECC_Y1_17_POINTY1_Msk (0xfffffffful << CRYPTO_ECC_Y1_17_POINTY1_Pos) /*!< CRYPTO_T::ECC_Y1_17: POINTY1 Mask */ + +#define CRYPTO_ECC_X2_00_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_00: POINTX2 Position */ +#define CRYPTO_ECC_X2_00_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_00_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_00: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_01_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_01: POINTX2 Position */ +#define CRYPTO_ECC_X2_01_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_01_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_01: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_02_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_02: POINTX2 Position */ +#define CRYPTO_ECC_X2_02_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_02_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_02: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_03_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_03: POINTX2 Position */ +#define CRYPTO_ECC_X2_03_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_03_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_03: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_04_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_04: POINTX2 Position */ +#define CRYPTO_ECC_X2_04_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_04_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_04: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_05_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_05: POINTX2 Position */ +#define CRYPTO_ECC_X2_05_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_05_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_05: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_06_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_06: POINTX2 Position */ +#define CRYPTO_ECC_X2_06_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_06_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_06: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_07_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_07: POINTX2 Position */ +#define CRYPTO_ECC_X2_07_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_07_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_07: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_08_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_08: POINTX2 Position */ +#define CRYPTO_ECC_X2_08_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_08_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_08: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_09_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_09: POINTX2 Position */ +#define CRYPTO_ECC_X2_09_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_09_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_09: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_10_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_10: POINTX2 Position */ +#define CRYPTO_ECC_X2_10_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_10_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_10: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_11_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_11: POINTX2 Position */ +#define CRYPTO_ECC_X2_11_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_11_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_11: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_12_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_12: POINTX2 Position */ +#define CRYPTO_ECC_X2_12_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_12_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_12: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_13_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_13: POINTX2 Position */ +#define CRYPTO_ECC_X2_13_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_13_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_13: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_14_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_14: POINTX2 Position */ +#define CRYPTO_ECC_X2_14_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_14_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_14: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_15_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_15: POINTX2 Position */ +#define CRYPTO_ECC_X2_15_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_15_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_15: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_16_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_16: POINTX2 Position */ +#define CRYPTO_ECC_X2_16_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_16_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_16: POINTX2 Mask */ + +#define CRYPTO_ECC_X2_17_POINTX2_Pos (0) /*!< CRYPTO_T::ECC_X2_17: POINTX2 Position */ +#define CRYPTO_ECC_X2_17_POINTX2_Msk (0xfffffffful << CRYPTO_ECC_X2_17_POINTX2_Pos) /*!< CRYPTO_T::ECC_X2_17: POINTX2 Mask */ + +#define CRYPTO_ECC_Y2_00_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_00: POINTY2 Position */ +#define CRYPTO_ECC_Y2_00_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_00_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_00: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_01_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_01: POINTY2 Position */ +#define CRYPTO_ECC_Y2_01_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_01_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_01: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_02_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_02: POINTY2 Position */ +#define CRYPTO_ECC_Y2_02_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_02_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_02: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_03_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_03: POINTY2 Position */ +#define CRYPTO_ECC_Y2_03_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_03_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_03: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_04_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_04: POINTY2 Position */ +#define CRYPTO_ECC_Y2_04_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_04_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_04: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_05_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_05: POINTY2 Position */ +#define CRYPTO_ECC_Y2_05_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_05_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_05: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_06_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_06: POINTY2 Position */ +#define CRYPTO_ECC_Y2_06_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_06_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_06: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_07_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_07: POINTY2 Position */ +#define CRYPTO_ECC_Y2_07_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_07_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_07: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_08_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_08: POINTY2 Position */ +#define CRYPTO_ECC_Y2_08_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_08_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_08: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_09_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_09: POINTY2 Position */ +#define CRYPTO_ECC_Y2_09_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_09_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_09: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_10_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_10: POINTY2 Position */ +#define CRYPTO_ECC_Y2_10_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_10_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_10: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_11_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_11: POINTY2 Position */ +#define CRYPTO_ECC_Y2_11_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_11_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_11: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_12_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_12: POINTY2 Position */ +#define CRYPTO_ECC_Y2_12_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_12_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_12: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_13_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_13: POINTY2 Position */ +#define CRYPTO_ECC_Y2_13_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_13_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_13: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_14_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_14: POINTY2 Position */ +#define CRYPTO_ECC_Y2_14_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_14_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_14: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_15_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_15: POINTY2 Position */ +#define CRYPTO_ECC_Y2_15_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_15_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_15: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_16_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_16: POINTY2 Position */ +#define CRYPTO_ECC_Y2_16_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_16_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_16: POINTY2 Mask */ + +#define CRYPTO_ECC_Y2_17_POINTY2_Pos (0) /*!< CRYPTO_T::ECC_Y2_17: POINTY2 Position */ +#define CRYPTO_ECC_Y2_17_POINTY2_Msk (0xfffffffful << CRYPTO_ECC_Y2_17_POINTY2_Pos) /*!< CRYPTO_T::ECC_Y2_17: POINTY2 Mask */ + +#define CRYPTO_ECC_A_00_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_00: CURVEA Position */ +#define CRYPTO_ECC_A_00_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_00_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_00: CURVEA Mask */ + +#define CRYPTO_ECC_A_01_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_01: CURVEA Position */ +#define CRYPTO_ECC_A_01_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_01_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_01: CURVEA Mask */ + +#define CRYPTO_ECC_A_02_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_02: CURVEA Position */ +#define CRYPTO_ECC_A_02_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_02_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_02: CURVEA Mask */ + +#define CRYPTO_ECC_A_03_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_03: CURVEA Position */ +#define CRYPTO_ECC_A_03_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_03_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_03: CURVEA Mask */ + +#define CRYPTO_ECC_A_04_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_04: CURVEA Position */ +#define CRYPTO_ECC_A_04_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_04_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_04: CURVEA Mask */ + +#define CRYPTO_ECC_A_05_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_05: CURVEA Position */ +#define CRYPTO_ECC_A_05_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_05_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_05: CURVEA Mask */ + +#define CRYPTO_ECC_A_06_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_06: CURVEA Position */ +#define CRYPTO_ECC_A_06_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_06_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_06: CURVEA Mask */ + +#define CRYPTO_ECC_A_07_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_07: CURVEA Position */ +#define CRYPTO_ECC_A_07_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_07_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_07: CURVEA Mask */ + +#define CRYPTO_ECC_A_08_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_08: CURVEA Position */ +#define CRYPTO_ECC_A_08_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_08_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_08: CURVEA Mask */ + +#define CRYPTO_ECC_A_09_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_09: CURVEA Position */ +#define CRYPTO_ECC_A_09_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_09_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_09: CURVEA Mask */ + +#define CRYPTO_ECC_A_10_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_10: CURVEA Position */ +#define CRYPTO_ECC_A_10_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_10_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_10: CURVEA Mask */ + +#define CRYPTO_ECC_A_11_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_11: CURVEA Position */ +#define CRYPTO_ECC_A_11_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_11_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_11: CURVEA Mask */ + +#define CRYPTO_ECC_A_12_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_12: CURVEA Position */ +#define CRYPTO_ECC_A_12_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_12_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_12: CURVEA Mask */ + +#define CRYPTO_ECC_A_13_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_13: CURVEA Position */ +#define CRYPTO_ECC_A_13_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_13_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_13: CURVEA Mask */ + +#define CRYPTO_ECC_A_14_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_14: CURVEA Position */ +#define CRYPTO_ECC_A_14_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_14_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_14: CURVEA Mask */ + +#define CRYPTO_ECC_A_15_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_15: CURVEA Position */ +#define CRYPTO_ECC_A_15_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_15_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_15: CURVEA Mask */ + +#define CRYPTO_ECC_A_16_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_16: CURVEA Position */ +#define CRYPTO_ECC_A_16_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_16_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_16: CURVEA Mask */ + +#define CRYPTO_ECC_A_17_CURVEA_Pos (0) /*!< CRYPTO_T::ECC_A_17: CURVEA Position */ +#define CRYPTO_ECC_A_17_CURVEA_Msk (0xfffffffful << CRYPTO_ECC_A_17_CURVEA_Pos) /*!< CRYPTO_T::ECC_A_17: CURVEA Mask */ + +#define CRYPTO_ECC_B_00_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_00: CURVEB Position */ +#define CRYPTO_ECC_B_00_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_00_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_00: CURVEB Mask */ + +#define CRYPTO_ECC_B_01_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_01: CURVEB Position */ +#define CRYPTO_ECC_B_01_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_01_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_01: CURVEB Mask */ + +#define CRYPTO_ECC_B_02_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_02: CURVEB Position */ +#define CRYPTO_ECC_B_02_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_02_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_02: CURVEB Mask */ + +#define CRYPTO_ECC_B_03_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_03: CURVEB Position */ +#define CRYPTO_ECC_B_03_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_03_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_03: CURVEB Mask */ + +#define CRYPTO_ECC_B_04_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_04: CURVEB Position */ +#define CRYPTO_ECC_B_04_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_04_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_04: CURVEB Mask */ + +#define CRYPTO_ECC_B_05_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_05: CURVEB Position */ +#define CRYPTO_ECC_B_05_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_05_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_05: CURVEB Mask */ + +#define CRYPTO_ECC_B_06_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_06: CURVEB Position */ +#define CRYPTO_ECC_B_06_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_06_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_06: CURVEB Mask */ + +#define CRYPTO_ECC_B_07_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_07: CURVEB Position */ +#define CRYPTO_ECC_B_07_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_07_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_07: CURVEB Mask */ + +#define CRYPTO_ECC_B_08_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_08: CURVEB Position */ +#define CRYPTO_ECC_B_08_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_08_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_08: CURVEB Mask */ + +#define CRYPTO_ECC_B_09_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_09: CURVEB Position */ +#define CRYPTO_ECC_B_09_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_09_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_09: CURVEB Mask */ + +#define CRYPTO_ECC_B_10_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_10: CURVEB Position */ +#define CRYPTO_ECC_B_10_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_10_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_10: CURVEB Mask */ + +#define CRYPTO_ECC_B_11_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_11: CURVEB Position */ +#define CRYPTO_ECC_B_11_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_11_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_11: CURVEB Mask */ + +#define CRYPTO_ECC_B_12_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_12: CURVEB Position */ +#define CRYPTO_ECC_B_12_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_12_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_12: CURVEB Mask */ + +#define CRYPTO_ECC_B_13_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_13: CURVEB Position */ +#define CRYPTO_ECC_B_13_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_13_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_13: CURVEB Mask */ + +#define CRYPTO_ECC_B_14_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_14: CURVEB Position */ +#define CRYPTO_ECC_B_14_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_14_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_14: CURVEB Mask */ + +#define CRYPTO_ECC_B_15_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_15: CURVEB Position */ +#define CRYPTO_ECC_B_15_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_15_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_15: CURVEB Mask */ + +#define CRYPTO_ECC_B_16_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_16: CURVEB Position */ +#define CRYPTO_ECC_B_16_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_16_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_16: CURVEB Mask */ + +#define CRYPTO_ECC_B_17_CURVEB_Pos (0) /*!< CRYPTO_T::ECC_B_17: CURVEB Position */ +#define CRYPTO_ECC_B_17_CURVEB_Msk (0xfffffffful << CRYPTO_ECC_B_17_CURVEB_Pos) /*!< CRYPTO_T::ECC_B_17: CURVEB Mask */ + +#define CRYPTO_ECC_N_00_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_00: CURVEN Position */ +#define CRYPTO_ECC_N_00_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_00_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_00: CURVEN Mask */ + +#define CRYPTO_ECC_N_01_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_01: CURVEN Position */ +#define CRYPTO_ECC_N_01_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_01_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_01: CURVEN Mask */ + +#define CRYPTO_ECC_N_02_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_02: CURVEN Position */ +#define CRYPTO_ECC_N_02_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_02_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_02: CURVEN Mask */ + +#define CRYPTO_ECC_N_03_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_03: CURVEN Position */ +#define CRYPTO_ECC_N_03_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_03_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_03: CURVEN Mask */ + +#define CRYPTO_ECC_N_04_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_04: CURVEN Position */ +#define CRYPTO_ECC_N_04_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_04_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_04: CURVEN Mask */ + +#define CRYPTO_ECC_N_05_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_05: CURVEN Position */ +#define CRYPTO_ECC_N_05_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_05_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_05: CURVEN Mask */ + +#define CRYPTO_ECC_N_06_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_06: CURVEN Position */ +#define CRYPTO_ECC_N_06_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_06_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_06: CURVEN Mask */ + +#define CRYPTO_ECC_N_07_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_07: CURVEN Position */ +#define CRYPTO_ECC_N_07_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_07_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_07: CURVEN Mask */ + +#define CRYPTO_ECC_N_08_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_08: CURVEN Position */ +#define CRYPTO_ECC_N_08_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_08_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_08: CURVEN Mask */ + +#define CRYPTO_ECC_N_09_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_09: CURVEN Position */ +#define CRYPTO_ECC_N_09_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_09_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_09: CURVEN Mask */ + +#define CRYPTO_ECC_N_10_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_10: CURVEN Position */ +#define CRYPTO_ECC_N_10_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_10_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_10: CURVEN Mask */ + +#define CRYPTO_ECC_N_11_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_11: CURVEN Position */ +#define CRYPTO_ECC_N_11_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_11_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_11: CURVEN Mask */ + +#define CRYPTO_ECC_N_12_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_12: CURVEN Position */ +#define CRYPTO_ECC_N_12_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_12_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_12: CURVEN Mask */ + +#define CRYPTO_ECC_N_13_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_13: CURVEN Position */ +#define CRYPTO_ECC_N_13_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_13_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_13: CURVEN Mask */ + +#define CRYPTO_ECC_N_14_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_14: CURVEN Position */ +#define CRYPTO_ECC_N_14_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_14_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_14: CURVEN Mask */ + +#define CRYPTO_ECC_N_15_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_15: CURVEN Position */ +#define CRYPTO_ECC_N_15_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_15_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_15: CURVEN Mask */ + +#define CRYPTO_ECC_N_16_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_16: CURVEN Position */ +#define CRYPTO_ECC_N_16_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_16_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_16: CURVEN Mask */ + +#define CRYPTO_ECC_N_17_CURVEN_Pos (0) /*!< CRYPTO_T::ECC_N_17: CURVEN Position */ +#define CRYPTO_ECC_N_17_CURVEN_Msk (0xfffffffful << CRYPTO_ECC_N_17_CURVEN_Pos) /*!< CRYPTO_T::ECC_N_17: CURVEN Mask */ + +#define CRYPTO_ECC_K_00_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_00: SCALARK Position */ +#define CRYPTO_ECC_K_00_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_00_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_00: SCALARK Mask */ + +#define CRYPTO_ECC_K_01_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_01: SCALARK Position */ +#define CRYPTO_ECC_K_01_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_01_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_01: SCALARK Mask */ + +#define CRYPTO_ECC_K_02_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_02: SCALARK Position */ +#define CRYPTO_ECC_K_02_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_02_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_02: SCALARK Mask */ + +#define CRYPTO_ECC_K_03_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_03: SCALARK Position */ +#define CRYPTO_ECC_K_03_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_03_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_03: SCALARK Mask */ + +#define CRYPTO_ECC_K_04_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_04: SCALARK Position */ +#define CRYPTO_ECC_K_04_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_04_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_04: SCALARK Mask */ + +#define CRYPTO_ECC_K_05_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_05: SCALARK Position */ +#define CRYPTO_ECC_K_05_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_05_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_05: SCALARK Mask */ + +#define CRYPTO_ECC_K_06_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_06: SCALARK Position */ +#define CRYPTO_ECC_K_06_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_06_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_06: SCALARK Mask */ + +#define CRYPTO_ECC_K_07_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_07: SCALARK Position */ +#define CRYPTO_ECC_K_07_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_07_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_07: SCALARK Mask */ + +#define CRYPTO_ECC_K_08_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_08: SCALARK Position */ +#define CRYPTO_ECC_K_08_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_08_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_08: SCALARK Mask */ + +#define CRYPTO_ECC_K_09_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_09: SCALARK Position */ +#define CRYPTO_ECC_K_09_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_09_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_09: SCALARK Mask */ + +#define CRYPTO_ECC_K_10_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_10: SCALARK Position */ +#define CRYPTO_ECC_K_10_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_10_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_10: SCALARK Mask */ + +#define CRYPTO_ECC_K_11_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_11: SCALARK Position */ +#define CRYPTO_ECC_K_11_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_11_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_11: SCALARK Mask */ + +#define CRYPTO_ECC_K_12_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_12: SCALARK Position */ +#define CRYPTO_ECC_K_12_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_12_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_12: SCALARK Mask */ + +#define CRYPTO_ECC_K_13_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_13: SCALARK Position */ +#define CRYPTO_ECC_K_13_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_13_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_13: SCALARK Mask */ + +#define CRYPTO_ECC_K_14_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_14: SCALARK Position */ +#define CRYPTO_ECC_K_14_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_14_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_14: SCALARK Mask */ + +#define CRYPTO_ECC_K_15_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_15: SCALARK Position */ +#define CRYPTO_ECC_K_15_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_15_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_15: SCALARK Mask */ + +#define CRYPTO_ECC_K_16_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_16: SCALARK Position */ +#define CRYPTO_ECC_K_16_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_16_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_16: SCALARK Mask */ + +#define CRYPTO_ECC_K_17_SCALARK_Pos (0) /*!< CRYPTO_T::ECC_K_17: SCALARK Position */ +#define CRYPTO_ECC_K_17_SCALARK_Msk (0xfffffffful << CRYPTO_ECC_K_17_SCALARK_Pos) /*!< CRYPTO_T::ECC_K_17: SCALARK Mask */ + +#define CRYPTO_ECC_DADDR_DADDR_Pos (0) /*!< CRYPTO_T::ECC_DADDR: DADDR Position */ +#define CRYPTO_ECC_DADDR_DADDR_Msk (0xfffffffful << CRYPTO_ECC_DADDR_DADDR_Pos) /*!< CRYPTO_T::ECC_DADDR: DADDR Mask */ + +#define CRYPTO_ECC_STARTREG_STARTREG_Pos (0) /*!< CRYPTO_T::ECC_STARTREG: STARTREG Position*/ +#define CRYPTO_ECC_STARTREG_STARTREG_Msk (0xfffffffful << CRYPTO_ECC_STARTREG_STARTREG_Pos) /*!< CRYPTO_T::ECC_STARTREG: STARTREG Mask */ + +#define CRYPTO_ECC_WORDCNT_WORDCNT_Pos (0) /*!< CRYPTO_T::ECC_WORDCNT: WORDCNT Position*/ +#define CRYPTO_ECC_WORDCNT_WORDCNT_Msk (0xfffffffful << CRYPTO_ECC_WORDCNT_WORDCNT_Pos) /*!< CRYPTO_T::ECC_WORDCNT: WORDCNT Mask */ + +#define CRYPTO_RSA_CTL_START_Pos (0) /*!< CRYPTO_T::RSA_CTL: START Position */ +#define CRYPTO_RSA_CTL_START_Msk (0x1ul << CRYPTO_RSA_CTL_START_Pos) /*!< CRYPTO_T::RSA_CTL: START Mask */ + +#define CRYPTO_RSA_CTL_STOP_Pos (1) /*!< CRYPTO_T::RSA_CTL: STOP Position */ +#define CRYPTO_RSA_CTL_STOP_Msk (0x1ul << CRYPTO_RSA_CTL_STOP_Pos) /*!< CRYPTO_T::RSA_CTL: STOP Mask */ + +#define CRYPTO_RSA_CTL_CRT_Pos (2) /*!< CRYPTO_T::RSA_CTL: CRT Position */ +#define CRYPTO_RSA_CTL_CRT_Msk (0x1ul << CRYPTO_RSA_CTL_CRT_Pos) /*!< CRYPTO_T::RSA_CTL: CRT Mask */ + +#define CRYPTO_RSA_CTL_CRTBYP_Pos (3) /*!< CRYPTO_T::RSA_CTL: CRTBYP Position */ +#define CRYPTO_RSA_CTL_CRTBYP_Msk (0x1ul << CRYPTO_RSA_CTL_CRTBYP_Pos) /*!< CRYPTO_T::RSA_CTL: CRTBYP Mask */ + +#define CRYPTO_RSA_CTL_KEYLENG_Pos (4) /*!< CRYPTO_T::RSA_CTL: KEYLENG Position */ +#define CRYPTO_RSA_CTL_KEYLENG_Msk (0x3ul << CRYPTO_RSA_CTL_KEYLENG_Pos) /*!< CRYPTO_T::RSA_CTL: KEYLENG Mask */ + +#define CRYPTO_RSA_CTL_SCAP_Pos (8) /*!< CRYPTO_T::RSA_CTL: SCAP Position */ +#define CRYPTO_RSA_CTL_SCAP_Msk (0x1ul << CRYPTO_RSA_CTL_SCAP_Pos) /*!< CRYPTO_T::RSA_CTL: SCAP Mask */ + +#define CRYPTO_RSA_STS_BUSY_Pos (0) /*!< CRYPTO_T::RSA_STS: BUSY Position */ +#define CRYPTO_RSA_STS_BUSY_Msk (0x1ul << CRYPTO_RSA_STS_BUSY_Pos) /*!< CRYPTO_T::RSA_STS: BUSY Mask */ + +#define CRYPTO_RSA_STS_DMABUSY_Pos (1) /*!< CRYPTO_T::RSA_STS: DMABUSY Position */ +#define CRYPTO_RSA_STS_DMABUSY_Msk (0x1ul << CRYPTO_RSA_STS_DMABUSY_Pos) /*!< CRYPTO_T::RSA_STS: DMABUSY Mask */ + +#define CRYPTO_RSA_STS_BUSERR_Pos (16) /*!< CRYPTO_T::RSA_STS: BUSERR Position */ +#define CRYPTO_RSA_STS_BUSERR_Msk (0x1ul << CRYPTO_RSA_STS_BUSERR_Pos) /*!< CRYPTO_T::RSA_STS: BUSERR Mask */ + +#define CRYPTO_RSA_STS_CTLERR_Pos (17) /*!< CRYPTO_T::RSA_STS: CTLERR Position */ +#define CRYPTO_RSA_STS_CTLERR_Msk (0x1ul << CRYPTO_RSA_STS_CTLERR_Pos) /*!< CRYPTO_T::RSA_STS: CTLERR Mask */ + +#define CRYPTO_RSA_STS_KSERR_Pos (18) /*!< CRYPTO_T::RSA_STS: KSERR Position */ +#define CRYPTO_RSA_STS_KSERR_Msk (0x1ul << CRYPTO_RSA_STS_KSERR_Pos) /*!< CRYPTO_T::RSA_STS: KSERR Mask */ + +#define CRYPTO_RSA_SADDR0_SADDR0_Pos (0) /*!< CRYPTO_T::RSA_SADDR0: SADDR0 Position */ +#define CRYPTO_RSA_SADDR0_SADDR0_Msk (0xfffffffful << CRYPTO_RSA_SADDR0_SADDR0_Pos) /*!< CRYPTO_T::RSA_SADDR0: SADDR0 Mask */ + +#define CRYPTO_RSA_SADDR1_SADDR1_Pos (0) /*!< CRYPTO_T::RSA_SADDR1: SADDR1 Position */ +#define CRYPTO_RSA_SADDR1_SADDR1_Msk (0xfffffffful << CRYPTO_RSA_SADDR1_SADDR1_Pos) /*!< CRYPTO_T::RSA_SADDR1: SADDR1 Mask */ + +#define CRYPTO_RSA_SADDR2_SADDR2_Pos (0) /*!< CRYPTO_T::RSA_SADDR2: SADDR2 Position */ +#define CRYPTO_RSA_SADDR2_SADDR2_Msk (0xfffffffful << CRYPTO_RSA_SADDR2_SADDR2_Pos) /*!< CRYPTO_T::RSA_SADDR2: SADDR2 Mask */ + +#define CRYPTO_RSA_SADDR3_SADDR3_Pos (0) /*!< CRYPTO_T::RSA_SADDR3: SADDR3 Position */ +#define CRYPTO_RSA_SADDR3_SADDR3_Msk (0xfffffffful << CRYPTO_RSA_SADDR3_SADDR3_Pos) /*!< CRYPTO_T::RSA_SADDR3: SADDR3 Mask */ + +#define CRYPTO_RSA_SADDR4_SADDR4_Pos (0) /*!< CRYPTO_T::RSA_SADDR4: SADDR4 Position */ +#define CRYPTO_RSA_SADDR4_SADDR4_Msk (0xfffffffful << CRYPTO_RSA_SADDR4_SADDR4_Pos) /*!< CRYPTO_T::RSA_SADDR4: SADDR4 Mask */ + +#define CRYPTO_RSA_DADDR_DADDR_Pos (0) /*!< CRYPTO_T::RSA_DADDR: DADDR Position */ +#define CRYPTO_RSA_DADDR_DADDR_Msk (0xfffffffful << CRYPTO_RSA_DADDR_DADDR_Pos) /*!< CRYPTO_T::RSA_DADDR: DADDR Mask */ + +#define CRYPTO_RSA_MADDR0_MADDR0_Pos (0) /*!< CRYPTO_T::RSA_MADDR0: MADDR0 Position */ +#define CRYPTO_RSA_MADDR0_MADDR0_Msk (0xfffffffful << CRYPTO_RSA_MADDR0_MADDR0_Pos) /*!< CRYPTO_T::RSA_MADDR0: MADDR0 Mask */ + +#define CRYPTO_RSA_MADDR1_MADDR1_Pos (0) /*!< CRYPTO_T::RSA_MADDR1: MADDR1 Position */ +#define CRYPTO_RSA_MADDR1_MADDR1_Msk (0xfffffffful << CRYPTO_RSA_MADDR1_MADDR1_Pos) /*!< CRYPTO_T::RSA_MADDR1: MADDR1 Mask */ + +#define CRYPTO_RSA_MADDR2_MADDR2_Pos (0) /*!< CRYPTO_T::RSA_MADDR2: MADDR2 Position */ +#define CRYPTO_RSA_MADDR2_MADDR2_Msk (0xfffffffful << CRYPTO_RSA_MADDR2_MADDR2_Pos) /*!< CRYPTO_T::RSA_MADDR2: MADDR2 Mask */ + +#define CRYPTO_RSA_MADDR3_MADDR3_Pos (0) /*!< CRYPTO_T::RSA_MADDR3: MADDR3 Position */ +#define CRYPTO_RSA_MADDR3_MADDR3_Msk (0xfffffffful << CRYPTO_RSA_MADDR3_MADDR3_Pos) /*!< CRYPTO_T::RSA_MADDR3: MADDR3 Mask */ + +#define CRYPTO_RSA_MADDR4_MADDR4_Pos (0) /*!< CRYPTO_T::RSA_MADDR4: MADDR4 Position */ +#define CRYPTO_RSA_MADDR4_MADDR4_Msk (0xfffffffful << CRYPTO_RSA_MADDR4_MADDR4_Pos) /*!< CRYPTO_T::RSA_MADDR4: MADDR4 Mask */ + +#define CRYPTO_RSA_MADDR5_MADDR5_Pos (0) /*!< CRYPTO_T::RSA_MADDR5: MADDR5 Position */ +#define CRYPTO_RSA_MADDR5_MADDR5_Msk (0xfffffffful << CRYPTO_RSA_MADDR5_MADDR5_Pos) /*!< CRYPTO_T::RSA_MADDR5: MADDR5 Mask */ + +#define CRYPTO_RSA_MADDR6_MADDR6_Pos (0) /*!< CRYPTO_T::RSA_MADDR6: MADDR6 Position */ +#define CRYPTO_RSA_MADDR6_MADDR6_Msk (0xfffffffful << CRYPTO_RSA_MADDR6_MADDR6_Pos) /*!< CRYPTO_T::RSA_MADDR6: MADDR6 Mask */ + +#define CRYPTO_PRNG_KSCTL_NUM_Pos (0) /*!< CRYPTO_T::PRNG_KSCTL: NUM Position */ +#define CRYPTO_PRNG_KSCTL_NUM_Msk (0x1ful << CRYPTO_PRNG_KSCTL_NUM_Pos) /*!< CRYPTO_T::PRNG_KSCTL: NUM Mask */ + +#define CRYPTO_PRNG_KSCTL_KEYSRC_Pos (8) /*!< CRYPTO_T::PRNG_KSCTL: KEYSRC Position */ +#define CRYPTO_PRNG_KSCTL_KEYSRC_Msk (0x1ul << CRYPTO_PRNG_KSCTL_KEYSRC_Pos) /*!< CRYPTO_T::PRNG_KSCTL: KEYSRC Mask */ + +#define CRYPTO_PRNG_KSCTL_TRUST_Pos (16) /*!< CRYPTO_T::PRNG_KSCTL: TRUST Position */ +#define CRYPTO_PRNG_KSCTL_TRUST_Msk (0x1ul << CRYPTO_PRNG_KSCTL_TRUST_Pos) /*!< CRYPTO_T::PRNG_KSCTL: TRUST Mask */ + +#define CRYPTO_PRNG_KSCTL_ECDH_Pos (19) /*!< CRYPTO_T::PRNG_KSCTL: ECDH Position */ +#define CRYPTO_PRNG_KSCTL_ECDH_Msk (0x1ul << CRYPTO_PRNG_KSCTL_ECDH_Pos) /*!< CRYPTO_T::PRNG_KSCTL: ECDH Mask */ + +#define CRYPTO_PRNG_KSCTL_ECDSA_Pos (20) /*!< CRYPTO_T::PRNG_KSCTL: ECDSA Position */ +#define CRYPTO_PRNG_KSCTL_ECDSA_Msk (0x1ul << CRYPTO_PRNG_KSCTL_ECDSA_Pos) /*!< CRYPTO_T::PRNG_KSCTL: ECDSA Mask */ + +#define CRYPTO_PRNG_KSCTL_WDST_Pos (21) /*!< CRYPTO_T::PRNG_KSCTL: WDST Position */ +#define CRYPTO_PRNG_KSCTL_WDST_Msk (0x1ul << CRYPTO_PRNG_KSCTL_WDST_Pos) /*!< CRYPTO_T::PRNG_KSCTL: WDST Mask */ + +#define CRYPTO_PRNG_KSCTL_WSDST_Pos (22) /*!< CRYPTO_T::PRNG_KSCTL: WSDST Position */ +#define CRYPTO_PRNG_KSCTL_WSDST_Msk (0x3ul << CRYPTO_PRNG_KSCTL_WSDST_Pos) /*!< CRYPTO_T::PRNG_KSCTL: WSDST Mask */ + +#define CRYPTO_PRNG_KSCTL_OWNER_Pos (24) /*!< CRYPTO_T::PRNG_KSCTL: OWNER Position */ +#define CRYPTO_PRNG_KSCTL_OWNER_Msk (0x7ul << CRYPTO_PRNG_KSCTL_OWNER_Pos) /*!< CRYPTO_T::PRNG_KSCTL: OWNER Mask */ + +#define CRYPTO_PRNG_KSSTS_NUM_Pos (0) /*!< CRYPTO_T::PRNG_KSSTS: NUM Position */ +#define CRYPTO_PRNG_KSSTS_NUM_Msk (0x1ful << CRYPTO_PRNG_KSSTS_NUM_Pos) /*!< CRYPTO_T::PRNG_KSSTS: NUM Mask */ + +#define CRYPTO_AES_KSCTL_NUM_Pos (0) /*!< CRYPTO_T::AES_KSCTL: NUM Position */ +#define CRYPTO_AES_KSCTL_NUM_Msk (0x1ful << CRYPTO_AES_KSCTL_NUM_Pos) /*!< CRYPTO_T::AES_KSCTL: NUM Mask */ + +#define CRYPTO_AES_KSCTL_RSRC_Pos (5) /*!< CRYPTO_T::AES_KSCTL: RSRC Position */ +#define CRYPTO_AES_KSCTL_RSRC_Msk (0x1ul << CRYPTO_AES_KSCTL_RSRC_Pos) /*!< CRYPTO_T::AES_KSCTL: RSRC Mask */ + +#define CRYPTO_AES_KSCTL_RSSRC_Pos (6) /*!< CRYPTO_T::AES_KSCTL: RSSRC Position */ +#define CRYPTO_AES_KSCTL_RSSRC_Msk (0x3ul << CRYPTO_AES_KSCTL_RSSRC_Pos) /*!< CRYPTO_T::AES_KSCTL: RSSRC Mask */ + +#define CRYPTO_HMAC_KSCTL_NUM_Pos (0) /*!< CRYPTO_T::HMAC_KSCTL: NUM Position */ +#define CRYPTO_HMAC_KSCTL_NUM_Msk (0x1ful << CRYPTO_HMAC_KSCTL_NUM_Pos) /*!< CRYPTO_T::HMAC_KSCTL: NUM Mask */ + +#define CRYPTO_HMAC_KSCTL_RSRC_Pos (5) /*!< CRYPTO_T::HMAC_KSCTL: RSRC Position */ +#define CRYPTO_HMAC_KSCTL_RSRC_Msk (0x1ul << CRYPTO_HMAC_KSCTL_RSRC_Pos) /*!< CRYPTO_T::HMAC_KSCTL: RSRC Mask */ + +#define CRYPTO_HMAC_KSCTL_RSSRC_Pos (6) /*!< CRYPTO_T::HMAC_KSCTL: RSSRC Position */ +#define CRYPTO_HMAC_KSCTL_RSSRC_Msk (0x3ul << CRYPTO_HMAC_KSCTL_RSSRC_Pos) /*!< CRYPTO_T::HMAC_KSCTL: RSSRC Mask */ + +#define CRYPTO_ECC_KSCTL_NUMK_Pos (0) /*!< CRYPTO_T::ECC_KSCTL: NUMK Position */ +#define CRYPTO_ECC_KSCTL_NUMK_Msk (0x1ful << CRYPTO_ECC_KSCTL_NUMK_Pos) /*!< CRYPTO_T::ECC_KSCTL: NUMK Mask */ + +#define CRYPTO_ECC_KSCTL_RSRCK_Pos (5) /*!< CRYPTO_T::ECC_KSCTL: RSRCK Position */ +#define CRYPTO_ECC_KSCTL_RSRCK_Msk (0x1ul << CRYPTO_ECC_KSCTL_RSRCK_Pos) /*!< CRYPTO_T::ECC_KSCTL: RSRCK Mask */ + +#define CRYPTO_ECC_KSCTL_RSSRCK_Pos (6) /*!< CRYPTO_T::ECC_KSCTL: RSSRCK Position */ +#define CRYPTO_ECC_KSCTL_RSSRCK_Msk (0x3ul << CRYPTO_ECC_KSCTL_RSSRCK_Pos) /*!< CRYPTO_T::ECC_KSCTL: RSSRCK Mask */ + +#define CRYPTO_ECC_KSCTL_ECDH_Pos (14) /*!< CRYPTO_T::ECC_KSCTL: ECDH Position */ +#define CRYPTO_ECC_KSCTL_ECDH_Msk (0x1ul << CRYPTO_ECC_KSCTL_ECDH_Pos) /*!< CRYPTO_T::ECC_KSCTL: ECDH Mask */ + +#define CRYPTO_ECC_KSCTL_TRUST_Pos (16) /*!< CRYPTO_T::ECC_KSCTL: TRUST Position */ +#define CRYPTO_ECC_KSCTL_TRUST_Msk (0x1ul << CRYPTO_ECC_KSCTL_TRUST_Pos) /*!< CRYPTO_T::ECC_KSCTL: TRUST Mask */ + +#define CRYPTO_ECC_KSCTL_XY_Pos (20) /*!< CRYPTO_T::ECC_KSCTL: XY Position */ +#define CRYPTO_ECC_KSCTL_XY_Msk (0x1ul << CRYPTO_ECC_KSCTL_XY_Pos) /*!< CRYPTO_T::ECC_KSCTL: XY Mask */ + +#define CRYPTO_ECC_KSCTL_WDST_Pos (21) /*!< CRYPTO_T::ECC_KSCTL: WDST Position */ +#define CRYPTO_ECC_KSCTL_WDST_Msk (0x1ul << CRYPTO_ECC_KSCTL_WDST_Pos) /*!< CRYPTO_T::ECC_KSCTL: WDST Mask */ + +#define CRYPTO_ECC_KSCTL_WSDST_Pos (22) /*!< CRYPTO_T::ECC_KSCTL: WSDST Position */ +#define CRYPTO_ECC_KSCTL_WSDST_Msk (0x3ul << CRYPTO_ECC_KSCTL_WSDST_Pos) /*!< CRYPTO_T::ECC_KSCTL: WSDST Mask */ + +#define CRYPTO_ECC_KSCTL_OWNER_Pos (24) /*!< CRYPTO_T::ECC_KSCTL: OWNER Position */ +#define CRYPTO_ECC_KSCTL_OWNER_Msk (0x7ul << CRYPTO_ECC_KSCTL_OWNER_Pos) /*!< CRYPTO_T::ECC_KSCTL: OWNER Mask */ + +#define CRYPTO_ECC_KSSTS_NUM_Pos (0) /*!< CRYPTO_T::ECC_KSSTS: NUM Position */ +#define CRYPTO_ECC_KSSTS_NUM_Msk (0x1ful << CRYPTO_ECC_KSSTS_NUM_Pos) /*!< CRYPTO_T::ECC_KSSTS: NUM Mask */ + +#define CRYPTO_ECC_KSXY_NUMX_Pos (0) /*!< CRYPTO_T::ECC_KSXY: NUMX Position */ +#define CRYPTO_ECC_KSXY_NUMX_Msk (0x1ful << CRYPTO_ECC_KSXY_NUMX_Pos) /*!< CRYPTO_T::ECC_KSXY: NUMX Mask */ + +#define CRYPTO_ECC_KSXY_RSRCXY_Pos (5) /*!< CRYPTO_T::ECC_KSXY: RSRCXY Position */ +#define CRYPTO_ECC_KSXY_RSRCXY_Msk (0x1ul << CRYPTO_ECC_KSXY_RSRCXY_Pos) /*!< CRYPTO_T::ECC_KSXY: RSRCXY Mask */ + +#define CRYPTO_ECC_KSXY_RSSRCX_Pos (6) /*!< CRYPTO_T::ECC_KSXY: RSSRCX Position */ +#define CRYPTO_ECC_KSXY_RSSRCX_Msk (0x3ul << CRYPTO_ECC_KSXY_RSSRCX_Pos) /*!< CRYPTO_T::ECC_KSXY: RSSRCX Mask */ + +#define CRYPTO_ECC_KSXY_NUMY_Pos (8) /*!< CRYPTO_T::ECC_KSXY: NUMY Position */ +#define CRYPTO_ECC_KSXY_NUMY_Msk (0x1ful << CRYPTO_ECC_KSXY_NUMY_Pos) /*!< CRYPTO_T::ECC_KSXY: NUMY Mask */ + +#define CRYPTO_ECC_KSXY_RSSRCY_Pos (14) /*!< CRYPTO_T::ECC_KSXY: RSSRCY Position */ +#define CRYPTO_ECC_KSXY_RSSRCY_Msk (0x3ul << CRYPTO_ECC_KSXY_RSSRCY_Pos) /*!< CRYPTO_T::ECC_KSXY: RSSRCY Mask */ + +#define CRYPTO_RSA_KSCTL_NUM_Pos (0) /*!< CRYPTO_T::RSA_KSCTL: NUM Position */ +#define CRYPTO_RSA_KSCTL_NUM_Msk (0x1ful << CRYPTO_RSA_KSCTL_NUM_Pos) /*!< CRYPTO_T::RSA_KSCTL: NUM Mask */ + +#define CRYPTO_RSA_KSCTL_RSRC_Pos (5) /*!< CRYPTO_T::RSA_KSCTL: RSRC Position */ +#define CRYPTO_RSA_KSCTL_RSRC_Msk (0x1ul << CRYPTO_RSA_KSCTL_RSRC_Pos) /*!< CRYPTO_T::RSA_KSCTL: RSRC Mask */ + +#define CRYPTO_RSA_KSCTL_RSSRC_Pos (6) /*!< CRYPTO_T::RSA_KSCTL: RSSRC Position */ +#define CRYPTO_RSA_KSCTL_RSSRC_Msk (0x3ul << CRYPTO_RSA_KSCTL_RSSRC_Pos) /*!< CRYPTO_T::RSA_KSCTL: RSSRC Mask */ + +#define CRYPTO_RSA_KSCTL_BKNUM_Pos (8) /*!< CRYPTO_T::RSA_KSCTL: BKNUM Position */ +#define CRYPTO_RSA_KSCTL_BKNUM_Msk (0x1ful << CRYPTO_RSA_KSCTL_BKNUM_Pos) /*!< CRYPTO_T::RSA_KSCTL: BKNUM Mask */ + +#define CRYPTO_RSA_KSSTS0_NUM0_Pos (0) /*!< CRYPTO_T::RSA_KSSTS0: NUM0 Position */ +#define CRYPTO_RSA_KSSTS0_NUM0_Msk (0x1ful << CRYPTO_RSA_KSSTS0_NUM0_Pos) /*!< CRYPTO_T::RSA_KSSTS0: NUM0 Mask */ + +#define CRYPTO_RSA_KSSTS0_NUM1_Pos (8) /*!< CRYPTO_T::RSA_KSSTS0: NUM1 Position */ +#define CRYPTO_RSA_KSSTS0_NUM1_Msk (0x1ful << CRYPTO_RSA_KSSTS0_NUM1_Pos) /*!< CRYPTO_T::RSA_KSSTS0: NUM1 Mask */ + +#define CRYPTO_RSA_KSSTS0_NUM2_Pos (16) /*!< CRYPTO_T::RSA_KSSTS0: NUM2 Position */ +#define CRYPTO_RSA_KSSTS0_NUM2_Msk (0x1ful << CRYPTO_RSA_KSSTS0_NUM2_Pos) /*!< CRYPTO_T::RSA_KSSTS0: NUM2 Mask */ + +#define CRYPTO_RSA_KSSTS0_NUM3_Pos (24) /*!< CRYPTO_T::RSA_KSSTS0: NUM3 Position */ +#define CRYPTO_RSA_KSSTS0_NUM3_Msk (0x1ful << CRYPTO_RSA_KSSTS0_NUM3_Pos) /*!< CRYPTO_T::RSA_KSSTS0: NUM3 Mask */ + +#define CRYPTO_RSA_KSSTS1_NUM4_Pos (0) /*!< CRYPTO_T::RSA_KSSTS1: NUM4 Position */ +#define CRYPTO_RSA_KSSTS1_NUM4_Msk (0x1ful << CRYPTO_RSA_KSSTS1_NUM4_Pos) /*!< CRYPTO_T::RSA_KSSTS1: NUM4 Mask */ + +#define CRYPTO_RSA_KSSTS1_NUM5_Pos (8) /*!< CRYPTO_T::RSA_KSSTS1: NUM5 Position */ +#define CRYPTO_RSA_KSSTS1_NUM5_Msk (0x1ful << CRYPTO_RSA_KSSTS1_NUM5_Pos) /*!< CRYPTO_T::RSA_KSSTS1: NUM5 Mask */ + +#define CRYPTO_RSA_KSSTS1_NUM6_Pos (16) /*!< CRYPTO_T::RSA_KSSTS1: NUM6 Position */ +#define CRYPTO_RSA_KSSTS1_NUM6_Msk (0x1ful << CRYPTO_RSA_KSSTS1_NUM6_Pos) /*!< CRYPTO_T::RSA_KSSTS1: NUM6 Mask */ + +#define CRYPTO_RSA_KSSTS1_NUM7_Pos (24) /*!< CRYPTO_T::RSA_KSSTS1: NUM7 Position */ +#define CRYPTO_RSA_KSSTS1_NUM7_Msk (0x1ful << CRYPTO_RSA_KSSTS1_NUM7_Pos) /*!< CRYPTO_T::RSA_KSSTS1: NUM7 Mask */ + +/**@}*/ /* CRYPTO_CONST */ +/**@}*/ /* end of CRYPTO register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __CRYPTO_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ddr32phy_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ddr32phy_reg.h new file mode 100644 index 0000000000..d1408a3ba5 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ddr32phy_reg.h @@ -0,0 +1,9569 @@ +/**************************************************************************//** + * @file ddr32phy_reg.h + * @brief DDR32PHY register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __DDR32PHY_REG_H__ +#define __DDR32PHY_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif +/** @addtogroup REGISTER Control Register + + @{ + +*/ + + +/*---------------------- DDR 3/2 PHY Controller -------------------------*/ +/** + @addtogroup DDR32PHY DDR 3/2 PHY Controller(DDR32PHY) + Memory Mapped Structure for DDRPHY Controller +@{ */ + +typedef struct +{ + + + /** + * @var DDRPHY_T::RIDR + * Offset: 0x00 Revision Identification Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PUBMNR |PUB Minor Revision + * | | |Indicates minor update of the PUB such as bug fixes. Normally no new features are included. + * |[7:4] |PUBMDR |PUB Moderate Revision + * | | |Indicates moderate revision of the PUB such as addition of new features + * | | |Normally the new version is still compatible with previous versions. + * |[11:8] |PUBMJR |PUB Major Revision + * | | |Indicates major revision of the PUB such addition of the features that make the new version not compatible with previous versions. + * |[15:12] |PHYMNR |PHY Minor Revision + * | | |Indicates minor update of the PHY such as bug fixes. Normally no new features are included. + * |[19:16] |PHYMDR |PHY Moderate Revision + * | | |Indicates moderate revision of the PHY such as addition of new features + * | | |Normally the new version is still compatible with previous versions. + * |[23:20] |PHYMJR |PHY Major Revision + * | | |Indicates major revision of the PHY such addition of the features that make the new version not compatible with previous versions. + * |[31:24] |UDRID |User-Defined Revision ID + * | | |General purpose revision identification set by the user. + * @var DDRPHY_T::PIR + * Offset: 0x04 PHY Initialization Register (PIR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |INIT |Initialization Trigger + * | | |A write of '1' to this bit triggers the DDR system initialization, including PHY initialization, DRAM initialization, and PHY training + * | | |The exact initialization steps to be executed are specified in bits 1 to 15 of this register + * | | |A bit setting of 1 means the step will be executed as part of the initialization sequence, while a setting of '0' means the step will be bypassed + * | | |The initialization trigger bit is self-clearing. + * |[1] |ZCAL |Impedance Calibration + * | | |Performs PHY impedance calibration + * | | |When set the impedance calibration will be performed in parallel with PHY initialization (PLL initialization + DDL calibration + PHY reset). + * |[4] |PLLINIT |PLL Initialization + * | | |Executes the PLL initialization sequence which includes correct driving of PLL power-down, reset and gear shift pins, and then waiting for the PHY PLLs to lock. + * |[5] |DCAL |Digital Delay Line Calibration + * | | |Performs PHY delay line calibration. + * |[6] |PHYRST |PHY Reset + * | | |Resets the AC and DATX8 modules by asserting the AC/DATX8 reset pin. + * |[7] |DRAMRST |DRAM Reset + * | | |Issues a reset to the DRAM (by driving the DRAM reset pin low) and wait 200us + * | | |This can be triggered in isolation or with the full DRAM initialization (DRAMINIT) + * | | |For the latter case, the reset is issued and 200us is waited before starting the full initialization sequence. + * |[8] |DRAMINIT |DRAM Initialization + * | | |Executes the DRAM initialization sequence. + * |[9] |WL |Write Leveling + * | | |Executes a PUB write leveling routine. + * |[10] |QSGATE |Read DQS Gate Training + * | | |Executes a PUB training routine to determine the optimum position of the read data DQS strobe for maximum system timing margins. + * |[11] |WLADJ |Write Leveling Adjust + * | | |Executes a PUB training routine that re- adjusts the write latency used during write in case the write leveling routine changed the expected latency. + * | | |Note: Ensure that the DCU command cache is cleared prior to running WLADJ. + * |[12] |RDDSKW |Read Data Bit Deskew + * | | |Executes a PUB training routine to deskew the DQ bits during read. + * |[13] |WRDSKW |Write Data Bit Deskew + * | | |Executes a PUB training routine to deskew the DQ bits during write. + * |[14] |RDEYE |Read Data Eye Training + * | | |Executes a PUB training routine to maximize the read data eye. + * |[15] |WREYE |Write Data Eye Training + * | | |Executes a PUB training routine to maximize the write data eye. + * |[16] |ICPC |Initialization Complete Pin Configuration + * | | |Specifies how the DFI initialization complete output pin (dfi_init_complete) should be used to indicate the status of initialization + * | | |Valid values are: + * | | |0 = Asserted after PHY initialization (DLL locking and impedance calibration) is complete. + * | | |1 = Asserted after PHY initialization is complete and the triggered the PUB initialization (DRAM initialization, data training, or initialization trigger with no selected initialization) is complete. + * |[17] |PLLBYP |PLL Bypass + * | | |A setting of 1 on this bit will put all PHY PLLs in bypass mode. + * |[18] |CTLDINIT |Controller DRAM Initialization + * | | |Indicates, if set, that DRAM initialization will be performed by the controller + * | | |Otherwise if not set it indicates that DRAM initialization will be performed using the built-in initialization sequence or using software through the configuration port. + * |[19] |RDIMMINIT |RDIMM Initialization + * | | |Executes the RDIMM buffer chip initialization before executing DRAM initialization + * | | |The RDIMM buffer chip initialization is run after the DRAM is reset and CKE have been driven high by the DRAM initialization sequence. + * |[27] |CLRSR |Clear Status Registers + * | | |Writing 1 to this bit clears (reset to 0) select status bits in register PGSR0. + * | | |This bit is primarily for debug purposes and is typically not needed during normal functional operation + * | | |It can be used when PGSR.IDONE=1, to manually clear a selection of the PGSR status bits, although starting a new initialization process (PIR[0].INIT = 1'b1) automatically clears the PGSR status bits associated with the initialization steps enabled. + * | | |The following list describes which bits within the PGSR0 register are cleared when CLRSR is set to 1'b1 and which bits are not cleared: + * | | |The following bits are not cleared by PIR[27] (CLRSR): + * | | |- PGSR0[31] (APLOCK) + * | | |- PGSR0[29:28] (PLDONE_CHN) + * | | |- PGSR0[23] (WLAERR) + * | | |- PGSR0[21] (WLERR) + * | | |- PGSR0[4] (DIDONE) + * | | |- PGSR0[2] (DCDONE) + * | | |- PGSR0[1] (PLDONE) + * | | |- PGSR0[0] (IDONE) + * | | |The following bits are always zero: + * | | |- PGSR0[30] (reserved) + * | | |- PGSR0[19:12] (reserved) + * | | |The following bits are cleared unconditionally by PIR[27] (CLRSR): + * | | |- PGSR0[27] (WEERR) + * | | |- PGSR0[26] (REERR) + * | | |- PGSR0[25] (WDERR) + * | | |- PGSR0[24] (RDERR) + * | | |- PGSR0[22] (QSGERR) + * | | |- PGSR0[20] (ZCERR) + * | | |- PGSR0[11] (WEDONE) + * | | |- PGSR0[10] (REDONE) + * | | |- PGSR0[9] (WDDONE) + * | | |- PGSR0[8] (RDDONE) + * | | |- PGSR0[7] (WLADONE) + * | | |- PGSR0[6] (QSGDONE) + * | | |- PGSR0[5] (WLDONE) + * | | |- PGSR0[3] (ZCDONE) + * |[28] |LOCKBYP |PLL Lock Bypass + * | | |Bypasses or stops, if set, the waiting of PLLs to lock + * | | |PLL lock wait is automatically triggered after reset + * | | |PLL lock wait may be triggered manually using INIT and PLLINIT bits of the PIR register + * | | |This bit is self-clearing. + * |[29] |DCALBYP |Digital Delay Line Calibration Bypass + * | | |Bypasses or stops, if set, DDL calibration that automatically triggers after reset + * | | |DDL calibration may be triggered manually using INIT and DCAL bits of the PIR register + * | | |This bit is self- clearing. + * |[30] |ZCALBYP |Impedance Calibration Bypass + * | | |Bypasses or stops, if set, impedance calibration of all ZQ control blocks that automatically triggers after reset + * | | |Impedance calibration may be triggered manually using INIT and ZCAL bits of the PIR register + * | | |This bit is self-clearing. + * |[31] |INITBYP |Initialization Bypass + * | | |Bypasses or stops, if set, all initialization routines currently running, including PHY initialization, DRAM initialization, and PHY training + * | | |Initialization may be triggered manually using INIT and the other relevant bits of the PIR register + * | | |This bit is self-clearing. + * @var DDRPHY_T::PGCR0 + * Offset: 0x08 PHY General Configuration Registers 0 (PGCR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WLLVT |Write Leveling LCDL Delay VT Compensation + * | | |Enables, if set, the VT drift compensation of the write leveling LCDL. + * |[1] |WDLVT |Write DQ LCDL Delay VT Compensation + * | | |Enables, if set, the VT drift compensation of the write DQ LCDL. + * |[2] |RDLVT |Read DQS LCDL Delay VT Compensation + * | | |Enables, if set, the VT drift compensation of the read DQS LCDL. + * |[3] |RGLVT |Read DQS Gating LCDL Delay VT Compensation + * | | |Enables, if set, the VT drift compensation of the read DQS gating LCDL. + * |[4] |WDBVT |Write Data BDL VT Compensation + * | | |Enables, if set, the VT drift compensation of the write data bit delay lines. + * |[5] |RDBVT |Read Data BDL VT Compensation + * | | |Enables, if set, the VT drift compensation of the read data bit delay lines. + * |[6] |DLTMODE |Delay Line Test Mode + * | | |Selects, if set, the delay line oscillator test mode + * | | |Setting this bit also clears all delay line register values + * | | |For DL oscillator testing, first set this bit, then apply desired non-zero LCDL and BDL register programmings. + * |[7] |DLTST |Delay Line Test Start + * | | |A write of '1' to this bit will trigger delay line oscillator mode period measurement + * | | |This bit is not self clearing and needs to be reset to '0' before the measurement can be re-triggered. + * |[8] |OSCEN |Oscillator Enable: Enables, if set, the delay line oscillation. + * |[11:9] |OSCDIV |Oscillator Mode Division + * | | |Specifies the factor by which the delay line oscillator mode output is divided down before it is output on the delay line digital test output pin dl_dto + * | | |Valid values are: + * | | |000 = Divide by 1 + * | | |001 = Divide by 256 + * | | |010 = Divide by 512 + * | | |011 = Divide by 1024 + * | | |100 = Divide by 2048 + * | | |101 = Divide by 4096 + * | | |110 = Divide by 8192 + * | | |111 = Divide by 65536 + * |[13:12] |OSCWDL |Oscillator Mode Write-Leveling Delay Line Select + * | | |Selects which of the two write leveling LCDLs is active + * | | |The delay select value of the inactive LCDL is set to zero while the delay select value of the active LCDL can be varied by the input write leveling delay select pin + * | | |Valid values are: + * | | |00 = No WL LCDL is active + * | | |01 = DDR WL LCDL is active + * | | |10 = SDR WL LCDL is active + * | | |11 = Both LCDLs are active + * |[18:14] |DTOSEL |Digital Test Output Select + * | | |Selects the PHY digital test output that is driven onto PHY digital test output (phy_dto) pin: Valid values are: + * | | |00000 = DATX8 0 PLL digital test output + * | | |00001 = DATX8 1 PLL digital test output + * | | |00010 = DATX8 2 PLL digital test output + * | | |00011 = DATX8 3 PLL digital test output + * | | |00100 = DATX8 4 PLL digital test output + * | | |00101 = DATX8 5 PLL digital test output + * | | |00110 = DATX8 6 PLL digital test output + * | | |00111 = DATX8 7 PLL digital test output + * | | |01000 = DATX8 8 PLL digital test output + * | | |01001 = AC PLL digital test output + * | | |01010 - 01111 = Reserved + * | | |10000 = DATX8 0 delay line digital test output + * | | |10001 = DATX8 1 delay line digital test output + * | | |10010 = DATX8 2 delay line digital test output + * | | |10011 = DATX8 3 delay line digital test output + * | | |10100 = DATX8 4 delay line digital test output + * | | |10101 = DATX8 5 delay line digital test output + * | | |10110 = DATX8 6 delay line digital test output + * | | |10111 = DATX8 7 delay line digital test output + * | | |11000 = DATX8 8 delay line digital test output + * | | |11001 = AC delay line digital test output + * | | |11010 - 11111 = Reserved + * |[25] |PUBMODE |PUB Mode Enable + * | | |Enables, if set, the PUB to control the interface to the PHY and SDRAM + * | | |In this mode the DFI commands from the controller are ignored + * | | |The bit must be set to 0 after the system determines it is convenient to pass control of the DFI bus to the controller + * | | |When set to 0 the DFI interface has control of the PHY and SDRAM interface except when triggering pub operations such as BIST, DCU or data training. + * |[31:26] |CKEN |CK Enable + * | | |Controls whether the CK going to the SDRAM is enabled (toggling) or disabled (static value) and whether the CK is inverted + * | | |Two bits for each of the up to three CK pairs + * | | |Valid values for the two bits are: + * | | |00 = CK disabled (Driven to constant 0) + * | | |01 = CK toggling with inverted polarity + * | | |10 = CK toggling with normal polarity (This should be the default setting) + * | | |11 = CK disabled (Driven to constant 1) + * @var DDRPHY_T::PGCR1 + * Offset: 0x0C PHY General Configuration Registers 1 (PGCR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PDDISDX |Power Down Disabled Byte + * | | |Indicates, if set, that the PLL and I/Os of a disabled byte should be powered down. + * |[1] |WLMODE |Write Leveling Mode + * | | |Indicates, if set, that the PUB is in software write leveling mode in which software executes single steps of DQS pulsing by writing '1' to PIR.WL + * | | |The write leveling DQ status from the DRAM is captured in DXnGSR0.WLDQ. + * |[2] |WLSTEP |Write Leveling Step + * | | |Specifies the number of delay step-size increments during each step of write leveling + * | | |Valid values are: + * | | |0 = computed to be 1/2 of the associated lane's DXnGSR0.WLPRD value + * | | |1 = 1 step size + * |[4] |WSLOPT |Write System Latency Optimization + * | | |Controls the insertion of a pipeline stage on the AC signals from the DFI interface to the PHY to cater for a negative write system latency (WSL) value (only -1 possible). + * | | |0x0 = A pipeline stage is inserted only if WL2 training results in a WSL of -1 for any rank + * | | |0x1 = Inserts a pipeline stage + * |[5] |ACHRST |AC PHY High-Speed Reset + * | | |A Write of '0' to this bit resets the AC macro without resetting the PUB RTL logic + * | | |This bit is not self-clearing and a '1' must be written to de-assert the reset. + * |[6] |WLSELT |Write Leveling Select Type + * | | |Selects the encoding type for the write leveling select signal depending on the desired setup/hold margins for the internal pipelines + * | | |Refer to the DDR PHY Databook for details of how the select type is used + * | | |Valid values are: + * | | |0 = Type 1: Setup margin of 90 degrees and hold margin of 90 degrees + * | | |1 = Type 2: Setup margin of 135 degrees and hold margin of 45 degrees + * |[8:7] |IODDRM |I/O DDR Mode + * | | |Selects the DDR mode for the I/Os + * | | |These bits connect to bits [2:1] of the IOM pin of the SSTL I/O + * | | |For more information, refer to the SSTL I/O chapter in the DWC DDR PHY Databook. + * |[9] |MDLEN |Master Delay Line Enable + * | | |Enables, if set, the AC master delay line calibration to perform subsequent period measurements following the initial period measurements that are performed after reset or on when calibration is manually triggered + * | | |These additional measurements are accumulated and filtered as long as this bit remains high. + * |[10] |LPFEN |Low-Pass Filter Enable + * | | |Enables, if set, the low pass filtering of MDL period measurements. + * |[12:11] |LPFDEPTH |Low-Pass Filter Depth + * | | |Specifies the number of measurements over which MDL period measurements are filtered + * | | |This determines the time constant of the low pass filter + * | | |Valid values are: + * | | |00 = 2 + * | | |01 = 4 + * | | |10 = 8 + * | | |11 = 16 + * |[14:13] |FDEPTH |Filter Depth + * | | |Specifies the number of measurements over which all AC and DATX8 initial period measurements, that happen after reset or when calibration is manually triggered, are averaged + * | | |Valid values are: + * | | |00 = 2 + * | | |01 = 4 + * | | |10 = 8 + * | | |11 = 16 + * |[22:15] |DLDLMT |Delay Line VT Drift Limit + * | | |Specifies the minimum change in the delay line VT drift in one direction which should result in the assertion of the delay line VT drift status signal (vt_drift) + * | | |The limit is specified in terms of delay select values + * | | |A value of 0 disables the assertion of delay line VT drift status signal. + * |[24:23] |ZCKSEL |Impedance Clock Divider Select + * | | |Selects the divide ratio for the clock used by the impedance control logic relative to the clock used by the memory controller and SDRAM. + * | | |Valid values are: + * | | |00 = Divide by 2 + * | | |01 = Divide by 8 + * | | |10 = Divide by 32 + * | | |11 = Divide by 64 + * |[25] |DXHRST |DX PHY High-Speed Reset + * | | |a Write of '0' to this bit resets the DX macro without resetting the PUB RTL logic + * | | |This bit is not self-clearing and a '1' must be written to de-assert the reset. + * |[26] |INHVT |VT Calculation Inhibit + * | | |Inhibits calculation of the next VT compensated delay line values + * | | |A value of 1 will inhibit the VT calculation + * | | |This bit should be set to 1 during writes to the delay line registers. + * |[27] |IOLB |I/O Loop-Back Select + * | | |Selects where inside the I/O the loop-back of signals happens. Valid values are: + * | | |1'b0 = Loopback is after output buffer; output enable must be asserted + * | | |1'b1 = Loopback is before output buffer; output enable is don't care + * |[28] |LBDQSS |Loopback DQS Shift + * | | |Selects how the read DQS is shifted during loopback to ensure that the read DQS is centered into the read data eye + * | | |Valid values are: + * | | |1'b0 = PUB sets the read DQS LCDL to 0 (internally) + * | | |DQS is already shifted 90 degrees by write path + * | | |1'b1 = The read DQS shift is set manually through software + * |[30:29] |LBGDQS |Loopback DQS Gating + * | | |Selects the DQS gating mode that should be used when the PHY is in loopback mode, including BIST loopback mode + * | | |Valid values are: + * | | |2'b00 = DQS gate is always on + * | | |2'b01 = DQS gate training will be triggered on the PUB + * | | |2'b10 = DQS gate is set manually using software + * | | |2'b11 = Reserved + * |[31] |LBMODE |Loopback Mode + * | | |Indicates, if set, that the PHY/PUB is in loopback mode. + * @var DDRPHY_T::PGSR0 + * Offset: 0x10 PHY General Status Registers 0 (PGSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |IDONE |Initialization Done + * | | |Indicates, if set, that the DDR system initialization has completed + * | | |This bit is set after all the selected initialization routines in PIR register have completed. + * |[1] |PLDONE |PLL Lock Done + * | | |Indicates, if set, that PLL locking has completed. + * |[2] |DCDONE |Digital Delay Line Calibration Done + * | | |Indicates, if set, that DDL calibration has completed. + * |[3] |ZCDONE |Impedance Calibration Done: Indicates, if set, that impedance calibration has completed. + * |[4] |DIDONE |DRAM Initialization Done + * | | |Indicates, if set, that DRAM initialization has completed. + * |[5] |WLDONE |Write Leveling Done + * | | |Indicates, if set, that write leveling has completed. + * |[6] |QSGDONE |Read DQS Gate Training Done + * | | |Indicates, if set, that DQS gate training has completed. + * |[7] |WLADONE |Write Leveling Adjustment Done + * | | |Indicates, if set, that write leveling adjustment has completed. + * |[8] |RDDONE |Read Data Bit Deskew Done + * | | |Indicates, if set, that read bit deskew has completed. + * |[9] |WDDONE |Write Data Bit Deskew Done + * | | |Indicates, if set, that write bit deskew has completed. + * |[10] |REDONE |Read Data Eye Training Done + * | | |Indicates, if set, that read eye training has completed. + * |[11] |WEDONE |Write Data Eye Training Done + * | | |Indicates, if set, that write eye training has completed. + * |[20] |ZCERR |Impedance Calibration Error + * | | |Indicates, if set, that there is an error in impedance calibration. + * |[21] |WLERR |Write Leveling Error + * | | |Indicates, if set, that there is an error in write leveling. + * |[22] |QSGERR |Read DQS Gate Training Error + * | | |Indicates, if set, that there is an error in DQS gate training. + * |[23] |WLAERR |Write Data Leveling Adjustment Error + * | | |Indicates, if set, that there is an error in write leveling adjustment. + * |[24] |RDERR |Read Data Bit Deskew Error + * | | |Indicates, if set, that there is an error in read bit deskew. + * |[25] |WDERR |Write Data Bit Deskew Error + * | | |Indicates, if set, that there is an error in write bit deskew. + * |[26] |REERR |Read Data Eye Training Error + * | | |Indicates, if set, that there is an error in read eye training. + * |[27] |WEERR |Write Eye Training Error + * | | |Indicates, if set, that there is an error in write eye training. + * |[29:28] |PLDONE_CHN|PLL Lock Done per Channel + * | | |Indicates PLL locking has completed for each underlying channel + * | | |Bit 28 represents channel 0 while bit 29 represents channel 1. + * |[31] |APLOCK |AC PLL Lock + * | | |Indicates, if set, that AC PLL has locked. This is a direct status of the AC PLL lock pin. + * @var DDRPHY_T::PGSR1 + * Offset: 0x14 PHY General Status Registers 1 (PGSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DLTDONE |Delay Line Test Done + * | | |Indicates, if set, that the PHY control block has finished doing period measurement of the AC delay line digital test output. + * |[24:1] |DLTCODE |Delay Line Test Code + * | | |Returns the code measured by the PHY control block that corresponds to the period of the AC delay line digital test output. + * |[30] |VTSTOP |VT Stop + * | | |Indicates, if set, that the VT calculation logic has stopped computing the next values for the VT compensated delay line values + * | | |After assertion of the PGCR.INHVT, the VTSTOP bit should be read to ensure all VT compensation logic has stopped computations before writing to the delay line registers. + * |[31] |PARERR |RDIMM Parity Error + * | | |Indicates, if set, that there was a parity error (i.e + * | | |err_out_n was sampled low) during one of the transactions to the RDIMM buffer chip + * | | |This bit remains asserted until cleared by the PIR.CLRSR. + * @var DDRPHY_T::PLLCR + * Offset: 0x18 PLL Control Register (PLLCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |DTC |Digital Test Control + * | | |Selects various PLL digital test signals and other test mode signals to be brought out via bit [1] of the PLL digital test output (pll_dto[1]) + * | | |Valid values are: + * | | |00 = '0' (Test output is disabled) + * | | |01 = PLL x1 clock (X1) + * | | |10 = PLL reference (input) clock (REF_CLK) + * | | |11 = PLL feedback clock (FB_X1) + * |[5:2] |ATC |Analog Test Control + * | | |Selects various PLL analog test signals to be brought out via PLL analog test output pin (pll_ato) + * | | |Valid values are: + * | | |0000 = Reserved + * | | |0001 = vdd_ckin + * | | |0010 = vrfbf + * | | |0011 = vdd_cko + * | | |0100 = vp_cp + * | | |0101 = vpfil(vp) + * | | |0110 = Reserved + * | | |0111 = gd + * | | |1000 = vcntrl_atb + * | | |1001 = vref_atb + * | | |1010 = vpsf_atb + * | | |1011 - 1111 = Reserved + * |[9:6] |ATOEN |Analog Test Enable + * | | |Selects the analog test signal that is driven on the analog test output pin + * | | |Otherwise the analog test output is tri-stated + * | | |This allows analog test output pins from multiple PLLs to be connected together + * | | |Valid values are: + * | | |0000 = All PLL analog test signals are tri-stated + * | | |0001 = AC PLL analog test signal is driven out + * | | |0010 = DATX8 0 PLL analog test signal is driven out + * | | |0011 = DATX8 1 PLL analog test signal is driven out + * | | |0100 = DATX8 2 PLL analog test signal is driven out + * | | |0101 = DATX8 3 PLL analog test signal is driven out + * | | |0110 = DATX8 4 PLL analog test signal is driven out + * | | |0111 = DATX8 5 PLL analog test signal is driven out + * | | |1000 = DATX8 6 PLL analog test signal is driven out + * | | |1001 = DATX8 7 PLL analog test signal is driven out + * | | |1010 = DATX8 8 PLL analog test signal is driven out + * | | |1011 - 1111 = Reserved + * |[10] |GSHIFT |Gear Shift + * | | |Enables, if set, rapid locking mode. + * |[12:11] |CPIC |Charge Pump Integrating Current Control + * |[16:13] |CPPC |Charge Pump Proportional Current Control + * |[17] |QPMODE |PLL Quadrature Phase Mode + * | | |Enables, if set, the quadrature phase clock outputs. This mode is not used in this version of the PHY. + * |[19:18] |FRQSEL |PLL Frequency Select + * | | |00 = PLL reference clock (ctl_clk/REF_CLK) ranges from 250 MHz to 400 MHz + * | | |01 = PLL reference clock (ctl_clk/REF_CLK) ranges from 166 MHz to 300 MHz + * | | |10 = Reserved + * | | |11 = Reserved + * |[29] |PLLPD |PLL Power Down + * | | |Puts the PLLs in Power-down mode by driving the PLL power down pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the power-down. + * |[30] |PLLRST |PLL Rest + * | | |Resets the PLLs by driving the PLL reset pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the reset. + * |[31] |BYP |PLL Bypass + * | | |Bypasses the PLL, if set, to 1. + * @var DDRPHY_T::PTR0 + * Offset: 0x1C PHY Timing Registers 0 (PTR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |tPHYRST |PHY Reset Time + * | | |Number of configuration or APB clock cycles that the PHY reset must remain asserted after PHY calibration is done before the reset to the PHY is de-asserted + * | | |This is used to extend the reset to the PHY so that the reset is asserted for some clock cycles after the clocks are stable + * | | |Valid values are from 1 to 63 (the value must be non-zero). + * |[20:6] |tPLLGS |PLL Gear Shift Time + * | | |Number of configuration or APB clock cycles from when the PLL reset pin is de-asserted to when the PLL gear shift pin is de-asserted + * | | |This must correspond to a value that is equal to or more than 4us + * | | |Default value corresponds to 4us. + * |[31:21] |tPLLPD |PLL Power-Down Time + * | | |Number of configuration or APB clock cycles that the PLL must remain in power-down mode, i.e + * | | |number of clock cycles from when PLL power-down pin is asserted to when PLL power-down pin is de-asserted + * | | |This must correspond to a value that is equal to or more than 1us + * | | |Default value corresponds to 1us. + * @var DDRPHY_T::PTR1 + * Offset: 0x20 PHY Timing Registers 1 (PTR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[12:0] |tPLLRST |PLL Reset Time + * | | |Number of configuration or APB clock cycles that the PLL must remain in reset mode, i.e + * | | |number of clock cycles from when PLL power-down pin is de-asserted and PLL reset pin is asserted to when PLL reset pin is de-asserted + * | | |The setting must correspond to a value that is equal to, or greater than 3us. + * |[31:16] |tPLLLOCK |PLL Lock Time + * | | |Number of configuration or APB clock cycles for the PLL to stabilize and lock, i.e + * | | |number of clock cycles from when the PLL reset pin is de-asserted to when the PLL has lock and is ready for use + * | | |This must correspond to a value that is equal to or more than 100us + * | | |Default value corresponds to 100us. + * @var DDRPHY_T::PTR2 + * Offset: 0x24 PHY Timing Registers 2 (PTR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |tCALON |Calibration On Time + * | | |Number of clock cycles that the calibration clock is enabled (cal_clk_en asserted). + * |[9:5] |tCALS |Calibration Setup Time + * | | |Number of controller clock cycles from when calibration is enabled (cal_en asserted) to when the calibration clock is asserted again (cal_clk_en asserted). + * |[14:10] |tCALH |Calibration Hold Time + * | | |Number of controller clock cycles from when the clock was disabled (cal_clk_en deasserted) to when calibration is enable (cal_en asserted). + * |[19:15] |tWLDLYS |Write Leveling Delay Settling Time + * | | |Number of controller clock cycles from when a new value of the write leveling delay is applied to the LCDL to when to DQS high is driven high + * | | |This allows the delay to settle. + * @var DDRPHY_T::PTR3 + * Offset: 0x28 PHY Timing Registers 3 (PTR3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[19:0] |tDINIT0 |DRAM Initialization Time 0 + * | | |DRAM initialization time in DRAM clock cycles corresponding to the following: + * | | |DDR3 = CKE low time with power and clock stable (500 us) DDR2 = CKE low time with power and clock stable (200 us) Default value corresponds to DDR3 500 us at 1066 MHz. + * | | |During Verilog simulations, it is recommended that this value is changed to a much smaller value in order to avoid long simulation times + * | | |However, this may cause a memory model error, due to a violation of the CKE setup sequence + * | | |This violation is expected if this value is not programmed to the required SDRAM CKE low time, but memory models should be able to tolerate this violation without malfunction of the model. + * |[28:20] |tDINIT1 |DRAM Initialization Time 1 + * | | |DRAM initialization time in DRAM clock cycles corresponding to the following: + * | | |DDR3 = CKE high time to first command (tRFC + 10 ns or 5 tCK, whichever is bigger) DDR2 = CKE high time to first command (400 ns) + * | | |Default value corresponds to DDR3 tRFC of 360ns at 1066 MHz. + * @var DDRPHY_T::PTR4 + * Offset: 0x2C PHY Timing Registers 4 (PTR4) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[17:0] |tDINIT2 |DRAM Initialization Time 2 + * | | |DRAM initialization time in DRAM clock cycles corresponding to the following: + * | | |DDR3 = Reset low time (200 us on power-up or 100 ns after power-up) Default value corresponds to DDR3 200 us at 1066 MHz. + * |[27:18] |tDINIT3 |DRAM Initialization Time 3 + * | | |DRAM initialization time in DRAM clock cycles corresponding to the following: + * | | |DDR3 = Time from ZQ initialization command to first command (1 us) Default value corresponds to the DDR3 640ns at 1066 MHz. + * @var DDRPHY_T::ACMDLR + * Offset: 0x30 AC Master Delay Line Register (ACMDLR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |IPRD |Initial Period + * | | |Initial period measured by the master delay line calibration for VT drift compensation + * | | |This value is used as the denominator when calculating the ratios of updates during VT compensation. + * |[15:8] |TPRD |Target Period + * | | |Target period measured by the master delay line calibration for VT drift compensation + * | | |This is the current measured value of the period and is continuously updated if the MDL is enabled to do so. + * |[23:16] |MDLD |MDL Delay + * | | |Delay select for the LCDL for the Master Delay Line. + * @var DDRPHY_T::ACBDLR + * Offset: 0x34 AC Bit Delay Line Register (ACBDLR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |CK0BD |CK0 Bit Delay + * | | |Delay select for the BDL on CK0. + * |[11:6] |CK1BD |CK1 Bit Delay + * | | |Delay select for the BDL on CK1. + * |[17:12] |CK2BD |CK2 Bit Delay + * | | |Delay select for the BDL on CK2. + * |[23:18] |ACBD |Address/Command Bit Delay + * | | |Delay select for the BDLs on address and command signals. + * @var DDRPHY_T::ACIOCR + * Offset: 0x38 AC I/O Configuration Register (ACIOCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ACIOM |Address/Command I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for all address and command pins + * | | |This bit connects to bit [0] of the IOM pin on the D3F I/Os, and for other I/O libraries, it connects to the IOM pin of the I/O. + * |[1] |ACOE |Address/Command Output Enable + * | | |Enables, when set, the output driver on the I/O for all address and command pins. + * |[2] |ACODT |Address/Command On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for RAS#, CAS#, WE#, BA[2:0], and A[15:0] pins. + * |[3] |ACPDD |AC Power Down Driver + * | | |Powers down, when set, the output driver on the I/O for RAS#, CAS#, WE#, BA[2:0], and A[15:0] pins. + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[4] |ACPDR |AC Power Down Receiver + * | | |Powers down, when set, the input receiver on the I/O for RAS#, CAS#, WE#, BA[2:0], and A[15:0] pins. + * |[7:5] |CKODT |CK On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for CK[0], CK[1], and CK[2] pins, respectively. + * |[10:8] |CKPDD |CK Power Down Driver + * | | |Powers down, when set, the output driver on the I/O for CK[0], CK[1], and CK[2] pins, respectively. + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[13:11] |CKPDR |CK Power Down Receiver + * | | |Powers down, when set, the input receiver on the I/O for CK[0], CK[1], and CK[2] pins, respectively. + * |[17:14] |RANKODT |Rank On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for CKE[3:0], ODT[3:0], and CS#[3:0] pins + * | | |RANKODT[0] controls the on-die termination for CKE[0], ODT[0], and CS#[0], RANKODT[1] controls the on-die termination for CKE[1], ODT[1], and CS#[1], and so on. + * |[21:18] |CSPDD |CS# Power Down Driver + * | | |Powers down, when set, the output driver on the I/O for CS#[3:0] pins + * | | |CSPDD[0] controls the power down for CS#[0], CSPDD[1] controls the power down for CS#[1], and so on + * | | |CKE and ODT driver power down is controlled by DSGCR register. + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[25:22] |RANKPDR |Rank Power Down Receiver + * | | |Powers down, when set, the input receiver on the I/O CKE[3:0], ODT[3:0], and CS#[3:0] pins + * | | |RANKPDR[0] controls the power down for CKE[0], ODT[0], and CS#[0], RANKPDR[1] controls the power down for CKE[1], ODT[1], and CS#[1], and so on. + * |[26] |RSTODT |SDRAM Reset On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for SDRAM RST# pin. + * |[27] |RSTPDD |SDRAM Reset Power Down Driver + * | | |Powers down, when set, the output driver on the I/O for SDRAM RST# pin. + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[28] |RSTPDR |SDRAM Reset Power Down Receiver + * | | |Powers down, when set, the input receiver on the I/O for SDRAM RST# pin. + * |[29] |RSTIOM |SDRAM Reset I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for SDRAM Reset. + * |[31:30] |ACSR |Address/Command Slew Rate + * | | |Selects slew rate of the I/O for all address and command pins. + * @var DDRPHY_T::DXCCR + * Offset: 0x3C DATX8 Common Configuration Register (DXCCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DXODT |Data On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQ, DM, and DQS/DQS# pins of all DATX8 macros + * | | |This bit is ORed with the ODT configuration bit of the individual DATX8 ("DATX8 General Configuration Register (DXnGCR)") + * |[1] |DXIOM |Data I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for DQ, DM, and DQS/DQS# pins of all DATX8 macros + * | | |This bit is ORed with the IOM configuration bit of the individual DATX8. + * |[2] |MDLEN |Master Delay Line Enable + * | | |Enables, if set, all DATX8 master delay line calibration to perform subsequent period measurements following the initial period measurements that are performed after reset or on when calibration is manually triggered + * | | |These additional measurements are accumulated and filtered as long as this bit remains high + * | | |This bit is ANDed with the MDLEN bit in the individual DATX8. + * |[3] |DXPDD |Data Power Down Driver + * | | |Powers down, when set, the output driver on I/O for DQ, DM, and DQS/DQS# pins of all DATX8 macros + * | | |This bit is ORed with the PDD configuration bit of the individual DATX8. + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[4] |DXPDR |Data Power Down Receiver + * | | |Powers down, when set, the input receiver on I/O for DQ, DM, and DQS/DQS# pins of all DATX8 macros + * | | |This bit is ORed with the PDR configuration bit of the individual DATX8. + * |[8:5] |DQSRES |DQS Resistor + * | | |Selects the on-die pull-down/pull-up resistor for DQS pins + * | | |DQSRES[3] selects pull-down (when set to 0) or pull-up (when set to 1) + * | | |DQSRES[2:0] selects the resistor value. + * | | |Refer PHY databook for pull-down/pull-up resistor values (RA_SEL/RB_SEL) for + * | | |DQS/DQS_b. + * |[12:9] |DQSNRES |DQS# Resistor + * | | |Selects the on-die pull-up/pull-down resistor for DQS# pins. Same encoding as DQSRES. + * | | |Refer PHY databook for pull-down/pull-up resistor values (RA_SEL/RB_SEL) for + * | | |DQS/DQS_b. + * |[14:13] |DXSR |Data Slew Rate + * | | |Selects slew rate of the I/O for DQ, DM, and DQS/DQS# pins of all DATX8 macros. + * |[17:15] |MSBUDQ |Most Significant Byte Unused DQs + * | | |Specifies the number of DQ bits that are not used in the most significant byte + * | | |The used (valid) bits for this byte are [8-MSBDQ-1:0] + * | | |To disable the whole byte, use the DXnGCR.DXEN register. + * |[18] |UDQODT |Unused DQ On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for unused DQ pins. + * |[19] |UDQPDD |Unused DQ Power Down Driver + * | | |Powers down, when set, the output driver on the I/O for unused DQ pins. + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[20] |UDQPDR |Unused DQ Power Down Receiver + * | | |Powers down, when set, the input receiver on the I/O for unused DQ pins. + * |[21] |UDQIOM |Unused DQ I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for unused DQ pins. + * |[22] |DYNDXPDD |Dynamic Data Power Down Driver + * | | |Dynamically powers down, when set, the output driver on I/O for the DQ pins of the active DATX8 macros + * | | |Applies only when DXPDD and DXnGCR.DXPDD are not set to 1 + * | | |Driver is powered-up on a DFI WRITE command and powered-down (twrlat + WL/2 + n) HDR cycles after the last DFI WRITE command + * | | |Note that n is defined by the register bit field DXCCR[27:24] (DDPDDCDO). + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[23] |DYNDXPDR |Data Power Down Receiver + * | | |Dynamically powers down, when set, the input receiver on I/O for the DQ pins of the active DATX8 macros + * | | |Applies only when DXPDR and DXnGCR.DXPDR are not set to 1 + * | | |Receiver is powered-up on a DFI READ command and powered-down (trddata_en + fixed_read_latency + n) HDR cycles after the last DFI READ command + * | | |Note that n is defined by the register bit field DXCCR[31:28] (DDPDRCDO). + * |[27:24] |DDPDDCDO |Dynamic Data Power Down Driver Count Down Offset + * | | |Offset applied in calculating window of time where driver is powered up + * |[31:28] |DDPDRCDO |Dynamic Data Power Down Receiver Count Down Offset + * | | |Offset applied in calculating window of time where receiver is powered up + * @var DDRPHY_T::DSGCR + * Offset: 0x40 DDR System General Configuration Register (DSGCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PUREN |PHY Update Request Enable + * | | |Specifies if set, that the PHY should issue PHY- initiated update request when there is DDL VT drift. + * |[1] |BDISEN |Byte Disable Enable + * | | |Specifies, if set, that the PHY should respond to DFI byte disable request + * | | |Otherwise the byte disable from the DFI is ignored in which case bytes can only be disabled using the DXnGCR register. + * |[2] |ZUEN |Impedance Update Enable + * | | |Specifies, if set, that in addition to DDL VT update, the PHY could also perform impedance calibration (update). + * | | |Refer to the "Impedance Control Register 0-1 (ZQnCR0-1)" bit fields DFICU0, DFICU1 and DFICCU bits to control if an impedance calibration is performed (update) with a DFI controller update request. + * | | |Refer to the "Impedance Control Register 0-1 (ZQnCR0-1)"D bit fields DFIPU0 and DFIPU1 bits to control if an impedance calibration is performed (update) with a DFI PHY update request. + * |[3] |LPIOPD |Low Power I/O Power Down + * | | |Specifies, if set, that the PHY should respond to the DFI low power opportunity request and power down the I/Os of the byte. + * |[4] |LPPLLPD |Low Power PLL Power Down + * | | |Specifies, if set, that the PHY should respond to the DFI low power opportunity request and power down the PLL of the byte if the wakeup time request satisfies the PLL lock time. + * |[5] |CUAEN |Controller Update Acknowledge Enable + * | | |Specifies, if set, that the PHY should issue controller update acknowledge when the DFI controller update request is asserted + * | | |By default, the PHY does not acknowledge controller initiated update requests but simply does an update whenever there is a controller update request + * | | |This speeds up the update. + * |[6] |DQSGX |DQS Gate Extension + * | | |Specifies, if set, that the DQS gating must be extended by two DRAM clock cycles and then re-centered, i.e + * | | |one clock cycle extension on either side. + * |[7] |BRRMODE |Bypass Rise-to-Rise Mode + * | | |Indicates, if set, that the PHY bypass mode is configured to run in rise-to-rise mode + * | | |Otherwise if not set the PHY bypass mode is running in rise-to-fall mode. + * |[11:8] |PUAD |PHY Update Acknowledge Delay + * | | |Specifies the number of clock cycles that the indication for the completion of PHY update from the PHY to the controller should be delayed + * | | |This essentially delays, by this many clock cycles, the de-assertion of dfi_ctrlup_ack and dfi_phyupd_req signals relative to the time when the delay lines or I/Os are updated. + * |[12] |DTOODT |DTO On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DTO pins. + * |[13] |DTOPDD |DTO Power Down Driver + * | | |Powers down, when set, the output driver on the I/O for DTO pins. + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[14] |DTOPDR |DTO Power Down Receiver + * | | |Powers down, when set, the input receiver on the I/O for DTO pins. + * |[15] |DTOIOM |DTO I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for DTO pins. + * |[16] |DTOOE |DTO Output Enable + * | | |Enables, when set, the output driver on the I/O for DTO pins. + * |[17] |ATOAE |ATO Analog Test Enable + * | | |Enables, if set, the analog test output (ATO) I/O. + * |[18] |RRMODE |Rise-to-Rise Mode + * | | |Indicates, if set, that the PHY mission mode is configured to run in rise-to-rise mode + * | | |Otherwise if not set the PHY mission mode is running in rise-to- fall mode. + * |[19] |SDRMODE |Single Data Rate Mode + * | | |Indicates, if set, that the external controller is configured to run in single data rate (SDR) mode + * | | |Otherwise if not set the controller is running in half data rate (HDR) mode + * | | |This bit not supported in the current version of the PUB. + * |[23:20] |CKEPDD |CKE Power Down Driver + * | | |Powers down, when set, the output driver on the I/O for CKE[3:0] pins + * | | |CKEPDD[0] controls the power down for CKE[0], CKEPDD[1] controls the power down for CKE[1], and so on. + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[27:24] |ODTPDD |ODT Power Down Driver + * | | |Powers down, when set, the output driver on the I/O for ODT[3:0] pins + * | | |ODTPDD[0] controls the power down for ODT[0], ODTPDD[1] controls the power down for ODT[1], and so on. + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[28] |CKOE |SDRAM CK Output Enable + * | | |Enables, when set, the output driver on the I/O for SDRAM CK/CK# pins. + * |[29] |ODTOE |SDRAM ODT Output Enable + * | | |Enables, when set, the output driver on the I/O for SDRAM ODT pins. + * |[30] |RSTOE |SDRAM Reset Output Enable + * | | |Enables, when set, the output driver on the I/O for SDRAM RST# pin. + * |[31] |CKEOE |SDRAM CKE Output Enable + * | | |Enables, when set, the output driver on the I/O for SDRAM CKE pins. + * @var DDRPHY_T::DCR + * Offset: 0x44 DRAM Configuration Register (DCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |DDRMD |DDR Mode + * | | |SDRAM DDR mode. Valid values are: + * | | |000 = Reserved + * | | |001 = Reserved + * | | |010 = DDR2 + * | | |011 = DDR3 + * | | |100 - 111 = Reserved + * |[3] |DDR8BNK |DDR 8-Bank + * | | |Indicates, if set, that the SDRAM used has 8 banks + * | | |tRPA = tRP+1 and tFAW are used for 8-bank DRAMs, otherwise tRPA = tRP and no tFAW is used. + * | | |Note that a setting of 1 for DRAMs that have fewer than 8 banks results in correct functionality, but less tight DRAM command spacing for the parameters. + * |[6:4] |PDQ |Primary DQ + * | | |Specifies the DQ pin in a byte that is designated as a primary pin for Multi-Purpose Register (MPR) reads + * | | |Valid values are 0 to 7 for DQ[0] to DQ[7], respectively. + * |[7] |MPRDQ |Multi-Purpose Register DQ + * | | |Specifies the value that is driven on non-primary DQ pins during MPR reads. Valid values are: + * | | |0 = Primary DQ drives out the data from MPR (0-1-0-1); non-primary DQs drive '0' + * | | |1 = Primary DQ and non-primary DQs all drive the same data from MPR (0-1-0-1) + * |[17:10] |BYTEMASK |Byte Mask + * | | |Mask applied to all beats of read data on all byte lanes during read DQS gate training + * | | |This allows training to be conducted based on selected bit(s) from the byte lanes. + * | | |Valid values for each bit are: + * | | |0 = Disable compare for that bit + * | | |1 = Enable compare for that bit + * | | |Note that this mask applies in DDR3 MPR operation mode as well and must be in keeping with the PDQ field setting. + * |[27] |NOSRA |No Simultaneous Rank Access + * | | |Specifies, if set, that simultaneous rank access on the same clock cycle is not allowed + * | | |This means that multiple chip select signals should not be asserted at the same time + * | | |This may be required on some DIMM systems. + * |[28] |DDR2T |DDR 2T Timing + * | | |Indicates, if set, that 2T timing should be used by PUB internally generated SDRAM transactions. + * |[29] |UDIMM |Un-buffered DIMM Address Mirroring + * | | |Indicates, if set, that there is address mirroring on the second rank of an un-buffered DIMM (the rank connected to CS#[1]) + * | | |In this case, the PUB re-scrambles the bank and address when sending mode register commands to the second rank + * | | |This only applies to PUB internal SDRAM transactions + * | | |Transactions generated by the controller must make its own adjustments when using an un-buffered DIMM + * | | |DCR[NOSRA] must be set if address mirroring is enabled. + * @var DDRPHY_T::DTPR0 + * Offset: 0x48 DRAM Timing Parameters Register 0 (DTPR0) 105 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |tRTP |Internal read to precharge command delay + * | | |Valid values are 2 to 15. + * |[7:4] |tWTR |Internal write to read command delay + * | | |Valid values are 1 to 15. + * |[11:8] |tRP |Precharge command period + * | | |The minimum time between a precharge command and any other command + * | | |Note that the Controller automatically derives tRPA for 8- bank DDR2 devices by adding 1 to tRP + * | | |Valid values are 2 to 15. + * |[15:12] |tRCD |Activate to read or write delay + * | | |Minimum time from when an activate command is issued to when a read or write to the activated row can be issued + * | | |Valid values are 2 to 15. + * |[21:16] |tRAS |Activate to precharge command delay + * | | |Valid values are 2 to 63. + * |[25:22] |tRRD |Activate to activate command delay + * | | |Valid values are 1 to 15. + * |[31:26] |tRC |Activate to activate command delay + * | | |Valid values are 2 to 63. + * @var DDRPHY_T::DTPR1 + * Offset: 0x4C DRAM Timing Parameters Register 1 (DTPR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |tMRD |Load mode cycle time + * | | |The minimum time between a load mode register command and any other command + * | | |For DDR3 this is the minimum time between two load mode register commands + * | | |Valid values for DDR2 are 2 to 3 + * | | |For DDR3, the value used for tMRD is 4 plus the value programmed in these bits, i.e + * | | |tMRD value for DDR3 ranges from 4 to 7. + * |[4:2] |tMOD |Load mode update delay + * | | |The minimum time between a load mode register command and a non-load mode register command + * | | |Valid values are: + * | | |000 = 12 + * | | |001 = 13 + * | | |010 = 14 + * | | |011 = 15 + * | | |100 = 16 + * | | |101 = 17 + * | | |110 - 111 = Reserved + * |[10:5] |tFAW |4-bank activate period + * | | |No more than 4-bank activate commands may be issued in a given tFAW period + * | | |Only applies to 8-bank devices + * | | |Valid values are 2 to 63. + * |[19:11] |tRFC |Refresh-to-Refresh + * | | |Indicates the minimum time between two refresh commands or between a refresh and an active command + * | | |This is derived from the minimum refresh interval from the Datasheet, tRFC(min), divided by the clock cycle time + * | | |The default number of clock cycles is for the largest JEDEC tRFC(min parameter value supported. + * |[25:20] |tWLMRD |Minimum delay from when write leveling mode is programmed to the first + * | | |DQS/DQS# rising edge. + * |[29:26] |tWLO |Write leveling output delay + * | | |Number of clock cycles from when write leveling DQS is driven high by the control block to when the results from the SDRAM on DQ is sampled by the control block + * | | |This must include the SDRAM tWLO timing parameter plus the round trip delay from control block to SDRAM back to control block. + * |[31:30] |tAONDtAOFD|ODT turn-on/turn-off delays. + * | | |Valid values are: + * | | |00 = 2/2.5 + * | | |01 = 3/3.5 + * | | |10 = 4/4.5 + * | | |11 = 5/5.5 + * | | |Most DDR2 devices utilize a fixed value of 2/2.5 + * | | |For non-standard SDRAMs, the user must ensure that the operational Write Latency is always greater than or equal to the ODT turn-on delay + * | | |For example, a DDR2 SDRAM with CAS latency set to 3 and CAS additive latency set to 0 has a Write Latency of 2 + * | | |Thus 2/2.5 can be used, but not 3/3.5 or higher. + * @var DDRPHY_T::DTPR2 + * Offset: 0x50 DRAM Timing Parameters Register 2 (DTPR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |tXS |Self refresh exit delay + * | | |The minimum time between a self refresh exit command and any other command + * | | |This parameter must be set to the maximum of the various minimum self refresh exit delay parameters specified in the SDRAM Datasheet, i.e + * | | |max(tXSNR, tXSRD) for DDR2 and max(tXS, tXSDLL) for DDR3 + * | | |Valid values are 2 to + * | | |1023. + * |[14:10] |tXP |Power down exit delay + * | | |The minimum time between a power down exit command and any other command + * | | |This parameter must be set to the maximum of the various minimum power down exit delay parameters specified in the SDRAM Datasheet, i.e + * | | |max(tXP, tXARD, tXARDS) for DDR2 and max(tXP, tXPDLL) for DDR3 + * | | |Valid values are 2 to 31. + * |[18:15] |tCKE |CKE minimum pulse width + * | | |Also specifies the minimum time that the SDRAM must remain in power down or self refresh mode + * | | |For DDR3 this parameter must be set to the value of tCKESR which is usually bigger than the value of tCKE + * | | |Valid values are 2 to 15. + * |[28:19] |tDLLK |DLL locking time + * | | |Valid values are 2 to 1023. + * |[29] |tRTODT |Read to ODT delay + * | | |Specifies whether ODT can be enabled immediately after the read post-amble or one clock delay has to be added + * | | |Valid values are: + * | | |0 = ODT may be turned on immediately after read post-amble + * | | |1 = ODT may not be turned on until one clock after the read post-amble + * | | |If tRTODT is set to 1, then the read-to-write latency is increased by 1 if ODT is enabled. + * |[30] |tRTW |Read to Write command delay + * | | |Valid values are: + * | | |0 = standard bus turn around delay + * | | |1 = add 1 clock to standard bus turn around delay + * | | |This parameter allows the user to increase the delay between issuing Write commands to the SDRAM when preceded by Read commands + * | | |This provides an option to increase bus turn-around margin for high frequency systems. + * |[31] |tCCD |Read to read and write to write command delay + * | | |Valid values are: + * | | |0 = BL/2 for DDR2 and 4 for DDR3 + * | | |1 = BL/2 + 1 for DDR2 and 5 for DDR3 + * @var DDRPHY_T::MR0 + * Offset: 0x54 Mode Register 0 (MR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |BL |Burst Length + * | | |Determines the maximum number of column locations that can be accessed during a given read or write command + * | | |Valid values are: + * | | |Valid values for DDR3 are: + * | | |00 = 8 (Fixed) + * | | |01 = 4 or 8 (On the fly) + * | | |10 = 4 (Fixed) + * | | |11 = Reserved + * |[2] |CL0 |CAS Latency + * | | |The delay between when the SDRAM registers a read command to when data is available. Valid values are: + * | | |0010 = 5 + * | | |0100 = 6 + * | | |0110 = 7 + * | | |1000 = 8 + * | | |1010 = 9 + * | | |1100 = 10 + * | | |1110 = 11 + * | | |0001 = 12 + * | | |0011 = 13 + * | | |0101 = 14 + * | | |All other settings are reserved and should not be used. + * |[3] |BT |Burst Type + * | | |Indicates whether a burst is sequential (0) or interleaved (1). + * |[6:4] |CL1 |CAS Latency + * | | |The delay between when the SDRAM registers a read command to when data is available. Valid values are: + * | | |0010 = 5 + * | | |0100 = 6 + * | | |0110 = 7 + * | | |1000 = 8 + * | | |1010 = 9 + * | | |1100 = 10 + * | | |1110 = 11 + * | | |0001 = 12 + * | | |0011 = 13 + * | | |0101 = 14 + * | | |All other settings are reserved and should not be used. + * |[7] |TM |Operating Mode + * | | |Selects either normal operating mode (0) or test mode (1) + * | | |Test mode is reserved for the manufacturer and should not be used. + * |[8] |DR |DLL Reset + * | | |Writing a '1' to this bit will reset the SDRAM DLL + * | | |This bit is self- clearing, i.e + * | | |it returns back to '0' after the DLL reset has been issued. + * |[11:9] |WR |Write Recovery + * | | |This is the value of the write recovery + * | | |It is calculated by dividing the Datasheet write recovery time, tWR (ns) by the Datasheet clock cycle time, tCK (ns) and rounding up a non-integer value to the next integer + * | | |Valid values are: + * | | |000 = 16 + * | | |001 = 5 + * | | |010 = 6 + * | | |011 = 7 + * | | |100 = 8 + * | | |101 = 10 + * | | |110 = 12 + * | | |111 = 14 + * | | |All other settings are reserved and should not be used. + * | | |Note: tWR (ns) is the time from the first SDRAM positive clock edge after the last data-in pair of a write command, to when a precharge of the same bank can be issued. + * |[12] |PD |Power-Down Control + * | | |Controls the exit time for power-down modes + * | | |Refer to the SDRAM Datasheet for details on power-down modes + * | | |Valid values are: + * | | |0 = Slow exit (DLL off) + * | | |1 = Fast exit (DLL on) + * @var DDRPHY_T::MR1 + * Offset: 0x58 Mode Register 1 (MR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DE |DLL Enable/Disable + * | | |Enable (0) or disable (1) the DLL. DLL must be enabled for normal operation. + * | | |Note: SDRAM DLL off mode is not supported + * |[1] |DIC0 |Output Driver Impedance Control + * | | |Controls the output drive strength. Valid values are: + * | | |00 = RZQ/6 + * | | |01 = RZQ7 + * | | |10 = Reserved + * | | |11 = Reserved + * |[2] |RTT0 |On Die Termination + * | | |Selects the effective resistance for SDRAM on die termination. Valid values are: + * | | |000 = ODT disabled + * | | |001 = RZQ/4 + * | | |010 = RZQ/2 + * | | |011 = RZQ/6 + * | | |100 = RZQ/12 + * | | |101 = RZQ/8 + * | | |All other settings are reserved and should not be used. + * |[4:3] |AL |Posted CAS Additive Latency + * | | |Setting additive latency that allows read and write commands to be issued to the SDRAM earlier than normal (refer to the SDRAM Datasheet for details) + * | | |Valid values are: + * | | |00 = 0 (AL disabled) + * | | |01 = CL - 1 + * | | |10 = CL - 2 + * | | |11 = Reserved + * |[5] |DIC1 |Output Driver Impedance Control + * | | |Controls the output drive strength. Valid values are: + * | | |00 = RZQ/6 + * | | |01 = RZQ7 + * | | |10 = Reserved + * | | |11 = Reserved + * |[6] |RTT1 |On Die Termination + * | | |Selects the effective resistance for SDRAM on die termination. Valid values are: + * | | |000 = ODT disabled + * | | |001 = RZQ/4 + * | | |010 = RZQ/2 + * | | |011 = RZQ/6 + * | | |100 = RZQ/12 + * | | |101 = RZQ/8 + * | | |All other settings are reserved and should not be used. + * |[7] |LEVEL |Write Leveling Enable + * | | |Enables write-leveling when set. + * |[9] |RTT2 |On Die Termination + * | | |Selects the effective resistance for SDRAM on die termination. Valid values are: + * | | |000 = ODT disabled + * | | |001 = RZQ/4 + * | | |010 = RZQ/2 + * | | |011 = RZQ/6 + * | | |100 = RZQ/12 + * | | |101 = RZQ/8 + * | | |All other settings are reserved and should not be used. + * |[11] |TDQS |Termination Data Strobe + * | | |When enabled ('1') TDQS provides additional termination resistance outputs that may be useful in some system configurations + * | | |Refer to the SDRAM Datasheet for details. + * |[12] |QOFF |Output Enable/Disable + * | | |When '0', all outputs function normal; when '1' all SDRAM outputs are disabled removing output buffer current + * | | |This feature is intended to be used for IDD characterization of read current and should not be used in normal operation. + * @var DDRPHY_T::MR2 + * Offset: 0x5C Mode Register 2/Extended Mode Register 2 (MR2/EMR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |PASR |Partial Array Self Refresh + * | | |Specifies that data located in areas of the array beyond the specified location will be lost if self refresh is entered. + * | | |Valid settings for 4 banks are: + * | | |000 = Full Array + * | | |001 = Half Array (BA[1:0] = 00 & 01) + * | | |010 = Quarter Array (BA[1:0] = 00) + * | | |011 = Not defined + * | | |100 = 3/4 Array (BA[1:0] = 01, 10, & 11) + * | | |101 = Half Array (BA[1:0] = 10 & 11) + * | | |110 = Quarter Array (BA[1:0] = 11) + * | | |111 = Not defined + * | | |Valid settings for 8 banks are: + * | | |000 = Full Array + * | | |001 = Half Array (BA[2:0] = 000, 001, 010 & 011) + * | | |010 = Quarter Array (BA[2:0] = 000, 001) + * | | |011 = 1/8 Array (BA[2:0] = 000) + * | | |100 = 3/4 Array (BA[2:0] = 010, 011, 100, 101, 110 & 111) + * | | |101 = Half Array (BA[2:0] = 100, 101, 110 & 111) + * | | |110 = Quarter Array (BA[2:0] = 110 & 111) + * | | |111 = 1/8 Array (BA[2:0] 111) + * |[5:3] |CWL |CAS Write Latency + * | | |The delay between when the SDRAM registers a write command to when write data is available + * | | |Valid values are: + * | | |000 = 5 (tCK > 2.5ns) + * | | |001 = 6 (2.5ns > tCK > 1.875ns) + * | | |010 = 7 (1.875ns > tCK> 1.5ns) + * | | |011 = 8 (1.5ns > tCK > 1.25ns) + * | | |100 = 9 (1.25ns > tCK > 1.07ns) + * | | |101 = 10 (1.07ns > tCK > 0.935ns) + * | | |110 = 11 (0.935ns > tCK > 0.833ns) + * | | |111 = 12 (0.833ns > tCK > 0.75ns) + * | | |All other settings are reserved and should not be used. + * |[6] |ASR |Auto Self-Refresh + * | | |When enabled ('1'), SDRAM automatically provides self-refresh power management functions for all supported operating temperature values + * | | |Otherwise the SRT bit must be programmed to indicate the temperature range. + * |[7] |SRT |Self-Refresh Temperature Range + * | | |Selects either normal ('0') or extended ('1') operating temperature range during self-refresh. + * |[10:9] |RTTWR |Dynamic ODT + * | | |Selects RTT for dynamic ODT. Valid values are: + * | | |00 = Dynamic ODT off + * | | |01 = RZQ/4 + * | | |10 = RZQ/2 + * | | |11 = Reserved + * @var DDRPHY_T::MR3 + * Offset: 0x60 Mode Register 3 (MR3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |MPRLOC |Multi-Purpose Register Location + * | | |Selects MPR data location: Valid value are: + * | | |00 = Predefined pattern for system calibration + * | | |All other settings are reserved and should not be used. + * |[2] |MPR |Multi-Purpose Register Enable + * | | |Enables, if set, that read data should come from the Multi-Purpose Register + * | | |Otherwise read data come from the DRAM array. + * @var DDRPHY_T::ODTCR + * Offset: 0x64 ODT Configuration Register (ODTCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |RDODT0 |Write ODT + * | | |Specifies whether ODT should be enabled ('1') or disabled ('0') on each of the up to four ranks when a write command is sent to rank n + * | | |WRODT0, WRODT1, WRODT2, and WRODT3 specify ODT settings when a write is to rank 0, rank 1, rank 2, and rank 3, respectively + * | | |The four bits of each field each represent a rank, the LSB being rank 0 and the MSB being rank 3 + * | | |Default is to enable ODT only on rank being written to. + * |[7:4] |RDODT1 |Write ODT + * | | |Specifies whether ODT should be enabled ('1') or disabled ('0') on each of the up to four ranks when a write command is sent to rank n + * | | |WRODT0, WRODT1, WRODT2, and WRODT3 specify ODT settings when a write is to rank 0, rank 1, rank 2, and rank 3, respectively + * | | |The four bits of each field each represent a rank, the LSB being rank 0 and the MSB being rank 3 + * | | |Default is to enable ODT only on rank being written to. + * |[11:8] |RDODT2 |Write ODT + * | | |Specifies whether ODT should be enabled ('1') or disabled ('0') on each of the up to four ranks when a write command is sent to rank n + * | | |WRODT0, WRODT1, WRODT2, and WRODT3 specify ODT settings when a write is to rank 0, rank 1, rank 2, and rank 3, respectively + * | | |The four bits of each field each represent a rank, the LSB being rank 0 and the MSB being rank 3 + * | | |Default is to enable ODT only on rank being written to. + * |[15:12] |RDODT3 |Write ODT + * | | |Specifies whether ODT should be enabled ('1') or disabled ('0') on each of the up to four ranks when a write command is sent to rank n + * | | |WRODT0, WRODT1, WRODT2, and WRODT3 specify ODT settings when a write is to rank 0, rank 1, rank 2, and rank 3, respectively + * | | |The four bits of each field each represent a rank, the LSB being rank 0 and the MSB being rank 3 + * | | |Default is to enable ODT only on rank being written to. + * |[19:16] |WRODT0 |Read ODT + * | | |Specifies whether ODT should be enabled ('1') or disabled ('0') on each of the up to four ranks when a read command is sent to rank n + * | | |RDODT0, RDODT1, RDODT2, and RDODT3 specify ODT settings when a read is to rank 0, rank 1, rank 2, and rank 3, respectively + * | | |The four bits of each field each represent a rank, the LSB being rank 0 and the MSB being rank 3 + * | | |Default is to disable ODT during reads + * |[23:20] |WRODT1 |Read ODT + * | | |Specifies whether ODT should be enabled ('1') or disabled ('0') on each of the up to four ranks when a read command is sent to rank n + * | | |RDODT0, RDODT1, RDODT2, and RDODT3 specify ODT settings when a read is to rank 0, rank 1, rank 2, and rank 3, respectively + * | | |The four bits of each field each represent a rank, the LSB being rank 0 and the MSB being rank 3 + * | | |Default is to disable ODT during reads + * |[27:24] |WRODT2 |Read ODT + * | | |Specifies whether ODT should be enabled ('1') or disabled ('0') on each of the up to four ranks when a read command is sent to rank n + * | | |RDODT0, RDODT1, RDODT2, and RDODT3 specify ODT settings when a read is to rank 0, rank 1, rank 2, and rank 3, respectively + * | | |The four bits of each field each represent a rank, the LSB being rank 0 and the MSB being rank 3 + * | | |Default is to disable ODT during reads + * |[31:28] |WRODT3 |Read ODT + * | | |Specifies whether ODT should be enabled ('1') or disabled ('0') on each of the up to four ranks when a read command is sent to rank n + * | | |RDODT0, RDODT1, RDODT2, and RDODT3 specify ODT settings when a read is to rank 0, rank 1, rank 2, and rank 3, respectively + * | | |The four bits of each field each represent a rank, the LSB being rank 0 and the MSB being rank 3 + * | | |Default is to disable ODT during reads + * @var DDRPHY_T::DTCR + * Offset: 0x68 Data Training Configuration Register (DTCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |DTCOL |Data Training Column Address + * | | |Selects the SDRAM column address to be used during data training + * | | |The lower four bits of this address must always be "000". + * |[27:12] |DTROW |Data Training Row Address + * | | |Selects the SDRAM row address to be used during data training. + * |[30:28] |DTBANK |Data Training Bank Address + * | | |Selects the SDRAM bank address to be used during data training. + * @var DDRPHY_T::DTAR0 + * Offset: 0x6C Data Training Address Register 0 (DTAR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var DDRPHY_T::DTAR1 + * Offset: 0x70 Data Training Address Register 1 (DTAR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |DTCOL |Data Training Column Address + * | | |Selects the SDRAM column address to be used during data training + * | | |The lower four bits of this address must always be "000". + * |[27:12] |DTROW |Data Training Row Address + * | | |Selects the SDRAM row address to be used during data training. + * |[30:28] |DTBANK |Data Training Bank Address + * | | |Selects the SDRAM bank address to be used during data training. + * @var DDRPHY_T::DTAR2 + * Offset: 0x74 Data Training Address Register 2 (DTAR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |DTCOL |Data Training Column Address + * | | |Selects the SDRAM column address to be used during data training + * | | |The lower four bits of this address must always be "000". + * |[27:12] |DTROW |Data Training Row Address + * | | |Selects the SDRAM row address to be used during data training. + * |[30:28] |DTBANK |Data Training Bank Address + * | | |Selects the SDRAM bank address to be used during data training. + * @var DDRPHY_T::DTAR3 + * Offset: 0x78 Data Training Address Register 3 (DTAR3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |DTCOL |Data Training Column Address + * | | |Selects the SDRAM column address to be used during data training + * | | |The lower four bits of this address must always be "000". + * |[27:12] |DTROW |Data Training Row Address + * | | |Selects the SDRAM row address to be used during data training. + * |[30:28] |DTBANK |Data Training Bank Address + * | | |Selects the SDRAM bank address to be used during data training. + * @var DDRPHY_T::DTDR0 + * Offset: 0x7C Data Training Data Register 0 (DTDR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |DTBYTE1 |Data Training Data + * | | |The first 4 bytes of data used during data training + * | | |This same data byte is used for each Byte Lane + * | | |Default sequence is a walking 1 while toggling data every data cycle. + * |[15:8] |DTBYTE0 |Data Training Data + * | | |The first 4 bytes of data used during data training + * | | |This same data byte is used for each Byte Lane + * | | |Default sequence is a walking 1 while toggling data every data cycle. + * |[23:16] |DTBYTE2 |Data Training Data + * | | |The first 4 bytes of data used during data training + * | | |This same data byte is used for each Byte Lane + * | | |Default sequence is a walking 1 while toggling data every data cycle. + * |[31:24] |DTBYTE3 |Data Training Data + * | | |The first 4 bytes of data used during data training + * | | |This same data byte is used for each Byte Lane + * | | |Default sequence is a walking 1 while toggling data every data cycle. + * @var DDRPHY_T::DTDR1 + * Offset: 0x80 Data Training Data Register 1 (DTDR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |DTBYTE4 |Data Training Data + * | | |The second 4 bytes of data used during data training + * | | |This same data byte is used for each Byte Lane + * | | |Default sequence is a walking 1 while toggling data every data cycle. + * |[15:8] |DTBYTE5 |Data Training Data + * | | |The second 4 bytes of data used during data training + * | | |This same data byte is used for each Byte Lane + * | | |Default sequence is a walking 1 while toggling data every data cycle. + * |[23:16] |DTBYTE6 |Data Training Data + * | | |The second 4 bytes of data used during data training + * | | |This same data byte is used for each Byte Lane + * | | |Default sequence is a walking 1 while toggling data every data cycle. + * |[31:24] |DTBYTE7 |Data Training Data + * | | |The second 4 bytes of data used during data training + * | | |This same data byte is used for each Byte Lane + * | | |Default sequence is a walking 1 while toggling data every data cycle. + * @var DDRPHY_T::DTEDR0 + * Offset: 0x84 Data Training Eye Data Register 0 (DTEDR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |DTWLMN |Data Training WDQ LCDL Minimum. + * |[15:8] |DTWLMX |Data Training WDQ LCDL Maximum. + * |[23:16] |DTWBMN |Data Training Write BDL Shift Minimum. + * |[31:24] |DTWBMX |Data Training Write BDL Shift Maximum. + * @var DDRPHY_T::DTEDR1 + * Offset: 0x88 Data Training Eye Data Register 1 (DTEDR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |DTRLMN |Data Training RDQS LCDL Minimum. + * |[15:8] |DTRLMX |Data Training RDQS LCDL Maximum. + * |[23:16] |DTRBMN |Data Training Read BDL Shift Minimum. + * |[31:24] |DTRBMX |Data Training Read BDL Shift Maximum. + * @var DDRPHY_T::PGCR2 + * Offset: 0x8C PHY General Configuration Register 2 (PGCR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[17:0] |tREFPRD |Refresh Period + * | | |Indicates the period, after which the PUB has to issue a refresh command to the SDRAM + * | | |This is derived from the maximum refresh interval from the Datasheet, tRFC(max) or REFI, divided by the clock cycle time + * | | |A further 400 clocks must be subtracted from the derived number to account for command flow and missed slots of refreshes in the internal PUB blocks + * | | |The default corresponds to DDR3 9*7.8us at 1066 MHz when a burst of 9 refreshes are issued at every refresh interval. + * |[18] |NOBUB |No Bubbles + * | | |Specified whether reads should be returned to the controller with no bubbles + * | | |Enabling no-bubble reads increases the read latency + * | | |Valid values are: + * | | |0 = Bubbles are allowed during reads + * | | |1 = Bubbles are not allowed during reads + * |[19] |FXDLAT |Fixed Latency + * | | |Specified whether all reads should be returned to the controller with a fixed read latency + * | | |Enabling fixed read latency increases the read latency + * | | |Valid values are: + * | | |0 = Disable fixed read latency + * | | |1 = Enable fixed read latency + * | | |Fixed read latency is calculated as (12 + (maximum DXnGTR.RxDGSL)/2) HDR + * | | |clock cycles + * |[27:20] |DTPMXTMR |Data Training PUB Mode Timer Exit + * | | |Specifies the number of controller clocks to wait when entering and exiting pub mode data training + * | | |The default value ensures controller refreshes do not cause memory model errors when entering and exiting data training + * | | |The value should be increased if controller initiated SDRAM ZQ short or long operation may occur just before or just after the execution of data training. + * |[28] |SHRAC |Shared-AC mode + * | | |Set to 1 to enable shared address/command mode with two independent data channels - available only if shared address/command mode support is compiled in. + * |[29] |ACPDDC |AC Power-Down with Dual Channels + * | | |Set to 1 to power-down address/command lane when both data channels are powered-down + * | | |Only valid in shared-AC mode. + * |[30] |LPMSTRC0 |Low-Power Master Channel 0 + * | | |Set to 1 to have channel 0 act as master to drive channel 1 low-power functions simultaneously + * | | |Only valid in shared-AC mode. + * |[31] |DYNACPDD |Dynamic AC Power Down Driver + * | | |Powers down, when set, the output driver on I/O for ADDR and BA + * | | |This bit is ORed with bit ACIOCR[3] (ACPDD). + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * @var DDRPHY_T::RDIMMGCR0 + * Offset: 0xB0 RDIMM General Configuration Register 0 (RDIMMGCR0) 123 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDIMM |Registered DIMM + * | | |Indicates, if set, that a registered DIMM is used + * | | |In this case, the PUB increases the SDRAM write and read latencies (WL/RL) by 1 and also enforces that accesses adhere to RDIMM buffer chip + * | | |This only applies to PUB internal SDRAM transactions + * | | |Transactions generated by the controller must make its own adjustments to WL/RL when using a registered DIMM + * | | |The DCR.NOSRA register bit must be set to '1' if using the standard RDIMM buffer chip so that normal DRAM accesses do not assert multiple chip select bits at the same time. + * |[1] |ERRNOREG |Parity Error No Registering + * | | |Indicates, if set, that parity error signal from the RDIMM should be passed to the DFI controller without any synchronization or registering + * |[2] |SOPERR |Stop On Parity Error + * | | |Indicates, if set, that the PUB is to stop driving commands to the DRAM upon encountering a parity error + * | | |Transactions can resume only after status is cleared via PIR.CLRSR. + * |[14] |PARINODT |PAR_IN On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for PAR_IN pin. + * |[15] |PARINPDD |PAR_IN Power Down Driver + * | | |Powers down, when set, the output driver on the I/O for PAR_IN pin. + * |[16] |PARINPDR |PAR_IN Power Down Receiver + * | | |Powers down, when set, the input receiver on the I/O for PAR_IN pin. + * |[17] |PARINIOM |PAR_IN I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for PAR_IN pin. + * |[18] |PARINOE |PAR_IN Output Enable + * | | |Enables, when set, the output driver on the I/O for PAR_IN pin. + * |[19] |ERROUTODT |ERROUT# On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for ERROUT# pin. + * |[20] |ERROUTPDD |ERROUT# Power Down Driver + * | | |Powers down, when set, the output driver on the I/O for ERROUT# pin. + * |[21] |ERROUTPDR |ERROUT# Power Down Receiver + * | | |Powers down, when set, the input receiver on the I/O for ERROUT# pin. + * |[22] |ERROUTIOM |ERROUT# I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for ERROUT# pin. + * |[23] |ERROUTOE |ERROUT# Output Enable + * | | |Enables, when set, the output driver on the I/O for ERROUT# pin. + * |[24] |RDIMMODT |RDIMM Outputs On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for QCSEN# and MIRROR pins. + * |[25] |RDIMMPDD |RDIMM Outputs Power Down Driver + * | | |Powers down, when set, the output driver on the I/O for QCSEN# and MIRROR pins. + * |[26] |RDIMMPDR |RDIMM Outputs Power Down Receiver + * | | |Powers down, when set, the input receiver on the I/O for QCSEN# and MIRROR pins. + * |[27] |RDIMMIOM |RDIMM Outputs I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for QCSEN# and MIRROR pins. + * |[28] |QCSENOE |QCSEN# Output Enable + * | | |Enables, when set, the output driver on the I/O for QCSEN# pin. + * |[29] |MIRROROE |MIRROR Output Enable + * | | |Enables, when set, the output driver on the I/O for MIRROR pin. + * |[30] |QCSEN |RDMIMM Quad CS Enable + * | | |Enables, if set, the Quad CS mode for the RDIMM registering buffer chip + * | | |This register bit controls the buffer chip QCSEN# signal. + * |[31] |MIRROR |RDIMM Mirror + * | | |Selects between two different ballouts of the RDIMM buffer chip for front or back operation + * | | |This register bit controls the buffer chip MIRROR signal. + * @var DDRPHY_T::RDIMMGCR1 + * Offset: 0xB4 RDIMM General Configuration Register 1 (RDIMMGCR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |tBCSTAB |Stabilization time + * | | |Number of DRAM clock cycles for the RDIMM buffer chip to stabilize + * | | |This parameter corresponds to the buffer chip tSTAB parameter + * | | |Default value is in decimal format and corresponds to 6us at 533 MHz. + * |[14:12] |tBCMRD |Command word to command word programming delay + * | | |Number of DRAM clock cycles between two RDIMM buffer chip command programming accesses + * | | |The value used for tBCMRD is 8 plus the value programmed in these bits, i.e + * | | |tBCMRD value ranges from 8 to 15 + * | | |This parameter corresponds to the buffer chip tMRD parameter. + * |[31:16] |CRINIT |Control Registers Initialization Enable + * | | |Indicates which RDIMM buffer chip control registers (RC0 to RC15) should be initialized (written) when the PUB is triggered to initialize the buffer chip + * | | |A setting of '1' on CRINIT[n] bit means that CRn should be written during initialization. + * @var DDRPHY_T::RDIMMCR0 + * Offset: 0xB8 RDIMM Control Register 0 (RDIMMCR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |RC0 |Control Word 0 + * | | |Bit definitions are: + * | | |RC0[0]: 0 = Output inversion enabled, 1 = Output inversion disabled. + * | | |RC0[1]: 0 = Floating outputs disabled, 1 = Floating outputs enabled. + * | | |RC0[2]: 0 = A outputs enabled, 1 = A outputs disabled. + * | | |RC0[3]: 0 = B outputs enabled, 1 = B outputs disabled. + * |[7:4] |RC1 |Control Word 1 + * | | |Bit definitions are: + * | | |RC1[0]: 0 = Y0/Y0# clock enabled, 1 = Y0/Y0# clock disabled. + * | | |RC1[1]: 0 = Y1/Y1# clock enabled, 1 = Y1/Y1# clock disabled. + * | | |RC1[2]: 0 = Y2/Y2# clock enabled, 1 = Y2/Y2# clock disabled. + * | | |RC1[3]: 0 = Y3/Y3# clock enabled, 1 = Y3/Y3# clock disabled. + * |[11:8] |RC2 |Control Word 2 + * | | |Bit definitions are: + * | | |RC2[0]: 0 = Standard (1/2 clock) pre-launch, 1 = Prelaunch controlled by RC1. + * | | |RC2[1]: 0 = Reserved. + * | | |RC2[2]: 0 = 100 Ohm input bus termination, 1 = 150 Ohm input bus termination. + * | | |RC2[3]: 0 = Operation frequency band 1, 1 = Test mode frequency band 2. + * |[15:12] |RC3 |Control Word 3 + * | | |RC3[1:0] is driver settings for command/address A outputs, and RC3[3:2] is driver settings for command/address B outputs + * | | |Bit definitions are: + * | | |00 = Light drive (4 or 5 DRAM loads) + * | | |01 = Moderate drive (8 or 10 DRAM loads) + * | | |10 = Strong drive (16 or 20 DRAM loads) + * | | |11 = Reserved + * |[19:16] |RC4 |Control Word 4 + * | | |RC4[1:0] is driver settings for control A outputs, and RC4[3:2] is driver settings for control B outputs + * | | |Bit definitions are: + * | | |00 = Light drive (4 or 5 DRAM loads) + * | | |01 = Moderate drive (8 or 10 DRAM loads) + * | | |10 = Reserved + * | | |11 = Reserved + * |[23:20] |RC5 |Control Word 5 + * | | |RC5[1:0] is driver settings for clock Y1, Y1#, Y3, and Y3# outputs, and RC5[3:2] is driver settings for clock Y0, Y0#, Y2, and Y2# outputs + * | | |Bit definitions are: + * | | |00 = Light drive (4 or 5 DRAM loads) + * | | |01 = Moderate drive (8 or 10 DRAM loads) + * | | |10 = Strong drive (16 or 20 DRAM loads) + * | | |11 = Reserved + * |[27:24] |RC6 |Control Word 6 + * | | |Reserved, free to use by vendor. + * |[31:28] |RC7 |Control Word 7 + * | | |Reserved, free to use by vendor. + * @var DDRPHY_T::RDIMMCR1 + * Offset: 0xBC RDIMM Control Register 1 (RDIMMCR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |RC8 |Control Word 8 + * | | |RC8[2:0] is Input Bus Termination (IBT) setting as follows: + * | | |000 = IBT as defined in RC2. + * | | |001 = Reserved + * | | |010 = 200 Ohm + * | | |011 = Reserved + * | | |100 = 300 Ohm + * | | |101 = Reserved + * | | |110 = Reserved + * | | |111 = Off + * | | |RC8[3]: 0 = IBT off when MIRROR is HIGH, 1 = IBT on when MIRROR is high + * |[7:4] |RC9 |Control Word 9 + * | | |Bit definitions are: + * | | |RC9[0]: 0 = Floating outputs as defined in RC0, 1 = Weak drive enabled. + * | | |RC9[1]: 0 = Reserved. + * | | |RC9[2]: 0 = CKE power down with IBT ON, QxODT is a function of DxODT, 1 = CKE power down with IBT off, QxODT held LOW + * | | |RC9[2] is valid only when RC9[3] is 1. + * | | |RC9[3]: 0 = CKE Power-down mode disabled, 1 = CKE Power-down mode enabled. + * |[11:8] |RC10 |Control Word 10 + * | | |RC10[2:0] is RDIMM operating speed setting as follows: + * | | |000 = DDR3/DDR3L-800 + * | | |001 = DDR3/DDR3L-1066 + * | | |010 = DDR3/DDR3L-1333 + * | | |011 = DDR3/DDR3L-1600 + * | | |100 = Reserved + * | | |101 = Reserved + * | | |110 = Reserved + * | | |111 = Reserved + * | | |RC10[3]: Don't care. + * |[15:12] |RC11 |Control Word 11 + * | | |RC10[1:0] is VDD operating voltage setting as follows: + * | | |00 = DDR3 1.5V mode + * | | |01 = DDR3L 1.35V mode + * | | |10 = Reserved + * | | |11 = Reserved + * | | |RC10[3:2]: Reserved. + * |[19:16] |RC12 |Control Word 12 + * | | |Reserved for future use. + * |[23:20] |RC13 |Control Word 13 + * | | |Reserved for future use. + * |[27:24] |RC14 |Control Word 14 + * | | |Reserved for future use + * |[31:28] |RC15 |Control Word 15 + * | | |Reserved for future use + * @var DDRPHY_T::DCUAR + * Offset: 0xC0 DCU Address Register (DCUAR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |CWADDR |Cache Word Address + * | | |Address of the cache word to be accessed. + * |[7:4] |CSADDR |Cache Slice Address + * | | |Address of the cache slice to be accessed. + * |[9:8] |CSEL |Cache Select + * | | |Selects the cache to be accessed. Valid values are: + * | | |00 = Command cache + * | | |01 = Expected data cache + * | | |10 = Read data cache + * | | |11 = Reserved + * |[10] |INCA |Increment Address + * | | |Specifies, if set, that the cache address specified in WADDR and SADDR should be automatically incremented after each access of the cache + * | | |The increment happens in such a way that all the slices of a selected word are first accessed before going to the next word. + * |[11] |ATYPE |Access Type + * | | |Specifies the type of access to be performed using this address. Valid values are: + * | | |0 = Write access + * | | |1 = Read access + * @var DDRPHY_T::DCUDR + * Offset: 0xC4 DCU Data Register (DCUDR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CDATA |Cache Data + * | | |Data to be written to or read from a cache + * | | |This data corresponds to the cache word slice specified by the DCU Address Register. + * @var DDRPHY_T::DCURR + * Offset: 0xC8 DCU Run Register (DCURR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |DINST |DCU Instruction + * | | |Selects the DCU command to be executed: Valid values are: + * | | |0000 = NOP: No operation + * | | |0001 = Run: Triggers the execution of commands in the command cache. + * | | |0010 = Stop: Stops the execution of commands in the command cache. + * | | |0011 = Stop Loop: Stops the execution of an infinite loop in the command cache. + * | | |0100 = Reset: Resets all DCU run time registers. See "DCU Status" for details. + * | | |0101 - 1111 Reserved + * |[7:4] |SADDR |Start Address + * | | |Cache word address where the execution of commands should begin. + * |[11:8] |EADDR |End Address + * | | |Cache word address where the execution of command should end. + * |[19:12] |NFAIL |Number of Failures + * | | |Specifies the number of failures after which the execution of commands and the capture of read data should stop if SONF bit of this register is set + * | | |Execution of commands and the capture of read data will stop after (NFAIL+1) failures if SONF is set. + * | | |Valid values are from 0 to 254. + * |[20] |SONF |Stop On Nth Fail + * | | |Specifies, if set, that the execution of commands and the capture of read data should stop when there are N read data failures + * | | |The number of failures is specified by NFAIL + * | | |Otherwise commands execute until the end of the program or until manually stopped using a STOP command. + * |[21] |SCOF |Stop Capture On Full + * | | |Specifies, if set, that the capture of read data should stop when the capture cache is full. + * |[22] |RCEN |Read Capture Enable + * | | |Indicates, if set, that read data coming back from the SDRAM should be captured into the read data cache. + * |[23] |XCEN |Expected Compare Enable + * | | |Indicates, if set, that read data coming back from the SDRAM should be should be compared with the expected data. + * @var DDRPHY_T::DCULR + * Offset: 0xCC DCU Loop Register (DCULR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |LSADDR |Loop Start Address + * | | |Command cache word address where the loop should start. + * |[7:4] |LEADDR |Loop End Address + * | | |Command cache word address where the loop should end. + * |[15:8] |LCNT |Loop Count + * | | |The number of times that the loop should be executed if LINF is not set. + * |[16] |LINF |Loop Infinite + * | | |Indicates, if set, that the loop should be executed indefinitely until stopped by the STOP command + * | | |Otherwise the loop is execute LCNT times. + * |[17] |IDA |Increment DRAM Address + * | | |Indicates, if set, that DRAM addresses should be incremented every time a DRAM read/write command inside the loop is executed. + * |[31:28] |XLEADDR |Expected Data Loop End Address + * | | |The last expected data cache word address that contains valid expected data + * | | |Expected data should be looped between 0 and this address. + * | | |XLEADDR field uses only the following bits based on the cache depth: + * | | |DCU expected data cache = 4, XLEADDR[1:0] + * | | |DCU expected data cache = 8, XLEADDR[2:0] + * | | |DCU expected data cache = 16, XLEADDR[3:0] + * @var DDRPHY_T::DCUGCR + * Offset: 0xD0 DCU General Configuration Register (DCUGCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RCSW |Read Capture Start Word + * | | |The capture and compare of read data should start after Nth word + * | | |For example setting this value to 12 will skip the first 12 read data. + * @var DDRPHY_T::DCUTPR + * Offset: 0xD4 DCU Timing Parameter Register (DCUTPR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |tDCUT0 |DCU Generic Timing Parameter 0 + * |[15:8] |tDCUT1 |DCU Generic Timing Parameter 1 + * |[23:16] |tDCUT2 |DCU Generic Timing Parameter 2 + * |[31:24] |tDCUT3 |DCU Generic Timing Parameter 3 + * @var DDRPHY_T::DCUSR0 + * Offset: 0xD8 DCU Status Register 0 (DCUSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDONE |Run Done + * | | |Indicates, if set, that the DCU has finished executing the commands in the command cache + * | | |This bit is also set to indicate that a STOP command has successfully been executed and command execution has stopped. + * |[1] |CFAIL |Capture Fail + * | | |Indicates, if set, that at least one read data word has failed. + * |[2] |CFULL |Capture Full + * | | |Indicates, if set, that the capture cache is full. + * @var DDRPHY_T::DCUSR1 + * Offset: 0xDC DCU Status Register 1 (DCUSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RDCNT |Read Count + * | | |Number of read words returned from the SDRAM. + * |[23:16] |FLCNT |Fail Count + * | | |Number of read words that have failed. + * |[31:24] |LPCNT |Loop Count + * | | |Indicates the value of the loop count + * | | |This is useful when the program has stopped because of failures to assess how many reads were executed before first fail. + * @var DDRPHY_T::BISTRR + * Offset: 0x100 BIST Run Register (BISTRR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |BINST |BIST Instruction + * | | |Selects the BIST instruction to be executed: Valid values are: + * | | |000 = NOP: No operation + * | | |001 = Run: Triggers the running of the BIST. + * | | |010 = Stop: Stops the running of the BIST. + * | | |011 = Reset: Resets all BIST run-time registers, such as error counters. + * | | |100 - 111 Reserved + * |[3] |BMODE |BIST Mode + * | | |Selects the mode in which BIST is run. Valid values are: + * | | |0 = Loopback mode: Address, commands and data loop back at the PHY I/Os. + * | | |1 = DRAM mode: Address, commands and data go to DRAM for normal memory accesses. + * |[4] |BINF |BIST Infinite Run + * | | |Specifies, if set, that the BIST should be run indefinitely until when it is either stopped or a failure has been encountered + * | | |Otherwise BIST is run until number of BIST words specified in the BISTWCR register has been generated. + * |[12:5] |NFAIL |Number of Failures + * | | |Specifies the number of failures after which the execution of commands and the capture of read data should stop if BSONF bit of this register is set + * | | |Execution of commands and the capture of read data will stop after (NFAIL+1) failures if BSONF is set. + * |[13] |BSONF |BIST Stop On Nth Fail + * | | |Specifies, if set, that the BIST should stop when an nth data word or address/command comparison error has been encountered. + * |[14] |BDXEN |BIST DATX8 Enable + * | | |Enables the running of BIST on the data byte lane PHYs + * | | |This bit is exclusive with BACEN, i.e + * | | |both cannot be set to '1' at the same time. + * |[15] |BACEN |BIST AC Enable + * | | |Enables the running of BIST on the address/command lane PHY + * | | |This bit is exclusive with BDXEN, i.e + * | | |both cannot be set to '1' at the same time. + * |[16] |BDMEN |BIST Data Mask Enable + * | | |Enables, if set, that the data mask BIST should be included in the BIST run, i.e + * | | |data pattern generated and loopback data compared + * | | |This is valid only for loopback mode. + * |[18:17] |BDPAT |BIST Data Pattern + * | | |Selects the data pattern used during BIST. Valid values are: + * | | |00 = Walking 0 + * | | |01 = Walking 1 + * | | |10 = LFSR-based pseudo-random + * | | |11 = User programmable (Not valid for AC loopback). + * |[22:19] |BDXSEL |BIST DATX8 Select + * | | |Select the byte lane for comparison of loopback/read data. Valid values are 0 to 8. + * |[24:23] |BCKSEL |BIST CK Select + * | | |Selects the CK that should be used to register the AC loopback signals from the I/Os. Valid values are: + * | | |00 = CK[0] + * | | |01 = CK[1] + * | | |10 = CK[2] + * | | |11 = Reserved + * |[26:25] |BCCSEL |BIST Clock Cycle Select + * | | |Selects the clock numbers on which the AC loopback data is written into the FIFO + * | | |Data is written into the loopback FIFO once every four clock cycles + * | | |Valid values are: + * | | |00 = Clock cycle 0, 4, 8, 12, etc. + * | | |01 = Clock cycle 1, 5, 9, 13, etc. + * | | |10 = Clock cycle 2, 6, 10, 14, etc. + * | | |11 = Clock cycle 3, 7, 11, 15, etc. + * @var DDRPHY_T::BISTWCR + * Offset: 0x104 BIST Word Count Register (BISTWCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |BWCNT |BIST Word Count + * | | |Indicates the number of words to generate during BIST + * | | |This must be a multiple of DRAM burst length (BL) divided by 2, e.g + * | | |for BL=8, valid values are 4, 8, 12, 16, and so on. + * @var DDRPHY_T::BISTMSKR0 + * Offset: 0x108 BIST Mask Register 0 (BISTMSKR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |AMSK |Address Mask + * | | |Mask bit for each of the up to 16 address bits. + * |[18:16] |BAMSK |Bank Address Mask + * | | |Mask bit for each of the up to 3 bank address bits. + * |[19] |WEMSK |WE Mask + * | | |Mask bit for the WE#. + * |[23:20] |CKEMSK |CKE Mask + * | | |Mask bit for each of the up to 4 CKE bits. + * |[27:24] |CSMSK |CS Mask + * | | |Mask bit for each of the up to 4 CS# bits. + * |[31:28] |ODTMSK |ODT Mask + * | | |Mask bit for each of the up to 4 ODT bits. + * @var DDRPHY_T::BISTMSKR1 + * Offset: 0x10C BIST Mask Register 1 (BISTMSKR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RASMSK |RAS Mask + * | | |Mask bit for the RAS. + * |[1] |CASMSK |CAS Mask + * | | |Mask bit for the CAS. + * |[27] |PARMSK |Mask bit for the PAR_IN + * | | |Only for DIMM parity support and only if the design is compiled for less than 3 ranks. + * |[31:28] |DMMSK |DM Mask + * | | |Mask bit for the data mask (DM) bit. + * @var DDRPHY_T::BISTMSKR2 + * Offset: 0x110 BIST Mask Register 2 (BISTMSKR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DQMSK |DQ Mask + * | | |Mask bit for each of the 8 data (DQ) bits. + * @var DDRPHY_T::BISTLSR + * Offset: 0x114 BIST LFSR Seed Register (BISTLSR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |LFSR seed + * | | |LFSR seed for pseudo-random BIST patterns. + * @var DDRPHY_T::BISTAR0 + * Offset: 0x118 BIST Address Register 0 (BISTAR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |BCOL |BIST Column Address + * | | |Selects the SDRAM column address to be used during BIST + * | | |The lower bits of this address must be "0000" for BL16, "000" for BL8, "00" for BL4 and "0" for BL2. + * |[27:12] |BROW |BIST Row Address + * | | |Selects the SDRAM row address to be used during BIST. + * |[30:28] |BBANK |BIST Bank Address + * | | |Selects the SDRAM bank address to be used during BIST. + * @var DDRPHY_T::BISTAR1 + * Offset: 0x11C BIST Address Register 1 (BISTAR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |BRANK |BIST Rank + * | | |Selects the SDRAM rank to be used during BIST. Valid values range from 0 to maximum ranks minus 1. + * |[3:2] |BMRANK |BIST Maximum Rank + * | | |Specifies the maximum SDRAM rank to be used during BIST + * | | |The default value is set to maximum ranks minus 1 + * | | |Example default shown here is for a 4-rank system + * |[15:4] |BAINC |BIST Address Increment + * | | |Selects the value by which the SDRAM address is incremented for each write/read access + * | | |This value must be at the beginning of a burst boundary, i.e + * | | |the lower bits must be "0000" for BL16, "000" for BL8, "00" for BL4 and "0" for BL2. + * @var DDRPHY_T::BISTAR2 + * Offset: 0x120 BIST Address Register 2 (BISTAR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |BMCOL |BIST Maximum Column Address + * | | |Specifies the maximum SDRAM column address to be used during BIST before the address increments to the next row. + * |[27:12] |BMROW |BIST Maximum Row Address + * | | |Specifies the maximum SDRAM row address to be used during BIST before the address increments to the next bank. + * |[30:28] |BMBANK |BIST Maximum Bank Address + * | | |Specifies the maximum SDRAM bank address to be used during BIST before the address increments to the next rank. + * @var DDRPHY_T::BISTUDPR + * Offset: 0x124 BIST User Data Pattern Register (BISTUDPR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |BUDP0 |BIST User Data Pattern 0 + * | | |Data to be applied on even DQ pins during BIST. + * |[31:16] |BUDP1 |BIST User Data Pattern 1 + * | | |Data to be applied on odd DQ pins during BIST. + * @var DDRPHY_T::BISTGSR + * Offset: 0x128 BIST General Status Register (BISTGSR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BDONE |BIST Done + * | | |Indicates, if set, that the BIST has finished executing + * | | |This bit is reset to zero when BIST is triggered. + * |[1] |BACERR |BIST Address/Command Error + * | | |indicates, if set, that there is a data comparison error in the address/command lane. + * |[2] |BDXERR |BIST Data Error + * | | |indicates, if set, that there is a data comparison error in the byte lane. + * |[17:16] |PARBER |PAR_IN Bit Error + * | | |Indicates the number of bit errors on PAR_IN + * |[27:20] |DMBER |DM Bit Error + * | | |Indicates the number of bit errors on data mask (DM) bit + * | | |DMBER[1:0] are for even DQS cycles first DM beat, and DMBER[3:2] are for even DQS cycles second DM beat + * | | |Similarly, DMBER[5:4] are for odd DQS cycles first DM beat, and DMBER[7:6] are for odd DQS cycles second DM beat. + * |[29:28] |RASBER |RAS Bit Error + * | | |Indicates the number of bit errors on RAS. + * |[31:30] |CASBER |CAS Bit Error + * | | |Indicates the number of bit errors on CAS. + * @var DDRPHY_T::BISTWER + * Offset: 0x12C BIST Word Error Register (BISTWER) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |ACWER |Address/Command Word Error + * | | |Indicates the number of word errors on the address/command lane + * | | |An error on any bit of the address/command bus increments the error count. + * |[31:16] |DXWER |Byte Word Error + * | | |Indicates the number of word errors on the byte lane + * | | |An error on any bit of the data bus including the data mask bit increments the error count. + * @var DDRPHY_T::BISTBER0 + * Offset: 0x130 BIST Bit Error Register 0 (BISTBER0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ABER |Address Bit Error + * | | |Each group of two bits indicate the bit error count on each of the up to 16 address bits + * | | |[1:0] is the error count for A[0], [3:2] for A[1], and so on. + * @var DDRPHY_T::BISTBER1 + * Offset: 0x134 BIST Bit Error Register 1 (BISTBER1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |BABER |Bank Address Bit Error + * | | |Each group of two bits indicate the bit error count on each of the up to 3 bank address bits + * | | |[1:0] is the error count for BA[0], [3:2] for BA[1], and so on. + * |[7:6] |WEBER |WE# Bit Error + * | | |Indicates the number of bit errors on WE#. + * |[15:8] |CKEBER |CKE Bit Error + * | | |Each group of two bits indicate the bit error count on each of the up to 4 CKE bits + * | | |[1:0] is the error count for CKE[0], [3:2] for CKE[1], and so on. + * |[23:16] |CSBER |CS# Bit Error + * | | |Each group of two bits indicate the bit error count on each of the up to 4 CS# bits + * | | |[1:0] is the error count for CS#[0], [3:2] for CS#[1], and so on. + * |[31:24] |ODTBER |ODT Bit Error + * | | |Each group of two bits indicates the bit error count on each of the up to 4 ODT bits + * | | |[1:0] is the error count for ODT[0], [3:2] for ODT[1], and so on. + * @var DDRPHY_T::BISTBER2 + * Offset: 0x138 BIST Bit Error Register 2 (BISTBER2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DQBER0 |Data Bit Error + * | | |The error count for even DQS cycles + * | | |The first 16 bits indicate the error count for the first data beat (i.e + * | | |the data driven out on DQ[7:0] on the rising edge of DQS) + * | | |The second 16 bits indicate the error on the second data beat (i.e + * | | |the error count of the data driven out on DQ[7:0] on the falling edge of DQS) + * | | |For each of the 16-bit group, the first 2 bits are for DQ[0], the second for DQ[1], and so on. + * @var DDRPHY_T::BISTBER3 + * Offset: 0x13C BIST Bit Error Register 3 (BISTBER3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DQBER1 |Data Bit Error + * | | |The error count for odd DQS cycles + * | | |The first 16 bits indicate the error count for the first data beat (i.e + * | | |the data driven out on DQ[7:0] on the rising edge of DQS) + * | | |The second 16 bits indicate the error on the second data beat (i.e + * | | |the error count of the data driven out on DQ[7:0] on the falling edge of DQS) + * | | |For each of the 16-bit group, the first 2 bits are for DQ[0], the second for DQ[1], and so on. + * @var DDRPHY_T::BISTWCSR + * Offset: 0x140 BIST Word Count Status Register (BISTWCSR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |ACWCNT |Address/Command Word Count + * | | |Indicates the number of words received from the address/command lane. + * |[31:16] |DXWCNT |Byte Word Count + * | | |Indicates the number of words received from the byte lane. + * @var DDRPHY_T::BISTFWR0 + * Offset: 0x144 BIST Fail Word Register 0 (BISTFWR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |AWEBS |Address Word Error Bit Status + * | | |Bit status during a word error for each of the up to 16 address bits. + * |[18:16] |BAWEBS |Bank Address Word Error Bit Status + * | | |Bit status during a word error for each of the up to 3 bank address bits. + * |[19] |WEWEBS |WE Word Error Bit Status + * | | |Bit status during a word error for the WE#. + * |[23:20] |CKEWEBS |CKE Word Error Bit Status + * | | |Bit status during a word error for each of the up to 4 CKE bits. + * |[27:24] |CSWEBS |CS Word Error Bit Status + * | | |Bit status during a word error for each of the up to 4 CS# bits. + * |[31:28] |ODTWEBS |ODT Word Error Bit Status + * | | |Bit status during a word error for each of the up to 4 ODT bits. + * @var DDRPHY_T::BISTFWR1 + * Offset: 0x148 BIST Fail Word Register 1 (BISTFWR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RASWEBS |RAS Word Error Bit Status + * | | |Bit status during a word error for the RAS. + * |[1] |CASWEBS |CAS Word Error Bit Status + * | | |Bit status during a word error for the CAS. + * |[26] |PARWEBS |PAR_IN Word Error Bit Status + * | | |Bit status during a word error for the PAR_IN. Only for DIMM parity support + * |[31:28] |DMWEBS |DM Word Error Bit Status + * | | |Bit status during a word error for the data mask (DM) bit + * | | |DMWEBS [0] is for the first DM beat, DMWEBS [1] is for the second DM beat, and so on. + * @var DDRPHY_T::BISTFWR2 + * Offset: 0x14C BIST Fail Word Register 2 (BISTFWR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DQWEBS |DQ Word Error Bit Status + * | | |Bit status during a word error for each of the 8 data (DQ) bits + * | | |The first 8 bits indicate the status of the first data beat (i.e + * | | |the status of the data driven out on DQ[7:0] on the rising edge of DQS) + * | | |The second 8 bits indicate the status of the second data beat (i.e + * | | |the status of the data driven out on DQ[7:0] on the falling edge of DQS), and so on + * | | |For each of the 8-bit group, the first bit is for DQ[0], the second bit is for DQ[1], and so on. + * @var DDRPHY_T::AACR + * Offset: 0x174 Anti-Aging Control Register (AACR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[29:0] |AATR |Anti-Aging Toggle Rate + * | | |Defines the number of controller clock (ctl_clk) cycles after which the PUB will toggle the data going to DATX8 if the data channel between the controller/PUB and DATX8 has been idle for this long. + * | | |The default value corresponds to a toggling count of 4096 ctl_clk cycles + * | | |For a ctl_clk running at 533 MHz the toggle rate will be approximately 7.68us. + * | | |The default value may also be overridden by the macro + * | | |DWC_AACR_AATR_DFLT. + * |[30] |AAENC |Anti-Aging Enable Control + * | | |Enables, if set, the automatic toggling of the data going to the DATX8 when the data channel from the controller/PUB to DATX8 is idle for programmable number of clock cycles. + * |[31] |AAOENC |Anti-Aging PAD Output Enable Control + * | | |Enables, if set, anti-aging toggling on the pad output enable signal "ctl_oe_n" going into the DATX8s + * | | |This will increase power consumption for the anti-aging feature. + * @var DDRPHY_T::GPR0 + * Offset: 0x178 General Purpose Register 0 (GPR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |GPR0 |General Purpose Register 0 + * | | |General purpose register bits. + * @var DDRPHY_T::GPR1 + * Offset: 0x17C General Purpose Register 1 (GPR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |GPR1 |General Purpose Register 1 + * | | |General purpose register bits. + * @var DDRPHY_T::ZQ0CR0 + * Offset: 0x180 Impedance Control Register 0 (ZQnCR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[27:0] |ZDATA |Impedance Over-Ride Data + * | | |Data used to directly drive the impedance control. + * | | |ZDATA field mapping for D3R I/O is as follows: + * | | |ZDATA[27:20] is reserved and returns zeros on reads. + * | | |ZDATA[19:15] is used to select the pull-up on-die termination impedance. + * | | |ZDATA[14:10] is used to select the pull-down on-die termination impedance. + * | | |ZDATA[9:5] is used to select the pull-up output impedance + * | | |ZDATA[4:0] is used to select the pull-down output impedance. + * | | |Note: The default value is 0x000014A for I/O type D3R. + * |[28] |ZDEN |Impedance Over-Ride Enable + * | | |When this bit is set, it allows users to directly drive the impedance control using the data programmed in the ZDATA field + * | | |Otherwise, the control is generated automatically by the impedance control logic. + * |[29] |ZCALBYP |Impedance Calibration Bypass + * | | |Bypasses, if set, impedance calibration of this ZQ control block when impedance calibration is already in progress + * | | |Impedance calibration can be disabled prior to trigger by using the ZCALEN bit. + * |[30] |ZCALEN |Impedance Calibration Enable + * | | |Enables, if set, the impedance calibration of this ZQ control block when impedance calibration is triggered using either the ZCAL bit of PIR register or the DFI update interface. + * |[31] |ZQPD |ZQ Power Down + * | | |Powers down, if set, the PZQ cell. + * @var DDRPHY_T::ZQ0CR1 + * Offset: 0x184 Impedance Control Register 1 (ZQnCR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |ZPROG |Impedance Divide Ratio + * | | |Selects the external resistor divide ratio to be used to set the output impedance and the on-die termination as follows: + * | | |ZPROG[7:4] = On-die termination divide select + * | | |ZPROG[3:0] = Output impedance divide select + * |[12] |DFICU0 |DFI Controller Update Interface 0 + * | | |Sets this impedance controller to be enabled for calibration when the DFI controller update interface 0 (channel 0) requests an update. + * |[13] |DFICU1 |DFI Controller Update Interface 1 + * | | |Sets this impedance controller to be enabled for calibration when the DFI controller update interface 1 (channel 1) requests an update + * | | |Only valid in shared-AC mode. + * |[14] |DFICCU |DFI Concurrent Controller Update Interface + * | | |Sets this impedance controller to be enabled for calibration when both of the DFI controller update interfaces request an update on the same clock + * | | |This provides the ability to enable impedance calibration updates for the Address/Command lane + * | | |Only valid in shared-AC mode. + * |[16] |DFIPU0 |DFI Update Interface 0 + * | | |Sets this impedance controller to be enabled for calibration when the DFI PHY update interface 0 (channel 0) requests an update. + * |[17] |DFIPU1 |DFI Update Interface 1 + * | | |Sets this impedance controller to be enabled for calibration when the DFI PHY update interface 1 (channel 1) requests an update + * | | |Only valid in shared-AC mode. + * @var DDRPHY_T::ZQ0SR0 + * Offset: 0x188 Impedance Status Register 0 (ZQnSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[27:0] |ZCTRL |Impedance Control + * | | |Current value of impedance control. + * | | |ZCTRL field mapping for D3R I/O is as follows: + * | | |ZCTRL[27:20] is reserved and returns zeros on reads. + * | | |ZCTRL[19:15] is used to select the pull-up on-die termination impedance. + * | | |ZCTRL[14:10] is used to select the pull-down on-die termination impedance. + * | | |ZCTRL[9:5] is used to select the pull-up output impedance. + * | | |ZCTRL[4:0] is used to select the pull-down output impedance. + * | | |Note: The default value is 0x000014A for I/O type D3R. + * |[30] |ZERR |Impedance Calibration Error + * | | |If set, indicates that there was an error during impedance calibration. + * |[31] |ZDONE |Impedance Calibration Done + * | | |Indicates that impedance calibration has completed. + * @var DDRPHY_T::ZQ0SR1 + * Offset: 0x18C Impedance Status Register 1 (ZQnSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |ZPD |Output impedance pull-down calibration status + * | | |Valid status encodings are: + * | | |00 = Completed with no errors + * | | |01 = Overflow error + * | | |10 = Underflow error + * | | |11 = Calibration in progress + * |[3:2] |ZPU |Output impedance pull-up calibration status + * | | |Similar status encodings as ZPD. + * |[5:4] |OPD |On-die termination pull-down calibration status + * | | |Similar status encodings as ZPD. + * |[7:6] |OPU |On-die termination pull-up calibration status + * | | |Similar status encodings as ZPD. + * @var DDRPHY_T::ZQ1CR0 + * Offset: 0x190 Impedance Control Register 0 (ZQnCR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[27:0] |ZDATA |Impedance Over-Ride Data + * | | |Data used to directly drive the impedance control. + * | | |ZDATA field mapping for D3R I/O is as follows: + * | | |ZDATA[27:20] is reserved and returns zeros on reads. + * | | |ZDATA[19:15] is used to select the pull-up on-die termination impedance. + * | | |ZDATA[14:10] is used to select the pull-down on-die termination impedance. + * | | |ZDATA[9:5] is used to select the pull-up output impedance + * | | |ZDATA[4:0] is used to select the pull-down output impedance. + * | | |Note: The default value is 0x000014A for I/O type D3R. + * |[28] |ZDEN |Impedance Over-Ride Enable + * | | |When this bit is set, it allows users to directly drive the impedance control using the data programmed in the ZDATA field + * | | |Otherwise, the control is generated automatically by the impedance control logic. + * |[29] |ZCALBYP |Impedance Calibration Bypass + * | | |Bypasses, if set, impedance calibration of this ZQ control block when impedance calibration is already in progress + * | | |Impedance calibration can be disabled prior to trigger by using the ZCALEN bit. + * |[30] |ZCALEN |Impedance Calibration Enable + * | | |Enables, if set, the impedance calibration of this ZQ control block when impedance calibration is triggered using either the ZCAL bit of PIR register or the DFI update interface. + * |[31] |ZQPD |ZQ Power Down + * | | |Powers down, if set, the PZQ cell. + * @var DDRPHY_T::ZQ1CR1 + * Offset: 0x194 Impedance Control Register 1 (ZQnCR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |ZPROG |Impedance Divide Ratio + * | | |Selects the external resistor divide ratio to be used to set the output impedance and the on-die termination as follows: + * | | |ZPROG[7:4] = On-die termination divide select + * | | |ZPROG[3:0] = Output impedance divide select + * |[12] |DFICU0 |DFI Controller Update Interface 0 + * | | |Sets this impedance controller to be enabled for calibration when the DFI controller update interface 0 (channel 0) requests an update. + * |[13] |DFICU1 |DFI Controller Update Interface 1 + * | | |Sets this impedance controller to be enabled for calibration when the DFI controller update interface 1 (channel 1) requests an update + * | | |Only valid in shared-AC mode. + * |[14] |DFICCU |DFI Concurrent Controller Update Interface + * | | |Sets this impedance controller to be enabled for calibration when both of the DFI controller update interfaces request an update on the same clock + * | | |This provides the ability to enable impedance calibration updates for the Address/Command lane + * | | |Only valid in shared-AC mode. + * |[16] |DFIPU0 |DFI Update Interface 0 + * | | |Sets this impedance controller to be enabled for calibration when the DFI PHY update interface 0 (channel 0) requests an update. + * |[17] |DFIPU1 |DFI Update Interface 1 + * | | |Sets this impedance controller to be enabled for calibration when the DFI PHY update interface 1 (channel 1) requests an update + * | | |Only valid in shared-AC mode. + * @var DDRPHY_T::ZQ1SR0 + * Offset: 0x198 Impedance Status Register 0 (ZQnSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[27:0] |ZCTRL |Impedance Control + * | | |Current value of impedance control. + * | | |ZCTRL field mapping for D3R I/O is as follows: + * | | |ZCTRL[27:20] is reserved and returns zeros on reads. + * | | |ZCTRL[19:15] is used to select the pull-up on-die termination impedance. + * | | |ZCTRL[14:10] is used to select the pull-down on-die termination impedance. + * | | |ZCTRL[9:5] is used to select the pull-up output impedance. + * | | |ZCTRL[4:0] is used to select the pull-down output impedance. + * | | |Note: The default value is 0x000014A for I/O type D3R. + * |[30] |ZERR |Impedance Calibration Error + * | | |If set, indicates that there was an error during impedance calibration. + * |[31] |ZDONE |Impedance Calibration Done + * | | |Indicates that impedance calibration has completed. + * @var DDRPHY_T::ZQ1SR1 + * Offset: 0x19C Impedance Status Register 1 (ZQnSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |ZPD |Output impedance pull-down calibration status + * | | |Valid status encodings are: + * | | |00 = Completed with no errors + * | | |01 = Overflow error + * | | |10 = Underflow error + * | | |11 = Calibration in progress + * |[3:2] |ZPU |Output impedance pull-up calibration status + * | | |Similar status encodings as ZPD. + * |[5:4] |OPD |On-die termination pull-down calibration status + * | | |Similar status encodings as ZPD. + * |[7:6] |OPU |On-die termination pull-up calibration status + * | | |Similar status encodings as ZPD. + * @var DDRPHY_T::ZQ2CR0 + * Offset: 0x1A0 Impedance Control Register 0 (ZQnCR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[27:0] |ZDATA |Impedance Over-Ride Data + * | | |Data used to directly drive the impedance control. + * | | |ZDATA field mapping for D3R I/O is as follows: + * | | |ZDATA[27:20] is reserved and returns zeros on reads. + * | | |ZDATA[19:15] is used to select the pull-up on-die termination impedance. + * | | |ZDATA[14:10] is used to select the pull-down on-die termination impedance. + * | | |ZDATA[9:5] is used to select the pull-up output impedance + * | | |ZDATA[4:0] is used to select the pull-down output impedance. + * | | |Note: The default value is 0x000014A for I/O type D3R. + * |[28] |ZDEN |Impedance Over-Ride Enable + * | | |When this bit is set, it allows users to directly drive the impedance control using the data programmed in the ZDATA field + * | | |Otherwise, the control is generated automatically by the impedance control logic. + * |[29] |ZCALBYP |Impedance Calibration Bypass + * | | |Bypasses, if set, impedance calibration of this ZQ control block when impedance calibration is already in progress + * | | |Impedance calibration can be disabled prior to trigger by using the ZCALEN bit. + * |[30] |ZCALEN |Impedance Calibration Enable + * | | |Enables, if set, the impedance calibration of this ZQ control block when impedance calibration is triggered using either the ZCAL bit of PIR register or the DFI update interface. + * |[31] |ZQPD |ZQ Power Down + * | | |Powers down, if set, the PZQ cell. + * @var DDRPHY_T::ZQ2CR1 + * Offset: 0x1A4 Impedance Control Register 1 (ZQnCR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |ZPROG |Impedance Divide Ratio + * | | |Selects the external resistor divide ratio to be used to set the output impedance and the on-die termination as follows: + * | | |ZPROG[7:4] = On-die termination divide select + * | | |ZPROG[3:0] = Output impedance divide select + * |[12] |DFICU0 |DFI Controller Update Interface 0 + * | | |Sets this impedance controller to be enabled for calibration when the DFI controller update interface 0 (channel 0) requests an update. + * |[13] |DFICU1 |DFI Controller Update Interface 1 + * | | |Sets this impedance controller to be enabled for calibration when the DFI controller update interface 1 (channel 1) requests an update + * | | |Only valid in shared-AC mode. + * |[14] |DFICCU |DFI Concurrent Controller Update Interface + * | | |Sets this impedance controller to be enabled for calibration when both of the DFI controller update interfaces request an update on the same clock + * | | |This provides the ability to enable impedance calibration updates for the Address/Command lane + * | | |Only valid in shared-AC mode. + * |[16] |DFIPU0 |DFI Update Interface 0 + * | | |Sets this impedance controller to be enabled for calibration when the DFI PHY update interface 0 (channel 0) requests an update. + * |[17] |DFIPU1 |DFI Update Interface 1 + * | | |Sets this impedance controller to be enabled for calibration when the DFI PHY update interface 1 (channel 1) requests an update + * | | |Only valid in shared-AC mode. + * @var DDRPHY_T::ZQ2SR0 + * Offset: 0x1A8 Impedance Status Register 0 (ZQnSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[27:0] |ZCTRL |Impedance Control + * | | |Current value of impedance control. + * | | |ZCTRL field mapping for D3R I/O is as follows: + * | | |ZCTRL[27:20] is reserved and returns zeros on reads. + * | | |ZCTRL[19:15] is used to select the pull-up on-die termination impedance. + * | | |ZCTRL[14:10] is used to select the pull-down on-die termination impedance. + * | | |ZCTRL[9:5] is used to select the pull-up output impedance. + * | | |ZCTRL[4:0] is used to select the pull-down output impedance. + * | | |Note: The default value is 0x000014A for I/O type D3R. + * |[30] |ZERR |Impedance Calibration Error + * | | |If set, indicates that there was an error during impedance calibration. + * |[31] |ZDONE |Impedance Calibration Done + * | | |Indicates that impedance calibration has completed. + * @var DDRPHY_T::ZQ2SR1 + * Offset: 0x1AC Impedance Status Register 1 (ZQnSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |ZPD |Output impedance pull-down calibration status + * | | |Valid status encodings are: + * | | |00 = Completed with no errors + * | | |01 = Overflow error + * | | |10 = Underflow error + * | | |11 = Calibration in progress + * |[3:2] |ZPU |Output impedance pull-up calibration status + * | | |Similar status encodings as ZPD. + * |[5:4] |OPD |On-die termination pull-down calibration status + * | | |Similar status encodings as ZPD. + * |[7:6] |OPU |On-die termination pull-up calibration status + * | | |Similar status encodings as ZPD. + * @var DDRPHY_T::ZQ3CR0 + * Offset: 0x1B0 Impedance Control Register 0 (ZQnCR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[27:0] |ZDATA |Impedance Over-Ride Data + * | | |Data used to directly drive the impedance control. + * | | |ZDATA field mapping for D3R I/O is as follows: + * | | |ZDATA[27:20] is reserved and returns zeros on reads. + * | | |ZDATA[19:15] is used to select the pull-up on-die termination impedance. + * | | |ZDATA[14:10] is used to select the pull-down on-die termination impedance. + * | | |ZDATA[9:5] is used to select the pull-up output impedance + * | | |ZDATA[4:0] is used to select the pull-down output impedance. + * | | |Note: The default value is 0x000014A for I/O type D3R. + * |[28] |ZDEN |Impedance Over-Ride Enable + * | | |When this bit is set, it allows users to directly drive the impedance control using the data programmed in the ZDATA field + * | | |Otherwise, the control is generated automatically by the impedance control logic. + * |[29] |ZCALBYP |Impedance Calibration Bypass + * | | |Bypasses, if set, impedance calibration of this ZQ control block when impedance calibration is already in progress + * | | |Impedance calibration can be disabled prior to trigger by using the ZCALEN bit. + * |[30] |ZCALEN |Impedance Calibration Enable + * | | |Enables, if set, the impedance calibration of this ZQ control block when impedance calibration is triggered using either the ZCAL bit of PIR register or the DFI update interface. + * |[31] |ZQPD |ZQ Power Down + * | | |Powers down, if set, the PZQ cell. + * @var DDRPHY_T::ZQ3CR1 + * Offset: 0x1B4 Impedance Control Register 1 (ZQnCR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |ZPROG |Impedance Divide Ratio + * | | |Selects the external resistor divide ratio to be used to set the output impedance and the on-die termination as follows: + * | | |ZPROG[7:4] = On-die termination divide select + * | | |ZPROG[3:0] = Output impedance divide select + * |[12] |DFICU0 |DFI Controller Update Interface 0 + * | | |Sets this impedance controller to be enabled for calibration when the DFI controller update interface 0 (channel 0) requests an update. + * |[13] |DFICU1 |DFI Controller Update Interface 1 + * | | |Sets this impedance controller to be enabled for calibration when the DFI controller update interface 1 (channel 1) requests an update + * | | |Only valid in shared-AC mode. + * |[14] |DFICCU |DFI Concurrent Controller Update Interface + * | | |Sets this impedance controller to be enabled for calibration when both of the DFI controller update interfaces request an update on the same clock + * | | |This provides the ability to enable impedance calibration updates for the Address/Command lane + * | | |Only valid in shared-AC mode. + * |[16] |DFIPU0 |DFI Update Interface 0 + * | | |Sets this impedance controller to be enabled for calibration when the DFI PHY update interface 0 (channel 0) requests an update. + * |[17] |DFIPU1 |DFI Update Interface 1 + * | | |Sets this impedance controller to be enabled for calibration when the DFI PHY update interface 1 (channel 1) requests an update + * | | |Only valid in shared-AC mode. + * @var DDRPHY_T::ZQ3SR0 + * Offset: 0x1B8 Impedance Status Register 0 (ZQnSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[27:0] |ZCTRL |Impedance Control + * | | |Current value of impedance control. + * | | |ZCTRL field mapping for D3R I/O is as follows: + * | | |ZCTRL[27:20] is reserved and returns zeros on reads. + * | | |ZCTRL[19:15] is used to select the pull-up on-die termination impedance. + * | | |ZCTRL[14:10] is used to select the pull-down on-die termination impedance. + * | | |ZCTRL[9:5] is used to select the pull-up output impedance. + * | | |ZCTRL[4:0] is used to select the pull-down output impedance. + * | | |Note: The default value is 0x000014A for I/O type D3R. + * |[30] |ZERR |Impedance Calibration Error + * | | |If set, indicates that there was an error during impedance calibration. + * |[31] |ZDONE |Impedance Calibration Done + * | | |Indicates that impedance calibration has completed. + * @var DDRPHY_T::ZQ3SR1 + * Offset: 0x1BC Impedance Status Register 1 (ZQnSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |ZPD |Output impedance pull-down calibration status + * | | |Valid status encodings are: + * | | |00 = Completed with no errors + * | | |01 = Overflow error + * | | |10 = Underflow error + * | | |11 = Calibration in progress + * |[3:2] |ZPU |Output impedance pull-up calibration status + * | | |Similar status encodings as ZPD. + * |[5:4] |OPD |On-die termination pull-down calibration status + * | | |Similar status encodings as ZPD. + * |[7:6] |OPU |On-die termination pull-up calibration status + * | | |Similar status encodings as ZPD. + * @var DDRPHY_T::DX0GCR + * Offset: 0x1C0 DATX8 General Configuration Register (DXnGCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DXEN |Data Byte Enable + * | | |Enables, if set, the data byte + * | | |Setting this bit to '0' disables the byte, i.e + * | | |the byte is not used in PHY initialization or training and is ignored during SDRAM read/write operations. + * |[1] |DQSODT |DQS On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQS/DQS# pin of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[9] is '0'. + * |[2] |DQODT |Data On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQ and DM pins of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[10] is '0'. + * |[3] |DXIOM |Data I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the IOM configuration bit of the individual DATX8(see "DATX8 Common Configuration Register (DXCCR)"). + * |[4] |DXPDD |Data Power Down Driver + * | | |Powers down, when set, the output driver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDD configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[5] |DXPDR |Data Power Down Receiver + * | | |Powers down, when set, the input receiver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * |[6] |DQSRPD |DQSR Power Down + * | | |Powers down, if set, the PDQSR cell + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)") + * |[8:7] |DSEN |Write DQS Enable + * | | |Controls whether the write DQS going to the SDRAM is enabled (toggling) or disabled (static value) and whether the DQS is inverted + * | | |DQS# is always the inversion of DQS + * | | |These values are valid only when DQS/DQS# output enable is on, otherwise the DQS/DQS# is tristated + * | | |Valid settings are: + * | | |00 = Reserved + * | | |01 = DQS toggling with normal polarity (This should be the default setting) + * | | |10 = Reserved + * | | |11 = Reserved + * |[9] |DQSRTT |DQS Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQS/DQS# SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[1] (DQSODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[10] |DQRTT |DQ Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQ/DM SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[2] (DQODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[12:11] |RTTOH |RTT Output Hold + * | | |Indicates the number of clock cycles (from 0 to 3) after the read data postamble for which ODT control should remain set to DQSODT for DQS or DQODT for DQ/DM before disabling it (setting it to "0") when using dynamic ODT control + * | | |ODT is disabled almost RTTOH clock cycles after the read postamble. + * |[13] |RTTOAL |RTT On Additive Latency + * | | |Indicates when the ODT control of DQ/DQS SSTL I/Os is set to the value in DQODT/DQSODT during read cycles + * | | |Valid values are: + * | | |0 = ODT control is set to DQSODT/DQODT almost two cycles before read data preamble + * | | |1 = ODT control is set to DQSODT/DQODT almost one cycle before read data preamble + * |[15:14] |DXOEO |Data Byte Output Enable Override + * | | |Specifies whether the output I/O output enable for the byte lane should be set to a fixed value + * | | |Valid values are: + * | | |00 = No override. Output enable is controlled by DFI transactions + * | | |01 = Output enable is asserted (I/O is forced to output mode). + * | | |10 = Output enable is de-asserted (I/O is forced to input mode) + * | | |11 = Reserved + * |[16] |PLLRST |PLL Rest + * | | |Resets the byte PLL by driving the PLL reset pin + * | | |This bit is not self- clearing and a '0' must be written to de-assert the reset + * | | |This bit is ORed with the global PLLRST configuration bit. + * |[17] |PLLPD |PLL Power Down + * | | |Puts the byte PLL in Power-down mode by driving the PLL power down pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the power-down + * | | |This bit is ORed with the global PLLPD configuration bit. + * |[18] |GSHIFT |Gear Shift + * | | |Enables, if set, rapid locking mode on the byte PLL + * | | |This bit is ORed with the global GSHIFT configuration bit. + * |[19] |PLLBYP |PLL Bypass + * | | |Puts the byte PLL in bypass mode by driving the PLL bypass pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the bypass + * | | |This bit is ORed with the global BYP configuration bit. + * |[29:26] |WLRKEN |Write Level Rank Enable + * | | |Specifies the ranks that should be write leveled for this byte + * | | |Write leveling responses from ranks that are not enabled for write leveling for a particular byte are ignored and write leveling is flagged as done for these ranks + * | | |WLRKEN[0] enables rank 0, [1] enables rank 1, [2] enables rank 2, and [3] enables rank 3. + * |[30] |MDLEN |Master Delay Line Enable + * | | |Enables, if set, the DATX8 master delay line calibration to perform subsequent period measurements following the initial period measurements that are performed after reset or when calibration is manually triggered + * | | |These additional measurements are accumulated and filtered as long as this bit remains high + * | | |This bit is ANDed with the common DATX8 MDL enable bit. + * |[31] |CALBYP |Calibration Bypass + * | | |Prevents, if set, period measurement calibration from automatically triggering after PHY initialization. + * @var DDRPHY_T::DX0GSR0 + * Offset: 0x1C4 DATX8 General Status Registers 0 (DXnGSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WDQCAL |Write DQ Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write DQ LCDL. + * |[1] |RDQSCAL |Read DQS Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS LCDL. + * |[2] |RDQSNCAL |Read DQS# Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS# LCDL. + * |[3] |GDQSCAL |Read DQS gating Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS gating LCDL. + * |[4] |WLCAL |Write Leveling Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write leveling slave delay line. + * |[5] |WLDONE |Write Leveling Done + * | | |Indicates, if set, that the DATX8 has completed write leveling. + * |[6] |WLERR |Write Leveling Error + * | | |Indicates, if set, that there is a write leveling error in the DATX8. + * |[14:7] |WLPRD |Write Leveling Period + * | | |Returns the DDR clock period measured by the write leveling LCDL during calibration + * | | |The measured period is used to generate the control of the write leveling pipeline which is a function of the write-leveling delay and the clock period + * | | |This value is PVT compensated. + * |[15] |DPLOCK |DATX8 PLL Lock + * | | |Indicates, if set, that the DATX8 PLL has locked. This is a direct status of the DATX8 PLL lock pin. + * |[23:16] |GDQSPRD |Read DQS gating Period + * | | |Returns the DDR clock period measured by the read DQS gating LCDL during calibration + * | | |This value is PVT compensated. + * |[27:24] |QSGERR |DQS Gate Training Error + * | | |Indicates, if set, that there is an error in DQS gate training. One bit for each of the up to 4 ranks. + * |[28] |WLDQ |Write Leveling DQ Status + * | | |Captures the write leveling DQ status from the DRAM during software write leveling. + * @var DDRPHY_T::DX0GSR1 + * Offset: 0x1C8 DATX8 General Status Registers 1 (DXnGSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DLTDONE |Delay Line Test Done + * | | |Indicates, if set, that the PHY control block has finished doing period measurement of the DATX8 delay line digital test output. + * |[24:1] |DLTCODE |Delay Line Test Code + * | | |Returns the code measured by the PHY control block that corresponds to the period of the DATX8 delay line digital test output. + * @var DDRPHY_T::DX0BDLR0 + * Offset: 0x1CC DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0WBD |DQ0 Write Bit Delay + * | | |Delay select for the BDL on DQ0 write path. + * |[11:6] |DQ1WBD |DQ1 Write Bit Delay + * | | |Delay select for the BDL on DQ1 write path. + * |[17:12] |DQ2WBD |DQ2 Write Bit Delay + * | | |Delay select for the BDL on DQ2 write path. + * |[23:18] |DQ3WBD |DQ3 Write Bit Delay + * | | |Delay select for the BDL on DQ3 write path + * |[29:24] |DQ4WBD |DQ4 Write Bit Delay + * | | |Delay select for the BDL on DQ4 write path. + * @var DDRPHY_T::DX0BDLR1 + * Offset: 0x1D0 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5WBD |DQ5 Write Bit Delay + * | | |Delay select for the BDL on DQ5 write path. + * |[11:6] |DQ6WBD |DQ6 Write Bit Delay + * | | |Delay select for the BDL on DQ6 write path. + * |[17:12] |DQ7WBD |DQ7 Write Bit Delay + * | | |Delay select for the BDL on DQ7 write path. + * |[23:18] |DMWBD |DM Write Bit Delay + * | | |Delay select for the BDL on DM write path. + * |[29:24] |DSWBD |DQS Write Bit Delay + * | | |Delay select for the BDL on DQS write path + * @var DDRPHY_T::DX0BDLR2 + * Offset: 0x1D4 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DSOEBD |DQS Output Enable Bit Delay + * | | |Delay select for the BDL on DQS output enable path + * |[11:6] |DQOEBD |DQ Output Enable Bit Delay + * | | |Delay select for the BDL on DQ/DM output enable path. + * |[17:12] |DSRBD |DQS Read Bit Delay + * | | |Delay select for the BDL on DQS read path + * |[23:18] |DSNRBD |DQSN Read Bit Delay + * | | |Delay select for the BDL on DQSN read path + * @var DDRPHY_T::DX0BDLR3 + * Offset: 0x1D8 DATX8 Bit Delay Line Register 3 (DXnBDLR3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0RBD |DQ0 Read Bit Delay + * | | |Delay select for the BDL on DQ0 read path. + * |[11:6] |DQ1RBD |DQ1 Read Bit Delay + * | | |Delay select for the BDL on DQ1 read path. + * |[17:12] |DQ2RBD |DQ2 Read Bit Delay + * | | |Delay select for the BDL on DQ2 read path. + * |[23:18] |DQ3RBD |DQ3 Read Bit Delay + * | | |Delay select for the BDL on DQ3 read path + * |[29:24] |DQ4RBD |DQ4 Read Bit Delay + * | | |Delay select for the BDL on DQ4 read path. + * @var DDRPHY_T::DX0BDLR4 + * Offset: 0x1DC DATX8 Bit Delay Line Register 4 (DXnBDLR4) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5RBD |DQ5 Read Bit Delay + * | | |Delay select for the BDL on DQ5 read path. + * |[11:6] |DQ6RBD |DQ6 Read Bit Delay + * | | |Delay select for the BDL on DQ6 read path. + * |[17:12] |DQ7RBD |DQ7 Read Bit Delay + * | | |Delay select for the BDL on DQ7 read path. + * |[23:18] |DMRBD |DM Read Bit Delay + * | | |Delay select for the BDL on DM read path. + * @var DDRPHY_T::DX0LCDLR0 + * Offset: 0x1E0 DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0WLD |Rank 0 Write Leveling Delay + * | | |Rank 0 delay select for the write leveling (WL) LCDL + * |[15:8] |R1WLD |Rank 1 Write Leveling Delay + * | | |Rank 1 delay select for the write leveling (WL) LCDL + * |[23:16] |R2WLD |Rank 2 Write Leveling Delay + * | | |Rank 2 delay select for the write leveling (WL) LCDL + * |[31:24] |R3WLD |Rank 3 Write Leveling Delay + * | | |Rank 3 delay select for the write leveling (WL) LCDL + * @var DDRPHY_T::DX0LCDLR1 + * Offset: 0x1E4 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |WDQD |Write Data Delay + * | | |Delay select for the write data (WDQ) LCDL + * |[15:8] |RDQSD |Read DQS Delay + * | | |Delay select for the read DQS (RDQS) LCDL + * |[23:16] |RDQSND |Read DQSN Delay + * | | |Delay select for the read DQSN (RDQS) LCDL + * @var DDRPHY_T::DX0LCDLR2 + * Offset: 0x1E8 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0DQSGD |Rank 0 Read DQS Gating Delay + * | | |Rank 0 delay select for the read DQS gating (DQSG) LCDL + * |[15:8] |R1DQSGD |Rank 1 Read DQS Gating Delay + * | | |Rank 1 delay select for the read DQS gating (DQSG) LCDL + * |[23:16] |R2DQSGD |Rank 2 Read DQS Gating Delay + * | | |Rank 2 delay select for the read DQS gating (DQSG) LCDL + * |[31:24] |R3DQSGD |Rank 3 Read DQS Gating Delay + * | | |Rank 3 delay select for the read DQS gating (DQSG) LCDL + * @var DDRPHY_T::DX0MDLR + * Offset: 0x1EC DATX8 Master Delay Line Register (DXnMDLR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |IPRD |Initial Period + * | | |Initial period measured by the master delay line calibration for VT drift compensation + * | | |This value is used as the denominator when calculating the ratios of updates during VT compensation. + * |[15:8] |TPRD |Target Period + * | | |Target period measured by the master delay line calibration for VT drift compensation + * | | |This is the current measured value of the period and is continuously updated if the MDL is enabled to do so. + * |[23:16] |MDLD |MDL Delay + * | | |Delay select for the LCDL for the Master Delay Line. + * @var DDRPHY_T::DX0GTR + * Offset: 0x1F0 DATX8 General Timing Register (DXnGTR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |R0DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[5:3] |R1DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[8:6] |R2DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[11:9] |R3DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[13:12] |R0WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[15:14] |R1WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[17:16] |R2WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[19:18] |R3WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * @var DDRPHY_T::DX0GSR2 + * Offset: 0x1F4 DATX8 General Status Register 2 (DXnGSR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDERR |Read Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read bit deskew training. + * |[1] |RDWN |Read Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read bit deskew training. + * |[2] |WDERR |Write Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write bit deskew training. + * |[3] |WDWN |Write Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write bit deskew training. + * |[4] |REERR |Read Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read data eye training. + * |[5] |REWN |Read Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read data eye training. + * |[6] |WEERR |Write Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write data eye training. + * |[7] |WEWN |Write Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write data eye training. + * |[11:8] |ESTAT |Error Status + * | | |If an error occurred for this lane as indicated by RDERR, WDERR, REERR or WEERR the error status code can provide additional information regard when the error occurred during the algorithm execution. + * @var DDRPHY_T::DX1GCR + * Offset: 0x200 DATX8 General Configuration Register (DXnGCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DXEN |Data Byte Enable + * | | |Enables, if set, the data byte + * | | |Setting this bit to '0' disables the byte, i.e + * | | |the byte is not used in PHY initialization or training and is ignored during SDRAM read/write operations. + * |[1] |DQSODT |DQS On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQS/DQS# pin of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[9] is '0'. + * |[2] |DQODT |Data On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQ and DM pins of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[10] is '0'. + * |[3] |DXIOM |Data I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the IOM configuration bit of the individual DATX8(see "DATX8 Common Configuration Register (DXCCR)"). + * |[4] |DXPDD |Data Power Down Driver + * | | |Powers down, when set, the output driver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDD configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[5] |DXPDR |Data Power Down Receiver + * | | |Powers down, when set, the input receiver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * |[6] |DQSRPD |DQSR Power Down + * | | |Powers down, if set, the PDQSR cell + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)") + * |[8:7] |DSEN |Write DQS Enable + * | | |Controls whether the write DQS going to the SDRAM is enabled (toggling) or disabled (static value) and whether the DQS is inverted + * | | |DQS# is always the inversion of DQS + * | | |These values are valid only when DQS/DQS# output enable is on, otherwise the DQS/DQS# is tristated + * | | |Valid settings are: + * | | |00 = Reserved + * | | |01 = DQS toggling with normal polarity (This should be the default setting) + * | | |10 = Reserved + * | | |11 = Reserved + * |[9] |DQSRTT |DQS Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQS/DQS# SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[1] (DQSODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[10] |DQRTT |DQ Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQ/DM SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[2] (DQODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[12:11] |RTTOH |RTT Output Hold + * | | |Indicates the number of clock cycles (from 0 to 3) after the read data postamble for which ODT control should remain set to DQSODT for DQS or DQODT for DQ/DM before disabling it (setting it to '0') when using dynamic ODT control + * | | |ODT is disabled almost RTTOH clock cycles after the read postamble. + * |[13] |RTTOAL |RTT On Additive Latency + * | | |Indicates when the ODT control of DQ/DQS SSTL I/Os is set to the value in DQODT/DQSODT during read cycles + * | | |Valid values are: + * | | |0 = ODT control is set to DQSODT/DQODT almost two cycles before read data preamble + * | | |1 = ODT control is set to DQSODT/DQODT almost one cycle before read data preamble + * |[15:14] |DXOEO |Data Byte Output Enable Override + * | | |Specifies whether the output I/O output enable for the byte lane should be set to a fixed value + * | | |Valid values are: + * | | |00 = No override. Output enable is controlled by DFI transactions + * | | |01 = Output enable is asserted (I/O is forced to output mode). + * | | |10 = Output enable is de-asserted (I/O is forced to input mode) + * | | |11 = Reserved + * |[16] |PLLRST |PLL Rest + * | | |Resets the byte PLL by driving the PLL reset pin + * | | |This bit is not self- clearing and a '0' must be written to de-assert the reset + * | | |This bit is ORed with the global PLLRST configuration bit. + * |[17] |PLLPD |PLL Power Down + * | | |Puts the byte PLL in Power-down mode by driving the PLL power down pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the power-down + * | | |This bit is ORed with the global PLLPD configuration bit. + * |[18] |GSHIFT |Gear Shift + * | | |Enables, if set, rapid locking mode on the byte PLL + * | | |This bit is ORed with the global GSHIFT configuration bit. + * |[19] |PLLBYP |PLL Bypass + * | | |Puts the byte PLL in bypass mode by driving the PLL bypass pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the bypass + * | | |This bit is ORed with the global BYP configuration bit. + * |[29:26] |WLRKEN |Write Level Rank Enable + * | | |Specifies the ranks that should be write leveled for this byte + * | | |Write leveling responses from ranks that are not enabled for write leveling for a particular byte are ignored and write leveling is flagged as done for these ranks + * | | |WLRKEN[0] enables rank 0, [1] enables rank 1, [2] enables rank 2, and [3] enables rank 3. + * |[30] |MDLEN |Master Delay Line Enable + * | | |Enables, if set, the DATX8 master delay line calibration to perform subsequent period measurements following the initial period measurements that are performed after reset or when calibration is manually triggered + * | | |These additional measurements are accumulated and filtered as long as this bit remains high + * | | |This bit is ANDed with the common DATX8 MDL enable bit. + * |[31] |CALBYP |Calibration Bypass + * | | |Prevents, if set, period measurement calibration from automatically triggering after PHY initialization. + * @var DDRPHY_T::DX1GSR0 + * Offset: 0x204 DATX8 General Status Registers 0 (DXnGSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WDQCAL |Write DQ Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write DQ LCDL. + * |[1] |RDQSCAL |Read DQS Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS LCDL. + * |[2] |RDQSNCAL |Read DQS# Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS# LCDL. + * |[3] |GDQSCAL |Read DQS gating Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS gating LCDL. + * |[4] |WLCAL |Write Leveling Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write leveling slave delay line. + * |[5] |WLDONE |Write Leveling Done + * | | |Indicates, if set, that the DATX8 has completed write leveling. + * |[6] |WLERR |Write Leveling Error + * | | |Indicates, if set, that there is a write leveling error in the DATX8. + * |[14:7] |WLPRD |Write Leveling Period + * | | |Returns the DDR clock period measured by the write leveling LCDL during calibration + * | | |The measured period is used to generate the control of the write leveling pipeline which is a function of the write-leveling delay and the clock period + * | | |This value is PVT compensated. + * |[15] |DPLOCK |DATX8 PLL Lock + * | | |Indicates, if set, that the DATX8 PLL has locked. This is a direct status of the DATX8 PLL lock pin. + * |[23:16] |GDQSPRD |Read DQS gating Period + * | | |Returns the DDR clock period measured by the read DQS gating LCDL during calibration + * | | |This value is PVT compensated. + * |[27:24] |QSGERR |DQS Gate Training Error + * | | |Indicates, if set, that there is an error in DQS gate training. One bit for each of the up to 4 ranks. + * |[28] |WLDQ |Write Leveling DQ Status + * | | |Captures the write leveling DQ status from the DRAM during software write leveling. + * @var DDRPHY_T::DX1GSR1 + * Offset: 0x208 DATX8 General Status Registers 1 (DXnGSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DLTDONE |Delay Line Test Done + * | | |Indicates, if set, that the PHY control block has finished doing period measurement of the DATX8 delay line digital test output. + * |[24:1] |DLTCODE |Delay Line Test Code + * | | |Returns the code measured by the PHY control block that corresponds to the period of the DATX8 delay line digital test output. + * @var DDRPHY_T::DX1BDLR0 + * Offset: 0x20C DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0WBD |DQ0 Write Bit Delay + * | | |Delay select for the BDL on DQ0 write path. + * |[11:6] |DQ1WBD |DQ1 Write Bit Delay + * | | |Delay select for the BDL on DQ1 write path. + * |[17:12] |DQ2WBD |DQ2 Write Bit Delay + * | | |Delay select for the BDL on DQ2 write path. + * |[23:18] |DQ3WBD |DQ3 Write Bit Delay + * | | |Delay select for the BDL on DQ3 write path + * |[29:24] |DQ4WBD |DQ4 Write Bit Delay + * | | |Delay select for the BDL on DQ4 write path. + * @var DDRPHY_T::DX1BDLR1 + * Offset: 0x210 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5WBD |DQ5 Write Bit Delay + * | | |Delay select for the BDL on DQ5 write path. + * |[11:6] |DQ6WBD |DQ6 Write Bit Delay + * | | |Delay select for the BDL on DQ6 write path. + * |[17:12] |DQ7WBD |DQ7 Write Bit Delay + * | | |Delay select for the BDL on DQ7 write path. + * |[23:18] |DMWBD |DM Write Bit Delay + * | | |Delay select for the BDL on DM write path. + * |[29:24] |DSWBD |DQS Write Bit Delay + * | | |Delay select for the BDL on DQS write path + * @var DDRPHY_T::DX1BDLR2 + * Offset: 0x214 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DSOEBD |DQS Output Enable Bit Delay + * | | |Delay select for the BDL on DQS output enable path + * |[11:6] |DQOEBD |DQ Output Enable Bit Delay + * | | |Delay select for the BDL on DQ/DM output enable path. + * |[17:12] |DSRBD |DQS Read Bit Delay + * | | |Delay select for the BDL on DQS read path + * |[23:18] |DSNRBD |DQSN Read Bit Delay + * | | |Delay select for the BDL on DQSN read path + * @var DDRPHY_T::DX1BDLR3 + * Offset: 0x218 DATX8 Bit Delay Line Register 3 (DXnBDLR3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0RBD |DQ0 Read Bit Delay + * | | |Delay select for the BDL on DQ0 read path. + * |[11:6] |DQ1RBD |DQ1 Read Bit Delay + * | | |Delay select for the BDL on DQ1 read path. + * |[17:12] |DQ2RBD |DQ2 Read Bit Delay + * | | |Delay select for the BDL on DQ2 read path. + * |[23:18] |DQ3RBD |DQ3 Read Bit Delay + * | | |Delay select for the BDL on DQ3 read path + * |[29:24] |DQ4RBD |DQ4 Read Bit Delay + * | | |Delay select for the BDL on DQ4 read path. + * @var DDRPHY_T::DX1BDLR4 + * Offset: 0x21C DATX8 Bit Delay Line Register 4 (DXnBDLR4) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5RBD |DQ5 Read Bit Delay + * | | |Delay select for the BDL on DQ5 read path. + * |[11:6] |DQ6RBD |DQ6 Read Bit Delay + * | | |Delay select for the BDL on DQ6 read path. + * |[17:12] |DQ7RBD |DQ7 Read Bit Delay + * | | |Delay select for the BDL on DQ7 read path. + * |[23:18] |DMRBD |DM Read Bit Delay + * | | |Delay select for the BDL on DM read path. + * @var DDRPHY_T::DX1LCDLR0 + * Offset: 0x220 DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0WLD |Rank 0 Write Leveling Delay + * | | |Rank 0 delay select for the write leveling (WL) LCDL + * |[15:8] |R1WLD |Rank 1 Write Leveling Delay + * | | |Rank 1 delay select for the write leveling (WL) LCDL + * |[23:16] |R2WLD |Rank 2 Write Leveling Delay + * | | |Rank 2 delay select for the write leveling (WL) LCDL + * |[31:24] |R3WLD |Rank 3 Write Leveling Delay + * | | |Rank 3 delay select for the write leveling (WL) LCDL + * @var DDRPHY_T::DX1LCDLR1 + * Offset: 0x224 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |WDQD |Write Data Delay + * | | |Delay select for the write data (WDQ) LCDL + * |[15:8] |RDQSD |Read DQS Delay + * | | |Delay select for the read DQS (RDQS) LCDL + * |[23:16] |RDQSND |Read DQSN Delay + * | | |Delay select for the read DQSN (RDQS) LCDL + * @var DDRPHY_T::DX1LCDLR2 + * Offset: 0x228 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0DQSGD |Rank 0 Read DQS Gating Delay + * | | |Rank 0 delay select for the read DQS gating (DQSG) LCDL + * |[15:8] |R1DQSGD |Rank 1 Read DQS Gating Delay + * | | |Rank 1 delay select for the read DQS gating (DQSG) LCDL + * |[23:16] |R2DQSGD |Rank 2 Read DQS Gating Delay + * | | |Rank 2 delay select for the read DQS gating (DQSG) LCDL + * |[31:24] |R3DQSGD |Rank 3 Read DQS Gating Delay + * | | |Rank 3 delay select for the read DQS gating (DQSG) LCDL + * @var DDRPHY_T::DX1MDLR + * Offset: 0x22C DATX8 Master Delay Line Register (DXnMDLR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |IPRD |Initial Period + * | | |Initial period measured by the master delay line calibration for VT drift compensation + * | | |This value is used as the denominator when calculating the ratios of updates during VT compensation. + * |[15:8] |TPRD |Target Period + * | | |Target period measured by the master delay line calibration for VT drift compensation + * | | |This is the current measured value of the period and is continuously updated if the MDL is enabled to do so. + * |[23:16] |MDLD |MDL Delay + * | | |Delay select for the LCDL for the Master Delay Line. + * @var DDRPHY_T::DX1GTR + * Offset: 0x230 DATX8 General Timing Register (DXnGTR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |R0DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[5:3] |R1DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[8:6] |R2DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[11:9] |R3DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[13:12] |R0WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[15:14] |R1WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[17:16] |R2WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[19:18] |R3WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * @var DDRPHY_T::DX1GSR2 + * Offset: 0x234 DATX8 General Status Register 2 (DXnGSR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDERR |Read Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read bit deskew training. + * |[1] |RDWN |Read Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read bit deskew training. + * |[2] |WDERR |Write Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write bit deskew training. + * |[3] |WDWN |Write Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write bit deskew training. + * |[4] |REERR |Read Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read data eye training. + * |[5] |REWN |Read Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read data eye training. + * |[6] |WEERR |Write Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write data eye training. + * |[7] |WEWN |Write Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write data eye training. + * |[11:8] |ESTAT |Error Status + * | | |If an error occurred for this lane as indicated by RDERR, WDERR, REERR or WEERR the error status code can provide additional information regard when the error occurred during the algorithm execution. + * @var DDRPHY_T::DX2GCR + * Offset: 0x240 DATX8 General Configuration Register (DXnGCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DXEN |Data Byte Enable + * | | |Enables, if set, the data byte + * | | |Setting this bit to '0' disables the byte, i.e + * | | |the byte is not used in PHY initialization or training and is ignored during SDRAM read/write operations. + * |[1] |DQSODT |DQS On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQS/DQS# pin of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[9] is '0'. + * |[2] |DQODT |Data On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQ and DM pins of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[10] is '0'. + * |[3] |DXIOM |Data I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the IOM configuration bit of the individual DATX8(see "DATX8 Common Configuration Register (DXCCR)"). + * |[4] |DXPDD |Data Power Down Driver + * | | |Powers down, when set, the output driver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDD configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[5] |DXPDR |Data Power Down Receiver + * | | |Powers down, when set, the input receiver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * |[6] |DQSRPD |DQSR Power Down + * | | |Powers down, if set, the PDQSR cell + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)") + * |[8:7] |DSEN |Write DQS Enable + * | | |Controls whether the write DQS going to the SDRAM is enabled (toggling) or disabled (static value) and whether the DQS is inverted + * | | |DQS# is always the inversion of DQS + * | | |These values are valid only when DQS/DQS# output enable is on, otherwise the DQS/DQS# is tristated + * | | |Valid settings are: + * | | |00 = Reserved + * | | |01 = DQS toggling with normal polarity (This should be the default setting) + * | | |10 = Reserved + * | | |11 = Reserved + * |[9] |DQSRTT |DQS Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQS/DQS# SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[1] (DQSODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[10] |DQRTT |DQ Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQ/DM SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[2] (DQODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[12:11] |RTTOH |RTT Output Hold + * | | |Indicates the number of clock cycles (from 0 to 3) after the read data postamble for which ODT control should remain set to DQSODT for DQS or DQODT for DQ/DM before disabling it (setting it to '0') when using dynamic ODT control + * | | |ODT is disabled almost RTTOH clock cycles after the read postamble. + * |[13] |RTTOAL |RTT On Additive Latency + * | | |Indicates when the ODT control of DQ/DQS SSTL I/Os is set to the value in DQODT/DQSODT during read cycles + * | | |Valid values are: + * | | |0 = ODT control is set to DQSODT/DQODT almost two cycles before read data preamble + * | | |1 = ODT control is set to DQSODT/DQODT almost one cycle before read data preamble + * |[15:14] |DXOEO |Data Byte Output Enable Override + * | | |Specifies whether the output I/O output enable for the byte lane should be set to a fixed value + * | | |Valid values are: + * | | |00 = No override. Output enable is controlled by DFI transactions + * | | |01 = Output enable is asserted (I/O is forced to output mode). + * | | |10 = Output enable is de-asserted (I/O is forced to input mode) + * | | |11 = Reserved + * |[16] |PLLRST |PLL Rest + * | | |Resets the byte PLL by driving the PLL reset pin + * | | |This bit is not self- clearing and a '0' must be written to de-assert the reset + * | | |This bit is ORed with the global PLLRST configuration bit. + * |[17] |PLLPD |PLL Power Down + * | | |Puts the byte PLL in Power-down mode by driving the PLL power down pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the power-down + * | | |This bit is ORed with the global PLLPD configuration bit. + * |[18] |GSHIFT |Gear Shift + * | | |Enables, if set, rapid locking mode on the byte PLL + * | | |This bit is ORed with the global GSHIFT configuration bit. + * |[19] |PLLBYP |PLL Bypass + * | | |Puts the byte PLL in bypass mode by driving the PLL bypass pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the bypass + * | | |This bit is ORed with the global BYP configuration bit. + * |[29:26] |WLRKEN |Write Level Rank Enable + * | | |Specifies the ranks that should be write leveled for this byte + * | | |Write leveling responses from ranks that are not enabled for write leveling for a particular byte are ignored and write leveling is flagged as done for these ranks + * | | |WLRKEN[0] enables rank 0, [1] enables rank 1, [2] enables rank 2, and [3] enables rank 3. + * |[30] |MDLEN |Master Delay Line Enable + * | | |Enables, if set, the DATX8 master delay line calibration to perform subsequent period measurements following the initial period measurements that are performed after reset or when calibration is manually triggered + * | | |These additional measurements are accumulated and filtered as long as this bit remains high + * | | |This bit is ANDed with the common DATX8 MDL enable bit. + * |[31] |CALBYP |Calibration Bypass + * | | |Prevents, if set, period measurement calibration from automatically triggering after PHY initialization. + * @var DDRPHY_T::DX2GSR0 + * Offset: 0x244 DATX8 General Status Registers 0 (DXnGSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WDQCAL |Write DQ Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write DQ LCDL. + * |[1] |RDQSCAL |Read DQS Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS LCDL. + * |[2] |RDQSNCAL |Read DQS# Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS# LCDL. + * |[3] |GDQSCAL |Read DQS gating Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS gating LCDL. + * |[4] |WLCAL |Write Leveling Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write leveling slave delay line. + * |[5] |WLDONE |Write Leveling Done + * | | |Indicates, if set, that the DATX8 has completed write leveling. + * |[6] |WLERR |Write Leveling Error + * | | |Indicates, if set, that there is a write leveling error in the DATX8. + * |[14:7] |WLPRD |Write Leveling Period + * | | |Returns the DDR clock period measured by the write leveling LCDL during calibration + * | | |The measured period is used to generate the control of the write leveling pipeline which is a function of the write-leveling delay and the clock period + * | | |This value is PVT compensated. + * |[15] |DPLOCK |DATX8 PLL Lock + * | | |Indicates, if set, that the DATX8 PLL has locked. This is a direct status of the DATX8 PLL lock pin. + * |[23:16] |GDQSPRD |Read DQS gating Period + * | | |Returns the DDR clock period measured by the read DQS gating LCDL during calibration + * | | |This value is PVT compensated. + * |[27:24] |QSGERR |DQS Gate Training Error + * | | |Indicates, if set, that there is an error in DQS gate training. One bit for each of the up to 4 ranks. + * |[28] |WLDQ |Write Leveling DQ Status + * | | |Captures the write leveling DQ status from the DRAM during software write leveling. + * @var DDRPHY_T::DX2GSR1 + * Offset: 0x248 DATX8 General Status Registers 1 (DXnGSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DLTDONE |Delay Line Test Done + * | | |Indicates, if set, that the PHY control block has finished doing period measurement of the DATX8 delay line digital test output. + * |[24:1] |DLTCODE |Delay Line Test Code + * | | |Returns the code measured by the PHY control block that corresponds to the period of the DATX8 delay line digital test output. + * @var DDRPHY_T::DX2BDLR0 + * Offset: 0x24C DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0WBD |DQ0 Write Bit Delay + * | | |Delay select for the BDL on DQ0 write path. + * |[11:6] |DQ1WBD |DQ1 Write Bit Delay + * | | |Delay select for the BDL on DQ1 write path. + * |[17:12] |DQ2WBD |DQ2 Write Bit Delay + * | | |Delay select for the BDL on DQ2 write path. + * |[23:18] |DQ3WBD |DQ3 Write Bit Delay + * | | |Delay select for the BDL on DQ3 write path + * |[29:24] |DQ4WBD |DQ4 Write Bit Delay + * | | |Delay select for the BDL on DQ4 write path. + * @var DDRPHY_T::DX2BDLR1 + * Offset: 0x250 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5WBD |DQ5 Write Bit Delay + * | | |Delay select for the BDL on DQ5 write path. + * |[11:6] |DQ6WBD |DQ6 Write Bit Delay + * | | |Delay select for the BDL on DQ6 write path. + * |[17:12] |DQ7WBD |DQ7 Write Bit Delay + * | | |Delay select for the BDL on DQ7 write path. + * |[23:18] |DMWBD |DM Write Bit Delay + * | | |Delay select for the BDL on DM write path. + * |[29:24] |DSWBD |DQS Write Bit Delay + * | | |Delay select for the BDL on DQS write path + * @var DDRPHY_T::DX2BDLR2 + * Offset: 0x254 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DSOEBD |DQS Output Enable Bit Delay + * | | |Delay select for the BDL on DQS output enable path + * |[11:6] |DQOEBD |DQ Output Enable Bit Delay + * | | |Delay select for the BDL on DQ/DM output enable path. + * |[17:12] |DSRBD |DQS Read Bit Delay + * | | |Delay select for the BDL on DQS read path + * |[23:18] |DSNRBD |DQSN Read Bit Delay + * | | |Delay select for the BDL on DQSN read path + * @var DDRPHY_T::DX2BDLR3 + * Offset: 0x258 DATX8 Bit Delay Line Register 3 (DXnBDLR3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0RBD |DQ0 Read Bit Delay + * | | |Delay select for the BDL on DQ0 read path. + * |[11:6] |DQ1RBD |DQ1 Read Bit Delay + * | | |Delay select for the BDL on DQ1 read path. + * |[17:12] |DQ2RBD |DQ2 Read Bit Delay + * | | |Delay select for the BDL on DQ2 read path. + * |[23:18] |DQ3RBD |DQ3 Read Bit Delay + * | | |Delay select for the BDL on DQ3 read path + * |[29:24] |DQ4RBD |DQ4 Read Bit Delay + * | | |Delay select for the BDL on DQ4 read path. + * @var DDRPHY_T::DX2BDLR4 + * Offset: 0x25C DATX8 Bit Delay Line Register 4 (DXnBDLR4) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5RBD |DQ5 Read Bit Delay + * | | |Delay select for the BDL on DQ5 read path. + * |[11:6] |DQ6RBD |DQ6 Read Bit Delay + * | | |Delay select for the BDL on DQ6 read path. + * |[17:12] |DQ7RBD |DQ7 Read Bit Delay + * | | |Delay select for the BDL on DQ7 read path. + * |[23:18] |DMRBD |DM Read Bit Delay + * | | |Delay select for the BDL on DM read path. + * @var DDRPHY_T::DX2LCDLR0 + * Offset: 0x260 DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0WLD |Rank 0 Write Leveling Delay + * | | |Rank 0 delay select for the write leveling (WL) LCDL + * |[15:8] |R1WLD |Rank 1 Write Leveling Delay + * | | |Rank 1 delay select for the write leveling (WL) LCDL + * |[23:16] |R2WLD |Rank 2 Write Leveling Delay + * | | |Rank 2 delay select for the write leveling (WL) LCDL + * |[31:24] |R3WLD |Rank 3 Write Leveling Delay + * | | |Rank 3 delay select for the write leveling (WL) LCDL + * @var DDRPHY_T::DX2LCDLR1 + * Offset: 0x264 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |WDQD |Write Data Delay + * | | |Delay select for the write data (WDQ) LCDL + * |[15:8] |RDQSD |Read DQS Delay + * | | |Delay select for the read DQS (RDQS) LCDL + * |[23:16] |RDQSND |Read DQSN Delay + * | | |Delay select for the read DQSN (RDQS) LCDL + * @var DDRPHY_T::DX2LCDLR2 + * Offset: 0x268 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0DQSGD |Rank 0 Read DQS Gating Delay + * | | |Rank 0 delay select for the read DQS gating (DQSG) LCDL + * |[15:8] |R1DQSGD |Rank 1 Read DQS Gating Delay + * | | |Rank 1 delay select for the read DQS gating (DQSG) LCDL + * |[23:16] |R2DQSGD |Rank 2 Read DQS Gating Delay + * | | |Rank 2 delay select for the read DQS gating (DQSG) LCDL + * |[31:24] |R3DQSGD |Rank 3 Read DQS Gating Delay + * | | |Rank 3 delay select for the read DQS gating (DQSG) LCDL + * @var DDRPHY_T::DX2MDLR + * Offset: 0x26C DATX8 Master Delay Line Register (DXnMDLR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |IPRD |Initial Period + * | | |Initial period measured by the master delay line calibration for VT drift compensation + * | | |This value is used as the denominator when calculating the ratios of updates during VT compensation. + * |[15:8] |TPRD |Target Period + * | | |Target period measured by the master delay line calibration for VT drift compensation + * | | |This is the current measured value of the period and is continuously updated if the MDL is enabled to do so. + * |[23:16] |MDLD |MDL Delay + * | | |Delay select for the LCDL for the Master Delay Line. + * @var DDRPHY_T::DX2GTR + * Offset: 0x270 DATX8 General Timing Register (DXnGTR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |R0DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[5:3] |R1DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[8:6] |R2DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[11:9] |R3DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[13:12] |R0WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[15:14] |R1WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[17:16] |R2WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[19:18] |R3WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * @var DDRPHY_T::DX2GSR2 + * Offset: 0x274 DATX8 General Status Register 2 (DXnGSR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDERR |Read Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read bit deskew training. + * |[1] |RDWN |Read Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read bit deskew training. + * |[2] |WDERR |Write Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write bit deskew training. + * |[3] |WDWN |Write Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write bit deskew training. + * |[4] |REERR |Read Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read data eye training. + * |[5] |REWN |Read Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read data eye training. + * |[6] |WEERR |Write Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write data eye training. + * |[7] |WEWN |Write Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write data eye training. + * |[11:8] |ESTAT |Error Status + * | | |If an error occurred for this lane as indicated by RDERR, WDERR, REERR or WEERR the error status code can provide additional information regard when the error occurred during the algorithm execution. + * @var DDRPHY_T::DX3GCR + * Offset: 0x280 DATX8 General Configuration Register (DXnGCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DXEN |Data Byte Enable + * | | |Enables, if set, the data byte + * | | |Setting this bit to '0' disables the byte, i.e + * | | |the byte is not used in PHY initialization or training and is ignored during SDRAM read/write operations. + * |[1] |DQSODT |DQS On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQS/DQS# pin of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[9] is '0'. + * |[2] |DQODT |Data On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQ and DM pins of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[10] is '0'. + * |[3] |DXIOM |Data I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the IOM configuration bit of the individual DATX8(see "DATX8 Common Configuration Register (DXCCR)"). + * |[4] |DXPDD |Data Power Down Driver + * | | |Powers down, when set, the output driver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDD configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[5] |DXPDR |Data Power Down Receiver + * | | |Powers down, when set, the input receiver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * |[6] |DQSRPD |DQSR Power Down + * | | |Powers down, if set, the PDQSR cell + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)") + * |[8:7] |DSEN |Write DQS Enable + * | | |Controls whether the write DQS going to the SDRAM is enabled (toggling) or disabled (static value) and whether the DQS is inverted + * | | |DQS# is always the inversion of DQS + * | | |These values are valid only when DQS/DQS# output enable is on, otherwise the DQS/DQS# is tristated + * | | |Valid settings are: + * | | |00 = Reserved + * | | |01 = DQS toggling with normal polarity (This should be the default setting) + * | | |10 = Reserved + * | | |11 = Reserved + * |[9] |DQSRTT |DQS Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQS/DQS# SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[1] (DQSODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[10] |DQRTT |DQ Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQ/DM SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[2] (DQODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[12:11] |RTTOH |RTT Output Hold + * | | |Indicates the number of clock cycles (from 0 to 3) after the read data postamble for which ODT control should remain set to DQSODT for DQS or DQODT for DQ/DM before disabling it (setting it to '0') when using dynamic ODT control + * | | |ODT is disabled almost RTTOH clock cycles after the read postamble. + * |[13] |RTTOAL |RTT On Additive Latency + * | | |Indicates when the ODT control of DQ/DQS SSTL I/Os is set to the value in DQODT/DQSODT during read cycles + * | | |Valid values are: + * | | |0 = ODT control is set to DQSODT/DQODT almost two cycles before read data preamble + * | | |1 = ODT control is set to DQSODT/DQODT almost one cycle before read data preamble + * |[15:14] |DXOEO |Data Byte Output Enable Override + * | | |Specifies whether the output I/O output enable for the byte lane should be set to a fixed value + * | | |Valid values are: + * | | |00 = No override. Output enable is controlled by DFI transactions + * | | |01 = Output enable is asserted (I/O is forced to output mode). + * | | |10 = Output enable is de-asserted (I/O is forced to input mode) + * | | |11 = Reserved + * |[16] |PLLRST |PLL Rest + * | | |Resets the byte PLL by driving the PLL reset pin + * | | |This bit is not self- clearing and a '0' must be written to de-assert the reset + * | | |This bit is ORed with the global PLLRST configuration bit. + * |[17] |PLLPD |PLL Power Down + * | | |Puts the byte PLL in Power-down mode by driving the PLL power down pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the power-down + * | | |This bit is ORed with the global PLLPD configuration bit. + * |[18] |GSHIFT |Gear Shift + * | | |Enables, if set, rapid locking mode on the byte PLL + * | | |This bit is ORed with the global GSHIFT configuration bit. + * |[19] |PLLBYP |PLL Bypass + * | | |Puts the byte PLL in bypass mode by driving the PLL bypass pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the bypass + * | | |This bit is ORed with the global BYP configuration bit. + * |[29:26] |WLRKEN |Write Level Rank Enable + * | | |Specifies the ranks that should be write leveled for this byte + * | | |Write leveling responses from ranks that are not enabled for write leveling for a particular byte are ignored and write leveling is flagged as done for these ranks + * | | |WLRKEN[0] enables rank 0, [1] enables rank 1, [2] enables rank 2, and [3] enables rank 3. + * |[30] |MDLEN |Master Delay Line Enable + * | | |Enables, if set, the DATX8 master delay line calibration to perform subsequent period measurements following the initial period measurements that are performed after reset or when calibration is manually triggered + * | | |These additional measurements are accumulated and filtered as long as this bit remains high + * | | |This bit is ANDed with the common DATX8 MDL enable bit. + * |[31] |CALBYP |Calibration Bypass + * | | |Prevents, if set, period measurement calibration from automatically triggering after PHY initialization. + * @var DDRPHY_T::DX3GSR0 + * Offset: 0x284 DATX8 General Status Registers 0 (DXnGSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WDQCAL |Write DQ Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write DQ LCDL. + * |[1] |RDQSCAL |Read DQS Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS LCDL. + * |[2] |RDQSNCAL |Read DQS# Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS# LCDL. + * |[3] |GDQSCAL |Read DQS gating Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS gating LCDL. + * |[4] |WLCAL |Write Leveling Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write leveling slave delay line. + * |[5] |WLDONE |Write Leveling Done + * | | |Indicates, if set, that the DATX8 has completed write leveling. + * |[6] |WLERR |Write Leveling Error + * | | |Indicates, if set, that there is a write leveling error in the DATX8. + * |[14:7] |WLPRD |Write Leveling Period + * | | |Returns the DDR clock period measured by the write leveling LCDL during calibration + * | | |The measured period is used to generate the control of the write leveling pipeline which is a function of the write-leveling delay and the clock period + * | | |This value is PVT compensated. + * |[15] |DPLOCK |DATX8 PLL Lock + * | | |Indicates, if set, that the DATX8 PLL has locked. This is a direct status of the DATX8 PLL lock pin. + * |[23:16] |GDQSPRD |Read DQS gating Period + * | | |Returns the DDR clock period measured by the read DQS gating LCDL during calibration + * | | |This value is PVT compensated. + * |[27:24] |QSGERR |DQS Gate Training Error + * | | |Indicates, if set, that there is an error in DQS gate training. One bit for each of the up to 4 ranks. + * |[28] |WLDQ |Write Leveling DQ Status + * | | |Captures the write leveling DQ status from the DRAM during software write leveling. + * @var DDRPHY_T::DX3GSR1 + * Offset: 0x288 DATX8 General Status Registers 1 (DXnGSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DLTDONE |Delay Line Test Done + * | | |Indicates, if set, that the PHY control block has finished doing period measurement of the DATX8 delay line digital test output. + * |[24:1] |DLTCODE |Delay Line Test Code + * | | |Returns the code measured by the PHY control block that corresponds to the period of the DATX8 delay line digital test output. + * @var DDRPHY_T::DX3BDLR0 + * Offset: 0x28C DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0WBD |DQ0 Write Bit Delay + * | | |Delay select for the BDL on DQ0 write path. + * |[11:6] |DQ1WBD |DQ1 Write Bit Delay + * | | |Delay select for the BDL on DQ1 write path. + * |[17:12] |DQ2WBD |DQ2 Write Bit Delay + * | | |Delay select for the BDL on DQ2 write path. + * |[23:18] |DQ3WBD |DQ3 Write Bit Delay + * | | |Delay select for the BDL on DQ3 write path + * |[29:24] |DQ4WBD |DQ4 Write Bit Delay + * | | |Delay select for the BDL on DQ4 write path. + * @var DDRPHY_T::DX3BDLR1 + * Offset: 0x290 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5WBD |DQ5 Write Bit Delay + * | | |Delay select for the BDL on DQ5 write path. + * |[11:6] |DQ6WBD |DQ6 Write Bit Delay + * | | |Delay select for the BDL on DQ6 write path. + * |[17:12] |DQ7WBD |DQ7 Write Bit Delay + * | | |Delay select for the BDL on DQ7 write path. + * |[23:18] |DMWBD |DM Write Bit Delay + * | | |Delay select for the BDL on DM write path. + * |[29:24] |DSWBD |DQS Write Bit Delay + * | | |Delay select for the BDL on DQS write path + * @var DDRPHY_T::DX3BDLR2 + * Offset: 0x294 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DSOEBD |DQS Output Enable Bit Delay + * | | |Delay select for the BDL on DQS output enable path + * |[11:6] |DQOEBD |DQ Output Enable Bit Delay + * | | |Delay select for the BDL on DQ/DM output enable path. + * |[17:12] |DSRBD |DQS Read Bit Delay + * | | |Delay select for the BDL on DQS read path + * |[23:18] |DSNRBD |DQSN Read Bit Delay + * | | |Delay select for the BDL on DQSN read path + * @var DDRPHY_T::DX3BDLR3 + * Offset: 0x298 DATX8 Bit Delay Line Register 3 (DXnBDLR3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0RBD |DQ0 Read Bit Delay + * | | |Delay select for the BDL on DQ0 read path. + * |[11:6] |DQ1RBD |DQ1 Read Bit Delay + * | | |Delay select for the BDL on DQ1 read path. + * |[17:12] |DQ2RBD |DQ2 Read Bit Delay + * | | |Delay select for the BDL on DQ2 read path. + * |[23:18] |DQ3RBD |DQ3 Read Bit Delay + * | | |Delay select for the BDL on DQ3 read path + * |[29:24] |DQ4RBD |DQ4 Read Bit Delay + * | | |Delay select for the BDL on DQ4 read path. + * @var DDRPHY_T::DX3BDLR4 + * Offset: 0x29C DATX8 Bit Delay Line Register 4 (DXnBDLR4) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5RBD |DQ5 Read Bit Delay + * | | |Delay select for the BDL on DQ5 read path. + * |[11:6] |DQ6RBD |DQ6 Read Bit Delay + * | | |Delay select for the BDL on DQ6 read path. + * |[17:12] |DQ7RBD |DQ7 Read Bit Delay + * | | |Delay select for the BDL on DQ7 read path. + * |[23:18] |DMRBD |DM Read Bit Delay + * | | |Delay select for the BDL on DM read path. + * @var DDRPHY_T::DX3LCDLR0 + * Offset: 0x2A0 DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0WLD |Rank 0 Write Leveling Delay + * | | |Rank 0 delay select for the write leveling (WL) LCDL + * |[15:8] |R1WLD |Rank 1 Write Leveling Delay + * | | |Rank 1 delay select for the write leveling (WL) LCDL + * |[23:16] |R2WLD |Rank 2 Write Leveling Delay + * | | |Rank 2 delay select for the write leveling (WL) LCDL + * |[31:24] |R3WLD |Rank 3 Write Leveling Delay + * | | |Rank 3 delay select for the write leveling (WL) LCDL + * @var DDRPHY_T::DX3LCDLR1 + * Offset: 0x2A4 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |WDQD |Write Data Delay + * | | |Delay select for the write data (WDQ) LCDL + * |[15:8] |RDQSD |Read DQS Delay + * | | |Delay select for the read DQS (RDQS) LCDL + * |[23:16] |RDQSND |Read DQSN Delay + * | | |Delay select for the read DQSN (RDQS) LCDL + * @var DDRPHY_T::DX3LCDLR2 + * Offset: 0x2A8 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0DQSGD |Rank 0 Read DQS Gating Delay + * | | |Rank 0 delay select for the read DQS gating (DQSG) LCDL + * |[15:8] |R1DQSGD |Rank 1 Read DQS Gating Delay + * | | |Rank 1 delay select for the read DQS gating (DQSG) LCDL + * |[23:16] |R2DQSGD |Rank 2 Read DQS Gating Delay + * | | |Rank 2 delay select for the read DQS gating (DQSG) LCDL + * |[31:24] |R3DQSGD |Rank 3 Read DQS Gating Delay + * | | |Rank 3 delay select for the read DQS gating (DQSG) LCDL + * @var DDRPHY_T::DX3MDLR + * Offset: 0x2AC DATX8 Master Delay Line Register (DXnMDLR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |IPRD |Initial Period + * | | |Initial period measured by the master delay line calibration for VT drift compensation + * | | |This value is used as the denominator when calculating the ratios of updates during VT compensation. + * |[15:8] |TPRD |Target Period + * | | |Target period measured by the master delay line calibration for VT drift compensation + * | | |This is the current measured value of the period and is continuously updated if the MDL is enabled to do so. + * |[23:16] |MDLD |MDL Delay + * | | |Delay select for the LCDL for the Master Delay Line. + * @var DDRPHY_T::DX3GTR + * Offset: 0x2B0 DATX8 General Timing Register (DXnGTR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |R0DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[5:3] |R1DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[8:6] |R2DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[11:9] |R3DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[13:12] |R0WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[15:14] |R1WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[17:16] |R2WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[19:18] |R3WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * @var DDRPHY_T::DX3GSR2 + * Offset: 0x2B4 DATX8 General Status Register 2 (DXnGSR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDERR |Read Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read bit deskew training. + * |[1] |RDWN |Read Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read bit deskew training. + * |[2] |WDERR |Write Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write bit deskew training. + * |[3] |WDWN |Write Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write bit deskew training. + * |[4] |REERR |Read Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read data eye training. + * |[5] |REWN |Read Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read data eye training. + * |[6] |WEERR |Write Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write data eye training. + * |[7] |WEWN |Write Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write data eye training. + * |[11:8] |ESTAT |Error Status + * | | |If an error occurred for this lane as indicated by RDERR, WDERR, REERR or WEERR the error status code can provide additional information regard when the error occurred during the algorithm execution. + * @var DDRPHY_T::DX4GCR + * Offset: 0x2C0 DATX8 General Configuration Register (DXnGCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DXEN |Data Byte Enable + * | | |Enables, if set, the data byte + * | | |Setting this bit to '0' disables the byte, i.e + * | | |the byte is not used in PHY initialization or training and is ignored during SDRAM read/write operations. + * |[1] |DQSODT |DQS On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQS/DQS# pin of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[9] is '0'. + * |[2] |DQODT |Data On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQ and DM pins of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[10] is '0'. + * |[3] |DXIOM |Data I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the IOM configuration bit of the individual DATX8(see "DATX8 Common Configuration Register (DXCCR)"). + * |[4] |DXPDD |Data Power Down Driver + * | | |Powers down, when set, the output driver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDD configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[5] |DXPDR |Data Power Down Receiver + * | | |Powers down, when set, the input receiver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * |[6] |DQSRPD |DQSR Power Down + * | | |Powers down, if set, the PDQSR cell + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)") + * |[8:7] |DSEN |Write DQS Enable + * | | |Controls whether the write DQS going to the SDRAM is enabled (toggling) or disabled (static value) and whether the DQS is inverted + * | | |DQS# is always the inversion of DQS + * | | |These values are valid only when DQS/DQS# output enable is on, otherwise the DQS/DQS# is tristated + * | | |Valid settings are: + * | | |00 = Reserved + * | | |01 = DQS toggling with normal polarity (This should be the default setting) + * | | |10 = Reserved + * | | |11 = Reserved + * |[9] |DQSRTT |DQS Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQS/DQS# SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[1] (DQSODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[10] |DQRTT |DQ Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQ/DM SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[2] (DQODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[12:11] |RTTOH |RTT Output Hold + * | | |Indicates the number of clock cycles (from 0 to 3) after the read data postamble for which ODT control should remain set to DQSODT for DQS or DQODT for DQ/DM before disabling it (setting it to '0') when using dynamic ODT control + * | | |ODT is disabled almost RTTOH clock cycles after the read postamble. + * |[13] |RTTOAL |RTT On Additive Latency + * | | |Indicates when the ODT control of DQ/DQS SSTL I/Os is set to the value in DQODT/DQSODT during read cycles + * | | |Valid values are: + * | | |0 = ODT control is set to DQSODT/DQODT almost two cycles before read data preamble + * | | |1 = ODT control is set to DQSODT/DQODT almost one cycle before read data preamble + * |[15:14] |DXOEO |Data Byte Output Enable Override + * | | |Specifies whether the output I/O output enable for the byte lane should be set to a fixed value + * | | |Valid values are: + * | | |00 = No override. Output enable is controlled by DFI transactions + * | | |01 = Output enable is asserted (I/O is forced to output mode). + * | | |10 = Output enable is de-asserted (I/O is forced to input mode) + * | | |11 = Reserved + * |[16] |PLLRST |PLL Rest + * | | |Resets the byte PLL by driving the PLL reset pin + * | | |This bit is not self- clearing and a '0' must be written to de-assert the reset + * | | |This bit is ORed with the global PLLRST configuration bit. + * |[17] |PLLPD |PLL Power Down + * | | |Puts the byte PLL in Power-down mode by driving the PLL power down pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the power-down + * | | |This bit is ORed with the global PLLPD configuration bit. + * |[18] |GSHIFT |Gear Shift + * | | |Enables, if set, rapid locking mode on the byte PLL + * | | |This bit is ORed with the global GSHIFT configuration bit. + * |[19] |PLLBYP |PLL Bypass + * | | |Puts the byte PLL in bypass mode by driving the PLL bypass pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the bypass + * | | |This bit is ORed with the global BYP configuration bit. + * |[29:26] |WLRKEN |Write Level Rank Enable + * | | |Specifies the ranks that should be write leveled for this byte + * | | |Write leveling responses from ranks that are not enabled for write leveling for a particular byte are ignored and write leveling is flagged as done for these ranks + * | | |WLRKEN[0] enables rank 0, [1] enables rank 1, [2] enables rank 2, and [3] enables rank 3. + * |[30] |MDLEN |Master Delay Line Enable + * | | |Enables, if set, the DATX8 master delay line calibration to perform subsequent period measurements following the initial period measurements that are performed after reset or when calibration is manually triggered + * | | |These additional measurements are accumulated and filtered as long as this bit remains high + * | | |This bit is ANDed with the common DATX8 MDL enable bit. + * |[31] |CALBYP |Calibration Bypass + * | | |Prevents, if set, period measurement calibration from automatically triggering after PHY initialization. + * @var DDRPHY_T::DX4GSR0 + * Offset: 0x2C4 DATX8 General Status Registers 0 (DXnGSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WDQCAL |Write DQ Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write DQ LCDL. + * |[1] |RDQSCAL |Read DQS Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS LCDL. + * |[2] |RDQSNCAL |Read DQS# Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS# LCDL. + * |[3] |GDQSCAL |Read DQS gating Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS gating LCDL. + * |[4] |WLCAL |Write Leveling Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write leveling slave delay line. + * |[5] |WLDONE |Write Leveling Done + * | | |Indicates, if set, that the DATX8 has completed write leveling. + * |[6] |WLERR |Write Leveling Error + * | | |Indicates, if set, that there is a write leveling error in the DATX8. + * |[14:7] |WLPRD |Write Leveling Period + * | | |Returns the DDR clock period measured by the write leveling LCDL during calibration + * | | |The measured period is used to generate the control of the write leveling pipeline which is a function of the write-leveling delay and the clock period + * | | |This value is PVT compensated. + * |[15] |DPLOCK |DATX8 PLL Lock + * | | |Indicates, if set, that the DATX8 PLL has locked. This is a direct status of the DATX8 PLL lock pin. + * |[23:16] |GDQSPRD |Read DQS gating Period + * | | |Returns the DDR clock period measured by the read DQS gating LCDL during calibration + * | | |This value is PVT compensated. + * |[27:24] |QSGERR |DQS Gate Training Error + * | | |Indicates, if set, that there is an error in DQS gate training. One bit for each of the up to 4 ranks. + * |[28] |WLDQ |Write Leveling DQ Status + * | | |Captures the write leveling DQ status from the DRAM during software write leveling. + * @var DDRPHY_T::DX4GSR1 + * Offset: 0x2C8 DATX8 General Status Registers 1 (DXnGSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DLTDONE |Delay Line Test Done + * | | |Indicates, if set, that the PHY control block has finished doing period measurement of the DATX8 delay line digital test output. + * |[24:1] |DLTCODE |Delay Line Test Code + * | | |Returns the code measured by the PHY control block that corresponds to the period of the DATX8 delay line digital test output. + * @var DDRPHY_T::DX4BDLR0 + * Offset: 0x2CC DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0WBD |DQ0 Write Bit Delay + * | | |Delay select for the BDL on DQ0 write path. + * |[11:6] |DQ1WBD |DQ1 Write Bit Delay + * | | |Delay select for the BDL on DQ1 write path. + * |[17:12] |DQ2WBD |DQ2 Write Bit Delay + * | | |Delay select for the BDL on DQ2 write path. + * |[23:18] |DQ3WBD |DQ3 Write Bit Delay + * | | |Delay select for the BDL on DQ3 write path + * |[29:24] |DQ4WBD |DQ4 Write Bit Delay + * | | |Delay select for the BDL on DQ4 write path. + * @var DDRPHY_T::DX4BDLR1 + * Offset: 0x2D0 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5WBD |DQ5 Write Bit Delay + * | | |Delay select for the BDL on DQ5 write path. + * |[11:6] |DQ6WBD |DQ6 Write Bit Delay + * | | |Delay select for the BDL on DQ6 write path. + * |[17:12] |DQ7WBD |DQ7 Write Bit Delay + * | | |Delay select for the BDL on DQ7 write path. + * |[23:18] |DMWBD |DM Write Bit Delay + * | | |Delay select for the BDL on DM write path. + * |[29:24] |DSWBD |DQS Write Bit Delay + * | | |Delay select for the BDL on DQS write path + * @var DDRPHY_T::DX4BDLR2 + * Offset: 0x2D4 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DSOEBD |DQS Output Enable Bit Delay + * | | |Delay select for the BDL on DQS output enable path + * |[11:6] |DQOEBD |DQ Output Enable Bit Delay + * | | |Delay select for the BDL on DQ/DM output enable path. + * |[17:12] |DSRBD |DQS Read Bit Delay + * | | |Delay select for the BDL on DQS read path + * |[23:18] |DSNRBD |DQSN Read Bit Delay + * | | |Delay select for the BDL on DQSN read path + * @var DDRPHY_T::DX4BDLR3 + * Offset: 0x2D8 DATX8 Bit Delay Line Register 3 (DXnBDLR3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0RBD |DQ0 Read Bit Delay + * | | |Delay select for the BDL on DQ0 read path. + * |[11:6] |DQ1RBD |DQ1 Read Bit Delay + * | | |Delay select for the BDL on DQ1 read path. + * |[17:12] |DQ2RBD |DQ2 Read Bit Delay + * | | |Delay select for the BDL on DQ2 read path. + * |[23:18] |DQ3RBD |DQ3 Read Bit Delay + * | | |Delay select for the BDL on DQ3 read path + * |[29:24] |DQ4RBD |DQ4 Read Bit Delay + * | | |Delay select for the BDL on DQ4 read path. + * @var DDRPHY_T::DX4BDLR4 + * Offset: 0x2DC DATX8 Bit Delay Line Register 4 (DXnBDLR4) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5RBD |DQ5 Read Bit Delay + * | | |Delay select for the BDL on DQ5 read path. + * |[11:6] |DQ6RBD |DQ6 Read Bit Delay + * | | |Delay select for the BDL on DQ6 read path. + * |[17:12] |DQ7RBD |DQ7 Read Bit Delay + * | | |Delay select for the BDL on DQ7 read path. + * |[23:18] |DMRBD |DM Read Bit Delay + * | | |Delay select for the BDL on DM read path. + * @var DDRPHY_T::DX4LCDLR0 + * Offset: 0x2E0 DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0WLD |Rank 0 Write Leveling Delay + * | | |Rank 0 delay select for the write leveling (WL) LCDL + * |[15:8] |R1WLD |Rank 1 Write Leveling Delay + * | | |Rank 1 delay select for the write leveling (WL) LCDL + * |[23:16] |R2WLD |Rank 2 Write Leveling Delay + * | | |Rank 2 delay select for the write leveling (WL) LCDL + * |[31:24] |R3WLD |Rank 3 Write Leveling Delay + * | | |Rank 3 delay select for the write leveling (WL) LCDL + * @var DDRPHY_T::DX4LCDLR1 + * Offset: 0x2E4 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var DDRPHY_T::DX4LCDLR2 + * Offset: 0x2E8 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0DQSGD |Rank 0 Read DQS Gating Delay + * | | |Rank 0 delay select for the read DQS gating (DQSG) LCDL + * |[15:8] |R1DQSGD |Rank 1 Read DQS Gating Delay + * | | |Rank 1 delay select for the read DQS gating (DQSG) LCDL + * |[23:16] |R2DQSGD |Rank 2 Read DQS Gating Delay + * | | |Rank 2 delay select for the read DQS gating (DQSG) LCDL + * |[31:24] |R3DQSGD |Rank 3 Read DQS Gating Delay + * | | |Rank 3 delay select for the read DQS gating (DQSG) LCDL + * @var DDRPHY_T::DX4MDLR + * Offset: 0x2EC DATX8 Master Delay Line Register (DXnMDLR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |IPRD |Initial Period + * | | |Initial period measured by the master delay line calibration for VT drift compensation + * | | |This value is used as the denominator when calculating the ratios of updates during VT compensation. + * |[15:8] |TPRD |Target Period + * | | |Target period measured by the master delay line calibration for VT drift compensation + * | | |This is the current measured value of the period and is continuously updated if the MDL is enabled to do so. + * |[23:16] |MDLD |MDL Delay + * | | |Delay select for the LCDL for the Master Delay Line. + * @var DDRPHY_T::DX4GTR + * Offset: 0x2F0 DATX8 General Timing Register (DXnGTR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |R0DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[5:3] |R1DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[8:6] |R2DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[11:9] |R3DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[13:12] |R0WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[15:14] |R1WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[17:16] |R2WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[19:18] |R3WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * @var DDRPHY_T::DX4GSR2 + * Offset: 0x2F4 DATX8 General Status Register 2 (DXnGSR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDERR |Read Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read bit deskew training. + * |[1] |RDWN |Read Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read bit deskew training. + * |[2] |WDERR |Write Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write bit deskew training. + * |[3] |WDWN |Write Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write bit deskew training. + * |[4] |REERR |Read Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read data eye training. + * |[5] |REWN |Read Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read data eye training. + * |[6] |WEERR |Write Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write data eye training. + * |[7] |WEWN |Write Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write data eye training. + * |[11:8] |ESTAT |Error Status + * | | |If an error occurred for this lane as indicated by RDERR, WDERR, REERR or WEERR the error status code can provide additional information regard when the error occurred during the algorithm execution. + * @var DDRPHY_T::DX5GCR + * Offset: 0x300 DATX8 General Configuration Register (DXnGCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DXEN |Data Byte Enable + * | | |Enables, if set, the data byte + * | | |Setting this bit to '0' disables the byte, i.e + * | | |the byte is not used in PHY initialization or training and is ignored during SDRAM read/write operations. + * |[1] |DQSODT |DQS On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQS/DQS# pin of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[9] is '0'. + * |[2] |DQODT |Data On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQ and DM pins of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[10] is '0'. + * |[3] |DXIOM |Data I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the IOM configuration bit of the individual DATX8(see "DATX8 Common Configuration Register (DXCCR)"). + * |[4] |DXPDD |Data Power Down Driver + * | | |Powers down, when set, the output driver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDD configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[5] |DXPDR |Data Power Down Receiver + * | | |Powers down, when set, the input receiver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * |[6] |DQSRPD |DQSR Power Down + * | | |Powers down, if set, the PDQSR cell + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)") + * |[8:7] |DSEN |Write DQS Enable + * | | |Controls whether the write DQS going to the SDRAM is enabled (toggling) or disabled (static value) and whether the DQS is inverted + * | | |DQS# is always the inversion of DQS + * | | |These values are valid only when DQS/DQS# output enable is on, otherwise the DQS/DQS# is tristated + * | | |Valid settings are: + * | | |00 = Reserved + * | | |01 = DQS toggling with normal polarity (This should be the default setting) + * | | |10 = Reserved + * | | |11 = Reserved + * |[9] |DQSRTT |DQS Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQS/DQS# SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[1] (DQSODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[10] |DQRTT |DQ Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQ/DM SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[2] (DQODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[12:11] |RTTOH |RTT Output Hold + * | | |Indicates the number of clock cycles (from 0 to 3) after the read data postamble for which ODT control should remain set to DQSODT for DQS or DQODT for DQ/DM before disabling it (setting it to '0') when using dynamic ODT control + * | | |ODT is disabled almost RTTOH clock cycles after the read postamble. + * |[13] |RTTOAL |RTT On Additive Latency + * | | |Indicates when the ODT control of DQ/DQS SSTL I/Os is set to the value in DQODT/DQSODT during read cycles + * | | |Valid values are: + * | | |0 = ODT control is set to DQSODT/DQODT almost two cycles before read data preamble + * | | |1 = ODT control is set to DQSODT/DQODT almost one cycle before read data preamble + * |[15:14] |DXOEO |Data Byte Output Enable Override + * | | |Specifies whether the output I/O output enable for the byte lane should be set to a fixed value + * | | |Valid values are: + * | | |00 = No override. Output enable is controlled by DFI transactions + * | | |01 = Output enable is asserted (I/O is forced to output mode). + * | | |10 = Output enable is de-asserted (I/O is forced to input mode) + * | | |11 = Reserved + * |[16] |PLLRST |PLL Rest + * | | |Resets the byte PLL by driving the PLL reset pin + * | | |This bit is not self- clearing and a '0' must be written to de-assert the reset + * | | |This bit is ORed with the global PLLRST configuration bit. + * |[17] |PLLPD |PLL Power Down + * | | |Puts the byte PLL in Power-down mode by driving the PLL power down pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the power-down + * | | |This bit is ORed with the global PLLPD configuration bit. + * |[18] |GSHIFT |Gear Shift + * | | |Enables, if set, rapid locking mode on the byte PLL + * | | |This bit is ORed with the global GSHIFT configuration bit. + * |[19] |PLLBYP |PLL Bypass + * | | |Puts the byte PLL in bypass mode by driving the PLL bypass pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the bypass + * | | |This bit is ORed with the global BYP configuration bit. + * |[29:26] |WLRKEN |Write Level Rank Enable + * | | |Specifies the ranks that should be write leveled for this byte + * | | |Write leveling responses from ranks that are not enabled for write leveling for a particular byte are ignored and write leveling is flagged as done for these ranks + * | | |WLRKEN[0] enables rank 0, [1] enables rank 1, [2] enables rank 2, and [3] enables rank 3. + * |[30] |MDLEN |Master Delay Line Enable + * | | |Enables, if set, the DATX8 master delay line calibration to perform subsequent period measurements following the initial period measurements that are performed after reset or when calibration is manually triggered + * | | |These additional measurements are accumulated and filtered as long as this bit remains high + * | | |This bit is ANDed with the common DATX8 MDL enable bit. + * |[31] |CALBYP |Calibration Bypass + * | | |Prevents, if set, period measurement calibration from automatically triggering after PHY initialization. + * @var DDRPHY_T::DX5GSR0 + * Offset: 0x304 DATX8 General Status Registers 0 (DXnGSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WDQCAL |Write DQ Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write DQ LCDL. + * |[1] |RDQSCAL |Read DQS Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS LCDL. + * |[2] |RDQSNCAL |Read DQS# Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS# LCDL. + * |[3] |GDQSCAL |Read DQS gating Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS gating LCDL. + * |[4] |WLCAL |Write Leveling Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write leveling slave delay line. + * |[5] |WLDONE |Write Leveling Done + * | | |Indicates, if set, that the DATX8 has completed write leveling. + * |[6] |WLERR |Write Leveling Error + * | | |Indicates, if set, that there is a write leveling error in the DATX8. + * |[14:7] |WLPRD |Write Leveling Period + * | | |Returns the DDR clock period measured by the write leveling LCDL during calibration + * | | |The measured period is used to generate the control of the write leveling pipeline which is a function of the write-leveling delay and the clock period + * | | |This value is PVT compensated. + * |[15] |DPLOCK |DATX8 PLL Lock + * | | |Indicates, if set, that the DATX8 PLL has locked. This is a direct status of the DATX8 PLL lock pin. + * |[23:16] |GDQSPRD |Read DQS gating Period + * | | |Returns the DDR clock period measured by the read DQS gating LCDL during calibration + * | | |This value is PVT compensated. + * |[27:24] |QSGERR |DQS Gate Training Error + * | | |Indicates, if set, that there is an error in DQS gate training. One bit for each of the up to 4 ranks. + * |[28] |WLDQ |Write Leveling DQ Status + * | | |Captures the write leveling DQ status from the DRAM during software write leveling. + * @var DDRPHY_T::DX5GSR1 + * Offset: 0x308 DATX8 General Status Registers 1 (DXnGSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DLTDONE |Delay Line Test Done + * | | |Indicates, if set, that the PHY control block has finished doing period measurement of the DATX8 delay line digital test output. + * |[24:1] |DLTCODE |Delay Line Test Code + * | | |Returns the code measured by the PHY control block that corresponds to the period of the DATX8 delay line digital test output. + * @var DDRPHY_T::DX5BDLR0 + * Offset: 0x30C DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0WBD |DQ0 Write Bit Delay + * | | |Delay select for the BDL on DQ0 write path. + * |[11:6] |DQ1WBD |DQ1 Write Bit Delay + * | | |Delay select for the BDL on DQ1 write path. + * |[17:12] |DQ2WBD |DQ2 Write Bit Delay + * | | |Delay select for the BDL on DQ2 write path. + * |[23:18] |DQ3WBD |DQ3 Write Bit Delay + * | | |Delay select for the BDL on DQ3 write path + * |[29:24] |DQ4WBD |DQ4 Write Bit Delay + * | | |Delay select for the BDL on DQ4 write path. + * @var DDRPHY_T::DX5BDLR1 + * Offset: 0x310 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5WBD |DQ5 Write Bit Delay + * | | |Delay select for the BDL on DQ5 write path. + * |[11:6] |DQ6WBD |DQ6 Write Bit Delay + * | | |Delay select for the BDL on DQ6 write path. + * |[17:12] |DQ7WBD |DQ7 Write Bit Delay + * | | |Delay select for the BDL on DQ7 write path. + * |[23:18] |DMWBD |DM Write Bit Delay + * | | |Delay select for the BDL on DM write path. + * |[29:24] |DSWBD |DQS Write Bit Delay + * | | |Delay select for the BDL on DQS write path + * @var DDRPHY_T::DX5BDLR2 + * Offset: 0x314 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DSOEBD |DQS Output Enable Bit Delay + * | | |Delay select for the BDL on DQS output enable path + * |[11:6] |DQOEBD |DQ Output Enable Bit Delay + * | | |Delay select for the BDL on DQ/DM output enable path. + * |[17:12] |DSRBD |DQS Read Bit Delay + * | | |Delay select for the BDL on DQS read path + * |[23:18] |DSNRBD |DQSN Read Bit Delay + * | | |Delay select for the BDL on DQSN read path + * @var DDRPHY_T::DX5BDLR3 + * Offset: 0x318 DATX8 Bit Delay Line Register 3 (DXnBDLR3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0RBD |DQ0 Read Bit Delay + * | | |Delay select for the BDL on DQ0 read path. + * |[11:6] |DQ1RBD |DQ1 Read Bit Delay + * | | |Delay select for the BDL on DQ1 read path. + * |[17:12] |DQ2RBD |DQ2 Read Bit Delay + * | | |Delay select for the BDL on DQ2 read path. + * |[23:18] |DQ3RBD |DQ3 Read Bit Delay + * | | |Delay select for the BDL on DQ3 read path + * |[29:24] |DQ4RBD |DQ4 Read Bit Delay + * | | |Delay select for the BDL on DQ4 read path. + * @var DDRPHY_T::DX5BDLR4 + * Offset: 0x31C DATX8 Bit Delay Line Register 4 (DXnBDLR4) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5RBD |DQ5 Read Bit Delay + * | | |Delay select for the BDL on DQ5 read path. + * |[11:6] |DQ6RBD |DQ6 Read Bit Delay + * | | |Delay select for the BDL on DQ6 read path. + * |[17:12] |DQ7RBD |DQ7 Read Bit Delay + * | | |Delay select for the BDL on DQ7 read path. + * |[23:18] |DMRBD |DM Read Bit Delay + * | | |Delay select for the BDL on DM read path. + * @var DDRPHY_T::DX5LCDLR0 + * Offset: 0x320 DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0WLD |Rank 0 Write Leveling Delay + * | | |Rank 0 delay select for the write leveling (WL) LCDL + * |[15:8] |R1WLD |Rank 1 Write Leveling Delay + * | | |Rank 1 delay select for the write leveling (WL) LCDL + * |[23:16] |R2WLD |Rank 2 Write Leveling Delay + * | | |Rank 2 delay select for the write leveling (WL) LCDL + * |[31:24] |R3WLD |Rank 3 Write Leveling Delay + * | | |Rank 3 delay select for the write leveling (WL) LCDL + * @var DDRPHY_T::DX5LCDLR1 + * Offset: 0x324 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |WDQD |Write Data Delay + * | | |Delay select for the write data (WDQ) LCDL + * |[15:8] |RDQSD |Read DQS Delay + * | | |Delay select for the read DQS (RDQS) LCDL + * |[23:16] |RDQSND |Read DQSN Delay + * | | |Delay select for the read DQSN (RDQS) LCDL + * @var DDRPHY_T::DX5LCDLR2 + * Offset: 0x328 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0DQSGD |Rank 0 Read DQS Gating Delay + * | | |Rank 0 delay select for the read DQS gating (DQSG) LCDL + * |[15:8] |R1DQSGD |Rank 1 Read DQS Gating Delay + * | | |Rank 1 delay select for the read DQS gating (DQSG) LCDL + * |[23:16] |R2DQSGD |Rank 2 Read DQS Gating Delay + * | | |Rank 2 delay select for the read DQS gating (DQSG) LCDL + * |[31:24] |R3DQSGD |Rank 3 Read DQS Gating Delay + * | | |Rank 3 delay select for the read DQS gating (DQSG) LCDL + * @var DDRPHY_T::DX5MDLR + * Offset: 0x32C DATX8 Master Delay Line Register (DXnMDLR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |IPRD |Initial Period + * | | |Initial period measured by the master delay line calibration for VT drift compensation + * | | |This value is used as the denominator when calculating the ratios of updates during VT compensation. + * |[15:8] |TPRD |Target Period + * | | |Target period measured by the master delay line calibration for VT drift compensation + * | | |This is the current measured value of the period and is continuously updated if the MDL is enabled to do so. + * |[23:16] |MDLD |MDL Delay + * | | |Delay select for the LCDL for the Master Delay Line. + * @var DDRPHY_T::DX5GTR + * Offset: 0x330 DATX8 General Timing Register (DXnGTR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |R0DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[5:3] |R1DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[8:6] |R2DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[11:9] |R3DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[13:12] |R0WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[15:14] |R1WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[17:16] |R2WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[19:18] |R3WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * @var DDRPHY_T::DX5GSR2 + * Offset: 0x334 DATX8 General Status Register 2 (DXnGSR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDERR |Read Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read bit deskew training. + * |[1] |RDWN |Read Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read bit deskew training. + * |[2] |WDERR |Write Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write bit deskew training. + * |[3] |WDWN |Write Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write bit deskew training. + * |[4] |REERR |Read Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read data eye training. + * |[5] |REWN |Read Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read data eye training. + * |[6] |WEERR |Write Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write data eye training. + * |[7] |WEWN |Write Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write data eye training. + * |[11:8] |ESTAT |Error Status + * | | |If an error occurred for this lane as indicated by RDERR, WDERR, REERR or WEERR the error status code can provide additional information regard when the error occurred during the algorithm execution. + * @var DDRPHY_T::DX6GCR + * Offset: 0x340 DATX8 General Configuration Register (DXnGCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DXEN |Data Byte Enable + * | | |Enables, if set, the data byte + * | | |Setting this bit to '0' disables the byte, i.e + * | | |the byte is not used in PHY initialization or training and is ignored during SDRAM read/write operations. + * |[1] |DQSODT |DQS On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQS/DQS# pin of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[9] is '0'. + * |[2] |DQODT |Data On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQ and DM pins of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[10] is '0'. + * |[3] |DXIOM |Data I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the IOM configuration bit of the individual DATX8(see "DATX8 Common Configuration Register (DXCCR)"). + * |[4] |DXPDD |Data Power Down Driver + * | | |Powers down, when set, the output driver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDD configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[5] |DXPDR |Data Power Down Receiver + * | | |Powers down, when set, the input receiver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * |[6] |DQSRPD |DQSR Power Down + * | | |Powers down, if set, the PDQSR cell + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)") + * |[8:7] |DSEN |Write DQS Enable + * | | |Controls whether the write DQS going to the SDRAM is enabled (toggling) or disabled (static value) and whether the DQS is inverted + * | | |DQS# is always the inversion of DQS + * | | |These values are valid only when DQS/DQS# output enable is on, otherwise the DQS/DQS# is tristated + * | | |Valid settings are: + * | | |00 = Reserved + * | | |01 = DQS toggling with normal polarity (This should be the default setting) + * | | |10 = Reserved + * | | |11 = Reserved + * |[9] |DQSRTT |DQS Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQS/DQS# SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[1] (DQSODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[10] |DQRTT |DQ Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQ/DM SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[2] (DQODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[12:11] |RTTOH |RTT Output Hold + * | | |Indicates the number of clock cycles (from 0 to 3) after the read data postamble for which ODT control should remain set to DQSODT for DQS or DQODT for DQ/DM before disabling it (setting it to '0') when using dynamic ODT control + * | | |ODT is disabled almost RTTOH clock cycles after the read postamble. + * |[13] |RTTOAL |RTT On Additive Latency + * | | |Indicates when the ODT control of DQ/DQS SSTL I/Os is set to the value in DQODT/DQSODT during read cycles + * | | |Valid values are: + * | | |0 = ODT control is set to DQSODT/DQODT almost two cycles before read data preamble + * | | |1 = ODT control is set to DQSODT/DQODT almost one cycle before read data preamble + * |[15:14] |DXOEO |Data Byte Output Enable Override + * | | |Specifies whether the output I/O output enable for the byte lane should be set to a fixed value + * | | |Valid values are: + * | | |00 = No override. Output enable is controlled by DFI transactions + * | | |01 = Output enable is asserted (I/O is forced to output mode). + * | | |10 = Output enable is de-asserted (I/O is forced to input mode) + * | | |11 = Reserved + * |[16] |PLLRST |PLL Rest + * | | |Resets the byte PLL by driving the PLL reset pin + * | | |This bit is not self- clearing and a '0' must be written to de-assert the reset + * | | |This bit is ORed with the global PLLRST configuration bit. + * |[17] |PLLPD |PLL Power Down + * | | |Puts the byte PLL in Power-down mode by driving the PLL power down pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the power-down + * | | |This bit is ORed with the global PLLPD configuration bit. + * |[18] |GSHIFT |Gear Shift + * | | |Enables, if set, rapid locking mode on the byte PLL + * | | |This bit is ORed with the global GSHIFT configuration bit. + * |[19] |PLLBYP |PLL Bypass + * | | |Puts the byte PLL in bypass mode by driving the PLL bypass pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the bypass + * | | |This bit is ORed with the global BYP configuration bit. + * |[29:26] |WLRKEN |Write Level Rank Enable + * | | |Specifies the ranks that should be write leveled for this byte + * | | |Write leveling responses from ranks that are not enabled for write leveling for a particular byte are ignored and write leveling is flagged as done for these ranks + * | | |WLRKEN[0] enables rank 0, [1] enables rank 1, [2] enables rank 2, and [3] enables rank 3. + * |[30] |MDLEN |Master Delay Line Enable + * | | |Enables, if set, the DATX8 master delay line calibration to perform subsequent period measurements following the initial period measurements that are performed after reset or when calibration is manually triggered + * | | |These additional measurements are accumulated and filtered as long as this bit remains high + * | | |This bit is ANDed with the common DATX8 MDL enable bit. + * |[31] |CALBYP |Calibration Bypass + * | | |Prevents, if set, period measurement calibration from automatically triggering after PHY initialization. + * @var DDRPHY_T::DX6GSR0 + * Offset: 0x344 DATX8 General Status Registers 0 (DXnGSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WDQCAL |Write DQ Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write DQ LCDL. + * |[1] |RDQSCAL |Read DQS Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS LCDL. + * |[2] |RDQSNCAL |Read DQS# Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS# LCDL. + * |[3] |GDQSCAL |Read DQS gating Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS gating LCDL. + * |[4] |WLCAL |Write Leveling Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write leveling slave delay line. + * |[5] |WLDONE |Write Leveling Done + * | | |Indicates, if set, that the DATX8 has completed write leveling. + * |[6] |WLERR |Write Leveling Error + * | | |Indicates, if set, that there is a write leveling error in the DATX8. + * |[14:7] |WLPRD |Write Leveling Period + * | | |Returns the DDR clock period measured by the write leveling LCDL during calibration + * | | |The measured period is used to generate the control of the write leveling pipeline which is a function of the write-leveling delay and the clock period + * | | |This value is PVT compensated. + * |[15] |DPLOCK |DATX8 PLL Lock + * | | |Indicates, if set, that the DATX8 PLL has locked. This is a direct status of the DATX8 PLL lock pin. + * |[23:16] |GDQSPRD |Read DQS gating Period + * | | |Returns the DDR clock period measured by the read DQS gating LCDL during calibration + * | | |This value is PVT compensated. + * |[27:24] |QSGERR |DQS Gate Training Error + * | | |Indicates, if set, that there is an error in DQS gate training. One bit for each of the up to 4 ranks. + * |[28] |WLDQ |Write Leveling DQ Status + * | | |Captures the write leveling DQ status from the DRAM during software write leveling. + * @var DDRPHY_T::DX6GSR1 + * Offset: 0x348 DATX8 General Status Registers 1 (DXnGSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DLTDONE |Delay Line Test Done + * | | |Indicates, if set, that the PHY control block has finished doing period measurement of the DATX8 delay line digital test output. + * |[24:1] |DLTCODE |Delay Line Test Code + * | | |Returns the code measured by the PHY control block that corresponds to the period of the DATX8 delay line digital test output. + * @var DDRPHY_T::DX6BDLR0 + * Offset: 0x34C DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0WBD |DQ0 Write Bit Delay + * | | |Delay select for the BDL on DQ0 write path. + * |[11:6] |DQ1WBD |DQ1 Write Bit Delay + * | | |Delay select for the BDL on DQ1 write path. + * |[17:12] |DQ2WBD |DQ2 Write Bit Delay + * | | |Delay select for the BDL on DQ2 write path. + * |[23:18] |DQ3WBD |DQ3 Write Bit Delay + * | | |Delay select for the BDL on DQ3 write path + * |[29:24] |DQ4WBD |DQ4 Write Bit Delay + * | | |Delay select for the BDL on DQ4 write path. + * @var DDRPHY_T::DX6BDLR1 + * Offset: 0x350 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5WBD |DQ5 Write Bit Delay + * | | |Delay select for the BDL on DQ5 write path. + * |[11:6] |DQ6WBD |DQ6 Write Bit Delay + * | | |Delay select for the BDL on DQ6 write path. + * |[17:12] |DQ7WBD |DQ7 Write Bit Delay + * | | |Delay select for the BDL on DQ7 write path. + * |[23:18] |DMWBD |DM Write Bit Delay + * | | |Delay select for the BDL on DM write path. + * |[29:24] |DSWBD |DQS Write Bit Delay + * | | |Delay select for the BDL on DQS write path + * @var DDRPHY_T::DX6BDLR2 + * Offset: 0x354 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DSOEBD |DQS Output Enable Bit Delay + * | | |Delay select for the BDL on DQS output enable path + * |[11:6] |DQOEBD |DQ Output Enable Bit Delay + * | | |Delay select for the BDL on DQ/DM output enable path. + * |[17:12] |DSRBD |DQS Read Bit Delay + * | | |Delay select for the BDL on DQS read path + * |[23:18] |DSNRBD |DQSN Read Bit Delay + * | | |Delay select for the BDL on DQSN read path + * @var DDRPHY_T::DX6BDLR3 + * Offset: 0x358 DATX8 Bit Delay Line Register 3 (DXnBDLR3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0RBD |DQ0 Read Bit Delay + * | | |Delay select for the BDL on DQ0 read path. + * |[11:6] |DQ1RBD |DQ1 Read Bit Delay + * | | |Delay select for the BDL on DQ1 read path. + * |[17:12] |DQ2RBD |DQ2 Read Bit Delay + * | | |Delay select for the BDL on DQ2 read path. + * |[23:18] |DQ3RBD |DQ3 Read Bit Delay + * | | |Delay select for the BDL on DQ3 read path + * |[29:24] |DQ4RBD |DQ4 Read Bit Delay + * | | |Delay select for the BDL on DQ4 read path. + * @var DDRPHY_T::DX6BDLR4 + * Offset: 0x35C DATX8 Bit Delay Line Register 4 (DXnBDLR4) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5RBD |DQ5 Read Bit Delay + * | | |Delay select for the BDL on DQ5 read path. + * |[11:6] |DQ6RBD |DQ6 Read Bit Delay + * | | |Delay select for the BDL on DQ6 read path. + * |[17:12] |DQ7RBD |DQ7 Read Bit Delay + * | | |Delay select for the BDL on DQ7 read path. + * |[23:18] |DMRBD |DM Read Bit Delay + * | | |Delay select for the BDL on DM read path. + * @var DDRPHY_T::DX6LCDLR0 + * Offset: 0x360 DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0WLD |Rank 0 Write Leveling Delay + * | | |Rank 0 delay select for the write leveling (WL) LCDL + * |[15:8] |R1WLD |Rank 1 Write Leveling Delay + * | | |Rank 1 delay select for the write leveling (WL) LCDL + * |[23:16] |R2WLD |Rank 2 Write Leveling Delay + * | | |Rank 2 delay select for the write leveling (WL) LCDL + * |[31:24] |R3WLD |Rank 3 Write Leveling Delay + * | | |Rank 3 delay select for the write leveling (WL) LCDL + * @var DDRPHY_T::DX6LCDLR1 + * Offset: 0x364 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var DDRPHY_T::DX6LCDLR2 + * Offset: 0x368 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0DQSGD |Rank 0 Read DQS Gating Delay + * | | |Rank 0 delay select for the read DQS gating (DQSG) LCDL + * |[15:8] |R1DQSGD |Rank 1 Read DQS Gating Delay + * | | |Rank 1 delay select for the read DQS gating (DQSG) LCDL + * |[23:16] |R2DQSGD |Rank 2 Read DQS Gating Delay + * | | |Rank 2 delay select for the read DQS gating (DQSG) LCDL + * |[31:24] |R3DQSGD |Rank 3 Read DQS Gating Delay + * | | |Rank 3 delay select for the read DQS gating (DQSG) LCDL + * @var DDRPHY_T::DX6MDLR + * Offset: 0x36C DATX8 Master Delay Line Register (DXnMDLR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |IPRD |Initial Period + * | | |Initial period measured by the master delay line calibration for VT drift compensation + * | | |This value is used as the denominator when calculating the ratios of updates during VT compensation. + * |[15:8] |TPRD |Target Period + * | | |Target period measured by the master delay line calibration for VT drift compensation + * | | |This is the current measured value of the period and is continuously updated if the MDL is enabled to do so. + * |[23:16] |MDLD |MDL Delay + * | | |Delay select for the LCDL for the Master Delay Line. + * @var DDRPHY_T::DX6GTR + * Offset: 0x370 DATX8 General Timing Register (DXnGTR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |R0DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[5:3] |R1DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[8:6] |R2DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[11:9] |R3DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[13:12] |R0WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[15:14] |R1WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[17:16] |R2WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[19:18] |R3WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * @var DDRPHY_T::DX6GSR2 + * Offset: 0x374 DATX8 General Status Register 2 (DXnGSR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDERR |Read Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read bit deskew training. + * |[1] |RDWN |Read Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read bit deskew training. + * |[2] |WDERR |Write Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write bit deskew training. + * |[3] |WDWN |Write Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write bit deskew training. + * |[4] |REERR |Read Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read data eye training. + * |[5] |REWN |Read Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read data eye training. + * |[6] |WEERR |Write Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write data eye training. + * |[7] |WEWN |Write Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write data eye training. + * |[11:8] |ESTAT |Error Status + * | | |If an error occurred for this lane as indicated by RDERR, WDERR, REERR or WEERR the error status code can provide additional information regard when the error occurred during the algorithm execution. + * @var DDRPHY_T::DX7GCR + * Offset: 0x380 DATX8 General Configuration Register (DXnGCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DXEN |Data Byte Enable + * | | |Enables, if set, the data byte + * | | |Setting this bit to '0' disables the byte, i.e + * | | |the byte is not used in PHY initialization or training and is ignored during SDRAM read/write operations. + * |[1] |DQSODT |DQS On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQS/DQS# pin of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[9] is '0'. + * |[2] |DQODT |Data On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQ and DM pins of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[10] is '0'. + * |[3] |DXIOM |Data I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the IOM configuration bit of the individual DATX8(see "DATX8 Common Configuration Register (DXCCR)"). + * |[4] |DXPDD |Data Power Down Driver + * | | |Powers down, when set, the output driver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDD configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[5] |DXPDR |Data Power Down Receiver + * | | |Powers down, when set, the input receiver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * |[6] |DQSRPD |DQSR Power Down + * | | |Powers down, if set, the PDQSR cell + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)") + * |[8:7] |DSEN |Write DQS Enable + * | | |Controls whether the write DQS going to the SDRAM is enabled (toggling) or disabled (static value) and whether the DQS is inverted + * | | |DQS# is always the inversion of DQS + * | | |These values are valid only when DQS/DQS# output enable is on, otherwise the DQS/DQS# is tristated + * | | |Valid settings are: + * | | |00 = Reserved + * | | |01 = DQS toggling with normal polarity (This should be the default setting) + * | | |10 = Reserved + * | | |11 = Reserved + * |[9] |DQSRTT |DQS Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQS/DQS# SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[1] (DQSODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[10] |DQRTT |DQ Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQ/DM SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[2] (DQODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[12:11] |RTTOH |RTT Output Hold + * | | |Indicates the number of clock cycles (from 0 to 3) after the read data postamble for which ODT control should remain set to DQSODT for DQS or DQODT for DQ/DM before disabling it (setting it to '0') when using dynamic ODT control + * | | |ODT is disabled almost RTTOH clock cycles after the read postamble. + * |[13] |RTTOAL |RTT On Additive Latency + * | | |Indicates when the ODT control of DQ/DQS SSTL I/Os is set to the value in DQODT/DQSODT during read cycles + * | | |Valid values are: + * | | |0 = ODT control is set to DQSODT/DQODT almost two cycles before read data preamble + * | | |1 = ODT control is set to DQSODT/DQODT almost one cycle before read data preamble + * |[15:14] |DXOEO |Data Byte Output Enable Override + * | | |Specifies whether the output I/O output enable for the byte lane should be set to a fixed value + * | | |Valid values are: + * | | |00 = No override. Output enable is controlled by DFI transactions + * | | |01 = Output enable is asserted (I/O is forced to output mode). + * | | |10 = Output enable is de-asserted (I/O is forced to input mode) + * | | |11 = Reserved + * |[16] |PLLRST |PLL Rest + * | | |Resets the byte PLL by driving the PLL reset pin + * | | |This bit is not self- clearing and a '0' must be written to de-assert the reset + * | | |This bit is ORed with the global PLLRST configuration bit. + * |[17] |PLLPD |PLL Power Down + * | | |Puts the byte PLL in Power-down mode by driving the PLL power down pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the power-down + * | | |This bit is ORed with the global PLLPD configuration bit. + * |[18] |GSHIFT |Gear Shift + * | | |Enables, if set, rapid locking mode on the byte PLL + * | | |This bit is ORed with the global GSHIFT configuration bit. + * |[19] |PLLBYP |PLL Bypass + * | | |Puts the byte PLL in bypass mode by driving the PLL bypass pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the bypass + * | | |This bit is ORed with the global BYP configuration bit. + * |[29:26] |WLRKEN |Write Level Rank Enable + * | | |Specifies the ranks that should be write leveled for this byte + * | | |Write leveling responses from ranks that are not enabled for write leveling for a particular byte are ignored and write leveling is flagged as done for these ranks + * | | |WLRKEN[0] enables rank 0, [1] enables rank 1, [2] enables rank 2, and [3] enables rank 3. + * |[30] |MDLEN |Master Delay Line Enable + * | | |Enables, if set, the DATX8 master delay line calibration to perform subsequent period measurements following the initial period measurements that are performed after reset or when calibration is manually triggered + * | | |These additional measurements are accumulated and filtered as long as this bit remains high + * | | |This bit is ANDed with the common DATX8 MDL enable bit. + * |[31] |CALBYP |Calibration Bypass + * | | |Prevents, if set, period measurement calibration from automatically triggering after PHY initialization. + * @var DDRPHY_T::DX7GSR0 + * Offset: 0x384 DATX8 General Status Registers 0 (DXnGSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WDQCAL |Write DQ Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write DQ LCDL. + * |[1] |RDQSCAL |Read DQS Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS LCDL. + * |[2] |RDQSNCAL |Read DQS# Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS# LCDL. + * |[3] |GDQSCAL |Read DQS gating Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS gating LCDL. + * |[4] |WLCAL |Write Leveling Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write leveling slave delay line. + * |[5] |WLDONE |Write Leveling Done + * | | |Indicates, if set, that the DATX8 has completed write leveling. + * |[6] |WLERR |Write Leveling Error + * | | |Indicates, if set, that there is a write leveling error in the DATX8. + * |[14:7] |WLPRD |Write Leveling Period + * | | |Returns the DDR clock period measured by the write leveling LCDL during calibration + * | | |The measured period is used to generate the control of the write leveling pipeline which is a function of the write-leveling delay and the clock period + * | | |This value is PVT compensated. + * |[15] |DPLOCK |DATX8 PLL Lock + * | | |Indicates, if set, that the DATX8 PLL has locked. This is a direct status of the DATX8 PLL lock pin. + * |[23:16] |GDQSPRD |Read DQS gating Period + * | | |Returns the DDR clock period measured by the read DQS gating LCDL during calibration + * | | |This value is PVT compensated. + * |[27:24] |QSGERR |DQS Gate Training Error + * | | |Indicates, if set, that there is an error in DQS gate training. One bit for each of the up to 4 ranks. + * |[28] |WLDQ |Write Leveling DQ Status + * | | |Captures the write leveling DQ status from the DRAM during software write leveling. + * @var DDRPHY_T::DX7GSR1 + * Offset: 0x388 DATX8 General Status Registers 1 (DXnGSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DLTDONE |Delay Line Test Done + * | | |Indicates, if set, that the PHY control block has finished doing period measurement of the DATX8 delay line digital test output. + * |[24:1] |DLTCODE |Delay Line Test Code + * | | |Returns the code measured by the PHY control block that corresponds to the period of the DATX8 delay line digital test output. + * @var DDRPHY_T::DX7BDLR0 + * Offset: 0x38C DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0WBD |DQ0 Write Bit Delay + * | | |Delay select for the BDL on DQ0 write path. + * |[11:6] |DQ1WBD |DQ1 Write Bit Delay + * | | |Delay select for the BDL on DQ1 write path. + * |[17:12] |DQ2WBD |DQ2 Write Bit Delay + * | | |Delay select for the BDL on DQ2 write path. + * |[23:18] |DQ3WBD |DQ3 Write Bit Delay + * | | |Delay select for the BDL on DQ3 write path + * |[29:24] |DQ4WBD |DQ4 Write Bit Delay + * | | |Delay select for the BDL on DQ4 write path. + * @var DDRPHY_T::DX7BDLR1 + * Offset: 0x390 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5WBD |DQ5 Write Bit Delay + * | | |Delay select for the BDL on DQ5 write path. + * |[11:6] |DQ6WBD |DQ6 Write Bit Delay + * | | |Delay select for the BDL on DQ6 write path. + * |[17:12] |DQ7WBD |DQ7 Write Bit Delay + * | | |Delay select for the BDL on DQ7 write path. + * |[23:18] |DMWBD |DM Write Bit Delay + * | | |Delay select for the BDL on DM write path. + * |[29:24] |DSWBD |DQS Write Bit Delay + * | | |Delay select for the BDL on DQS write path + * @var DDRPHY_T::DX7BDLR2 + * Offset: 0x394 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DSOEBD |DQS Output Enable Bit Delay + * | | |Delay select for the BDL on DQS output enable path + * |[11:6] |DQOEBD |DQ Output Enable Bit Delay + * | | |Delay select for the BDL on DQ/DM output enable path. + * |[17:12] |DSRBD |DQS Read Bit Delay + * | | |Delay select for the BDL on DQS read path + * |[23:18] |DSNRBD |DQSN Read Bit Delay + * | | |Delay select for the BDL on DQSN read path + * @var DDRPHY_T::DX7BDLR3 + * Offset: 0x398 DATX8 Bit Delay Line Register 3 (DXnBDLR3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0RBD |DQ0 Read Bit Delay + * | | |Delay select for the BDL on DQ0 read path. + * |[11:6] |DQ1RBD |DQ1 Read Bit Delay + * | | |Delay select for the BDL on DQ1 read path. + * |[17:12] |DQ2RBD |DQ2 Read Bit Delay + * | | |Delay select for the BDL on DQ2 read path. + * |[23:18] |DQ3RBD |DQ3 Read Bit Delay + * | | |Delay select for the BDL on DQ3 read path + * |[29:24] |DQ4RBD |DQ4 Read Bit Delay + * | | |Delay select for the BDL on DQ4 read path. + * @var DDRPHY_T::DX7BDLR4 + * Offset: 0x39C DATX8 Bit Delay Line Register 4 (DXnBDLR4) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5RBD |DQ5 Read Bit Delay + * | | |Delay select for the BDL on DQ5 read path. + * |[11:6] |DQ6RBD |DQ6 Read Bit Delay + * | | |Delay select for the BDL on DQ6 read path. + * |[17:12] |DQ7RBD |DQ7 Read Bit Delay + * | | |Delay select for the BDL on DQ7 read path. + * |[23:18] |DMRBD |DM Read Bit Delay + * | | |Delay select for the BDL on DM read path. + * @var DDRPHY_T::DX7LCDLR0 + * Offset: 0x3A0 DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0WLD |Rank 0 Write Leveling Delay + * | | |Rank 0 delay select for the write leveling (WL) LCDL + * |[15:8] |R1WLD |Rank 1 Write Leveling Delay + * | | |Rank 1 delay select for the write leveling (WL) LCDL + * |[23:16] |R2WLD |Rank 2 Write Leveling Delay + * | | |Rank 2 delay select for the write leveling (WL) LCDL + * |[31:24] |R3WLD |Rank 3 Write Leveling Delay + * | | |Rank 3 delay select for the write leveling (WL) LCDL + * @var DDRPHY_T::DX7LCDLR1 + * Offset: 0x3A4 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |WDQD |Write Data Delay + * | | |Delay select for the write data (WDQ) LCDL + * |[15:8] |RDQSD |Read DQS Delay + * | | |Delay select for the read DQS (RDQS) LCDL + * |[23:16] |RDQSND |Read DQSN Delay + * | | |Delay select for the read DQSN (RDQS) LCDL + * @var DDRPHY_T::DX7LCDLR2 + * Offset: 0x3A8 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0DQSGD |Rank 0 Read DQS Gating Delay + * | | |Rank 0 delay select for the read DQS gating (DQSG) LCDL + * |[15:8] |R1DQSGD |Rank 1 Read DQS Gating Delay + * | | |Rank 1 delay select for the read DQS gating (DQSG) LCDL + * |[23:16] |R2DQSGD |Rank 2 Read DQS Gating Delay + * | | |Rank 2 delay select for the read DQS gating (DQSG) LCDL + * |[31:24] |R3DQSGD |Rank 3 Read DQS Gating Delay + * | | |Rank 3 delay select for the read DQS gating (DQSG) LCDL + * @var DDRPHY_T::DX7MDLR + * Offset: 0x3AC DATX8 Master Delay Line Register (DXnMDLR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |IPRD |Initial Period + * | | |Initial period measured by the master delay line calibration for VT drift compensation + * | | |This value is used as the denominator when calculating the ratios of updates during VT compensation. + * |[15:8] |TPRD |Target Period + * | | |Target period measured by the master delay line calibration for VT drift compensation + * | | |This is the current measured value of the period and is continuously updated if the MDL is enabled to do so. + * |[23:16] |MDLD |MDL Delay + * | | |Delay select for the LCDL for the Master Delay Line. + * @var DDRPHY_T::DX7GTR + * Offset: 0x3B0 DATX8 General Timing Register (DXnGTR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |R0DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[5:3] |R1DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[8:6] |R2DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[11:9] |R3DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[13:12] |R0WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[15:14] |R1WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[17:16] |R2WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[19:18] |R3WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * @var DDRPHY_T::DX7GSR2 + * Offset: 0x3B4 DATX8 General Status Register 2 (DXnGSR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDERR |Read Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read bit deskew training. + * |[1] |RDWN |Read Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read bit deskew training. + * |[2] |WDERR |Write Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write bit deskew training. + * |[3] |WDWN |Write Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write bit deskew training. + * |[4] |REERR |Read Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read data eye training. + * |[5] |REWN |Read Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read data eye training. + * |[6] |WEERR |Write Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write data eye training. + * |[7] |WEWN |Write Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write data eye training. + * |[11:8] |ESTAT |Error Status + * | | |If an error occurred for this lane as indicated by RDERR, WDERR, REERR or WEERR the error status code can provide additional information regard when the error occurred during the algorithm execution. + * @var DDRPHY_T::DX8GCR + * Offset: 0x3C0 DATX8 General Configuration Register (DXnGCR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DXEN |Data Byte Enable + * | | |Enables, if set, the data byte + * | | |Setting this bit to '0' disables the byte, i.e + * | | |the byte is not used in PHY initialization or training and is ignored during SDRAM read/write operations. + * |[1] |DQSODT |DQS On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQS/DQS# pin of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[9] is '0'. + * |[2] |DQODT |Data On-Die Termination + * | | |Enables, when set, the on-die termination on the I/O for DQ and DM pins of the byte + * | | |This bit is ORed with the common DATX8 ODT configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: This bit is only valid when DXnGCR0[10] is '0'. + * |[3] |DXIOM |Data I/O Mode + * | | |Selects SSTL mode (when set to 0) or CMOS mode (when set to 1) of the I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the IOM configuration bit of the individual DATX8(see "DATX8 Common Configuration Register (DXCCR)"). + * |[4] |DXPDD |Data Power Down Driver + * | | |Powers down, when set, the output driver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDD configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * | | |Note: Asserting PDD puts the IO driver cell into a lower power, lower speed mode of operation + * | | |However, it will still drive if its OE is asserted + * | | |ODT will be disabled (if used) + * | | |Asserting PDD does not prevent the IO from driving. + * |[5] |DXPDR |Data Power Down Receiver + * | | |Powers down, when set, the input receiver on I/O for DQ, DM, and DQS/DQS# pins of the byte + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)"). + * |[6] |DQSRPD |DQSR Power Down + * | | |Powers down, if set, the PDQSR cell + * | | |This bit is ORed with the common PDR configuration bit (see "DATX8 Common Configuration Register (DXCCR)") + * |[8:7] |DSEN |Write DQS Enable + * | | |Controls whether the write DQS going to the SDRAM is enabled (toggling) or disabled (static value) and whether the DQS is inverted + * | | |DQS# is always the inversion of DQS + * | | |These values are valid only when DQS/DQS# output enable is on, otherwise the DQS/DQS# is tristated + * | | |Valid settings are: + * | | |00 = Reserved + * | | |01 = DQS toggling with normal polarity (This should be the default setting) + * | | |10 = Reserved + * | | |11 = Reserved + * |[9] |DQSRTT |DQS Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQS/DQS# SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[1] (DQSODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[10] |DQRTT |DQ Dynamic RTT Control + * | | |If set, the on die termination (ODT) control of the DQ/DM SSTL I/O is dynamically generated to enable the ODT during read operation and disabled otherwise + * | | |By setting this bit to '0' the dynamic ODT feature is disabled + * | | |To control ODT statically this bit must be set to '0' and DXnGCR0[2] (DQODT) is used to enable ODT (when set to '1') or disable ODT(when set to '0'). + * |[12:11] |RTTOH |RTT Output Hold + * | | |Indicates the number of clock cycles (from 0 to 3) after the read data postamble for which ODT control should remain set to DQSODT for DQS or DQODT for DQ/DM before disabling it (setting it to '0') when using dynamic ODT control + * | | |ODT is disabled almost RTTOH clock cycles after the read postamble. + * |[13] |RTTOAL |RTT On Additive Latency + * | | |Indicates when the ODT control of DQ/DQS SSTL I/Os is set to the value in DQODT/DQSODT during read cycles + * | | |Valid values are: + * | | |0 = ODT control is set to DQSODT/DQODT almost two cycles before read data preamble + * | | |1 = ODT control is set to DQSODT/DQODT almost one cycle before read data preamble + * |[15:14] |DXOEO |Data Byte Output Enable Override + * | | |Specifies whether the output I/O output enable for the byte lane should be set to a fixed value + * | | |Valid values are: + * | | |00 = No override. Output enable is controlled by DFI transactions + * | | |01 = Output enable is asserted (I/O is forced to output mode). + * | | |10 = Output enable is de-asserted (I/O is forced to input mode) + * | | |11 = Reserved + * |[16] |PLLRST |PLL Rest + * | | |Resets the byte PLL by driving the PLL reset pin + * | | |This bit is not self- clearing and a '0' must be written to de-assert the reset + * | | |This bit is ORed with the global PLLRST configuration bit. + * |[17] |PLLPD |PLL Power Down + * | | |Puts the byte PLL in Power-down mode by driving the PLL power down pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the power-down + * | | |This bit is ORed with the global PLLPD configuration bit. + * |[18] |GSHIFT |Gear Shift + * | | |Enables, if set, rapid locking mode on the byte PLL + * | | |This bit is ORed with the global GSHIFT configuration bit. + * |[19] |PLLBYP |PLL Bypass + * | | |Puts the byte PLL in bypass mode by driving the PLL bypass pin + * | | |This bit is not self-clearing and a '0' must be written to de-assert the bypass + * | | |This bit is ORed with the global BYP configuration bit. + * |[29:26] |WLRKEN |Write Level Rank Enable + * | | |Specifies the ranks that should be write leveled for this byte + * | | |Write leveling responses from ranks that are not enabled for write leveling for a particular byte are ignored and write leveling is flagged as done for these ranks + * | | |WLRKEN[0] enables rank 0, [1] enables rank 1, [2] enables rank 2, and [3] enables rank 3. + * |[30] |MDLEN |Master Delay Line Enable + * | | |Enables, if set, the DATX8 master delay line calibration to perform subsequent period measurements following the initial period measurements that are performed after reset or when calibration is manually triggered + * | | |These additional measurements are accumulated and filtered as long as this bit remains high + * | | |This bit is ANDed with the common DATX8 MDL enable bit. + * |[31] |CALBYP |Calibration Bypass + * | | |Prevents, if set, period measurement calibration from automatically triggering after PHY initialization. + * @var DDRPHY_T::DX8GSR0 + * Offset: 0x3C4 DATX8 General Status Registers 0 (DXnGSR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WDQCAL |Write DQ Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write DQ LCDL. + * |[1] |RDQSCAL |Read DQS Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS LCDL. + * |[2] |RDQSNCAL |Read DQS# Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS# LCDL. + * |[3] |GDQSCAL |Read DQS gating Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the read DQS gating LCDL. + * |[4] |WLCAL |Write Leveling Calibration + * | | |Indicates, if set, that the DATX8 has finished doing period measurement calibration for the write leveling slave delay line. + * |[5] |WLDONE |Write Leveling Done + * | | |Indicates, if set, that the DATX8 has completed write leveling. + * |[6] |WLERR |Write Leveling Error + * | | |Indicates, if set, that there is a write leveling error in the DATX8. + * |[14:7] |WLPRD |Write Leveling Period + * | | |Returns the DDR clock period measured by the write leveling LCDL during calibration + * | | |The measured period is used to generate the control of the write leveling pipeline which is a function of the write-leveling delay and the clock period + * | | |This value is PVT compensated. + * |[15] |DPLOCK |DATX8 PLL Lock + * | | |Indicates, if set, that the DATX8 PLL has locked. This is a direct status of the DATX8 PLL lock pin. + * |[23:16] |GDQSPRD |Read DQS gating Period + * | | |Returns the DDR clock period measured by the read DQS gating LCDL during calibration + * | | |This value is PVT compensated. + * |[27:24] |QSGERR |DQS Gate Training Error + * | | |Indicates, if set, that there is an error in DQS gate training. One bit for each of the up to 4 ranks. + * |[28] |WLDQ |Write Leveling DQ Status + * | | |Captures the write leveling DQ status from the DRAM during software write leveling. + * @var DDRPHY_T::DX8GSR1 + * Offset: 0x3C8 DATX8 General Status Registers 1 (DXnGSR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DLTDONE |Delay Line Test Done + * | | |Indicates, if set, that the PHY control block has finished doing period measurement of the DATX8 delay line digital test output. + * |[24:1] |DLTCODE |Delay Line Test Code + * | | |Returns the code measured by the PHY control block that corresponds to the period of the DATX8 delay line digital test output. + * @var DDRPHY_T::DX8BDLR0 + * Offset: 0x3CC DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0WBD |DQ0 Write Bit Delay + * | | |Delay select for the BDL on DQ0 write path. + * |[11:6] |DQ1WBD |DQ1 Write Bit Delay + * | | |Delay select for the BDL on DQ1 write path. + * |[17:12] |DQ2WBD |DQ2 Write Bit Delay + * | | |Delay select for the BDL on DQ2 write path. + * |[23:18] |DQ3WBD |DQ3 Write Bit Delay + * | | |Delay select for the BDL on DQ3 write path + * |[29:24] |DQ4WBD |DQ4 Write Bit Delay + * | | |Delay select for the BDL on DQ4 write path. + * @var DDRPHY_T::DX8BDLR1 + * Offset: 0x3D0 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5WBD |DQ5 Write Bit Delay + * | | |Delay select for the BDL on DQ5 write path. + * |[11:6] |DQ6WBD |DQ6 Write Bit Delay + * | | |Delay select for the BDL on DQ6 write path. + * |[17:12] |DQ7WBD |DQ7 Write Bit Delay + * | | |Delay select for the BDL on DQ7 write path. + * |[23:18] |DMWBD |DM Write Bit Delay + * | | |Delay select for the BDL on DM write path. + * |[29:24] |DSWBD |DQS Write Bit Delay + * | | |Delay select for the BDL on DQS write path + * @var DDRPHY_T::DX8BDLR2 + * Offset: 0x3D4 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DSOEBD |DQS Output Enable Bit Delay + * | | |Delay select for the BDL on DQS output enable path + * |[11:6] |DQOEBD |DQ Output Enable Bit Delay + * | | |Delay select for the BDL on DQ/DM output enable path. + * |[17:12] |DSRBD |DQS Read Bit Delay + * | | |Delay select for the BDL on DQS read path + * |[23:18] |DSNRBD |DQSN Read Bit Delay + * | | |Delay select for the BDL on DQSN read path + * @var DDRPHY_T::DX8BDLR3 + * Offset: 0x3D8 DATX8 Bit Delay Line Register 3 (DXnBDLR3) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ0RBD |DQ0 Read Bit Delay + * | | |Delay select for the BDL on DQ0 read path. + * |[11:6] |DQ1RBD |DQ1 Read Bit Delay + * | | |Delay select for the BDL on DQ1 read path. + * |[17:12] |DQ2RBD |DQ2 Read Bit Delay + * | | |Delay select for the BDL on DQ2 read path. + * |[23:18] |DQ3RBD |DQ3 Read Bit Delay + * | | |Delay select for the BDL on DQ3 read path + * |[29:24] |DQ4RBD |DQ4 Read Bit Delay + * | | |Delay select for the BDL on DQ4 read path. + * @var DDRPHY_T::DX8BDLR4 + * Offset: 0x3DC DATX8 Bit Delay Line Register 4 (DXnBDLR4) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |DQ5RBD |DQ5 Read Bit Delay + * | | |Delay select for the BDL on DQ5 read path. + * |[11:6] |DQ6RBD |DQ6 Read Bit Delay + * | | |Delay select for the BDL on DQ6 read path. + * |[17:12] |DQ7RBD |DQ7 Read Bit Delay + * | | |Delay select for the BDL on DQ7 read path. + * |[23:18] |DMRBD |DM Read Bit Delay + * | | |Delay select for the BDL on DM read path. + * @var DDRPHY_T::DX8LCDLR0 + * Offset: 0x3E0 DATX8 Bit Delay Line Register 0 (DXnBDLR0) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0WLD |Rank 0 Write Leveling Delay + * | | |Rank 0 delay select for the write leveling (WL) LCDL + * |[15:8] |R1WLD |Rank 1 Write Leveling Delay + * | | |Rank 1 delay select for the write leveling (WL) LCDL + * |[23:16] |R2WLD |Rank 2 Write Leveling Delay + * | | |Rank 2 delay select for the write leveling (WL) LCDL + * |[31:24] |R3WLD |Rank 3 Write Leveling Delay + * | | |Rank 3 delay select for the write leveling (WL) LCDL + * @var DDRPHY_T::DX8LCDLR1 + * Offset: 0x3E4 DATX8 Bit Delay Line Register 1 (DXnBDLR1) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |WDQD |Write Data Delay + * | | |Delay select for the write data (WDQ) LCDL + * |[15:8] |RDQSD |Read DQS Delay + * | | |Delay select for the read DQS (RDQS) LCDL + * |[23:16] |RDQSND |Read DQSN Delay + * | | |Delay select for the read DQSN (RDQS) LCDL + * @var DDRPHY_T::DX8LCDLR2 + * Offset: 0x3E8 DATX8 Bit Delay Line Register 2 (DXnBDLR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |R0DQSGD |Rank 0 Read DQS Gating Delay + * | | |Rank 0 delay select for the read DQS gating (DQSG) LCDL + * |[15:8] |R1DQSGD |Rank 1 Read DQS Gating Delay + * | | |Rank 1 delay select for the read DQS gating (DQSG) LCDL + * |[23:16] |R2DQSGD |Rank 2 Read DQS Gating Delay + * | | |Rank 2 delay select for the read DQS gating (DQSG) LCDL + * |[31:24] |R3DQSGD |Rank 3 Read DQS Gating Delay + * | | |Rank 3 delay select for the read DQS gating (DQSG) LCDL + * @var DDRPHY_T::DX8MDLR + * Offset: 0x3EC DATX8 Master Delay Line Register (DXnMDLR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |IPRD |Initial Period + * | | |Initial period measured by the master delay line calibration for VT drift compensation + * | | |This value is used as the denominator when calculating the ratios of updates during VT compensation. + * |[15:8] |TPRD |Target Period + * | | |Target period measured by the master delay line calibration for VT drift compensation + * | | |This is the current measured value of the period and is continuously updated if the MDL is enabled to do so. + * |[23:16] |MDLD |MDL Delay + * | | |Delay select for the LCDL for the Master Delay Line. + * @var DDRPHY_T::DX8GTR + * Offset: 0x3F0 DATX8 General Timing Register (DXnGTR) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |R0DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[5:3] |R1DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[8:6] |R2DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[11:9] |R3DGSL |Rank n DQS Gating System Latency + * | | |This is used to increase the number of clock cycles needed to expect valid DDR read data by up to seven extra clock cycles + * | | |This is used to compensate for board delays and other system delays + * | | |Power-up default is 000 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic DQS data training but these values can be overwritten by a direct write to this register + * | | |Every three bits of this register control the latency of each of the (up to) four ranks + * | | |R0DGSL controls the latency of rank 0, R1DGSL controls rank 1, and so on + * | | |Valid values are 0 to 7. + * |[13:12] |R0WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[15:14] |R1WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[17:16] |R2WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * |[19:18] |R3WLSL |Rank n Write Leveling System Latency + * | | |This is used to adjust the write latency after write leveling + * | | |Power-up default is 01 (i.e + * | | |no extra clock cycles required) + * | | |The SL fields are initially set by the PUB during automatic write leveling but these values can be overwritten by a direct write to this register + * | | |Every two bits of this register control the latency of each of the (up to) four ranks + * | | |R0WLSL controls the latency of rank 0, R1WLSL controls rank 1, and so on + * | | |Valid values: + * | | |00 = Write latency = WL - 1 + * | | |01 = Write latency = WL + * | | |10 = Write latency = WL + 1 + * | | |11 = Reserved + * @var DDRPHY_T::DX8GSR2 + * Offset: 0x3F4 DATX8 General Status Register 2 (DXnGSR2) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDERR |Read Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read bit deskew training. + * |[1] |RDWN |Read Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read bit deskew training. + * |[2] |WDERR |Write Bit Deskew Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write bit deskew training. + * |[3] |WDWN |Write Bit Deskew Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write bit deskew training. + * |[4] |REERR |Read Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the read data eye training. + * |[5] |REWN |Read Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the read data eye training. + * |[6] |WEERR |Write Data Eye Training Error + * | | |Indicates, if set, that the DATX8 has encountered an error during execution of the write data eye training. + * |[7] |WEWN |Write Data Eye Training Warning + * | | |Indicates, if set, that the DATX8 has encountered a warning during execution of the write data eye training. + * |[11:8] |ESTAT |Error Status + * | | |If an error occurred for this lane as indicated by RDERR, WDERR, REERR or WEERR the error status code can provide additional information regard when the error occurred during the algorithm execution. + */ + __I uint32_t RIDR; /*!< [0x0000] Revision Identification Register */ + __IO uint32_t PIR; /*!< [0x0004] PHY Initialization Register (PIR) */ + __IO uint32_t PGCR0; /*!< [0x0008] PHY General Configuration Registers 0 (PGCR0) */ + __IO uint32_t PGCR1; /*!< [0x000c] PHY General Configuration Registers 1 (PGCR1) */ + __I uint32_t PGSR0; /*!< [0x0010] PHY General Status Registers 0 (PGSR0) */ + __I uint32_t PGSR1; /*!< [0x0014] PHY General Status Registers 1 (PGSR1) */ + __IO uint32_t PLLCR; /*!< [0x0018] PLL Control Register (PLLCR) */ + __IO uint32_t PTR0; /*!< [0x001c] PHY Timing Registers 0 (PTR0) */ + __IO uint32_t PTR1; /*!< [0x0020] PHY Timing Registers 1 (PTR1) */ + __IO uint32_t PTR2; /*!< [0x0024] PHY Timing Registers 2 (PTR2) */ + __IO uint32_t PTR3; /*!< [0x0028] PHY Timing Registers 3 (PTR3) */ + __IO uint32_t PTR4; /*!< [0x002c] PHY Timing Registers 4 (PTR4) */ + __IO uint32_t ACMDLR; /*!< [0x0030] AC Master Delay Line Register (ACMDLR) */ + __IO uint32_t ACBDLR; /*!< [0x0034] AC Bit Delay Line Register (ACBDLR) */ + __IO uint32_t ACIOCR; /*!< [0x0038] AC I/O Configuration Register (ACIOCR) */ + __IO uint32_t DXCCR; /*!< [0x003c] DATX8 Common Configuration Register (DXCCR) */ + __IO uint32_t DSGCR; /*!< [0x0040] DDR System General Configuration Register (DSGCR) */ + __IO uint32_t DCR; /*!< [0x0044] DRAM Configuration Register (DCR) */ + __IO uint32_t DTPR0; /*!< [0x0048] DRAM Timing Parameters Register 0 (DTPR0) 105 */ + __IO uint32_t DTPR1; /*!< [0x004c] DRAM Timing Parameters Register 1 (DTPR1) */ + __IO uint32_t DTPR2; /*!< [0x0050] DRAM Timing Parameters Register 2 (DTPR2) */ + __IO uint32_t MR0; /*!< [0x0054] Mode Register 0 (MR0) */ + __IO uint32_t MR1; /*!< [0x0058] Mode Register 1 (MR1) */ + __IO uint32_t MR2; /*!< [0x005c] Mode Register 2/Extended Mode Register 2 (MR2/EMR2) */ + __IO uint32_t MR3; /*!< [0x0060] Mode Register 3 (MR3) */ + __IO uint32_t ODTCR; /*!< [0x0064] ODT Configuration Register (ODTCR) */ + __IO uint32_t DTCR; /*!< [0x0068] Data Training Configuration Register (DTCR) */ + __IO uint32_t DTAR0; /*!< [0x006c] Data Training Address Register 0 (DTAR0) */ + __IO uint32_t DTAR1; /*!< [0x0070] Data Training Address Register 1 (DTAR1) */ + __IO uint32_t DTAR2; /*!< [0x0074] Data Training Address Register 2 (DTAR2) */ + __IO uint32_t DTAR3; /*!< [0x0078] Data Training Address Register 3 (DTAR3) */ + __IO uint32_t DTDR0; /*!< [0x007c] Data Training Data Register 0 (DTDR0) */ + __IO uint32_t DTDR1; /*!< [0x0080] Data Training Data Register 1 (DTDR1) */ + __I uint32_t DTEDR0; /*!< [0x0084] Data Training Eye Data Register 0 (DTEDR0) */ + __I uint32_t DTEDR1; /*!< [0x0088] Data Training Eye Data Register 1 (DTEDR1) */ + __IO uint32_t PGCR2; /*!< [0x008c] PHY General Configuration Register 2 (PGCR2) */ + __I uint32_t RESERVE0[8]; + __I uint32_t RDIMMGCR0; /*!< [0x00b0] RDIMM General Configuration Register 0 (RDIMMGCR0) 123 */ + __I uint32_t RDIMMGCR1; /*!< [0x00b4] RDIMM General Configuration Register 1 (RDIMMGCR1) */ + __I uint32_t RDIMMCR0; /*!< [0x00b8] RDIMM Control Register 0 (RDIMMCR0) */ + __I uint32_t RDIMMCR1; /*!< [0x00bc] RDIMM Control Register 1 (RDIMMCR1) */ + __IO uint32_t DCUAR; /*!< [0x00c0] DCU Address Register (DCUAR) */ + __IO uint32_t DCUDR; /*!< [0x00c4] DCU Data Register (DCUDR) */ + __IO uint32_t DCURR; /*!< [0x00c8] DCU Run Register (DCURR) */ + __IO uint32_t DCULR; /*!< [0x00cc] DCU Loop Register (DCULR) */ + __IO uint32_t DCUGCR; /*!< [0x00d0] DCU General Configuration Register (DCUGCR) */ + __IO uint32_t DCUTPR; /*!< [0x00d4] DCU Timing Parameter Register (DCUTPR) */ + __I uint32_t DCUSR0; /*!< [0x00d8] DCU Status Register 0 (DCUSR0) */ + __I uint32_t DCUSR1; /*!< [0x00dc] DCU Status Register 1 (DCUSR1) */ + __I uint32_t RESERVE1[8]; + __IO uint32_t BISTRR; /*!< [0x0100] BIST Run Register (BISTRR) */ + __IO uint32_t BISTWCR; /*!< [0x0104] BIST Word Count Register (BISTWCR) */ + __IO uint32_t BISTMSKR0; /*!< [0x0108] BIST Mask Register 0 (BISTMSKR0) */ + __IO uint32_t BISTMSKR1; /*!< [0x010c] BIST Mask Register 1 (BISTMSKR1) */ + __IO uint32_t BISTMSKR2; /*!< [0x0110] BIST Mask Register 2 (BISTMSKR2) */ + __IO uint32_t BISTLSR; /*!< [0x0114] BIST LFSR Seed Register (BISTLSR) */ + __IO uint32_t BISTAR0; /*!< [0x0118] BIST Address Register 0 (BISTAR0) */ + __IO uint32_t BISTAR1; /*!< [0x011c] BIST Address Register 1 (BISTAR1) */ + __IO uint32_t BISTAR2; /*!< [0x0120] BIST Address Register 2 (BISTAR2) */ + __IO uint32_t BISTUDPR; /*!< [0x0124] BIST User Data Pattern Register (BISTUDPR) */ + __I uint32_t BISTGSR; /*!< [0x0128] BIST General Status Register (BISTGSR) */ + __I uint32_t BISTWER; /*!< [0x012c] BIST Word Error Register (BISTWER) */ + __I uint32_t BISTBER0; /*!< [0x0130] BIST Bit Error Register 0 (BISTBER0) */ + __I uint32_t BISTBER1; /*!< [0x0134] BIST Bit Error Register 1 (BISTBER1) */ + __I uint32_t BISTBER2; /*!< [0x0138] BIST Bit Error Register 2 (BISTBER2) */ + __I uint32_t BISTBER3; /*!< [0x013c] BIST Bit Error Register 3 (BISTBER3) */ + __I uint32_t BISTWCSR; /*!< [0x0140] BIST Word Count Status Register (BISTWCSR) */ + __I uint32_t BISTFWR0; /*!< [0x0144] BIST Fail Word Register 0 (BISTFWR0) */ + __I uint32_t BISTFWR1; /*!< [0x0148] BIST Fail Word Register 1 (BISTFWR1) */ + __I uint32_t BISTFWR2; /*!< [0x014c] BIST Fail Word Register 2 (BISTFWR2) */ + __I uint32_t RESERVE2[9]; + __IO uint32_t AACR; /*!< [0x0174] Anti-Aging Control Register (AACR) */ + __IO uint32_t GPR0; /*!< [0x0178] General Purpose Register 0 (GPR0) */ + __IO uint32_t GPR1; /*!< [0x017c] General Purpose Register 1 (GPR1) */ + __IO uint32_t ZQ0CR0; /*!< [0x0180] Impedance Control Register 0 (ZQnCR0) */ + __IO uint32_t ZQ0CR1; /*!< [0x0184] Impedance Control Register 1 (ZQnCR1) */ + __I uint32_t ZQ0SR0; /*!< [0x0188] Impedance Status Register 0 (ZQnSR0) */ + __I uint32_t ZQ0SR1; /*!< [0x018c] Impedance Status Register 1 (ZQnSR1) */ + __IO uint32_t ZQ1CR0; /*!< [0x0190] Impedance Control Register 0 (ZQnCR0) */ + __IO uint32_t ZQ1CR1; /*!< [0x0194] Impedance Control Register 1 (ZQnCR1) */ + __I uint32_t ZQ1SR0; /*!< [0x0198] Impedance Status Register 0 (ZQnSR0) */ + __I uint32_t ZQ1SR1; /*!< [0x019c] Impedance Status Register 1 (ZQnSR1) */ + __IO uint32_t ZQ2CR0; /*!< [0x01a0] Impedance Control Register 0 (ZQnCR0) */ + __IO uint32_t ZQ2CR1; /*!< [0x01a4] Impedance Control Register 1 (ZQnCR1) */ + __I uint32_t ZQ2SR0; /*!< [0x01a8] Impedance Status Register 0 (ZQnSR0) */ + __I uint32_t ZQ2SR1; /*!< [0x01ac] Impedance Status Register 1 (ZQnSR1) */ + __IO uint32_t ZQ3CR0; /*!< [0x01b0] Impedance Control Register 0 (ZQnCR0) */ + __IO uint32_t ZQ3CR1; /*!< [0x01b4] Impedance Control Register 1 (ZQnCR1) */ + __I uint32_t ZQ3SR0; /*!< [0x01b8] Impedance Status Register 0 (ZQnSR0) */ + __I uint32_t ZQ3SR1; /*!< [0x01bc] Impedance Status Register 1 (ZQnSR1) */ + __IO uint32_t DX0GCR; /*!< [0x01c0] DATX8 General Configuration Register (DXnGCR) */ + __I uint32_t DX0GSR0; /*!< [0x01c4] DATX8 General Status Registers 0 (DXnGSR0) */ + __I uint32_t DX0GSR1; /*!< [0x01c8] DATX8 General Status Registers 1 (DXnGSR1) */ + __IO uint32_t DX0BDLR0; /*!< [0x01cc] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX0BDLR1; /*!< [0x01d0] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX0BDLR2; /*!< [0x01d4] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX0BDLR3; /*!< [0x01d8] DATX8 Bit Delay Line Register 3 (DXnBDLR3) */ + __IO uint32_t DX0BDLR4; /*!< [0x01dc] DATX8 Bit Delay Line Register 4 (DXnBDLR4) */ + __IO uint32_t DX0LCDLR0; /*!< [0x01e0] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX0LCDLR1; /*!< [0x01e4] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX0LCDLR2; /*!< [0x01e8] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX0MDLR; /*!< [0x01ec] DATX8 Master Delay Line Register (DXnMDLR) */ + __IO uint32_t DX0GTR; /*!< [0x01f0] DATX8 General Timing Register (DXnGTR) */ + __IO uint32_t DX0GSR2; /*!< [0x01f4] DATX8 General Status Register 2 (DXnGSR2) */ + __I uint32_t RESERVE3[2]; + __IO uint32_t DX1GCR; /*!< [0x0200] DATX8 General Configuration Register (DXnGCR) */ + __I uint32_t DX1GSR0; /*!< [0x0204] DATX8 General Status Registers 0 (DXnGSR0) */ + __I uint32_t DX1GSR1; /*!< [0x0208] DATX8 General Status Registers 1 (DXnGSR1) */ + __IO uint32_t DX1BDLR0; /*!< [0x020c] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX1BDLR1; /*!< [0x0210] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX1BDLR2; /*!< [0x0214] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX1BDLR3; /*!< [0x0218] DATX8 Bit Delay Line Register 3 (DXnBDLR3) */ + __IO uint32_t DX1BDLR4; /*!< [0x021c] DATX8 Bit Delay Line Register 4 (DXnBDLR4) */ + __IO uint32_t DX1LCDLR0; /*!< [0x0220] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX1LCDLR1; /*!< [0x0224] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX1LCDLR2; /*!< [0x0228] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX1MDLR; /*!< [0x022c] DATX8 Master Delay Line Register (DXnMDLR) */ + __IO uint32_t DX1GTR; /*!< [0x0230] DATX8 General Timing Register (DXnGTR) */ + __IO uint32_t DX1GSR2; /*!< [0x0234] DATX8 General Status Register 2 (DXnGSR2) */ + __I uint32_t RESERVE4[2]; + __IO uint32_t DX2GCR; /*!< [0x0240] DATX8 General Configuration Register (DXnGCR) */ + __I uint32_t DX2GSR0; /*!< [0x0244] DATX8 General Status Registers 0 (DXnGSR0) */ + __I uint32_t DX2GSR1; /*!< [0x0248] DATX8 General Status Registers 1 (DXnGSR1) */ + __IO uint32_t DX2BDLR0; /*!< [0x024c] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX2BDLR1; /*!< [0x0250] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX2BDLR2; /*!< [0x0254] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX2BDLR3; /*!< [0x0258] DATX8 Bit Delay Line Register 3 (DXnBDLR3) */ + __IO uint32_t DX2BDLR4; /*!< [0x025c] DATX8 Bit Delay Line Register 4 (DXnBDLR4) */ + __IO uint32_t DX2LCDLR0; /*!< [0x0260] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX2LCDLR1; /*!< [0x0264] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX2LCDLR2; /*!< [0x0268] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX2MDLR; /*!< [0x026c] DATX8 Master Delay Line Register (DXnMDLR) */ + __IO uint32_t DX2GTR; /*!< [0x0270] DATX8 General Timing Register (DXnGTR) */ + __IO uint32_t DX2GSR2; /*!< [0x0274] DATX8 General Status Register 2 (DXnGSR2) */ + __I uint32_t RESERVE5[2]; + __IO uint32_t DX3GCR; /*!< [0x0280] DATX8 General Configuration Register (DXnGCR) */ + __I uint32_t DX3GSR0; /*!< [0x0284] DATX8 General Status Registers 0 (DXnGSR0) */ + __I uint32_t DX3GSR1; /*!< [0x0288] DATX8 General Status Registers 1 (DXnGSR1) */ + __IO uint32_t DX3BDLR0; /*!< [0x028c] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX3BDLR1; /*!< [0x0290] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX3BDLR2; /*!< [0x0294] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX3BDLR3; /*!< [0x0298] DATX8 Bit Delay Line Register 3 (DXnBDLR3) */ + __IO uint32_t DX3BDLR4; /*!< [0x029c] DATX8 Bit Delay Line Register 4 (DXnBDLR4) */ + __IO uint32_t DX3LCDLR0; /*!< [0x02a0] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX3LCDLR1; /*!< [0x02a4] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX3LCDLR2; /*!< [0x02a8] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX3MDLR; /*!< [0x02ac] DATX8 Master Delay Line Register (DXnMDLR) */ + __IO uint32_t DX3GTR; /*!< [0x02b0] DATX8 General Timing Register (DXnGTR) */ + __IO uint32_t DX3GSR2; /*!< [0x02b4] DATX8 General Status Register 2 (DXnGSR2) */ + __I uint32_t RESERVE6[2]; + __IO uint32_t DX4GCR; /*!< [0x02c0] DATX8 General Configuration Register (DXnGCR) */ + __I uint32_t DX4GSR0; /*!< [0x02c4] DATX8 General Status Registers 0 (DXnGSR0) */ + __I uint32_t DX4GSR1; /*!< [0x02c8] DATX8 General Status Registers 1 (DXnGSR1) */ + __IO uint32_t DX4BDLR0; /*!< [0x02cc] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX4BDLR1; /*!< [0x02d0] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX4BDLR2; /*!< [0x02d4] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX4BDLR3; /*!< [0x02d8] DATX8 Bit Delay Line Register 3 (DXnBDLR3) */ + __IO uint32_t DX4BDLR4; /*!< [0x02dc] DATX8 Bit Delay Line Register 4 (DXnBDLR4) */ + __IO uint32_t DX4LCDLR0; /*!< [0x02e0] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX4LCDLR1; /*!< [0x02e4] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX4LCDLR2; /*!< [0x02e8] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX4MDLR; /*!< [0x02ec] DATX8 Master Delay Line Register (DXnMDLR) */ + __IO uint32_t DX4GTR; /*!< [0x02f0] DATX8 General Timing Register (DXnGTR) */ + __IO uint32_t DX4GSR2; /*!< [0x02f4] DATX8 General Status Register 2 (DXnGSR2) */ + __I uint32_t RESERVE7[2]; + __IO uint32_t DX5GCR; /*!< [0x0300] DATX8 General Configuration Register (DXnGCR) */ + __I uint32_t DX5GSR0; /*!< [0x0304] DATX8 General Status Registers 0 (DXnGSR0) */ + __I uint32_t DX5GSR1; /*!< [0x0308] DATX8 General Status Registers 1 (DXnGSR1) */ + __IO uint32_t DX5BDLR0; /*!< [0x030c] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX5BDLR1; /*!< [0x0310] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX5BDLR2; /*!< [0x0314] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX5BDLR3; /*!< [0x0318] DATX8 Bit Delay Line Register 3 (DXnBDLR3) */ + __IO uint32_t DX5BDLR4; /*!< [0x031c] DATX8 Bit Delay Line Register 4 (DXnBDLR4) */ + __IO uint32_t DX5LCDLR0; /*!< [0x0320] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX5LCDLR1; /*!< [0x0324] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX5LCDLR2; /*!< [0x0328] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX5MDLR; /*!< [0x032c] DATX8 Master Delay Line Register (DXnMDLR) */ + __IO uint32_t DX5GTR; /*!< [0x0330] DATX8 General Timing Register (DXnGTR) */ + __IO uint32_t DX5GSR2; /*!< [0x0334] DATX8 General Status Register 2 (DXnGSR2) */ + __I uint32_t RESERVE8[2]; + __IO uint32_t DX6GCR; /*!< [0x0340] DATX8 General Configuration Register (DXnGCR) */ + __I uint32_t DX6GSR0; /*!< [0x0344] DATX8 General Status Registers 0 (DXnGSR0) */ + __I uint32_t DX6GSR1; /*!< [0x0348] DATX8 General Status Registers 1 (DXnGSR1) */ + __IO uint32_t DX6BDLR0; /*!< [0x034c] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX6BDLR1; /*!< [0x0350] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX6BDLR2; /*!< [0x0354] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX6BDLR3; /*!< [0x0358] DATX8 Bit Delay Line Register 3 (DXnBDLR3) */ + __IO uint32_t DX6BDLR4; /*!< [0x035c] DATX8 Bit Delay Line Register 4 (DXnBDLR4) */ + __IO uint32_t DX6LCDLR0; /*!< [0x0360] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX6LCDLR1; /*!< [0x0364] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX6LCDLR2; /*!< [0x0368] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX6MDLR; /*!< [0x036c] DATX8 Master Delay Line Register (DXnMDLR) */ + __IO uint32_t DX6GTR; /*!< [0x0370] DATX8 General Timing Register (DXnGTR) */ + __IO uint32_t DX6GSR2; /*!< [0x0374] DATX8 General Status Register 2 (DXnGSR2) */ + __I uint32_t RESERVE9[2]; + __IO uint32_t DX7GCR; /*!< [0x0380] DATX8 General Configuration Register (DXnGCR) */ + __I uint32_t DX7GSR0; /*!< [0x0384] DATX8 General Status Registers 0 (DXnGSR0) */ + __I uint32_t DX7GSR1; /*!< [0x0388] DATX8 General Status Registers 1 (DXnGSR1) */ + __IO uint32_t DX7BDLR0; /*!< [0x038c] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX7BDLR1; /*!< [0x0390] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX7BDLR2; /*!< [0x0394] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX7BDLR3; /*!< [0x0398] DATX8 Bit Delay Line Register 3 (DXnBDLR3) */ + __IO uint32_t DX7BDLR4; /*!< [0x039c] DATX8 Bit Delay Line Register 4 (DXnBDLR4) */ + __IO uint32_t DX7LCDLR0; /*!< [0x03a0] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX7LCDLR1; /*!< [0x03a4] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX7LCDLR2; /*!< [0x03a8] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX7MDLR; /*!< [0x03ac] DATX8 Master Delay Line Register (DXnMDLR) */ + __IO uint32_t DX7GTR; /*!< [0x03b0] DATX8 General Timing Register (DXnGTR) */ + __IO uint32_t DX7GSR2; /*!< [0x03b4] DATX8 General Status Register 2 (DXnGSR2) */ + __I uint32_t RESERVE10[2]; + __IO uint32_t DX8GCR; /*!< [0x03c0] DATX8 General Configuration Register (DXnGCR) */ + __I uint32_t DX8GSR0; /*!< [0x03c4] DATX8 General Status Registers 0 (DXnGSR0) */ + __I uint32_t DX8GSR1; /*!< [0x03c8] DATX8 General Status Registers 1 (DXnGSR1) */ + __IO uint32_t DX8BDLR0; /*!< [0x03cc] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX8BDLR1; /*!< [0x03d0] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX8BDLR2; /*!< [0x03d4] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX8BDLR3; /*!< [0x03d8] DATX8 Bit Delay Line Register 3 (DXnBDLR3) */ + __IO uint32_t DX8BDLR4; /*!< [0x03dc] DATX8 Bit Delay Line Register 4 (DXnBDLR4) */ + __IO uint32_t DX8LCDLR0; /*!< [0x03e0] DATX8 Bit Delay Line Register 0 (DXnBDLR0) */ + __IO uint32_t DX8LCDLR1; /*!< [0x03e4] DATX8 Bit Delay Line Register 1 (DXnBDLR1) */ + __IO uint32_t DX8LCDLR2; /*!< [0x03e8] DATX8 Bit Delay Line Register 2 (DXnBDLR2) */ + __IO uint32_t DX8MDLR; /*!< [0x03ec] DATX8 Master Delay Line Register (DXnMDLR) */ + __IO uint32_t DX8GTR; /*!< [0x03f0] DATX8 General Timing Register (DXnGTR) */ + __IO uint32_t DX8GSR2; /*!< [0x03f4] DATX8 General Status Register 2 (DXnGSR2) */ + +} DDRPHY_T; + +/** + @addtogroup DDRPHY_CONST DDRPHY Bit Field Definition + Constant Definitions for DDRPHY Controller +@{ */ + +#define DDRPHY_RIDR_PUBMNR_Pos (0) /*!< DDRPHY_T::RIDR: PUBMNR Position */ +#define DDRPHY_RIDR_PUBMNR_Msk (0xful << DDRPHY_RIDR_PUBMNR_Pos) /*!< DDRPHY_T::RIDR: PUBMNR Mask */ + +#define DDRPHY_RIDR_PUBMDR_Pos (4) /*!< DDRPHY_T::RIDR: PUBMDR Position */ +#define DDRPHY_RIDR_PUBMDR_Msk (0xful << DDRPHY_RIDR_PUBMDR_Pos) /*!< DDRPHY_T::RIDR: PUBMDR Mask */ + +#define DDRPHY_RIDR_PUBMJR_Pos (8) /*!< DDRPHY_T::RIDR: PUBMJR Position */ +#define DDRPHY_RIDR_PUBMJR_Msk (0xful << DDRPHY_RIDR_PUBMJR_Pos) /*!< DDRPHY_T::RIDR: PUBMJR Mask */ + +#define DDRPHY_RIDR_PHYMNR_Pos (12) /*!< DDRPHY_T::RIDR: PHYMNR Position */ +#define DDRPHY_RIDR_PHYMNR_Msk (0xful << DDRPHY_RIDR_PHYMNR_Pos) /*!< DDRPHY_T::RIDR: PHYMNR Mask */ + +#define DDRPHY_RIDR_PHYMDR_Pos (16) /*!< DDRPHY_T::RIDR: PHYMDR Position */ +#define DDRPHY_RIDR_PHYMDR_Msk (0xful << DDRPHY_RIDR_PHYMDR_Pos) /*!< DDRPHY_T::RIDR: PHYMDR Mask */ + +#define DDRPHY_RIDR_PHYMJR_Pos (20) /*!< DDRPHY_T::RIDR: PHYMJR Position */ +#define DDRPHY_RIDR_PHYMJR_Msk (0xful << DDRPHY_RIDR_PHYMJR_Pos) /*!< DDRPHY_T::RIDR: PHYMJR Mask */ + +#define DDRPHY_RIDR_UDRID_Pos (24) /*!< DDRPHY_T::RIDR: UDRID Position */ +#define DDRPHY_RIDR_UDRID_Msk (0xfful << DDRPHY_RIDR_UDRID_Pos) /*!< DDRPHY_T::RIDR: UDRID Mask */ + +#define DDRPHY_PIR_INIT_Pos (0) /*!< DDRPHY_T::PIR: INIT Position */ +#define DDRPHY_PIR_INIT_Msk (0x1ul << DDRPHY_PIR_INIT_Pos) /*!< DDRPHY_T::PIR: INIT Mask */ + +#define DDRPHY_PIR_ZCAL_Pos (1) /*!< DDRPHY_T::PIR: ZCAL Position */ +#define DDRPHY_PIR_ZCAL_Msk (0x1ul << DDRPHY_PIR_ZCAL_Pos) /*!< DDRPHY_T::PIR: ZCAL Mask */ + +#define DDRPHY_PIR_PLLINIT_Pos (4) /*!< DDRPHY_T::PIR: PLLINIT Position */ +#define DDRPHY_PIR_PLLINIT_Msk (0x1ul << DDRPHY_PIR_PLLINIT_Pos) /*!< DDRPHY_T::PIR: PLLINIT Mask */ + +#define DDRPHY_PIR_DCAL_Pos (5) /*!< DDRPHY_T::PIR: DCAL Position */ +#define DDRPHY_PIR_DCAL_Msk (0x1ul << DDRPHY_PIR_DCAL_Pos) /*!< DDRPHY_T::PIR: DCAL Mask */ + +#define DDRPHY_PIR_PHYRST_Pos (6) /*!< DDRPHY_T::PIR: PHYRST Position */ +#define DDRPHY_PIR_PHYRST_Msk (0x1ul << DDRPHY_PIR_PHYRST_Pos) /*!< DDRPHY_T::PIR: PHYRST Mask */ + +#define DDRPHY_PIR_DRAMRST_Pos (7) /*!< DDRPHY_T::PIR: DRAMRST Position */ +#define DDRPHY_PIR_DRAMRST_Msk (0x1ul << DDRPHY_PIR_DRAMRST_Pos) /*!< DDRPHY_T::PIR: DRAMRST Mask */ + +#define DDRPHY_PIR_DRAMINIT_Pos (8) /*!< DDRPHY_T::PIR: DRAMINIT Position */ +#define DDRPHY_PIR_DRAMINIT_Msk (0x1ul << DDRPHY_PIR_DRAMINIT_Pos) /*!< DDRPHY_T::PIR: DRAMINIT Mask */ + +#define DDRPHY_PIR_WL_Pos (9) /*!< DDRPHY_T::PIR: WL Position */ +#define DDRPHY_PIR_WL_Msk (0x1ul << DDRPHY_PIR_WL_Pos) /*!< DDRPHY_T::PIR: WL Mask */ + +#define DDRPHY_PIR_QSGATE_Pos (10) /*!< DDRPHY_T::PIR: QSGATE Position */ +#define DDRPHY_PIR_QSGATE_Msk (0x1ul << DDRPHY_PIR_QSGATE_Pos) /*!< DDRPHY_T::PIR: QSGATE Mask */ + +#define DDRPHY_PIR_WLADJ_Pos (11) /*!< DDRPHY_T::PIR: WLADJ Position */ +#define DDRPHY_PIR_WLADJ_Msk (0x1ul << DDRPHY_PIR_WLADJ_Pos) /*!< DDRPHY_T::PIR: WLADJ Mask */ + +#define DDRPHY_PIR_RDDSKW_Pos (12) /*!< DDRPHY_T::PIR: RDDSKW Position */ +#define DDRPHY_PIR_RDDSKW_Msk (0x1ul << DDRPHY_PIR_RDDSKW_Pos) /*!< DDRPHY_T::PIR: RDDSKW Mask */ + +#define DDRPHY_PIR_WRDSKW_Pos (13) /*!< DDRPHY_T::PIR: WRDSKW Position */ +#define DDRPHY_PIR_WRDSKW_Msk (0x1ul << DDRPHY_PIR_WRDSKW_Pos) /*!< DDRPHY_T::PIR: WRDSKW Mask */ + +#define DDRPHY_PIR_RDEYE_Pos (14) /*!< DDRPHY_T::PIR: RDEYE Position */ +#define DDRPHY_PIR_RDEYE_Msk (0x1ul << DDRPHY_PIR_RDEYE_Pos) /*!< DDRPHY_T::PIR: RDEYE Mask */ + +#define DDRPHY_PIR_WREYE_Pos (15) /*!< DDRPHY_T::PIR: WREYE Position */ +#define DDRPHY_PIR_WREYE_Msk (0x1ul << DDRPHY_PIR_WREYE_Pos) /*!< DDRPHY_T::PIR: WREYE Mask */ + +#define DDRPHY_PIR_ICPC_Pos (16) /*!< DDRPHY_T::PIR: ICPC Position */ +#define DDRPHY_PIR_ICPC_Msk (0x1ul << DDRPHY_PIR_ICPC_Pos) /*!< DDRPHY_T::PIR: ICPC Mask */ + +#define DDRPHY_PIR_PLLBYP_Pos (17) /*!< DDRPHY_T::PIR: PLLBYP Position */ +#define DDRPHY_PIR_PLLBYP_Msk (0x1ul << DDRPHY_PIR_PLLBYP_Pos) /*!< DDRPHY_T::PIR: PLLBYP Mask */ + +#define DDRPHY_PIR_CTLDINIT_Pos (18) /*!< DDRPHY_T::PIR: CTLDINIT Position */ +#define DDRPHY_PIR_CTLDINIT_Msk (0x1ul << DDRPHY_PIR_CTLDINIT_Pos) /*!< DDRPHY_T::PIR: CTLDINIT Mask */ + +#define DDRPHY_PIR_RDIMMINIT_Pos (19) /*!< DDRPHY_T::PIR: RDIMMINIT Position */ +#define DDRPHY_PIR_RDIMMINIT_Msk (0x1ul << DDRPHY_PIR_RDIMMINIT_Pos) /*!< DDRPHY_T::PIR: RDIMMINIT Mask */ + +#define DDRPHY_PIR_CLRSR_Pos (27) /*!< DDRPHY_T::PIR: CLRSR Position */ +#define DDRPHY_PIR_CLRSR_Msk (0x1ul << DDRPHY_PIR_CLRSR_Pos) /*!< DDRPHY_T::PIR: CLRSR Mask */ + +#define DDRPHY_PIR_LOCKBYP_Pos (28) /*!< DDRPHY_T::PIR: LOCKBYP Position */ +#define DDRPHY_PIR_LOCKBYP_Msk (0x1ul << DDRPHY_PIR_LOCKBYP_Pos) /*!< DDRPHY_T::PIR: LOCKBYP Mask */ + +#define DDRPHY_PIR_DCALBYP_Pos (29) /*!< DDRPHY_T::PIR: DCALBYP Position */ +#define DDRPHY_PIR_DCALBYP_Msk (0x1ul << DDRPHY_PIR_DCALBYP_Pos) /*!< DDRPHY_T::PIR: DCALBYP Mask */ + +#define DDRPHY_PIR_ZCALBYP_Pos (30) /*!< DDRPHY_T::PIR: ZCALBYP Position */ +#define DDRPHY_PIR_ZCALBYP_Msk (0x1ul << DDRPHY_PIR_ZCALBYP_Pos) /*!< DDRPHY_T::PIR: ZCALBYP Mask */ + +#define DDRPHY_PIR_INITBYP_Pos (31) /*!< DDRPHY_T::PIR: INITBYP Position */ +#define DDRPHY_PIR_INITBYP_Msk (0x1ul << DDRPHY_PIR_INITBYP_Pos) /*!< DDRPHY_T::PIR: INITBYP Mask */ + +#define DDRPHY_PGCR0_WLLVT_Pos (0) /*!< DDRPHY_T::PGCR0: WLLVT Position */ +#define DDRPHY_PGCR0_WLLVT_Msk (0x1ul << DDRPHY_PGCR0_WLLVT_Pos) /*!< DDRPHY_T::PGCR0: WLLVT Mask */ + +#define DDRPHY_PGCR0_WDLVT_Pos (1) /*!< DDRPHY_T::PGCR0: WDLVT Position */ +#define DDRPHY_PGCR0_WDLVT_Msk (0x1ul << DDRPHY_PGCR0_WDLVT_Pos) /*!< DDRPHY_T::PGCR0: WDLVT Mask */ + +#define DDRPHY_PGCR0_RDLVT_Pos (2) /*!< DDRPHY_T::PGCR0: RDLVT Position */ +#define DDRPHY_PGCR0_RDLVT_Msk (0x1ul << DDRPHY_PGCR0_RDLVT_Pos) /*!< DDRPHY_T::PGCR0: RDLVT Mask */ + +#define DDRPHY_PGCR0_RGLVT_Pos (3) /*!< DDRPHY_T::PGCR0: RGLVT Position */ +#define DDRPHY_PGCR0_RGLVT_Msk (0x1ul << DDRPHY_PGCR0_RGLVT_Pos) /*!< DDRPHY_T::PGCR0: RGLVT Mask */ + +#define DDRPHY_PGCR0_WDBVT_Pos (4) /*!< DDRPHY_T::PGCR0: WDBVT Position */ +#define DDRPHY_PGCR0_WDBVT_Msk (0x1ul << DDRPHY_PGCR0_WDBVT_Pos) /*!< DDRPHY_T::PGCR0: WDBVT Mask */ + +#define DDRPHY_PGCR0_RDBVT_Pos (5) /*!< DDRPHY_T::PGCR0: RDBVT Position */ +#define DDRPHY_PGCR0_RDBVT_Msk (0x1ul << DDRPHY_PGCR0_RDBVT_Pos) /*!< DDRPHY_T::PGCR0: RDBVT Mask */ + +#define DDRPHY_PGCR0_DLTMODE_Pos (6) /*!< DDRPHY_T::PGCR0: DLTMODE Position */ +#define DDRPHY_PGCR0_DLTMODE_Msk (0x1ul << DDRPHY_PGCR0_DLTMODE_Pos) /*!< DDRPHY_T::PGCR0: DLTMODE Mask */ + +#define DDRPHY_PGCR0_DLTST_Pos (7) /*!< DDRPHY_T::PGCR0: DLTST Position */ +#define DDRPHY_PGCR0_DLTST_Msk (0x1ul << DDRPHY_PGCR0_DLTST_Pos) /*!< DDRPHY_T::PGCR0: DLTST Mask */ + +#define DDRPHY_PGCR0_OSCEN_Pos (8) /*!< DDRPHY_T::PGCR0: OSCEN Position */ +#define DDRPHY_PGCR0_OSCEN_Msk (0x1ul << DDRPHY_PGCR0_OSCEN_Pos) /*!< DDRPHY_T::PGCR0: OSCEN Mask */ + +#define DDRPHY_PGCR0_OSCDIV_Pos (9) /*!< DDRPHY_T::PGCR0: OSCDIV Position */ +#define DDRPHY_PGCR0_OSCDIV_Msk (0x7ul << DDRPHY_PGCR0_OSCDIV_Pos) /*!< DDRPHY_T::PGCR0: OSCDIV Mask */ + +#define DDRPHY_PGCR0_OSCWDL_Pos (12) /*!< DDRPHY_T::PGCR0: OSCWDL Position */ +#define DDRPHY_PGCR0_OSCWDL_Msk (0x3ul << DDRPHY_PGCR0_OSCWDL_Pos) /*!< DDRPHY_T::PGCR0: OSCWDL Mask */ + +#define DDRPHY_PGCR0_DTOSEL_Pos (14) /*!< DDRPHY_T::PGCR0: DTOSEL Position */ +#define DDRPHY_PGCR0_DTOSEL_Msk (0x1ful << DDRPHY_PGCR0_DTOSEL_Pos) /*!< DDRPHY_T::PGCR0: DTOSEL Mask */ + +#define DDRPHY_PGCR0_PUBMODE_Pos (25) /*!< DDRPHY_T::PGCR0: PUBMODE Position */ +#define DDRPHY_PGCR0_PUBMODE_Msk (0x1ul << DDRPHY_PGCR0_PUBMODE_Pos) /*!< DDRPHY_T::PGCR0: PUBMODE Mask */ + +#define DDRPHY_PGCR0_CKEN_Pos (26) /*!< DDRPHY_T::PGCR0: CKEN Position */ +#define DDRPHY_PGCR0_CKEN_Msk (0x3ful << DDRPHY_PGCR0_CKEN_Pos) /*!< DDRPHY_T::PGCR0: CKEN Mask */ + +#define DDRPHY_PGCR1_PDDISDX_Pos (0) /*!< DDRPHY_T::PGCR1: PDDISDX Position */ +#define DDRPHY_PGCR1_PDDISDX_Msk (0x1ul << DDRPHY_PGCR1_PDDISDX_Pos) /*!< DDRPHY_T::PGCR1: PDDISDX Mask */ + +#define DDRPHY_PGCR1_WLMODE_Pos (1) /*!< DDRPHY_T::PGCR1: WLMODE Position */ +#define DDRPHY_PGCR1_WLMODE_Msk (0x1ul << DDRPHY_PGCR1_WLMODE_Pos) /*!< DDRPHY_T::PGCR1: WLMODE Mask */ + +#define DDRPHY_PGCR1_WLSTEP_Pos (2) /*!< DDRPHY_T::PGCR1: WLSTEP Position */ +#define DDRPHY_PGCR1_WLSTEP_Msk (0x1ul << DDRPHY_PGCR1_WLSTEP_Pos) /*!< DDRPHY_T::PGCR1: WLSTEP Mask */ + +#define DDRPHY_PGCR1_WSLOPT_Pos (4) /*!< DDRPHY_T::PGCR1: WSLOPT Position */ +#define DDRPHY_PGCR1_WSLOPT_Msk (0x1ul << DDRPHY_PGCR1_WSLOPT_Pos) /*!< DDRPHY_T::PGCR1: WSLOPT Mask */ + +#define DDRPHY_PGCR1_ACHRST_Pos (5) /*!< DDRPHY_T::PGCR1: ACHRST Position */ +#define DDRPHY_PGCR1_ACHRST_Msk (0x1ul << DDRPHY_PGCR1_ACHRST_Pos) /*!< DDRPHY_T::PGCR1: ACHRST Mask */ + +#define DDRPHY_PGCR1_WLSELT_Pos (6) /*!< DDRPHY_T::PGCR1: WLSELT Position */ +#define DDRPHY_PGCR1_WLSELT_Msk (0x1ul << DDRPHY_PGCR1_WLSELT_Pos) /*!< DDRPHY_T::PGCR1: WLSELT Mask */ + +#define DDRPHY_PGCR1_IODDRM_Pos (7) /*!< DDRPHY_T::PGCR1: IODDRM Position */ +#define DDRPHY_PGCR1_IODDRM_Msk (0x3ul << DDRPHY_PGCR1_IODDRM_Pos) /*!< DDRPHY_T::PGCR1: IODDRM Mask */ + +#define DDRPHY_PGCR1_MDLEN_Pos (9) /*!< DDRPHY_T::PGCR1: MDLEN Position */ +#define DDRPHY_PGCR1_MDLEN_Msk (0x1ul << DDRPHY_PGCR1_MDLEN_Pos) /*!< DDRPHY_T::PGCR1: MDLEN Mask */ + +#define DDRPHY_PGCR1_LPFEN_Pos (10) /*!< DDRPHY_T::PGCR1: LPFEN Position */ +#define DDRPHY_PGCR1_LPFEN_Msk (0x1ul << DDRPHY_PGCR1_LPFEN_Pos) /*!< DDRPHY_T::PGCR1: LPFEN Mask */ + +#define DDRPHY_PGCR1_LPFDEPTH_Pos (11) /*!< DDRPHY_T::PGCR1: LPFDEPTH Position */ +#define DDRPHY_PGCR1_LPFDEPTH_Msk (0x3ul << DDRPHY_PGCR1_LPFDEPTH_Pos) /*!< DDRPHY_T::PGCR1: LPFDEPTH Mask */ + +#define DDRPHY_PGCR1_FDEPTH_Pos (13) /*!< DDRPHY_T::PGCR1: FDEPTH Position */ +#define DDRPHY_PGCR1_FDEPTH_Msk (0x3ul << DDRPHY_PGCR1_FDEPTH_Pos) /*!< DDRPHY_T::PGCR1: FDEPTH Mask */ + +#define DDRPHY_PGCR1_DLDLMT_Pos (15) /*!< DDRPHY_T::PGCR1: DLDLMT Position */ +#define DDRPHY_PGCR1_DLDLMT_Msk (0xfful << DDRPHY_PGCR1_DLDLMT_Pos) /*!< DDRPHY_T::PGCR1: DLDLMT Mask */ + +#define DDRPHY_PGCR1_ZCKSEL_Pos (23) /*!< DDRPHY_T::PGCR1: ZCKSEL Position */ +#define DDRPHY_PGCR1_ZCKSEL_Msk (0x3ul << DDRPHY_PGCR1_ZCKSEL_Pos) /*!< DDRPHY_T::PGCR1: ZCKSEL Mask */ + +#define DDRPHY_PGCR1_DXHRST_Pos (25) /*!< DDRPHY_T::PGCR1: DXHRST Position */ +#define DDRPHY_PGCR1_DXHRST_Msk (0x1ul << DDRPHY_PGCR1_DXHRST_Pos) /*!< DDRPHY_T::PGCR1: DXHRST Mask */ + +#define DDRPHY_PGCR1_INHVT_Pos (26) /*!< DDRPHY_T::PGCR1: INHVT Position */ +#define DDRPHY_PGCR1_INHVT_Msk (0x1ul << DDRPHY_PGCR1_INHVT_Pos) /*!< DDRPHY_T::PGCR1: INHVT Mask */ + +#define DDRPHY_PGCR1_IOLB_Pos (27) /*!< DDRPHY_T::PGCR1: IOLB Position */ +#define DDRPHY_PGCR1_IOLB_Msk (0x1ul << DDRPHY_PGCR1_IOLB_Pos) /*!< DDRPHY_T::PGCR1: IOLB Mask */ + +#define DDRPHY_PGCR1_LBDQSS_Pos (28) /*!< DDRPHY_T::PGCR1: LBDQSS Position */ +#define DDRPHY_PGCR1_LBDQSS_Msk (0x1ul << DDRPHY_PGCR1_LBDQSS_Pos) /*!< DDRPHY_T::PGCR1: LBDQSS Mask */ + +#define DDRPHY_PGCR1_LBGDQS_Pos (29) /*!< DDRPHY_T::PGCR1: LBGDQS Position */ +#define DDRPHY_PGCR1_LBGDQS_Msk (0x3ul << DDRPHY_PGCR1_LBGDQS_Pos) /*!< DDRPHY_T::PGCR1: LBGDQS Mask */ + +#define DDRPHY_PGCR1_LBMODE_Pos (31) /*!< DDRPHY_T::PGCR1: LBMODE Position */ +#define DDRPHY_PGCR1_LBMODE_Msk (0x1ul << DDRPHY_PGCR1_LBMODE_Pos) /*!< DDRPHY_T::PGCR1: LBMODE Mask */ + +#define DDRPHY_PGSR0_IDONE_Pos (0) /*!< DDRPHY_T::PGSR0: IDONE Position */ +#define DDRPHY_PGSR0_IDONE_Msk (0x1ul << DDRPHY_PGSR0_IDONE_Pos) /*!< DDRPHY_T::PGSR0: IDONE Mask */ + +#define DDRPHY_PGSR0_PLDONE_Pos (1) /*!< DDRPHY_T::PGSR0: PLDONE Position */ +#define DDRPHY_PGSR0_PLDONE_Msk (0x1ul << DDRPHY_PGSR0_PLDONE_Pos) /*!< DDRPHY_T::PGSR0: PLDONE Mask */ + +#define DDRPHY_PGSR0_DCDONE_Pos (2) /*!< DDRPHY_T::PGSR0: DCDONE Position */ +#define DDRPHY_PGSR0_DCDONE_Msk (0x1ul << DDRPHY_PGSR0_DCDONE_Pos) /*!< DDRPHY_T::PGSR0: DCDONE Mask */ + +#define DDRPHY_PGSR0_ZCDONE_Pos (3) /*!< DDRPHY_T::PGSR0: ZCDONE Position */ +#define DDRPHY_PGSR0_ZCDONE_Msk (0x1ul << DDRPHY_PGSR0_ZCDONE_Pos) /*!< DDRPHY_T::PGSR0: ZCDONE Mask */ + +#define DDRPHY_PGSR0_DIDONE_Pos (4) /*!< DDRPHY_T::PGSR0: DIDONE Position */ +#define DDRPHY_PGSR0_DIDONE_Msk (0x1ul << DDRPHY_PGSR0_DIDONE_Pos) /*!< DDRPHY_T::PGSR0: DIDONE Mask */ + +#define DDRPHY_PGSR0_WLDONE_Pos (5) /*!< DDRPHY_T::PGSR0: WLDONE Position */ +#define DDRPHY_PGSR0_WLDONE_Msk (0x1ul << DDRPHY_PGSR0_WLDONE_Pos) /*!< DDRPHY_T::PGSR0: WLDONE Mask */ + +#define DDRPHY_PGSR0_QSGDONE_Pos (6) /*!< DDRPHY_T::PGSR0: QSGDONE Position */ +#define DDRPHY_PGSR0_QSGDONE_Msk (0x1ul << DDRPHY_PGSR0_QSGDONE_Pos) /*!< DDRPHY_T::PGSR0: QSGDONE Mask */ + +#define DDRPHY_PGSR0_WLADONE_Pos (7) /*!< DDRPHY_T::PGSR0: WLADONE Position */ +#define DDRPHY_PGSR0_WLADONE_Msk (0x1ul << DDRPHY_PGSR0_WLADONE_Pos) /*!< DDRPHY_T::PGSR0: WLADONE Mask */ + +#define DDRPHY_PGSR0_RDDONE_Pos (8) /*!< DDRPHY_T::PGSR0: RDDONE Position */ +#define DDRPHY_PGSR0_RDDONE_Msk (0x1ul << DDRPHY_PGSR0_RDDONE_Pos) /*!< DDRPHY_T::PGSR0: RDDONE Mask */ + +#define DDRPHY_PGSR0_WDDONE_Pos (9) /*!< DDRPHY_T::PGSR0: WDDONE Position */ +#define DDRPHY_PGSR0_WDDONE_Msk (0x1ul << DDRPHY_PGSR0_WDDONE_Pos) /*!< DDRPHY_T::PGSR0: WDDONE Mask */ + +#define DDRPHY_PGSR0_REDONE_Pos (10) /*!< DDRPHY_T::PGSR0: REDONE Position */ +#define DDRPHY_PGSR0_REDONE_Msk (0x1ul << DDRPHY_PGSR0_REDONE_Pos) /*!< DDRPHY_T::PGSR0: REDONE Mask */ + +#define DDRPHY_PGSR0_WEDONE_Pos (11) /*!< DDRPHY_T::PGSR0: WEDONE Position */ +#define DDRPHY_PGSR0_WEDONE_Msk (0x1ul << DDRPHY_PGSR0_WEDONE_Pos) /*!< DDRPHY_T::PGSR0: WEDONE Mask */ + +#define DDRPHY_PGSR0_ZCERR_Pos (20) /*!< DDRPHY_T::PGSR0: ZCERR Position */ +#define DDRPHY_PGSR0_ZCERR_Msk (0x1ul << DDRPHY_PGSR0_ZCERR_Pos) /*!< DDRPHY_T::PGSR0: ZCERR Mask */ + +#define DDRPHY_PGSR0_WLERR_Pos (21) /*!< DDRPHY_T::PGSR0: WLERR Position */ +#define DDRPHY_PGSR0_WLERR_Msk (0x1ul << DDRPHY_PGSR0_WLERR_Pos) /*!< DDRPHY_T::PGSR0: WLERR Mask */ + +#define DDRPHY_PGSR0_QSGERR_Pos (22) /*!< DDRPHY_T::PGSR0: QSGERR Position */ +#define DDRPHY_PGSR0_QSGERR_Msk (0x1ul << DDRPHY_PGSR0_QSGERR_Pos) /*!< DDRPHY_T::PGSR0: QSGERR Mask */ + +#define DDRPHY_PGSR0_WLAERR_Pos (23) /*!< DDRPHY_T::PGSR0: WLAERR Position */ +#define DDRPHY_PGSR0_WLAERR_Msk (0x1ul << DDRPHY_PGSR0_WLAERR_Pos) /*!< DDRPHY_T::PGSR0: WLAERR Mask */ + +#define DDRPHY_PGSR0_RDERR_Pos (24) /*!< DDRPHY_T::PGSR0: RDERR Position */ +#define DDRPHY_PGSR0_RDERR_Msk (0x1ul << DDRPHY_PGSR0_RDERR_Pos) /*!< DDRPHY_T::PGSR0: RDERR Mask */ + +#define DDRPHY_PGSR0_WDERR_Pos (25) /*!< DDRPHY_T::PGSR0: WDERR Position */ +#define DDRPHY_PGSR0_WDERR_Msk (0x1ul << DDRPHY_PGSR0_WDERR_Pos) /*!< DDRPHY_T::PGSR0: WDERR Mask */ + +#define DDRPHY_PGSR0_REERR_Pos (26) /*!< DDRPHY_T::PGSR0: REERR Position */ +#define DDRPHY_PGSR0_REERR_Msk (0x1ul << DDRPHY_PGSR0_REERR_Pos) /*!< DDRPHY_T::PGSR0: REERR Mask */ + +#define DDRPHY_PGSR0_WEERR_Pos (27) /*!< DDRPHY_T::PGSR0: WEERR Position */ +#define DDRPHY_PGSR0_WEERR_Msk (0x1ul << DDRPHY_PGSR0_WEERR_Pos) /*!< DDRPHY_T::PGSR0: WEERR Mask */ + +#define DDRPHY_PGSR0_PLDONE_CHN_Pos (28) /*!< DDRPHY_T::PGSR0: PLDONE_CHN Position */ +#define DDRPHY_PGSR0_PLDONE_CHN_Msk (0x3ul << DDRPHY_PGSR0_PLDONE_CHN_Pos) /*!< DDRPHY_T::PGSR0: PLDONE_CHN Mask */ + +#define DDRPHY_PGSR0_APLOCK_Pos (31) /*!< DDRPHY_T::PGSR0: APLOCK Position */ +#define DDRPHY_PGSR0_APLOCK_Msk (0x1ul << DDRPHY_PGSR0_APLOCK_Pos) /*!< DDRPHY_T::PGSR0: APLOCK Mask */ + +#define DDRPHY_PGSR1_DLTDONE_Pos (0) /*!< DDRPHY_T::PGSR1: DLTDONE Position */ +#define DDRPHY_PGSR1_DLTDONE_Msk (0x1ul << DDRPHY_PGSR1_DLTDONE_Pos) /*!< DDRPHY_T::PGSR1: DLTDONE Mask */ + +#define DDRPHY_PGSR1_DLTCODE_Pos (1) /*!< DDRPHY_T::PGSR1: DLTCODE Position */ +#define DDRPHY_PGSR1_DLTCODE_Msk (0xfffffful << DDRPHY_PGSR1_DLTCODE_Pos) /*!< DDRPHY_T::PGSR1: DLTCODE Mask */ + +#define DDRPHY_PGSR1_VTSTOP_Pos (30) /*!< DDRPHY_T::PGSR1: VTSTOP Position */ +#define DDRPHY_PGSR1_VTSTOP_Msk (0x1ul << DDRPHY_PGSR1_VTSTOP_Pos) /*!< DDRPHY_T::PGSR1: VTSTOP Mask */ + +#define DDRPHY_PGSR1_PARERR_Pos (31) /*!< DDRPHY_T::PGSR1: PARERR Position */ +#define DDRPHY_PGSR1_PARERR_Msk (0x1ul << DDRPHY_PGSR1_PARERR_Pos) /*!< DDRPHY_T::PGSR1: PARERR Mask */ + +#define DDRPHY_PLLCR_DTC_Pos (0) /*!< DDRPHY_T::PLLCR: DTC Position */ +#define DDRPHY_PLLCR_DTC_Msk (0x3ul << DDRPHY_PLLCR_DTC_Pos) /*!< DDRPHY_T::PLLCR: DTC Mask */ + +#define DDRPHY_PLLCR_ATC_Pos (2) /*!< DDRPHY_T::PLLCR: ATC Position */ +#define DDRPHY_PLLCR_ATC_Msk (0xful << DDRPHY_PLLCR_ATC_Pos) /*!< DDRPHY_T::PLLCR: ATC Mask */ + +#define DDRPHY_PLLCR_ATOEN_Pos (6) /*!< DDRPHY_T::PLLCR: ATOEN Position */ +#define DDRPHY_PLLCR_ATOEN_Msk (0xful << DDRPHY_PLLCR_ATOEN_Pos) /*!< DDRPHY_T::PLLCR: ATOEN Mask */ + +#define DDRPHY_PLLCR_GSHIFT_Pos (10) /*!< DDRPHY_T::PLLCR: GSHIFT Position */ +#define DDRPHY_PLLCR_GSHIFT_Msk (0x1ul << DDRPHY_PLLCR_GSHIFT_Pos) /*!< DDRPHY_T::PLLCR: GSHIFT Mask */ + +#define DDRPHY_PLLCR_CPIC_Pos (11) /*!< DDRPHY_T::PLLCR: CPIC Position */ +#define DDRPHY_PLLCR_CPIC_Msk (0x3ul << DDRPHY_PLLCR_CPIC_Pos) /*!< DDRPHY_T::PLLCR: CPIC Mask */ + +#define DDRPHY_PLLCR_CPPC_Pos (13) /*!< DDRPHY_T::PLLCR: CPPC Position */ +#define DDRPHY_PLLCR_CPPC_Msk (0xful << DDRPHY_PLLCR_CPPC_Pos) /*!< DDRPHY_T::PLLCR: CPPC Mask */ + +#define DDRPHY_PLLCR_QPMODE_Pos (17) /*!< DDRPHY_T::PLLCR: QPMODE Position */ +#define DDRPHY_PLLCR_QPMODE_Msk (0x1ul << DDRPHY_PLLCR_QPMODE_Pos) /*!< DDRPHY_T::PLLCR: QPMODE Mask */ + +#define DDRPHY_PLLCR_FRQSEL_Pos (18) /*!< DDRPHY_T::PLLCR: FRQSEL Position */ +#define DDRPHY_PLLCR_FRQSEL_Msk (0x3ul << DDRPHY_PLLCR_FRQSEL_Pos) /*!< DDRPHY_T::PLLCR: FRQSEL Mask */ + +#define DDRPHY_PLLCR_PLLPD_Pos (29) /*!< DDRPHY_T::PLLCR: PLLPD Position */ +#define DDRPHY_PLLCR_PLLPD_Msk (0x1ul << DDRPHY_PLLCR_PLLPD_Pos) /*!< DDRPHY_T::PLLCR: PLLPD Mask */ + +#define DDRPHY_PLLCR_PLLRST_Pos (30) /*!< DDRPHY_T::PLLCR: PLLRST Position */ +#define DDRPHY_PLLCR_PLLRST_Msk (0x1ul << DDRPHY_PLLCR_PLLRST_Pos) /*!< DDRPHY_T::PLLCR: PLLRST Mask */ + +#define DDRPHY_PLLCR_BYP_Pos (31) /*!< DDRPHY_T::PLLCR: BYP Position */ +#define DDRPHY_PLLCR_BYP_Msk (0x1ul << DDRPHY_PLLCR_BYP_Pos) /*!< DDRPHY_T::PLLCR: BYP Mask */ + +#define DDRPHY_PTR0_tPHYRST_Pos (0) /*!< DDRPHY_T::PTR0: tPHYRST Position */ +#define DDRPHY_PTR0_tPHYRST_Msk (0x3ful << DDRPHY_PTR0_tPHYRST_Pos) /*!< DDRPHY_T::PTR0: tPHYRST Mask */ + +#define DDRPHY_PTR0_tPLLGS_Pos (6) /*!< DDRPHY_T::PTR0: tPLLGS Position */ +#define DDRPHY_PTR0_tPLLGS_Msk (0x7ffful << DDRPHY_PTR0_tPLLGS_Pos) /*!< DDRPHY_T::PTR0: tPLLGS Mask */ + +#define DDRPHY_PTR0_tPLLPD_Pos (21) /*!< DDRPHY_T::PTR0: tPLLPD Position */ +#define DDRPHY_PTR0_tPLLPD_Msk (0x7fful << DDRPHY_PTR0_tPLLPD_Pos) /*!< DDRPHY_T::PTR0: tPLLPD Mask */ + +#define DDRPHY_PTR1_tPLLRST_Pos (0) /*!< DDRPHY_T::PTR1: tPLLRST Position */ +#define DDRPHY_PTR1_tPLLRST_Msk (0x1ffful << DDRPHY_PTR1_tPLLRST_Pos) /*!< DDRPHY_T::PTR1: tPLLRST Mask */ + +#define DDRPHY_PTR1_tPLLLOCK_Pos (16) /*!< DDRPHY_T::PTR1: tPLLLOCK Position */ +#define DDRPHY_PTR1_tPLLLOCK_Msk (0xfffful << DDRPHY_PTR1_tPLLLOCK_Pos) /*!< DDRPHY_T::PTR1: tPLLLOCK Mask */ + +#define DDRPHY_PTR2_tCALON_Pos (0) /*!< DDRPHY_T::PTR2: tCALON Position */ +#define DDRPHY_PTR2_tCALON_Msk (0x1ful << DDRPHY_PTR2_tCALON_Pos) /*!< DDRPHY_T::PTR2: tCALON Mask */ + +#define DDRPHY_PTR2_tCALS_Pos (5) /*!< DDRPHY_T::PTR2: tCALS Position */ +#define DDRPHY_PTR2_tCALS_Msk (0x1ful << DDRPHY_PTR2_tCALS_Pos) /*!< DDRPHY_T::PTR2: tCALS Mask */ + +#define DDRPHY_PTR2_tCALH_Pos (10) /*!< DDRPHY_T::PTR2: tCALH Position */ +#define DDRPHY_PTR2_tCALH_Msk (0x1ful << DDRPHY_PTR2_tCALH_Pos) /*!< DDRPHY_T::PTR2: tCALH Mask */ + +#define DDRPHY_PTR2_tWLDLYS_Pos (15) /*!< DDRPHY_T::PTR2: tWLDLYS Position */ +#define DDRPHY_PTR2_tWLDLYS_Msk (0x1ful << DDRPHY_PTR2_tWLDLYS_Pos) /*!< DDRPHY_T::PTR2: tWLDLYS Mask */ + +#define DDRPHY_PTR3_tDINIT0_Pos (0) /*!< DDRPHY_T::PTR3: tDINIT0 Position */ +#define DDRPHY_PTR3_tDINIT0_Msk (0xffffful << DDRPHY_PTR3_tDINIT0_Pos) /*!< DDRPHY_T::PTR3: tDINIT0 Mask */ + +#define DDRPHY_PTR3_tDINIT1_Pos (20) /*!< DDRPHY_T::PTR3: tDINIT1 Position */ +#define DDRPHY_PTR3_tDINIT1_Msk (0x1fful << DDRPHY_PTR3_tDINIT1_Pos) /*!< DDRPHY_T::PTR3: tDINIT1 Mask */ + +#define DDRPHY_PTR4_tDINIT2_Pos (0) /*!< DDRPHY_T::PTR4: tDINIT2 Position */ +#define DDRPHY_PTR4_tDINIT2_Msk (0x3fffful << DDRPHY_PTR4_tDINIT2_Pos) /*!< DDRPHY_T::PTR4: tDINIT2 Mask */ + +#define DDRPHY_PTR4_tDINIT3_Pos (18) /*!< DDRPHY_T::PTR4: tDINIT3 Position */ +#define DDRPHY_PTR4_tDINIT3_Msk (0x3fful << DDRPHY_PTR4_tDINIT3_Pos) /*!< DDRPHY_T::PTR4: tDINIT3 Mask */ + +#define DDRPHY_ACMDLR_IPRD_Pos (0) /*!< DDRPHY_T::ACMDLR: IPRD Position */ +#define DDRPHY_ACMDLR_IPRD_Msk (0xfful << DDRPHY_ACMDLR_IPRD_Pos) /*!< DDRPHY_T::ACMDLR: IPRD Mask */ + +#define DDRPHY_ACMDLR_TPRD_Pos (8) /*!< DDRPHY_T::ACMDLR: TPRD Position */ +#define DDRPHY_ACMDLR_TPRD_Msk (0xfful << DDRPHY_ACMDLR_TPRD_Pos) /*!< DDRPHY_T::ACMDLR: TPRD Mask */ + +#define DDRPHY_ACMDLR_MDLD_Pos (16) /*!< DDRPHY_T::ACMDLR: MDLD Position */ +#define DDRPHY_ACMDLR_MDLD_Msk (0xfful << DDRPHY_ACMDLR_MDLD_Pos) /*!< DDRPHY_T::ACMDLR: MDLD Mask */ + +#define DDRPHY_ACBDLR_CK0BD_Pos (0) /*!< DDRPHY_T::ACBDLR: CK0BD Position */ +#define DDRPHY_ACBDLR_CK0BD_Msk (0x3ful << DDRPHY_ACBDLR_CK0BD_Pos) /*!< DDRPHY_T::ACBDLR: CK0BD Mask */ + +#define DDRPHY_ACBDLR_CK1BD_Pos (6) /*!< DDRPHY_T::ACBDLR: CK1BD Position */ +#define DDRPHY_ACBDLR_CK1BD_Msk (0x3ful << DDRPHY_ACBDLR_CK1BD_Pos) /*!< DDRPHY_T::ACBDLR: CK1BD Mask */ + +#define DDRPHY_ACBDLR_CK2BD_Pos (12) /*!< DDRPHY_T::ACBDLR: CK2BD Position */ +#define DDRPHY_ACBDLR_CK2BD_Msk (0x3ful << DDRPHY_ACBDLR_CK2BD_Pos) /*!< DDRPHY_T::ACBDLR: CK2BD Mask */ + +#define DDRPHY_ACBDLR_ACBD_Pos (18) /*!< DDRPHY_T::ACBDLR: ACBD Position */ +#define DDRPHY_ACBDLR_ACBD_Msk (0x3ful << DDRPHY_ACBDLR_ACBD_Pos) /*!< DDRPHY_T::ACBDLR: ACBD Mask */ + +#define DDRPHY_ACIOCR_ACIOM_Pos (0) /*!< DDRPHY_T::ACIOCR: ACIOM Position */ +#define DDRPHY_ACIOCR_ACIOM_Msk (0x1ul << DDRPHY_ACIOCR_ACIOM_Pos) /*!< DDRPHY_T::ACIOCR: ACIOM Mask */ + +#define DDRPHY_ACIOCR_ACOE_Pos (1) /*!< DDRPHY_T::ACIOCR: ACOE Position */ +#define DDRPHY_ACIOCR_ACOE_Msk (0x1ul << DDRPHY_ACIOCR_ACOE_Pos) /*!< DDRPHY_T::ACIOCR: ACOE Mask */ + +#define DDRPHY_ACIOCR_ACODT_Pos (2) /*!< DDRPHY_T::ACIOCR: ACODT Position */ +#define DDRPHY_ACIOCR_ACODT_Msk (0x1ul << DDRPHY_ACIOCR_ACODT_Pos) /*!< DDRPHY_T::ACIOCR: ACODT Mask */ + +#define DDRPHY_ACIOCR_ACPDD_Pos (3) /*!< DDRPHY_T::ACIOCR: ACPDD Position */ +#define DDRPHY_ACIOCR_ACPDD_Msk (0x1ul << DDRPHY_ACIOCR_ACPDD_Pos) /*!< DDRPHY_T::ACIOCR: ACPDD Mask */ + +#define DDRPHY_ACIOCR_ACPDR_Pos (4) /*!< DDRPHY_T::ACIOCR: ACPDR Position */ +#define DDRPHY_ACIOCR_ACPDR_Msk (0x1ul << DDRPHY_ACIOCR_ACPDR_Pos) /*!< DDRPHY_T::ACIOCR: ACPDR Mask */ + +#define DDRPHY_ACIOCR_CKODT_Pos (5) /*!< DDRPHY_T::ACIOCR: CKODT Position */ +#define DDRPHY_ACIOCR_CKODT_Msk (0x7ul << DDRPHY_ACIOCR_CKODT_Pos) /*!< DDRPHY_T::ACIOCR: CKODT Mask */ + +#define DDRPHY_ACIOCR_CKPDD_Pos (8) /*!< DDRPHY_T::ACIOCR: CKPDD Position */ +#define DDRPHY_ACIOCR_CKPDD_Msk (0x7ul << DDRPHY_ACIOCR_CKPDD_Pos) /*!< DDRPHY_T::ACIOCR: CKPDD Mask */ + +#define DDRPHY_ACIOCR_CKPDR_Pos (11) /*!< DDRPHY_T::ACIOCR: CKPDR Position */ +#define DDRPHY_ACIOCR_CKPDR_Msk (0x7ul << DDRPHY_ACIOCR_CKPDR_Pos) /*!< DDRPHY_T::ACIOCR: CKPDR Mask */ + +#define DDRPHY_ACIOCR_RANKODT_Pos (14) /*!< DDRPHY_T::ACIOCR: RANKODT Position */ +#define DDRPHY_ACIOCR_RANKODT_Msk (0xful << DDRPHY_ACIOCR_RANKODT_Pos) /*!< DDRPHY_T::ACIOCR: RANKODT Mask */ + +#define DDRPHY_ACIOCR_CSPDD_Pos (18) /*!< DDRPHY_T::ACIOCR: CSPDD Position */ +#define DDRPHY_ACIOCR_CSPDD_Msk (0xful << DDRPHY_ACIOCR_CSPDD_Pos) /*!< DDRPHY_T::ACIOCR: CSPDD Mask */ + +#define DDRPHY_ACIOCR_RANKPDR_Pos (22) /*!< DDRPHY_T::ACIOCR: RANKPDR Position */ +#define DDRPHY_ACIOCR_RANKPDR_Msk (0xful << DDRPHY_ACIOCR_RANKPDR_Pos) /*!< DDRPHY_T::ACIOCR: RANKPDR Mask */ + +#define DDRPHY_ACIOCR_RSTODT_Pos (26) /*!< DDRPHY_T::ACIOCR: RSTODT Position */ +#define DDRPHY_ACIOCR_RSTODT_Msk (0x1ul << DDRPHY_ACIOCR_RSTODT_Pos) /*!< DDRPHY_T::ACIOCR: RSTODT Mask */ + +#define DDRPHY_ACIOCR_RSTPDD_Pos (27) /*!< DDRPHY_T::ACIOCR: RSTPDD Position */ +#define DDRPHY_ACIOCR_RSTPDD_Msk (0x1ul << DDRPHY_ACIOCR_RSTPDD_Pos) /*!< DDRPHY_T::ACIOCR: RSTPDD Mask */ + +#define DDRPHY_ACIOCR_RSTPDR_Pos (28) /*!< DDRPHY_T::ACIOCR: RSTPDR Position */ +#define DDRPHY_ACIOCR_RSTPDR_Msk (0x1ul << DDRPHY_ACIOCR_RSTPDR_Pos) /*!< DDRPHY_T::ACIOCR: RSTPDR Mask */ + +#define DDRPHY_ACIOCR_RSTIOM_Pos (29) /*!< DDRPHY_T::ACIOCR: RSTIOM Position */ +#define DDRPHY_ACIOCR_RSTIOM_Msk (0x1ul << DDRPHY_ACIOCR_RSTIOM_Pos) /*!< DDRPHY_T::ACIOCR: RSTIOM Mask */ + +#define DDRPHY_ACIOCR_ACSR_Pos (30) /*!< DDRPHY_T::ACIOCR: ACSR Position */ +#define DDRPHY_ACIOCR_ACSR_Msk (0x3ul << DDRPHY_ACIOCR_ACSR_Pos) /*!< DDRPHY_T::ACIOCR: ACSR Mask */ + +#define DDRPHY_DXCCR_DXODT_Pos (0) /*!< DDRPHY_T::DXCCR: DXODT Position */ +#define DDRPHY_DXCCR_DXODT_Msk (0x1ul << DDRPHY_DXCCR_DXODT_Pos) /*!< DDRPHY_T::DXCCR: DXODT Mask */ + +#define DDRPHY_DXCCR_DXIOM_Pos (1) /*!< DDRPHY_T::DXCCR: DXIOM Position */ +#define DDRPHY_DXCCR_DXIOM_Msk (0x1ul << DDRPHY_DXCCR_DXIOM_Pos) /*!< DDRPHY_T::DXCCR: DXIOM Mask */ + +#define DDRPHY_DXCCR_MDLEN_Pos (2) /*!< DDRPHY_T::DXCCR: MDLEN Position */ +#define DDRPHY_DXCCR_MDLEN_Msk (0x1ul << DDRPHY_DXCCR_MDLEN_Pos) /*!< DDRPHY_T::DXCCR: MDLEN Mask */ + +#define DDRPHY_DXCCR_DXPDD_Pos (3) /*!< DDRPHY_T::DXCCR: DXPDD Position */ +#define DDRPHY_DXCCR_DXPDD_Msk (0x1ul << DDRPHY_DXCCR_DXPDD_Pos) /*!< DDRPHY_T::DXCCR: DXPDD Mask */ + +#define DDRPHY_DXCCR_DXPDR_Pos (4) /*!< DDRPHY_T::DXCCR: DXPDR Position */ +#define DDRPHY_DXCCR_DXPDR_Msk (0x1ul << DDRPHY_DXCCR_DXPDR_Pos) /*!< DDRPHY_T::DXCCR: DXPDR Mask */ + +#define DDRPHY_DXCCR_DQSRES_Pos (5) /*!< DDRPHY_T::DXCCR: DQSRES Position */ +#define DDRPHY_DXCCR_DQSRES_Msk (0xful << DDRPHY_DXCCR_DQSRES_Pos) /*!< DDRPHY_T::DXCCR: DQSRES Mask */ + +#define DDRPHY_DXCCR_DQSNRES_Pos (9) /*!< DDRPHY_T::DXCCR: DQSNRES Position */ +#define DDRPHY_DXCCR_DQSNRES_Msk (0xful << DDRPHY_DXCCR_DQSNRES_Pos) /*!< DDRPHY_T::DXCCR: DQSNRES Mask */ + +#define DDRPHY_DXCCR_DXSR_Pos (13) /*!< DDRPHY_T::DXCCR: DXSR Position */ +#define DDRPHY_DXCCR_DXSR_Msk (0x3ul << DDRPHY_DXCCR_DXSR_Pos) /*!< DDRPHY_T::DXCCR: DXSR Mask */ + +#define DDRPHY_DXCCR_MSBUDQ_Pos (15) /*!< DDRPHY_T::DXCCR: MSBUDQ Position */ +#define DDRPHY_DXCCR_MSBUDQ_Msk (0x7ul << DDRPHY_DXCCR_MSBUDQ_Pos) /*!< DDRPHY_T::DXCCR: MSBUDQ Mask */ + +#define DDRPHY_DXCCR_UDQODT_Pos (18) /*!< DDRPHY_T::DXCCR: UDQODT Position */ +#define DDRPHY_DXCCR_UDQODT_Msk (0x1ul << DDRPHY_DXCCR_UDQODT_Pos) /*!< DDRPHY_T::DXCCR: UDQODT Mask */ + +#define DDRPHY_DXCCR_UDQPDD_Pos (19) /*!< DDRPHY_T::DXCCR: UDQPDD Position */ +#define DDRPHY_DXCCR_UDQPDD_Msk (0x1ul << DDRPHY_DXCCR_UDQPDD_Pos) /*!< DDRPHY_T::DXCCR: UDQPDD Mask */ + +#define DDRPHY_DXCCR_UDQPDR_Pos (20) /*!< DDRPHY_T::DXCCR: UDQPDR Position */ +#define DDRPHY_DXCCR_UDQPDR_Msk (0x1ul << DDRPHY_DXCCR_UDQPDR_Pos) /*!< DDRPHY_T::DXCCR: UDQPDR Mask */ + +#define DDRPHY_DXCCR_UDQIOM_Pos (21) /*!< DDRPHY_T::DXCCR: UDQIOM Position */ +#define DDRPHY_DXCCR_UDQIOM_Msk (0x1ul << DDRPHY_DXCCR_UDQIOM_Pos) /*!< DDRPHY_T::DXCCR: UDQIOM Mask */ + +#define DDRPHY_DXCCR_DYNDXPDD_Pos (22) /*!< DDRPHY_T::DXCCR: DYNDXPDD Position */ +#define DDRPHY_DXCCR_DYNDXPDD_Msk (0x1ul << DDRPHY_DXCCR_DYNDXPDD_Pos) /*!< DDRPHY_T::DXCCR: DYNDXPDD Mask */ + +#define DDRPHY_DXCCR_DYNDXPDR_Pos (23) /*!< DDRPHY_T::DXCCR: DYNDXPDR Position */ +#define DDRPHY_DXCCR_DYNDXPDR_Msk (0x1ul << DDRPHY_DXCCR_DYNDXPDR_Pos) /*!< DDRPHY_T::DXCCR: DYNDXPDR Mask */ + +#define DDRPHY_DXCCR_DDPDDCDO_Pos (24) /*!< DDRPHY_T::DXCCR: DDPDDCDO Position */ +#define DDRPHY_DXCCR_DDPDDCDO_Msk (0xful << DDRPHY_DXCCR_DDPDDCDO_Pos) /*!< DDRPHY_T::DXCCR: DDPDDCDO Mask */ + +#define DDRPHY_DXCCR_DDPDRCDO_Pos (28) /*!< DDRPHY_T::DXCCR: DDPDRCDO Position */ +#define DDRPHY_DXCCR_DDPDRCDO_Msk (0xful << DDRPHY_DXCCR_DDPDRCDO_Pos) /*!< DDRPHY_T::DXCCR: DDPDRCDO Mask */ + +#define DDRPHY_DSGCR_PUREN_Pos (0) /*!< DDRPHY_T::DSGCR: PUREN Position */ +#define DDRPHY_DSGCR_PUREN_Msk (0x1ul << DDRPHY_DSGCR_PUREN_Pos) /*!< DDRPHY_T::DSGCR: PUREN Mask */ + +#define DDRPHY_DSGCR_BDISEN_Pos (1) /*!< DDRPHY_T::DSGCR: BDISEN Position */ +#define DDRPHY_DSGCR_BDISEN_Msk (0x1ul << DDRPHY_DSGCR_BDISEN_Pos) /*!< DDRPHY_T::DSGCR: BDISEN Mask */ + +#define DDRPHY_DSGCR_ZUEN_Pos (2) /*!< DDRPHY_T::DSGCR: ZUEN Position */ +#define DDRPHY_DSGCR_ZUEN_Msk (0x1ul << DDRPHY_DSGCR_ZUEN_Pos) /*!< DDRPHY_T::DSGCR: ZUEN Mask */ + +#define DDRPHY_DSGCR_LPIOPD_Pos (3) /*!< DDRPHY_T::DSGCR: LPIOPD Position */ +#define DDRPHY_DSGCR_LPIOPD_Msk (0x1ul << DDRPHY_DSGCR_LPIOPD_Pos) /*!< DDRPHY_T::DSGCR: LPIOPD Mask */ + +#define DDRPHY_DSGCR_LPPLLPD_Pos (4) /*!< DDRPHY_T::DSGCR: LPPLLPD Position */ +#define DDRPHY_DSGCR_LPPLLPD_Msk (0x1ul << DDRPHY_DSGCR_LPPLLPD_Pos) /*!< DDRPHY_T::DSGCR: LPPLLPD Mask */ + +#define DDRPHY_DSGCR_CUAEN_Pos (5) /*!< DDRPHY_T::DSGCR: CUAEN Position */ +#define DDRPHY_DSGCR_CUAEN_Msk (0x1ul << DDRPHY_DSGCR_CUAEN_Pos) /*!< DDRPHY_T::DSGCR: CUAEN Mask */ + +#define DDRPHY_DSGCR_DQSGX_Pos (6) /*!< DDRPHY_T::DSGCR: DQSGX Position */ +#define DDRPHY_DSGCR_DQSGX_Msk (0x1ul << DDRPHY_DSGCR_DQSGX_Pos) /*!< DDRPHY_T::DSGCR: DQSGX Mask */ + +#define DDRPHY_DSGCR_BRRMODE_Pos (7) /*!< DDRPHY_T::DSGCR: BRRMODE Position */ +#define DDRPHY_DSGCR_BRRMODE_Msk (0x1ul << DDRPHY_DSGCR_BRRMODE_Pos) /*!< DDRPHY_T::DSGCR: BRRMODE Mask */ + +#define DDRPHY_DSGCR_PUAD_Pos (8) /*!< DDRPHY_T::DSGCR: PUAD Position */ +#define DDRPHY_DSGCR_PUAD_Msk (0xful << DDRPHY_DSGCR_PUAD_Pos) /*!< DDRPHY_T::DSGCR: PUAD Mask */ + +#define DDRPHY_DSGCR_DTOODT_Pos (12) /*!< DDRPHY_T::DSGCR: DTOODT Position */ +#define DDRPHY_DSGCR_DTOODT_Msk (0x1ul << DDRPHY_DSGCR_DTOODT_Pos) /*!< DDRPHY_T::DSGCR: DTOODT Mask */ + +#define DDRPHY_DSGCR_DTOPDD_Pos (13) /*!< DDRPHY_T::DSGCR: DTOPDD Position */ +#define DDRPHY_DSGCR_DTOPDD_Msk (0x1ul << DDRPHY_DSGCR_DTOPDD_Pos) /*!< DDRPHY_T::DSGCR: DTOPDD Mask */ + +#define DDRPHY_DSGCR_DTOPDR_Pos (14) /*!< DDRPHY_T::DSGCR: DTOPDR Position */ +#define DDRPHY_DSGCR_DTOPDR_Msk (0x1ul << DDRPHY_DSGCR_DTOPDR_Pos) /*!< DDRPHY_T::DSGCR: DTOPDR Mask */ + +#define DDRPHY_DSGCR_DTOIOM_Pos (15) /*!< DDRPHY_T::DSGCR: DTOIOM Position */ +#define DDRPHY_DSGCR_DTOIOM_Msk (0x1ul << DDRPHY_DSGCR_DTOIOM_Pos) /*!< DDRPHY_T::DSGCR: DTOIOM Mask */ + +#define DDRPHY_DSGCR_DTOOE_Pos (16) /*!< DDRPHY_T::DSGCR: DTOOE Position */ +#define DDRPHY_DSGCR_DTOOE_Msk (0x1ul << DDRPHY_DSGCR_DTOOE_Pos) /*!< DDRPHY_T::DSGCR: DTOOE Mask */ + +#define DDRPHY_DSGCR_ATOAE_Pos (17) /*!< DDRPHY_T::DSGCR: ATOAE Position */ +#define DDRPHY_DSGCR_ATOAE_Msk (0x1ul << DDRPHY_DSGCR_ATOAE_Pos) /*!< DDRPHY_T::DSGCR: ATOAE Mask */ + +#define DDRPHY_DSGCR_RRMODE_Pos (18) /*!< DDRPHY_T::DSGCR: RRMODE Position */ +#define DDRPHY_DSGCR_RRMODE_Msk (0x1ul << DDRPHY_DSGCR_RRMODE_Pos) /*!< DDRPHY_T::DSGCR: RRMODE Mask */ + +#define DDRPHY_DSGCR_SDRMODE_Pos (19) /*!< DDRPHY_T::DSGCR: SDRMODE Position */ +#define DDRPHY_DSGCR_SDRMODE_Msk (0x1ul << DDRPHY_DSGCR_SDRMODE_Pos) /*!< DDRPHY_T::DSGCR: SDRMODE Mask */ + +#define DDRPHY_DSGCR_CKEPDD_Pos (20) /*!< DDRPHY_T::DSGCR: CKEPDD Position */ +#define DDRPHY_DSGCR_CKEPDD_Msk (0xful << DDRPHY_DSGCR_CKEPDD_Pos) /*!< DDRPHY_T::DSGCR: CKEPDD Mask */ + +#define DDRPHY_DSGCR_ODTPDD_Pos (24) /*!< DDRPHY_T::DSGCR: ODTPDD Position */ +#define DDRPHY_DSGCR_ODTPDD_Msk (0xful << DDRPHY_DSGCR_ODTPDD_Pos) /*!< DDRPHY_T::DSGCR: ODTPDD Mask */ + +#define DDRPHY_DSGCR_CKOE_Pos (28) /*!< DDRPHY_T::DSGCR: CKOE Position */ +#define DDRPHY_DSGCR_CKOE_Msk (0x1ul << DDRPHY_DSGCR_CKOE_Pos) /*!< DDRPHY_T::DSGCR: CKOE Mask */ + +#define DDRPHY_DSGCR_ODTOE_Pos (29) /*!< DDRPHY_T::DSGCR: ODTOE Position */ +#define DDRPHY_DSGCR_ODTOE_Msk (0x1ul << DDRPHY_DSGCR_ODTOE_Pos) /*!< DDRPHY_T::DSGCR: ODTOE Mask */ + +#define DDRPHY_DSGCR_RSTOE_Pos (30) /*!< DDRPHY_T::DSGCR: RSTOE Position */ +#define DDRPHY_DSGCR_RSTOE_Msk (0x1ul << DDRPHY_DSGCR_RSTOE_Pos) /*!< DDRPHY_T::DSGCR: RSTOE Mask */ + +#define DDRPHY_DSGCR_CKEOE_Pos (31) /*!< DDRPHY_T::DSGCR: CKEOE Position */ +#define DDRPHY_DSGCR_CKEOE_Msk (0x1ul << DDRPHY_DSGCR_CKEOE_Pos) /*!< DDRPHY_T::DSGCR: CKEOE Mask */ + +#define DDRPHY_DCR_DDRMD_Pos (0) /*!< DDRPHY_T::DCR: DDRMD Position */ +#define DDRPHY_DCR_DDRMD_Msk (0x7ul << DDRPHY_DCR_DDRMD_Pos) /*!< DDRPHY_T::DCR: DDRMD Mask */ + +#define DDRPHY_DCR_DDR8BNK_Pos (3) /*!< DDRPHY_T::DCR: DDR8BNK Position */ +#define DDRPHY_DCR_DDR8BNK_Msk (0x1ul << DDRPHY_DCR_DDR8BNK_Pos) /*!< DDRPHY_T::DCR: DDR8BNK Mask */ + +#define DDRPHY_DCR_PDQ_Pos (4) /*!< DDRPHY_T::DCR: PDQ Position */ +#define DDRPHY_DCR_PDQ_Msk (0x7ul << DDRPHY_DCR_PDQ_Pos) /*!< DDRPHY_T::DCR: PDQ Mask */ + +#define DDRPHY_DCR_MPRDQ_Pos (7) /*!< DDRPHY_T::DCR: MPRDQ Position */ +#define DDRPHY_DCR_MPRDQ_Msk (0x1ul << DDRPHY_DCR_MPRDQ_Pos) /*!< DDRPHY_T::DCR: MPRDQ Mask */ + +#define DDRPHY_DCR_BYTEMASK_Pos (10) /*!< DDRPHY_T::DCR: BYTEMASK Position */ +#define DDRPHY_DCR_BYTEMASK_Msk (0xfful << DDRPHY_DCR_BYTEMASK_Pos) /*!< DDRPHY_T::DCR: BYTEMASK Mask */ + +#define DDRPHY_DCR_NOSRA_Pos (27) /*!< DDRPHY_T::DCR: NOSRA Position */ +#define DDRPHY_DCR_NOSRA_Msk (0x1ul << DDRPHY_DCR_NOSRA_Pos) /*!< DDRPHY_T::DCR: NOSRA Mask */ + +#define DDRPHY_DCR_DDR2T_Pos (28) /*!< DDRPHY_T::DCR: DDR2T Position */ +#define DDRPHY_DCR_DDR2T_Msk (0x1ul << DDRPHY_DCR_DDR2T_Pos) /*!< DDRPHY_T::DCR: DDR2T Mask */ + +#define DDRPHY_DCR_UDIMM_Pos (29) /*!< DDRPHY_T::DCR: UDIMM Position */ +#define DDRPHY_DCR_UDIMM_Msk (0x1ul << DDRPHY_DCR_UDIMM_Pos) /*!< DDRPHY_T::DCR: UDIMM Mask */ + +#define DDRPHY_DTPR0_tRTP_Pos (0) /*!< DDRPHY_T::DTPR0: tRTP Position */ +#define DDRPHY_DTPR0_tRTP_Msk (0xful << DDRPHY_DTPR0_tRTP_Pos) /*!< DDRPHY_T::DTPR0: tRTP Mask */ + +#define DDRPHY_DTPR0_tWTR_Pos (4) /*!< DDRPHY_T::DTPR0: tWTR Position */ +#define DDRPHY_DTPR0_tWTR_Msk (0xful << DDRPHY_DTPR0_tWTR_Pos) /*!< DDRPHY_T::DTPR0: tWTR Mask */ + +#define DDRPHY_DTPR0_tRP_Pos (8) /*!< DDRPHY_T::DTPR0: tRP Position */ +#define DDRPHY_DTPR0_tRP_Msk (0xful << DDRPHY_DTPR0_tRP_Pos) /*!< DDRPHY_T::DTPR0: tRP Mask */ + +#define DDRPHY_DTPR0_tRCD_Pos (12) /*!< DDRPHY_T::DTPR0: tRCD Position */ +#define DDRPHY_DTPR0_tRCD_Msk (0xful << DDRPHY_DTPR0_tRCD_Pos) /*!< DDRPHY_T::DTPR0: tRCD Mask */ + +#define DDRPHY_DTPR0_tRAS_Pos (16) /*!< DDRPHY_T::DTPR0: tRAS Position */ +#define DDRPHY_DTPR0_tRAS_Msk (0x3ful << DDRPHY_DTPR0_tRAS_Pos) /*!< DDRPHY_T::DTPR0: tRAS Mask */ + +#define DDRPHY_DTPR0_tRRD_Pos (22) /*!< DDRPHY_T::DTPR0: tRRD Position */ +#define DDRPHY_DTPR0_tRRD_Msk (0xful << DDRPHY_DTPR0_tRRD_Pos) /*!< DDRPHY_T::DTPR0: tRRD Mask */ + +#define DDRPHY_DTPR0_tRC_Pos (26) /*!< DDRPHY_T::DTPR0: tRC Position */ +#define DDRPHY_DTPR0_tRC_Msk (0x3ful << DDRPHY_DTPR0_tRC_Pos) /*!< DDRPHY_T::DTPR0: tRC Mask */ + +#define DDRPHY_DTPR1_tMRD_Pos (0) /*!< DDRPHY_T::DTPR1: tMRD Position */ +#define DDRPHY_DTPR1_tMRD_Msk (0x3ul << DDRPHY_DTPR1_tMRD_Pos) /*!< DDRPHY_T::DTPR1: tMRD Mask */ + +#define DDRPHY_DTPR1_tMOD_Pos (2) /*!< DDRPHY_T::DTPR1: tMOD Position */ +#define DDRPHY_DTPR1_tMOD_Msk (0x7ul << DDRPHY_DTPR1_tMOD_Pos) /*!< DDRPHY_T::DTPR1: tMOD Mask */ + +#define DDRPHY_DTPR1_tFAW_Pos (5) /*!< DDRPHY_T::DTPR1: tFAW Position */ +#define DDRPHY_DTPR1_tFAW_Msk (0x3ful << DDRPHY_DTPR1_tFAW_Pos) /*!< DDRPHY_T::DTPR1: tFAW Mask */ + +#define DDRPHY_DTPR1_tRFC_Pos (11) /*!< DDRPHY_T::DTPR1: tRFC Position */ +#define DDRPHY_DTPR1_tRFC_Msk (0x1fful << DDRPHY_DTPR1_tRFC_Pos) /*!< DDRPHY_T::DTPR1: tRFC Mask */ + +#define DDRPHY_DTPR1_tWLMRD_Pos (20) /*!< DDRPHY_T::DTPR1: tWLMRD Position */ +#define DDRPHY_DTPR1_tWLMRD_Msk (0x3ful << DDRPHY_DTPR1_tWLMRD_Pos) /*!< DDRPHY_T::DTPR1: tWLMRD Mask */ + +#define DDRPHY_DTPR1_tWLO_Pos (26) /*!< DDRPHY_T::DTPR1: tWLO Position */ +#define DDRPHY_DTPR1_tWLO_Msk (0xful << DDRPHY_DTPR1_tWLO_Pos) /*!< DDRPHY_T::DTPR1: tWLO Mask */ + +#define DDRPHY_DTPR1_tAONDtAOFD_Pos (30) /*!< DDRPHY_T::DTPR1: tAONDtAOFD Position */ +#define DDRPHY_DTPR1_tAONDtAOFD_Msk (0x3ul << DDRPHY_DTPR1_tAONDtAOFD_Pos) /*!< DDRPHY_T::DTPR1: tAONDtAOFD Mask */ + +#define DDRPHY_DTPR2_tXS_Pos (0) /*!< DDRPHY_T::DTPR2: tXS Position */ +#define DDRPHY_DTPR2_tXS_Msk (0x3fful << DDRPHY_DTPR2_tXS_Pos) /*!< DDRPHY_T::DTPR2: tXS Mask */ + +#define DDRPHY_DTPR2_tXP_Pos (10) /*!< DDRPHY_T::DTPR2: tXP Position */ +#define DDRPHY_DTPR2_tXP_Msk (0x1ful << DDRPHY_DTPR2_tXP_Pos) /*!< DDRPHY_T::DTPR2: tXP Mask */ + +#define DDRPHY_DTPR2_tCKE_Pos (15) /*!< DDRPHY_T::DTPR2: tCKE Position */ +#define DDRPHY_DTPR2_tCKE_Msk (0xful << DDRPHY_DTPR2_tCKE_Pos) /*!< DDRPHY_T::DTPR2: tCKE Mask */ + +#define DDRPHY_DTPR2_tDLLK_Pos (19) /*!< DDRPHY_T::DTPR2: tDLLK Position */ +#define DDRPHY_DTPR2_tDLLK_Msk (0x3fful << DDRPHY_DTPR2_tDLLK_Pos) /*!< DDRPHY_T::DTPR2: tDLLK Mask */ + +#define DDRPHY_DTPR2_tRTODT_Pos (29) /*!< DDRPHY_T::DTPR2: tRTODT Position */ +#define DDRPHY_DTPR2_tRTODT_Msk (0x1ul << DDRPHY_DTPR2_tRTODT_Pos) /*!< DDRPHY_T::DTPR2: tRTODT Mask */ + +#define DDRPHY_DTPR2_tRTW_Pos (30) /*!< DDRPHY_T::DTPR2: tRTW Position */ +#define DDRPHY_DTPR2_tRTW_Msk (0x1ul << DDRPHY_DTPR2_tRTW_Pos) /*!< DDRPHY_T::DTPR2: tRTW Mask */ + +#define DDRPHY_DTPR2_tCCD_Pos (31) /*!< DDRPHY_T::DTPR2: tCCD Position */ +#define DDRPHY_DTPR2_tCCD_Msk (0x1ul << DDRPHY_DTPR2_tCCD_Pos) /*!< DDRPHY_T::DTPR2: tCCD Mask */ + +#define DDRPHY_MR0_BL_Pos (0) /*!< DDRPHY_T::MR0: BL Position */ +#define DDRPHY_MR0_BL_Msk (0x3ul << DDRPHY_MR0_BL_Pos) /*!< DDRPHY_T::MR0: BL Mask */ + +#define DDRPHY_MR0_CL0_Pos (2) /*!< DDRPHY_T::MR0: CL0 Position */ +#define DDRPHY_MR0_CL0_Msk (0x1ul << DDRPHY_MR0_CL0_Pos) /*!< DDRPHY_T::MR0: CL0 Mask */ + +#define DDRPHY_MR0_BT_Pos (3) /*!< DDRPHY_T::MR0: BT Position */ +#define DDRPHY_MR0_BT_Msk (0x1ul << DDRPHY_MR0_BT_Pos) /*!< DDRPHY_T::MR0: BT Mask */ + +#define DDRPHY_MR0_CL1_Pos (4) /*!< DDRPHY_T::MR0: CL1 Position */ +#define DDRPHY_MR0_CL1_Msk (0x7ul << DDRPHY_MR0_CL1_Pos) /*!< DDRPHY_T::MR0: CL1 Mask */ + +#define DDRPHY_MR0_TM_Pos (7) /*!< DDRPHY_T::MR0: TM Position */ +#define DDRPHY_MR0_TM_Msk (0x1ul << DDRPHY_MR0_TM_Pos) /*!< DDRPHY_T::MR0: TM Mask */ + +#define DDRPHY_MR0_DR_Pos (8) /*!< DDRPHY_T::MR0: DR Position */ +#define DDRPHY_MR0_DR_Msk (0x1ul << DDRPHY_MR0_DR_Pos) /*!< DDRPHY_T::MR0: DR Mask */ + +#define DDRPHY_MR0_WR_Pos (9) /*!< DDRPHY_T::MR0: WR Position */ +#define DDRPHY_MR0_WR_Msk (0x7ul << DDRPHY_MR0_WR_Pos) /*!< DDRPHY_T::MR0: WR Mask */ + +#define DDRPHY_MR0_PD_Pos (12) /*!< DDRPHY_T::MR0: PD Position */ +#define DDRPHY_MR0_PD_Msk (0x1ul << DDRPHY_MR0_PD_Pos) /*!< DDRPHY_T::MR0: PD Mask */ + +#define DDRPHY_MR1_DE_Pos (0) /*!< DDRPHY_T::MR1: DE Position */ +#define DDRPHY_MR1_DE_Msk (0x1ul << DDRPHY_MR1_DE_Pos) /*!< DDRPHY_T::MR1: DE Mask */ + +#define DDRPHY_MR1_DIC0_Pos (1) /*!< DDRPHY_T::MR1: DIC0 Position */ +#define DDRPHY_MR1_DIC0_Msk (0x1ul << DDRPHY_MR1_DIC0_Pos) /*!< DDRPHY_T::MR1: DIC0 Mask */ + +#define DDRPHY_MR1_RTT0_Pos (2) /*!< DDRPHY_T::MR1: RTT0 Position */ +#define DDRPHY_MR1_RTT0_Msk (0x1ul << DDRPHY_MR1_RTT0_Pos) /*!< DDRPHY_T::MR1: RTT0 Mask */ + +#define DDRPHY_MR1_AL_Pos (3) /*!< DDRPHY_T::MR1: AL Position */ +#define DDRPHY_MR1_AL_Msk (0x3ul << DDRPHY_MR1_AL_Pos) /*!< DDRPHY_T::MR1: AL Mask */ + +#define DDRPHY_MR1_DIC1_Pos (5) /*!< DDRPHY_T::MR1: DIC1 Position */ +#define DDRPHY_MR1_DIC1_Msk (0x1ul << DDRPHY_MR1_DIC1_Pos) /*!< DDRPHY_T::MR1: DIC1 Mask */ + +#define DDRPHY_MR1_RTT1_Pos (6) /*!< DDRPHY_T::MR1: RTT1 Position */ +#define DDRPHY_MR1_RTT1_Msk (0x1ul << DDRPHY_MR1_RTT1_Pos) /*!< DDRPHY_T::MR1: RTT1 Mask */ + +#define DDRPHY_MR1_LEVEL_Pos (7) /*!< DDRPHY_T::MR1: LEVEL Position */ +#define DDRPHY_MR1_LEVEL_Msk (0x1ul << DDRPHY_MR1_LEVEL_Pos) /*!< DDRPHY_T::MR1: LEVEL Mask */ + +#define DDRPHY_MR1_RTT2_Pos (9) /*!< DDRPHY_T::MR1: RTT2 Position */ +#define DDRPHY_MR1_RTT2_Msk (0x1ul << DDRPHY_MR1_RTT2_Pos) /*!< DDRPHY_T::MR1: RTT2 Mask */ + +#define DDRPHY_MR1_TDQS_Pos (11) /*!< DDRPHY_T::MR1: TDQS Position */ +#define DDRPHY_MR1_TDQS_Msk (0x1ul << DDRPHY_MR1_TDQS_Pos) /*!< DDRPHY_T::MR1: TDQS Mask */ + +#define DDRPHY_MR1_QOFF_Pos (12) /*!< DDRPHY_T::MR1: QOFF Position */ +#define DDRPHY_MR1_QOFF_Msk (0x1ul << DDRPHY_MR1_QOFF_Pos) /*!< DDRPHY_T::MR1: QOFF Mask */ + +#define DDRPHY_MR2_PASR_Pos (0) /*!< DDRPHY_T::MR2: PASR Position */ +#define DDRPHY_MR2_PASR_Msk (0x7ul << DDRPHY_MR2_PASR_Pos) /*!< DDRPHY_T::MR2: PASR Mask */ + +#define DDRPHY_MR2_CWL_Pos (3) /*!< DDRPHY_T::MR2: CWL Position */ +#define DDRPHY_MR2_CWL_Msk (0x7ul << DDRPHY_MR2_CWL_Pos) /*!< DDRPHY_T::MR2: CWL Mask */ + +#define DDRPHY_MR2_ASR_Pos (6) /*!< DDRPHY_T::MR2: ASR Position */ +#define DDRPHY_MR2_ASR_Msk (0x1ul << DDRPHY_MR2_ASR_Pos) /*!< DDRPHY_T::MR2: ASR Mask */ + +#define DDRPHY_MR2_SRT_Pos (7) /*!< DDRPHY_T::MR2: SRT Position */ +#define DDRPHY_MR2_SRT_Msk (0x1ul << DDRPHY_MR2_SRT_Pos) /*!< DDRPHY_T::MR2: SRT Mask */ + +#define DDRPHY_MR2_RTTWR_Pos (9) /*!< DDRPHY_T::MR2: RTTWR Position */ +#define DDRPHY_MR2_RTTWR_Msk (0x3ul << DDRPHY_MR2_RTTWR_Pos) /*!< DDRPHY_T::MR2: RTTWR Mask */ + +#define DDRPHY_MR3_MPRLOC_Pos (0) /*!< DDRPHY_T::MR3: MPRLOC Position */ +#define DDRPHY_MR3_MPRLOC_Msk (0x3ul << DDRPHY_MR3_MPRLOC_Pos) /*!< DDRPHY_T::MR3: MPRLOC Mask */ + +#define DDRPHY_MR3_MPR_Pos (2) /*!< DDRPHY_T::MR3: MPR Position */ +#define DDRPHY_MR3_MPR_Msk (0x1ul << DDRPHY_MR3_MPR_Pos) /*!< DDRPHY_T::MR3: MPR Mask */ + +#define DDRPHY_ODTCR_RDODT0_Pos (0) /*!< DDRPHY_T::ODTCR: RDODT0 Position */ +#define DDRPHY_ODTCR_RDODT0_Msk (0xful << DDRPHY_ODTCR_RDODT0_Pos) /*!< DDRPHY_T::ODTCR: RDODT0 Mask */ + +#define DDRPHY_ODTCR_RDODT1_Pos (4) /*!< DDRPHY_T::ODTCR: RDODT1 Position */ +#define DDRPHY_ODTCR_RDODT1_Msk (0xful << DDRPHY_ODTCR_RDODT1_Pos) /*!< DDRPHY_T::ODTCR: RDODT1 Mask */ + +#define DDRPHY_ODTCR_RDODT2_Pos (8) /*!< DDRPHY_T::ODTCR: RDODT2 Position */ +#define DDRPHY_ODTCR_RDODT2_Msk (0xful << DDRPHY_ODTCR_RDODT2_Pos) /*!< DDRPHY_T::ODTCR: RDODT2 Mask */ + +#define DDRPHY_ODTCR_RDODT3_Pos (12) /*!< DDRPHY_T::ODTCR: RDODT3 Position */ +#define DDRPHY_ODTCR_RDODT3_Msk (0xful << DDRPHY_ODTCR_RDODT3_Pos) /*!< DDRPHY_T::ODTCR: RDODT3 Mask */ + +#define DDRPHY_ODTCR_WRODT0_Pos (16) /*!< DDRPHY_T::ODTCR: WRODT0 Position */ +#define DDRPHY_ODTCR_WRODT0_Msk (0xful << DDRPHY_ODTCR_WRODT0_Pos) /*!< DDRPHY_T::ODTCR: WRODT0 Mask */ + +#define DDRPHY_ODTCR_WRODT1_Pos (20) /*!< DDRPHY_T::ODTCR: WRODT1 Position */ +#define DDRPHY_ODTCR_WRODT1_Msk (0xful << DDRPHY_ODTCR_WRODT1_Pos) /*!< DDRPHY_T::ODTCR: WRODT1 Mask */ + +#define DDRPHY_ODTCR_WRODT2_Pos (24) /*!< DDRPHY_T::ODTCR: WRODT2 Position */ +#define DDRPHY_ODTCR_WRODT2_Msk (0xful << DDRPHY_ODTCR_WRODT2_Pos) /*!< DDRPHY_T::ODTCR: WRODT2 Mask */ + +#define DDRPHY_ODTCR_WRODT3_Pos (28) /*!< DDRPHY_T::ODTCR: WRODT3 Position */ +#define DDRPHY_ODTCR_WRODT3_Msk (0xful << DDRPHY_ODTCR_WRODT3_Pos) /*!< DDRPHY_T::ODTCR: WRODT3 Mask */ + +#define DDRPHY_DTCR_DTCOL_Pos (0) /*!< DDRPHY_T::DTCR: DTCOL Position */ +#define DDRPHY_DTCR_DTCOL_Msk (0xffful << DDRPHY_DTCR_DTCOL_Pos) /*!< DDRPHY_T::DTCR: DTCOL Mask */ + +#define DDRPHY_DTCR_DTROW_Pos (12) /*!< DDRPHY_T::DTCR: DTROW Position */ +#define DDRPHY_DTCR_DTROW_Msk (0xfffful << DDRPHY_DTCR_DTROW_Pos) /*!< DDRPHY_T::DTCR: DTROW Mask */ + +#define DDRPHY_DTCR_DTBANK_Pos (28) /*!< DDRPHY_T::DTCR: DTBANK Position */ +#define DDRPHY_DTCR_DTBANK_Msk (0x7ul << DDRPHY_DTCR_DTBANK_Pos) /*!< DDRPHY_T::DTCR: DTBANK Mask */ + +#define DDRPHY_DTAR1_DTCOL_Pos (0) /*!< DDRPHY_T::DTAR1: DTCOL Position */ +#define DDRPHY_DTAR1_DTCOL_Msk (0xffful << DDRPHY_DTAR1_DTCOL_Pos) /*!< DDRPHY_T::DTAR1: DTCOL Mask */ + +#define DDRPHY_DTAR1_DTROW_Pos (12) /*!< DDRPHY_T::DTAR1: DTROW Position */ +#define DDRPHY_DTAR1_DTROW_Msk (0xfffful << DDRPHY_DTAR1_DTROW_Pos) /*!< DDRPHY_T::DTAR1: DTROW Mask */ + +#define DDRPHY_DTAR1_DTBANK_Pos (28) /*!< DDRPHY_T::DTAR1: DTBANK Position */ +#define DDRPHY_DTAR1_DTBANK_Msk (0x7ul << DDRPHY_DTAR1_DTBANK_Pos) /*!< DDRPHY_T::DTAR1: DTBANK Mask */ + +#define DDRPHY_DTAR2_DTCOL_Pos (0) /*!< DDRPHY_T::DTAR2: DTCOL Position */ +#define DDRPHY_DTAR2_DTCOL_Msk (0xffful << DDRPHY_DTAR2_DTCOL_Pos) /*!< DDRPHY_T::DTAR2: DTCOL Mask */ + +#define DDRPHY_DTAR2_DTROW_Pos (12) /*!< DDRPHY_T::DTAR2: DTROW Position */ +#define DDRPHY_DTAR2_DTROW_Msk (0xfffful << DDRPHY_DTAR2_DTROW_Pos) /*!< DDRPHY_T::DTAR2: DTROW Mask */ + +#define DDRPHY_DTAR2_DTBANK_Pos (28) /*!< DDRPHY_T::DTAR2: DTBANK Position */ +#define DDRPHY_DTAR2_DTBANK_Msk (0x7ul << DDRPHY_DTAR2_DTBANK_Pos) /*!< DDRPHY_T::DTAR2: DTBANK Mask */ + +#define DDRPHY_DTAR3_DTCOL_Pos (0) /*!< DDRPHY_T::DTAR3: DTCOL Position */ +#define DDRPHY_DTAR3_DTCOL_Msk (0xffful << DDRPHY_DTAR3_DTCOL_Pos) /*!< DDRPHY_T::DTAR3: DTCOL Mask */ + +#define DDRPHY_DTAR3_DTROW_Pos (12) /*!< DDRPHY_T::DTAR3: DTROW Position */ +#define DDRPHY_DTAR3_DTROW_Msk (0xfffful << DDRPHY_DTAR3_DTROW_Pos) /*!< DDRPHY_T::DTAR3: DTROW Mask */ + +#define DDRPHY_DTAR3_DTBANK_Pos (28) /*!< DDRPHY_T::DTAR3: DTBANK Position */ +#define DDRPHY_DTAR3_DTBANK_Msk (0x7ul << DDRPHY_DTAR3_DTBANK_Pos) /*!< DDRPHY_T::DTAR3: DTBANK Mask */ + +#define DDRPHY_DTDR0_DTBYTE1_Pos (0) /*!< DDRPHY_T::DTDR0: DTBYTE1 Position */ +#define DDRPHY_DTDR0_DTBYTE1_Msk (0xfful << DDRPHY_DTDR0_DTBYTE1_Pos) /*!< DDRPHY_T::DTDR0: DTBYTE1 Mask */ + +#define DDRPHY_DTDR0_DTBYTE0_Pos (8) /*!< DDRPHY_T::DTDR0: DTBYTE0 Position */ +#define DDRPHY_DTDR0_DTBYTE0_Msk (0xfful << DDRPHY_DTDR0_DTBYTE0_Pos) /*!< DDRPHY_T::DTDR0: DTBYTE0 Mask */ + +#define DDRPHY_DTDR0_DTBYTE2_Pos (16) /*!< DDRPHY_T::DTDR0: DTBYTE2 Position */ +#define DDRPHY_DTDR0_DTBYTE2_Msk (0xfful << DDRPHY_DTDR0_DTBYTE2_Pos) /*!< DDRPHY_T::DTDR0: DTBYTE2 Mask */ + +#define DDRPHY_DTDR0_DTBYTE3_Pos (24) /*!< DDRPHY_T::DTDR0: DTBYTE3 Position */ +#define DDRPHY_DTDR0_DTBYTE3_Msk (0xfful << DDRPHY_DTDR0_DTBYTE3_Pos) /*!< DDRPHY_T::DTDR0: DTBYTE3 Mask */ + +#define DDRPHY_DTDR1_DTBYTE4_Pos (0) /*!< DDRPHY_T::DTDR1: DTBYTE4 Position */ +#define DDRPHY_DTDR1_DTBYTE4_Msk (0xfful << DDRPHY_DTDR1_DTBYTE4_Pos) /*!< DDRPHY_T::DTDR1: DTBYTE4 Mask */ + +#define DDRPHY_DTDR1_DTBYTE5_Pos (8) /*!< DDRPHY_T::DTDR1: DTBYTE5 Position */ +#define DDRPHY_DTDR1_DTBYTE5_Msk (0xfful << DDRPHY_DTDR1_DTBYTE5_Pos) /*!< DDRPHY_T::DTDR1: DTBYTE5 Mask */ + +#define DDRPHY_DTDR1_DTBYTE6_Pos (16) /*!< DDRPHY_T::DTDR1: DTBYTE6 Position */ +#define DDRPHY_DTDR1_DTBYTE6_Msk (0xfful << DDRPHY_DTDR1_DTBYTE6_Pos) /*!< DDRPHY_T::DTDR1: DTBYTE6 Mask */ + +#define DDRPHY_DTDR1_DTBYTE7_Pos (24) /*!< DDRPHY_T::DTDR1: DTBYTE7 Position */ +#define DDRPHY_DTDR1_DTBYTE7_Msk (0xfful << DDRPHY_DTDR1_DTBYTE7_Pos) /*!< DDRPHY_T::DTDR1: DTBYTE7 Mask */ + +#define DDRPHY_DTEDR0_DTWLMN_Pos (0) /*!< DDRPHY_T::DTEDR0: DTWLMN Position */ +#define DDRPHY_DTEDR0_DTWLMN_Msk (0xfful << DDRPHY_DTEDR0_DTWLMN_Pos) /*!< DDRPHY_T::DTEDR0: DTWLMN Mask */ + +#define DDRPHY_DTEDR0_DTWLMX_Pos (8) /*!< DDRPHY_T::DTEDR0: DTWLMX Position */ +#define DDRPHY_DTEDR0_DTWLMX_Msk (0xfful << DDRPHY_DTEDR0_DTWLMX_Pos) /*!< DDRPHY_T::DTEDR0: DTWLMX Mask */ + +#define DDRPHY_DTEDR0_DTWBMN_Pos (16) /*!< DDRPHY_T::DTEDR0: DTWBMN Position */ +#define DDRPHY_DTEDR0_DTWBMN_Msk (0xfful << DDRPHY_DTEDR0_DTWBMN_Pos) /*!< DDRPHY_T::DTEDR0: DTWBMN Mask */ + +#define DDRPHY_DTEDR0_DTWBMX_Pos (24) /*!< DDRPHY_T::DTEDR0: DTWBMX Position */ +#define DDRPHY_DTEDR0_DTWBMX_Msk (0xfful << DDRPHY_DTEDR0_DTWBMX_Pos) /*!< DDRPHY_T::DTEDR0: DTWBMX Mask */ + +#define DDRPHY_DTEDR1_DTRLMN_Pos (0) /*!< DDRPHY_T::DTEDR1: DTRLMN Position */ +#define DDRPHY_DTEDR1_DTRLMN_Msk (0xfful << DDRPHY_DTEDR1_DTRLMN_Pos) /*!< DDRPHY_T::DTEDR1: DTRLMN Mask */ + +#define DDRPHY_DTEDR1_DTRLMX_Pos (8) /*!< DDRPHY_T::DTEDR1: DTRLMX Position */ +#define DDRPHY_DTEDR1_DTRLMX_Msk (0xfful << DDRPHY_DTEDR1_DTRLMX_Pos) /*!< DDRPHY_T::DTEDR1: DTRLMX Mask */ + +#define DDRPHY_DTEDR1_DTRBMN_Pos (16) /*!< DDRPHY_T::DTEDR1: DTRBMN Position */ +#define DDRPHY_DTEDR1_DTRBMN_Msk (0xfful << DDRPHY_DTEDR1_DTRBMN_Pos) /*!< DDRPHY_T::DTEDR1: DTRBMN Mask */ + +#define DDRPHY_DTEDR1_DTRBMX_Pos (24) /*!< DDRPHY_T::DTEDR1: DTRBMX Position */ +#define DDRPHY_DTEDR1_DTRBMX_Msk (0xfful << DDRPHY_DTEDR1_DTRBMX_Pos) /*!< DDRPHY_T::DTEDR1: DTRBMX Mask */ + +#define DDRPHY_PGCR2_tREFPRD_Pos (0) /*!< DDRPHY_T::PGCR2: tREFPRD Position */ +#define DDRPHY_PGCR2_tREFPRD_Msk (0x3fffful << DDRPHY_PGCR2_tREFPRD_Pos) /*!< DDRPHY_T::PGCR2: tREFPRD Mask */ + +#define DDRPHY_PGCR2_NOBUB_Pos (18) /*!< DDRPHY_T::PGCR2: NOBUB Position */ +#define DDRPHY_PGCR2_NOBUB_Msk (0x1ul << DDRPHY_PGCR2_NOBUB_Pos) /*!< DDRPHY_T::PGCR2: NOBUB Mask */ + +#define DDRPHY_PGCR2_FXDLAT_Pos (19) /*!< DDRPHY_T::PGCR2: FXDLAT Position */ +#define DDRPHY_PGCR2_FXDLAT_Msk (0x1ul << DDRPHY_PGCR2_FXDLAT_Pos) /*!< DDRPHY_T::PGCR2: FXDLAT Mask */ + +#define DDRPHY_PGCR2_DTPMXTMR_Pos (20) /*!< DDRPHY_T::PGCR2: DTPMXTMR Position */ +#define DDRPHY_PGCR2_DTPMXTMR_Msk (0xfful << DDRPHY_PGCR2_DTPMXTMR_Pos) /*!< DDRPHY_T::PGCR2: DTPMXTMR Mask */ + +#define DDRPHY_PGCR2_SHRAC_Pos (28) /*!< DDRPHY_T::PGCR2: SHRAC Position */ +#define DDRPHY_PGCR2_SHRAC_Msk (0x1ul << DDRPHY_PGCR2_SHRAC_Pos) /*!< DDRPHY_T::PGCR2: SHRAC Mask */ + +#define DDRPHY_PGCR2_ACPDDC_Pos (29) /*!< DDRPHY_T::PGCR2: ACPDDC Position */ +#define DDRPHY_PGCR2_ACPDDC_Msk (0x1ul << DDRPHY_PGCR2_ACPDDC_Pos) /*!< DDRPHY_T::PGCR2: ACPDDC Mask */ + +#define DDRPHY_PGCR2_LPMSTRC0_Pos (30) /*!< DDRPHY_T::PGCR2: LPMSTRC0 Position */ +#define DDRPHY_PGCR2_LPMSTRC0_Msk (0x1ul << DDRPHY_PGCR2_LPMSTRC0_Pos) /*!< DDRPHY_T::PGCR2: LPMSTRC0 Mask */ + +#define DDRPHY_PGCR2_DYNACPDD_Pos (31) /*!< DDRPHY_T::PGCR2: DYNACPDD Position */ +#define DDRPHY_PGCR2_DYNACPDD_Msk (0x1ul << DDRPHY_PGCR2_DYNACPDD_Pos) /*!< DDRPHY_T::PGCR2: DYNACPDD Mask */ + +#define DDRPHY_RDIMMGCR0_RDIMM_Pos (0) /*!< DDRPHY_T::RDIMMGCR0: RDIMM Position */ +#define DDRPHY_RDIMMGCR0_RDIMM_Msk (0x1ul << DDRPHY_RDIMMGCR0_RDIMM_Pos) /*!< DDRPHY_T::RDIMMGCR0: RDIMM Mask */ + +#define DDRPHY_RDIMMGCR0_ERRNOREG_Pos (1) /*!< DDRPHY_T::RDIMMGCR0: ERRNOREG Position */ +#define DDRPHY_RDIMMGCR0_ERRNOREG_Msk (0x1ul << DDRPHY_RDIMMGCR0_ERRNOREG_Pos) /*!< DDRPHY_T::RDIMMGCR0: ERRNOREG Mask */ + +#define DDRPHY_RDIMMGCR0_SOPERR_Pos (2) /*!< DDRPHY_T::RDIMMGCR0: SOPERR Position */ +#define DDRPHY_RDIMMGCR0_SOPERR_Msk (0x1ul << DDRPHY_RDIMMGCR0_SOPERR_Pos) /*!< DDRPHY_T::RDIMMGCR0: SOPERR Mask */ + +#define DDRPHY_RDIMMGCR0_PARINODT_Pos (14) /*!< DDRPHY_T::RDIMMGCR0: PARINODT Position */ +#define DDRPHY_RDIMMGCR0_PARINODT_Msk (0x1ul << DDRPHY_RDIMMGCR0_PARINODT_Pos) /*!< DDRPHY_T::RDIMMGCR0: PARINODT Mask */ + +#define DDRPHY_RDIMMGCR0_PARINPDD_Pos (15) /*!< DDRPHY_T::RDIMMGCR0: PARINPDD Position */ +#define DDRPHY_RDIMMGCR0_PARINPDD_Msk (0x1ul << DDRPHY_RDIMMGCR0_PARINPDD_Pos) /*!< DDRPHY_T::RDIMMGCR0: PARINPDD Mask */ + +#define DDRPHY_RDIMMGCR0_PARINPDR_Pos (16) /*!< DDRPHY_T::RDIMMGCR0: PARINPDR Position */ +#define DDRPHY_RDIMMGCR0_PARINPDR_Msk (0x1ul << DDRPHY_RDIMMGCR0_PARINPDR_Pos) /*!< DDRPHY_T::RDIMMGCR0: PARINPDR Mask */ + +#define DDRPHY_RDIMMGCR0_PARINIOM_Pos (17) /*!< DDRPHY_T::RDIMMGCR0: PARINIOM Position */ +#define DDRPHY_RDIMMGCR0_PARINIOM_Msk (0x1ul << DDRPHY_RDIMMGCR0_PARINIOM_Pos) /*!< DDRPHY_T::RDIMMGCR0: PARINIOM Mask */ + +#define DDRPHY_RDIMMGCR0_PARINOE_Pos (18) /*!< DDRPHY_T::RDIMMGCR0: PARINOE Position */ +#define DDRPHY_RDIMMGCR0_PARINOE_Msk (0x1ul << DDRPHY_RDIMMGCR0_PARINOE_Pos) /*!< DDRPHY_T::RDIMMGCR0: PARINOE Mask */ + +#define DDRPHY_RDIMMGCR0_ERROUTODT_Pos (19) /*!< DDRPHY_T::RDIMMGCR0: ERROUTODT Position*/ +#define DDRPHY_RDIMMGCR0_ERROUTODT_Msk (0x1ul << DDRPHY_RDIMMGCR0_ERROUTODT_Pos) /*!< DDRPHY_T::RDIMMGCR0: ERROUTODT Mask */ + +#define DDRPHY_RDIMMGCR0_ERROUTPDD_Pos (20) /*!< DDRPHY_T::RDIMMGCR0: ERROUTPDD Position*/ +#define DDRPHY_RDIMMGCR0_ERROUTPDD_Msk (0x1ul << DDRPHY_RDIMMGCR0_ERROUTPDD_Pos) /*!< DDRPHY_T::RDIMMGCR0: ERROUTPDD Mask */ + +#define DDRPHY_RDIMMGCR0_ERROUTPDR_Pos (21) /*!< DDRPHY_T::RDIMMGCR0: ERROUTPDR Position*/ +#define DDRPHY_RDIMMGCR0_ERROUTPDR_Msk (0x1ul << DDRPHY_RDIMMGCR0_ERROUTPDR_Pos) /*!< DDRPHY_T::RDIMMGCR0: ERROUTPDR Mask */ + +#define DDRPHY_RDIMMGCR0_ERROUTIOM_Pos (22) /*!< DDRPHY_T::RDIMMGCR0: ERROUTIOM Position*/ +#define DDRPHY_RDIMMGCR0_ERROUTIOM_Msk (0x1ul << DDRPHY_RDIMMGCR0_ERROUTIOM_Pos) /*!< DDRPHY_T::RDIMMGCR0: ERROUTIOM Mask */ + +#define DDRPHY_RDIMMGCR0_ERROUTOE_Pos (23) /*!< DDRPHY_T::RDIMMGCR0: ERROUTOE Position */ +#define DDRPHY_RDIMMGCR0_ERROUTOE_Msk (0x1ul << DDRPHY_RDIMMGCR0_ERROUTOE_Pos) /*!< DDRPHY_T::RDIMMGCR0: ERROUTOE Mask */ + +#define DDRPHY_RDIMMGCR0_RDIMMODT_Pos (24) /*!< DDRPHY_T::RDIMMGCR0: RDIMMODT Position */ +#define DDRPHY_RDIMMGCR0_RDIMMODT_Msk (0x1ul << DDRPHY_RDIMMGCR0_RDIMMODT_Pos) /*!< DDRPHY_T::RDIMMGCR0: RDIMMODT Mask */ + +#define DDRPHY_RDIMMGCR0_RDIMMPDD_Pos (25) /*!< DDRPHY_T::RDIMMGCR0: RDIMMPDD Position */ +#define DDRPHY_RDIMMGCR0_RDIMMPDD_Msk (0x1ul << DDRPHY_RDIMMGCR0_RDIMMPDD_Pos) /*!< DDRPHY_T::RDIMMGCR0: RDIMMPDD Mask */ + +#define DDRPHY_RDIMMGCR0_RDIMMPDR_Pos (26) /*!< DDRPHY_T::RDIMMGCR0: RDIMMPDR Position */ +#define DDRPHY_RDIMMGCR0_RDIMMPDR_Msk (0x1ul << DDRPHY_RDIMMGCR0_RDIMMPDR_Pos) /*!< DDRPHY_T::RDIMMGCR0: RDIMMPDR Mask */ + +#define DDRPHY_RDIMMGCR0_RDIMMIOM_Pos (27) /*!< DDRPHY_T::RDIMMGCR0: RDIMMIOM Position */ +#define DDRPHY_RDIMMGCR0_RDIMMIOM_Msk (0x1ul << DDRPHY_RDIMMGCR0_RDIMMIOM_Pos) /*!< DDRPHY_T::RDIMMGCR0: RDIMMIOM Mask */ + +#define DDRPHY_RDIMMGCR0_QCSENOE_Pos (28) /*!< DDRPHY_T::RDIMMGCR0: QCSENOE Position */ +#define DDRPHY_RDIMMGCR0_QCSENOE_Msk (0x1ul << DDRPHY_RDIMMGCR0_QCSENOE_Pos) /*!< DDRPHY_T::RDIMMGCR0: QCSENOE Mask */ + +#define DDRPHY_RDIMMGCR0_MIRROROE_Pos (29) /*!< DDRPHY_T::RDIMMGCR0: MIRROROE Position */ +#define DDRPHY_RDIMMGCR0_MIRROROE_Msk (0x1ul << DDRPHY_RDIMMGCR0_MIRROROE_Pos) /*!< DDRPHY_T::RDIMMGCR0: MIRROROE Mask */ + +#define DDRPHY_RDIMMGCR0_QCSEN_Pos (30) /*!< DDRPHY_T::RDIMMGCR0: QCSEN Position */ +#define DDRPHY_RDIMMGCR0_QCSEN_Msk (0x1ul << DDRPHY_RDIMMGCR0_QCSEN_Pos) /*!< DDRPHY_T::RDIMMGCR0: QCSEN Mask */ + +#define DDRPHY_RDIMMGCR0_MIRROR_Pos (31) /*!< DDRPHY_T::RDIMMGCR0: MIRROR Position */ +#define DDRPHY_RDIMMGCR0_MIRROR_Msk (0x1ul << DDRPHY_RDIMMGCR0_MIRROR_Pos) /*!< DDRPHY_T::RDIMMGCR0: MIRROR Mask */ + +#define DDRPHY_RDIMMGCR1_tBCSTAB_Pos (0) /*!< DDRPHY_T::RDIMMGCR1: tBCSTAB Position */ +#define DDRPHY_RDIMMGCR1_tBCSTAB_Msk (0xffful << DDRPHY_RDIMMGCR1_tBCSTAB_Pos) /*!< DDRPHY_T::RDIMMGCR1: tBCSTAB Mask */ + +#define DDRPHY_RDIMMGCR1_tBCMRD_Pos (12) /*!< DDRPHY_T::RDIMMGCR1: tBCMRD Position */ +#define DDRPHY_RDIMMGCR1_tBCMRD_Msk (0x7ul << DDRPHY_RDIMMGCR1_tBCMRD_Pos) /*!< DDRPHY_T::RDIMMGCR1: tBCMRD Mask */ + +#define DDRPHY_RDIMMGCR1_CRINIT_Pos (16) /*!< DDRPHY_T::RDIMMGCR1: CRINIT Position */ +#define DDRPHY_RDIMMGCR1_CRINIT_Msk (0xfffful << DDRPHY_RDIMMGCR1_CRINIT_Pos) /*!< DDRPHY_T::RDIMMGCR1: CRINIT Mask */ + +#define DDRPHY_RDIMMCR0_RC0_Pos (0) /*!< DDRPHY_T::RDIMMCR0: RC0 Position */ +#define DDRPHY_RDIMMCR0_RC0_Msk (0xful << DDRPHY_RDIMMCR0_RC0_Pos) /*!< DDRPHY_T::RDIMMCR0: RC0 Mask */ + +#define DDRPHY_RDIMMCR0_RC1_Pos (4) /*!< DDRPHY_T::RDIMMCR0: RC1 Position */ +#define DDRPHY_RDIMMCR0_RC1_Msk (0xful << DDRPHY_RDIMMCR0_RC1_Pos) /*!< DDRPHY_T::RDIMMCR0: RC1 Mask */ + +#define DDRPHY_RDIMMCR0_RC2_Pos (8) /*!< DDRPHY_T::RDIMMCR0: RC2 Position */ +#define DDRPHY_RDIMMCR0_RC2_Msk (0xful << DDRPHY_RDIMMCR0_RC2_Pos) /*!< DDRPHY_T::RDIMMCR0: RC2 Mask */ + +#define DDRPHY_RDIMMCR0_RC3_Pos (12) /*!< DDRPHY_T::RDIMMCR0: RC3 Position */ +#define DDRPHY_RDIMMCR0_RC3_Msk (0xful << DDRPHY_RDIMMCR0_RC3_Pos) /*!< DDRPHY_T::RDIMMCR0: RC3 Mask */ + +#define DDRPHY_RDIMMCR0_RC4_Pos (16) /*!< DDRPHY_T::RDIMMCR0: RC4 Position */ +#define DDRPHY_RDIMMCR0_RC4_Msk (0xful << DDRPHY_RDIMMCR0_RC4_Pos) /*!< DDRPHY_T::RDIMMCR0: RC4 Mask */ + +#define DDRPHY_RDIMMCR0_RC5_Pos (20) /*!< DDRPHY_T::RDIMMCR0: RC5 Position */ +#define DDRPHY_RDIMMCR0_RC5_Msk (0xful << DDRPHY_RDIMMCR0_RC5_Pos) /*!< DDRPHY_T::RDIMMCR0: RC5 Mask */ + +#define DDRPHY_RDIMMCR0_RC6_Pos (24) /*!< DDRPHY_T::RDIMMCR0: RC6 Position */ +#define DDRPHY_RDIMMCR0_RC6_Msk (0xful << DDRPHY_RDIMMCR0_RC6_Pos) /*!< DDRPHY_T::RDIMMCR0: RC6 Mask */ + +#define DDRPHY_RDIMMCR0_RC7_Pos (28) /*!< DDRPHY_T::RDIMMCR0: RC7 Position */ +#define DDRPHY_RDIMMCR0_RC7_Msk (0xful << DDRPHY_RDIMMCR0_RC7_Pos) /*!< DDRPHY_T::RDIMMCR0: RC7 Mask */ + +#define DDRPHY_RDIMMCR1_RC8_Pos (0) /*!< DDRPHY_T::RDIMMCR1: RC8 Position */ +#define DDRPHY_RDIMMCR1_RC8_Msk (0xful << DDRPHY_RDIMMCR1_RC8_Pos) /*!< DDRPHY_T::RDIMMCR1: RC8 Mask */ + +#define DDRPHY_RDIMMCR1_RC9_Pos (4) /*!< DDRPHY_T::RDIMMCR1: RC9 Position */ +#define DDRPHY_RDIMMCR1_RC9_Msk (0xful << DDRPHY_RDIMMCR1_RC9_Pos) /*!< DDRPHY_T::RDIMMCR1: RC9 Mask */ + +#define DDRPHY_RDIMMCR1_RC10_Pos (8) /*!< DDRPHY_T::RDIMMCR1: RC10 Position */ +#define DDRPHY_RDIMMCR1_RC10_Msk (0xful << DDRPHY_RDIMMCR1_RC10_Pos) /*!< DDRPHY_T::RDIMMCR1: RC10 Mask */ + +#define DDRPHY_RDIMMCR1_RC11_Pos (12) /*!< DDRPHY_T::RDIMMCR1: RC11 Position */ +#define DDRPHY_RDIMMCR1_RC11_Msk (0xful << DDRPHY_RDIMMCR1_RC11_Pos) /*!< DDRPHY_T::RDIMMCR1: RC11 Mask */ + +#define DDRPHY_RDIMMCR1_RC12_Pos (16) /*!< DDRPHY_T::RDIMMCR1: RC12 Position */ +#define DDRPHY_RDIMMCR1_RC12_Msk (0xful << DDRPHY_RDIMMCR1_RC12_Pos) /*!< DDRPHY_T::RDIMMCR1: RC12 Mask */ + +#define DDRPHY_RDIMMCR1_RC13_Pos (20) /*!< DDRPHY_T::RDIMMCR1: RC13 Position */ +#define DDRPHY_RDIMMCR1_RC13_Msk (0xful << DDRPHY_RDIMMCR1_RC13_Pos) /*!< DDRPHY_T::RDIMMCR1: RC13 Mask */ + +#define DDRPHY_RDIMMCR1_RC14_Pos (24) /*!< DDRPHY_T::RDIMMCR1: RC14 Position */ +#define DDRPHY_RDIMMCR1_RC14_Msk (0xful << DDRPHY_RDIMMCR1_RC14_Pos) /*!< DDRPHY_T::RDIMMCR1: RC14 Mask */ + +#define DDRPHY_RDIMMCR1_RC15_Pos (28) /*!< DDRPHY_T::RDIMMCR1: RC15 Position */ +#define DDRPHY_RDIMMCR1_RC15_Msk (0xful << DDRPHY_RDIMMCR1_RC15_Pos) /*!< DDRPHY_T::RDIMMCR1: RC15 Mask */ + +#define DDRPHY_DCUAR_CWADDR_Pos (0) /*!< DDRPHY_T::DCUAR: CWADDR Position */ +#define DDRPHY_DCUAR_CWADDR_Msk (0xful << DDRPHY_DCUAR_CWADDR_Pos) /*!< DDRPHY_T::DCUAR: CWADDR Mask */ + +#define DDRPHY_DCUAR_CSADDR_Pos (4) /*!< DDRPHY_T::DCUAR: CSADDR Position */ +#define DDRPHY_DCUAR_CSADDR_Msk (0xful << DDRPHY_DCUAR_CSADDR_Pos) /*!< DDRPHY_T::DCUAR: CSADDR Mask */ + +#define DDRPHY_DCUAR_CSEL_Pos (8) /*!< DDRPHY_T::DCUAR: CSEL Position */ +#define DDRPHY_DCUAR_CSEL_Msk (0x3ul << DDRPHY_DCUAR_CSEL_Pos) /*!< DDRPHY_T::DCUAR: CSEL Mask */ + +#define DDRPHY_DCUAR_INCA_Pos (10) /*!< DDRPHY_T::DCUAR: INCA Position */ +#define DDRPHY_DCUAR_INCA_Msk (0x1ul << DDRPHY_DCUAR_INCA_Pos) /*!< DDRPHY_T::DCUAR: INCA Mask */ + +#define DDRPHY_DCUAR_ATYPE_Pos (11) /*!< DDRPHY_T::DCUAR: ATYPE Position */ +#define DDRPHY_DCUAR_ATYPE_Msk (0x1ul << DDRPHY_DCUAR_ATYPE_Pos) /*!< DDRPHY_T::DCUAR: ATYPE Mask */ + +#define DDRPHY_DCUDR_CDATA_Pos (0) /*!< DDRPHY_T::DCUDR: CDATA Position */ +#define DDRPHY_DCUDR_CDATA_Msk (0xfffffffful << DDRPHY_DCUDR_CDATA_Pos) /*!< DDRPHY_T::DCUDR: CDATA Mask */ + +#define DDRPHY_DCURR_DINST_Pos (0) /*!< DDRPHY_T::DCURR: DINST Position */ +#define DDRPHY_DCURR_DINST_Msk (0xful << DDRPHY_DCURR_DINST_Pos) /*!< DDRPHY_T::DCURR: DINST Mask */ + +#define DDRPHY_DCURR_SADDR_Pos (4) /*!< DDRPHY_T::DCURR: SADDR Position */ +#define DDRPHY_DCURR_SADDR_Msk (0xful << DDRPHY_DCURR_SADDR_Pos) /*!< DDRPHY_T::DCURR: SADDR Mask */ + +#define DDRPHY_DCURR_EADDR_Pos (8) /*!< DDRPHY_T::DCURR: EADDR Position */ +#define DDRPHY_DCURR_EADDR_Msk (0xful << DDRPHY_DCURR_EADDR_Pos) /*!< DDRPHY_T::DCURR: EADDR Mask */ + +#define DDRPHY_DCURR_NFAIL_Pos (12) /*!< DDRPHY_T::DCURR: NFAIL Position */ +#define DDRPHY_DCURR_NFAIL_Msk (0xfful << DDRPHY_DCURR_NFAIL_Pos) /*!< DDRPHY_T::DCURR: NFAIL Mask */ + +#define DDRPHY_DCURR_SONF_Pos (20) /*!< DDRPHY_T::DCURR: SONF Position */ +#define DDRPHY_DCURR_SONF_Msk (0x1ul << DDRPHY_DCURR_SONF_Pos) /*!< DDRPHY_T::DCURR: SONF Mask */ + +#define DDRPHY_DCURR_SCOF_Pos (21) /*!< DDRPHY_T::DCURR: SCOF Position */ +#define DDRPHY_DCURR_SCOF_Msk (0x1ul << DDRPHY_DCURR_SCOF_Pos) /*!< DDRPHY_T::DCURR: SCOF Mask */ + +#define DDRPHY_DCURR_RCEN_Pos (22) /*!< DDRPHY_T::DCURR: RCEN Position */ +#define DDRPHY_DCURR_RCEN_Msk (0x1ul << DDRPHY_DCURR_RCEN_Pos) /*!< DDRPHY_T::DCURR: RCEN Mask */ + +#define DDRPHY_DCURR_XCEN_Pos (23) /*!< DDRPHY_T::DCURR: XCEN Position */ +#define DDRPHY_DCURR_XCEN_Msk (0x1ul << DDRPHY_DCURR_XCEN_Pos) /*!< DDRPHY_T::DCURR: XCEN Mask */ + +#define DDRPHY_DCULR_LSADDR_Pos (0) /*!< DDRPHY_T::DCULR: LSADDR Position */ +#define DDRPHY_DCULR_LSADDR_Msk (0xful << DDRPHY_DCULR_LSADDR_Pos) /*!< DDRPHY_T::DCULR: LSADDR Mask */ + +#define DDRPHY_DCULR_LEADDR_Pos (4) /*!< DDRPHY_T::DCULR: LEADDR Position */ +#define DDRPHY_DCULR_LEADDR_Msk (0xful << DDRPHY_DCULR_LEADDR_Pos) /*!< DDRPHY_T::DCULR: LEADDR Mask */ + +#define DDRPHY_DCULR_LCNT_Pos (8) /*!< DDRPHY_T::DCULR: LCNT Position */ +#define DDRPHY_DCULR_LCNT_Msk (0xfful << DDRPHY_DCULR_LCNT_Pos) /*!< DDRPHY_T::DCULR: LCNT Mask */ + +#define DDRPHY_DCULR_LINF_Pos (16) /*!< DDRPHY_T::DCULR: LINF Position */ +#define DDRPHY_DCULR_LINF_Msk (0x1ul << DDRPHY_DCULR_LINF_Pos) /*!< DDRPHY_T::DCULR: LINF Mask */ + +#define DDRPHY_DCULR_IDA_Pos (17) /*!< DDRPHY_T::DCULR: IDA Position */ +#define DDRPHY_DCULR_IDA_Msk (0x1ul << DDRPHY_DCULR_IDA_Pos) /*!< DDRPHY_T::DCULR: IDA Mask */ + +#define DDRPHY_DCULR_XLEADDR_Pos (28) /*!< DDRPHY_T::DCULR: XLEADDR Position */ +#define DDRPHY_DCULR_XLEADDR_Msk (0xful << DDRPHY_DCULR_XLEADDR_Pos) /*!< DDRPHY_T::DCULR: XLEADDR Mask */ + +#define DDRPHY_DCUGCR_RCSW_Pos (0) /*!< DDRPHY_T::DCUGCR: RCSW Position */ +#define DDRPHY_DCUGCR_RCSW_Msk (0xfffful << DDRPHY_DCUGCR_RCSW_Pos) /*!< DDRPHY_T::DCUGCR: RCSW Mask */ + +#define DDRPHY_DCUTPR_tDCUT0_Pos (0) /*!< DDRPHY_T::DCUTPR: tDCUT0 Position */ +#define DDRPHY_DCUTPR_tDCUT0_Msk (0xfful << DDRPHY_DCUTPR_tDCUT0_Pos) /*!< DDRPHY_T::DCUTPR: tDCUT0 Mask */ + +#define DDRPHY_DCUTPR_tDCUT1_Pos (8) /*!< DDRPHY_T::DCUTPR: tDCUT1 Position */ +#define DDRPHY_DCUTPR_tDCUT1_Msk (0xfful << DDRPHY_DCUTPR_tDCUT1_Pos) /*!< DDRPHY_T::DCUTPR: tDCUT1 Mask */ + +#define DDRPHY_DCUTPR_tDCUT2_Pos (16) /*!< DDRPHY_T::DCUTPR: tDCUT2 Position */ +#define DDRPHY_DCUTPR_tDCUT2_Msk (0xfful << DDRPHY_DCUTPR_tDCUT2_Pos) /*!< DDRPHY_T::DCUTPR: tDCUT2 Mask */ + +#define DDRPHY_DCUTPR_tDCUT3_Pos (24) /*!< DDRPHY_T::DCUTPR: tDCUT3 Position */ +#define DDRPHY_DCUTPR_tDCUT3_Msk (0xfful << DDRPHY_DCUTPR_tDCUT3_Pos) /*!< DDRPHY_T::DCUTPR: tDCUT3 Mask */ + +#define DDRPHY_DCUSR0_RDONE_Pos (0) /*!< DDRPHY_T::DCUSR0: RDONE Position */ +#define DDRPHY_DCUSR0_RDONE_Msk (0x1ul << DDRPHY_DCUSR0_RDONE_Pos) /*!< DDRPHY_T::DCUSR0: RDONE Mask */ + +#define DDRPHY_DCUSR0_CFAIL_Pos (1) /*!< DDRPHY_T::DCUSR0: CFAIL Position */ +#define DDRPHY_DCUSR0_CFAIL_Msk (0x1ul << DDRPHY_DCUSR0_CFAIL_Pos) /*!< DDRPHY_T::DCUSR0: CFAIL Mask */ + +#define DDRPHY_DCUSR0_CFULL_Pos (2) /*!< DDRPHY_T::DCUSR0: CFULL Position */ +#define DDRPHY_DCUSR0_CFULL_Msk (0x1ul << DDRPHY_DCUSR0_CFULL_Pos) /*!< DDRPHY_T::DCUSR0: CFULL Mask */ + +#define DDRPHY_DCUSR1_RDCNT_Pos (0) /*!< DDRPHY_T::DCUSR1: RDCNT Position */ +#define DDRPHY_DCUSR1_RDCNT_Msk (0xfffful << DDRPHY_DCUSR1_RDCNT_Pos) /*!< DDRPHY_T::DCUSR1: RDCNT Mask */ + +#define DDRPHY_DCUSR1_FLCNT_Pos (16) /*!< DDRPHY_T::DCUSR1: FLCNT Position */ +#define DDRPHY_DCUSR1_FLCNT_Msk (0xfful << DDRPHY_DCUSR1_FLCNT_Pos) /*!< DDRPHY_T::DCUSR1: FLCNT Mask */ + +#define DDRPHY_DCUSR1_LPCNT_Pos (24) /*!< DDRPHY_T::DCUSR1: LPCNT Position */ +#define DDRPHY_DCUSR1_LPCNT_Msk (0xfful << DDRPHY_DCUSR1_LPCNT_Pos) /*!< DDRPHY_T::DCUSR1: LPCNT Mask */ + +#define DDRPHY_BISTRR_BINST_Pos (0) /*!< DDRPHY_T::BISTRR: BINST Position */ +#define DDRPHY_BISTRR_BINST_Msk (0x7ul << DDRPHY_BISTRR_BINST_Pos) /*!< DDRPHY_T::BISTRR: BINST Mask */ + +#define DDRPHY_BISTRR_BMODE_Pos (3) /*!< DDRPHY_T::BISTRR: BMODE Position */ +#define DDRPHY_BISTRR_BMODE_Msk (0x1ul << DDRPHY_BISTRR_BMODE_Pos) /*!< DDRPHY_T::BISTRR: BMODE Mask */ + +#define DDRPHY_BISTRR_BINF_Pos (4) /*!< DDRPHY_T::BISTRR: BINF Position */ +#define DDRPHY_BISTRR_BINF_Msk (0x1ul << DDRPHY_BISTRR_BINF_Pos) /*!< DDRPHY_T::BISTRR: BINF Mask */ + +#define DDRPHY_BISTRR_NFAIL_Pos (5) /*!< DDRPHY_T::BISTRR: NFAIL Position */ +#define DDRPHY_BISTRR_NFAIL_Msk (0xfful << DDRPHY_BISTRR_NFAIL_Pos) /*!< DDRPHY_T::BISTRR: NFAIL Mask */ + +#define DDRPHY_BISTRR_BSONF_Pos (13) /*!< DDRPHY_T::BISTRR: BSONF Position */ +#define DDRPHY_BISTRR_BSONF_Msk (0x1ul << DDRPHY_BISTRR_BSONF_Pos) /*!< DDRPHY_T::BISTRR: BSONF Mask */ + +#define DDRPHY_BISTRR_BDXEN_Pos (14) /*!< DDRPHY_T::BISTRR: BDXEN Position */ +#define DDRPHY_BISTRR_BDXEN_Msk (0x1ul << DDRPHY_BISTRR_BDXEN_Pos) /*!< DDRPHY_T::BISTRR: BDXEN Mask */ + +#define DDRPHY_BISTRR_BACEN_Pos (15) /*!< DDRPHY_T::BISTRR: BACEN Position */ +#define DDRPHY_BISTRR_BACEN_Msk (0x1ul << DDRPHY_BISTRR_BACEN_Pos) /*!< DDRPHY_T::BISTRR: BACEN Mask */ + +#define DDRPHY_BISTRR_BDMEN_Pos (16) /*!< DDRPHY_T::BISTRR: BDMEN Position */ +#define DDRPHY_BISTRR_BDMEN_Msk (0x1ul << DDRPHY_BISTRR_BDMEN_Pos) /*!< DDRPHY_T::BISTRR: BDMEN Mask */ + +#define DDRPHY_BISTRR_BDPAT_Pos (17) /*!< DDRPHY_T::BISTRR: BDPAT Position */ +#define DDRPHY_BISTRR_BDPAT_Msk (0x3ul << DDRPHY_BISTRR_BDPAT_Pos) /*!< DDRPHY_T::BISTRR: BDPAT Mask */ + +#define DDRPHY_BISTRR_BDXSEL_Pos (19) /*!< DDRPHY_T::BISTRR: BDXSEL Position */ +#define DDRPHY_BISTRR_BDXSEL_Msk (0xful << DDRPHY_BISTRR_BDXSEL_Pos) /*!< DDRPHY_T::BISTRR: BDXSEL Mask */ + +#define DDRPHY_BISTRR_BCKSEL_Pos (23) /*!< DDRPHY_T::BISTRR: BCKSEL Position */ +#define DDRPHY_BISTRR_BCKSEL_Msk (0x3ul << DDRPHY_BISTRR_BCKSEL_Pos) /*!< DDRPHY_T::BISTRR: BCKSEL Mask */ + +#define DDRPHY_BISTRR_BCCSEL_Pos (25) /*!< DDRPHY_T::BISTRR: BCCSEL Position */ +#define DDRPHY_BISTRR_BCCSEL_Msk (0x3ul << DDRPHY_BISTRR_BCCSEL_Pos) /*!< DDRPHY_T::BISTRR: BCCSEL Mask */ + +#define DDRPHY_BISTWCR_BWCNT_Pos (0) /*!< DDRPHY_T::BISTWCR: BWCNT Position */ +#define DDRPHY_BISTWCR_BWCNT_Msk (0xfffful << DDRPHY_BISTWCR_BWCNT_Pos) /*!< DDRPHY_T::BISTWCR: BWCNT Mask */ + +#define DDRPHY_BISTMSKR0_AMSK_Pos (0) /*!< DDRPHY_T::BISTMSKR0: AMSK Position */ +#define DDRPHY_BISTMSKR0_AMSK_Msk (0xfffful << DDRPHY_BISTMSKR0_AMSK_Pos) /*!< DDRPHY_T::BISTMSKR0: AMSK Mask */ + +#define DDRPHY_BISTMSKR0_BAMSK_Pos (16) /*!< DDRPHY_T::BISTMSKR0: BAMSK Position */ +#define DDRPHY_BISTMSKR0_BAMSK_Msk (0x7ul << DDRPHY_BISTMSKR0_BAMSK_Pos) /*!< DDRPHY_T::BISTMSKR0: BAMSK Mask */ + +#define DDRPHY_BISTMSKR0_WEMSK_Pos (19) /*!< DDRPHY_T::BISTMSKR0: WEMSK Position */ +#define DDRPHY_BISTMSKR0_WEMSK_Msk (0x1ul << DDRPHY_BISTMSKR0_WEMSK_Pos) /*!< DDRPHY_T::BISTMSKR0: WEMSK Mask */ + +#define DDRPHY_BISTMSKR0_CKEMSK_Pos (20) /*!< DDRPHY_T::BISTMSKR0: CKEMSK Position */ +#define DDRPHY_BISTMSKR0_CKEMSK_Msk (0xful << DDRPHY_BISTMSKR0_CKEMSK_Pos) /*!< DDRPHY_T::BISTMSKR0: CKEMSK Mask */ + +#define DDRPHY_BISTMSKR0_CSMSK_Pos (24) /*!< DDRPHY_T::BISTMSKR0: CSMSK Position */ +#define DDRPHY_BISTMSKR0_CSMSK_Msk (0xful << DDRPHY_BISTMSKR0_CSMSK_Pos) /*!< DDRPHY_T::BISTMSKR0: CSMSK Mask */ + +#define DDRPHY_BISTMSKR0_ODTMSK_Pos (28) /*!< DDRPHY_T::BISTMSKR0: ODTMSK Position */ +#define DDRPHY_BISTMSKR0_ODTMSK_Msk (0xful << DDRPHY_BISTMSKR0_ODTMSK_Pos) /*!< DDRPHY_T::BISTMSKR0: ODTMSK Mask */ + +#define DDRPHY_BISTMSKR1_RASMSK_Pos (0) /*!< DDRPHY_T::BISTMSKR1: RASMSK Position */ +#define DDRPHY_BISTMSKR1_RASMSK_Msk (0x1ul << DDRPHY_BISTMSKR1_RASMSK_Pos) /*!< DDRPHY_T::BISTMSKR1: RASMSK Mask */ + +#define DDRPHY_BISTMSKR1_CASMSK_Pos (1) /*!< DDRPHY_T::BISTMSKR1: CASMSK Position */ +#define DDRPHY_BISTMSKR1_CASMSK_Msk (0x1ul << DDRPHY_BISTMSKR1_CASMSK_Pos) /*!< DDRPHY_T::BISTMSKR1: CASMSK Mask */ + +#define DDRPHY_BISTMSKR1_PARMSK_Pos (27) /*!< DDRPHY_T::BISTMSKR1: PARMSK Position */ +#define DDRPHY_BISTMSKR1_PARMSK_Msk (0x1ul << DDRPHY_BISTMSKR1_PARMSK_Pos) /*!< DDRPHY_T::BISTMSKR1: PARMSK Mask */ + +#define DDRPHY_BISTMSKR1_DMMSK_Pos (28) /*!< DDRPHY_T::BISTMSKR1: DMMSK Position */ +#define DDRPHY_BISTMSKR1_DMMSK_Msk (0xful << DDRPHY_BISTMSKR1_DMMSK_Pos) /*!< DDRPHY_T::BISTMSKR1: DMMSK Mask */ + +#define DDRPHY_BISTMSKR2_DQMSK_Pos (0) /*!< DDRPHY_T::BISTMSKR2: DQMSK Position */ +#define DDRPHY_BISTMSKR2_DQMSK_Msk (0xfffffffful << DDRPHY_BISTMSKR2_DQMSK_Pos) /*!< DDRPHY_T::BISTMSKR2: DQMSK Mask */ + +#define DDRPHY_BISTLSR_SEED_Pos (0) /*!< DDRPHY_T::BISTLSR: SEED Position */ +#define DDRPHY_BISTLSR_SEED_Msk (0xfffffffful << DDRPHY_BISTLSR_SEED_Pos) /*!< DDRPHY_T::BISTLSR: SEED Mask */ + +#define DDRPHY_BISTAR0_BCOL_Pos (0) /*!< DDRPHY_T::BISTAR0: BCOL Position */ +#define DDRPHY_BISTAR0_BCOL_Msk (0xffful << DDRPHY_BISTAR0_BCOL_Pos) /*!< DDRPHY_T::BISTAR0: BCOL Mask */ + +#define DDRPHY_BISTAR0_BROW_Pos (12) /*!< DDRPHY_T::BISTAR0: BROW Position */ +#define DDRPHY_BISTAR0_BROW_Msk (0xfffful << DDRPHY_BISTAR0_BROW_Pos) /*!< DDRPHY_T::BISTAR0: BROW Mask */ + +#define DDRPHY_BISTAR0_BBANK_Pos (28) /*!< DDRPHY_T::BISTAR0: BBANK Position */ +#define DDRPHY_BISTAR0_BBANK_Msk (0x7ul << DDRPHY_BISTAR0_BBANK_Pos) /*!< DDRPHY_T::BISTAR0: BBANK Mask */ + +#define DDRPHY_BISTAR1_BRANK_Pos (0) /*!< DDRPHY_T::BISTAR1: BRANK Position */ +#define DDRPHY_BISTAR1_BRANK_Msk (0x3ul << DDRPHY_BISTAR1_BRANK_Pos) /*!< DDRPHY_T::BISTAR1: BRANK Mask */ + +#define DDRPHY_BISTAR1_BMRANK_Pos (2) /*!< DDRPHY_T::BISTAR1: BMRANK Position */ +#define DDRPHY_BISTAR1_BMRANK_Msk (0x3ul << DDRPHY_BISTAR1_BMRANK_Pos) /*!< DDRPHY_T::BISTAR1: BMRANK Mask */ + +#define DDRPHY_BISTAR1_BAINC_Pos (4) /*!< DDRPHY_T::BISTAR1: BAINC Position */ +#define DDRPHY_BISTAR1_BAINC_Msk (0xffful << DDRPHY_BISTAR1_BAINC_Pos) /*!< DDRPHY_T::BISTAR1: BAINC Mask */ + +#define DDRPHY_BISTAR2_BMCOL_Pos (0) /*!< DDRPHY_T::BISTAR2: BMCOL Position */ +#define DDRPHY_BISTAR2_BMCOL_Msk (0xffful << DDRPHY_BISTAR2_BMCOL_Pos) /*!< DDRPHY_T::BISTAR2: BMCOL Mask */ + +#define DDRPHY_BISTAR2_BMROW_Pos (12) /*!< DDRPHY_T::BISTAR2: BMROW Position */ +#define DDRPHY_BISTAR2_BMROW_Msk (0xfffful << DDRPHY_BISTAR2_BMROW_Pos) /*!< DDRPHY_T::BISTAR2: BMROW Mask */ + +#define DDRPHY_BISTAR2_BMBANK_Pos (28) /*!< DDRPHY_T::BISTAR2: BMBANK Position */ +#define DDRPHY_BISTAR2_BMBANK_Msk (0x7ul << DDRPHY_BISTAR2_BMBANK_Pos) /*!< DDRPHY_T::BISTAR2: BMBANK Mask */ + +#define DDRPHY_BISTUDPR_BUDP0_Pos (0) /*!< DDRPHY_T::BISTUDPR: BUDP0 Position */ +#define DDRPHY_BISTUDPR_BUDP0_Msk (0xfffful << DDRPHY_BISTUDPR_BUDP0_Pos) /*!< DDRPHY_T::BISTUDPR: BUDP0 Mask */ + +#define DDRPHY_BISTUDPR_BUDP1_Pos (16) /*!< DDRPHY_T::BISTUDPR: BUDP1 Position */ +#define DDRPHY_BISTUDPR_BUDP1_Msk (0xfffful << DDRPHY_BISTUDPR_BUDP1_Pos) /*!< DDRPHY_T::BISTUDPR: BUDP1 Mask */ + +#define DDRPHY_BISTGSR_BDONE_Pos (0) /*!< DDRPHY_T::BISTGSR: BDONE Position */ +#define DDRPHY_BISTGSR_BDONE_Msk (0x1ul << DDRPHY_BISTGSR_BDONE_Pos) /*!< DDRPHY_T::BISTGSR: BDONE Mask */ + +#define DDRPHY_BISTGSR_BACERR_Pos (1) /*!< DDRPHY_T::BISTGSR: BACERR Position */ +#define DDRPHY_BISTGSR_BACERR_Msk (0x1ul << DDRPHY_BISTGSR_BACERR_Pos) /*!< DDRPHY_T::BISTGSR: BACERR Mask */ + +#define DDRPHY_BISTGSR_BDXERR_Pos (2) /*!< DDRPHY_T::BISTGSR: BDXERR Position */ +#define DDRPHY_BISTGSR_BDXERR_Msk (0x1ul << DDRPHY_BISTGSR_BDXERR_Pos) /*!< DDRPHY_T::BISTGSR: BDXERR Mask */ + +#define DDRPHY_BISTGSR_PARBER_Pos (16) /*!< DDRPHY_T::BISTGSR: PARBER Position */ +#define DDRPHY_BISTGSR_PARBER_Msk (0x3ul << DDRPHY_BISTGSR_PARBER_Pos) /*!< DDRPHY_T::BISTGSR: PARBER Mask */ + +#define DDRPHY_BISTGSR_DMBER_Pos (20) /*!< DDRPHY_T::BISTGSR: DMBER Position */ +#define DDRPHY_BISTGSR_DMBER_Msk (0xfful << DDRPHY_BISTGSR_DMBER_Pos) /*!< DDRPHY_T::BISTGSR: DMBER Mask */ + +#define DDRPHY_BISTGSR_RASBER_Pos (28) /*!< DDRPHY_T::BISTGSR: RASBER Position */ +#define DDRPHY_BISTGSR_RASBER_Msk (0x3ul << DDRPHY_BISTGSR_RASBER_Pos) /*!< DDRPHY_T::BISTGSR: RASBER Mask */ + +#define DDRPHY_BISTGSR_CASBER_Pos (30) /*!< DDRPHY_T::BISTGSR: CASBER Position */ +#define DDRPHY_BISTGSR_CASBER_Msk (0x3ul << DDRPHY_BISTGSR_CASBER_Pos) /*!< DDRPHY_T::BISTGSR: CASBER Mask */ + +#define DDRPHY_BISTWER_ACWER_Pos (0) /*!< DDRPHY_T::BISTWER: ACWER Position */ +#define DDRPHY_BISTWER_ACWER_Msk (0xfffful << DDRPHY_BISTWER_ACWER_Pos) /*!< DDRPHY_T::BISTWER: ACWER Mask */ + +#define DDRPHY_BISTWER_DXWER_Pos (16) /*!< DDRPHY_T::BISTWER: DXWER Position */ +#define DDRPHY_BISTWER_DXWER_Msk (0xfffful << DDRPHY_BISTWER_DXWER_Pos) /*!< DDRPHY_T::BISTWER: DXWER Mask */ + +#define DDRPHY_BISTBER0_ABER_Pos (0) /*!< DDRPHY_T::BISTBER0: ABER Position */ +#define DDRPHY_BISTBER0_ABER_Msk (0xfffffffful << DDRPHY_BISTBER0_ABER_Pos) /*!< DDRPHY_T::BISTBER0: ABER Mask */ + +#define DDRPHY_BISTBER1_BABER_Pos (0) /*!< DDRPHY_T::BISTBER1: BABER Position */ +#define DDRPHY_BISTBER1_BABER_Msk (0x3ful << DDRPHY_BISTBER1_BABER_Pos) /*!< DDRPHY_T::BISTBER1: BABER Mask */ + +#define DDRPHY_BISTBER1_WEBER_Pos (6) /*!< DDRPHY_T::BISTBER1: WEBER Position */ +#define DDRPHY_BISTBER1_WEBER_Msk (0x3ul << DDRPHY_BISTBER1_WEBER_Pos) /*!< DDRPHY_T::BISTBER1: WEBER Mask */ + +#define DDRPHY_BISTBER1_CKEBER_Pos (8) /*!< DDRPHY_T::BISTBER1: CKEBER Position */ +#define DDRPHY_BISTBER1_CKEBER_Msk (0xfful << DDRPHY_BISTBER1_CKEBER_Pos) /*!< DDRPHY_T::BISTBER1: CKEBER Mask */ + +#define DDRPHY_BISTBER1_CSBER_Pos (16) /*!< DDRPHY_T::BISTBER1: CSBER Position */ +#define DDRPHY_BISTBER1_CSBER_Msk (0xfful << DDRPHY_BISTBER1_CSBER_Pos) /*!< DDRPHY_T::BISTBER1: CSBER Mask */ + +#define DDRPHY_BISTBER1_ODTBER_Pos (24) /*!< DDRPHY_T::BISTBER1: ODTBER Position */ +#define DDRPHY_BISTBER1_ODTBER_Msk (0xfful << DDRPHY_BISTBER1_ODTBER_Pos) /*!< DDRPHY_T::BISTBER1: ODTBER Mask */ + +#define DDRPHY_BISTBER2_DQBER0_Pos (0) /*!< DDRPHY_T::BISTBER2: DQBER0 Position */ +#define DDRPHY_BISTBER2_DQBER0_Msk (0xfffffffful << DDRPHY_BISTBER2_DQBER0_Pos) /*!< DDRPHY_T::BISTBER2: DQBER0 Mask */ + +#define DDRPHY_BISTBER3_DQBER1_Pos (0) /*!< DDRPHY_T::BISTBER3: DQBER1 Position */ +#define DDRPHY_BISTBER3_DQBER1_Msk (0xfffffffful << DDRPHY_BISTBER3_DQBER1_Pos) /*!< DDRPHY_T::BISTBER3: DQBER1 Mask */ + +#define DDRPHY_BISTWCSR_ACWCNT_Pos (0) /*!< DDRPHY_T::BISTWCSR: ACWCNT Position */ +#define DDRPHY_BISTWCSR_ACWCNT_Msk (0xfffful << DDRPHY_BISTWCSR_ACWCNT_Pos) /*!< DDRPHY_T::BISTWCSR: ACWCNT Mask */ + +#define DDRPHY_BISTWCSR_DXWCNT_Pos (16) /*!< DDRPHY_T::BISTWCSR: DXWCNT Position */ +#define DDRPHY_BISTWCSR_DXWCNT_Msk (0xfffful << DDRPHY_BISTWCSR_DXWCNT_Pos) /*!< DDRPHY_T::BISTWCSR: DXWCNT Mask */ + +#define DDRPHY_BISTFWR0_AWEBS_Pos (0) /*!< DDRPHY_T::BISTFWR0: AWEBS Position */ +#define DDRPHY_BISTFWR0_AWEBS_Msk (0xfffful << DDRPHY_BISTFWR0_AWEBS_Pos) /*!< DDRPHY_T::BISTFWR0: AWEBS Mask */ + +#define DDRPHY_BISTFWR0_BAWEBS_Pos (16) /*!< DDRPHY_T::BISTFWR0: BAWEBS Position */ +#define DDRPHY_BISTFWR0_BAWEBS_Msk (0x7ul << DDRPHY_BISTFWR0_BAWEBS_Pos) /*!< DDRPHY_T::BISTFWR0: BAWEBS Mask */ + +#define DDRPHY_BISTFWR0_WEWEBS_Pos (19) /*!< DDRPHY_T::BISTFWR0: WEWEBS Position */ +#define DDRPHY_BISTFWR0_WEWEBS_Msk (0x1ul << DDRPHY_BISTFWR0_WEWEBS_Pos) /*!< DDRPHY_T::BISTFWR0: WEWEBS Mask */ + +#define DDRPHY_BISTFWR0_CKEWEBS_Pos (20) /*!< DDRPHY_T::BISTFWR0: CKEWEBS Position */ +#define DDRPHY_BISTFWR0_CKEWEBS_Msk (0xful << DDRPHY_BISTFWR0_CKEWEBS_Pos) /*!< DDRPHY_T::BISTFWR0: CKEWEBS Mask */ + +#define DDRPHY_BISTFWR0_CSWEBS_Pos (24) /*!< DDRPHY_T::BISTFWR0: CSWEBS Position */ +#define DDRPHY_BISTFWR0_CSWEBS_Msk (0xful << DDRPHY_BISTFWR0_CSWEBS_Pos) /*!< DDRPHY_T::BISTFWR0: CSWEBS Mask */ + +#define DDRPHY_BISTFWR0_ODTWEBS_Pos (28) /*!< DDRPHY_T::BISTFWR0: ODTWEBS Position */ +#define DDRPHY_BISTFWR0_ODTWEBS_Msk (0xful << DDRPHY_BISTFWR0_ODTWEBS_Pos) /*!< DDRPHY_T::BISTFWR0: ODTWEBS Mask */ + +#define DDRPHY_BISTFWR1_RASWEBS_Pos (0) /*!< DDRPHY_T::BISTFWR1: RASWEBS Position */ +#define DDRPHY_BISTFWR1_RASWEBS_Msk (0x1ul << DDRPHY_BISTFWR1_RASWEBS_Pos) /*!< DDRPHY_T::BISTFWR1: RASWEBS Mask */ + +#define DDRPHY_BISTFWR1_CASWEBS_Pos (1) /*!< DDRPHY_T::BISTFWR1: CASWEBS Position */ +#define DDRPHY_BISTFWR1_CASWEBS_Msk (0x1ul << DDRPHY_BISTFWR1_CASWEBS_Pos) /*!< DDRPHY_T::BISTFWR1: CASWEBS Mask */ + +#define DDRPHY_BISTFWR1_PARWEBS_Pos (26) /*!< DDRPHY_T::BISTFWR1: PARWEBS Position */ +#define DDRPHY_BISTFWR1_PARWEBS_Msk (0x1ul << DDRPHY_BISTFWR1_PARWEBS_Pos) /*!< DDRPHY_T::BISTFWR1: PARWEBS Mask */ + +#define DDRPHY_BISTFWR1_DMWEBS_Pos (28) /*!< DDRPHY_T::BISTFWR1: DMWEBS Position */ +#define DDRPHY_BISTFWR1_DMWEBS_Msk (0xful << DDRPHY_BISTFWR1_DMWEBS_Pos) /*!< DDRPHY_T::BISTFWR1: DMWEBS Mask */ + +#define DDRPHY_BISTFWR2_DQWEBS_Pos (0) /*!< DDRPHY_T::BISTFWR2: DQWEBS Position */ +#define DDRPHY_BISTFWR2_DQWEBS_Msk (0xfffffffful << DDRPHY_BISTFWR2_DQWEBS_Pos) /*!< DDRPHY_T::BISTFWR2: DQWEBS Mask */ + +#define DDRPHY_AACR_AATR_Pos (0) /*!< DDRPHY_T::AACR: AATR Position */ +#define DDRPHY_AACR_AATR_Msk (0x3ffffffful << DDRPHY_AACR_AATR_Pos) /*!< DDRPHY_T::AACR: AATR Mask */ + +#define DDRPHY_AACR_AAENC_Pos (30) /*!< DDRPHY_T::AACR: AAENC Position */ +#define DDRPHY_AACR_AAENC_Msk (0x1ul << DDRPHY_AACR_AAENC_Pos) /*!< DDRPHY_T::AACR: AAENC Mask */ + +#define DDRPHY_AACR_AAOENC_Pos (31) /*!< DDRPHY_T::AACR: AAOENC Position */ +#define DDRPHY_AACR_AAOENC_Msk (0x1ul << DDRPHY_AACR_AAOENC_Pos) /*!< DDRPHY_T::AACR: AAOENC Mask */ + +#define DDRPHY_GPR0_GPR0_Pos (0) /*!< DDRPHY_T::GPR0: GPR0 Position */ +#define DDRPHY_GPR0_GPR0_Msk (0xfffffffful << DDRPHY_GPR0_GPR0_Pos) /*!< DDRPHY_T::GPR0: GPR0 Mask */ + +#define DDRPHY_GPR1_GPR1_Pos (0) /*!< DDRPHY_T::GPR1: GPR1 Position */ +#define DDRPHY_GPR1_GPR1_Msk (0xfffffffful << DDRPHY_GPR1_GPR1_Pos) /*!< DDRPHY_T::GPR1: GPR1 Mask */ + +#define DDRPHY_ZQ0CR0_ZDATA_Pos (0) /*!< DDRPHY_T::ZQ0CR0: ZDATA Position */ +#define DDRPHY_ZQ0CR0_ZDATA_Msk (0xffffffful << DDRPHY_ZQ0CR0_ZDATA_Pos) /*!< DDRPHY_T::ZQ0CR0: ZDATA Mask */ + +#define DDRPHY_ZQ0CR0_ZDEN_Pos (28) /*!< DDRPHY_T::ZQ0CR0: ZDEN Position */ +#define DDRPHY_ZQ0CR0_ZDEN_Msk (0x1ul << DDRPHY_ZQ0CR0_ZDEN_Pos) /*!< DDRPHY_T::ZQ0CR0: ZDEN Mask */ + +#define DDRPHY_ZQ0CR0_ZCALBYP_Pos (29) /*!< DDRPHY_T::ZQ0CR0: ZCALBYP Position */ +#define DDRPHY_ZQ0CR0_ZCALBYP_Msk (0x1ul << DDRPHY_ZQ0CR0_ZCALBYP_Pos) /*!< DDRPHY_T::ZQ0CR0: ZCALBYP Mask */ + +#define DDRPHY_ZQ0CR0_ZCALEN_Pos (30) /*!< DDRPHY_T::ZQ0CR0: ZCALEN Position */ +#define DDRPHY_ZQ0CR0_ZCALEN_Msk (0x1ul << DDRPHY_ZQ0CR0_ZCALEN_Pos) /*!< DDRPHY_T::ZQ0CR0: ZCALEN Mask */ + +#define DDRPHY_ZQ0CR0_ZQPD_Pos (31) /*!< DDRPHY_T::ZQ0CR0: ZQPD Position */ +#define DDRPHY_ZQ0CR0_ZQPD_Msk (0x1ul << DDRPHY_ZQ0CR0_ZQPD_Pos) /*!< DDRPHY_T::ZQ0CR0: ZQPD Mask */ + +#define DDRPHY_ZQ0CR1_ZPROG_Pos (0) /*!< DDRPHY_T::ZQ0CR1: ZPROG Position */ +#define DDRPHY_ZQ0CR1_ZPROG_Msk (0xfful << DDRPHY_ZQ0CR1_ZPROG_Pos) /*!< DDRPHY_T::ZQ0CR1: ZPROG Mask */ + +#define DDRPHY_ZQ0CR1_DFICU0_Pos (12) /*!< DDRPHY_T::ZQ0CR1: DFICU0 Position */ +#define DDRPHY_ZQ0CR1_DFICU0_Msk (0x1ul << DDRPHY_ZQ0CR1_DFICU0_Pos) /*!< DDRPHY_T::ZQ0CR1: DFICU0 Mask */ + +#define DDRPHY_ZQ0CR1_DFICU1_Pos (13) /*!< DDRPHY_T::ZQ0CR1: DFICU1 Position */ +#define DDRPHY_ZQ0CR1_DFICU1_Msk (0x1ul << DDRPHY_ZQ0CR1_DFICU1_Pos) /*!< DDRPHY_T::ZQ0CR1: DFICU1 Mask */ + +#define DDRPHY_ZQ0CR1_DFICCU_Pos (14) /*!< DDRPHY_T::ZQ0CR1: DFICCU Position */ +#define DDRPHY_ZQ0CR1_DFICCU_Msk (0x1ul << DDRPHY_ZQ0CR1_DFICCU_Pos) /*!< DDRPHY_T::ZQ0CR1: DFICCU Mask */ + +#define DDRPHY_ZQ0CR1_DFIPU0_Pos (16) /*!< DDRPHY_T::ZQ0CR1: DFIPU0 Position */ +#define DDRPHY_ZQ0CR1_DFIPU0_Msk (0x1ul << DDRPHY_ZQ0CR1_DFIPU0_Pos) /*!< DDRPHY_T::ZQ0CR1: DFIPU0 Mask */ + +#define DDRPHY_ZQ0CR1_DFIPU1_Pos (17) /*!< DDRPHY_T::ZQ0CR1: DFIPU1 Position */ +#define DDRPHY_ZQ0CR1_DFIPU1_Msk (0x1ul << DDRPHY_ZQ0CR1_DFIPU1_Pos) /*!< DDRPHY_T::ZQ0CR1: DFIPU1 Mask */ + +#define DDRPHY_ZQ0SR0_ZCTRL_Pos (0) /*!< DDRPHY_T::ZQ0SR0: ZCTRL Position */ +#define DDRPHY_ZQ0SR0_ZCTRL_Msk (0xffffffful << DDRPHY_ZQ0SR0_ZCTRL_Pos) /*!< DDRPHY_T::ZQ0SR0: ZCTRL Mask */ + +#define DDRPHY_ZQ0SR0_ZERR_Pos (30) /*!< DDRPHY_T::ZQ0SR0: ZERR Position */ +#define DDRPHY_ZQ0SR0_ZERR_Msk (0x1ul << DDRPHY_ZQ0SR0_ZERR_Pos) /*!< DDRPHY_T::ZQ0SR0: ZERR Mask */ + +#define DDRPHY_ZQ0SR0_ZDONE_Pos (31) /*!< DDRPHY_T::ZQ0SR0: ZDONE Position */ +#define DDRPHY_ZQ0SR0_ZDONE_Msk (0x1ul << DDRPHY_ZQ0SR0_ZDONE_Pos) /*!< DDRPHY_T::ZQ0SR0: ZDONE Mask */ + +#define DDRPHY_ZQ0SR1_ZPD_Pos (0) /*!< DDRPHY_T::ZQ0SR1: ZPD Position */ +#define DDRPHY_ZQ0SR1_ZPD_Msk (0x3ul << DDRPHY_ZQ0SR1_ZPD_Pos) /*!< DDRPHY_T::ZQ0SR1: ZPD Mask */ + +#define DDRPHY_ZQ0SR1_ZPU_Pos (2) /*!< DDRPHY_T::ZQ0SR1: ZPU Position */ +#define DDRPHY_ZQ0SR1_ZPU_Msk (0x3ul << DDRPHY_ZQ0SR1_ZPU_Pos) /*!< DDRPHY_T::ZQ0SR1: ZPU Mask */ + +#define DDRPHY_ZQ0SR1_OPD_Pos (4) /*!< DDRPHY_T::ZQ0SR1: OPD Position */ +#define DDRPHY_ZQ0SR1_OPD_Msk (0x3ul << DDRPHY_ZQ0SR1_OPD_Pos) /*!< DDRPHY_T::ZQ0SR1: OPD Mask */ + +#define DDRPHY_ZQ0SR1_OPU_Pos (6) /*!< DDRPHY_T::ZQ0SR1: OPU Position */ +#define DDRPHY_ZQ0SR1_OPU_Msk (0x3ul << DDRPHY_ZQ0SR1_OPU_Pos) /*!< DDRPHY_T::ZQ0SR1: OPU Mask */ + +#define DDRPHY_ZQ1CR0_ZDATA_Pos (0) /*!< DDRPHY_T::ZQ1CR0: ZDATA Position */ +#define DDRPHY_ZQ1CR0_ZDATA_Msk (0xffffffful << DDRPHY_ZQ1CR0_ZDATA_Pos) /*!< DDRPHY_T::ZQ1CR0: ZDATA Mask */ + +#define DDRPHY_ZQ1CR0_ZDEN_Pos (28) /*!< DDRPHY_T::ZQ1CR0: ZDEN Position */ +#define DDRPHY_ZQ1CR0_ZDEN_Msk (0x1ul << DDRPHY_ZQ1CR0_ZDEN_Pos) /*!< DDRPHY_T::ZQ1CR0: ZDEN Mask */ + +#define DDRPHY_ZQ1CR0_ZCALBYP_Pos (29) /*!< DDRPHY_T::ZQ1CR0: ZCALBYP Position */ +#define DDRPHY_ZQ1CR0_ZCALBYP_Msk (0x1ul << DDRPHY_ZQ1CR0_ZCALBYP_Pos) /*!< DDRPHY_T::ZQ1CR0: ZCALBYP Mask */ + +#define DDRPHY_ZQ1CR0_ZCALEN_Pos (30) /*!< DDRPHY_T::ZQ1CR0: ZCALEN Position */ +#define DDRPHY_ZQ1CR0_ZCALEN_Msk (0x1ul << DDRPHY_ZQ1CR0_ZCALEN_Pos) /*!< DDRPHY_T::ZQ1CR0: ZCALEN Mask */ + +#define DDRPHY_ZQ1CR0_ZQPD_Pos (31) /*!< DDRPHY_T::ZQ1CR0: ZQPD Position */ +#define DDRPHY_ZQ1CR0_ZQPD_Msk (0x1ul << DDRPHY_ZQ1CR0_ZQPD_Pos) /*!< DDRPHY_T::ZQ1CR0: ZQPD Mask */ + +#define DDRPHY_ZQ1CR1_ZPROG_Pos (0) /*!< DDRPHY_T::ZQ1CR1: ZPROG Position */ +#define DDRPHY_ZQ1CR1_ZPROG_Msk (0xfful << DDRPHY_ZQ1CR1_ZPROG_Pos) /*!< DDRPHY_T::ZQ1CR1: ZPROG Mask */ + +#define DDRPHY_ZQ1CR1_DFICU0_Pos (12) /*!< DDRPHY_T::ZQ1CR1: DFICU0 Position */ +#define DDRPHY_ZQ1CR1_DFICU0_Msk (0x1ul << DDRPHY_ZQ1CR1_DFICU0_Pos) /*!< DDRPHY_T::ZQ1CR1: DFICU0 Mask */ + +#define DDRPHY_ZQ1CR1_DFICU1_Pos (13) /*!< DDRPHY_T::ZQ1CR1: DFICU1 Position */ +#define DDRPHY_ZQ1CR1_DFICU1_Msk (0x1ul << DDRPHY_ZQ1CR1_DFICU1_Pos) /*!< DDRPHY_T::ZQ1CR1: DFICU1 Mask */ + +#define DDRPHY_ZQ1CR1_DFICCU_Pos (14) /*!< DDRPHY_T::ZQ1CR1: DFICCU Position */ +#define DDRPHY_ZQ1CR1_DFICCU_Msk (0x1ul << DDRPHY_ZQ1CR1_DFICCU_Pos) /*!< DDRPHY_T::ZQ1CR1: DFICCU Mask */ + +#define DDRPHY_ZQ1CR1_DFIPU0_Pos (16) /*!< DDRPHY_T::ZQ1CR1: DFIPU0 Position */ +#define DDRPHY_ZQ1CR1_DFIPU0_Msk (0x1ul << DDRPHY_ZQ1CR1_DFIPU0_Pos) /*!< DDRPHY_T::ZQ1CR1: DFIPU0 Mask */ + +#define DDRPHY_ZQ1CR1_DFIPU1_Pos (17) /*!< DDRPHY_T::ZQ1CR1: DFIPU1 Position */ +#define DDRPHY_ZQ1CR1_DFIPU1_Msk (0x1ul << DDRPHY_ZQ1CR1_DFIPU1_Pos) /*!< DDRPHY_T::ZQ1CR1: DFIPU1 Mask */ + +#define DDRPHY_ZQ1SR0_ZCTRL_Pos (0) /*!< DDRPHY_T::ZQ1SR0: ZCTRL Position */ +#define DDRPHY_ZQ1SR0_ZCTRL_Msk (0xffffffful << DDRPHY_ZQ1SR0_ZCTRL_Pos) /*!< DDRPHY_T::ZQ1SR0: ZCTRL Mask */ + +#define DDRPHY_ZQ1SR0_ZERR_Pos (30) /*!< DDRPHY_T::ZQ1SR0: ZERR Position */ +#define DDRPHY_ZQ1SR0_ZERR_Msk (0x1ul << DDRPHY_ZQ1SR0_ZERR_Pos) /*!< DDRPHY_T::ZQ1SR0: ZERR Mask */ + +#define DDRPHY_ZQ1SR0_ZDONE_Pos (31) /*!< DDRPHY_T::ZQ1SR0: ZDONE Position */ +#define DDRPHY_ZQ1SR0_ZDONE_Msk (0x1ul << DDRPHY_ZQ1SR0_ZDONE_Pos) /*!< DDRPHY_T::ZQ1SR0: ZDONE Mask */ + +#define DDRPHY_ZQ1SR1_ZPD_Pos (0) /*!< DDRPHY_T::ZQ1SR1: ZPD Position */ +#define DDRPHY_ZQ1SR1_ZPD_Msk (0x3ul << DDRPHY_ZQ1SR1_ZPD_Pos) /*!< DDRPHY_T::ZQ1SR1: ZPD Mask */ + +#define DDRPHY_ZQ1SR1_ZPU_Pos (2) /*!< DDRPHY_T::ZQ1SR1: ZPU Position */ +#define DDRPHY_ZQ1SR1_ZPU_Msk (0x3ul << DDRPHY_ZQ1SR1_ZPU_Pos) /*!< DDRPHY_T::ZQ1SR1: ZPU Mask */ + +#define DDRPHY_ZQ1SR1_OPD_Pos (4) /*!< DDRPHY_T::ZQ1SR1: OPD Position */ +#define DDRPHY_ZQ1SR1_OPD_Msk (0x3ul << DDRPHY_ZQ1SR1_OPD_Pos) /*!< DDRPHY_T::ZQ1SR1: OPD Mask */ + +#define DDRPHY_ZQ1SR1_OPU_Pos (6) /*!< DDRPHY_T::ZQ1SR1: OPU Position */ +#define DDRPHY_ZQ1SR1_OPU_Msk (0x3ul << DDRPHY_ZQ1SR1_OPU_Pos) /*!< DDRPHY_T::ZQ1SR1: OPU Mask */ + +#define DDRPHY_ZQ2CR0_ZDATA_Pos (0) /*!< DDRPHY_T::ZQ2CR0: ZDATA Position */ +#define DDRPHY_ZQ2CR0_ZDATA_Msk (0xffffffful << DDRPHY_ZQ2CR0_ZDATA_Pos) /*!< DDRPHY_T::ZQ2CR0: ZDATA Mask */ + +#define DDRPHY_ZQ2CR0_ZDEN_Pos (28) /*!< DDRPHY_T::ZQ2CR0: ZDEN Position */ +#define DDRPHY_ZQ2CR0_ZDEN_Msk (0x1ul << DDRPHY_ZQ2CR0_ZDEN_Pos) /*!< DDRPHY_T::ZQ2CR0: ZDEN Mask */ + +#define DDRPHY_ZQ2CR0_ZCALBYP_Pos (29) /*!< DDRPHY_T::ZQ2CR0: ZCALBYP Position */ +#define DDRPHY_ZQ2CR0_ZCALBYP_Msk (0x1ul << DDRPHY_ZQ2CR0_ZCALBYP_Pos) /*!< DDRPHY_T::ZQ2CR0: ZCALBYP Mask */ + +#define DDRPHY_ZQ2CR0_ZCALEN_Pos (30) /*!< DDRPHY_T::ZQ2CR0: ZCALEN Position */ +#define DDRPHY_ZQ2CR0_ZCALEN_Msk (0x1ul << DDRPHY_ZQ2CR0_ZCALEN_Pos) /*!< DDRPHY_T::ZQ2CR0: ZCALEN Mask */ + +#define DDRPHY_ZQ2CR0_ZQPD_Pos (31) /*!< DDRPHY_T::ZQ2CR0: ZQPD Position */ +#define DDRPHY_ZQ2CR0_ZQPD_Msk (0x1ul << DDRPHY_ZQ2CR0_ZQPD_Pos) /*!< DDRPHY_T::ZQ2CR0: ZQPD Mask */ + +#define DDRPHY_ZQ2CR1_ZPROG_Pos (0) /*!< DDRPHY_T::ZQ2CR1: ZPROG Position */ +#define DDRPHY_ZQ2CR1_ZPROG_Msk (0xfful << DDRPHY_ZQ2CR1_ZPROG_Pos) /*!< DDRPHY_T::ZQ2CR1: ZPROG Mask */ + +#define DDRPHY_ZQ2CR1_DFICU0_Pos (12) /*!< DDRPHY_T::ZQ2CR1: DFICU0 Position */ +#define DDRPHY_ZQ2CR1_DFICU0_Msk (0x1ul << DDRPHY_ZQ2CR1_DFICU0_Pos) /*!< DDRPHY_T::ZQ2CR1: DFICU0 Mask */ + +#define DDRPHY_ZQ2CR1_DFICU1_Pos (13) /*!< DDRPHY_T::ZQ2CR1: DFICU1 Position */ +#define DDRPHY_ZQ2CR1_DFICU1_Msk (0x1ul << DDRPHY_ZQ2CR1_DFICU1_Pos) /*!< DDRPHY_T::ZQ2CR1: DFICU1 Mask */ + +#define DDRPHY_ZQ2CR1_DFICCU_Pos (14) /*!< DDRPHY_T::ZQ2CR1: DFICCU Position */ +#define DDRPHY_ZQ2CR1_DFICCU_Msk (0x1ul << DDRPHY_ZQ2CR1_DFICCU_Pos) /*!< DDRPHY_T::ZQ2CR1: DFICCU Mask */ + +#define DDRPHY_ZQ2CR1_DFIPU0_Pos (16) /*!< DDRPHY_T::ZQ2CR1: DFIPU0 Position */ +#define DDRPHY_ZQ2CR1_DFIPU0_Msk (0x1ul << DDRPHY_ZQ2CR1_DFIPU0_Pos) /*!< DDRPHY_T::ZQ2CR1: DFIPU0 Mask */ + +#define DDRPHY_ZQ2CR1_DFIPU1_Pos (17) /*!< DDRPHY_T::ZQ2CR1: DFIPU1 Position */ +#define DDRPHY_ZQ2CR1_DFIPU1_Msk (0x1ul << DDRPHY_ZQ2CR1_DFIPU1_Pos) /*!< DDRPHY_T::ZQ2CR1: DFIPU1 Mask */ + +#define DDRPHY_ZQ2SR0_ZCTRL_Pos (0) /*!< DDRPHY_T::ZQ2SR0: ZCTRL Position */ +#define DDRPHY_ZQ2SR0_ZCTRL_Msk (0xffffffful << DDRPHY_ZQ2SR0_ZCTRL_Pos) /*!< DDRPHY_T::ZQ2SR0: ZCTRL Mask */ + +#define DDRPHY_ZQ2SR0_ZERR_Pos (30) /*!< DDRPHY_T::ZQ2SR0: ZERR Position */ +#define DDRPHY_ZQ2SR0_ZERR_Msk (0x1ul << DDRPHY_ZQ2SR0_ZERR_Pos) /*!< DDRPHY_T::ZQ2SR0: ZERR Mask */ + +#define DDRPHY_ZQ2SR0_ZDONE_Pos (31) /*!< DDRPHY_T::ZQ2SR0: ZDONE Position */ +#define DDRPHY_ZQ2SR0_ZDONE_Msk (0x1ul << DDRPHY_ZQ2SR0_ZDONE_Pos) /*!< DDRPHY_T::ZQ2SR0: ZDONE Mask */ + +#define DDRPHY_ZQ2SR1_ZPD_Pos (0) /*!< DDRPHY_T::ZQ2SR1: ZPD Position */ +#define DDRPHY_ZQ2SR1_ZPD_Msk (0x3ul << DDRPHY_ZQ2SR1_ZPD_Pos) /*!< DDRPHY_T::ZQ2SR1: ZPD Mask */ + +#define DDRPHY_ZQ2SR1_ZPU_Pos (2) /*!< DDRPHY_T::ZQ2SR1: ZPU Position */ +#define DDRPHY_ZQ2SR1_ZPU_Msk (0x3ul << DDRPHY_ZQ2SR1_ZPU_Pos) /*!< DDRPHY_T::ZQ2SR1: ZPU Mask */ + +#define DDRPHY_ZQ2SR1_OPD_Pos (4) /*!< DDRPHY_T::ZQ2SR1: OPD Position */ +#define DDRPHY_ZQ2SR1_OPD_Msk (0x3ul << DDRPHY_ZQ2SR1_OPD_Pos) /*!< DDRPHY_T::ZQ2SR1: OPD Mask */ + +#define DDRPHY_ZQ2SR1_OPU_Pos (6) /*!< DDRPHY_T::ZQ2SR1: OPU Position */ +#define DDRPHY_ZQ2SR1_OPU_Msk (0x3ul << DDRPHY_ZQ2SR1_OPU_Pos) /*!< DDRPHY_T::ZQ2SR1: OPU Mask */ + +#define DDRPHY_ZQ3CR0_ZDATA_Pos (0) /*!< DDRPHY_T::ZQ3CR0: ZDATA Position */ +#define DDRPHY_ZQ3CR0_ZDATA_Msk (0xffffffful << DDRPHY_ZQ3CR0_ZDATA_Pos) /*!< DDRPHY_T::ZQ3CR0: ZDATA Mask */ + +#define DDRPHY_ZQ3CR0_ZDEN_Pos (28) /*!< DDRPHY_T::ZQ3CR0: ZDEN Position */ +#define DDRPHY_ZQ3CR0_ZDEN_Msk (0x1ul << DDRPHY_ZQ3CR0_ZDEN_Pos) /*!< DDRPHY_T::ZQ3CR0: ZDEN Mask */ + +#define DDRPHY_ZQ3CR0_ZCALBYP_Pos (29) /*!< DDRPHY_T::ZQ3CR0: ZCALBYP Position */ +#define DDRPHY_ZQ3CR0_ZCALBYP_Msk (0x1ul << DDRPHY_ZQ3CR0_ZCALBYP_Pos) /*!< DDRPHY_T::ZQ3CR0: ZCALBYP Mask */ + +#define DDRPHY_ZQ3CR0_ZCALEN_Pos (30) /*!< DDRPHY_T::ZQ3CR0: ZCALEN Position */ +#define DDRPHY_ZQ3CR0_ZCALEN_Msk (0x1ul << DDRPHY_ZQ3CR0_ZCALEN_Pos) /*!< DDRPHY_T::ZQ3CR0: ZCALEN Mask */ + +#define DDRPHY_ZQ3CR0_ZQPD_Pos (31) /*!< DDRPHY_T::ZQ3CR0: ZQPD Position */ +#define DDRPHY_ZQ3CR0_ZQPD_Msk (0x1ul << DDRPHY_ZQ3CR0_ZQPD_Pos) /*!< DDRPHY_T::ZQ3CR0: ZQPD Mask */ + +#define DDRPHY_ZQ3CR1_ZPROG_Pos (0) /*!< DDRPHY_T::ZQ3CR1: ZPROG Position */ +#define DDRPHY_ZQ3CR1_ZPROG_Msk (0xfful << DDRPHY_ZQ3CR1_ZPROG_Pos) /*!< DDRPHY_T::ZQ3CR1: ZPROG Mask */ + +#define DDRPHY_ZQ3CR1_DFICU0_Pos (12) /*!< DDRPHY_T::ZQ3CR1: DFICU0 Position */ +#define DDRPHY_ZQ3CR1_DFICU0_Msk (0x1ul << DDRPHY_ZQ3CR1_DFICU0_Pos) /*!< DDRPHY_T::ZQ3CR1: DFICU0 Mask */ + +#define DDRPHY_ZQ3CR1_DFICU1_Pos (13) /*!< DDRPHY_T::ZQ3CR1: DFICU1 Position */ +#define DDRPHY_ZQ3CR1_DFICU1_Msk (0x1ul << DDRPHY_ZQ3CR1_DFICU1_Pos) /*!< DDRPHY_T::ZQ3CR1: DFICU1 Mask */ + +#define DDRPHY_ZQ3CR1_DFICCU_Pos (14) /*!< DDRPHY_T::ZQ3CR1: DFICCU Position */ +#define DDRPHY_ZQ3CR1_DFICCU_Msk (0x1ul << DDRPHY_ZQ3CR1_DFICCU_Pos) /*!< DDRPHY_T::ZQ3CR1: DFICCU Mask */ + +#define DDRPHY_ZQ3CR1_DFIPU0_Pos (16) /*!< DDRPHY_T::ZQ3CR1: DFIPU0 Position */ +#define DDRPHY_ZQ3CR1_DFIPU0_Msk (0x1ul << DDRPHY_ZQ3CR1_DFIPU0_Pos) /*!< DDRPHY_T::ZQ3CR1: DFIPU0 Mask */ + +#define DDRPHY_ZQ3CR1_DFIPU1_Pos (17) /*!< DDRPHY_T::ZQ3CR1: DFIPU1 Position */ +#define DDRPHY_ZQ3CR1_DFIPU1_Msk (0x1ul << DDRPHY_ZQ3CR1_DFIPU1_Pos) /*!< DDRPHY_T::ZQ3CR1: DFIPU1 Mask */ + +#define DDRPHY_ZQ3SR0_ZCTRL_Pos (0) /*!< DDRPHY_T::ZQ3SR0: ZCTRL Position */ +#define DDRPHY_ZQ3SR0_ZCTRL_Msk (0xffffffful << DDRPHY_ZQ3SR0_ZCTRL_Pos) /*!< DDRPHY_T::ZQ3SR0: ZCTRL Mask */ + +#define DDRPHY_ZQ3SR0_ZERR_Pos (30) /*!< DDRPHY_T::ZQ3SR0: ZERR Position */ +#define DDRPHY_ZQ3SR0_ZERR_Msk (0x1ul << DDRPHY_ZQ3SR0_ZERR_Pos) /*!< DDRPHY_T::ZQ3SR0: ZERR Mask */ + +#define DDRPHY_ZQ3SR0_ZDONE_Pos (31) /*!< DDRPHY_T::ZQ3SR0: ZDONE Position */ +#define DDRPHY_ZQ3SR0_ZDONE_Msk (0x1ul << DDRPHY_ZQ3SR0_ZDONE_Pos) /*!< DDRPHY_T::ZQ3SR0: ZDONE Mask */ + +#define DDRPHY_ZQ3SR1_ZPD_Pos (0) /*!< DDRPHY_T::ZQ3SR1: ZPD Position */ +#define DDRPHY_ZQ3SR1_ZPD_Msk (0x3ul << DDRPHY_ZQ3SR1_ZPD_Pos) /*!< DDRPHY_T::ZQ3SR1: ZPD Mask */ + +#define DDRPHY_ZQ3SR1_ZPU_Pos (2) /*!< DDRPHY_T::ZQ3SR1: ZPU Position */ +#define DDRPHY_ZQ3SR1_ZPU_Msk (0x3ul << DDRPHY_ZQ3SR1_ZPU_Pos) /*!< DDRPHY_T::ZQ3SR1: ZPU Mask */ + +#define DDRPHY_ZQ3SR1_OPD_Pos (4) /*!< DDRPHY_T::ZQ3SR1: OPD Position */ +#define DDRPHY_ZQ3SR1_OPD_Msk (0x3ul << DDRPHY_ZQ3SR1_OPD_Pos) /*!< DDRPHY_T::ZQ3SR1: OPD Mask */ + +#define DDRPHY_ZQ3SR1_OPU_Pos (6) /*!< DDRPHY_T::ZQ3SR1: OPU Position */ +#define DDRPHY_ZQ3SR1_OPU_Msk (0x3ul << DDRPHY_ZQ3SR1_OPU_Pos) /*!< DDRPHY_T::ZQ3SR1: OPU Mask */ + +#define DDRPHY_DX0GCR_DXEN_Pos (0) /*!< DDRPHY_T::DX0GCR: DXEN Position */ +#define DDRPHY_DX0GCR_DXEN_Msk (0x1ul << DDRPHY_DX0GCR_DXEN_Pos) /*!< DDRPHY_T::DX0GCR: DXEN Mask */ + +#define DDRPHY_DX0GCR_DQSODT_Pos (1) /*!< DDRPHY_T::DX0GCR: DQSODT Position */ +#define DDRPHY_DX0GCR_DQSODT_Msk (0x1ul << DDRPHY_DX0GCR_DQSODT_Pos) /*!< DDRPHY_T::DX0GCR: DQSODT Mask */ + +#define DDRPHY_DX0GCR_DQODT_Pos (2) /*!< DDRPHY_T::DX0GCR: DQODT Position */ +#define DDRPHY_DX0GCR_DQODT_Msk (0x1ul << DDRPHY_DX0GCR_DQODT_Pos) /*!< DDRPHY_T::DX0GCR: DQODT Mask */ + +#define DDRPHY_DX0GCR_DXIOM_Pos (3) /*!< DDRPHY_T::DX0GCR: DXIOM Position */ +#define DDRPHY_DX0GCR_DXIOM_Msk (0x1ul << DDRPHY_DX0GCR_DXIOM_Pos) /*!< DDRPHY_T::DX0GCR: DXIOM Mask */ + +#define DDRPHY_DX0GCR_DXPDD_Pos (4) /*!< DDRPHY_T::DX0GCR: DXPDD Position */ +#define DDRPHY_DX0GCR_DXPDD_Msk (0x1ul << DDRPHY_DX0GCR_DXPDD_Pos) /*!< DDRPHY_T::DX0GCR: DXPDD Mask */ + +#define DDRPHY_DX0GCR_DXPDR_Pos (5) /*!< DDRPHY_T::DX0GCR: DXPDR Position */ +#define DDRPHY_DX0GCR_DXPDR_Msk (0x1ul << DDRPHY_DX0GCR_DXPDR_Pos) /*!< DDRPHY_T::DX0GCR: DXPDR Mask */ + +#define DDRPHY_DX0GCR_DQSRPD_Pos (6) /*!< DDRPHY_T::DX0GCR: DQSRPD Position */ +#define DDRPHY_DX0GCR_DQSRPD_Msk (0x1ul << DDRPHY_DX0GCR_DQSRPD_Pos) /*!< DDRPHY_T::DX0GCR: DQSRPD Mask */ + +#define DDRPHY_DX0GCR_DSEN_Pos (7) /*!< DDRPHY_T::DX0GCR: DSEN Position */ +#define DDRPHY_DX0GCR_DSEN_Msk (0x3ul << DDRPHY_DX0GCR_DSEN_Pos) /*!< DDRPHY_T::DX0GCR: DSEN Mask */ + +#define DDRPHY_DX0GCR_DQSRTT_Pos (9) /*!< DDRPHY_T::DX0GCR: DQSRTT Position */ +#define DDRPHY_DX0GCR_DQSRTT_Msk (0x1ul << DDRPHY_DX0GCR_DQSRTT_Pos) /*!< DDRPHY_T::DX0GCR: DQSRTT Mask */ + +#define DDRPHY_DX0GCR_DQRTT_Pos (10) /*!< DDRPHY_T::DX0GCR: DQRTT Position */ +#define DDRPHY_DX0GCR_DQRTT_Msk (0x1ul << DDRPHY_DX0GCR_DQRTT_Pos) /*!< DDRPHY_T::DX0GCR: DQRTT Mask */ + +#define DDRPHY_DX0GCR_RTTOH_Pos (11) /*!< DDRPHY_T::DX0GCR: RTTOH Position */ +#define DDRPHY_DX0GCR_RTTOH_Msk (0x3ul << DDRPHY_DX0GCR_RTTOH_Pos) /*!< DDRPHY_T::DX0GCR: RTTOH Mask */ + +#define DDRPHY_DX0GCR_RTTOAL_Pos (13) /*!< DDRPHY_T::DX0GCR: RTTOAL Position */ +#define DDRPHY_DX0GCR_RTTOAL_Msk (0x1ul << DDRPHY_DX0GCR_RTTOAL_Pos) /*!< DDRPHY_T::DX0GCR: RTTOAL Mask */ + +#define DDRPHY_DX0GCR_DXOEO_Pos (14) /*!< DDRPHY_T::DX0GCR: DXOEO Position */ +#define DDRPHY_DX0GCR_DXOEO_Msk (0x3ul << DDRPHY_DX0GCR_DXOEO_Pos) /*!< DDRPHY_T::DX0GCR: DXOEO Mask */ + +#define DDRPHY_DX0GCR_PLLRST_Pos (16) /*!< DDRPHY_T::DX0GCR: PLLRST Position */ +#define DDRPHY_DX0GCR_PLLRST_Msk (0x1ul << DDRPHY_DX0GCR_PLLRST_Pos) /*!< DDRPHY_T::DX0GCR: PLLRST Mask */ + +#define DDRPHY_DX0GCR_PLLPD_Pos (17) /*!< DDRPHY_T::DX0GCR: PLLPD Position */ +#define DDRPHY_DX0GCR_PLLPD_Msk (0x1ul << DDRPHY_DX0GCR_PLLPD_Pos) /*!< DDRPHY_T::DX0GCR: PLLPD Mask */ + +#define DDRPHY_DX0GCR_GSHIFT_Pos (18) /*!< DDRPHY_T::DX0GCR: GSHIFT Position */ +#define DDRPHY_DX0GCR_GSHIFT_Msk (0x1ul << DDRPHY_DX0GCR_GSHIFT_Pos) /*!< DDRPHY_T::DX0GCR: GSHIFT Mask */ + +#define DDRPHY_DX0GCR_PLLBYP_Pos (19) /*!< DDRPHY_T::DX0GCR: PLLBYP Position */ +#define DDRPHY_DX0GCR_PLLBYP_Msk (0x1ul << DDRPHY_DX0GCR_PLLBYP_Pos) /*!< DDRPHY_T::DX0GCR: PLLBYP Mask */ + +#define DDRPHY_DX0GCR_WLRKEN_Pos (26) /*!< DDRPHY_T::DX0GCR: WLRKEN Position */ +#define DDRPHY_DX0GCR_WLRKEN_Msk (0xful << DDRPHY_DX0GCR_WLRKEN_Pos) /*!< DDRPHY_T::DX0GCR: WLRKEN Mask */ + +#define DDRPHY_DX0GCR_MDLEN_Pos (30) /*!< DDRPHY_T::DX0GCR: MDLEN Position */ +#define DDRPHY_DX0GCR_MDLEN_Msk (0x1ul << DDRPHY_DX0GCR_MDLEN_Pos) /*!< DDRPHY_T::DX0GCR: MDLEN Mask */ + +#define DDRPHY_DX0GCR_CALBYP_Pos (31) /*!< DDRPHY_T::DX0GCR: CALBYP Position */ +#define DDRPHY_DX0GCR_CALBYP_Msk (0x1ul << DDRPHY_DX0GCR_CALBYP_Pos) /*!< DDRPHY_T::DX0GCR: CALBYP Mask */ + +#define DDRPHY_DX0GSR0_WDQCAL_Pos (0) /*!< DDRPHY_T::DX0GSR0: WDQCAL Position */ +#define DDRPHY_DX0GSR0_WDQCAL_Msk (0x1ul << DDRPHY_DX0GSR0_WDQCAL_Pos) /*!< DDRPHY_T::DX0GSR0: WDQCAL Mask */ + +#define DDRPHY_DX0GSR0_RDQSCAL_Pos (1) /*!< DDRPHY_T::DX0GSR0: RDQSCAL Position */ +#define DDRPHY_DX0GSR0_RDQSCAL_Msk (0x1ul << DDRPHY_DX0GSR0_RDQSCAL_Pos) /*!< DDRPHY_T::DX0GSR0: RDQSCAL Mask */ + +#define DDRPHY_DX0GSR0_RDQSNCAL_Pos (2) /*!< DDRPHY_T::DX0GSR0: RDQSNCAL Position */ +#define DDRPHY_DX0GSR0_RDQSNCAL_Msk (0x1ul << DDRPHY_DX0GSR0_RDQSNCAL_Pos) /*!< DDRPHY_T::DX0GSR0: RDQSNCAL Mask */ + +#define DDRPHY_DX0GSR0_GDQSCAL_Pos (3) /*!< DDRPHY_T::DX0GSR0: GDQSCAL Position */ +#define DDRPHY_DX0GSR0_GDQSCAL_Msk (0x1ul << DDRPHY_DX0GSR0_GDQSCAL_Pos) /*!< DDRPHY_T::DX0GSR0: GDQSCAL Mask */ + +#define DDRPHY_DX0GSR0_WLCAL_Pos (4) /*!< DDRPHY_T::DX0GSR0: WLCAL Position */ +#define DDRPHY_DX0GSR0_WLCAL_Msk (0x1ul << DDRPHY_DX0GSR0_WLCAL_Pos) /*!< DDRPHY_T::DX0GSR0: WLCAL Mask */ + +#define DDRPHY_DX0GSR0_WLDONE_Pos (5) /*!< DDRPHY_T::DX0GSR0: WLDONE Position */ +#define DDRPHY_DX0GSR0_WLDONE_Msk (0x1ul << DDRPHY_DX0GSR0_WLDONE_Pos) /*!< DDRPHY_T::DX0GSR0: WLDONE Mask */ + +#define DDRPHY_DX0GSR0_WLERR_Pos (6) /*!< DDRPHY_T::DX0GSR0: WLERR Position */ +#define DDRPHY_DX0GSR0_WLERR_Msk (0x1ul << DDRPHY_DX0GSR0_WLERR_Pos) /*!< DDRPHY_T::DX0GSR0: WLERR Mask */ + +#define DDRPHY_DX0GSR0_WLPRD_Pos (7) /*!< DDRPHY_T::DX0GSR0: WLPRD Position */ +#define DDRPHY_DX0GSR0_WLPRD_Msk (0xfful << DDRPHY_DX0GSR0_WLPRD_Pos) /*!< DDRPHY_T::DX0GSR0: WLPRD Mask */ + +#define DDRPHY_DX0GSR0_DPLOCK_Pos (15) /*!< DDRPHY_T::DX0GSR0: DPLOCK Position */ +#define DDRPHY_DX0GSR0_DPLOCK_Msk (0x1ul << DDRPHY_DX0GSR0_DPLOCK_Pos) /*!< DDRPHY_T::DX0GSR0: DPLOCK Mask */ + +#define DDRPHY_DX0GSR0_GDQSPRD_Pos (16) /*!< DDRPHY_T::DX0GSR0: GDQSPRD Position */ +#define DDRPHY_DX0GSR0_GDQSPRD_Msk (0xfful << DDRPHY_DX0GSR0_GDQSPRD_Pos) /*!< DDRPHY_T::DX0GSR0: GDQSPRD Mask */ + +#define DDRPHY_DX0GSR0_QSGERR_Pos (24) /*!< DDRPHY_T::DX0GSR0: QSGERR Position */ +#define DDRPHY_DX0GSR0_QSGERR_Msk (0xful << DDRPHY_DX0GSR0_QSGERR_Pos) /*!< DDRPHY_T::DX0GSR0: QSGERR Mask */ + +#define DDRPHY_DX0GSR0_WLDQ_Pos (28) /*!< DDRPHY_T::DX0GSR0: WLDQ Position */ +#define DDRPHY_DX0GSR0_WLDQ_Msk (0x1ul << DDRPHY_DX0GSR0_WLDQ_Pos) /*!< DDRPHY_T::DX0GSR0: WLDQ Mask */ + +#define DDRPHY_DX0GSR1_DLTDONE_Pos (0) /*!< DDRPHY_T::DX0GSR1: DLTDONE Position */ +#define DDRPHY_DX0GSR1_DLTDONE_Msk (0x1ul << DDRPHY_DX0GSR1_DLTDONE_Pos) /*!< DDRPHY_T::DX0GSR1: DLTDONE Mask */ + +#define DDRPHY_DX0GSR1_DLTCODE_Pos (1) /*!< DDRPHY_T::DX0GSR1: DLTCODE Position */ +#define DDRPHY_DX0GSR1_DLTCODE_Msk (0xfffffful << DDRPHY_DX0GSR1_DLTCODE_Pos) /*!< DDRPHY_T::DX0GSR1: DLTCODE Mask */ + +#define DDRPHY_DX0BDLR0_DQ0WBD_Pos (0) /*!< DDRPHY_T::DX0BDLR0: DQ0WBD Position */ +#define DDRPHY_DX0BDLR0_DQ0WBD_Msk (0x3ful << DDRPHY_DX0BDLR0_DQ0WBD_Pos) /*!< DDRPHY_T::DX0BDLR0: DQ0WBD Mask */ + +#define DDRPHY_DX0BDLR0_DQ1WBD_Pos (6) /*!< DDRPHY_T::DX0BDLR0: DQ1WBD Position */ +#define DDRPHY_DX0BDLR0_DQ1WBD_Msk (0x3ful << DDRPHY_DX0BDLR0_DQ1WBD_Pos) /*!< DDRPHY_T::DX0BDLR0: DQ1WBD Mask */ + +#define DDRPHY_DX0BDLR0_DQ2WBD_Pos (12) /*!< DDRPHY_T::DX0BDLR0: DQ2WBD Position */ +#define DDRPHY_DX0BDLR0_DQ2WBD_Msk (0x3ful << DDRPHY_DX0BDLR0_DQ2WBD_Pos) /*!< DDRPHY_T::DX0BDLR0: DQ2WBD Mask */ + +#define DDRPHY_DX0BDLR0_DQ3WBD_Pos (18) /*!< DDRPHY_T::DX0BDLR0: DQ3WBD Position */ +#define DDRPHY_DX0BDLR0_DQ3WBD_Msk (0x3ful << DDRPHY_DX0BDLR0_DQ3WBD_Pos) /*!< DDRPHY_T::DX0BDLR0: DQ3WBD Mask */ + +#define DDRPHY_DX0BDLR0_DQ4WBD_Pos (24) /*!< DDRPHY_T::DX0BDLR0: DQ4WBD Position */ +#define DDRPHY_DX0BDLR0_DQ4WBD_Msk (0x3ful << DDRPHY_DX0BDLR0_DQ4WBD_Pos) /*!< DDRPHY_T::DX0BDLR0: DQ4WBD Mask */ + +#define DDRPHY_DX0BDLR1_DQ5WBD_Pos (0) /*!< DDRPHY_T::DX0BDLR1: DQ5WBD Position */ +#define DDRPHY_DX0BDLR1_DQ5WBD_Msk (0x3ful << DDRPHY_DX0BDLR1_DQ5WBD_Pos) /*!< DDRPHY_T::DX0BDLR1: DQ5WBD Mask */ + +#define DDRPHY_DX0BDLR1_DQ6WBD_Pos (6) /*!< DDRPHY_T::DX0BDLR1: DQ6WBD Position */ +#define DDRPHY_DX0BDLR1_DQ6WBD_Msk (0x3ful << DDRPHY_DX0BDLR1_DQ6WBD_Pos) /*!< DDRPHY_T::DX0BDLR1: DQ6WBD Mask */ + +#define DDRPHY_DX0BDLR1_DQ7WBD_Pos (12) /*!< DDRPHY_T::DX0BDLR1: DQ7WBD Position */ +#define DDRPHY_DX0BDLR1_DQ7WBD_Msk (0x3ful << DDRPHY_DX0BDLR1_DQ7WBD_Pos) /*!< DDRPHY_T::DX0BDLR1: DQ7WBD Mask */ + +#define DDRPHY_DX0BDLR1_DMWBD_Pos (18) /*!< DDRPHY_T::DX0BDLR1: DMWBD Position */ +#define DDRPHY_DX0BDLR1_DMWBD_Msk (0x3ful << DDRPHY_DX0BDLR1_DMWBD_Pos) /*!< DDRPHY_T::DX0BDLR1: DMWBD Mask */ + +#define DDRPHY_DX0BDLR1_DSWBD_Pos (24) /*!< DDRPHY_T::DX0BDLR1: DSWBD Position */ +#define DDRPHY_DX0BDLR1_DSWBD_Msk (0x3ful << DDRPHY_DX0BDLR1_DSWBD_Pos) /*!< DDRPHY_T::DX0BDLR1: DSWBD Mask */ + +#define DDRPHY_DX0BDLR2_DSOEBD_Pos (0) /*!< DDRPHY_T::DX0BDLR2: DSOEBD Position */ +#define DDRPHY_DX0BDLR2_DSOEBD_Msk (0x3ful << DDRPHY_DX0BDLR2_DSOEBD_Pos) /*!< DDRPHY_T::DX0BDLR2: DSOEBD Mask */ + +#define DDRPHY_DX0BDLR2_DQOEBD_Pos (6) /*!< DDRPHY_T::DX0BDLR2: DQOEBD Position */ +#define DDRPHY_DX0BDLR2_DQOEBD_Msk (0x3ful << DDRPHY_DX0BDLR2_DQOEBD_Pos) /*!< DDRPHY_T::DX0BDLR2: DQOEBD Mask */ + +#define DDRPHY_DX0BDLR2_DSRBD_Pos (12) /*!< DDRPHY_T::DX0BDLR2: DSRBD Position */ +#define DDRPHY_DX0BDLR2_DSRBD_Msk (0x3ful << DDRPHY_DX0BDLR2_DSRBD_Pos) /*!< DDRPHY_T::DX0BDLR2: DSRBD Mask */ + +#define DDRPHY_DX0BDLR2_DSNRBD_Pos (18) /*!< DDRPHY_T::DX0BDLR2: DSNRBD Position */ +#define DDRPHY_DX0BDLR2_DSNRBD_Msk (0x3ful << DDRPHY_DX0BDLR2_DSNRBD_Pos) /*!< DDRPHY_T::DX0BDLR2: DSNRBD Mask */ + +#define DDRPHY_DX0BDLR3_DQ0RBD_Pos (0) /*!< DDRPHY_T::DX0BDLR3: DQ0RBD Position */ +#define DDRPHY_DX0BDLR3_DQ0RBD_Msk (0x3ful << DDRPHY_DX0BDLR3_DQ0RBD_Pos) /*!< DDRPHY_T::DX0BDLR3: DQ0RBD Mask */ + +#define DDRPHY_DX0BDLR3_DQ1RBD_Pos (6) /*!< DDRPHY_T::DX0BDLR3: DQ1RBD Position */ +#define DDRPHY_DX0BDLR3_DQ1RBD_Msk (0x3ful << DDRPHY_DX0BDLR3_DQ1RBD_Pos) /*!< DDRPHY_T::DX0BDLR3: DQ1RBD Mask */ + +#define DDRPHY_DX0BDLR3_DQ2RBD_Pos (12) /*!< DDRPHY_T::DX0BDLR3: DQ2RBD Position */ +#define DDRPHY_DX0BDLR3_DQ2RBD_Msk (0x3ful << DDRPHY_DX0BDLR3_DQ2RBD_Pos) /*!< DDRPHY_T::DX0BDLR3: DQ2RBD Mask */ + +#define DDRPHY_DX0BDLR3_DQ3RBD_Pos (18) /*!< DDRPHY_T::DX0BDLR3: DQ3RBD Position */ +#define DDRPHY_DX0BDLR3_DQ3RBD_Msk (0x3ful << DDRPHY_DX0BDLR3_DQ3RBD_Pos) /*!< DDRPHY_T::DX0BDLR3: DQ3RBD Mask */ + +#define DDRPHY_DX0BDLR3_DQ4RBD_Pos (24) /*!< DDRPHY_T::DX0BDLR3: DQ4RBD Position */ +#define DDRPHY_DX0BDLR3_DQ4RBD_Msk (0x3ful << DDRPHY_DX0BDLR3_DQ4RBD_Pos) /*!< DDRPHY_T::DX0BDLR3: DQ4RBD Mask */ + +#define DDRPHY_DX0BDLR4_DQ5RBD_Pos (0) /*!< DDRPHY_T::DX0BDLR4: DQ5RBD Position */ +#define DDRPHY_DX0BDLR4_DQ5RBD_Msk (0x3ful << DDRPHY_DX0BDLR4_DQ5RBD_Pos) /*!< DDRPHY_T::DX0BDLR4: DQ5RBD Mask */ + +#define DDRPHY_DX0BDLR4_DQ6RBD_Pos (6) /*!< DDRPHY_T::DX0BDLR4: DQ6RBD Position */ +#define DDRPHY_DX0BDLR4_DQ6RBD_Msk (0x3ful << DDRPHY_DX0BDLR4_DQ6RBD_Pos) /*!< DDRPHY_T::DX0BDLR4: DQ6RBD Mask */ + +#define DDRPHY_DX0BDLR4_DQ7RBD_Pos (12) /*!< DDRPHY_T::DX0BDLR4: DQ7RBD Position */ +#define DDRPHY_DX0BDLR4_DQ7RBD_Msk (0x3ful << DDRPHY_DX0BDLR4_DQ7RBD_Pos) /*!< DDRPHY_T::DX0BDLR4: DQ7RBD Mask */ + +#define DDRPHY_DX0BDLR4_DMRBD_Pos (18) /*!< DDRPHY_T::DX0BDLR4: DMRBD Position */ +#define DDRPHY_DX0BDLR4_DMRBD_Msk (0x3ful << DDRPHY_DX0BDLR4_DMRBD_Pos) /*!< DDRPHY_T::DX0BDLR4: DMRBD Mask */ + +#define DDRPHY_DX0LCDLR0_R0WLD_Pos (0) /*!< DDRPHY_T::DX0LCDLR0: R0WLD Position */ +#define DDRPHY_DX0LCDLR0_R0WLD_Msk (0xfful << DDRPHY_DX0LCDLR0_R0WLD_Pos) /*!< DDRPHY_T::DX0LCDLR0: R0WLD Mask */ + +#define DDRPHY_DX0LCDLR0_R1WLD_Pos (8) /*!< DDRPHY_T::DX0LCDLR0: R1WLD Position */ +#define DDRPHY_DX0LCDLR0_R1WLD_Msk (0xfful << DDRPHY_DX0LCDLR0_R1WLD_Pos) /*!< DDRPHY_T::DX0LCDLR0: R1WLD Mask */ + +#define DDRPHY_DX0LCDLR0_R2WLD_Pos (16) /*!< DDRPHY_T::DX0LCDLR0: R2WLD Position */ +#define DDRPHY_DX0LCDLR0_R2WLD_Msk (0xfful << DDRPHY_DX0LCDLR0_R2WLD_Pos) /*!< DDRPHY_T::DX0LCDLR0: R2WLD Mask */ + +#define DDRPHY_DX0LCDLR0_R3WLD_Pos (24) /*!< DDRPHY_T::DX0LCDLR0: R3WLD Position */ +#define DDRPHY_DX0LCDLR0_R3WLD_Msk (0xfful << DDRPHY_DX0LCDLR0_R3WLD_Pos) /*!< DDRPHY_T::DX0LCDLR0: R3WLD Mask */ + +#define DDRPHY_DX0LCDLR1_WDQD_Pos (0) /*!< DDRPHY_T::DX0LCDLR1: WDQD Position */ +#define DDRPHY_DX0LCDLR1_WDQD_Msk (0xfful << DDRPHY_DX0LCDLR1_WDQD_Pos) /*!< DDRPHY_T::DX0LCDLR1: WDQD Mask */ + +#define DDRPHY_DX0LCDLR1_RDQSD_Pos (8) /*!< DDRPHY_T::DX0LCDLR1: RDQSD Position */ +#define DDRPHY_DX0LCDLR1_RDQSD_Msk (0xfful << DDRPHY_DX0LCDLR1_RDQSD_Pos) /*!< DDRPHY_T::DX0LCDLR1: RDQSD Mask */ + +#define DDRPHY_DX0LCDLR1_RDQSND_Pos (16) /*!< DDRPHY_T::DX0LCDLR1: RDQSND Position */ +#define DDRPHY_DX0LCDLR1_RDQSND_Msk (0xfful << DDRPHY_DX0LCDLR1_RDQSND_Pos) /*!< DDRPHY_T::DX0LCDLR1: RDQSND Mask */ + +#define DDRPHY_DX0LCDLR2_R0DQSGD_Pos (0) /*!< DDRPHY_T::DX0LCDLR2: R0DQSGD Position */ +#define DDRPHY_DX0LCDLR2_R0DQSGD_Msk (0xfful << DDRPHY_DX0LCDLR2_R0DQSGD_Pos) /*!< DDRPHY_T::DX0LCDLR2: R0DQSGD Mask */ + +#define DDRPHY_DX0LCDLR2_R1DQSGD_Pos (8) /*!< DDRPHY_T::DX0LCDLR2: R1DQSGD Position */ +#define DDRPHY_DX0LCDLR2_R1DQSGD_Msk (0xfful << DDRPHY_DX0LCDLR2_R1DQSGD_Pos) /*!< DDRPHY_T::DX0LCDLR2: R1DQSGD Mask */ + +#define DDRPHY_DX0LCDLR2_R2DQSGD_Pos (16) /*!< DDRPHY_T::DX0LCDLR2: R2DQSGD Position */ +#define DDRPHY_DX0LCDLR2_R2DQSGD_Msk (0xfful << DDRPHY_DX0LCDLR2_R2DQSGD_Pos) /*!< DDRPHY_T::DX0LCDLR2: R2DQSGD Mask */ + +#define DDRPHY_DX0LCDLR2_R3DQSGD_Pos (24) /*!< DDRPHY_T::DX0LCDLR2: R3DQSGD Position */ +#define DDRPHY_DX0LCDLR2_R3DQSGD_Msk (0xfful << DDRPHY_DX0LCDLR2_R3DQSGD_Pos) /*!< DDRPHY_T::DX0LCDLR2: R3DQSGD Mask */ + +#define DDRPHY_DX0MDLR_IPRD_Pos (0) /*!< DDRPHY_T::DX0MDLR: IPRD Position */ +#define DDRPHY_DX0MDLR_IPRD_Msk (0xfful << DDRPHY_DX0MDLR_IPRD_Pos) /*!< DDRPHY_T::DX0MDLR: IPRD Mask */ + +#define DDRPHY_DX0MDLR_TPRD_Pos (8) /*!< DDRPHY_T::DX0MDLR: TPRD Position */ +#define DDRPHY_DX0MDLR_TPRD_Msk (0xfful << DDRPHY_DX0MDLR_TPRD_Pos) /*!< DDRPHY_T::DX0MDLR: TPRD Mask */ + +#define DDRPHY_DX0MDLR_MDLD_Pos (16) /*!< DDRPHY_T::DX0MDLR: MDLD Position */ +#define DDRPHY_DX0MDLR_MDLD_Msk (0xfful << DDRPHY_DX0MDLR_MDLD_Pos) /*!< DDRPHY_T::DX0MDLR: MDLD Mask */ + +#define DDRPHY_DX0GTR_R0DGSL_Pos (0) /*!< DDRPHY_T::DX0GTR: R0DGSL Position */ +#define DDRPHY_DX0GTR_R0DGSL_Msk (0x7ul << DDRPHY_DX0GTR_R0DGSL_Pos) /*!< DDRPHY_T::DX0GTR: R0DGSL Mask */ + +#define DDRPHY_DX0GTR_R1DGSL_Pos (3) /*!< DDRPHY_T::DX0GTR: R1DGSL Position */ +#define DDRPHY_DX0GTR_R1DGSL_Msk (0x7ul << DDRPHY_DX0GTR_R1DGSL_Pos) /*!< DDRPHY_T::DX0GTR: R1DGSL Mask */ + +#define DDRPHY_DX0GTR_R2DGSL_Pos (6) /*!< DDRPHY_T::DX0GTR: R2DGSL Position */ +#define DDRPHY_DX0GTR_R2DGSL_Msk (0x7ul << DDRPHY_DX0GTR_R2DGSL_Pos) /*!< DDRPHY_T::DX0GTR: R2DGSL Mask */ + +#define DDRPHY_DX0GTR_R3DGSL_Pos (9) /*!< DDRPHY_T::DX0GTR: R3DGSL Position */ +#define DDRPHY_DX0GTR_R3DGSL_Msk (0x7ul << DDRPHY_DX0GTR_R3DGSL_Pos) /*!< DDRPHY_T::DX0GTR: R3DGSL Mask */ + +#define DDRPHY_DX0GTR_R0WLSL_Pos (12) /*!< DDRPHY_T::DX0GTR: R0WLSL Position */ +#define DDRPHY_DX0GTR_R0WLSL_Msk (0x3ul << DDRPHY_DX0GTR_R0WLSL_Pos) /*!< DDRPHY_T::DX0GTR: R0WLSL Mask */ + +#define DDRPHY_DX0GTR_R1WLSL_Pos (14) /*!< DDRPHY_T::DX0GTR: R1WLSL Position */ +#define DDRPHY_DX0GTR_R1WLSL_Msk (0x3ul << DDRPHY_DX0GTR_R1WLSL_Pos) /*!< DDRPHY_T::DX0GTR: R1WLSL Mask */ + +#define DDRPHY_DX0GTR_R2WLSL_Pos (16) /*!< DDRPHY_T::DX0GTR: R2WLSL Position */ +#define DDRPHY_DX0GTR_R2WLSL_Msk (0x3ul << DDRPHY_DX0GTR_R2WLSL_Pos) /*!< DDRPHY_T::DX0GTR: R2WLSL Mask */ + +#define DDRPHY_DX0GTR_R3WLSL_Pos (18) /*!< DDRPHY_T::DX0GTR: R3WLSL Position */ +#define DDRPHY_DX0GTR_R3WLSL_Msk (0x3ul << DDRPHY_DX0GTR_R3WLSL_Pos) /*!< DDRPHY_T::DX0GTR: R3WLSL Mask */ + +#define DDRPHY_DX0GSR2_RDERR_Pos (0) /*!< DDRPHY_T::DX0GSR2: RDERR Position */ +#define DDRPHY_DX0GSR2_RDERR_Msk (0x1ul << DDRPHY_DX0GSR2_RDERR_Pos) /*!< DDRPHY_T::DX0GSR2: RDERR Mask */ + +#define DDRPHY_DX0GSR2_RDWN_Pos (1) /*!< DDRPHY_T::DX0GSR2: RDWN Position */ +#define DDRPHY_DX0GSR2_RDWN_Msk (0x1ul << DDRPHY_DX0GSR2_RDWN_Pos) /*!< DDRPHY_T::DX0GSR2: RDWN Mask */ + +#define DDRPHY_DX0GSR2_WDERR_Pos (2) /*!< DDRPHY_T::DX0GSR2: WDERR Position */ +#define DDRPHY_DX0GSR2_WDERR_Msk (0x1ul << DDRPHY_DX0GSR2_WDERR_Pos) /*!< DDRPHY_T::DX0GSR2: WDERR Mask */ + +#define DDRPHY_DX0GSR2_WDWN_Pos (3) /*!< DDRPHY_T::DX0GSR2: WDWN Position */ +#define DDRPHY_DX0GSR2_WDWN_Msk (0x1ul << DDRPHY_DX0GSR2_WDWN_Pos) /*!< DDRPHY_T::DX0GSR2: WDWN Mask */ + +#define DDRPHY_DX0GSR2_REERR_Pos (4) /*!< DDRPHY_T::DX0GSR2: REERR Position */ +#define DDRPHY_DX0GSR2_REERR_Msk (0x1ul << DDRPHY_DX0GSR2_REERR_Pos) /*!< DDRPHY_T::DX0GSR2: REERR Mask */ + +#define DDRPHY_DX0GSR2_REWN_Pos (5) /*!< DDRPHY_T::DX0GSR2: REWN Position */ +#define DDRPHY_DX0GSR2_REWN_Msk (0x1ul << DDRPHY_DX0GSR2_REWN_Pos) /*!< DDRPHY_T::DX0GSR2: REWN Mask */ + +#define DDRPHY_DX0GSR2_WEERR_Pos (6) /*!< DDRPHY_T::DX0GSR2: WEERR Position */ +#define DDRPHY_DX0GSR2_WEERR_Msk (0x1ul << DDRPHY_DX0GSR2_WEERR_Pos) /*!< DDRPHY_T::DX0GSR2: WEERR Mask */ + +#define DDRPHY_DX0GSR2_WEWN_Pos (7) /*!< DDRPHY_T::DX0GSR2: WEWN Position */ +#define DDRPHY_DX0GSR2_WEWN_Msk (0x1ul << DDRPHY_DX0GSR2_WEWN_Pos) /*!< DDRPHY_T::DX0GSR2: WEWN Mask */ + +#define DDRPHY_DX0GSR2_ESTAT_Pos (8) /*!< DDRPHY_T::DX0GSR2: ESTAT Position */ +#define DDRPHY_DX0GSR2_ESTAT_Msk (0xful << DDRPHY_DX0GSR2_ESTAT_Pos) /*!< DDRPHY_T::DX0GSR2: ESTAT Mask */ + +#define DDRPHY_DX1GCR_DXEN_Pos (0) /*!< DDRPHY_T::DX1GCR: DXEN Position */ +#define DDRPHY_DX1GCR_DXEN_Msk (0x1ul << DDRPHY_DX1GCR_DXEN_Pos) /*!< DDRPHY_T::DX1GCR: DXEN Mask */ + +#define DDRPHY_DX1GCR_DQSODT_Pos (1) /*!< DDRPHY_T::DX1GCR: DQSODT Position */ +#define DDRPHY_DX1GCR_DQSODT_Msk (0x1ul << DDRPHY_DX1GCR_DQSODT_Pos) /*!< DDRPHY_T::DX1GCR: DQSODT Mask */ + +#define DDRPHY_DX1GCR_DQODT_Pos (2) /*!< DDRPHY_T::DX1GCR: DQODT Position */ +#define DDRPHY_DX1GCR_DQODT_Msk (0x1ul << DDRPHY_DX1GCR_DQODT_Pos) /*!< DDRPHY_T::DX1GCR: DQODT Mask */ + +#define DDRPHY_DX1GCR_DXIOM_Pos (3) /*!< DDRPHY_T::DX1GCR: DXIOM Position */ +#define DDRPHY_DX1GCR_DXIOM_Msk (0x1ul << DDRPHY_DX1GCR_DXIOM_Pos) /*!< DDRPHY_T::DX1GCR: DXIOM Mask */ + +#define DDRPHY_DX1GCR_DXPDD_Pos (4) /*!< DDRPHY_T::DX1GCR: DXPDD Position */ +#define DDRPHY_DX1GCR_DXPDD_Msk (0x1ul << DDRPHY_DX1GCR_DXPDD_Pos) /*!< DDRPHY_T::DX1GCR: DXPDD Mask */ + +#define DDRPHY_DX1GCR_DXPDR_Pos (5) /*!< DDRPHY_T::DX1GCR: DXPDR Position */ +#define DDRPHY_DX1GCR_DXPDR_Msk (0x1ul << DDRPHY_DX1GCR_DXPDR_Pos) /*!< DDRPHY_T::DX1GCR: DXPDR Mask */ + +#define DDRPHY_DX1GCR_DQSRPD_Pos (6) /*!< DDRPHY_T::DX1GCR: DQSRPD Position */ +#define DDRPHY_DX1GCR_DQSRPD_Msk (0x1ul << DDRPHY_DX1GCR_DQSRPD_Pos) /*!< DDRPHY_T::DX1GCR: DQSRPD Mask */ + +#define DDRPHY_DX1GCR_DSEN_Pos (7) /*!< DDRPHY_T::DX1GCR: DSEN Position */ +#define DDRPHY_DX1GCR_DSEN_Msk (0x3ul << DDRPHY_DX1GCR_DSEN_Pos) /*!< DDRPHY_T::DX1GCR: DSEN Mask */ + +#define DDRPHY_DX1GCR_DQSRTT_Pos (9) /*!< DDRPHY_T::DX1GCR: DQSRTT Position */ +#define DDRPHY_DX1GCR_DQSRTT_Msk (0x1ul << DDRPHY_DX1GCR_DQSRTT_Pos) /*!< DDRPHY_T::DX1GCR: DQSRTT Mask */ + +#define DDRPHY_DX1GCR_DQRTT_Pos (10) /*!< DDRPHY_T::DX1GCR: DQRTT Position */ +#define DDRPHY_DX1GCR_DQRTT_Msk (0x1ul << DDRPHY_DX1GCR_DQRTT_Pos) /*!< DDRPHY_T::DX1GCR: DQRTT Mask */ + +#define DDRPHY_DX1GCR_RTTOH_Pos (11) /*!< DDRPHY_T::DX1GCR: RTTOH Position */ +#define DDRPHY_DX1GCR_RTTOH_Msk (0x3ul << DDRPHY_DX1GCR_RTTOH_Pos) /*!< DDRPHY_T::DX1GCR: RTTOH Mask */ + +#define DDRPHY_DX1GCR_RTTOAL_Pos (13) /*!< DDRPHY_T::DX1GCR: RTTOAL Position */ +#define DDRPHY_DX1GCR_RTTOAL_Msk (0x1ul << DDRPHY_DX1GCR_RTTOAL_Pos) /*!< DDRPHY_T::DX1GCR: RTTOAL Mask */ + +#define DDRPHY_DX1GCR_DXOEO_Pos (14) /*!< DDRPHY_T::DX1GCR: DXOEO Position */ +#define DDRPHY_DX1GCR_DXOEO_Msk (0x3ul << DDRPHY_DX1GCR_DXOEO_Pos) /*!< DDRPHY_T::DX1GCR: DXOEO Mask */ + +#define DDRPHY_DX1GCR_PLLRST_Pos (16) /*!< DDRPHY_T::DX1GCR: PLLRST Position */ +#define DDRPHY_DX1GCR_PLLRST_Msk (0x1ul << DDRPHY_DX1GCR_PLLRST_Pos) /*!< DDRPHY_T::DX1GCR: PLLRST Mask */ + +#define DDRPHY_DX1GCR_PLLPD_Pos (17) /*!< DDRPHY_T::DX1GCR: PLLPD Position */ +#define DDRPHY_DX1GCR_PLLPD_Msk (0x1ul << DDRPHY_DX1GCR_PLLPD_Pos) /*!< DDRPHY_T::DX1GCR: PLLPD Mask */ + +#define DDRPHY_DX1GCR_GSHIFT_Pos (18) /*!< DDRPHY_T::DX1GCR: GSHIFT Position */ +#define DDRPHY_DX1GCR_GSHIFT_Msk (0x1ul << DDRPHY_DX1GCR_GSHIFT_Pos) /*!< DDRPHY_T::DX1GCR: GSHIFT Mask */ + +#define DDRPHY_DX1GCR_PLLBYP_Pos (19) /*!< DDRPHY_T::DX1GCR: PLLBYP Position */ +#define DDRPHY_DX1GCR_PLLBYP_Msk (0x1ul << DDRPHY_DX1GCR_PLLBYP_Pos) /*!< DDRPHY_T::DX1GCR: PLLBYP Mask */ + +#define DDRPHY_DX1GCR_WLRKEN_Pos (26) /*!< DDRPHY_T::DX1GCR: WLRKEN Position */ +#define DDRPHY_DX1GCR_WLRKEN_Msk (0xful << DDRPHY_DX1GCR_WLRKEN_Pos) /*!< DDRPHY_T::DX1GCR: WLRKEN Mask */ + +#define DDRPHY_DX1GCR_MDLEN_Pos (30) /*!< DDRPHY_T::DX1GCR: MDLEN Position */ +#define DDRPHY_DX1GCR_MDLEN_Msk (0x1ul << DDRPHY_DX1GCR_MDLEN_Pos) /*!< DDRPHY_T::DX1GCR: MDLEN Mask */ + +#define DDRPHY_DX1GCR_CALBYP_Pos (31) /*!< DDRPHY_T::DX1GCR: CALBYP Position */ +#define DDRPHY_DX1GCR_CALBYP_Msk (0x1ul << DDRPHY_DX1GCR_CALBYP_Pos) /*!< DDRPHY_T::DX1GCR: CALBYP Mask */ + +#define DDRPHY_DX1GSR0_WDQCAL_Pos (0) /*!< DDRPHY_T::DX1GSR0: WDQCAL Position */ +#define DDRPHY_DX1GSR0_WDQCAL_Msk (0x1ul << DDRPHY_DX1GSR0_WDQCAL_Pos) /*!< DDRPHY_T::DX1GSR0: WDQCAL Mask */ + +#define DDRPHY_DX1GSR0_RDQSCAL_Pos (1) /*!< DDRPHY_T::DX1GSR0: RDQSCAL Position */ +#define DDRPHY_DX1GSR0_RDQSCAL_Msk (0x1ul << DDRPHY_DX1GSR0_RDQSCAL_Pos) /*!< DDRPHY_T::DX1GSR0: RDQSCAL Mask */ + +#define DDRPHY_DX1GSR0_RDQSNCAL_Pos (2) /*!< DDRPHY_T::DX1GSR0: RDQSNCAL Position */ +#define DDRPHY_DX1GSR0_RDQSNCAL_Msk (0x1ul << DDRPHY_DX1GSR0_RDQSNCAL_Pos) /*!< DDRPHY_T::DX1GSR0: RDQSNCAL Mask */ + +#define DDRPHY_DX1GSR0_GDQSCAL_Pos (3) /*!< DDRPHY_T::DX1GSR0: GDQSCAL Position */ +#define DDRPHY_DX1GSR0_GDQSCAL_Msk (0x1ul << DDRPHY_DX1GSR0_GDQSCAL_Pos) /*!< DDRPHY_T::DX1GSR0: GDQSCAL Mask */ + +#define DDRPHY_DX1GSR0_WLCAL_Pos (4) /*!< DDRPHY_T::DX1GSR0: WLCAL Position */ +#define DDRPHY_DX1GSR0_WLCAL_Msk (0x1ul << DDRPHY_DX1GSR0_WLCAL_Pos) /*!< DDRPHY_T::DX1GSR0: WLCAL Mask */ + +#define DDRPHY_DX1GSR0_WLDONE_Pos (5) /*!< DDRPHY_T::DX1GSR0: WLDONE Position */ +#define DDRPHY_DX1GSR0_WLDONE_Msk (0x1ul << DDRPHY_DX1GSR0_WLDONE_Pos) /*!< DDRPHY_T::DX1GSR0: WLDONE Mask */ + +#define DDRPHY_DX1GSR0_WLERR_Pos (6) /*!< DDRPHY_T::DX1GSR0: WLERR Position */ +#define DDRPHY_DX1GSR0_WLERR_Msk (0x1ul << DDRPHY_DX1GSR0_WLERR_Pos) /*!< DDRPHY_T::DX1GSR0: WLERR Mask */ + +#define DDRPHY_DX1GSR0_WLPRD_Pos (7) /*!< DDRPHY_T::DX1GSR0: WLPRD Position */ +#define DDRPHY_DX1GSR0_WLPRD_Msk (0xfful << DDRPHY_DX1GSR0_WLPRD_Pos) /*!< DDRPHY_T::DX1GSR0: WLPRD Mask */ + +#define DDRPHY_DX1GSR0_DPLOCK_Pos (15) /*!< DDRPHY_T::DX1GSR0: DPLOCK Position */ +#define DDRPHY_DX1GSR0_DPLOCK_Msk (0x1ul << DDRPHY_DX1GSR0_DPLOCK_Pos) /*!< DDRPHY_T::DX1GSR0: DPLOCK Mask */ + +#define DDRPHY_DX1GSR0_GDQSPRD_Pos (16) /*!< DDRPHY_T::DX1GSR0: GDQSPRD Position */ +#define DDRPHY_DX1GSR0_GDQSPRD_Msk (0xfful << DDRPHY_DX1GSR0_GDQSPRD_Pos) /*!< DDRPHY_T::DX1GSR0: GDQSPRD Mask */ + +#define DDRPHY_DX1GSR0_QSGERR_Pos (24) /*!< DDRPHY_T::DX1GSR0: QSGERR Position */ +#define DDRPHY_DX1GSR0_QSGERR_Msk (0xful << DDRPHY_DX1GSR0_QSGERR_Pos) /*!< DDRPHY_T::DX1GSR0: QSGERR Mask */ + +#define DDRPHY_DX1GSR0_WLDQ_Pos (28) /*!< DDRPHY_T::DX1GSR0: WLDQ Position */ +#define DDRPHY_DX1GSR0_WLDQ_Msk (0x1ul << DDRPHY_DX1GSR0_WLDQ_Pos) /*!< DDRPHY_T::DX1GSR0: WLDQ Mask */ + +#define DDRPHY_DX1GSR1_DLTDONE_Pos (0) /*!< DDRPHY_T::DX1GSR1: DLTDONE Position */ +#define DDRPHY_DX1GSR1_DLTDONE_Msk (0x1ul << DDRPHY_DX1GSR1_DLTDONE_Pos) /*!< DDRPHY_T::DX1GSR1: DLTDONE Mask */ + +#define DDRPHY_DX1GSR1_DLTCODE_Pos (1) /*!< DDRPHY_T::DX1GSR1: DLTCODE Position */ +#define DDRPHY_DX1GSR1_DLTCODE_Msk (0xfffffful << DDRPHY_DX1GSR1_DLTCODE_Pos) /*!< DDRPHY_T::DX1GSR1: DLTCODE Mask */ + +#define DDRPHY_DX1BDLR0_DQ0WBD_Pos (0) /*!< DDRPHY_T::DX1BDLR0: DQ0WBD Position */ +#define DDRPHY_DX1BDLR0_DQ0WBD_Msk (0x3ful << DDRPHY_DX1BDLR0_DQ0WBD_Pos) /*!< DDRPHY_T::DX1BDLR0: DQ0WBD Mask */ + +#define DDRPHY_DX1BDLR0_DQ1WBD_Pos (6) /*!< DDRPHY_T::DX1BDLR0: DQ1WBD Position */ +#define DDRPHY_DX1BDLR0_DQ1WBD_Msk (0x3ful << DDRPHY_DX1BDLR0_DQ1WBD_Pos) /*!< DDRPHY_T::DX1BDLR0: DQ1WBD Mask */ + +#define DDRPHY_DX1BDLR0_DQ2WBD_Pos (12) /*!< DDRPHY_T::DX1BDLR0: DQ2WBD Position */ +#define DDRPHY_DX1BDLR0_DQ2WBD_Msk (0x3ful << DDRPHY_DX1BDLR0_DQ2WBD_Pos) /*!< DDRPHY_T::DX1BDLR0: DQ2WBD Mask */ + +#define DDRPHY_DX1BDLR0_DQ3WBD_Pos (18) /*!< DDRPHY_T::DX1BDLR0: DQ3WBD Position */ +#define DDRPHY_DX1BDLR0_DQ3WBD_Msk (0x3ful << DDRPHY_DX1BDLR0_DQ3WBD_Pos) /*!< DDRPHY_T::DX1BDLR0: DQ3WBD Mask */ + +#define DDRPHY_DX1BDLR0_DQ4WBD_Pos (24) /*!< DDRPHY_T::DX1BDLR0: DQ4WBD Position */ +#define DDRPHY_DX1BDLR0_DQ4WBD_Msk (0x3ful << DDRPHY_DX1BDLR0_DQ4WBD_Pos) /*!< DDRPHY_T::DX1BDLR0: DQ4WBD Mask */ + +#define DDRPHY_DX1BDLR1_DQ5WBD_Pos (0) /*!< DDRPHY_T::DX1BDLR1: DQ5WBD Position */ +#define DDRPHY_DX1BDLR1_DQ5WBD_Msk (0x3ful << DDRPHY_DX1BDLR1_DQ5WBD_Pos) /*!< DDRPHY_T::DX1BDLR1: DQ5WBD Mask */ + +#define DDRPHY_DX1BDLR1_DQ6WBD_Pos (6) /*!< DDRPHY_T::DX1BDLR1: DQ6WBD Position */ +#define DDRPHY_DX1BDLR1_DQ6WBD_Msk (0x3ful << DDRPHY_DX1BDLR1_DQ6WBD_Pos) /*!< DDRPHY_T::DX1BDLR1: DQ6WBD Mask */ + +#define DDRPHY_DX1BDLR1_DQ7WBD_Pos (12) /*!< DDRPHY_T::DX1BDLR1: DQ7WBD Position */ +#define DDRPHY_DX1BDLR1_DQ7WBD_Msk (0x3ful << DDRPHY_DX1BDLR1_DQ7WBD_Pos) /*!< DDRPHY_T::DX1BDLR1: DQ7WBD Mask */ + +#define DDRPHY_DX1BDLR1_DMWBD_Pos (18) /*!< DDRPHY_T::DX1BDLR1: DMWBD Position */ +#define DDRPHY_DX1BDLR1_DMWBD_Msk (0x3ful << DDRPHY_DX1BDLR1_DMWBD_Pos) /*!< DDRPHY_T::DX1BDLR1: DMWBD Mask */ + +#define DDRPHY_DX1BDLR1_DSWBD_Pos (24) /*!< DDRPHY_T::DX1BDLR1: DSWBD Position */ +#define DDRPHY_DX1BDLR1_DSWBD_Msk (0x3ful << DDRPHY_DX1BDLR1_DSWBD_Pos) /*!< DDRPHY_T::DX1BDLR1: DSWBD Mask */ + +#define DDRPHY_DX1BDLR2_DSOEBD_Pos (0) /*!< DDRPHY_T::DX1BDLR2: DSOEBD Position */ +#define DDRPHY_DX1BDLR2_DSOEBD_Msk (0x3ful << DDRPHY_DX1BDLR2_DSOEBD_Pos) /*!< DDRPHY_T::DX1BDLR2: DSOEBD Mask */ + +#define DDRPHY_DX1BDLR2_DQOEBD_Pos (6) /*!< DDRPHY_T::DX1BDLR2: DQOEBD Position */ +#define DDRPHY_DX1BDLR2_DQOEBD_Msk (0x3ful << DDRPHY_DX1BDLR2_DQOEBD_Pos) /*!< DDRPHY_T::DX1BDLR2: DQOEBD Mask */ + +#define DDRPHY_DX1BDLR2_DSRBD_Pos (12) /*!< DDRPHY_T::DX1BDLR2: DSRBD Position */ +#define DDRPHY_DX1BDLR2_DSRBD_Msk (0x3ful << DDRPHY_DX1BDLR2_DSRBD_Pos) /*!< DDRPHY_T::DX1BDLR2: DSRBD Mask */ + +#define DDRPHY_DX1BDLR2_DSNRBD_Pos (18) /*!< DDRPHY_T::DX1BDLR2: DSNRBD Position */ +#define DDRPHY_DX1BDLR2_DSNRBD_Msk (0x3ful << DDRPHY_DX1BDLR2_DSNRBD_Pos) /*!< DDRPHY_T::DX1BDLR2: DSNRBD Mask */ + +#define DDRPHY_DX1BDLR3_DQ0RBD_Pos (0) /*!< DDRPHY_T::DX1BDLR3: DQ0RBD Position */ +#define DDRPHY_DX1BDLR3_DQ0RBD_Msk (0x3ful << DDRPHY_DX1BDLR3_DQ0RBD_Pos) /*!< DDRPHY_T::DX1BDLR3: DQ0RBD Mask */ + +#define DDRPHY_DX1BDLR3_DQ1RBD_Pos (6) /*!< DDRPHY_T::DX1BDLR3: DQ1RBD Position */ +#define DDRPHY_DX1BDLR3_DQ1RBD_Msk (0x3ful << DDRPHY_DX1BDLR3_DQ1RBD_Pos) /*!< DDRPHY_T::DX1BDLR3: DQ1RBD Mask */ + +#define DDRPHY_DX1BDLR3_DQ2RBD_Pos (12) /*!< DDRPHY_T::DX1BDLR3: DQ2RBD Position */ +#define DDRPHY_DX1BDLR3_DQ2RBD_Msk (0x3ful << DDRPHY_DX1BDLR3_DQ2RBD_Pos) /*!< DDRPHY_T::DX1BDLR3: DQ2RBD Mask */ + +#define DDRPHY_DX1BDLR3_DQ3RBD_Pos (18) /*!< DDRPHY_T::DX1BDLR3: DQ3RBD Position */ +#define DDRPHY_DX1BDLR3_DQ3RBD_Msk (0x3ful << DDRPHY_DX1BDLR3_DQ3RBD_Pos) /*!< DDRPHY_T::DX1BDLR3: DQ3RBD Mask */ + +#define DDRPHY_DX1BDLR3_DQ4RBD_Pos (24) /*!< DDRPHY_T::DX1BDLR3: DQ4RBD Position */ +#define DDRPHY_DX1BDLR3_DQ4RBD_Msk (0x3ful << DDRPHY_DX1BDLR3_DQ4RBD_Pos) /*!< DDRPHY_T::DX1BDLR3: DQ4RBD Mask */ + +#define DDRPHY_DX1BDLR4_DQ5RBD_Pos (0) /*!< DDRPHY_T::DX1BDLR4: DQ5RBD Position */ +#define DDRPHY_DX1BDLR4_DQ5RBD_Msk (0x3ful << DDRPHY_DX1BDLR4_DQ5RBD_Pos) /*!< DDRPHY_T::DX1BDLR4: DQ5RBD Mask */ + +#define DDRPHY_DX1BDLR4_DQ6RBD_Pos (6) /*!< DDRPHY_T::DX1BDLR4: DQ6RBD Position */ +#define DDRPHY_DX1BDLR4_DQ6RBD_Msk (0x3ful << DDRPHY_DX1BDLR4_DQ6RBD_Pos) /*!< DDRPHY_T::DX1BDLR4: DQ6RBD Mask */ + +#define DDRPHY_DX1BDLR4_DQ7RBD_Pos (12) /*!< DDRPHY_T::DX1BDLR4: DQ7RBD Position */ +#define DDRPHY_DX1BDLR4_DQ7RBD_Msk (0x3ful << DDRPHY_DX1BDLR4_DQ7RBD_Pos) /*!< DDRPHY_T::DX1BDLR4: DQ7RBD Mask */ + +#define DDRPHY_DX1BDLR4_DMRBD_Pos (18) /*!< DDRPHY_T::DX1BDLR4: DMRBD Position */ +#define DDRPHY_DX1BDLR4_DMRBD_Msk (0x3ful << DDRPHY_DX1BDLR4_DMRBD_Pos) /*!< DDRPHY_T::DX1BDLR4: DMRBD Mask */ + +#define DDRPHY_DX1LCDLR0_R0WLD_Pos (0) /*!< DDRPHY_T::DX1LCDLR0: R0WLD Position */ +#define DDRPHY_DX1LCDLR0_R0WLD_Msk (0xfful << DDRPHY_DX1LCDLR0_R0WLD_Pos) /*!< DDRPHY_T::DX1LCDLR0: R0WLD Mask */ + +#define DDRPHY_DX1LCDLR0_R1WLD_Pos (8) /*!< DDRPHY_T::DX1LCDLR0: R1WLD Position */ +#define DDRPHY_DX1LCDLR0_R1WLD_Msk (0xfful << DDRPHY_DX1LCDLR0_R1WLD_Pos) /*!< DDRPHY_T::DX1LCDLR0: R1WLD Mask */ + +#define DDRPHY_DX1LCDLR0_R2WLD_Pos (16) /*!< DDRPHY_T::DX1LCDLR0: R2WLD Position */ +#define DDRPHY_DX1LCDLR0_R2WLD_Msk (0xfful << DDRPHY_DX1LCDLR0_R2WLD_Pos) /*!< DDRPHY_T::DX1LCDLR0: R2WLD Mask */ + +#define DDRPHY_DX1LCDLR0_R3WLD_Pos (24) /*!< DDRPHY_T::DX1LCDLR0: R3WLD Position */ +#define DDRPHY_DX1LCDLR0_R3WLD_Msk (0xfful << DDRPHY_DX1LCDLR0_R3WLD_Pos) /*!< DDRPHY_T::DX1LCDLR0: R3WLD Mask */ + +#define DDRPHY_DX1LCDLR1_WDQD_Pos (0) /*!< DDRPHY_T::DX1LCDLR1: WDQD Position */ +#define DDRPHY_DX1LCDLR1_WDQD_Msk (0xfful << DDRPHY_DX1LCDLR1_WDQD_Pos) /*!< DDRPHY_T::DX1LCDLR1: WDQD Mask */ + +#define DDRPHY_DX1LCDLR1_RDQSD_Pos (8) /*!< DDRPHY_T::DX1LCDLR1: RDQSD Position */ +#define DDRPHY_DX1LCDLR1_RDQSD_Msk (0xfful << DDRPHY_DX1LCDLR1_RDQSD_Pos) /*!< DDRPHY_T::DX1LCDLR1: RDQSD Mask */ + +#define DDRPHY_DX1LCDLR1_RDQSND_Pos (16) /*!< DDRPHY_T::DX1LCDLR1: RDQSND Position */ +#define DDRPHY_DX1LCDLR1_RDQSND_Msk (0xfful << DDRPHY_DX1LCDLR1_RDQSND_Pos) /*!< DDRPHY_T::DX1LCDLR1: RDQSND Mask */ + +#define DDRPHY_DX1LCDLR2_R0DQSGD_Pos (0) /*!< DDRPHY_T::DX1LCDLR2: R0DQSGD Position */ +#define DDRPHY_DX1LCDLR2_R0DQSGD_Msk (0xfful << DDRPHY_DX1LCDLR2_R0DQSGD_Pos) /*!< DDRPHY_T::DX1LCDLR2: R0DQSGD Mask */ + +#define DDRPHY_DX1LCDLR2_R1DQSGD_Pos (8) /*!< DDRPHY_T::DX1LCDLR2: R1DQSGD Position */ +#define DDRPHY_DX1LCDLR2_R1DQSGD_Msk (0xfful << DDRPHY_DX1LCDLR2_R1DQSGD_Pos) /*!< DDRPHY_T::DX1LCDLR2: R1DQSGD Mask */ + +#define DDRPHY_DX1LCDLR2_R2DQSGD_Pos (16) /*!< DDRPHY_T::DX1LCDLR2: R2DQSGD Position */ +#define DDRPHY_DX1LCDLR2_R2DQSGD_Msk (0xfful << DDRPHY_DX1LCDLR2_R2DQSGD_Pos) /*!< DDRPHY_T::DX1LCDLR2: R2DQSGD Mask */ + +#define DDRPHY_DX1LCDLR2_R3DQSGD_Pos (24) /*!< DDRPHY_T::DX1LCDLR2: R3DQSGD Position */ +#define DDRPHY_DX1LCDLR2_R3DQSGD_Msk (0xfful << DDRPHY_DX1LCDLR2_R3DQSGD_Pos) /*!< DDRPHY_T::DX1LCDLR2: R3DQSGD Mask */ + +#define DDRPHY_DX1MDLR_IPRD_Pos (0) /*!< DDRPHY_T::DX1MDLR: IPRD Position */ +#define DDRPHY_DX1MDLR_IPRD_Msk (0xfful << DDRPHY_DX1MDLR_IPRD_Pos) /*!< DDRPHY_T::DX1MDLR: IPRD Mask */ + +#define DDRPHY_DX1MDLR_TPRD_Pos (8) /*!< DDRPHY_T::DX1MDLR: TPRD Position */ +#define DDRPHY_DX1MDLR_TPRD_Msk (0xfful << DDRPHY_DX1MDLR_TPRD_Pos) /*!< DDRPHY_T::DX1MDLR: TPRD Mask */ + +#define DDRPHY_DX1MDLR_MDLD_Pos (16) /*!< DDRPHY_T::DX1MDLR: MDLD Position */ +#define DDRPHY_DX1MDLR_MDLD_Msk (0xfful << DDRPHY_DX1MDLR_MDLD_Pos) /*!< DDRPHY_T::DX1MDLR: MDLD Mask */ + +#define DDRPHY_DX1GTR_R0DGSL_Pos (0) /*!< DDRPHY_T::DX1GTR: R0DGSL Position */ +#define DDRPHY_DX1GTR_R0DGSL_Msk (0x7ul << DDRPHY_DX1GTR_R0DGSL_Pos) /*!< DDRPHY_T::DX1GTR: R0DGSL Mask */ + +#define DDRPHY_DX1GTR_R1DGSL_Pos (3) /*!< DDRPHY_T::DX1GTR: R1DGSL Position */ +#define DDRPHY_DX1GTR_R1DGSL_Msk (0x7ul << DDRPHY_DX1GTR_R1DGSL_Pos) /*!< DDRPHY_T::DX1GTR: R1DGSL Mask */ + +#define DDRPHY_DX1GTR_R2DGSL_Pos (6) /*!< DDRPHY_T::DX1GTR: R2DGSL Position */ +#define DDRPHY_DX1GTR_R2DGSL_Msk (0x7ul << DDRPHY_DX1GTR_R2DGSL_Pos) /*!< DDRPHY_T::DX1GTR: R2DGSL Mask */ + +#define DDRPHY_DX1GTR_R3DGSL_Pos (9) /*!< DDRPHY_T::DX1GTR: R3DGSL Position */ +#define DDRPHY_DX1GTR_R3DGSL_Msk (0x7ul << DDRPHY_DX1GTR_R3DGSL_Pos) /*!< DDRPHY_T::DX1GTR: R3DGSL Mask */ + +#define DDRPHY_DX1GTR_R0WLSL_Pos (12) /*!< DDRPHY_T::DX1GTR: R0WLSL Position */ +#define DDRPHY_DX1GTR_R0WLSL_Msk (0x3ul << DDRPHY_DX1GTR_R0WLSL_Pos) /*!< DDRPHY_T::DX1GTR: R0WLSL Mask */ + +#define DDRPHY_DX1GTR_R1WLSL_Pos (14) /*!< DDRPHY_T::DX1GTR: R1WLSL Position */ +#define DDRPHY_DX1GTR_R1WLSL_Msk (0x3ul << DDRPHY_DX1GTR_R1WLSL_Pos) /*!< DDRPHY_T::DX1GTR: R1WLSL Mask */ + +#define DDRPHY_DX1GTR_R2WLSL_Pos (16) /*!< DDRPHY_T::DX1GTR: R2WLSL Position */ +#define DDRPHY_DX1GTR_R2WLSL_Msk (0x3ul << DDRPHY_DX1GTR_R2WLSL_Pos) /*!< DDRPHY_T::DX1GTR: R2WLSL Mask */ + +#define DDRPHY_DX1GTR_R3WLSL_Pos (18) /*!< DDRPHY_T::DX1GTR: R3WLSL Position */ +#define DDRPHY_DX1GTR_R3WLSL_Msk (0x3ul << DDRPHY_DX1GTR_R3WLSL_Pos) /*!< DDRPHY_T::DX1GTR: R3WLSL Mask */ + +#define DDRPHY_DX1GSR2_RDERR_Pos (0) /*!< DDRPHY_T::DX1GSR2: RDERR Position */ +#define DDRPHY_DX1GSR2_RDERR_Msk (0x1ul << DDRPHY_DX1GSR2_RDERR_Pos) /*!< DDRPHY_T::DX1GSR2: RDERR Mask */ + +#define DDRPHY_DX1GSR2_RDWN_Pos (1) /*!< DDRPHY_T::DX1GSR2: RDWN Position */ +#define DDRPHY_DX1GSR2_RDWN_Msk (0x1ul << DDRPHY_DX1GSR2_RDWN_Pos) /*!< DDRPHY_T::DX1GSR2: RDWN Mask */ + +#define DDRPHY_DX1GSR2_WDERR_Pos (2) /*!< DDRPHY_T::DX1GSR2: WDERR Position */ +#define DDRPHY_DX1GSR2_WDERR_Msk (0x1ul << DDRPHY_DX1GSR2_WDERR_Pos) /*!< DDRPHY_T::DX1GSR2: WDERR Mask */ + +#define DDRPHY_DX1GSR2_WDWN_Pos (3) /*!< DDRPHY_T::DX1GSR2: WDWN Position */ +#define DDRPHY_DX1GSR2_WDWN_Msk (0x1ul << DDRPHY_DX1GSR2_WDWN_Pos) /*!< DDRPHY_T::DX1GSR2: WDWN Mask */ + +#define DDRPHY_DX1GSR2_REERR_Pos (4) /*!< DDRPHY_T::DX1GSR2: REERR Position */ +#define DDRPHY_DX1GSR2_REERR_Msk (0x1ul << DDRPHY_DX1GSR2_REERR_Pos) /*!< DDRPHY_T::DX1GSR2: REERR Mask */ + +#define DDRPHY_DX1GSR2_REWN_Pos (5) /*!< DDRPHY_T::DX1GSR2: REWN Position */ +#define DDRPHY_DX1GSR2_REWN_Msk (0x1ul << DDRPHY_DX1GSR2_REWN_Pos) /*!< DDRPHY_T::DX1GSR2: REWN Mask */ + +#define DDRPHY_DX1GSR2_WEERR_Pos (6) /*!< DDRPHY_T::DX1GSR2: WEERR Position */ +#define DDRPHY_DX1GSR2_WEERR_Msk (0x1ul << DDRPHY_DX1GSR2_WEERR_Pos) /*!< DDRPHY_T::DX1GSR2: WEERR Mask */ + +#define DDRPHY_DX1GSR2_WEWN_Pos (7) /*!< DDRPHY_T::DX1GSR2: WEWN Position */ +#define DDRPHY_DX1GSR2_WEWN_Msk (0x1ul << DDRPHY_DX1GSR2_WEWN_Pos) /*!< DDRPHY_T::DX1GSR2: WEWN Mask */ + +#define DDRPHY_DX1GSR2_ESTAT_Pos (8) /*!< DDRPHY_T::DX1GSR2: ESTAT Position */ +#define DDRPHY_DX1GSR2_ESTAT_Msk (0xful << DDRPHY_DX1GSR2_ESTAT_Pos) /*!< DDRPHY_T::DX1GSR2: ESTAT Mask */ + +#define DDRPHY_DX2GCR_DXEN_Pos (0) /*!< DDRPHY_T::DX2GCR: DXEN Position */ +#define DDRPHY_DX2GCR_DXEN_Msk (0x1ul << DDRPHY_DX2GCR_DXEN_Pos) /*!< DDRPHY_T::DX2GCR: DXEN Mask */ + +#define DDRPHY_DX2GCR_DQSODT_Pos (1) /*!< DDRPHY_T::DX2GCR: DQSODT Position */ +#define DDRPHY_DX2GCR_DQSODT_Msk (0x1ul << DDRPHY_DX2GCR_DQSODT_Pos) /*!< DDRPHY_T::DX2GCR: DQSODT Mask */ + +#define DDRPHY_DX2GCR_DQODT_Pos (2) /*!< DDRPHY_T::DX2GCR: DQODT Position */ +#define DDRPHY_DX2GCR_DQODT_Msk (0x1ul << DDRPHY_DX2GCR_DQODT_Pos) /*!< DDRPHY_T::DX2GCR: DQODT Mask */ + +#define DDRPHY_DX2GCR_DXIOM_Pos (3) /*!< DDRPHY_T::DX2GCR: DXIOM Position */ +#define DDRPHY_DX2GCR_DXIOM_Msk (0x1ul << DDRPHY_DX2GCR_DXIOM_Pos) /*!< DDRPHY_T::DX2GCR: DXIOM Mask */ + +#define DDRPHY_DX2GCR_DXPDD_Pos (4) /*!< DDRPHY_T::DX2GCR: DXPDD Position */ +#define DDRPHY_DX2GCR_DXPDD_Msk (0x1ul << DDRPHY_DX2GCR_DXPDD_Pos) /*!< DDRPHY_T::DX2GCR: DXPDD Mask */ + +#define DDRPHY_DX2GCR_DXPDR_Pos (5) /*!< DDRPHY_T::DX2GCR: DXPDR Position */ +#define DDRPHY_DX2GCR_DXPDR_Msk (0x1ul << DDRPHY_DX2GCR_DXPDR_Pos) /*!< DDRPHY_T::DX2GCR: DXPDR Mask */ + +#define DDRPHY_DX2GCR_DQSRPD_Pos (6) /*!< DDRPHY_T::DX2GCR: DQSRPD Position */ +#define DDRPHY_DX2GCR_DQSRPD_Msk (0x1ul << DDRPHY_DX2GCR_DQSRPD_Pos) /*!< DDRPHY_T::DX2GCR: DQSRPD Mask */ + +#define DDRPHY_DX2GCR_DSEN_Pos (7) /*!< DDRPHY_T::DX2GCR: DSEN Position */ +#define DDRPHY_DX2GCR_DSEN_Msk (0x3ul << DDRPHY_DX2GCR_DSEN_Pos) /*!< DDRPHY_T::DX2GCR: DSEN Mask */ + +#define DDRPHY_DX2GCR_DQSRTT_Pos (9) /*!< DDRPHY_T::DX2GCR: DQSRTT Position */ +#define DDRPHY_DX2GCR_DQSRTT_Msk (0x1ul << DDRPHY_DX2GCR_DQSRTT_Pos) /*!< DDRPHY_T::DX2GCR: DQSRTT Mask */ + +#define DDRPHY_DX2GCR_DQRTT_Pos (10) /*!< DDRPHY_T::DX2GCR: DQRTT Position */ +#define DDRPHY_DX2GCR_DQRTT_Msk (0x1ul << DDRPHY_DX2GCR_DQRTT_Pos) /*!< DDRPHY_T::DX2GCR: DQRTT Mask */ + +#define DDRPHY_DX2GCR_RTTOH_Pos (11) /*!< DDRPHY_T::DX2GCR: RTTOH Position */ +#define DDRPHY_DX2GCR_RTTOH_Msk (0x3ul << DDRPHY_DX2GCR_RTTOH_Pos) /*!< DDRPHY_T::DX2GCR: RTTOH Mask */ + +#define DDRPHY_DX2GCR_RTTOAL_Pos (13) /*!< DDRPHY_T::DX2GCR: RTTOAL Position */ +#define DDRPHY_DX2GCR_RTTOAL_Msk (0x1ul << DDRPHY_DX2GCR_RTTOAL_Pos) /*!< DDRPHY_T::DX2GCR: RTTOAL Mask */ + +#define DDRPHY_DX2GCR_DXOEO_Pos (14) /*!< DDRPHY_T::DX2GCR: DXOEO Position */ +#define DDRPHY_DX2GCR_DXOEO_Msk (0x3ul << DDRPHY_DX2GCR_DXOEO_Pos) /*!< DDRPHY_T::DX2GCR: DXOEO Mask */ + +#define DDRPHY_DX2GCR_PLLRST_Pos (16) /*!< DDRPHY_T::DX2GCR: PLLRST Position */ +#define DDRPHY_DX2GCR_PLLRST_Msk (0x1ul << DDRPHY_DX2GCR_PLLRST_Pos) /*!< DDRPHY_T::DX2GCR: PLLRST Mask */ + +#define DDRPHY_DX2GCR_PLLPD_Pos (17) /*!< DDRPHY_T::DX2GCR: PLLPD Position */ +#define DDRPHY_DX2GCR_PLLPD_Msk (0x1ul << DDRPHY_DX2GCR_PLLPD_Pos) /*!< DDRPHY_T::DX2GCR: PLLPD Mask */ + +#define DDRPHY_DX2GCR_GSHIFT_Pos (18) /*!< DDRPHY_T::DX2GCR: GSHIFT Position */ +#define DDRPHY_DX2GCR_GSHIFT_Msk (0x1ul << DDRPHY_DX2GCR_GSHIFT_Pos) /*!< DDRPHY_T::DX2GCR: GSHIFT Mask */ + +#define DDRPHY_DX2GCR_PLLBYP_Pos (19) /*!< DDRPHY_T::DX2GCR: PLLBYP Position */ +#define DDRPHY_DX2GCR_PLLBYP_Msk (0x1ul << DDRPHY_DX2GCR_PLLBYP_Pos) /*!< DDRPHY_T::DX2GCR: PLLBYP Mask */ + +#define DDRPHY_DX2GCR_WLRKEN_Pos (26) /*!< DDRPHY_T::DX2GCR: WLRKEN Position */ +#define DDRPHY_DX2GCR_WLRKEN_Msk (0xful << DDRPHY_DX2GCR_WLRKEN_Pos) /*!< DDRPHY_T::DX2GCR: WLRKEN Mask */ + +#define DDRPHY_DX2GCR_MDLEN_Pos (30) /*!< DDRPHY_T::DX2GCR: MDLEN Position */ +#define DDRPHY_DX2GCR_MDLEN_Msk (0x1ul << DDRPHY_DX2GCR_MDLEN_Pos) /*!< DDRPHY_T::DX2GCR: MDLEN Mask */ + +#define DDRPHY_DX2GCR_CALBYP_Pos (31) /*!< DDRPHY_T::DX2GCR: CALBYP Position */ +#define DDRPHY_DX2GCR_CALBYP_Msk (0x1ul << DDRPHY_DX2GCR_CALBYP_Pos) /*!< DDRPHY_T::DX2GCR: CALBYP Mask */ + +#define DDRPHY_DX2GSR0_WDQCAL_Pos (0) /*!< DDRPHY_T::DX2GSR0: WDQCAL Position */ +#define DDRPHY_DX2GSR0_WDQCAL_Msk (0x1ul << DDRPHY_DX2GSR0_WDQCAL_Pos) /*!< DDRPHY_T::DX2GSR0: WDQCAL Mask */ + +#define DDRPHY_DX2GSR0_RDQSCAL_Pos (1) /*!< DDRPHY_T::DX2GSR0: RDQSCAL Position */ +#define DDRPHY_DX2GSR0_RDQSCAL_Msk (0x1ul << DDRPHY_DX2GSR0_RDQSCAL_Pos) /*!< DDRPHY_T::DX2GSR0: RDQSCAL Mask */ + +#define DDRPHY_DX2GSR0_RDQSNCAL_Pos (2) /*!< DDRPHY_T::DX2GSR0: RDQSNCAL Position */ +#define DDRPHY_DX2GSR0_RDQSNCAL_Msk (0x1ul << DDRPHY_DX2GSR0_RDQSNCAL_Pos) /*!< DDRPHY_T::DX2GSR0: RDQSNCAL Mask */ + +#define DDRPHY_DX2GSR0_GDQSCAL_Pos (3) /*!< DDRPHY_T::DX2GSR0: GDQSCAL Position */ +#define DDRPHY_DX2GSR0_GDQSCAL_Msk (0x1ul << DDRPHY_DX2GSR0_GDQSCAL_Pos) /*!< DDRPHY_T::DX2GSR0: GDQSCAL Mask */ + +#define DDRPHY_DX2GSR0_WLCAL_Pos (4) /*!< DDRPHY_T::DX2GSR0: WLCAL Position */ +#define DDRPHY_DX2GSR0_WLCAL_Msk (0x1ul << DDRPHY_DX2GSR0_WLCAL_Pos) /*!< DDRPHY_T::DX2GSR0: WLCAL Mask */ + +#define DDRPHY_DX2GSR0_WLDONE_Pos (5) /*!< DDRPHY_T::DX2GSR0: WLDONE Position */ +#define DDRPHY_DX2GSR0_WLDONE_Msk (0x1ul << DDRPHY_DX2GSR0_WLDONE_Pos) /*!< DDRPHY_T::DX2GSR0: WLDONE Mask */ + +#define DDRPHY_DX2GSR0_WLERR_Pos (6) /*!< DDRPHY_T::DX2GSR0: WLERR Position */ +#define DDRPHY_DX2GSR0_WLERR_Msk (0x1ul << DDRPHY_DX2GSR0_WLERR_Pos) /*!< DDRPHY_T::DX2GSR0: WLERR Mask */ + +#define DDRPHY_DX2GSR0_WLPRD_Pos (7) /*!< DDRPHY_T::DX2GSR0: WLPRD Position */ +#define DDRPHY_DX2GSR0_WLPRD_Msk (0xfful << DDRPHY_DX2GSR0_WLPRD_Pos) /*!< DDRPHY_T::DX2GSR0: WLPRD Mask */ + +#define DDRPHY_DX2GSR0_DPLOCK_Pos (15) /*!< DDRPHY_T::DX2GSR0: DPLOCK Position */ +#define DDRPHY_DX2GSR0_DPLOCK_Msk (0x1ul << DDRPHY_DX2GSR0_DPLOCK_Pos) /*!< DDRPHY_T::DX2GSR0: DPLOCK Mask */ + +#define DDRPHY_DX2GSR0_GDQSPRD_Pos (16) /*!< DDRPHY_T::DX2GSR0: GDQSPRD Position */ +#define DDRPHY_DX2GSR0_GDQSPRD_Msk (0xfful << DDRPHY_DX2GSR0_GDQSPRD_Pos) /*!< DDRPHY_T::DX2GSR0: GDQSPRD Mask */ + +#define DDRPHY_DX2GSR0_QSGERR_Pos (24) /*!< DDRPHY_T::DX2GSR0: QSGERR Position */ +#define DDRPHY_DX2GSR0_QSGERR_Msk (0xful << DDRPHY_DX2GSR0_QSGERR_Pos) /*!< DDRPHY_T::DX2GSR0: QSGERR Mask */ + +#define DDRPHY_DX2GSR0_WLDQ_Pos (28) /*!< DDRPHY_T::DX2GSR0: WLDQ Position */ +#define DDRPHY_DX2GSR0_WLDQ_Msk (0x1ul << DDRPHY_DX2GSR0_WLDQ_Pos) /*!< DDRPHY_T::DX2GSR0: WLDQ Mask */ + +#define DDRPHY_DX2GSR1_DLTDONE_Pos (0) /*!< DDRPHY_T::DX2GSR1: DLTDONE Position */ +#define DDRPHY_DX2GSR1_DLTDONE_Msk (0x1ul << DDRPHY_DX2GSR1_DLTDONE_Pos) /*!< DDRPHY_T::DX2GSR1: DLTDONE Mask */ + +#define DDRPHY_DX2GSR1_DLTCODE_Pos (1) /*!< DDRPHY_T::DX2GSR1: DLTCODE Position */ +#define DDRPHY_DX2GSR1_DLTCODE_Msk (0xfffffful << DDRPHY_DX2GSR1_DLTCODE_Pos) /*!< DDRPHY_T::DX2GSR1: DLTCODE Mask */ + +#define DDRPHY_DX2BDLR0_DQ0WBD_Pos (0) /*!< DDRPHY_T::DX2BDLR0: DQ0WBD Position */ +#define DDRPHY_DX2BDLR0_DQ0WBD_Msk (0x3ful << DDRPHY_DX2BDLR0_DQ0WBD_Pos) /*!< DDRPHY_T::DX2BDLR0: DQ0WBD Mask */ + +#define DDRPHY_DX2BDLR0_DQ1WBD_Pos (6) /*!< DDRPHY_T::DX2BDLR0: DQ1WBD Position */ +#define DDRPHY_DX2BDLR0_DQ1WBD_Msk (0x3ful << DDRPHY_DX2BDLR0_DQ1WBD_Pos) /*!< DDRPHY_T::DX2BDLR0: DQ1WBD Mask */ + +#define DDRPHY_DX2BDLR0_DQ2WBD_Pos (12) /*!< DDRPHY_T::DX2BDLR0: DQ2WBD Position */ +#define DDRPHY_DX2BDLR0_DQ2WBD_Msk (0x3ful << DDRPHY_DX2BDLR0_DQ2WBD_Pos) /*!< DDRPHY_T::DX2BDLR0: DQ2WBD Mask */ + +#define DDRPHY_DX2BDLR0_DQ3WBD_Pos (18) /*!< DDRPHY_T::DX2BDLR0: DQ3WBD Position */ +#define DDRPHY_DX2BDLR0_DQ3WBD_Msk (0x3ful << DDRPHY_DX2BDLR0_DQ3WBD_Pos) /*!< DDRPHY_T::DX2BDLR0: DQ3WBD Mask */ + +#define DDRPHY_DX2BDLR0_DQ4WBD_Pos (24) /*!< DDRPHY_T::DX2BDLR0: DQ4WBD Position */ +#define DDRPHY_DX2BDLR0_DQ4WBD_Msk (0x3ful << DDRPHY_DX2BDLR0_DQ4WBD_Pos) /*!< DDRPHY_T::DX2BDLR0: DQ4WBD Mask */ + +#define DDRPHY_DX2BDLR1_DQ5WBD_Pos (0) /*!< DDRPHY_T::DX2BDLR1: DQ5WBD Position */ +#define DDRPHY_DX2BDLR1_DQ5WBD_Msk (0x3ful << DDRPHY_DX2BDLR1_DQ5WBD_Pos) /*!< DDRPHY_T::DX2BDLR1: DQ5WBD Mask */ + +#define DDRPHY_DX2BDLR1_DQ6WBD_Pos (6) /*!< DDRPHY_T::DX2BDLR1: DQ6WBD Position */ +#define DDRPHY_DX2BDLR1_DQ6WBD_Msk (0x3ful << DDRPHY_DX2BDLR1_DQ6WBD_Pos) /*!< DDRPHY_T::DX2BDLR1: DQ6WBD Mask */ + +#define DDRPHY_DX2BDLR1_DQ7WBD_Pos (12) /*!< DDRPHY_T::DX2BDLR1: DQ7WBD Position */ +#define DDRPHY_DX2BDLR1_DQ7WBD_Msk (0x3ful << DDRPHY_DX2BDLR1_DQ7WBD_Pos) /*!< DDRPHY_T::DX2BDLR1: DQ7WBD Mask */ + +#define DDRPHY_DX2BDLR1_DMWBD_Pos (18) /*!< DDRPHY_T::DX2BDLR1: DMWBD Position */ +#define DDRPHY_DX2BDLR1_DMWBD_Msk (0x3ful << DDRPHY_DX2BDLR1_DMWBD_Pos) /*!< DDRPHY_T::DX2BDLR1: DMWBD Mask */ + +#define DDRPHY_DX2BDLR1_DSWBD_Pos (24) /*!< DDRPHY_T::DX2BDLR1: DSWBD Position */ +#define DDRPHY_DX2BDLR1_DSWBD_Msk (0x3ful << DDRPHY_DX2BDLR1_DSWBD_Pos) /*!< DDRPHY_T::DX2BDLR1: DSWBD Mask */ + +#define DDRPHY_DX2BDLR2_DSOEBD_Pos (0) /*!< DDRPHY_T::DX2BDLR2: DSOEBD Position */ +#define DDRPHY_DX2BDLR2_DSOEBD_Msk (0x3ful << DDRPHY_DX2BDLR2_DSOEBD_Pos) /*!< DDRPHY_T::DX2BDLR2: DSOEBD Mask */ + +#define DDRPHY_DX2BDLR2_DQOEBD_Pos (6) /*!< DDRPHY_T::DX2BDLR2: DQOEBD Position */ +#define DDRPHY_DX2BDLR2_DQOEBD_Msk (0x3ful << DDRPHY_DX2BDLR2_DQOEBD_Pos) /*!< DDRPHY_T::DX2BDLR2: DQOEBD Mask */ + +#define DDRPHY_DX2BDLR2_DSRBD_Pos (12) /*!< DDRPHY_T::DX2BDLR2: DSRBD Position */ +#define DDRPHY_DX2BDLR2_DSRBD_Msk (0x3ful << DDRPHY_DX2BDLR2_DSRBD_Pos) /*!< DDRPHY_T::DX2BDLR2: DSRBD Mask */ + +#define DDRPHY_DX2BDLR2_DSNRBD_Pos (18) /*!< DDRPHY_T::DX2BDLR2: DSNRBD Position */ +#define DDRPHY_DX2BDLR2_DSNRBD_Msk (0x3ful << DDRPHY_DX2BDLR2_DSNRBD_Pos) /*!< DDRPHY_T::DX2BDLR2: DSNRBD Mask */ + +#define DDRPHY_DX2BDLR3_DQ0RBD_Pos (0) /*!< DDRPHY_T::DX2BDLR3: DQ0RBD Position */ +#define DDRPHY_DX2BDLR3_DQ0RBD_Msk (0x3ful << DDRPHY_DX2BDLR3_DQ0RBD_Pos) /*!< DDRPHY_T::DX2BDLR3: DQ0RBD Mask */ + +#define DDRPHY_DX2BDLR3_DQ1RBD_Pos (6) /*!< DDRPHY_T::DX2BDLR3: DQ1RBD Position */ +#define DDRPHY_DX2BDLR3_DQ1RBD_Msk (0x3ful << DDRPHY_DX2BDLR3_DQ1RBD_Pos) /*!< DDRPHY_T::DX2BDLR3: DQ1RBD Mask */ + +#define DDRPHY_DX2BDLR3_DQ2RBD_Pos (12) /*!< DDRPHY_T::DX2BDLR3: DQ2RBD Position */ +#define DDRPHY_DX2BDLR3_DQ2RBD_Msk (0x3ful << DDRPHY_DX2BDLR3_DQ2RBD_Pos) /*!< DDRPHY_T::DX2BDLR3: DQ2RBD Mask */ + +#define DDRPHY_DX2BDLR3_DQ3RBD_Pos (18) /*!< DDRPHY_T::DX2BDLR3: DQ3RBD Position */ +#define DDRPHY_DX2BDLR3_DQ3RBD_Msk (0x3ful << DDRPHY_DX2BDLR3_DQ3RBD_Pos) /*!< DDRPHY_T::DX2BDLR3: DQ3RBD Mask */ + +#define DDRPHY_DX2BDLR3_DQ4RBD_Pos (24) /*!< DDRPHY_T::DX2BDLR3: DQ4RBD Position */ +#define DDRPHY_DX2BDLR3_DQ4RBD_Msk (0x3ful << DDRPHY_DX2BDLR3_DQ4RBD_Pos) /*!< DDRPHY_T::DX2BDLR3: DQ4RBD Mask */ + +#define DDRPHY_DX2BDLR4_DQ5RBD_Pos (0) /*!< DDRPHY_T::DX2BDLR4: DQ5RBD Position */ +#define DDRPHY_DX2BDLR4_DQ5RBD_Msk (0x3ful << DDRPHY_DX2BDLR4_DQ5RBD_Pos) /*!< DDRPHY_T::DX2BDLR4: DQ5RBD Mask */ + +#define DDRPHY_DX2BDLR4_DQ6RBD_Pos (6) /*!< DDRPHY_T::DX2BDLR4: DQ6RBD Position */ +#define DDRPHY_DX2BDLR4_DQ6RBD_Msk (0x3ful << DDRPHY_DX2BDLR4_DQ6RBD_Pos) /*!< DDRPHY_T::DX2BDLR4: DQ6RBD Mask */ + +#define DDRPHY_DX2BDLR4_DQ7RBD_Pos (12) /*!< DDRPHY_T::DX2BDLR4: DQ7RBD Position */ +#define DDRPHY_DX2BDLR4_DQ7RBD_Msk (0x3ful << DDRPHY_DX2BDLR4_DQ7RBD_Pos) /*!< DDRPHY_T::DX2BDLR4: DQ7RBD Mask */ + +#define DDRPHY_DX2BDLR4_DMRBD_Pos (18) /*!< DDRPHY_T::DX2BDLR4: DMRBD Position */ +#define DDRPHY_DX2BDLR4_DMRBD_Msk (0x3ful << DDRPHY_DX2BDLR4_DMRBD_Pos) /*!< DDRPHY_T::DX2BDLR4: DMRBD Mask */ + +#define DDRPHY_DX2LCDLR0_R0WLD_Pos (0) /*!< DDRPHY_T::DX2LCDLR0: R0WLD Position */ +#define DDRPHY_DX2LCDLR0_R0WLD_Msk (0xfful << DDRPHY_DX2LCDLR0_R0WLD_Pos) /*!< DDRPHY_T::DX2LCDLR0: R0WLD Mask */ + +#define DDRPHY_DX2LCDLR0_R1WLD_Pos (8) /*!< DDRPHY_T::DX2LCDLR0: R1WLD Position */ +#define DDRPHY_DX2LCDLR0_R1WLD_Msk (0xfful << DDRPHY_DX2LCDLR0_R1WLD_Pos) /*!< DDRPHY_T::DX2LCDLR0: R1WLD Mask */ + +#define DDRPHY_DX2LCDLR0_R2WLD_Pos (16) /*!< DDRPHY_T::DX2LCDLR0: R2WLD Position */ +#define DDRPHY_DX2LCDLR0_R2WLD_Msk (0xfful << DDRPHY_DX2LCDLR0_R2WLD_Pos) /*!< DDRPHY_T::DX2LCDLR0: R2WLD Mask */ + +#define DDRPHY_DX2LCDLR0_R3WLD_Pos (24) /*!< DDRPHY_T::DX2LCDLR0: R3WLD Position */ +#define DDRPHY_DX2LCDLR0_R3WLD_Msk (0xfful << DDRPHY_DX2LCDLR0_R3WLD_Pos) /*!< DDRPHY_T::DX2LCDLR0: R3WLD Mask */ + +#define DDRPHY_DX2LCDLR1_WDQD_Pos (0) /*!< DDRPHY_T::DX2LCDLR1: WDQD Position */ +#define DDRPHY_DX2LCDLR1_WDQD_Msk (0xfful << DDRPHY_DX2LCDLR1_WDQD_Pos) /*!< DDRPHY_T::DX2LCDLR1: WDQD Mask */ + +#define DDRPHY_DX2LCDLR1_RDQSD_Pos (8) /*!< DDRPHY_T::DX2LCDLR1: RDQSD Position */ +#define DDRPHY_DX2LCDLR1_RDQSD_Msk (0xfful << DDRPHY_DX2LCDLR1_RDQSD_Pos) /*!< DDRPHY_T::DX2LCDLR1: RDQSD Mask */ + +#define DDRPHY_DX2LCDLR1_RDQSND_Pos (16) /*!< DDRPHY_T::DX2LCDLR1: RDQSND Position */ +#define DDRPHY_DX2LCDLR1_RDQSND_Msk (0xfful << DDRPHY_DX2LCDLR1_RDQSND_Pos) /*!< DDRPHY_T::DX2LCDLR1: RDQSND Mask */ + +#define DDRPHY_DX2LCDLR2_R0DQSGD_Pos (0) /*!< DDRPHY_T::DX2LCDLR2: R0DQSGD Position */ +#define DDRPHY_DX2LCDLR2_R0DQSGD_Msk (0xfful << DDRPHY_DX2LCDLR2_R0DQSGD_Pos) /*!< DDRPHY_T::DX2LCDLR2: R0DQSGD Mask */ + +#define DDRPHY_DX2LCDLR2_R1DQSGD_Pos (8) /*!< DDRPHY_T::DX2LCDLR2: R1DQSGD Position */ +#define DDRPHY_DX2LCDLR2_R1DQSGD_Msk (0xfful << DDRPHY_DX2LCDLR2_R1DQSGD_Pos) /*!< DDRPHY_T::DX2LCDLR2: R1DQSGD Mask */ + +#define DDRPHY_DX2LCDLR2_R2DQSGD_Pos (16) /*!< DDRPHY_T::DX2LCDLR2: R2DQSGD Position */ +#define DDRPHY_DX2LCDLR2_R2DQSGD_Msk (0xfful << DDRPHY_DX2LCDLR2_R2DQSGD_Pos) /*!< DDRPHY_T::DX2LCDLR2: R2DQSGD Mask */ + +#define DDRPHY_DX2LCDLR2_R3DQSGD_Pos (24) /*!< DDRPHY_T::DX2LCDLR2: R3DQSGD Position */ +#define DDRPHY_DX2LCDLR2_R3DQSGD_Msk (0xfful << DDRPHY_DX2LCDLR2_R3DQSGD_Pos) /*!< DDRPHY_T::DX2LCDLR2: R3DQSGD Mask */ + +#define DDRPHY_DX2MDLR_IPRD_Pos (0) /*!< DDRPHY_T::DX2MDLR: IPRD Position */ +#define DDRPHY_DX2MDLR_IPRD_Msk (0xfful << DDRPHY_DX2MDLR_IPRD_Pos) /*!< DDRPHY_T::DX2MDLR: IPRD Mask */ + +#define DDRPHY_DX2MDLR_TPRD_Pos (8) /*!< DDRPHY_T::DX2MDLR: TPRD Position */ +#define DDRPHY_DX2MDLR_TPRD_Msk (0xfful << DDRPHY_DX2MDLR_TPRD_Pos) /*!< DDRPHY_T::DX2MDLR: TPRD Mask */ + +#define DDRPHY_DX2MDLR_MDLD_Pos (16) /*!< DDRPHY_T::DX2MDLR: MDLD Position */ +#define DDRPHY_DX2MDLR_MDLD_Msk (0xfful << DDRPHY_DX2MDLR_MDLD_Pos) /*!< DDRPHY_T::DX2MDLR: MDLD Mask */ + +#define DDRPHY_DX2GTR_R0DGSL_Pos (0) /*!< DDRPHY_T::DX2GTR: R0DGSL Position */ +#define DDRPHY_DX2GTR_R0DGSL_Msk (0x7ul << DDRPHY_DX2GTR_R0DGSL_Pos) /*!< DDRPHY_T::DX2GTR: R0DGSL Mask */ + +#define DDRPHY_DX2GTR_R1DGSL_Pos (3) /*!< DDRPHY_T::DX2GTR: R1DGSL Position */ +#define DDRPHY_DX2GTR_R1DGSL_Msk (0x7ul << DDRPHY_DX2GTR_R1DGSL_Pos) /*!< DDRPHY_T::DX2GTR: R1DGSL Mask */ + +#define DDRPHY_DX2GTR_R2DGSL_Pos (6) /*!< DDRPHY_T::DX2GTR: R2DGSL Position */ +#define DDRPHY_DX2GTR_R2DGSL_Msk (0x7ul << DDRPHY_DX2GTR_R2DGSL_Pos) /*!< DDRPHY_T::DX2GTR: R2DGSL Mask */ + +#define DDRPHY_DX2GTR_R3DGSL_Pos (9) /*!< DDRPHY_T::DX2GTR: R3DGSL Position */ +#define DDRPHY_DX2GTR_R3DGSL_Msk (0x7ul << DDRPHY_DX2GTR_R3DGSL_Pos) /*!< DDRPHY_T::DX2GTR: R3DGSL Mask */ + +#define DDRPHY_DX2GTR_R0WLSL_Pos (12) /*!< DDRPHY_T::DX2GTR: R0WLSL Position */ +#define DDRPHY_DX2GTR_R0WLSL_Msk (0x3ul << DDRPHY_DX2GTR_R0WLSL_Pos) /*!< DDRPHY_T::DX2GTR: R0WLSL Mask */ + +#define DDRPHY_DX2GTR_R1WLSL_Pos (14) /*!< DDRPHY_T::DX2GTR: R1WLSL Position */ +#define DDRPHY_DX2GTR_R1WLSL_Msk (0x3ul << DDRPHY_DX2GTR_R1WLSL_Pos) /*!< DDRPHY_T::DX2GTR: R1WLSL Mask */ + +#define DDRPHY_DX2GTR_R2WLSL_Pos (16) /*!< DDRPHY_T::DX2GTR: R2WLSL Position */ +#define DDRPHY_DX2GTR_R2WLSL_Msk (0x3ul << DDRPHY_DX2GTR_R2WLSL_Pos) /*!< DDRPHY_T::DX2GTR: R2WLSL Mask */ + +#define DDRPHY_DX2GTR_R3WLSL_Pos (18) /*!< DDRPHY_T::DX2GTR: R3WLSL Position */ +#define DDRPHY_DX2GTR_R3WLSL_Msk (0x3ul << DDRPHY_DX2GTR_R3WLSL_Pos) /*!< DDRPHY_T::DX2GTR: R3WLSL Mask */ + +#define DDRPHY_DX2GSR2_RDERR_Pos (0) /*!< DDRPHY_T::DX2GSR2: RDERR Position */ +#define DDRPHY_DX2GSR2_RDERR_Msk (0x1ul << DDRPHY_DX2GSR2_RDERR_Pos) /*!< DDRPHY_T::DX2GSR2: RDERR Mask */ + +#define DDRPHY_DX2GSR2_RDWN_Pos (1) /*!< DDRPHY_T::DX2GSR2: RDWN Position */ +#define DDRPHY_DX2GSR2_RDWN_Msk (0x1ul << DDRPHY_DX2GSR2_RDWN_Pos) /*!< DDRPHY_T::DX2GSR2: RDWN Mask */ + +#define DDRPHY_DX2GSR2_WDERR_Pos (2) /*!< DDRPHY_T::DX2GSR2: WDERR Position */ +#define DDRPHY_DX2GSR2_WDERR_Msk (0x1ul << DDRPHY_DX2GSR2_WDERR_Pos) /*!< DDRPHY_T::DX2GSR2: WDERR Mask */ + +#define DDRPHY_DX2GSR2_WDWN_Pos (3) /*!< DDRPHY_T::DX2GSR2: WDWN Position */ +#define DDRPHY_DX2GSR2_WDWN_Msk (0x1ul << DDRPHY_DX2GSR2_WDWN_Pos) /*!< DDRPHY_T::DX2GSR2: WDWN Mask */ + +#define DDRPHY_DX2GSR2_REERR_Pos (4) /*!< DDRPHY_T::DX2GSR2: REERR Position */ +#define DDRPHY_DX2GSR2_REERR_Msk (0x1ul << DDRPHY_DX2GSR2_REERR_Pos) /*!< DDRPHY_T::DX2GSR2: REERR Mask */ + +#define DDRPHY_DX2GSR2_REWN_Pos (5) /*!< DDRPHY_T::DX2GSR2: REWN Position */ +#define DDRPHY_DX2GSR2_REWN_Msk (0x1ul << DDRPHY_DX2GSR2_REWN_Pos) /*!< DDRPHY_T::DX2GSR2: REWN Mask */ + +#define DDRPHY_DX2GSR2_WEERR_Pos (6) /*!< DDRPHY_T::DX2GSR2: WEERR Position */ +#define DDRPHY_DX2GSR2_WEERR_Msk (0x1ul << DDRPHY_DX2GSR2_WEERR_Pos) /*!< DDRPHY_T::DX2GSR2: WEERR Mask */ + +#define DDRPHY_DX2GSR2_WEWN_Pos (7) /*!< DDRPHY_T::DX2GSR2: WEWN Position */ +#define DDRPHY_DX2GSR2_WEWN_Msk (0x1ul << DDRPHY_DX2GSR2_WEWN_Pos) /*!< DDRPHY_T::DX2GSR2: WEWN Mask */ + +#define DDRPHY_DX2GSR2_ESTAT_Pos (8) /*!< DDRPHY_T::DX2GSR2: ESTAT Position */ +#define DDRPHY_DX2GSR2_ESTAT_Msk (0xful << DDRPHY_DX2GSR2_ESTAT_Pos) /*!< DDRPHY_T::DX2GSR2: ESTAT Mask */ + +#define DDRPHY_DX3GCR_DXEN_Pos (0) /*!< DDRPHY_T::DX3GCR: DXEN Position */ +#define DDRPHY_DX3GCR_DXEN_Msk (0x1ul << DDRPHY_DX3GCR_DXEN_Pos) /*!< DDRPHY_T::DX3GCR: DXEN Mask */ + +#define DDRPHY_DX3GCR_DQSODT_Pos (1) /*!< DDRPHY_T::DX3GCR: DQSODT Position */ +#define DDRPHY_DX3GCR_DQSODT_Msk (0x1ul << DDRPHY_DX3GCR_DQSODT_Pos) /*!< DDRPHY_T::DX3GCR: DQSODT Mask */ + +#define DDRPHY_DX3GCR_DQODT_Pos (2) /*!< DDRPHY_T::DX3GCR: DQODT Position */ +#define DDRPHY_DX3GCR_DQODT_Msk (0x1ul << DDRPHY_DX3GCR_DQODT_Pos) /*!< DDRPHY_T::DX3GCR: DQODT Mask */ + +#define DDRPHY_DX3GCR_DXIOM_Pos (3) /*!< DDRPHY_T::DX3GCR: DXIOM Position */ +#define DDRPHY_DX3GCR_DXIOM_Msk (0x1ul << DDRPHY_DX3GCR_DXIOM_Pos) /*!< DDRPHY_T::DX3GCR: DXIOM Mask */ + +#define DDRPHY_DX3GCR_DXPDD_Pos (4) /*!< DDRPHY_T::DX3GCR: DXPDD Position */ +#define DDRPHY_DX3GCR_DXPDD_Msk (0x1ul << DDRPHY_DX3GCR_DXPDD_Pos) /*!< DDRPHY_T::DX3GCR: DXPDD Mask */ + +#define DDRPHY_DX3GCR_DXPDR_Pos (5) /*!< DDRPHY_T::DX3GCR: DXPDR Position */ +#define DDRPHY_DX3GCR_DXPDR_Msk (0x1ul << DDRPHY_DX3GCR_DXPDR_Pos) /*!< DDRPHY_T::DX3GCR: DXPDR Mask */ + +#define DDRPHY_DX3GCR_DQSRPD_Pos (6) /*!< DDRPHY_T::DX3GCR: DQSRPD Position */ +#define DDRPHY_DX3GCR_DQSRPD_Msk (0x1ul << DDRPHY_DX3GCR_DQSRPD_Pos) /*!< DDRPHY_T::DX3GCR: DQSRPD Mask */ + +#define DDRPHY_DX3GCR_DSEN_Pos (7) /*!< DDRPHY_T::DX3GCR: DSEN Position */ +#define DDRPHY_DX3GCR_DSEN_Msk (0x3ul << DDRPHY_DX3GCR_DSEN_Pos) /*!< DDRPHY_T::DX3GCR: DSEN Mask */ + +#define DDRPHY_DX3GCR_DQSRTT_Pos (9) /*!< DDRPHY_T::DX3GCR: DQSRTT Position */ +#define DDRPHY_DX3GCR_DQSRTT_Msk (0x1ul << DDRPHY_DX3GCR_DQSRTT_Pos) /*!< DDRPHY_T::DX3GCR: DQSRTT Mask */ + +#define DDRPHY_DX3GCR_DQRTT_Pos (10) /*!< DDRPHY_T::DX3GCR: DQRTT Position */ +#define DDRPHY_DX3GCR_DQRTT_Msk (0x1ul << DDRPHY_DX3GCR_DQRTT_Pos) /*!< DDRPHY_T::DX3GCR: DQRTT Mask */ + +#define DDRPHY_DX3GCR_RTTOH_Pos (11) /*!< DDRPHY_T::DX3GCR: RTTOH Position */ +#define DDRPHY_DX3GCR_RTTOH_Msk (0x3ul << DDRPHY_DX3GCR_RTTOH_Pos) /*!< DDRPHY_T::DX3GCR: RTTOH Mask */ + +#define DDRPHY_DX3GCR_RTTOAL_Pos (13) /*!< DDRPHY_T::DX3GCR: RTTOAL Position */ +#define DDRPHY_DX3GCR_RTTOAL_Msk (0x1ul << DDRPHY_DX3GCR_RTTOAL_Pos) /*!< DDRPHY_T::DX3GCR: RTTOAL Mask */ + +#define DDRPHY_DX3GCR_DXOEO_Pos (14) /*!< DDRPHY_T::DX3GCR: DXOEO Position */ +#define DDRPHY_DX3GCR_DXOEO_Msk (0x3ul << DDRPHY_DX3GCR_DXOEO_Pos) /*!< DDRPHY_T::DX3GCR: DXOEO Mask */ + +#define DDRPHY_DX3GCR_PLLRST_Pos (16) /*!< DDRPHY_T::DX3GCR: PLLRST Position */ +#define DDRPHY_DX3GCR_PLLRST_Msk (0x1ul << DDRPHY_DX3GCR_PLLRST_Pos) /*!< DDRPHY_T::DX3GCR: PLLRST Mask */ + +#define DDRPHY_DX3GCR_PLLPD_Pos (17) /*!< DDRPHY_T::DX3GCR: PLLPD Position */ +#define DDRPHY_DX3GCR_PLLPD_Msk (0x1ul << DDRPHY_DX3GCR_PLLPD_Pos) /*!< DDRPHY_T::DX3GCR: PLLPD Mask */ + +#define DDRPHY_DX3GCR_GSHIFT_Pos (18) /*!< DDRPHY_T::DX3GCR: GSHIFT Position */ +#define DDRPHY_DX3GCR_GSHIFT_Msk (0x1ul << DDRPHY_DX3GCR_GSHIFT_Pos) /*!< DDRPHY_T::DX3GCR: GSHIFT Mask */ + +#define DDRPHY_DX3GCR_PLLBYP_Pos (19) /*!< DDRPHY_T::DX3GCR: PLLBYP Position */ +#define DDRPHY_DX3GCR_PLLBYP_Msk (0x1ul << DDRPHY_DX3GCR_PLLBYP_Pos) /*!< DDRPHY_T::DX3GCR: PLLBYP Mask */ + +#define DDRPHY_DX3GCR_WLRKEN_Pos (26) /*!< DDRPHY_T::DX3GCR: WLRKEN Position */ +#define DDRPHY_DX3GCR_WLRKEN_Msk (0xful << DDRPHY_DX3GCR_WLRKEN_Pos) /*!< DDRPHY_T::DX3GCR: WLRKEN Mask */ + +#define DDRPHY_DX3GCR_MDLEN_Pos (30) /*!< DDRPHY_T::DX3GCR: MDLEN Position */ +#define DDRPHY_DX3GCR_MDLEN_Msk (0x1ul << DDRPHY_DX3GCR_MDLEN_Pos) /*!< DDRPHY_T::DX3GCR: MDLEN Mask */ + +#define DDRPHY_DX3GCR_CALBYP_Pos (31) /*!< DDRPHY_T::DX3GCR: CALBYP Position */ +#define DDRPHY_DX3GCR_CALBYP_Msk (0x1ul << DDRPHY_DX3GCR_CALBYP_Pos) /*!< DDRPHY_T::DX3GCR: CALBYP Mask */ + +#define DDRPHY_DX3GSR0_WDQCAL_Pos (0) /*!< DDRPHY_T::DX3GSR0: WDQCAL Position */ +#define DDRPHY_DX3GSR0_WDQCAL_Msk (0x1ul << DDRPHY_DX3GSR0_WDQCAL_Pos) /*!< DDRPHY_T::DX3GSR0: WDQCAL Mask */ + +#define DDRPHY_DX3GSR0_RDQSCAL_Pos (1) /*!< DDRPHY_T::DX3GSR0: RDQSCAL Position */ +#define DDRPHY_DX3GSR0_RDQSCAL_Msk (0x1ul << DDRPHY_DX3GSR0_RDQSCAL_Pos) /*!< DDRPHY_T::DX3GSR0: RDQSCAL Mask */ + +#define DDRPHY_DX3GSR0_RDQSNCAL_Pos (2) /*!< DDRPHY_T::DX3GSR0: RDQSNCAL Position */ +#define DDRPHY_DX3GSR0_RDQSNCAL_Msk (0x1ul << DDRPHY_DX3GSR0_RDQSNCAL_Pos) /*!< DDRPHY_T::DX3GSR0: RDQSNCAL Mask */ + +#define DDRPHY_DX3GSR0_GDQSCAL_Pos (3) /*!< DDRPHY_T::DX3GSR0: GDQSCAL Position */ +#define DDRPHY_DX3GSR0_GDQSCAL_Msk (0x1ul << DDRPHY_DX3GSR0_GDQSCAL_Pos) /*!< DDRPHY_T::DX3GSR0: GDQSCAL Mask */ + +#define DDRPHY_DX3GSR0_WLCAL_Pos (4) /*!< DDRPHY_T::DX3GSR0: WLCAL Position */ +#define DDRPHY_DX3GSR0_WLCAL_Msk (0x1ul << DDRPHY_DX3GSR0_WLCAL_Pos) /*!< DDRPHY_T::DX3GSR0: WLCAL Mask */ + +#define DDRPHY_DX3GSR0_WLDONE_Pos (5) /*!< DDRPHY_T::DX3GSR0: WLDONE Position */ +#define DDRPHY_DX3GSR0_WLDONE_Msk (0x1ul << DDRPHY_DX3GSR0_WLDONE_Pos) /*!< DDRPHY_T::DX3GSR0: WLDONE Mask */ + +#define DDRPHY_DX3GSR0_WLERR_Pos (6) /*!< DDRPHY_T::DX3GSR0: WLERR Position */ +#define DDRPHY_DX3GSR0_WLERR_Msk (0x1ul << DDRPHY_DX3GSR0_WLERR_Pos) /*!< DDRPHY_T::DX3GSR0: WLERR Mask */ + +#define DDRPHY_DX3GSR0_WLPRD_Pos (7) /*!< DDRPHY_T::DX3GSR0: WLPRD Position */ +#define DDRPHY_DX3GSR0_WLPRD_Msk (0xfful << DDRPHY_DX3GSR0_WLPRD_Pos) /*!< DDRPHY_T::DX3GSR0: WLPRD Mask */ + +#define DDRPHY_DX3GSR0_DPLOCK_Pos (15) /*!< DDRPHY_T::DX3GSR0: DPLOCK Position */ +#define DDRPHY_DX3GSR0_DPLOCK_Msk (0x1ul << DDRPHY_DX3GSR0_DPLOCK_Pos) /*!< DDRPHY_T::DX3GSR0: DPLOCK Mask */ + +#define DDRPHY_DX3GSR0_GDQSPRD_Pos (16) /*!< DDRPHY_T::DX3GSR0: GDQSPRD Position */ +#define DDRPHY_DX3GSR0_GDQSPRD_Msk (0xfful << DDRPHY_DX3GSR0_GDQSPRD_Pos) /*!< DDRPHY_T::DX3GSR0: GDQSPRD Mask */ + +#define DDRPHY_DX3GSR0_QSGERR_Pos (24) /*!< DDRPHY_T::DX3GSR0: QSGERR Position */ +#define DDRPHY_DX3GSR0_QSGERR_Msk (0xful << DDRPHY_DX3GSR0_QSGERR_Pos) /*!< DDRPHY_T::DX3GSR0: QSGERR Mask */ + +#define DDRPHY_DX3GSR0_WLDQ_Pos (28) /*!< DDRPHY_T::DX3GSR0: WLDQ Position */ +#define DDRPHY_DX3GSR0_WLDQ_Msk (0x1ul << DDRPHY_DX3GSR0_WLDQ_Pos) /*!< DDRPHY_T::DX3GSR0: WLDQ Mask */ + +#define DDRPHY_DX3GSR1_DLTDONE_Pos (0) /*!< DDRPHY_T::DX3GSR1: DLTDONE Position */ +#define DDRPHY_DX3GSR1_DLTDONE_Msk (0x1ul << DDRPHY_DX3GSR1_DLTDONE_Pos) /*!< DDRPHY_T::DX3GSR1: DLTDONE Mask */ + +#define DDRPHY_DX3GSR1_DLTCODE_Pos (1) /*!< DDRPHY_T::DX3GSR1: DLTCODE Position */ +#define DDRPHY_DX3GSR1_DLTCODE_Msk (0xfffffful << DDRPHY_DX3GSR1_DLTCODE_Pos) /*!< DDRPHY_T::DX3GSR1: DLTCODE Mask */ + +#define DDRPHY_DX3BDLR0_DQ0WBD_Pos (0) /*!< DDRPHY_T::DX3BDLR0: DQ0WBD Position */ +#define DDRPHY_DX3BDLR0_DQ0WBD_Msk (0x3ful << DDRPHY_DX3BDLR0_DQ0WBD_Pos) /*!< DDRPHY_T::DX3BDLR0: DQ0WBD Mask */ + +#define DDRPHY_DX3BDLR0_DQ1WBD_Pos (6) /*!< DDRPHY_T::DX3BDLR0: DQ1WBD Position */ +#define DDRPHY_DX3BDLR0_DQ1WBD_Msk (0x3ful << DDRPHY_DX3BDLR0_DQ1WBD_Pos) /*!< DDRPHY_T::DX3BDLR0: DQ1WBD Mask */ + +#define DDRPHY_DX3BDLR0_DQ2WBD_Pos (12) /*!< DDRPHY_T::DX3BDLR0: DQ2WBD Position */ +#define DDRPHY_DX3BDLR0_DQ2WBD_Msk (0x3ful << DDRPHY_DX3BDLR0_DQ2WBD_Pos) /*!< DDRPHY_T::DX3BDLR0: DQ2WBD Mask */ + +#define DDRPHY_DX3BDLR0_DQ3WBD_Pos (18) /*!< DDRPHY_T::DX3BDLR0: DQ3WBD Position */ +#define DDRPHY_DX3BDLR0_DQ3WBD_Msk (0x3ful << DDRPHY_DX3BDLR0_DQ3WBD_Pos) /*!< DDRPHY_T::DX3BDLR0: DQ3WBD Mask */ + +#define DDRPHY_DX3BDLR0_DQ4WBD_Pos (24) /*!< DDRPHY_T::DX3BDLR0: DQ4WBD Position */ +#define DDRPHY_DX3BDLR0_DQ4WBD_Msk (0x3ful << DDRPHY_DX3BDLR0_DQ4WBD_Pos) /*!< DDRPHY_T::DX3BDLR0: DQ4WBD Mask */ + +#define DDRPHY_DX3BDLR1_DQ5WBD_Pos (0) /*!< DDRPHY_T::DX3BDLR1: DQ5WBD Position */ +#define DDRPHY_DX3BDLR1_DQ5WBD_Msk (0x3ful << DDRPHY_DX3BDLR1_DQ5WBD_Pos) /*!< DDRPHY_T::DX3BDLR1: DQ5WBD Mask */ + +#define DDRPHY_DX3BDLR1_DQ6WBD_Pos (6) /*!< DDRPHY_T::DX3BDLR1: DQ6WBD Position */ +#define DDRPHY_DX3BDLR1_DQ6WBD_Msk (0x3ful << DDRPHY_DX3BDLR1_DQ6WBD_Pos) /*!< DDRPHY_T::DX3BDLR1: DQ6WBD Mask */ + +#define DDRPHY_DX3BDLR1_DQ7WBD_Pos (12) /*!< DDRPHY_T::DX3BDLR1: DQ7WBD Position */ +#define DDRPHY_DX3BDLR1_DQ7WBD_Msk (0x3ful << DDRPHY_DX3BDLR1_DQ7WBD_Pos) /*!< DDRPHY_T::DX3BDLR1: DQ7WBD Mask */ + +#define DDRPHY_DX3BDLR1_DMWBD_Pos (18) /*!< DDRPHY_T::DX3BDLR1: DMWBD Position */ +#define DDRPHY_DX3BDLR1_DMWBD_Msk (0x3ful << DDRPHY_DX3BDLR1_DMWBD_Pos) /*!< DDRPHY_T::DX3BDLR1: DMWBD Mask */ + +#define DDRPHY_DX3BDLR1_DSWBD_Pos (24) /*!< DDRPHY_T::DX3BDLR1: DSWBD Position */ +#define DDRPHY_DX3BDLR1_DSWBD_Msk (0x3ful << DDRPHY_DX3BDLR1_DSWBD_Pos) /*!< DDRPHY_T::DX3BDLR1: DSWBD Mask */ + +#define DDRPHY_DX3BDLR2_DSOEBD_Pos (0) /*!< DDRPHY_T::DX3BDLR2: DSOEBD Position */ +#define DDRPHY_DX3BDLR2_DSOEBD_Msk (0x3ful << DDRPHY_DX3BDLR2_DSOEBD_Pos) /*!< DDRPHY_T::DX3BDLR2: DSOEBD Mask */ + +#define DDRPHY_DX3BDLR2_DQOEBD_Pos (6) /*!< DDRPHY_T::DX3BDLR2: DQOEBD Position */ +#define DDRPHY_DX3BDLR2_DQOEBD_Msk (0x3ful << DDRPHY_DX3BDLR2_DQOEBD_Pos) /*!< DDRPHY_T::DX3BDLR2: DQOEBD Mask */ + +#define DDRPHY_DX3BDLR2_DSRBD_Pos (12) /*!< DDRPHY_T::DX3BDLR2: DSRBD Position */ +#define DDRPHY_DX3BDLR2_DSRBD_Msk (0x3ful << DDRPHY_DX3BDLR2_DSRBD_Pos) /*!< DDRPHY_T::DX3BDLR2: DSRBD Mask */ + +#define DDRPHY_DX3BDLR2_DSNRBD_Pos (18) /*!< DDRPHY_T::DX3BDLR2: DSNRBD Position */ +#define DDRPHY_DX3BDLR2_DSNRBD_Msk (0x3ful << DDRPHY_DX3BDLR2_DSNRBD_Pos) /*!< DDRPHY_T::DX3BDLR2: DSNRBD Mask */ + +#define DDRPHY_DX3BDLR3_DQ0RBD_Pos (0) /*!< DDRPHY_T::DX3BDLR3: DQ0RBD Position */ +#define DDRPHY_DX3BDLR3_DQ0RBD_Msk (0x3ful << DDRPHY_DX3BDLR3_DQ0RBD_Pos) /*!< DDRPHY_T::DX3BDLR3: DQ0RBD Mask */ + +#define DDRPHY_DX3BDLR3_DQ1RBD_Pos (6) /*!< DDRPHY_T::DX3BDLR3: DQ1RBD Position */ +#define DDRPHY_DX3BDLR3_DQ1RBD_Msk (0x3ful << DDRPHY_DX3BDLR3_DQ1RBD_Pos) /*!< DDRPHY_T::DX3BDLR3: DQ1RBD Mask */ + +#define DDRPHY_DX3BDLR3_DQ2RBD_Pos (12) /*!< DDRPHY_T::DX3BDLR3: DQ2RBD Position */ +#define DDRPHY_DX3BDLR3_DQ2RBD_Msk (0x3ful << DDRPHY_DX3BDLR3_DQ2RBD_Pos) /*!< DDRPHY_T::DX3BDLR3: DQ2RBD Mask */ + +#define DDRPHY_DX3BDLR3_DQ3RBD_Pos (18) /*!< DDRPHY_T::DX3BDLR3: DQ3RBD Position */ +#define DDRPHY_DX3BDLR3_DQ3RBD_Msk (0x3ful << DDRPHY_DX3BDLR3_DQ3RBD_Pos) /*!< DDRPHY_T::DX3BDLR3: DQ3RBD Mask */ + +#define DDRPHY_DX3BDLR3_DQ4RBD_Pos (24) /*!< DDRPHY_T::DX3BDLR3: DQ4RBD Position */ +#define DDRPHY_DX3BDLR3_DQ4RBD_Msk (0x3ful << DDRPHY_DX3BDLR3_DQ4RBD_Pos) /*!< DDRPHY_T::DX3BDLR3: DQ4RBD Mask */ + +#define DDRPHY_DX3BDLR4_DQ5RBD_Pos (0) /*!< DDRPHY_T::DX3BDLR4: DQ5RBD Position */ +#define DDRPHY_DX3BDLR4_DQ5RBD_Msk (0x3ful << DDRPHY_DX3BDLR4_DQ5RBD_Pos) /*!< DDRPHY_T::DX3BDLR4: DQ5RBD Mask */ + +#define DDRPHY_DX3BDLR4_DQ6RBD_Pos (6) /*!< DDRPHY_T::DX3BDLR4: DQ6RBD Position */ +#define DDRPHY_DX3BDLR4_DQ6RBD_Msk (0x3ful << DDRPHY_DX3BDLR4_DQ6RBD_Pos) /*!< DDRPHY_T::DX3BDLR4: DQ6RBD Mask */ + +#define DDRPHY_DX3BDLR4_DQ7RBD_Pos (12) /*!< DDRPHY_T::DX3BDLR4: DQ7RBD Position */ +#define DDRPHY_DX3BDLR4_DQ7RBD_Msk (0x3ful << DDRPHY_DX3BDLR4_DQ7RBD_Pos) /*!< DDRPHY_T::DX3BDLR4: DQ7RBD Mask */ + +#define DDRPHY_DX3BDLR4_DMRBD_Pos (18) /*!< DDRPHY_T::DX3BDLR4: DMRBD Position */ +#define DDRPHY_DX3BDLR4_DMRBD_Msk (0x3ful << DDRPHY_DX3BDLR4_DMRBD_Pos) /*!< DDRPHY_T::DX3BDLR4: DMRBD Mask */ + +#define DDRPHY_DX3LCDLR0_R0WLD_Pos (0) /*!< DDRPHY_T::DX3LCDLR0: R0WLD Position */ +#define DDRPHY_DX3LCDLR0_R0WLD_Msk (0xfful << DDRPHY_DX3LCDLR0_R0WLD_Pos) /*!< DDRPHY_T::DX3LCDLR0: R0WLD Mask */ + +#define DDRPHY_DX3LCDLR0_R1WLD_Pos (8) /*!< DDRPHY_T::DX3LCDLR0: R1WLD Position */ +#define DDRPHY_DX3LCDLR0_R1WLD_Msk (0xfful << DDRPHY_DX3LCDLR0_R1WLD_Pos) /*!< DDRPHY_T::DX3LCDLR0: R1WLD Mask */ + +#define DDRPHY_DX3LCDLR0_R2WLD_Pos (16) /*!< DDRPHY_T::DX3LCDLR0: R2WLD Position */ +#define DDRPHY_DX3LCDLR0_R2WLD_Msk (0xfful << DDRPHY_DX3LCDLR0_R2WLD_Pos) /*!< DDRPHY_T::DX3LCDLR0: R2WLD Mask */ + +#define DDRPHY_DX3LCDLR0_R3WLD_Pos (24) /*!< DDRPHY_T::DX3LCDLR0: R3WLD Position */ +#define DDRPHY_DX3LCDLR0_R3WLD_Msk (0xfful << DDRPHY_DX3LCDLR0_R3WLD_Pos) /*!< DDRPHY_T::DX3LCDLR0: R3WLD Mask */ + +#define DDRPHY_DX3LCDLR1_WDQD_Pos (0) /*!< DDRPHY_T::DX3LCDLR1: WDQD Position */ +#define DDRPHY_DX3LCDLR1_WDQD_Msk (0xfful << DDRPHY_DX3LCDLR1_WDQD_Pos) /*!< DDRPHY_T::DX3LCDLR1: WDQD Mask */ + +#define DDRPHY_DX3LCDLR1_RDQSD_Pos (8) /*!< DDRPHY_T::DX3LCDLR1: RDQSD Position */ +#define DDRPHY_DX3LCDLR1_RDQSD_Msk (0xfful << DDRPHY_DX3LCDLR1_RDQSD_Pos) /*!< DDRPHY_T::DX3LCDLR1: RDQSD Mask */ + +#define DDRPHY_DX3LCDLR1_RDQSND_Pos (16) /*!< DDRPHY_T::DX3LCDLR1: RDQSND Position */ +#define DDRPHY_DX3LCDLR1_RDQSND_Msk (0xfful << DDRPHY_DX3LCDLR1_RDQSND_Pos) /*!< DDRPHY_T::DX3LCDLR1: RDQSND Mask */ + +#define DDRPHY_DX3LCDLR2_R0DQSGD_Pos (0) /*!< DDRPHY_T::DX3LCDLR2: R0DQSGD Position */ +#define DDRPHY_DX3LCDLR2_R0DQSGD_Msk (0xfful << DDRPHY_DX3LCDLR2_R0DQSGD_Pos) /*!< DDRPHY_T::DX3LCDLR2: R0DQSGD Mask */ + +#define DDRPHY_DX3LCDLR2_R1DQSGD_Pos (8) /*!< DDRPHY_T::DX3LCDLR2: R1DQSGD Position */ +#define DDRPHY_DX3LCDLR2_R1DQSGD_Msk (0xfful << DDRPHY_DX3LCDLR2_R1DQSGD_Pos) /*!< DDRPHY_T::DX3LCDLR2: R1DQSGD Mask */ + +#define DDRPHY_DX3LCDLR2_R2DQSGD_Pos (16) /*!< DDRPHY_T::DX3LCDLR2: R2DQSGD Position */ +#define DDRPHY_DX3LCDLR2_R2DQSGD_Msk (0xfful << DDRPHY_DX3LCDLR2_R2DQSGD_Pos) /*!< DDRPHY_T::DX3LCDLR2: R2DQSGD Mask */ + +#define DDRPHY_DX3LCDLR2_R3DQSGD_Pos (24) /*!< DDRPHY_T::DX3LCDLR2: R3DQSGD Position */ +#define DDRPHY_DX3LCDLR2_R3DQSGD_Msk (0xfful << DDRPHY_DX3LCDLR2_R3DQSGD_Pos) /*!< DDRPHY_T::DX3LCDLR2: R3DQSGD Mask */ + +#define DDRPHY_DX3MDLR_IPRD_Pos (0) /*!< DDRPHY_T::DX3MDLR: IPRD Position */ +#define DDRPHY_DX3MDLR_IPRD_Msk (0xfful << DDRPHY_DX3MDLR_IPRD_Pos) /*!< DDRPHY_T::DX3MDLR: IPRD Mask */ + +#define DDRPHY_DX3MDLR_TPRD_Pos (8) /*!< DDRPHY_T::DX3MDLR: TPRD Position */ +#define DDRPHY_DX3MDLR_TPRD_Msk (0xfful << DDRPHY_DX3MDLR_TPRD_Pos) /*!< DDRPHY_T::DX3MDLR: TPRD Mask */ + +#define DDRPHY_DX3MDLR_MDLD_Pos (16) /*!< DDRPHY_T::DX3MDLR: MDLD Position */ +#define DDRPHY_DX3MDLR_MDLD_Msk (0xfful << DDRPHY_DX3MDLR_MDLD_Pos) /*!< DDRPHY_T::DX3MDLR: MDLD Mask */ + +#define DDRPHY_DX3GTR_R0DGSL_Pos (0) /*!< DDRPHY_T::DX3GTR: R0DGSL Position */ +#define DDRPHY_DX3GTR_R0DGSL_Msk (0x7ul << DDRPHY_DX3GTR_R0DGSL_Pos) /*!< DDRPHY_T::DX3GTR: R0DGSL Mask */ + +#define DDRPHY_DX3GTR_R1DGSL_Pos (3) /*!< DDRPHY_T::DX3GTR: R1DGSL Position */ +#define DDRPHY_DX3GTR_R1DGSL_Msk (0x7ul << DDRPHY_DX3GTR_R1DGSL_Pos) /*!< DDRPHY_T::DX3GTR: R1DGSL Mask */ + +#define DDRPHY_DX3GTR_R2DGSL_Pos (6) /*!< DDRPHY_T::DX3GTR: R2DGSL Position */ +#define DDRPHY_DX3GTR_R2DGSL_Msk (0x7ul << DDRPHY_DX3GTR_R2DGSL_Pos) /*!< DDRPHY_T::DX3GTR: R2DGSL Mask */ + +#define DDRPHY_DX3GTR_R3DGSL_Pos (9) /*!< DDRPHY_T::DX3GTR: R3DGSL Position */ +#define DDRPHY_DX3GTR_R3DGSL_Msk (0x7ul << DDRPHY_DX3GTR_R3DGSL_Pos) /*!< DDRPHY_T::DX3GTR: R3DGSL Mask */ + +#define DDRPHY_DX3GTR_R0WLSL_Pos (12) /*!< DDRPHY_T::DX3GTR: R0WLSL Position */ +#define DDRPHY_DX3GTR_R0WLSL_Msk (0x3ul << DDRPHY_DX3GTR_R0WLSL_Pos) /*!< DDRPHY_T::DX3GTR: R0WLSL Mask */ + +#define DDRPHY_DX3GTR_R1WLSL_Pos (14) /*!< DDRPHY_T::DX3GTR: R1WLSL Position */ +#define DDRPHY_DX3GTR_R1WLSL_Msk (0x3ul << DDRPHY_DX3GTR_R1WLSL_Pos) /*!< DDRPHY_T::DX3GTR: R1WLSL Mask */ + +#define DDRPHY_DX3GTR_R2WLSL_Pos (16) /*!< DDRPHY_T::DX3GTR: R2WLSL Position */ +#define DDRPHY_DX3GTR_R2WLSL_Msk (0x3ul << DDRPHY_DX3GTR_R2WLSL_Pos) /*!< DDRPHY_T::DX3GTR: R2WLSL Mask */ + +#define DDRPHY_DX3GTR_R3WLSL_Pos (18) /*!< DDRPHY_T::DX3GTR: R3WLSL Position */ +#define DDRPHY_DX3GTR_R3WLSL_Msk (0x3ul << DDRPHY_DX3GTR_R3WLSL_Pos) /*!< DDRPHY_T::DX3GTR: R3WLSL Mask */ + +#define DDRPHY_DX3GSR2_RDERR_Pos (0) /*!< DDRPHY_T::DX3GSR2: RDERR Position */ +#define DDRPHY_DX3GSR2_RDERR_Msk (0x1ul << DDRPHY_DX3GSR2_RDERR_Pos) /*!< DDRPHY_T::DX3GSR2: RDERR Mask */ + +#define DDRPHY_DX3GSR2_RDWN_Pos (1) /*!< DDRPHY_T::DX3GSR2: RDWN Position */ +#define DDRPHY_DX3GSR2_RDWN_Msk (0x1ul << DDRPHY_DX3GSR2_RDWN_Pos) /*!< DDRPHY_T::DX3GSR2: RDWN Mask */ + +#define DDRPHY_DX3GSR2_WDERR_Pos (2) /*!< DDRPHY_T::DX3GSR2: WDERR Position */ +#define DDRPHY_DX3GSR2_WDERR_Msk (0x1ul << DDRPHY_DX3GSR2_WDERR_Pos) /*!< DDRPHY_T::DX3GSR2: WDERR Mask */ + +#define DDRPHY_DX3GSR2_WDWN_Pos (3) /*!< DDRPHY_T::DX3GSR2: WDWN Position */ +#define DDRPHY_DX3GSR2_WDWN_Msk (0x1ul << DDRPHY_DX3GSR2_WDWN_Pos) /*!< DDRPHY_T::DX3GSR2: WDWN Mask */ + +#define DDRPHY_DX3GSR2_REERR_Pos (4) /*!< DDRPHY_T::DX3GSR2: REERR Position */ +#define DDRPHY_DX3GSR2_REERR_Msk (0x1ul << DDRPHY_DX3GSR2_REERR_Pos) /*!< DDRPHY_T::DX3GSR2: REERR Mask */ + +#define DDRPHY_DX3GSR2_REWN_Pos (5) /*!< DDRPHY_T::DX3GSR2: REWN Position */ +#define DDRPHY_DX3GSR2_REWN_Msk (0x1ul << DDRPHY_DX3GSR2_REWN_Pos) /*!< DDRPHY_T::DX3GSR2: REWN Mask */ + +#define DDRPHY_DX3GSR2_WEERR_Pos (6) /*!< DDRPHY_T::DX3GSR2: WEERR Position */ +#define DDRPHY_DX3GSR2_WEERR_Msk (0x1ul << DDRPHY_DX3GSR2_WEERR_Pos) /*!< DDRPHY_T::DX3GSR2: WEERR Mask */ + +#define DDRPHY_DX3GSR2_WEWN_Pos (7) /*!< DDRPHY_T::DX3GSR2: WEWN Position */ +#define DDRPHY_DX3GSR2_WEWN_Msk (0x1ul << DDRPHY_DX3GSR2_WEWN_Pos) /*!< DDRPHY_T::DX3GSR2: WEWN Mask */ + +#define DDRPHY_DX3GSR2_ESTAT_Pos (8) /*!< DDRPHY_T::DX3GSR2: ESTAT Position */ +#define DDRPHY_DX3GSR2_ESTAT_Msk (0xful << DDRPHY_DX3GSR2_ESTAT_Pos) /*!< DDRPHY_T::DX3GSR2: ESTAT Mask */ + +#define DDRPHY_DX4GCR_DXEN_Pos (0) /*!< DDRPHY_T::DX4GCR: DXEN Position */ +#define DDRPHY_DX4GCR_DXEN_Msk (0x1ul << DDRPHY_DX4GCR_DXEN_Pos) /*!< DDRPHY_T::DX4GCR: DXEN Mask */ + +#define DDRPHY_DX4GCR_DQSODT_Pos (1) /*!< DDRPHY_T::DX4GCR: DQSODT Position */ +#define DDRPHY_DX4GCR_DQSODT_Msk (0x1ul << DDRPHY_DX4GCR_DQSODT_Pos) /*!< DDRPHY_T::DX4GCR: DQSODT Mask */ + +#define DDRPHY_DX4GCR_DQODT_Pos (2) /*!< DDRPHY_T::DX4GCR: DQODT Position */ +#define DDRPHY_DX4GCR_DQODT_Msk (0x1ul << DDRPHY_DX4GCR_DQODT_Pos) /*!< DDRPHY_T::DX4GCR: DQODT Mask */ + +#define DDRPHY_DX4GCR_DXIOM_Pos (3) /*!< DDRPHY_T::DX4GCR: DXIOM Position */ +#define DDRPHY_DX4GCR_DXIOM_Msk (0x1ul << DDRPHY_DX4GCR_DXIOM_Pos) /*!< DDRPHY_T::DX4GCR: DXIOM Mask */ + +#define DDRPHY_DX4GCR_DXPDD_Pos (4) /*!< DDRPHY_T::DX4GCR: DXPDD Position */ +#define DDRPHY_DX4GCR_DXPDD_Msk (0x1ul << DDRPHY_DX4GCR_DXPDD_Pos) /*!< DDRPHY_T::DX4GCR: DXPDD Mask */ + +#define DDRPHY_DX4GCR_DXPDR_Pos (5) /*!< DDRPHY_T::DX4GCR: DXPDR Position */ +#define DDRPHY_DX4GCR_DXPDR_Msk (0x1ul << DDRPHY_DX4GCR_DXPDR_Pos) /*!< DDRPHY_T::DX4GCR: DXPDR Mask */ + +#define DDRPHY_DX4GCR_DQSRPD_Pos (6) /*!< DDRPHY_T::DX4GCR: DQSRPD Position */ +#define DDRPHY_DX4GCR_DQSRPD_Msk (0x1ul << DDRPHY_DX4GCR_DQSRPD_Pos) /*!< DDRPHY_T::DX4GCR: DQSRPD Mask */ + +#define DDRPHY_DX4GCR_DSEN_Pos (7) /*!< DDRPHY_T::DX4GCR: DSEN Position */ +#define DDRPHY_DX4GCR_DSEN_Msk (0x3ul << DDRPHY_DX4GCR_DSEN_Pos) /*!< DDRPHY_T::DX4GCR: DSEN Mask */ + +#define DDRPHY_DX4GCR_DQSRTT_Pos (9) /*!< DDRPHY_T::DX4GCR: DQSRTT Position */ +#define DDRPHY_DX4GCR_DQSRTT_Msk (0x1ul << DDRPHY_DX4GCR_DQSRTT_Pos) /*!< DDRPHY_T::DX4GCR: DQSRTT Mask */ + +#define DDRPHY_DX4GCR_DQRTT_Pos (10) /*!< DDRPHY_T::DX4GCR: DQRTT Position */ +#define DDRPHY_DX4GCR_DQRTT_Msk (0x1ul << DDRPHY_DX4GCR_DQRTT_Pos) /*!< DDRPHY_T::DX4GCR: DQRTT Mask */ + +#define DDRPHY_DX4GCR_RTTOH_Pos (11) /*!< DDRPHY_T::DX4GCR: RTTOH Position */ +#define DDRPHY_DX4GCR_RTTOH_Msk (0x3ul << DDRPHY_DX4GCR_RTTOH_Pos) /*!< DDRPHY_T::DX4GCR: RTTOH Mask */ + +#define DDRPHY_DX4GCR_RTTOAL_Pos (13) /*!< DDRPHY_T::DX4GCR: RTTOAL Position */ +#define DDRPHY_DX4GCR_RTTOAL_Msk (0x1ul << DDRPHY_DX4GCR_RTTOAL_Pos) /*!< DDRPHY_T::DX4GCR: RTTOAL Mask */ + +#define DDRPHY_DX4GCR_DXOEO_Pos (14) /*!< DDRPHY_T::DX4GCR: DXOEO Position */ +#define DDRPHY_DX4GCR_DXOEO_Msk (0x3ul << DDRPHY_DX4GCR_DXOEO_Pos) /*!< DDRPHY_T::DX4GCR: DXOEO Mask */ + +#define DDRPHY_DX4GCR_PLLRST_Pos (16) /*!< DDRPHY_T::DX4GCR: PLLRST Position */ +#define DDRPHY_DX4GCR_PLLRST_Msk (0x1ul << DDRPHY_DX4GCR_PLLRST_Pos) /*!< DDRPHY_T::DX4GCR: PLLRST Mask */ + +#define DDRPHY_DX4GCR_PLLPD_Pos (17) /*!< DDRPHY_T::DX4GCR: PLLPD Position */ +#define DDRPHY_DX4GCR_PLLPD_Msk (0x1ul << DDRPHY_DX4GCR_PLLPD_Pos) /*!< DDRPHY_T::DX4GCR: PLLPD Mask */ + +#define DDRPHY_DX4GCR_GSHIFT_Pos (18) /*!< DDRPHY_T::DX4GCR: GSHIFT Position */ +#define DDRPHY_DX4GCR_GSHIFT_Msk (0x1ul << DDRPHY_DX4GCR_GSHIFT_Pos) /*!< DDRPHY_T::DX4GCR: GSHIFT Mask */ + +#define DDRPHY_DX4GCR_PLLBYP_Pos (19) /*!< DDRPHY_T::DX4GCR: PLLBYP Position */ +#define DDRPHY_DX4GCR_PLLBYP_Msk (0x1ul << DDRPHY_DX4GCR_PLLBYP_Pos) /*!< DDRPHY_T::DX4GCR: PLLBYP Mask */ + +#define DDRPHY_DX4GCR_WLRKEN_Pos (26) /*!< DDRPHY_T::DX4GCR: WLRKEN Position */ +#define DDRPHY_DX4GCR_WLRKEN_Msk (0xful << DDRPHY_DX4GCR_WLRKEN_Pos) /*!< DDRPHY_T::DX4GCR: WLRKEN Mask */ + +#define DDRPHY_DX4GCR_MDLEN_Pos (30) /*!< DDRPHY_T::DX4GCR: MDLEN Position */ +#define DDRPHY_DX4GCR_MDLEN_Msk (0x1ul << DDRPHY_DX4GCR_MDLEN_Pos) /*!< DDRPHY_T::DX4GCR: MDLEN Mask */ + +#define DDRPHY_DX4GCR_CALBYP_Pos (31) /*!< DDRPHY_T::DX4GCR: CALBYP Position */ +#define DDRPHY_DX4GCR_CALBYP_Msk (0x1ul << DDRPHY_DX4GCR_CALBYP_Pos) /*!< DDRPHY_T::DX4GCR: CALBYP Mask */ + +#define DDRPHY_DX4GSR0_WDQCAL_Pos (0) /*!< DDRPHY_T::DX4GSR0: WDQCAL Position */ +#define DDRPHY_DX4GSR0_WDQCAL_Msk (0x1ul << DDRPHY_DX4GSR0_WDQCAL_Pos) /*!< DDRPHY_T::DX4GSR0: WDQCAL Mask */ + +#define DDRPHY_DX4GSR0_RDQSCAL_Pos (1) /*!< DDRPHY_T::DX4GSR0: RDQSCAL Position */ +#define DDRPHY_DX4GSR0_RDQSCAL_Msk (0x1ul << DDRPHY_DX4GSR0_RDQSCAL_Pos) /*!< DDRPHY_T::DX4GSR0: RDQSCAL Mask */ + +#define DDRPHY_DX4GSR0_RDQSNCAL_Pos (2) /*!< DDRPHY_T::DX4GSR0: RDQSNCAL Position */ +#define DDRPHY_DX4GSR0_RDQSNCAL_Msk (0x1ul << DDRPHY_DX4GSR0_RDQSNCAL_Pos) /*!< DDRPHY_T::DX4GSR0: RDQSNCAL Mask */ + +#define DDRPHY_DX4GSR0_GDQSCAL_Pos (3) /*!< DDRPHY_T::DX4GSR0: GDQSCAL Position */ +#define DDRPHY_DX4GSR0_GDQSCAL_Msk (0x1ul << DDRPHY_DX4GSR0_GDQSCAL_Pos) /*!< DDRPHY_T::DX4GSR0: GDQSCAL Mask */ + +#define DDRPHY_DX4GSR0_WLCAL_Pos (4) /*!< DDRPHY_T::DX4GSR0: WLCAL Position */ +#define DDRPHY_DX4GSR0_WLCAL_Msk (0x1ul << DDRPHY_DX4GSR0_WLCAL_Pos) /*!< DDRPHY_T::DX4GSR0: WLCAL Mask */ + +#define DDRPHY_DX4GSR0_WLDONE_Pos (5) /*!< DDRPHY_T::DX4GSR0: WLDONE Position */ +#define DDRPHY_DX4GSR0_WLDONE_Msk (0x1ul << DDRPHY_DX4GSR0_WLDONE_Pos) /*!< DDRPHY_T::DX4GSR0: WLDONE Mask */ + +#define DDRPHY_DX4GSR0_WLERR_Pos (6) /*!< DDRPHY_T::DX4GSR0: WLERR Position */ +#define DDRPHY_DX4GSR0_WLERR_Msk (0x1ul << DDRPHY_DX4GSR0_WLERR_Pos) /*!< DDRPHY_T::DX4GSR0: WLERR Mask */ + +#define DDRPHY_DX4GSR0_WLPRD_Pos (7) /*!< DDRPHY_T::DX4GSR0: WLPRD Position */ +#define DDRPHY_DX4GSR0_WLPRD_Msk (0xfful << DDRPHY_DX4GSR0_WLPRD_Pos) /*!< DDRPHY_T::DX4GSR0: WLPRD Mask */ + +#define DDRPHY_DX4GSR0_DPLOCK_Pos (15) /*!< DDRPHY_T::DX4GSR0: DPLOCK Position */ +#define DDRPHY_DX4GSR0_DPLOCK_Msk (0x1ul << DDRPHY_DX4GSR0_DPLOCK_Pos) /*!< DDRPHY_T::DX4GSR0: DPLOCK Mask */ + +#define DDRPHY_DX4GSR0_GDQSPRD_Pos (16) /*!< DDRPHY_T::DX4GSR0: GDQSPRD Position */ +#define DDRPHY_DX4GSR0_GDQSPRD_Msk (0xfful << DDRPHY_DX4GSR0_GDQSPRD_Pos) /*!< DDRPHY_T::DX4GSR0: GDQSPRD Mask */ + +#define DDRPHY_DX4GSR0_QSGERR_Pos (24) /*!< DDRPHY_T::DX4GSR0: QSGERR Position */ +#define DDRPHY_DX4GSR0_QSGERR_Msk (0xful << DDRPHY_DX4GSR0_QSGERR_Pos) /*!< DDRPHY_T::DX4GSR0: QSGERR Mask */ + +#define DDRPHY_DX4GSR0_WLDQ_Pos (28) /*!< DDRPHY_T::DX4GSR0: WLDQ Position */ +#define DDRPHY_DX4GSR0_WLDQ_Msk (0x1ul << DDRPHY_DX4GSR0_WLDQ_Pos) /*!< DDRPHY_T::DX4GSR0: WLDQ Mask */ + +#define DDRPHY_DX4GSR1_DLTDONE_Pos (0) /*!< DDRPHY_T::DX4GSR1: DLTDONE Position */ +#define DDRPHY_DX4GSR1_DLTDONE_Msk (0x1ul << DDRPHY_DX4GSR1_DLTDONE_Pos) /*!< DDRPHY_T::DX4GSR1: DLTDONE Mask */ + +#define DDRPHY_DX4GSR1_DLTCODE_Pos (1) /*!< DDRPHY_T::DX4GSR1: DLTCODE Position */ +#define DDRPHY_DX4GSR1_DLTCODE_Msk (0xfffffful << DDRPHY_DX4GSR1_DLTCODE_Pos) /*!< DDRPHY_T::DX4GSR1: DLTCODE Mask */ + +#define DDRPHY_DX4BDLR0_DQ0WBD_Pos (0) /*!< DDRPHY_T::DX4BDLR0: DQ0WBD Position */ +#define DDRPHY_DX4BDLR0_DQ0WBD_Msk (0x3ful << DDRPHY_DX4BDLR0_DQ0WBD_Pos) /*!< DDRPHY_T::DX4BDLR0: DQ0WBD Mask */ + +#define DDRPHY_DX4BDLR0_DQ1WBD_Pos (6) /*!< DDRPHY_T::DX4BDLR0: DQ1WBD Position */ +#define DDRPHY_DX4BDLR0_DQ1WBD_Msk (0x3ful << DDRPHY_DX4BDLR0_DQ1WBD_Pos) /*!< DDRPHY_T::DX4BDLR0: DQ1WBD Mask */ + +#define DDRPHY_DX4BDLR0_DQ2WBD_Pos (12) /*!< DDRPHY_T::DX4BDLR0: DQ2WBD Position */ +#define DDRPHY_DX4BDLR0_DQ2WBD_Msk (0x3ful << DDRPHY_DX4BDLR0_DQ2WBD_Pos) /*!< DDRPHY_T::DX4BDLR0: DQ2WBD Mask */ + +#define DDRPHY_DX4BDLR0_DQ3WBD_Pos (18) /*!< DDRPHY_T::DX4BDLR0: DQ3WBD Position */ +#define DDRPHY_DX4BDLR0_DQ3WBD_Msk (0x3ful << DDRPHY_DX4BDLR0_DQ3WBD_Pos) /*!< DDRPHY_T::DX4BDLR0: DQ3WBD Mask */ + +#define DDRPHY_DX4BDLR0_DQ4WBD_Pos (24) /*!< DDRPHY_T::DX4BDLR0: DQ4WBD Position */ +#define DDRPHY_DX4BDLR0_DQ4WBD_Msk (0x3ful << DDRPHY_DX4BDLR0_DQ4WBD_Pos) /*!< DDRPHY_T::DX4BDLR0: DQ4WBD Mask */ + +#define DDRPHY_DX4BDLR1_DQ5WBD_Pos (0) /*!< DDRPHY_T::DX4BDLR1: DQ5WBD Position */ +#define DDRPHY_DX4BDLR1_DQ5WBD_Msk (0x3ful << DDRPHY_DX4BDLR1_DQ5WBD_Pos) /*!< DDRPHY_T::DX4BDLR1: DQ5WBD Mask */ + +#define DDRPHY_DX4BDLR1_DQ6WBD_Pos (6) /*!< DDRPHY_T::DX4BDLR1: DQ6WBD Position */ +#define DDRPHY_DX4BDLR1_DQ6WBD_Msk (0x3ful << DDRPHY_DX4BDLR1_DQ6WBD_Pos) /*!< DDRPHY_T::DX4BDLR1: DQ6WBD Mask */ + +#define DDRPHY_DX4BDLR1_DQ7WBD_Pos (12) /*!< DDRPHY_T::DX4BDLR1: DQ7WBD Position */ +#define DDRPHY_DX4BDLR1_DQ7WBD_Msk (0x3ful << DDRPHY_DX4BDLR1_DQ7WBD_Pos) /*!< DDRPHY_T::DX4BDLR1: DQ7WBD Mask */ + +#define DDRPHY_DX4BDLR1_DMWBD_Pos (18) /*!< DDRPHY_T::DX4BDLR1: DMWBD Position */ +#define DDRPHY_DX4BDLR1_DMWBD_Msk (0x3ful << DDRPHY_DX4BDLR1_DMWBD_Pos) /*!< DDRPHY_T::DX4BDLR1: DMWBD Mask */ + +#define DDRPHY_DX4BDLR1_DSWBD_Pos (24) /*!< DDRPHY_T::DX4BDLR1: DSWBD Position */ +#define DDRPHY_DX4BDLR1_DSWBD_Msk (0x3ful << DDRPHY_DX4BDLR1_DSWBD_Pos) /*!< DDRPHY_T::DX4BDLR1: DSWBD Mask */ + +#define DDRPHY_DX4BDLR2_DSOEBD_Pos (0) /*!< DDRPHY_T::DX4BDLR2: DSOEBD Position */ +#define DDRPHY_DX4BDLR2_DSOEBD_Msk (0x3ful << DDRPHY_DX4BDLR2_DSOEBD_Pos) /*!< DDRPHY_T::DX4BDLR2: DSOEBD Mask */ + +#define DDRPHY_DX4BDLR2_DQOEBD_Pos (6) /*!< DDRPHY_T::DX4BDLR2: DQOEBD Position */ +#define DDRPHY_DX4BDLR2_DQOEBD_Msk (0x3ful << DDRPHY_DX4BDLR2_DQOEBD_Pos) /*!< DDRPHY_T::DX4BDLR2: DQOEBD Mask */ + +#define DDRPHY_DX4BDLR2_DSRBD_Pos (12) /*!< DDRPHY_T::DX4BDLR2: DSRBD Position */ +#define DDRPHY_DX4BDLR2_DSRBD_Msk (0x3ful << DDRPHY_DX4BDLR2_DSRBD_Pos) /*!< DDRPHY_T::DX4BDLR2: DSRBD Mask */ + +#define DDRPHY_DX4BDLR2_DSNRBD_Pos (18) /*!< DDRPHY_T::DX4BDLR2: DSNRBD Position */ +#define DDRPHY_DX4BDLR2_DSNRBD_Msk (0x3ful << DDRPHY_DX4BDLR2_DSNRBD_Pos) /*!< DDRPHY_T::DX4BDLR2: DSNRBD Mask */ + +#define DDRPHY_DX4BDLR3_DQ0RBD_Pos (0) /*!< DDRPHY_T::DX4BDLR3: DQ0RBD Position */ +#define DDRPHY_DX4BDLR3_DQ0RBD_Msk (0x3ful << DDRPHY_DX4BDLR3_DQ0RBD_Pos) /*!< DDRPHY_T::DX4BDLR3: DQ0RBD Mask */ + +#define DDRPHY_DX4BDLR3_DQ1RBD_Pos (6) /*!< DDRPHY_T::DX4BDLR3: DQ1RBD Position */ +#define DDRPHY_DX4BDLR3_DQ1RBD_Msk (0x3ful << DDRPHY_DX4BDLR3_DQ1RBD_Pos) /*!< DDRPHY_T::DX4BDLR3: DQ1RBD Mask */ + +#define DDRPHY_DX4BDLR3_DQ2RBD_Pos (12) /*!< DDRPHY_T::DX4BDLR3: DQ2RBD Position */ +#define DDRPHY_DX4BDLR3_DQ2RBD_Msk (0x3ful << DDRPHY_DX4BDLR3_DQ2RBD_Pos) /*!< DDRPHY_T::DX4BDLR3: DQ2RBD Mask */ + +#define DDRPHY_DX4BDLR3_DQ3RBD_Pos (18) /*!< DDRPHY_T::DX4BDLR3: DQ3RBD Position */ +#define DDRPHY_DX4BDLR3_DQ3RBD_Msk (0x3ful << DDRPHY_DX4BDLR3_DQ3RBD_Pos) /*!< DDRPHY_T::DX4BDLR3: DQ3RBD Mask */ + +#define DDRPHY_DX4BDLR3_DQ4RBD_Pos (24) /*!< DDRPHY_T::DX4BDLR3: DQ4RBD Position */ +#define DDRPHY_DX4BDLR3_DQ4RBD_Msk (0x3ful << DDRPHY_DX4BDLR3_DQ4RBD_Pos) /*!< DDRPHY_T::DX4BDLR3: DQ4RBD Mask */ + +#define DDRPHY_DX4BDLR4_DQ5RBD_Pos (0) /*!< DDRPHY_T::DX4BDLR4: DQ5RBD Position */ +#define DDRPHY_DX4BDLR4_DQ5RBD_Msk (0x3ful << DDRPHY_DX4BDLR4_DQ5RBD_Pos) /*!< DDRPHY_T::DX4BDLR4: DQ5RBD Mask */ + +#define DDRPHY_DX4BDLR4_DQ6RBD_Pos (6) /*!< DDRPHY_T::DX4BDLR4: DQ6RBD Position */ +#define DDRPHY_DX4BDLR4_DQ6RBD_Msk (0x3ful << DDRPHY_DX4BDLR4_DQ6RBD_Pos) /*!< DDRPHY_T::DX4BDLR4: DQ6RBD Mask */ + +#define DDRPHY_DX4BDLR4_DQ7RBD_Pos (12) /*!< DDRPHY_T::DX4BDLR4: DQ7RBD Position */ +#define DDRPHY_DX4BDLR4_DQ7RBD_Msk (0x3ful << DDRPHY_DX4BDLR4_DQ7RBD_Pos) /*!< DDRPHY_T::DX4BDLR4: DQ7RBD Mask */ + +#define DDRPHY_DX4BDLR4_DMRBD_Pos (18) /*!< DDRPHY_T::DX4BDLR4: DMRBD Position */ +#define DDRPHY_DX4BDLR4_DMRBD_Msk (0x3ful << DDRPHY_DX4BDLR4_DMRBD_Pos) /*!< DDRPHY_T::DX4BDLR4: DMRBD Mask */ + +#define DDRPHY_DX4LCDLR0_R0WLD_Pos (0) /*!< DDRPHY_T::DX4LCDLR0: R0WLD Position */ +#define DDRPHY_DX4LCDLR0_R0WLD_Msk (0xfful << DDRPHY_DX4LCDLR0_R0WLD_Pos) /*!< DDRPHY_T::DX4LCDLR0: R0WLD Mask */ + +#define DDRPHY_DX4LCDLR0_R1WLD_Pos (8) /*!< DDRPHY_T::DX4LCDLR0: R1WLD Position */ +#define DDRPHY_DX4LCDLR0_R1WLD_Msk (0xfful << DDRPHY_DX4LCDLR0_R1WLD_Pos) /*!< DDRPHY_T::DX4LCDLR0: R1WLD Mask */ + +#define DDRPHY_DX4LCDLR0_R2WLD_Pos (16) /*!< DDRPHY_T::DX4LCDLR0: R2WLD Position */ +#define DDRPHY_DX4LCDLR0_R2WLD_Msk (0xfful << DDRPHY_DX4LCDLR0_R2WLD_Pos) /*!< DDRPHY_T::DX4LCDLR0: R2WLD Mask */ + +#define DDRPHY_DX4LCDLR0_R3WLD_Pos (24) /*!< DDRPHY_T::DX4LCDLR0: R3WLD Position */ +#define DDRPHY_DX4LCDLR0_R3WLD_Msk (0xfful << DDRPHY_DX4LCDLR0_R3WLD_Pos) /*!< DDRPHY_T::DX4LCDLR0: R3WLD Mask */ + +#define DDRPHY_DX4LCDLR2_R0DQSGD_Pos (0) /*!< DDRPHY_T::DX4LCDLR2: R0DQSGD Position */ +#define DDRPHY_DX4LCDLR2_R0DQSGD_Msk (0xfful << DDRPHY_DX4LCDLR2_R0DQSGD_Pos) /*!< DDRPHY_T::DX4LCDLR2: R0DQSGD Mask */ + +#define DDRPHY_DX4LCDLR2_R1DQSGD_Pos (8) /*!< DDRPHY_T::DX4LCDLR2: R1DQSGD Position */ +#define DDRPHY_DX4LCDLR2_R1DQSGD_Msk (0xfful << DDRPHY_DX4LCDLR2_R1DQSGD_Pos) /*!< DDRPHY_T::DX4LCDLR2: R1DQSGD Mask */ + +#define DDRPHY_DX4LCDLR2_R2DQSGD_Pos (16) /*!< DDRPHY_T::DX4LCDLR2: R2DQSGD Position */ +#define DDRPHY_DX4LCDLR2_R2DQSGD_Msk (0xfful << DDRPHY_DX4LCDLR2_R2DQSGD_Pos) /*!< DDRPHY_T::DX4LCDLR2: R2DQSGD Mask */ + +#define DDRPHY_DX4LCDLR2_R3DQSGD_Pos (24) /*!< DDRPHY_T::DX4LCDLR2: R3DQSGD Position */ +#define DDRPHY_DX4LCDLR2_R3DQSGD_Msk (0xfful << DDRPHY_DX4LCDLR2_R3DQSGD_Pos) /*!< DDRPHY_T::DX4LCDLR2: R3DQSGD Mask */ + +#define DDRPHY_DX4MDLR_IPRD_Pos (0) /*!< DDRPHY_T::DX4MDLR: IPRD Position */ +#define DDRPHY_DX4MDLR_IPRD_Msk (0xfful << DDRPHY_DX4MDLR_IPRD_Pos) /*!< DDRPHY_T::DX4MDLR: IPRD Mask */ + +#define DDRPHY_DX4MDLR_TPRD_Pos (8) /*!< DDRPHY_T::DX4MDLR: TPRD Position */ +#define DDRPHY_DX4MDLR_TPRD_Msk (0xfful << DDRPHY_DX4MDLR_TPRD_Pos) /*!< DDRPHY_T::DX4MDLR: TPRD Mask */ + +#define DDRPHY_DX4MDLR_MDLD_Pos (16) /*!< DDRPHY_T::DX4MDLR: MDLD Position */ +#define DDRPHY_DX4MDLR_MDLD_Msk (0xfful << DDRPHY_DX4MDLR_MDLD_Pos) /*!< DDRPHY_T::DX4MDLR: MDLD Mask */ + +#define DDRPHY_DX4GTR_R0DGSL_Pos (0) /*!< DDRPHY_T::DX4GTR: R0DGSL Position */ +#define DDRPHY_DX4GTR_R0DGSL_Msk (0x7ul << DDRPHY_DX4GTR_R0DGSL_Pos) /*!< DDRPHY_T::DX4GTR: R0DGSL Mask */ + +#define DDRPHY_DX4GTR_R1DGSL_Pos (3) /*!< DDRPHY_T::DX4GTR: R1DGSL Position */ +#define DDRPHY_DX4GTR_R1DGSL_Msk (0x7ul << DDRPHY_DX4GTR_R1DGSL_Pos) /*!< DDRPHY_T::DX4GTR: R1DGSL Mask */ + +#define DDRPHY_DX4GTR_R2DGSL_Pos (6) /*!< DDRPHY_T::DX4GTR: R2DGSL Position */ +#define DDRPHY_DX4GTR_R2DGSL_Msk (0x7ul << DDRPHY_DX4GTR_R2DGSL_Pos) /*!< DDRPHY_T::DX4GTR: R2DGSL Mask */ + +#define DDRPHY_DX4GTR_R3DGSL_Pos (9) /*!< DDRPHY_T::DX4GTR: R3DGSL Position */ +#define DDRPHY_DX4GTR_R3DGSL_Msk (0x7ul << DDRPHY_DX4GTR_R3DGSL_Pos) /*!< DDRPHY_T::DX4GTR: R3DGSL Mask */ + +#define DDRPHY_DX4GTR_R0WLSL_Pos (12) /*!< DDRPHY_T::DX4GTR: R0WLSL Position */ +#define DDRPHY_DX4GTR_R0WLSL_Msk (0x3ul << DDRPHY_DX4GTR_R0WLSL_Pos) /*!< DDRPHY_T::DX4GTR: R0WLSL Mask */ + +#define DDRPHY_DX4GTR_R1WLSL_Pos (14) /*!< DDRPHY_T::DX4GTR: R1WLSL Position */ +#define DDRPHY_DX4GTR_R1WLSL_Msk (0x3ul << DDRPHY_DX4GTR_R1WLSL_Pos) /*!< DDRPHY_T::DX4GTR: R1WLSL Mask */ + +#define DDRPHY_DX4GTR_R2WLSL_Pos (16) /*!< DDRPHY_T::DX4GTR: R2WLSL Position */ +#define DDRPHY_DX4GTR_R2WLSL_Msk (0x3ul << DDRPHY_DX4GTR_R2WLSL_Pos) /*!< DDRPHY_T::DX4GTR: R2WLSL Mask */ + +#define DDRPHY_DX4GTR_R3WLSL_Pos (18) /*!< DDRPHY_T::DX4GTR: R3WLSL Position */ +#define DDRPHY_DX4GTR_R3WLSL_Msk (0x3ul << DDRPHY_DX4GTR_R3WLSL_Pos) /*!< DDRPHY_T::DX4GTR: R3WLSL Mask */ + +#define DDRPHY_DX4GSR2_RDERR_Pos (0) /*!< DDRPHY_T::DX4GSR2: RDERR Position */ +#define DDRPHY_DX4GSR2_RDERR_Msk (0x1ul << DDRPHY_DX4GSR2_RDERR_Pos) /*!< DDRPHY_T::DX4GSR2: RDERR Mask */ + +#define DDRPHY_DX4GSR2_RDWN_Pos (1) /*!< DDRPHY_T::DX4GSR2: RDWN Position */ +#define DDRPHY_DX4GSR2_RDWN_Msk (0x1ul << DDRPHY_DX4GSR2_RDWN_Pos) /*!< DDRPHY_T::DX4GSR2: RDWN Mask */ + +#define DDRPHY_DX4GSR2_WDERR_Pos (2) /*!< DDRPHY_T::DX4GSR2: WDERR Position */ +#define DDRPHY_DX4GSR2_WDERR_Msk (0x1ul << DDRPHY_DX4GSR2_WDERR_Pos) /*!< DDRPHY_T::DX4GSR2: WDERR Mask */ + +#define DDRPHY_DX4GSR2_WDWN_Pos (3) /*!< DDRPHY_T::DX4GSR2: WDWN Position */ +#define DDRPHY_DX4GSR2_WDWN_Msk (0x1ul << DDRPHY_DX4GSR2_WDWN_Pos) /*!< DDRPHY_T::DX4GSR2: WDWN Mask */ + +#define DDRPHY_DX4GSR2_REERR_Pos (4) /*!< DDRPHY_T::DX4GSR2: REERR Position */ +#define DDRPHY_DX4GSR2_REERR_Msk (0x1ul << DDRPHY_DX4GSR2_REERR_Pos) /*!< DDRPHY_T::DX4GSR2: REERR Mask */ + +#define DDRPHY_DX4GSR2_REWN_Pos (5) /*!< DDRPHY_T::DX4GSR2: REWN Position */ +#define DDRPHY_DX4GSR2_REWN_Msk (0x1ul << DDRPHY_DX4GSR2_REWN_Pos) /*!< DDRPHY_T::DX4GSR2: REWN Mask */ + +#define DDRPHY_DX4GSR2_WEERR_Pos (6) /*!< DDRPHY_T::DX4GSR2: WEERR Position */ +#define DDRPHY_DX4GSR2_WEERR_Msk (0x1ul << DDRPHY_DX4GSR2_WEERR_Pos) /*!< DDRPHY_T::DX4GSR2: WEERR Mask */ + +#define DDRPHY_DX4GSR2_WEWN_Pos (7) /*!< DDRPHY_T::DX4GSR2: WEWN Position */ +#define DDRPHY_DX4GSR2_WEWN_Msk (0x1ul << DDRPHY_DX4GSR2_WEWN_Pos) /*!< DDRPHY_T::DX4GSR2: WEWN Mask */ + +#define DDRPHY_DX4GSR2_ESTAT_Pos (8) /*!< DDRPHY_T::DX4GSR2: ESTAT Position */ +#define DDRPHY_DX4GSR2_ESTAT_Msk (0xful << DDRPHY_DX4GSR2_ESTAT_Pos) /*!< DDRPHY_T::DX4GSR2: ESTAT Mask */ + +#define DDRPHY_DX5GCR_DXEN_Pos (0) /*!< DDRPHY_T::DX5GCR: DXEN Position */ +#define DDRPHY_DX5GCR_DXEN_Msk (0x1ul << DDRPHY_DX5GCR_DXEN_Pos) /*!< DDRPHY_T::DX5GCR: DXEN Mask */ + +#define DDRPHY_DX5GCR_DQSODT_Pos (1) /*!< DDRPHY_T::DX5GCR: DQSODT Position */ +#define DDRPHY_DX5GCR_DQSODT_Msk (0x1ul << DDRPHY_DX5GCR_DQSODT_Pos) /*!< DDRPHY_T::DX5GCR: DQSODT Mask */ + +#define DDRPHY_DX5GCR_DQODT_Pos (2) /*!< DDRPHY_T::DX5GCR: DQODT Position */ +#define DDRPHY_DX5GCR_DQODT_Msk (0x1ul << DDRPHY_DX5GCR_DQODT_Pos) /*!< DDRPHY_T::DX5GCR: DQODT Mask */ + +#define DDRPHY_DX5GCR_DXIOM_Pos (3) /*!< DDRPHY_T::DX5GCR: DXIOM Position */ +#define DDRPHY_DX5GCR_DXIOM_Msk (0x1ul << DDRPHY_DX5GCR_DXIOM_Pos) /*!< DDRPHY_T::DX5GCR: DXIOM Mask */ + +#define DDRPHY_DX5GCR_DXPDD_Pos (4) /*!< DDRPHY_T::DX5GCR: DXPDD Position */ +#define DDRPHY_DX5GCR_DXPDD_Msk (0x1ul << DDRPHY_DX5GCR_DXPDD_Pos) /*!< DDRPHY_T::DX5GCR: DXPDD Mask */ + +#define DDRPHY_DX5GCR_DXPDR_Pos (5) /*!< DDRPHY_T::DX5GCR: DXPDR Position */ +#define DDRPHY_DX5GCR_DXPDR_Msk (0x1ul << DDRPHY_DX5GCR_DXPDR_Pos) /*!< DDRPHY_T::DX5GCR: DXPDR Mask */ + +#define DDRPHY_DX5GCR_DQSRPD_Pos (6) /*!< DDRPHY_T::DX5GCR: DQSRPD Position */ +#define DDRPHY_DX5GCR_DQSRPD_Msk (0x1ul << DDRPHY_DX5GCR_DQSRPD_Pos) /*!< DDRPHY_T::DX5GCR: DQSRPD Mask */ + +#define DDRPHY_DX5GCR_DSEN_Pos (7) /*!< DDRPHY_T::DX5GCR: DSEN Position */ +#define DDRPHY_DX5GCR_DSEN_Msk (0x3ul << DDRPHY_DX5GCR_DSEN_Pos) /*!< DDRPHY_T::DX5GCR: DSEN Mask */ + +#define DDRPHY_DX5GCR_DQSRTT_Pos (9) /*!< DDRPHY_T::DX5GCR: DQSRTT Position */ +#define DDRPHY_DX5GCR_DQSRTT_Msk (0x1ul << DDRPHY_DX5GCR_DQSRTT_Pos) /*!< DDRPHY_T::DX5GCR: DQSRTT Mask */ + +#define DDRPHY_DX5GCR_DQRTT_Pos (10) /*!< DDRPHY_T::DX5GCR: DQRTT Position */ +#define DDRPHY_DX5GCR_DQRTT_Msk (0x1ul << DDRPHY_DX5GCR_DQRTT_Pos) /*!< DDRPHY_T::DX5GCR: DQRTT Mask */ + +#define DDRPHY_DX5GCR_RTTOH_Pos (11) /*!< DDRPHY_T::DX5GCR: RTTOH Position */ +#define DDRPHY_DX5GCR_RTTOH_Msk (0x3ul << DDRPHY_DX5GCR_RTTOH_Pos) /*!< DDRPHY_T::DX5GCR: RTTOH Mask */ + +#define DDRPHY_DX5GCR_RTTOAL_Pos (13) /*!< DDRPHY_T::DX5GCR: RTTOAL Position */ +#define DDRPHY_DX5GCR_RTTOAL_Msk (0x1ul << DDRPHY_DX5GCR_RTTOAL_Pos) /*!< DDRPHY_T::DX5GCR: RTTOAL Mask */ + +#define DDRPHY_DX5GCR_DXOEO_Pos (14) /*!< DDRPHY_T::DX5GCR: DXOEO Position */ +#define DDRPHY_DX5GCR_DXOEO_Msk (0x3ul << DDRPHY_DX5GCR_DXOEO_Pos) /*!< DDRPHY_T::DX5GCR: DXOEO Mask */ + +#define DDRPHY_DX5GCR_PLLRST_Pos (16) /*!< DDRPHY_T::DX5GCR: PLLRST Position */ +#define DDRPHY_DX5GCR_PLLRST_Msk (0x1ul << DDRPHY_DX5GCR_PLLRST_Pos) /*!< DDRPHY_T::DX5GCR: PLLRST Mask */ + +#define DDRPHY_DX5GCR_PLLPD_Pos (17) /*!< DDRPHY_T::DX5GCR: PLLPD Position */ +#define DDRPHY_DX5GCR_PLLPD_Msk (0x1ul << DDRPHY_DX5GCR_PLLPD_Pos) /*!< DDRPHY_T::DX5GCR: PLLPD Mask */ + +#define DDRPHY_DX5GCR_GSHIFT_Pos (18) /*!< DDRPHY_T::DX5GCR: GSHIFT Position */ +#define DDRPHY_DX5GCR_GSHIFT_Msk (0x1ul << DDRPHY_DX5GCR_GSHIFT_Pos) /*!< DDRPHY_T::DX5GCR: GSHIFT Mask */ + +#define DDRPHY_DX5GCR_PLLBYP_Pos (19) /*!< DDRPHY_T::DX5GCR: PLLBYP Position */ +#define DDRPHY_DX5GCR_PLLBYP_Msk (0x1ul << DDRPHY_DX5GCR_PLLBYP_Pos) /*!< DDRPHY_T::DX5GCR: PLLBYP Mask */ + +#define DDRPHY_DX5GCR_WLRKEN_Pos (26) /*!< DDRPHY_T::DX5GCR: WLRKEN Position */ +#define DDRPHY_DX5GCR_WLRKEN_Msk (0xful << DDRPHY_DX5GCR_WLRKEN_Pos) /*!< DDRPHY_T::DX5GCR: WLRKEN Mask */ + +#define DDRPHY_DX5GCR_MDLEN_Pos (30) /*!< DDRPHY_T::DX5GCR: MDLEN Position */ +#define DDRPHY_DX5GCR_MDLEN_Msk (0x1ul << DDRPHY_DX5GCR_MDLEN_Pos) /*!< DDRPHY_T::DX5GCR: MDLEN Mask */ + +#define DDRPHY_DX5GCR_CALBYP_Pos (31) /*!< DDRPHY_T::DX5GCR: CALBYP Position */ +#define DDRPHY_DX5GCR_CALBYP_Msk (0x1ul << DDRPHY_DX5GCR_CALBYP_Pos) /*!< DDRPHY_T::DX5GCR: CALBYP Mask */ + +#define DDRPHY_DX5GSR0_WDQCAL_Pos (0) /*!< DDRPHY_T::DX5GSR0: WDQCAL Position */ +#define DDRPHY_DX5GSR0_WDQCAL_Msk (0x1ul << DDRPHY_DX5GSR0_WDQCAL_Pos) /*!< DDRPHY_T::DX5GSR0: WDQCAL Mask */ + +#define DDRPHY_DX5GSR0_RDQSCAL_Pos (1) /*!< DDRPHY_T::DX5GSR0: RDQSCAL Position */ +#define DDRPHY_DX5GSR0_RDQSCAL_Msk (0x1ul << DDRPHY_DX5GSR0_RDQSCAL_Pos) /*!< DDRPHY_T::DX5GSR0: RDQSCAL Mask */ + +#define DDRPHY_DX5GSR0_RDQSNCAL_Pos (2) /*!< DDRPHY_T::DX5GSR0: RDQSNCAL Position */ +#define DDRPHY_DX5GSR0_RDQSNCAL_Msk (0x1ul << DDRPHY_DX5GSR0_RDQSNCAL_Pos) /*!< DDRPHY_T::DX5GSR0: RDQSNCAL Mask */ + +#define DDRPHY_DX5GSR0_GDQSCAL_Pos (3) /*!< DDRPHY_T::DX5GSR0: GDQSCAL Position */ +#define DDRPHY_DX5GSR0_GDQSCAL_Msk (0x1ul << DDRPHY_DX5GSR0_GDQSCAL_Pos) /*!< DDRPHY_T::DX5GSR0: GDQSCAL Mask */ + +#define DDRPHY_DX5GSR0_WLCAL_Pos (4) /*!< DDRPHY_T::DX5GSR0: WLCAL Position */ +#define DDRPHY_DX5GSR0_WLCAL_Msk (0x1ul << DDRPHY_DX5GSR0_WLCAL_Pos) /*!< DDRPHY_T::DX5GSR0: WLCAL Mask */ + +#define DDRPHY_DX5GSR0_WLDONE_Pos (5) /*!< DDRPHY_T::DX5GSR0: WLDONE Position */ +#define DDRPHY_DX5GSR0_WLDONE_Msk (0x1ul << DDRPHY_DX5GSR0_WLDONE_Pos) /*!< DDRPHY_T::DX5GSR0: WLDONE Mask */ + +#define DDRPHY_DX5GSR0_WLERR_Pos (6) /*!< DDRPHY_T::DX5GSR0: WLERR Position */ +#define DDRPHY_DX5GSR0_WLERR_Msk (0x1ul << DDRPHY_DX5GSR0_WLERR_Pos) /*!< DDRPHY_T::DX5GSR0: WLERR Mask */ + +#define DDRPHY_DX5GSR0_WLPRD_Pos (7) /*!< DDRPHY_T::DX5GSR0: WLPRD Position */ +#define DDRPHY_DX5GSR0_WLPRD_Msk (0xfful << DDRPHY_DX5GSR0_WLPRD_Pos) /*!< DDRPHY_T::DX5GSR0: WLPRD Mask */ + +#define DDRPHY_DX5GSR0_DPLOCK_Pos (15) /*!< DDRPHY_T::DX5GSR0: DPLOCK Position */ +#define DDRPHY_DX5GSR0_DPLOCK_Msk (0x1ul << DDRPHY_DX5GSR0_DPLOCK_Pos) /*!< DDRPHY_T::DX5GSR0: DPLOCK Mask */ + +#define DDRPHY_DX5GSR0_GDQSPRD_Pos (16) /*!< DDRPHY_T::DX5GSR0: GDQSPRD Position */ +#define DDRPHY_DX5GSR0_GDQSPRD_Msk (0xfful << DDRPHY_DX5GSR0_GDQSPRD_Pos) /*!< DDRPHY_T::DX5GSR0: GDQSPRD Mask */ + +#define DDRPHY_DX5GSR0_QSGERR_Pos (24) /*!< DDRPHY_T::DX5GSR0: QSGERR Position */ +#define DDRPHY_DX5GSR0_QSGERR_Msk (0xful << DDRPHY_DX5GSR0_QSGERR_Pos) /*!< DDRPHY_T::DX5GSR0: QSGERR Mask */ + +#define DDRPHY_DX5GSR0_WLDQ_Pos (28) /*!< DDRPHY_T::DX5GSR0: WLDQ Position */ +#define DDRPHY_DX5GSR0_WLDQ_Msk (0x1ul << DDRPHY_DX5GSR0_WLDQ_Pos) /*!< DDRPHY_T::DX5GSR0: WLDQ Mask */ + +#define DDRPHY_DX5GSR1_DLTDONE_Pos (0) /*!< DDRPHY_T::DX5GSR1: DLTDONE Position */ +#define DDRPHY_DX5GSR1_DLTDONE_Msk (0x1ul << DDRPHY_DX5GSR1_DLTDONE_Pos) /*!< DDRPHY_T::DX5GSR1: DLTDONE Mask */ + +#define DDRPHY_DX5GSR1_DLTCODE_Pos (1) /*!< DDRPHY_T::DX5GSR1: DLTCODE Position */ +#define DDRPHY_DX5GSR1_DLTCODE_Msk (0xfffffful << DDRPHY_DX5GSR1_DLTCODE_Pos) /*!< DDRPHY_T::DX5GSR1: DLTCODE Mask */ + +#define DDRPHY_DX5BDLR0_DQ0WBD_Pos (0) /*!< DDRPHY_T::DX5BDLR0: DQ0WBD Position */ +#define DDRPHY_DX5BDLR0_DQ0WBD_Msk (0x3ful << DDRPHY_DX5BDLR0_DQ0WBD_Pos) /*!< DDRPHY_T::DX5BDLR0: DQ0WBD Mask */ + +#define DDRPHY_DX5BDLR0_DQ1WBD_Pos (6) /*!< DDRPHY_T::DX5BDLR0: DQ1WBD Position */ +#define DDRPHY_DX5BDLR0_DQ1WBD_Msk (0x3ful << DDRPHY_DX5BDLR0_DQ1WBD_Pos) /*!< DDRPHY_T::DX5BDLR0: DQ1WBD Mask */ + +#define DDRPHY_DX5BDLR0_DQ2WBD_Pos (12) /*!< DDRPHY_T::DX5BDLR0: DQ2WBD Position */ +#define DDRPHY_DX5BDLR0_DQ2WBD_Msk (0x3ful << DDRPHY_DX5BDLR0_DQ2WBD_Pos) /*!< DDRPHY_T::DX5BDLR0: DQ2WBD Mask */ + +#define DDRPHY_DX5BDLR0_DQ3WBD_Pos (18) /*!< DDRPHY_T::DX5BDLR0: DQ3WBD Position */ +#define DDRPHY_DX5BDLR0_DQ3WBD_Msk (0x3ful << DDRPHY_DX5BDLR0_DQ3WBD_Pos) /*!< DDRPHY_T::DX5BDLR0: DQ3WBD Mask */ + +#define DDRPHY_DX5BDLR0_DQ4WBD_Pos (24) /*!< DDRPHY_T::DX5BDLR0: DQ4WBD Position */ +#define DDRPHY_DX5BDLR0_DQ4WBD_Msk (0x3ful << DDRPHY_DX5BDLR0_DQ4WBD_Pos) /*!< DDRPHY_T::DX5BDLR0: DQ4WBD Mask */ + +#define DDRPHY_DX5BDLR1_DQ5WBD_Pos (0) /*!< DDRPHY_T::DX5BDLR1: DQ5WBD Position */ +#define DDRPHY_DX5BDLR1_DQ5WBD_Msk (0x3ful << DDRPHY_DX5BDLR1_DQ5WBD_Pos) /*!< DDRPHY_T::DX5BDLR1: DQ5WBD Mask */ + +#define DDRPHY_DX5BDLR1_DQ6WBD_Pos (6) /*!< DDRPHY_T::DX5BDLR1: DQ6WBD Position */ +#define DDRPHY_DX5BDLR1_DQ6WBD_Msk (0x3ful << DDRPHY_DX5BDLR1_DQ6WBD_Pos) /*!< DDRPHY_T::DX5BDLR1: DQ6WBD Mask */ + +#define DDRPHY_DX5BDLR1_DQ7WBD_Pos (12) /*!< DDRPHY_T::DX5BDLR1: DQ7WBD Position */ +#define DDRPHY_DX5BDLR1_DQ7WBD_Msk (0x3ful << DDRPHY_DX5BDLR1_DQ7WBD_Pos) /*!< DDRPHY_T::DX5BDLR1: DQ7WBD Mask */ + +#define DDRPHY_DX5BDLR1_DMWBD_Pos (18) /*!< DDRPHY_T::DX5BDLR1: DMWBD Position */ +#define DDRPHY_DX5BDLR1_DMWBD_Msk (0x3ful << DDRPHY_DX5BDLR1_DMWBD_Pos) /*!< DDRPHY_T::DX5BDLR1: DMWBD Mask */ + +#define DDRPHY_DX5BDLR1_DSWBD_Pos (24) /*!< DDRPHY_T::DX5BDLR1: DSWBD Position */ +#define DDRPHY_DX5BDLR1_DSWBD_Msk (0x3ful << DDRPHY_DX5BDLR1_DSWBD_Pos) /*!< DDRPHY_T::DX5BDLR1: DSWBD Mask */ + +#define DDRPHY_DX5BDLR2_DSOEBD_Pos (0) /*!< DDRPHY_T::DX5BDLR2: DSOEBD Position */ +#define DDRPHY_DX5BDLR2_DSOEBD_Msk (0x3ful << DDRPHY_DX5BDLR2_DSOEBD_Pos) /*!< DDRPHY_T::DX5BDLR2: DSOEBD Mask */ + +#define DDRPHY_DX5BDLR2_DQOEBD_Pos (6) /*!< DDRPHY_T::DX5BDLR2: DQOEBD Position */ +#define DDRPHY_DX5BDLR2_DQOEBD_Msk (0x3ful << DDRPHY_DX5BDLR2_DQOEBD_Pos) /*!< DDRPHY_T::DX5BDLR2: DQOEBD Mask */ + +#define DDRPHY_DX5BDLR2_DSRBD_Pos (12) /*!< DDRPHY_T::DX5BDLR2: DSRBD Position */ +#define DDRPHY_DX5BDLR2_DSRBD_Msk (0x3ful << DDRPHY_DX5BDLR2_DSRBD_Pos) /*!< DDRPHY_T::DX5BDLR2: DSRBD Mask */ + +#define DDRPHY_DX5BDLR2_DSNRBD_Pos (18) /*!< DDRPHY_T::DX5BDLR2: DSNRBD Position */ +#define DDRPHY_DX5BDLR2_DSNRBD_Msk (0x3ful << DDRPHY_DX5BDLR2_DSNRBD_Pos) /*!< DDRPHY_T::DX5BDLR2: DSNRBD Mask */ + +#define DDRPHY_DX5BDLR3_DQ0RBD_Pos (0) /*!< DDRPHY_T::DX5BDLR3: DQ0RBD Position */ +#define DDRPHY_DX5BDLR3_DQ0RBD_Msk (0x3ful << DDRPHY_DX5BDLR3_DQ0RBD_Pos) /*!< DDRPHY_T::DX5BDLR3: DQ0RBD Mask */ + +#define DDRPHY_DX5BDLR3_DQ1RBD_Pos (6) /*!< DDRPHY_T::DX5BDLR3: DQ1RBD Position */ +#define DDRPHY_DX5BDLR3_DQ1RBD_Msk (0x3ful << DDRPHY_DX5BDLR3_DQ1RBD_Pos) /*!< DDRPHY_T::DX5BDLR3: DQ1RBD Mask */ + +#define DDRPHY_DX5BDLR3_DQ2RBD_Pos (12) /*!< DDRPHY_T::DX5BDLR3: DQ2RBD Position */ +#define DDRPHY_DX5BDLR3_DQ2RBD_Msk (0x3ful << DDRPHY_DX5BDLR3_DQ2RBD_Pos) /*!< DDRPHY_T::DX5BDLR3: DQ2RBD Mask */ + +#define DDRPHY_DX5BDLR3_DQ3RBD_Pos (18) /*!< DDRPHY_T::DX5BDLR3: DQ3RBD Position */ +#define DDRPHY_DX5BDLR3_DQ3RBD_Msk (0x3ful << DDRPHY_DX5BDLR3_DQ3RBD_Pos) /*!< DDRPHY_T::DX5BDLR3: DQ3RBD Mask */ + +#define DDRPHY_DX5BDLR3_DQ4RBD_Pos (24) /*!< DDRPHY_T::DX5BDLR3: DQ4RBD Position */ +#define DDRPHY_DX5BDLR3_DQ4RBD_Msk (0x3ful << DDRPHY_DX5BDLR3_DQ4RBD_Pos) /*!< DDRPHY_T::DX5BDLR3: DQ4RBD Mask */ + +#define DDRPHY_DX5BDLR4_DQ5RBD_Pos (0) /*!< DDRPHY_T::DX5BDLR4: DQ5RBD Position */ +#define DDRPHY_DX5BDLR4_DQ5RBD_Msk (0x3ful << DDRPHY_DX5BDLR4_DQ5RBD_Pos) /*!< DDRPHY_T::DX5BDLR4: DQ5RBD Mask */ + +#define DDRPHY_DX5BDLR4_DQ6RBD_Pos (6) /*!< DDRPHY_T::DX5BDLR4: DQ6RBD Position */ +#define DDRPHY_DX5BDLR4_DQ6RBD_Msk (0x3ful << DDRPHY_DX5BDLR4_DQ6RBD_Pos) /*!< DDRPHY_T::DX5BDLR4: DQ6RBD Mask */ + +#define DDRPHY_DX5BDLR4_DQ7RBD_Pos (12) /*!< DDRPHY_T::DX5BDLR4: DQ7RBD Position */ +#define DDRPHY_DX5BDLR4_DQ7RBD_Msk (0x3ful << DDRPHY_DX5BDLR4_DQ7RBD_Pos) /*!< DDRPHY_T::DX5BDLR4: DQ7RBD Mask */ + +#define DDRPHY_DX5BDLR4_DMRBD_Pos (18) /*!< DDRPHY_T::DX5BDLR4: DMRBD Position */ +#define DDRPHY_DX5BDLR4_DMRBD_Msk (0x3ful << DDRPHY_DX5BDLR4_DMRBD_Pos) /*!< DDRPHY_T::DX5BDLR4: DMRBD Mask */ + +#define DDRPHY_DX5LCDLR0_R0WLD_Pos (0) /*!< DDRPHY_T::DX5LCDLR0: R0WLD Position */ +#define DDRPHY_DX5LCDLR0_R0WLD_Msk (0xfful << DDRPHY_DX5LCDLR0_R0WLD_Pos) /*!< DDRPHY_T::DX5LCDLR0: R0WLD Mask */ + +#define DDRPHY_DX5LCDLR0_R1WLD_Pos (8) /*!< DDRPHY_T::DX5LCDLR0: R1WLD Position */ +#define DDRPHY_DX5LCDLR0_R1WLD_Msk (0xfful << DDRPHY_DX5LCDLR0_R1WLD_Pos) /*!< DDRPHY_T::DX5LCDLR0: R1WLD Mask */ + +#define DDRPHY_DX5LCDLR0_R2WLD_Pos (16) /*!< DDRPHY_T::DX5LCDLR0: R2WLD Position */ +#define DDRPHY_DX5LCDLR0_R2WLD_Msk (0xfful << DDRPHY_DX5LCDLR0_R2WLD_Pos) /*!< DDRPHY_T::DX5LCDLR0: R2WLD Mask */ + +#define DDRPHY_DX5LCDLR0_R3WLD_Pos (24) /*!< DDRPHY_T::DX5LCDLR0: R3WLD Position */ +#define DDRPHY_DX5LCDLR0_R3WLD_Msk (0xfful << DDRPHY_DX5LCDLR0_R3WLD_Pos) /*!< DDRPHY_T::DX5LCDLR0: R3WLD Mask */ + +#define DDRPHY_DX5LCDLR1_WDQD_Pos (0) /*!< DDRPHY_T::DX5LCDLR1: WDQD Position */ +#define DDRPHY_DX5LCDLR1_WDQD_Msk (0xfful << DDRPHY_DX5LCDLR1_WDQD_Pos) /*!< DDRPHY_T::DX5LCDLR1: WDQD Mask */ + +#define DDRPHY_DX5LCDLR1_RDQSD_Pos (8) /*!< DDRPHY_T::DX5LCDLR1: RDQSD Position */ +#define DDRPHY_DX5LCDLR1_RDQSD_Msk (0xfful << DDRPHY_DX5LCDLR1_RDQSD_Pos) /*!< DDRPHY_T::DX5LCDLR1: RDQSD Mask */ + +#define DDRPHY_DX5LCDLR1_RDQSND_Pos (16) /*!< DDRPHY_T::DX5LCDLR1: RDQSND Position */ +#define DDRPHY_DX5LCDLR1_RDQSND_Msk (0xfful << DDRPHY_DX5LCDLR1_RDQSND_Pos) /*!< DDRPHY_T::DX5LCDLR1: RDQSND Mask */ + +#define DDRPHY_DX5LCDLR2_R0DQSGD_Pos (0) /*!< DDRPHY_T::DX5LCDLR2: R0DQSGD Position */ +#define DDRPHY_DX5LCDLR2_R0DQSGD_Msk (0xfful << DDRPHY_DX5LCDLR2_R0DQSGD_Pos) /*!< DDRPHY_T::DX5LCDLR2: R0DQSGD Mask */ + +#define DDRPHY_DX5LCDLR2_R1DQSGD_Pos (8) /*!< DDRPHY_T::DX5LCDLR2: R1DQSGD Position */ +#define DDRPHY_DX5LCDLR2_R1DQSGD_Msk (0xfful << DDRPHY_DX5LCDLR2_R1DQSGD_Pos) /*!< DDRPHY_T::DX5LCDLR2: R1DQSGD Mask */ + +#define DDRPHY_DX5LCDLR2_R2DQSGD_Pos (16) /*!< DDRPHY_T::DX5LCDLR2: R2DQSGD Position */ +#define DDRPHY_DX5LCDLR2_R2DQSGD_Msk (0xfful << DDRPHY_DX5LCDLR2_R2DQSGD_Pos) /*!< DDRPHY_T::DX5LCDLR2: R2DQSGD Mask */ + +#define DDRPHY_DX5LCDLR2_R3DQSGD_Pos (24) /*!< DDRPHY_T::DX5LCDLR2: R3DQSGD Position */ +#define DDRPHY_DX5LCDLR2_R3DQSGD_Msk (0xfful << DDRPHY_DX5LCDLR2_R3DQSGD_Pos) /*!< DDRPHY_T::DX5LCDLR2: R3DQSGD Mask */ + +#define DDRPHY_DX5MDLR_IPRD_Pos (0) /*!< DDRPHY_T::DX5MDLR: IPRD Position */ +#define DDRPHY_DX5MDLR_IPRD_Msk (0xfful << DDRPHY_DX5MDLR_IPRD_Pos) /*!< DDRPHY_T::DX5MDLR: IPRD Mask */ + +#define DDRPHY_DX5MDLR_TPRD_Pos (8) /*!< DDRPHY_T::DX5MDLR: TPRD Position */ +#define DDRPHY_DX5MDLR_TPRD_Msk (0xfful << DDRPHY_DX5MDLR_TPRD_Pos) /*!< DDRPHY_T::DX5MDLR: TPRD Mask */ + +#define DDRPHY_DX5MDLR_MDLD_Pos (16) /*!< DDRPHY_T::DX5MDLR: MDLD Position */ +#define DDRPHY_DX5MDLR_MDLD_Msk (0xfful << DDRPHY_DX5MDLR_MDLD_Pos) /*!< DDRPHY_T::DX5MDLR: MDLD Mask */ + +#define DDRPHY_DX5GTR_R0DGSL_Pos (0) /*!< DDRPHY_T::DX5GTR: R0DGSL Position */ +#define DDRPHY_DX5GTR_R0DGSL_Msk (0x7ul << DDRPHY_DX5GTR_R0DGSL_Pos) /*!< DDRPHY_T::DX5GTR: R0DGSL Mask */ + +#define DDRPHY_DX5GTR_R1DGSL_Pos (3) /*!< DDRPHY_T::DX5GTR: R1DGSL Position */ +#define DDRPHY_DX5GTR_R1DGSL_Msk (0x7ul << DDRPHY_DX5GTR_R1DGSL_Pos) /*!< DDRPHY_T::DX5GTR: R1DGSL Mask */ + +#define DDRPHY_DX5GTR_R2DGSL_Pos (6) /*!< DDRPHY_T::DX5GTR: R2DGSL Position */ +#define DDRPHY_DX5GTR_R2DGSL_Msk (0x7ul << DDRPHY_DX5GTR_R2DGSL_Pos) /*!< DDRPHY_T::DX5GTR: R2DGSL Mask */ + +#define DDRPHY_DX5GTR_R3DGSL_Pos (9) /*!< DDRPHY_T::DX5GTR: R3DGSL Position */ +#define DDRPHY_DX5GTR_R3DGSL_Msk (0x7ul << DDRPHY_DX5GTR_R3DGSL_Pos) /*!< DDRPHY_T::DX5GTR: R3DGSL Mask */ + +#define DDRPHY_DX5GTR_R0WLSL_Pos (12) /*!< DDRPHY_T::DX5GTR: R0WLSL Position */ +#define DDRPHY_DX5GTR_R0WLSL_Msk (0x3ul << DDRPHY_DX5GTR_R0WLSL_Pos) /*!< DDRPHY_T::DX5GTR: R0WLSL Mask */ + +#define DDRPHY_DX5GTR_R1WLSL_Pos (14) /*!< DDRPHY_T::DX5GTR: R1WLSL Position */ +#define DDRPHY_DX5GTR_R1WLSL_Msk (0x3ul << DDRPHY_DX5GTR_R1WLSL_Pos) /*!< DDRPHY_T::DX5GTR: R1WLSL Mask */ + +#define DDRPHY_DX5GTR_R2WLSL_Pos (16) /*!< DDRPHY_T::DX5GTR: R2WLSL Position */ +#define DDRPHY_DX5GTR_R2WLSL_Msk (0x3ul << DDRPHY_DX5GTR_R2WLSL_Pos) /*!< DDRPHY_T::DX5GTR: R2WLSL Mask */ + +#define DDRPHY_DX5GTR_R3WLSL_Pos (18) /*!< DDRPHY_T::DX5GTR: R3WLSL Position */ +#define DDRPHY_DX5GTR_R3WLSL_Msk (0x3ul << DDRPHY_DX5GTR_R3WLSL_Pos) /*!< DDRPHY_T::DX5GTR: R3WLSL Mask */ + +#define DDRPHY_DX5GSR2_RDERR_Pos (0) /*!< DDRPHY_T::DX5GSR2: RDERR Position */ +#define DDRPHY_DX5GSR2_RDERR_Msk (0x1ul << DDRPHY_DX5GSR2_RDERR_Pos) /*!< DDRPHY_T::DX5GSR2: RDERR Mask */ + +#define DDRPHY_DX5GSR2_RDWN_Pos (1) /*!< DDRPHY_T::DX5GSR2: RDWN Position */ +#define DDRPHY_DX5GSR2_RDWN_Msk (0x1ul << DDRPHY_DX5GSR2_RDWN_Pos) /*!< DDRPHY_T::DX5GSR2: RDWN Mask */ + +#define DDRPHY_DX5GSR2_WDERR_Pos (2) /*!< DDRPHY_T::DX5GSR2: WDERR Position */ +#define DDRPHY_DX5GSR2_WDERR_Msk (0x1ul << DDRPHY_DX5GSR2_WDERR_Pos) /*!< DDRPHY_T::DX5GSR2: WDERR Mask */ + +#define DDRPHY_DX5GSR2_WDWN_Pos (3) /*!< DDRPHY_T::DX5GSR2: WDWN Position */ +#define DDRPHY_DX5GSR2_WDWN_Msk (0x1ul << DDRPHY_DX5GSR2_WDWN_Pos) /*!< DDRPHY_T::DX5GSR2: WDWN Mask */ + +#define DDRPHY_DX5GSR2_REERR_Pos (4) /*!< DDRPHY_T::DX5GSR2: REERR Position */ +#define DDRPHY_DX5GSR2_REERR_Msk (0x1ul << DDRPHY_DX5GSR2_REERR_Pos) /*!< DDRPHY_T::DX5GSR2: REERR Mask */ + +#define DDRPHY_DX5GSR2_REWN_Pos (5) /*!< DDRPHY_T::DX5GSR2: REWN Position */ +#define DDRPHY_DX5GSR2_REWN_Msk (0x1ul << DDRPHY_DX5GSR2_REWN_Pos) /*!< DDRPHY_T::DX5GSR2: REWN Mask */ + +#define DDRPHY_DX5GSR2_WEERR_Pos (6) /*!< DDRPHY_T::DX5GSR2: WEERR Position */ +#define DDRPHY_DX5GSR2_WEERR_Msk (0x1ul << DDRPHY_DX5GSR2_WEERR_Pos) /*!< DDRPHY_T::DX5GSR2: WEERR Mask */ + +#define DDRPHY_DX5GSR2_WEWN_Pos (7) /*!< DDRPHY_T::DX5GSR2: WEWN Position */ +#define DDRPHY_DX5GSR2_WEWN_Msk (0x1ul << DDRPHY_DX5GSR2_WEWN_Pos) /*!< DDRPHY_T::DX5GSR2: WEWN Mask */ + +#define DDRPHY_DX5GSR2_ESTAT_Pos (8) /*!< DDRPHY_T::DX5GSR2: ESTAT Position */ +#define DDRPHY_DX5GSR2_ESTAT_Msk (0xful << DDRPHY_DX5GSR2_ESTAT_Pos) /*!< DDRPHY_T::DX5GSR2: ESTAT Mask */ + +#define DDRPHY_DX6GCR_DXEN_Pos (0) /*!< DDRPHY_T::DX6GCR: DXEN Position */ +#define DDRPHY_DX6GCR_DXEN_Msk (0x1ul << DDRPHY_DX6GCR_DXEN_Pos) /*!< DDRPHY_T::DX6GCR: DXEN Mask */ + +#define DDRPHY_DX6GCR_DQSODT_Pos (1) /*!< DDRPHY_T::DX6GCR: DQSODT Position */ +#define DDRPHY_DX6GCR_DQSODT_Msk (0x1ul << DDRPHY_DX6GCR_DQSODT_Pos) /*!< DDRPHY_T::DX6GCR: DQSODT Mask */ + +#define DDRPHY_DX6GCR_DQODT_Pos (2) /*!< DDRPHY_T::DX6GCR: DQODT Position */ +#define DDRPHY_DX6GCR_DQODT_Msk (0x1ul << DDRPHY_DX6GCR_DQODT_Pos) /*!< DDRPHY_T::DX6GCR: DQODT Mask */ + +#define DDRPHY_DX6GCR_DXIOM_Pos (3) /*!< DDRPHY_T::DX6GCR: DXIOM Position */ +#define DDRPHY_DX6GCR_DXIOM_Msk (0x1ul << DDRPHY_DX6GCR_DXIOM_Pos) /*!< DDRPHY_T::DX6GCR: DXIOM Mask */ + +#define DDRPHY_DX6GCR_DXPDD_Pos (4) /*!< DDRPHY_T::DX6GCR: DXPDD Position */ +#define DDRPHY_DX6GCR_DXPDD_Msk (0x1ul << DDRPHY_DX6GCR_DXPDD_Pos) /*!< DDRPHY_T::DX6GCR: DXPDD Mask */ + +#define DDRPHY_DX6GCR_DXPDR_Pos (5) /*!< DDRPHY_T::DX6GCR: DXPDR Position */ +#define DDRPHY_DX6GCR_DXPDR_Msk (0x1ul << DDRPHY_DX6GCR_DXPDR_Pos) /*!< DDRPHY_T::DX6GCR: DXPDR Mask */ + +#define DDRPHY_DX6GCR_DQSRPD_Pos (6) /*!< DDRPHY_T::DX6GCR: DQSRPD Position */ +#define DDRPHY_DX6GCR_DQSRPD_Msk (0x1ul << DDRPHY_DX6GCR_DQSRPD_Pos) /*!< DDRPHY_T::DX6GCR: DQSRPD Mask */ + +#define DDRPHY_DX6GCR_DSEN_Pos (7) /*!< DDRPHY_T::DX6GCR: DSEN Position */ +#define DDRPHY_DX6GCR_DSEN_Msk (0x3ul << DDRPHY_DX6GCR_DSEN_Pos) /*!< DDRPHY_T::DX6GCR: DSEN Mask */ + +#define DDRPHY_DX6GCR_DQSRTT_Pos (9) /*!< DDRPHY_T::DX6GCR: DQSRTT Position */ +#define DDRPHY_DX6GCR_DQSRTT_Msk (0x1ul << DDRPHY_DX6GCR_DQSRTT_Pos) /*!< DDRPHY_T::DX6GCR: DQSRTT Mask */ + +#define DDRPHY_DX6GCR_DQRTT_Pos (10) /*!< DDRPHY_T::DX6GCR: DQRTT Position */ +#define DDRPHY_DX6GCR_DQRTT_Msk (0x1ul << DDRPHY_DX6GCR_DQRTT_Pos) /*!< DDRPHY_T::DX6GCR: DQRTT Mask */ + +#define DDRPHY_DX6GCR_RTTOH_Pos (11) /*!< DDRPHY_T::DX6GCR: RTTOH Position */ +#define DDRPHY_DX6GCR_RTTOH_Msk (0x3ul << DDRPHY_DX6GCR_RTTOH_Pos) /*!< DDRPHY_T::DX6GCR: RTTOH Mask */ + +#define DDRPHY_DX6GCR_RTTOAL_Pos (13) /*!< DDRPHY_T::DX6GCR: RTTOAL Position */ +#define DDRPHY_DX6GCR_RTTOAL_Msk (0x1ul << DDRPHY_DX6GCR_RTTOAL_Pos) /*!< DDRPHY_T::DX6GCR: RTTOAL Mask */ + +#define DDRPHY_DX6GCR_DXOEO_Pos (14) /*!< DDRPHY_T::DX6GCR: DXOEO Position */ +#define DDRPHY_DX6GCR_DXOEO_Msk (0x3ul << DDRPHY_DX6GCR_DXOEO_Pos) /*!< DDRPHY_T::DX6GCR: DXOEO Mask */ + +#define DDRPHY_DX6GCR_PLLRST_Pos (16) /*!< DDRPHY_T::DX6GCR: PLLRST Position */ +#define DDRPHY_DX6GCR_PLLRST_Msk (0x1ul << DDRPHY_DX6GCR_PLLRST_Pos) /*!< DDRPHY_T::DX6GCR: PLLRST Mask */ + +#define DDRPHY_DX6GCR_PLLPD_Pos (17) /*!< DDRPHY_T::DX6GCR: PLLPD Position */ +#define DDRPHY_DX6GCR_PLLPD_Msk (0x1ul << DDRPHY_DX6GCR_PLLPD_Pos) /*!< DDRPHY_T::DX6GCR: PLLPD Mask */ + +#define DDRPHY_DX6GCR_GSHIFT_Pos (18) /*!< DDRPHY_T::DX6GCR: GSHIFT Position */ +#define DDRPHY_DX6GCR_GSHIFT_Msk (0x1ul << DDRPHY_DX6GCR_GSHIFT_Pos) /*!< DDRPHY_T::DX6GCR: GSHIFT Mask */ + +#define DDRPHY_DX6GCR_PLLBYP_Pos (19) /*!< DDRPHY_T::DX6GCR: PLLBYP Position */ +#define DDRPHY_DX6GCR_PLLBYP_Msk (0x1ul << DDRPHY_DX6GCR_PLLBYP_Pos) /*!< DDRPHY_T::DX6GCR: PLLBYP Mask */ + +#define DDRPHY_DX6GCR_WLRKEN_Pos (26) /*!< DDRPHY_T::DX6GCR: WLRKEN Position */ +#define DDRPHY_DX6GCR_WLRKEN_Msk (0xful << DDRPHY_DX6GCR_WLRKEN_Pos) /*!< DDRPHY_T::DX6GCR: WLRKEN Mask */ + +#define DDRPHY_DX6GCR_MDLEN_Pos (30) /*!< DDRPHY_T::DX6GCR: MDLEN Position */ +#define DDRPHY_DX6GCR_MDLEN_Msk (0x1ul << DDRPHY_DX6GCR_MDLEN_Pos) /*!< DDRPHY_T::DX6GCR: MDLEN Mask */ + +#define DDRPHY_DX6GCR_CALBYP_Pos (31) /*!< DDRPHY_T::DX6GCR: CALBYP Position */ +#define DDRPHY_DX6GCR_CALBYP_Msk (0x1ul << DDRPHY_DX6GCR_CALBYP_Pos) /*!< DDRPHY_T::DX6GCR: CALBYP Mask */ + +#define DDRPHY_DX6GSR0_WDQCAL_Pos (0) /*!< DDRPHY_T::DX6GSR0: WDQCAL Position */ +#define DDRPHY_DX6GSR0_WDQCAL_Msk (0x1ul << DDRPHY_DX6GSR0_WDQCAL_Pos) /*!< DDRPHY_T::DX6GSR0: WDQCAL Mask */ + +#define DDRPHY_DX6GSR0_RDQSCAL_Pos (1) /*!< DDRPHY_T::DX6GSR0: RDQSCAL Position */ +#define DDRPHY_DX6GSR0_RDQSCAL_Msk (0x1ul << DDRPHY_DX6GSR0_RDQSCAL_Pos) /*!< DDRPHY_T::DX6GSR0: RDQSCAL Mask */ + +#define DDRPHY_DX6GSR0_RDQSNCAL_Pos (2) /*!< DDRPHY_T::DX6GSR0: RDQSNCAL Position */ +#define DDRPHY_DX6GSR0_RDQSNCAL_Msk (0x1ul << DDRPHY_DX6GSR0_RDQSNCAL_Pos) /*!< DDRPHY_T::DX6GSR0: RDQSNCAL Mask */ + +#define DDRPHY_DX6GSR0_GDQSCAL_Pos (3) /*!< DDRPHY_T::DX6GSR0: GDQSCAL Position */ +#define DDRPHY_DX6GSR0_GDQSCAL_Msk (0x1ul << DDRPHY_DX6GSR0_GDQSCAL_Pos) /*!< DDRPHY_T::DX6GSR0: GDQSCAL Mask */ + +#define DDRPHY_DX6GSR0_WLCAL_Pos (4) /*!< DDRPHY_T::DX6GSR0: WLCAL Position */ +#define DDRPHY_DX6GSR0_WLCAL_Msk (0x1ul << DDRPHY_DX6GSR0_WLCAL_Pos) /*!< DDRPHY_T::DX6GSR0: WLCAL Mask */ + +#define DDRPHY_DX6GSR0_WLDONE_Pos (5) /*!< DDRPHY_T::DX6GSR0: WLDONE Position */ +#define DDRPHY_DX6GSR0_WLDONE_Msk (0x1ul << DDRPHY_DX6GSR0_WLDONE_Pos) /*!< DDRPHY_T::DX6GSR0: WLDONE Mask */ + +#define DDRPHY_DX6GSR0_WLERR_Pos (6) /*!< DDRPHY_T::DX6GSR0: WLERR Position */ +#define DDRPHY_DX6GSR0_WLERR_Msk (0x1ul << DDRPHY_DX6GSR0_WLERR_Pos) /*!< DDRPHY_T::DX6GSR0: WLERR Mask */ + +#define DDRPHY_DX6GSR0_WLPRD_Pos (7) /*!< DDRPHY_T::DX6GSR0: WLPRD Position */ +#define DDRPHY_DX6GSR0_WLPRD_Msk (0xfful << DDRPHY_DX6GSR0_WLPRD_Pos) /*!< DDRPHY_T::DX6GSR0: WLPRD Mask */ + +#define DDRPHY_DX6GSR0_DPLOCK_Pos (15) /*!< DDRPHY_T::DX6GSR0: DPLOCK Position */ +#define DDRPHY_DX6GSR0_DPLOCK_Msk (0x1ul << DDRPHY_DX6GSR0_DPLOCK_Pos) /*!< DDRPHY_T::DX6GSR0: DPLOCK Mask */ + +#define DDRPHY_DX6GSR0_GDQSPRD_Pos (16) /*!< DDRPHY_T::DX6GSR0: GDQSPRD Position */ +#define DDRPHY_DX6GSR0_GDQSPRD_Msk (0xfful << DDRPHY_DX6GSR0_GDQSPRD_Pos) /*!< DDRPHY_T::DX6GSR0: GDQSPRD Mask */ + +#define DDRPHY_DX6GSR0_QSGERR_Pos (24) /*!< DDRPHY_T::DX6GSR0: QSGERR Position */ +#define DDRPHY_DX6GSR0_QSGERR_Msk (0xful << DDRPHY_DX6GSR0_QSGERR_Pos) /*!< DDRPHY_T::DX6GSR0: QSGERR Mask */ + +#define DDRPHY_DX6GSR0_WLDQ_Pos (28) /*!< DDRPHY_T::DX6GSR0: WLDQ Position */ +#define DDRPHY_DX6GSR0_WLDQ_Msk (0x1ul << DDRPHY_DX6GSR0_WLDQ_Pos) /*!< DDRPHY_T::DX6GSR0: WLDQ Mask */ + +#define DDRPHY_DX6GSR1_DLTDONE_Pos (0) /*!< DDRPHY_T::DX6GSR1: DLTDONE Position */ +#define DDRPHY_DX6GSR1_DLTDONE_Msk (0x1ul << DDRPHY_DX6GSR1_DLTDONE_Pos) /*!< DDRPHY_T::DX6GSR1: DLTDONE Mask */ + +#define DDRPHY_DX6GSR1_DLTCODE_Pos (1) /*!< DDRPHY_T::DX6GSR1: DLTCODE Position */ +#define DDRPHY_DX6GSR1_DLTCODE_Msk (0xfffffful << DDRPHY_DX6GSR1_DLTCODE_Pos) /*!< DDRPHY_T::DX6GSR1: DLTCODE Mask */ + +#define DDRPHY_DX6BDLR0_DQ0WBD_Pos (0) /*!< DDRPHY_T::DX6BDLR0: DQ0WBD Position */ +#define DDRPHY_DX6BDLR0_DQ0WBD_Msk (0x3ful << DDRPHY_DX6BDLR0_DQ0WBD_Pos) /*!< DDRPHY_T::DX6BDLR0: DQ0WBD Mask */ + +#define DDRPHY_DX6BDLR0_DQ1WBD_Pos (6) /*!< DDRPHY_T::DX6BDLR0: DQ1WBD Position */ +#define DDRPHY_DX6BDLR0_DQ1WBD_Msk (0x3ful << DDRPHY_DX6BDLR0_DQ1WBD_Pos) /*!< DDRPHY_T::DX6BDLR0: DQ1WBD Mask */ + +#define DDRPHY_DX6BDLR0_DQ2WBD_Pos (12) /*!< DDRPHY_T::DX6BDLR0: DQ2WBD Position */ +#define DDRPHY_DX6BDLR0_DQ2WBD_Msk (0x3ful << DDRPHY_DX6BDLR0_DQ2WBD_Pos) /*!< DDRPHY_T::DX6BDLR0: DQ2WBD Mask */ + +#define DDRPHY_DX6BDLR0_DQ3WBD_Pos (18) /*!< DDRPHY_T::DX6BDLR0: DQ3WBD Position */ +#define DDRPHY_DX6BDLR0_DQ3WBD_Msk (0x3ful << DDRPHY_DX6BDLR0_DQ3WBD_Pos) /*!< DDRPHY_T::DX6BDLR0: DQ3WBD Mask */ + +#define DDRPHY_DX6BDLR0_DQ4WBD_Pos (24) /*!< DDRPHY_T::DX6BDLR0: DQ4WBD Position */ +#define DDRPHY_DX6BDLR0_DQ4WBD_Msk (0x3ful << DDRPHY_DX6BDLR0_DQ4WBD_Pos) /*!< DDRPHY_T::DX6BDLR0: DQ4WBD Mask */ + +#define DDRPHY_DX6BDLR1_DQ5WBD_Pos (0) /*!< DDRPHY_T::DX6BDLR1: DQ5WBD Position */ +#define DDRPHY_DX6BDLR1_DQ5WBD_Msk (0x3ful << DDRPHY_DX6BDLR1_DQ5WBD_Pos) /*!< DDRPHY_T::DX6BDLR1: DQ5WBD Mask */ + +#define DDRPHY_DX6BDLR1_DQ6WBD_Pos (6) /*!< DDRPHY_T::DX6BDLR1: DQ6WBD Position */ +#define DDRPHY_DX6BDLR1_DQ6WBD_Msk (0x3ful << DDRPHY_DX6BDLR1_DQ6WBD_Pos) /*!< DDRPHY_T::DX6BDLR1: DQ6WBD Mask */ + +#define DDRPHY_DX6BDLR1_DQ7WBD_Pos (12) /*!< DDRPHY_T::DX6BDLR1: DQ7WBD Position */ +#define DDRPHY_DX6BDLR1_DQ7WBD_Msk (0x3ful << DDRPHY_DX6BDLR1_DQ7WBD_Pos) /*!< DDRPHY_T::DX6BDLR1: DQ7WBD Mask */ + +#define DDRPHY_DX6BDLR1_DMWBD_Pos (18) /*!< DDRPHY_T::DX6BDLR1: DMWBD Position */ +#define DDRPHY_DX6BDLR1_DMWBD_Msk (0x3ful << DDRPHY_DX6BDLR1_DMWBD_Pos) /*!< DDRPHY_T::DX6BDLR1: DMWBD Mask */ + +#define DDRPHY_DX6BDLR1_DSWBD_Pos (24) /*!< DDRPHY_T::DX6BDLR1: DSWBD Position */ +#define DDRPHY_DX6BDLR1_DSWBD_Msk (0x3ful << DDRPHY_DX6BDLR1_DSWBD_Pos) /*!< DDRPHY_T::DX6BDLR1: DSWBD Mask */ + +#define DDRPHY_DX6BDLR2_DSOEBD_Pos (0) /*!< DDRPHY_T::DX6BDLR2: DSOEBD Position */ +#define DDRPHY_DX6BDLR2_DSOEBD_Msk (0x3ful << DDRPHY_DX6BDLR2_DSOEBD_Pos) /*!< DDRPHY_T::DX6BDLR2: DSOEBD Mask */ + +#define DDRPHY_DX6BDLR2_DQOEBD_Pos (6) /*!< DDRPHY_T::DX6BDLR2: DQOEBD Position */ +#define DDRPHY_DX6BDLR2_DQOEBD_Msk (0x3ful << DDRPHY_DX6BDLR2_DQOEBD_Pos) /*!< DDRPHY_T::DX6BDLR2: DQOEBD Mask */ + +#define DDRPHY_DX6BDLR2_DSRBD_Pos (12) /*!< DDRPHY_T::DX6BDLR2: DSRBD Position */ +#define DDRPHY_DX6BDLR2_DSRBD_Msk (0x3ful << DDRPHY_DX6BDLR2_DSRBD_Pos) /*!< DDRPHY_T::DX6BDLR2: DSRBD Mask */ + +#define DDRPHY_DX6BDLR2_DSNRBD_Pos (18) /*!< DDRPHY_T::DX6BDLR2: DSNRBD Position */ +#define DDRPHY_DX6BDLR2_DSNRBD_Msk (0x3ful << DDRPHY_DX6BDLR2_DSNRBD_Pos) /*!< DDRPHY_T::DX6BDLR2: DSNRBD Mask */ + +#define DDRPHY_DX6BDLR3_DQ0RBD_Pos (0) /*!< DDRPHY_T::DX6BDLR3: DQ0RBD Position */ +#define DDRPHY_DX6BDLR3_DQ0RBD_Msk (0x3ful << DDRPHY_DX6BDLR3_DQ0RBD_Pos) /*!< DDRPHY_T::DX6BDLR3: DQ0RBD Mask */ + +#define DDRPHY_DX6BDLR3_DQ1RBD_Pos (6) /*!< DDRPHY_T::DX6BDLR3: DQ1RBD Position */ +#define DDRPHY_DX6BDLR3_DQ1RBD_Msk (0x3ful << DDRPHY_DX6BDLR3_DQ1RBD_Pos) /*!< DDRPHY_T::DX6BDLR3: DQ1RBD Mask */ + +#define DDRPHY_DX6BDLR3_DQ2RBD_Pos (12) /*!< DDRPHY_T::DX6BDLR3: DQ2RBD Position */ +#define DDRPHY_DX6BDLR3_DQ2RBD_Msk (0x3ful << DDRPHY_DX6BDLR3_DQ2RBD_Pos) /*!< DDRPHY_T::DX6BDLR3: DQ2RBD Mask */ + +#define DDRPHY_DX6BDLR3_DQ3RBD_Pos (18) /*!< DDRPHY_T::DX6BDLR3: DQ3RBD Position */ +#define DDRPHY_DX6BDLR3_DQ3RBD_Msk (0x3ful << DDRPHY_DX6BDLR3_DQ3RBD_Pos) /*!< DDRPHY_T::DX6BDLR3: DQ3RBD Mask */ + +#define DDRPHY_DX6BDLR3_DQ4RBD_Pos (24) /*!< DDRPHY_T::DX6BDLR3: DQ4RBD Position */ +#define DDRPHY_DX6BDLR3_DQ4RBD_Msk (0x3ful << DDRPHY_DX6BDLR3_DQ4RBD_Pos) /*!< DDRPHY_T::DX6BDLR3: DQ4RBD Mask */ + +#define DDRPHY_DX6BDLR4_DQ5RBD_Pos (0) /*!< DDRPHY_T::DX6BDLR4: DQ5RBD Position */ +#define DDRPHY_DX6BDLR4_DQ5RBD_Msk (0x3ful << DDRPHY_DX6BDLR4_DQ5RBD_Pos) /*!< DDRPHY_T::DX6BDLR4: DQ5RBD Mask */ + +#define DDRPHY_DX6BDLR4_DQ6RBD_Pos (6) /*!< DDRPHY_T::DX6BDLR4: DQ6RBD Position */ +#define DDRPHY_DX6BDLR4_DQ6RBD_Msk (0x3ful << DDRPHY_DX6BDLR4_DQ6RBD_Pos) /*!< DDRPHY_T::DX6BDLR4: DQ6RBD Mask */ + +#define DDRPHY_DX6BDLR4_DQ7RBD_Pos (12) /*!< DDRPHY_T::DX6BDLR4: DQ7RBD Position */ +#define DDRPHY_DX6BDLR4_DQ7RBD_Msk (0x3ful << DDRPHY_DX6BDLR4_DQ7RBD_Pos) /*!< DDRPHY_T::DX6BDLR4: DQ7RBD Mask */ + +#define DDRPHY_DX6BDLR4_DMRBD_Pos (18) /*!< DDRPHY_T::DX6BDLR4: DMRBD Position */ +#define DDRPHY_DX6BDLR4_DMRBD_Msk (0x3ful << DDRPHY_DX6BDLR4_DMRBD_Pos) /*!< DDRPHY_T::DX6BDLR4: DMRBD Mask */ + +#define DDRPHY_DX6LCDLR0_R0WLD_Pos (0) /*!< DDRPHY_T::DX6LCDLR0: R0WLD Position */ +#define DDRPHY_DX6LCDLR0_R0WLD_Msk (0xfful << DDRPHY_DX6LCDLR0_R0WLD_Pos) /*!< DDRPHY_T::DX6LCDLR0: R0WLD Mask */ + +#define DDRPHY_DX6LCDLR0_R1WLD_Pos (8) /*!< DDRPHY_T::DX6LCDLR0: R1WLD Position */ +#define DDRPHY_DX6LCDLR0_R1WLD_Msk (0xfful << DDRPHY_DX6LCDLR0_R1WLD_Pos) /*!< DDRPHY_T::DX6LCDLR0: R1WLD Mask */ + +#define DDRPHY_DX6LCDLR0_R2WLD_Pos (16) /*!< DDRPHY_T::DX6LCDLR0: R2WLD Position */ +#define DDRPHY_DX6LCDLR0_R2WLD_Msk (0xfful << DDRPHY_DX6LCDLR0_R2WLD_Pos) /*!< DDRPHY_T::DX6LCDLR0: R2WLD Mask */ + +#define DDRPHY_DX6LCDLR0_R3WLD_Pos (24) /*!< DDRPHY_T::DX6LCDLR0: R3WLD Position */ +#define DDRPHY_DX6LCDLR0_R3WLD_Msk (0xfful << DDRPHY_DX6LCDLR0_R3WLD_Pos) /*!< DDRPHY_T::DX6LCDLR0: R3WLD Mask */ + +#define DDRPHY_DX6LCDLR2_R0DQSGD_Pos (0) /*!< DDRPHY_T::DX6LCDLR2: R0DQSGD Position */ +#define DDRPHY_DX6LCDLR2_R0DQSGD_Msk (0xfful << DDRPHY_DX6LCDLR2_R0DQSGD_Pos) /*!< DDRPHY_T::DX6LCDLR2: R0DQSGD Mask */ + +#define DDRPHY_DX6LCDLR2_R1DQSGD_Pos (8) /*!< DDRPHY_T::DX6LCDLR2: R1DQSGD Position */ +#define DDRPHY_DX6LCDLR2_R1DQSGD_Msk (0xfful << DDRPHY_DX6LCDLR2_R1DQSGD_Pos) /*!< DDRPHY_T::DX6LCDLR2: R1DQSGD Mask */ + +#define DDRPHY_DX6LCDLR2_R2DQSGD_Pos (16) /*!< DDRPHY_T::DX6LCDLR2: R2DQSGD Position */ +#define DDRPHY_DX6LCDLR2_R2DQSGD_Msk (0xfful << DDRPHY_DX6LCDLR2_R2DQSGD_Pos) /*!< DDRPHY_T::DX6LCDLR2: R2DQSGD Mask */ + +#define DDRPHY_DX6LCDLR2_R3DQSGD_Pos (24) /*!< DDRPHY_T::DX6LCDLR2: R3DQSGD Position */ +#define DDRPHY_DX6LCDLR2_R3DQSGD_Msk (0xfful << DDRPHY_DX6LCDLR2_R3DQSGD_Pos) /*!< DDRPHY_T::DX6LCDLR2: R3DQSGD Mask */ + +#define DDRPHY_DX6MDLR_IPRD_Pos (0) /*!< DDRPHY_T::DX6MDLR: IPRD Position */ +#define DDRPHY_DX6MDLR_IPRD_Msk (0xfful << DDRPHY_DX6MDLR_IPRD_Pos) /*!< DDRPHY_T::DX6MDLR: IPRD Mask */ + +#define DDRPHY_DX6MDLR_TPRD_Pos (8) /*!< DDRPHY_T::DX6MDLR: TPRD Position */ +#define DDRPHY_DX6MDLR_TPRD_Msk (0xfful << DDRPHY_DX6MDLR_TPRD_Pos) /*!< DDRPHY_T::DX6MDLR: TPRD Mask */ + +#define DDRPHY_DX6MDLR_MDLD_Pos (16) /*!< DDRPHY_T::DX6MDLR: MDLD Position */ +#define DDRPHY_DX6MDLR_MDLD_Msk (0xfful << DDRPHY_DX6MDLR_MDLD_Pos) /*!< DDRPHY_T::DX6MDLR: MDLD Mask */ + +#define DDRPHY_DX6GTR_R0DGSL_Pos (0) /*!< DDRPHY_T::DX6GTR: R0DGSL Position */ +#define DDRPHY_DX6GTR_R0DGSL_Msk (0x7ul << DDRPHY_DX6GTR_R0DGSL_Pos) /*!< DDRPHY_T::DX6GTR: R0DGSL Mask */ + +#define DDRPHY_DX6GTR_R1DGSL_Pos (3) /*!< DDRPHY_T::DX6GTR: R1DGSL Position */ +#define DDRPHY_DX6GTR_R1DGSL_Msk (0x7ul << DDRPHY_DX6GTR_R1DGSL_Pos) /*!< DDRPHY_T::DX6GTR: R1DGSL Mask */ + +#define DDRPHY_DX6GTR_R2DGSL_Pos (6) /*!< DDRPHY_T::DX6GTR: R2DGSL Position */ +#define DDRPHY_DX6GTR_R2DGSL_Msk (0x7ul << DDRPHY_DX6GTR_R2DGSL_Pos) /*!< DDRPHY_T::DX6GTR: R2DGSL Mask */ + +#define DDRPHY_DX6GTR_R3DGSL_Pos (9) /*!< DDRPHY_T::DX6GTR: R3DGSL Position */ +#define DDRPHY_DX6GTR_R3DGSL_Msk (0x7ul << DDRPHY_DX6GTR_R3DGSL_Pos) /*!< DDRPHY_T::DX6GTR: R3DGSL Mask */ + +#define DDRPHY_DX6GTR_R0WLSL_Pos (12) /*!< DDRPHY_T::DX6GTR: R0WLSL Position */ +#define DDRPHY_DX6GTR_R0WLSL_Msk (0x3ul << DDRPHY_DX6GTR_R0WLSL_Pos) /*!< DDRPHY_T::DX6GTR: R0WLSL Mask */ + +#define DDRPHY_DX6GTR_R1WLSL_Pos (14) /*!< DDRPHY_T::DX6GTR: R1WLSL Position */ +#define DDRPHY_DX6GTR_R1WLSL_Msk (0x3ul << DDRPHY_DX6GTR_R1WLSL_Pos) /*!< DDRPHY_T::DX6GTR: R1WLSL Mask */ + +#define DDRPHY_DX6GTR_R2WLSL_Pos (16) /*!< DDRPHY_T::DX6GTR: R2WLSL Position */ +#define DDRPHY_DX6GTR_R2WLSL_Msk (0x3ul << DDRPHY_DX6GTR_R2WLSL_Pos) /*!< DDRPHY_T::DX6GTR: R2WLSL Mask */ + +#define DDRPHY_DX6GTR_R3WLSL_Pos (18) /*!< DDRPHY_T::DX6GTR: R3WLSL Position */ +#define DDRPHY_DX6GTR_R3WLSL_Msk (0x3ul << DDRPHY_DX6GTR_R3WLSL_Pos) /*!< DDRPHY_T::DX6GTR: R3WLSL Mask */ + +#define DDRPHY_DX6GSR2_RDERR_Pos (0) /*!< DDRPHY_T::DX6GSR2: RDERR Position */ +#define DDRPHY_DX6GSR2_RDERR_Msk (0x1ul << DDRPHY_DX6GSR2_RDERR_Pos) /*!< DDRPHY_T::DX6GSR2: RDERR Mask */ + +#define DDRPHY_DX6GSR2_RDWN_Pos (1) /*!< DDRPHY_T::DX6GSR2: RDWN Position */ +#define DDRPHY_DX6GSR2_RDWN_Msk (0x1ul << DDRPHY_DX6GSR2_RDWN_Pos) /*!< DDRPHY_T::DX6GSR2: RDWN Mask */ + +#define DDRPHY_DX6GSR2_WDERR_Pos (2) /*!< DDRPHY_T::DX6GSR2: WDERR Position */ +#define DDRPHY_DX6GSR2_WDERR_Msk (0x1ul << DDRPHY_DX6GSR2_WDERR_Pos) /*!< DDRPHY_T::DX6GSR2: WDERR Mask */ + +#define DDRPHY_DX6GSR2_WDWN_Pos (3) /*!< DDRPHY_T::DX6GSR2: WDWN Position */ +#define DDRPHY_DX6GSR2_WDWN_Msk (0x1ul << DDRPHY_DX6GSR2_WDWN_Pos) /*!< DDRPHY_T::DX6GSR2: WDWN Mask */ + +#define DDRPHY_DX6GSR2_REERR_Pos (4) /*!< DDRPHY_T::DX6GSR2: REERR Position */ +#define DDRPHY_DX6GSR2_REERR_Msk (0x1ul << DDRPHY_DX6GSR2_REERR_Pos) /*!< DDRPHY_T::DX6GSR2: REERR Mask */ + +#define DDRPHY_DX6GSR2_REWN_Pos (5) /*!< DDRPHY_T::DX6GSR2: REWN Position */ +#define DDRPHY_DX6GSR2_REWN_Msk (0x1ul << DDRPHY_DX6GSR2_REWN_Pos) /*!< DDRPHY_T::DX6GSR2: REWN Mask */ + +#define DDRPHY_DX6GSR2_WEERR_Pos (6) /*!< DDRPHY_T::DX6GSR2: WEERR Position */ +#define DDRPHY_DX6GSR2_WEERR_Msk (0x1ul << DDRPHY_DX6GSR2_WEERR_Pos) /*!< DDRPHY_T::DX6GSR2: WEERR Mask */ + +#define DDRPHY_DX6GSR2_WEWN_Pos (7) /*!< DDRPHY_T::DX6GSR2: WEWN Position */ +#define DDRPHY_DX6GSR2_WEWN_Msk (0x1ul << DDRPHY_DX6GSR2_WEWN_Pos) /*!< DDRPHY_T::DX6GSR2: WEWN Mask */ + +#define DDRPHY_DX6GSR2_ESTAT_Pos (8) /*!< DDRPHY_T::DX6GSR2: ESTAT Position */ +#define DDRPHY_DX6GSR2_ESTAT_Msk (0xful << DDRPHY_DX6GSR2_ESTAT_Pos) /*!< DDRPHY_T::DX6GSR2: ESTAT Mask */ + +#define DDRPHY_DX7GCR_DXEN_Pos (0) /*!< DDRPHY_T::DX7GCR: DXEN Position */ +#define DDRPHY_DX7GCR_DXEN_Msk (0x1ul << DDRPHY_DX7GCR_DXEN_Pos) /*!< DDRPHY_T::DX7GCR: DXEN Mask */ + +#define DDRPHY_DX7GCR_DQSODT_Pos (1) /*!< DDRPHY_T::DX7GCR: DQSODT Position */ +#define DDRPHY_DX7GCR_DQSODT_Msk (0x1ul << DDRPHY_DX7GCR_DQSODT_Pos) /*!< DDRPHY_T::DX7GCR: DQSODT Mask */ + +#define DDRPHY_DX7GCR_DQODT_Pos (2) /*!< DDRPHY_T::DX7GCR: DQODT Position */ +#define DDRPHY_DX7GCR_DQODT_Msk (0x1ul << DDRPHY_DX7GCR_DQODT_Pos) /*!< DDRPHY_T::DX7GCR: DQODT Mask */ + +#define DDRPHY_DX7GCR_DXIOM_Pos (3) /*!< DDRPHY_T::DX7GCR: DXIOM Position */ +#define DDRPHY_DX7GCR_DXIOM_Msk (0x1ul << DDRPHY_DX7GCR_DXIOM_Pos) /*!< DDRPHY_T::DX7GCR: DXIOM Mask */ + +#define DDRPHY_DX7GCR_DXPDD_Pos (4) /*!< DDRPHY_T::DX7GCR: DXPDD Position */ +#define DDRPHY_DX7GCR_DXPDD_Msk (0x1ul << DDRPHY_DX7GCR_DXPDD_Pos) /*!< DDRPHY_T::DX7GCR: DXPDD Mask */ + +#define DDRPHY_DX7GCR_DXPDR_Pos (5) /*!< DDRPHY_T::DX7GCR: DXPDR Position */ +#define DDRPHY_DX7GCR_DXPDR_Msk (0x1ul << DDRPHY_DX7GCR_DXPDR_Pos) /*!< DDRPHY_T::DX7GCR: DXPDR Mask */ + +#define DDRPHY_DX7GCR_DQSRPD_Pos (6) /*!< DDRPHY_T::DX7GCR: DQSRPD Position */ +#define DDRPHY_DX7GCR_DQSRPD_Msk (0x1ul << DDRPHY_DX7GCR_DQSRPD_Pos) /*!< DDRPHY_T::DX7GCR: DQSRPD Mask */ + +#define DDRPHY_DX7GCR_DSEN_Pos (7) /*!< DDRPHY_T::DX7GCR: DSEN Position */ +#define DDRPHY_DX7GCR_DSEN_Msk (0x3ul << DDRPHY_DX7GCR_DSEN_Pos) /*!< DDRPHY_T::DX7GCR: DSEN Mask */ + +#define DDRPHY_DX7GCR_DQSRTT_Pos (9) /*!< DDRPHY_T::DX7GCR: DQSRTT Position */ +#define DDRPHY_DX7GCR_DQSRTT_Msk (0x1ul << DDRPHY_DX7GCR_DQSRTT_Pos) /*!< DDRPHY_T::DX7GCR: DQSRTT Mask */ + +#define DDRPHY_DX7GCR_DQRTT_Pos (10) /*!< DDRPHY_T::DX7GCR: DQRTT Position */ +#define DDRPHY_DX7GCR_DQRTT_Msk (0x1ul << DDRPHY_DX7GCR_DQRTT_Pos) /*!< DDRPHY_T::DX7GCR: DQRTT Mask */ + +#define DDRPHY_DX7GCR_RTTOH_Pos (11) /*!< DDRPHY_T::DX7GCR: RTTOH Position */ +#define DDRPHY_DX7GCR_RTTOH_Msk (0x3ul << DDRPHY_DX7GCR_RTTOH_Pos) /*!< DDRPHY_T::DX7GCR: RTTOH Mask */ + +#define DDRPHY_DX7GCR_RTTOAL_Pos (13) /*!< DDRPHY_T::DX7GCR: RTTOAL Position */ +#define DDRPHY_DX7GCR_RTTOAL_Msk (0x1ul << DDRPHY_DX7GCR_RTTOAL_Pos) /*!< DDRPHY_T::DX7GCR: RTTOAL Mask */ + +#define DDRPHY_DX7GCR_DXOEO_Pos (14) /*!< DDRPHY_T::DX7GCR: DXOEO Position */ +#define DDRPHY_DX7GCR_DXOEO_Msk (0x3ul << DDRPHY_DX7GCR_DXOEO_Pos) /*!< DDRPHY_T::DX7GCR: DXOEO Mask */ + +#define DDRPHY_DX7GCR_PLLRST_Pos (16) /*!< DDRPHY_T::DX7GCR: PLLRST Position */ +#define DDRPHY_DX7GCR_PLLRST_Msk (0x1ul << DDRPHY_DX7GCR_PLLRST_Pos) /*!< DDRPHY_T::DX7GCR: PLLRST Mask */ + +#define DDRPHY_DX7GCR_PLLPD_Pos (17) /*!< DDRPHY_T::DX7GCR: PLLPD Position */ +#define DDRPHY_DX7GCR_PLLPD_Msk (0x1ul << DDRPHY_DX7GCR_PLLPD_Pos) /*!< DDRPHY_T::DX7GCR: PLLPD Mask */ + +#define DDRPHY_DX7GCR_GSHIFT_Pos (18) /*!< DDRPHY_T::DX7GCR: GSHIFT Position */ +#define DDRPHY_DX7GCR_GSHIFT_Msk (0x1ul << DDRPHY_DX7GCR_GSHIFT_Pos) /*!< DDRPHY_T::DX7GCR: GSHIFT Mask */ + +#define DDRPHY_DX7GCR_PLLBYP_Pos (19) /*!< DDRPHY_T::DX7GCR: PLLBYP Position */ +#define DDRPHY_DX7GCR_PLLBYP_Msk (0x1ul << DDRPHY_DX7GCR_PLLBYP_Pos) /*!< DDRPHY_T::DX7GCR: PLLBYP Mask */ + +#define DDRPHY_DX7GCR_WLRKEN_Pos (26) /*!< DDRPHY_T::DX7GCR: WLRKEN Position */ +#define DDRPHY_DX7GCR_WLRKEN_Msk (0xful << DDRPHY_DX7GCR_WLRKEN_Pos) /*!< DDRPHY_T::DX7GCR: WLRKEN Mask */ + +#define DDRPHY_DX7GCR_MDLEN_Pos (30) /*!< DDRPHY_T::DX7GCR: MDLEN Position */ +#define DDRPHY_DX7GCR_MDLEN_Msk (0x1ul << DDRPHY_DX7GCR_MDLEN_Pos) /*!< DDRPHY_T::DX7GCR: MDLEN Mask */ + +#define DDRPHY_DX7GCR_CALBYP_Pos (31) /*!< DDRPHY_T::DX7GCR: CALBYP Position */ +#define DDRPHY_DX7GCR_CALBYP_Msk (0x1ul << DDRPHY_DX7GCR_CALBYP_Pos) /*!< DDRPHY_T::DX7GCR: CALBYP Mask */ + +#define DDRPHY_DX7GSR0_WDQCAL_Pos (0) /*!< DDRPHY_T::DX7GSR0: WDQCAL Position */ +#define DDRPHY_DX7GSR0_WDQCAL_Msk (0x1ul << DDRPHY_DX7GSR0_WDQCAL_Pos) /*!< DDRPHY_T::DX7GSR0: WDQCAL Mask */ + +#define DDRPHY_DX7GSR0_RDQSCAL_Pos (1) /*!< DDRPHY_T::DX7GSR0: RDQSCAL Position */ +#define DDRPHY_DX7GSR0_RDQSCAL_Msk (0x1ul << DDRPHY_DX7GSR0_RDQSCAL_Pos) /*!< DDRPHY_T::DX7GSR0: RDQSCAL Mask */ + +#define DDRPHY_DX7GSR0_RDQSNCAL_Pos (2) /*!< DDRPHY_T::DX7GSR0: RDQSNCAL Position */ +#define DDRPHY_DX7GSR0_RDQSNCAL_Msk (0x1ul << DDRPHY_DX7GSR0_RDQSNCAL_Pos) /*!< DDRPHY_T::DX7GSR0: RDQSNCAL Mask */ + +#define DDRPHY_DX7GSR0_GDQSCAL_Pos (3) /*!< DDRPHY_T::DX7GSR0: GDQSCAL Position */ +#define DDRPHY_DX7GSR0_GDQSCAL_Msk (0x1ul << DDRPHY_DX7GSR0_GDQSCAL_Pos) /*!< DDRPHY_T::DX7GSR0: GDQSCAL Mask */ + +#define DDRPHY_DX7GSR0_WLCAL_Pos (4) /*!< DDRPHY_T::DX7GSR0: WLCAL Position */ +#define DDRPHY_DX7GSR0_WLCAL_Msk (0x1ul << DDRPHY_DX7GSR0_WLCAL_Pos) /*!< DDRPHY_T::DX7GSR0: WLCAL Mask */ + +#define DDRPHY_DX7GSR0_WLDONE_Pos (5) /*!< DDRPHY_T::DX7GSR0: WLDONE Position */ +#define DDRPHY_DX7GSR0_WLDONE_Msk (0x1ul << DDRPHY_DX7GSR0_WLDONE_Pos) /*!< DDRPHY_T::DX7GSR0: WLDONE Mask */ + +#define DDRPHY_DX7GSR0_WLERR_Pos (6) /*!< DDRPHY_T::DX7GSR0: WLERR Position */ +#define DDRPHY_DX7GSR0_WLERR_Msk (0x1ul << DDRPHY_DX7GSR0_WLERR_Pos) /*!< DDRPHY_T::DX7GSR0: WLERR Mask */ + +#define DDRPHY_DX7GSR0_WLPRD_Pos (7) /*!< DDRPHY_T::DX7GSR0: WLPRD Position */ +#define DDRPHY_DX7GSR0_WLPRD_Msk (0xfful << DDRPHY_DX7GSR0_WLPRD_Pos) /*!< DDRPHY_T::DX7GSR0: WLPRD Mask */ + +#define DDRPHY_DX7GSR0_DPLOCK_Pos (15) /*!< DDRPHY_T::DX7GSR0: DPLOCK Position */ +#define DDRPHY_DX7GSR0_DPLOCK_Msk (0x1ul << DDRPHY_DX7GSR0_DPLOCK_Pos) /*!< DDRPHY_T::DX7GSR0: DPLOCK Mask */ + +#define DDRPHY_DX7GSR0_GDQSPRD_Pos (16) /*!< DDRPHY_T::DX7GSR0: GDQSPRD Position */ +#define DDRPHY_DX7GSR0_GDQSPRD_Msk (0xfful << DDRPHY_DX7GSR0_GDQSPRD_Pos) /*!< DDRPHY_T::DX7GSR0: GDQSPRD Mask */ + +#define DDRPHY_DX7GSR0_QSGERR_Pos (24) /*!< DDRPHY_T::DX7GSR0: QSGERR Position */ +#define DDRPHY_DX7GSR0_QSGERR_Msk (0xful << DDRPHY_DX7GSR0_QSGERR_Pos) /*!< DDRPHY_T::DX7GSR0: QSGERR Mask */ + +#define DDRPHY_DX7GSR0_WLDQ_Pos (28) /*!< DDRPHY_T::DX7GSR0: WLDQ Position */ +#define DDRPHY_DX7GSR0_WLDQ_Msk (0x1ul << DDRPHY_DX7GSR0_WLDQ_Pos) /*!< DDRPHY_T::DX7GSR0: WLDQ Mask */ + +#define DDRPHY_DX7GSR1_DLTDONE_Pos (0) /*!< DDRPHY_T::DX7GSR1: DLTDONE Position */ +#define DDRPHY_DX7GSR1_DLTDONE_Msk (0x1ul << DDRPHY_DX7GSR1_DLTDONE_Pos) /*!< DDRPHY_T::DX7GSR1: DLTDONE Mask */ + +#define DDRPHY_DX7GSR1_DLTCODE_Pos (1) /*!< DDRPHY_T::DX7GSR1: DLTCODE Position */ +#define DDRPHY_DX7GSR1_DLTCODE_Msk (0xfffffful << DDRPHY_DX7GSR1_DLTCODE_Pos) /*!< DDRPHY_T::DX7GSR1: DLTCODE Mask */ + +#define DDRPHY_DX7BDLR0_DQ0WBD_Pos (0) /*!< DDRPHY_T::DX7BDLR0: DQ0WBD Position */ +#define DDRPHY_DX7BDLR0_DQ0WBD_Msk (0x3ful << DDRPHY_DX7BDLR0_DQ0WBD_Pos) /*!< DDRPHY_T::DX7BDLR0: DQ0WBD Mask */ + +#define DDRPHY_DX7BDLR0_DQ1WBD_Pos (6) /*!< DDRPHY_T::DX7BDLR0: DQ1WBD Position */ +#define DDRPHY_DX7BDLR0_DQ1WBD_Msk (0x3ful << DDRPHY_DX7BDLR0_DQ1WBD_Pos) /*!< DDRPHY_T::DX7BDLR0: DQ1WBD Mask */ + +#define DDRPHY_DX7BDLR0_DQ2WBD_Pos (12) /*!< DDRPHY_T::DX7BDLR0: DQ2WBD Position */ +#define DDRPHY_DX7BDLR0_DQ2WBD_Msk (0x3ful << DDRPHY_DX7BDLR0_DQ2WBD_Pos) /*!< DDRPHY_T::DX7BDLR0: DQ2WBD Mask */ + +#define DDRPHY_DX7BDLR0_DQ3WBD_Pos (18) /*!< DDRPHY_T::DX7BDLR0: DQ3WBD Position */ +#define DDRPHY_DX7BDLR0_DQ3WBD_Msk (0x3ful << DDRPHY_DX7BDLR0_DQ3WBD_Pos) /*!< DDRPHY_T::DX7BDLR0: DQ3WBD Mask */ + +#define DDRPHY_DX7BDLR0_DQ4WBD_Pos (24) /*!< DDRPHY_T::DX7BDLR0: DQ4WBD Position */ +#define DDRPHY_DX7BDLR0_DQ4WBD_Msk (0x3ful << DDRPHY_DX7BDLR0_DQ4WBD_Pos) /*!< DDRPHY_T::DX7BDLR0: DQ4WBD Mask */ + +#define DDRPHY_DX7BDLR1_DQ5WBD_Pos (0) /*!< DDRPHY_T::DX7BDLR1: DQ5WBD Position */ +#define DDRPHY_DX7BDLR1_DQ5WBD_Msk (0x3ful << DDRPHY_DX7BDLR1_DQ5WBD_Pos) /*!< DDRPHY_T::DX7BDLR1: DQ5WBD Mask */ + +#define DDRPHY_DX7BDLR1_DQ6WBD_Pos (6) /*!< DDRPHY_T::DX7BDLR1: DQ6WBD Position */ +#define DDRPHY_DX7BDLR1_DQ6WBD_Msk (0x3ful << DDRPHY_DX7BDLR1_DQ6WBD_Pos) /*!< DDRPHY_T::DX7BDLR1: DQ6WBD Mask */ + +#define DDRPHY_DX7BDLR1_DQ7WBD_Pos (12) /*!< DDRPHY_T::DX7BDLR1: DQ7WBD Position */ +#define DDRPHY_DX7BDLR1_DQ7WBD_Msk (0x3ful << DDRPHY_DX7BDLR1_DQ7WBD_Pos) /*!< DDRPHY_T::DX7BDLR1: DQ7WBD Mask */ + +#define DDRPHY_DX7BDLR1_DMWBD_Pos (18) /*!< DDRPHY_T::DX7BDLR1: DMWBD Position */ +#define DDRPHY_DX7BDLR1_DMWBD_Msk (0x3ful << DDRPHY_DX7BDLR1_DMWBD_Pos) /*!< DDRPHY_T::DX7BDLR1: DMWBD Mask */ + +#define DDRPHY_DX7BDLR1_DSWBD_Pos (24) /*!< DDRPHY_T::DX7BDLR1: DSWBD Position */ +#define DDRPHY_DX7BDLR1_DSWBD_Msk (0x3ful << DDRPHY_DX7BDLR1_DSWBD_Pos) /*!< DDRPHY_T::DX7BDLR1: DSWBD Mask */ + +#define DDRPHY_DX7BDLR2_DSOEBD_Pos (0) /*!< DDRPHY_T::DX7BDLR2: DSOEBD Position */ +#define DDRPHY_DX7BDLR2_DSOEBD_Msk (0x3ful << DDRPHY_DX7BDLR2_DSOEBD_Pos) /*!< DDRPHY_T::DX7BDLR2: DSOEBD Mask */ + +#define DDRPHY_DX7BDLR2_DQOEBD_Pos (6) /*!< DDRPHY_T::DX7BDLR2: DQOEBD Position */ +#define DDRPHY_DX7BDLR2_DQOEBD_Msk (0x3ful << DDRPHY_DX7BDLR2_DQOEBD_Pos) /*!< DDRPHY_T::DX7BDLR2: DQOEBD Mask */ + +#define DDRPHY_DX7BDLR2_DSRBD_Pos (12) /*!< DDRPHY_T::DX7BDLR2: DSRBD Position */ +#define DDRPHY_DX7BDLR2_DSRBD_Msk (0x3ful << DDRPHY_DX7BDLR2_DSRBD_Pos) /*!< DDRPHY_T::DX7BDLR2: DSRBD Mask */ + +#define DDRPHY_DX7BDLR2_DSNRBD_Pos (18) /*!< DDRPHY_T::DX7BDLR2: DSNRBD Position */ +#define DDRPHY_DX7BDLR2_DSNRBD_Msk (0x3ful << DDRPHY_DX7BDLR2_DSNRBD_Pos) /*!< DDRPHY_T::DX7BDLR2: DSNRBD Mask */ + +#define DDRPHY_DX7BDLR3_DQ0RBD_Pos (0) /*!< DDRPHY_T::DX7BDLR3: DQ0RBD Position */ +#define DDRPHY_DX7BDLR3_DQ0RBD_Msk (0x3ful << DDRPHY_DX7BDLR3_DQ0RBD_Pos) /*!< DDRPHY_T::DX7BDLR3: DQ0RBD Mask */ + +#define DDRPHY_DX7BDLR3_DQ1RBD_Pos (6) /*!< DDRPHY_T::DX7BDLR3: DQ1RBD Position */ +#define DDRPHY_DX7BDLR3_DQ1RBD_Msk (0x3ful << DDRPHY_DX7BDLR3_DQ1RBD_Pos) /*!< DDRPHY_T::DX7BDLR3: DQ1RBD Mask */ + +#define DDRPHY_DX7BDLR3_DQ2RBD_Pos (12) /*!< DDRPHY_T::DX7BDLR3: DQ2RBD Position */ +#define DDRPHY_DX7BDLR3_DQ2RBD_Msk (0x3ful << DDRPHY_DX7BDLR3_DQ2RBD_Pos) /*!< DDRPHY_T::DX7BDLR3: DQ2RBD Mask */ + +#define DDRPHY_DX7BDLR3_DQ3RBD_Pos (18) /*!< DDRPHY_T::DX7BDLR3: DQ3RBD Position */ +#define DDRPHY_DX7BDLR3_DQ3RBD_Msk (0x3ful << DDRPHY_DX7BDLR3_DQ3RBD_Pos) /*!< DDRPHY_T::DX7BDLR3: DQ3RBD Mask */ + +#define DDRPHY_DX7BDLR3_DQ4RBD_Pos (24) /*!< DDRPHY_T::DX7BDLR3: DQ4RBD Position */ +#define DDRPHY_DX7BDLR3_DQ4RBD_Msk (0x3ful << DDRPHY_DX7BDLR3_DQ4RBD_Pos) /*!< DDRPHY_T::DX7BDLR3: DQ4RBD Mask */ + +#define DDRPHY_DX7BDLR4_DQ5RBD_Pos (0) /*!< DDRPHY_T::DX7BDLR4: DQ5RBD Position */ +#define DDRPHY_DX7BDLR4_DQ5RBD_Msk (0x3ful << DDRPHY_DX7BDLR4_DQ5RBD_Pos) /*!< DDRPHY_T::DX7BDLR4: DQ5RBD Mask */ + +#define DDRPHY_DX7BDLR4_DQ6RBD_Pos (6) /*!< DDRPHY_T::DX7BDLR4: DQ6RBD Position */ +#define DDRPHY_DX7BDLR4_DQ6RBD_Msk (0x3ful << DDRPHY_DX7BDLR4_DQ6RBD_Pos) /*!< DDRPHY_T::DX7BDLR4: DQ6RBD Mask */ + +#define DDRPHY_DX7BDLR4_DQ7RBD_Pos (12) /*!< DDRPHY_T::DX7BDLR4: DQ7RBD Position */ +#define DDRPHY_DX7BDLR4_DQ7RBD_Msk (0x3ful << DDRPHY_DX7BDLR4_DQ7RBD_Pos) /*!< DDRPHY_T::DX7BDLR4: DQ7RBD Mask */ + +#define DDRPHY_DX7BDLR4_DMRBD_Pos (18) /*!< DDRPHY_T::DX7BDLR4: DMRBD Position */ +#define DDRPHY_DX7BDLR4_DMRBD_Msk (0x3ful << DDRPHY_DX7BDLR4_DMRBD_Pos) /*!< DDRPHY_T::DX7BDLR4: DMRBD Mask */ + +#define DDRPHY_DX7LCDLR0_R0WLD_Pos (0) /*!< DDRPHY_T::DX7LCDLR0: R0WLD Position */ +#define DDRPHY_DX7LCDLR0_R0WLD_Msk (0xfful << DDRPHY_DX7LCDLR0_R0WLD_Pos) /*!< DDRPHY_T::DX7LCDLR0: R0WLD Mask */ + +#define DDRPHY_DX7LCDLR0_R1WLD_Pos (8) /*!< DDRPHY_T::DX7LCDLR0: R1WLD Position */ +#define DDRPHY_DX7LCDLR0_R1WLD_Msk (0xfful << DDRPHY_DX7LCDLR0_R1WLD_Pos) /*!< DDRPHY_T::DX7LCDLR0: R1WLD Mask */ + +#define DDRPHY_DX7LCDLR0_R2WLD_Pos (16) /*!< DDRPHY_T::DX7LCDLR0: R2WLD Position */ +#define DDRPHY_DX7LCDLR0_R2WLD_Msk (0xfful << DDRPHY_DX7LCDLR0_R2WLD_Pos) /*!< DDRPHY_T::DX7LCDLR0: R2WLD Mask */ + +#define DDRPHY_DX7LCDLR0_R3WLD_Pos (24) /*!< DDRPHY_T::DX7LCDLR0: R3WLD Position */ +#define DDRPHY_DX7LCDLR0_R3WLD_Msk (0xfful << DDRPHY_DX7LCDLR0_R3WLD_Pos) /*!< DDRPHY_T::DX7LCDLR0: R3WLD Mask */ + +#define DDRPHY_DX7LCDLR1_WDQD_Pos (0) /*!< DDRPHY_T::DX7LCDLR1: WDQD Position */ +#define DDRPHY_DX7LCDLR1_WDQD_Msk (0xfful << DDRPHY_DX7LCDLR1_WDQD_Pos) /*!< DDRPHY_T::DX7LCDLR1: WDQD Mask */ + +#define DDRPHY_DX7LCDLR1_RDQSD_Pos (8) /*!< DDRPHY_T::DX7LCDLR1: RDQSD Position */ +#define DDRPHY_DX7LCDLR1_RDQSD_Msk (0xfful << DDRPHY_DX7LCDLR1_RDQSD_Pos) /*!< DDRPHY_T::DX7LCDLR1: RDQSD Mask */ + +#define DDRPHY_DX7LCDLR1_RDQSND_Pos (16) /*!< DDRPHY_T::DX7LCDLR1: RDQSND Position */ +#define DDRPHY_DX7LCDLR1_RDQSND_Msk (0xfful << DDRPHY_DX7LCDLR1_RDQSND_Pos) /*!< DDRPHY_T::DX7LCDLR1: RDQSND Mask */ + +#define DDRPHY_DX7LCDLR2_R0DQSGD_Pos (0) /*!< DDRPHY_T::DX7LCDLR2: R0DQSGD Position */ +#define DDRPHY_DX7LCDLR2_R0DQSGD_Msk (0xfful << DDRPHY_DX7LCDLR2_R0DQSGD_Pos) /*!< DDRPHY_T::DX7LCDLR2: R0DQSGD Mask */ + +#define DDRPHY_DX7LCDLR2_R1DQSGD_Pos (8) /*!< DDRPHY_T::DX7LCDLR2: R1DQSGD Position */ +#define DDRPHY_DX7LCDLR2_R1DQSGD_Msk (0xfful << DDRPHY_DX7LCDLR2_R1DQSGD_Pos) /*!< DDRPHY_T::DX7LCDLR2: R1DQSGD Mask */ + +#define DDRPHY_DX7LCDLR2_R2DQSGD_Pos (16) /*!< DDRPHY_T::DX7LCDLR2: R2DQSGD Position */ +#define DDRPHY_DX7LCDLR2_R2DQSGD_Msk (0xfful << DDRPHY_DX7LCDLR2_R2DQSGD_Pos) /*!< DDRPHY_T::DX7LCDLR2: R2DQSGD Mask */ + +#define DDRPHY_DX7LCDLR2_R3DQSGD_Pos (24) /*!< DDRPHY_T::DX7LCDLR2: R3DQSGD Position */ +#define DDRPHY_DX7LCDLR2_R3DQSGD_Msk (0xfful << DDRPHY_DX7LCDLR2_R3DQSGD_Pos) /*!< DDRPHY_T::DX7LCDLR2: R3DQSGD Mask */ + +#define DDRPHY_DX7MDLR_IPRD_Pos (0) /*!< DDRPHY_T::DX7MDLR: IPRD Position */ +#define DDRPHY_DX7MDLR_IPRD_Msk (0xfful << DDRPHY_DX7MDLR_IPRD_Pos) /*!< DDRPHY_T::DX7MDLR: IPRD Mask */ + +#define DDRPHY_DX7MDLR_TPRD_Pos (8) /*!< DDRPHY_T::DX7MDLR: TPRD Position */ +#define DDRPHY_DX7MDLR_TPRD_Msk (0xfful << DDRPHY_DX7MDLR_TPRD_Pos) /*!< DDRPHY_T::DX7MDLR: TPRD Mask */ + +#define DDRPHY_DX7MDLR_MDLD_Pos (16) /*!< DDRPHY_T::DX7MDLR: MDLD Position */ +#define DDRPHY_DX7MDLR_MDLD_Msk (0xfful << DDRPHY_DX7MDLR_MDLD_Pos) /*!< DDRPHY_T::DX7MDLR: MDLD Mask */ + +#define DDRPHY_DX7GTR_R0DGSL_Pos (0) /*!< DDRPHY_T::DX7GTR: R0DGSL Position */ +#define DDRPHY_DX7GTR_R0DGSL_Msk (0x7ul << DDRPHY_DX7GTR_R0DGSL_Pos) /*!< DDRPHY_T::DX7GTR: R0DGSL Mask */ + +#define DDRPHY_DX7GTR_R1DGSL_Pos (3) /*!< DDRPHY_T::DX7GTR: R1DGSL Position */ +#define DDRPHY_DX7GTR_R1DGSL_Msk (0x7ul << DDRPHY_DX7GTR_R1DGSL_Pos) /*!< DDRPHY_T::DX7GTR: R1DGSL Mask */ + +#define DDRPHY_DX7GTR_R2DGSL_Pos (6) /*!< DDRPHY_T::DX7GTR: R2DGSL Position */ +#define DDRPHY_DX7GTR_R2DGSL_Msk (0x7ul << DDRPHY_DX7GTR_R2DGSL_Pos) /*!< DDRPHY_T::DX7GTR: R2DGSL Mask */ + +#define DDRPHY_DX7GTR_R3DGSL_Pos (9) /*!< DDRPHY_T::DX7GTR: R3DGSL Position */ +#define DDRPHY_DX7GTR_R3DGSL_Msk (0x7ul << DDRPHY_DX7GTR_R3DGSL_Pos) /*!< DDRPHY_T::DX7GTR: R3DGSL Mask */ + +#define DDRPHY_DX7GTR_R0WLSL_Pos (12) /*!< DDRPHY_T::DX7GTR: R0WLSL Position */ +#define DDRPHY_DX7GTR_R0WLSL_Msk (0x3ul << DDRPHY_DX7GTR_R0WLSL_Pos) /*!< DDRPHY_T::DX7GTR: R0WLSL Mask */ + +#define DDRPHY_DX7GTR_R1WLSL_Pos (14) /*!< DDRPHY_T::DX7GTR: R1WLSL Position */ +#define DDRPHY_DX7GTR_R1WLSL_Msk (0x3ul << DDRPHY_DX7GTR_R1WLSL_Pos) /*!< DDRPHY_T::DX7GTR: R1WLSL Mask */ + +#define DDRPHY_DX7GTR_R2WLSL_Pos (16) /*!< DDRPHY_T::DX7GTR: R2WLSL Position */ +#define DDRPHY_DX7GTR_R2WLSL_Msk (0x3ul << DDRPHY_DX7GTR_R2WLSL_Pos) /*!< DDRPHY_T::DX7GTR: R2WLSL Mask */ + +#define DDRPHY_DX7GTR_R3WLSL_Pos (18) /*!< DDRPHY_T::DX7GTR: R3WLSL Position */ +#define DDRPHY_DX7GTR_R3WLSL_Msk (0x3ul << DDRPHY_DX7GTR_R3WLSL_Pos) /*!< DDRPHY_T::DX7GTR: R3WLSL Mask */ + +#define DDRPHY_DX7GSR2_RDERR_Pos (0) /*!< DDRPHY_T::DX7GSR2: RDERR Position */ +#define DDRPHY_DX7GSR2_RDERR_Msk (0x1ul << DDRPHY_DX7GSR2_RDERR_Pos) /*!< DDRPHY_T::DX7GSR2: RDERR Mask */ + +#define DDRPHY_DX7GSR2_RDWN_Pos (1) /*!< DDRPHY_T::DX7GSR2: RDWN Position */ +#define DDRPHY_DX7GSR2_RDWN_Msk (0x1ul << DDRPHY_DX7GSR2_RDWN_Pos) /*!< DDRPHY_T::DX7GSR2: RDWN Mask */ + +#define DDRPHY_DX7GSR2_WDERR_Pos (2) /*!< DDRPHY_T::DX7GSR2: WDERR Position */ +#define DDRPHY_DX7GSR2_WDERR_Msk (0x1ul << DDRPHY_DX7GSR2_WDERR_Pos) /*!< DDRPHY_T::DX7GSR2: WDERR Mask */ + +#define DDRPHY_DX7GSR2_WDWN_Pos (3) /*!< DDRPHY_T::DX7GSR2: WDWN Position */ +#define DDRPHY_DX7GSR2_WDWN_Msk (0x1ul << DDRPHY_DX7GSR2_WDWN_Pos) /*!< DDRPHY_T::DX7GSR2: WDWN Mask */ + +#define DDRPHY_DX7GSR2_REERR_Pos (4) /*!< DDRPHY_T::DX7GSR2: REERR Position */ +#define DDRPHY_DX7GSR2_REERR_Msk (0x1ul << DDRPHY_DX7GSR2_REERR_Pos) /*!< DDRPHY_T::DX7GSR2: REERR Mask */ + +#define DDRPHY_DX7GSR2_REWN_Pos (5) /*!< DDRPHY_T::DX7GSR2: REWN Position */ +#define DDRPHY_DX7GSR2_REWN_Msk (0x1ul << DDRPHY_DX7GSR2_REWN_Pos) /*!< DDRPHY_T::DX7GSR2: REWN Mask */ + +#define DDRPHY_DX7GSR2_WEERR_Pos (6) /*!< DDRPHY_T::DX7GSR2: WEERR Position */ +#define DDRPHY_DX7GSR2_WEERR_Msk (0x1ul << DDRPHY_DX7GSR2_WEERR_Pos) /*!< DDRPHY_T::DX7GSR2: WEERR Mask */ + +#define DDRPHY_DX7GSR2_WEWN_Pos (7) /*!< DDRPHY_T::DX7GSR2: WEWN Position */ +#define DDRPHY_DX7GSR2_WEWN_Msk (0x1ul << DDRPHY_DX7GSR2_WEWN_Pos) /*!< DDRPHY_T::DX7GSR2: WEWN Mask */ + +#define DDRPHY_DX7GSR2_ESTAT_Pos (8) /*!< DDRPHY_T::DX7GSR2: ESTAT Position */ +#define DDRPHY_DX7GSR2_ESTAT_Msk (0xful << DDRPHY_DX7GSR2_ESTAT_Pos) /*!< DDRPHY_T::DX7GSR2: ESTAT Mask */ + +#define DDRPHY_DX8GCR_DXEN_Pos (0) /*!< DDRPHY_T::DX8GCR: DXEN Position */ +#define DDRPHY_DX8GCR_DXEN_Msk (0x1ul << DDRPHY_DX8GCR_DXEN_Pos) /*!< DDRPHY_T::DX8GCR: DXEN Mask */ + +#define DDRPHY_DX8GCR_DQSODT_Pos (1) /*!< DDRPHY_T::DX8GCR: DQSODT Position */ +#define DDRPHY_DX8GCR_DQSODT_Msk (0x1ul << DDRPHY_DX8GCR_DQSODT_Pos) /*!< DDRPHY_T::DX8GCR: DQSODT Mask */ + +#define DDRPHY_DX8GCR_DQODT_Pos (2) /*!< DDRPHY_T::DX8GCR: DQODT Position */ +#define DDRPHY_DX8GCR_DQODT_Msk (0x1ul << DDRPHY_DX8GCR_DQODT_Pos) /*!< DDRPHY_T::DX8GCR: DQODT Mask */ + +#define DDRPHY_DX8GCR_DXIOM_Pos (3) /*!< DDRPHY_T::DX8GCR: DXIOM Position */ +#define DDRPHY_DX8GCR_DXIOM_Msk (0x1ul << DDRPHY_DX8GCR_DXIOM_Pos) /*!< DDRPHY_T::DX8GCR: DXIOM Mask */ + +#define DDRPHY_DX8GCR_DXPDD_Pos (4) /*!< DDRPHY_T::DX8GCR: DXPDD Position */ +#define DDRPHY_DX8GCR_DXPDD_Msk (0x1ul << DDRPHY_DX8GCR_DXPDD_Pos) /*!< DDRPHY_T::DX8GCR: DXPDD Mask */ + +#define DDRPHY_DX8GCR_DXPDR_Pos (5) /*!< DDRPHY_T::DX8GCR: DXPDR Position */ +#define DDRPHY_DX8GCR_DXPDR_Msk (0x1ul << DDRPHY_DX8GCR_DXPDR_Pos) /*!< DDRPHY_T::DX8GCR: DXPDR Mask */ + +#define DDRPHY_DX8GCR_DQSRPD_Pos (6) /*!< DDRPHY_T::DX8GCR: DQSRPD Position */ +#define DDRPHY_DX8GCR_DQSRPD_Msk (0x1ul << DDRPHY_DX8GCR_DQSRPD_Pos) /*!< DDRPHY_T::DX8GCR: DQSRPD Mask */ + +#define DDRPHY_DX8GCR_DSEN_Pos (7) /*!< DDRPHY_T::DX8GCR: DSEN Position */ +#define DDRPHY_DX8GCR_DSEN_Msk (0x3ul << DDRPHY_DX8GCR_DSEN_Pos) /*!< DDRPHY_T::DX8GCR: DSEN Mask */ + +#define DDRPHY_DX8GCR_DQSRTT_Pos (9) /*!< DDRPHY_T::DX8GCR: DQSRTT Position */ +#define DDRPHY_DX8GCR_DQSRTT_Msk (0x1ul << DDRPHY_DX8GCR_DQSRTT_Pos) /*!< DDRPHY_T::DX8GCR: DQSRTT Mask */ + +#define DDRPHY_DX8GCR_DQRTT_Pos (10) /*!< DDRPHY_T::DX8GCR: DQRTT Position */ +#define DDRPHY_DX8GCR_DQRTT_Msk (0x1ul << DDRPHY_DX8GCR_DQRTT_Pos) /*!< DDRPHY_T::DX8GCR: DQRTT Mask */ + +#define DDRPHY_DX8GCR_RTTOH_Pos (11) /*!< DDRPHY_T::DX8GCR: RTTOH Position */ +#define DDRPHY_DX8GCR_RTTOH_Msk (0x3ul << DDRPHY_DX8GCR_RTTOH_Pos) /*!< DDRPHY_T::DX8GCR: RTTOH Mask */ + +#define DDRPHY_DX8GCR_RTTOAL_Pos (13) /*!< DDRPHY_T::DX8GCR: RTTOAL Position */ +#define DDRPHY_DX8GCR_RTTOAL_Msk (0x1ul << DDRPHY_DX8GCR_RTTOAL_Pos) /*!< DDRPHY_T::DX8GCR: RTTOAL Mask */ + +#define DDRPHY_DX8GCR_DXOEO_Pos (14) /*!< DDRPHY_T::DX8GCR: DXOEO Position */ +#define DDRPHY_DX8GCR_DXOEO_Msk (0x3ul << DDRPHY_DX8GCR_DXOEO_Pos) /*!< DDRPHY_T::DX8GCR: DXOEO Mask */ + +#define DDRPHY_DX8GCR_PLLRST_Pos (16) /*!< DDRPHY_T::DX8GCR: PLLRST Position */ +#define DDRPHY_DX8GCR_PLLRST_Msk (0x1ul << DDRPHY_DX8GCR_PLLRST_Pos) /*!< DDRPHY_T::DX8GCR: PLLRST Mask */ + +#define DDRPHY_DX8GCR_PLLPD_Pos (17) /*!< DDRPHY_T::DX8GCR: PLLPD Position */ +#define DDRPHY_DX8GCR_PLLPD_Msk (0x1ul << DDRPHY_DX8GCR_PLLPD_Pos) /*!< DDRPHY_T::DX8GCR: PLLPD Mask */ + +#define DDRPHY_DX8GCR_GSHIFT_Pos (18) /*!< DDRPHY_T::DX8GCR: GSHIFT Position */ +#define DDRPHY_DX8GCR_GSHIFT_Msk (0x1ul << DDRPHY_DX8GCR_GSHIFT_Pos) /*!< DDRPHY_T::DX8GCR: GSHIFT Mask */ + +#define DDRPHY_DX8GCR_PLLBYP_Pos (19) /*!< DDRPHY_T::DX8GCR: PLLBYP Position */ +#define DDRPHY_DX8GCR_PLLBYP_Msk (0x1ul << DDRPHY_DX8GCR_PLLBYP_Pos) /*!< DDRPHY_T::DX8GCR: PLLBYP Mask */ + +#define DDRPHY_DX8GCR_WLRKEN_Pos (26) /*!< DDRPHY_T::DX8GCR: WLRKEN Position */ +#define DDRPHY_DX8GCR_WLRKEN_Msk (0xful << DDRPHY_DX8GCR_WLRKEN_Pos) /*!< DDRPHY_T::DX8GCR: WLRKEN Mask */ + +#define DDRPHY_DX8GCR_MDLEN_Pos (30) /*!< DDRPHY_T::DX8GCR: MDLEN Position */ +#define DDRPHY_DX8GCR_MDLEN_Msk (0x1ul << DDRPHY_DX8GCR_MDLEN_Pos) /*!< DDRPHY_T::DX8GCR: MDLEN Mask */ + +#define DDRPHY_DX8GCR_CALBYP_Pos (31) /*!< DDRPHY_T::DX8GCR: CALBYP Position */ +#define DDRPHY_DX8GCR_CALBYP_Msk (0x1ul << DDRPHY_DX8GCR_CALBYP_Pos) /*!< DDRPHY_T::DX8GCR: CALBYP Mask */ + +#define DDRPHY_DX8GSR0_WDQCAL_Pos (0) /*!< DDRPHY_T::DX8GSR0: WDQCAL Position */ +#define DDRPHY_DX8GSR0_WDQCAL_Msk (0x1ul << DDRPHY_DX8GSR0_WDQCAL_Pos) /*!< DDRPHY_T::DX8GSR0: WDQCAL Mask */ + +#define DDRPHY_DX8GSR0_RDQSCAL_Pos (1) /*!< DDRPHY_T::DX8GSR0: RDQSCAL Position */ +#define DDRPHY_DX8GSR0_RDQSCAL_Msk (0x1ul << DDRPHY_DX8GSR0_RDQSCAL_Pos) /*!< DDRPHY_T::DX8GSR0: RDQSCAL Mask */ + +#define DDRPHY_DX8GSR0_RDQSNCAL_Pos (2) /*!< DDRPHY_T::DX8GSR0: RDQSNCAL Position */ +#define DDRPHY_DX8GSR0_RDQSNCAL_Msk (0x1ul << DDRPHY_DX8GSR0_RDQSNCAL_Pos) /*!< DDRPHY_T::DX8GSR0: RDQSNCAL Mask */ + +#define DDRPHY_DX8GSR0_GDQSCAL_Pos (3) /*!< DDRPHY_T::DX8GSR0: GDQSCAL Position */ +#define DDRPHY_DX8GSR0_GDQSCAL_Msk (0x1ul << DDRPHY_DX8GSR0_GDQSCAL_Pos) /*!< DDRPHY_T::DX8GSR0: GDQSCAL Mask */ + +#define DDRPHY_DX8GSR0_WLCAL_Pos (4) /*!< DDRPHY_T::DX8GSR0: WLCAL Position */ +#define DDRPHY_DX8GSR0_WLCAL_Msk (0x1ul << DDRPHY_DX8GSR0_WLCAL_Pos) /*!< DDRPHY_T::DX8GSR0: WLCAL Mask */ + +#define DDRPHY_DX8GSR0_WLDONE_Pos (5) /*!< DDRPHY_T::DX8GSR0: WLDONE Position */ +#define DDRPHY_DX8GSR0_WLDONE_Msk (0x1ul << DDRPHY_DX8GSR0_WLDONE_Pos) /*!< DDRPHY_T::DX8GSR0: WLDONE Mask */ + +#define DDRPHY_DX8GSR0_WLERR_Pos (6) /*!< DDRPHY_T::DX8GSR0: WLERR Position */ +#define DDRPHY_DX8GSR0_WLERR_Msk (0x1ul << DDRPHY_DX8GSR0_WLERR_Pos) /*!< DDRPHY_T::DX8GSR0: WLERR Mask */ + +#define DDRPHY_DX8GSR0_WLPRD_Pos (7) /*!< DDRPHY_T::DX8GSR0: WLPRD Position */ +#define DDRPHY_DX8GSR0_WLPRD_Msk (0xfful << DDRPHY_DX8GSR0_WLPRD_Pos) /*!< DDRPHY_T::DX8GSR0: WLPRD Mask */ + +#define DDRPHY_DX8GSR0_DPLOCK_Pos (15) /*!< DDRPHY_T::DX8GSR0: DPLOCK Position */ +#define DDRPHY_DX8GSR0_DPLOCK_Msk (0x1ul << DDRPHY_DX8GSR0_DPLOCK_Pos) /*!< DDRPHY_T::DX8GSR0: DPLOCK Mask */ + +#define DDRPHY_DX8GSR0_GDQSPRD_Pos (16) /*!< DDRPHY_T::DX8GSR0: GDQSPRD Position */ +#define DDRPHY_DX8GSR0_GDQSPRD_Msk (0xfful << DDRPHY_DX8GSR0_GDQSPRD_Pos) /*!< DDRPHY_T::DX8GSR0: GDQSPRD Mask */ + +#define DDRPHY_DX8GSR0_QSGERR_Pos (24) /*!< DDRPHY_T::DX8GSR0: QSGERR Position */ +#define DDRPHY_DX8GSR0_QSGERR_Msk (0xful << DDRPHY_DX8GSR0_QSGERR_Pos) /*!< DDRPHY_T::DX8GSR0: QSGERR Mask */ + +#define DDRPHY_DX8GSR0_WLDQ_Pos (28) /*!< DDRPHY_T::DX8GSR0: WLDQ Position */ +#define DDRPHY_DX8GSR0_WLDQ_Msk (0x1ul << DDRPHY_DX8GSR0_WLDQ_Pos) /*!< DDRPHY_T::DX8GSR0: WLDQ Mask */ + +#define DDRPHY_DX8GSR1_DLTDONE_Pos (0) /*!< DDRPHY_T::DX8GSR1: DLTDONE Position */ +#define DDRPHY_DX8GSR1_DLTDONE_Msk (0x1ul << DDRPHY_DX8GSR1_DLTDONE_Pos) /*!< DDRPHY_T::DX8GSR1: DLTDONE Mask */ + +#define DDRPHY_DX8GSR1_DLTCODE_Pos (1) /*!< DDRPHY_T::DX8GSR1: DLTCODE Position */ +#define DDRPHY_DX8GSR1_DLTCODE_Msk (0xfffffful << DDRPHY_DX8GSR1_DLTCODE_Pos) /*!< DDRPHY_T::DX8GSR1: DLTCODE Mask */ + +#define DDRPHY_DX8BDLR0_DQ0WBD_Pos (0) /*!< DDRPHY_T::DX8BDLR0: DQ0WBD Position */ +#define DDRPHY_DX8BDLR0_DQ0WBD_Msk (0x3ful << DDRPHY_DX8BDLR0_DQ0WBD_Pos) /*!< DDRPHY_T::DX8BDLR0: DQ0WBD Mask */ + +#define DDRPHY_DX8BDLR0_DQ1WBD_Pos (6) /*!< DDRPHY_T::DX8BDLR0: DQ1WBD Position */ +#define DDRPHY_DX8BDLR0_DQ1WBD_Msk (0x3ful << DDRPHY_DX8BDLR0_DQ1WBD_Pos) /*!< DDRPHY_T::DX8BDLR0: DQ1WBD Mask */ + +#define DDRPHY_DX8BDLR0_DQ2WBD_Pos (12) /*!< DDRPHY_T::DX8BDLR0: DQ2WBD Position */ +#define DDRPHY_DX8BDLR0_DQ2WBD_Msk (0x3ful << DDRPHY_DX8BDLR0_DQ2WBD_Pos) /*!< DDRPHY_T::DX8BDLR0: DQ2WBD Mask */ + +#define DDRPHY_DX8BDLR0_DQ3WBD_Pos (18) /*!< DDRPHY_T::DX8BDLR0: DQ3WBD Position */ +#define DDRPHY_DX8BDLR0_DQ3WBD_Msk (0x3ful << DDRPHY_DX8BDLR0_DQ3WBD_Pos) /*!< DDRPHY_T::DX8BDLR0: DQ3WBD Mask */ + +#define DDRPHY_DX8BDLR0_DQ4WBD_Pos (24) /*!< DDRPHY_T::DX8BDLR0: DQ4WBD Position */ +#define DDRPHY_DX8BDLR0_DQ4WBD_Msk (0x3ful << DDRPHY_DX8BDLR0_DQ4WBD_Pos) /*!< DDRPHY_T::DX8BDLR0: DQ4WBD Mask */ + +#define DDRPHY_DX8BDLR1_DQ5WBD_Pos (0) /*!< DDRPHY_T::DX8BDLR1: DQ5WBD Position */ +#define DDRPHY_DX8BDLR1_DQ5WBD_Msk (0x3ful << DDRPHY_DX8BDLR1_DQ5WBD_Pos) /*!< DDRPHY_T::DX8BDLR1: DQ5WBD Mask */ + +#define DDRPHY_DX8BDLR1_DQ6WBD_Pos (6) /*!< DDRPHY_T::DX8BDLR1: DQ6WBD Position */ +#define DDRPHY_DX8BDLR1_DQ6WBD_Msk (0x3ful << DDRPHY_DX8BDLR1_DQ6WBD_Pos) /*!< DDRPHY_T::DX8BDLR1: DQ6WBD Mask */ + +#define DDRPHY_DX8BDLR1_DQ7WBD_Pos (12) /*!< DDRPHY_T::DX8BDLR1: DQ7WBD Position */ +#define DDRPHY_DX8BDLR1_DQ7WBD_Msk (0x3ful << DDRPHY_DX8BDLR1_DQ7WBD_Pos) /*!< DDRPHY_T::DX8BDLR1: DQ7WBD Mask */ + +#define DDRPHY_DX8BDLR1_DMWBD_Pos (18) /*!< DDRPHY_T::DX8BDLR1: DMWBD Position */ +#define DDRPHY_DX8BDLR1_DMWBD_Msk (0x3ful << DDRPHY_DX8BDLR1_DMWBD_Pos) /*!< DDRPHY_T::DX8BDLR1: DMWBD Mask */ + +#define DDRPHY_DX8BDLR1_DSWBD_Pos (24) /*!< DDRPHY_T::DX8BDLR1: DSWBD Position */ +#define DDRPHY_DX8BDLR1_DSWBD_Msk (0x3ful << DDRPHY_DX8BDLR1_DSWBD_Pos) /*!< DDRPHY_T::DX8BDLR1: DSWBD Mask */ + +#define DDRPHY_DX8BDLR2_DSOEBD_Pos (0) /*!< DDRPHY_T::DX8BDLR2: DSOEBD Position */ +#define DDRPHY_DX8BDLR2_DSOEBD_Msk (0x3ful << DDRPHY_DX8BDLR2_DSOEBD_Pos) /*!< DDRPHY_T::DX8BDLR2: DSOEBD Mask */ + +#define DDRPHY_DX8BDLR2_DQOEBD_Pos (6) /*!< DDRPHY_T::DX8BDLR2: DQOEBD Position */ +#define DDRPHY_DX8BDLR2_DQOEBD_Msk (0x3ful << DDRPHY_DX8BDLR2_DQOEBD_Pos) /*!< DDRPHY_T::DX8BDLR2: DQOEBD Mask */ + +#define DDRPHY_DX8BDLR2_DSRBD_Pos (12) /*!< DDRPHY_T::DX8BDLR2: DSRBD Position */ +#define DDRPHY_DX8BDLR2_DSRBD_Msk (0x3ful << DDRPHY_DX8BDLR2_DSRBD_Pos) /*!< DDRPHY_T::DX8BDLR2: DSRBD Mask */ + +#define DDRPHY_DX8BDLR2_DSNRBD_Pos (18) /*!< DDRPHY_T::DX8BDLR2: DSNRBD Position */ +#define DDRPHY_DX8BDLR2_DSNRBD_Msk (0x3ful << DDRPHY_DX8BDLR2_DSNRBD_Pos) /*!< DDRPHY_T::DX8BDLR2: DSNRBD Mask */ + +#define DDRPHY_DX8BDLR3_DQ0RBD_Pos (0) /*!< DDRPHY_T::DX8BDLR3: DQ0RBD Position */ +#define DDRPHY_DX8BDLR3_DQ0RBD_Msk (0x3ful << DDRPHY_DX8BDLR3_DQ0RBD_Pos) /*!< DDRPHY_T::DX8BDLR3: DQ0RBD Mask */ + +#define DDRPHY_DX8BDLR3_DQ1RBD_Pos (6) /*!< DDRPHY_T::DX8BDLR3: DQ1RBD Position */ +#define DDRPHY_DX8BDLR3_DQ1RBD_Msk (0x3ful << DDRPHY_DX8BDLR3_DQ1RBD_Pos) /*!< DDRPHY_T::DX8BDLR3: DQ1RBD Mask */ + +#define DDRPHY_DX8BDLR3_DQ2RBD_Pos (12) /*!< DDRPHY_T::DX8BDLR3: DQ2RBD Position */ +#define DDRPHY_DX8BDLR3_DQ2RBD_Msk (0x3ful << DDRPHY_DX8BDLR3_DQ2RBD_Pos) /*!< DDRPHY_T::DX8BDLR3: DQ2RBD Mask */ + +#define DDRPHY_DX8BDLR3_DQ3RBD_Pos (18) /*!< DDRPHY_T::DX8BDLR3: DQ3RBD Position */ +#define DDRPHY_DX8BDLR3_DQ3RBD_Msk (0x3ful << DDRPHY_DX8BDLR3_DQ3RBD_Pos) /*!< DDRPHY_T::DX8BDLR3: DQ3RBD Mask */ + +#define DDRPHY_DX8BDLR3_DQ4RBD_Pos (24) /*!< DDRPHY_T::DX8BDLR3: DQ4RBD Position */ +#define DDRPHY_DX8BDLR3_DQ4RBD_Msk (0x3ful << DDRPHY_DX8BDLR3_DQ4RBD_Pos) /*!< DDRPHY_T::DX8BDLR3: DQ4RBD Mask */ + +#define DDRPHY_DX8BDLR4_DQ5RBD_Pos (0) /*!< DDRPHY_T::DX8BDLR4: DQ5RBD Position */ +#define DDRPHY_DX8BDLR4_DQ5RBD_Msk (0x3ful << DDRPHY_DX8BDLR4_DQ5RBD_Pos) /*!< DDRPHY_T::DX8BDLR4: DQ5RBD Mask */ + +#define DDRPHY_DX8BDLR4_DQ6RBD_Pos (6) /*!< DDRPHY_T::DX8BDLR4: DQ6RBD Position */ +#define DDRPHY_DX8BDLR4_DQ6RBD_Msk (0x3ful << DDRPHY_DX8BDLR4_DQ6RBD_Pos) /*!< DDRPHY_T::DX8BDLR4: DQ6RBD Mask */ + +#define DDRPHY_DX8BDLR4_DQ7RBD_Pos (12) /*!< DDRPHY_T::DX8BDLR4: DQ7RBD Position */ +#define DDRPHY_DX8BDLR4_DQ7RBD_Msk (0x3ful << DDRPHY_DX8BDLR4_DQ7RBD_Pos) /*!< DDRPHY_T::DX8BDLR4: DQ7RBD Mask */ + +#define DDRPHY_DX8BDLR4_DMRBD_Pos (18) /*!< DDRPHY_T::DX8BDLR4: DMRBD Position */ +#define DDRPHY_DX8BDLR4_DMRBD_Msk (0x3ful << DDRPHY_DX8BDLR4_DMRBD_Pos) /*!< DDRPHY_T::DX8BDLR4: DMRBD Mask */ + +#define DDRPHY_DX8LCDLR0_R0WLD_Pos (0) /*!< DDRPHY_T::DX8LCDLR0: R0WLD Position */ +#define DDRPHY_DX8LCDLR0_R0WLD_Msk (0xfful << DDRPHY_DX8LCDLR0_R0WLD_Pos) /*!< DDRPHY_T::DX8LCDLR0: R0WLD Mask */ + +#define DDRPHY_DX8LCDLR0_R1WLD_Pos (8) /*!< DDRPHY_T::DX8LCDLR0: R1WLD Position */ +#define DDRPHY_DX8LCDLR0_R1WLD_Msk (0xfful << DDRPHY_DX8LCDLR0_R1WLD_Pos) /*!< DDRPHY_T::DX8LCDLR0: R1WLD Mask */ + +#define DDRPHY_DX8LCDLR0_R2WLD_Pos (16) /*!< DDRPHY_T::DX8LCDLR0: R2WLD Position */ +#define DDRPHY_DX8LCDLR0_R2WLD_Msk (0xfful << DDRPHY_DX8LCDLR0_R2WLD_Pos) /*!< DDRPHY_T::DX8LCDLR0: R2WLD Mask */ + +#define DDRPHY_DX8LCDLR0_R3WLD_Pos (24) /*!< DDRPHY_T::DX8LCDLR0: R3WLD Position */ +#define DDRPHY_DX8LCDLR0_R3WLD_Msk (0xfful << DDRPHY_DX8LCDLR0_R3WLD_Pos) /*!< DDRPHY_T::DX8LCDLR0: R3WLD Mask */ + +#define DDRPHY_DX8LCDLR1_WDQD_Pos (0) /*!< DDRPHY_T::DX8LCDLR1: WDQD Position */ +#define DDRPHY_DX8LCDLR1_WDQD_Msk (0xfful << DDRPHY_DX8LCDLR1_WDQD_Pos) /*!< DDRPHY_T::DX8LCDLR1: WDQD Mask */ + +#define DDRPHY_DX8LCDLR1_RDQSD_Pos (8) /*!< DDRPHY_T::DX8LCDLR1: RDQSD Position */ +#define DDRPHY_DX8LCDLR1_RDQSD_Msk (0xfful << DDRPHY_DX8LCDLR1_RDQSD_Pos) /*!< DDRPHY_T::DX8LCDLR1: RDQSD Mask */ + +#define DDRPHY_DX8LCDLR1_RDQSND_Pos (16) /*!< DDRPHY_T::DX8LCDLR1: RDQSND Position */ +#define DDRPHY_DX8LCDLR1_RDQSND_Msk (0xfful << DDRPHY_DX8LCDLR1_RDQSND_Pos) /*!< DDRPHY_T::DX8LCDLR1: RDQSND Mask */ + +#define DDRPHY_DX8LCDLR2_R0DQSGD_Pos (0) /*!< DDRPHY_T::DX8LCDLR2: R0DQSGD Position */ +#define DDRPHY_DX8LCDLR2_R0DQSGD_Msk (0xfful << DDRPHY_DX8LCDLR2_R0DQSGD_Pos) /*!< DDRPHY_T::DX8LCDLR2: R0DQSGD Mask */ + +#define DDRPHY_DX8LCDLR2_R1DQSGD_Pos (8) /*!< DDRPHY_T::DX8LCDLR2: R1DQSGD Position */ +#define DDRPHY_DX8LCDLR2_R1DQSGD_Msk (0xfful << DDRPHY_DX8LCDLR2_R1DQSGD_Pos) /*!< DDRPHY_T::DX8LCDLR2: R1DQSGD Mask */ + +#define DDRPHY_DX8LCDLR2_R2DQSGD_Pos (16) /*!< DDRPHY_T::DX8LCDLR2: R2DQSGD Position */ +#define DDRPHY_DX8LCDLR2_R2DQSGD_Msk (0xfful << DDRPHY_DX8LCDLR2_R2DQSGD_Pos) /*!< DDRPHY_T::DX8LCDLR2: R2DQSGD Mask */ + +#define DDRPHY_DX8LCDLR2_R3DQSGD_Pos (24) /*!< DDRPHY_T::DX8LCDLR2: R3DQSGD Position */ +#define DDRPHY_DX8LCDLR2_R3DQSGD_Msk (0xfful << DDRPHY_DX8LCDLR2_R3DQSGD_Pos) /*!< DDRPHY_T::DX8LCDLR2: R3DQSGD Mask */ + +#define DDRPHY_DX8MDLR_IPRD_Pos (0) /*!< DDRPHY_T::DX8MDLR: IPRD Position */ +#define DDRPHY_DX8MDLR_IPRD_Msk (0xfful << DDRPHY_DX8MDLR_IPRD_Pos) /*!< DDRPHY_T::DX8MDLR: IPRD Mask */ + +#define DDRPHY_DX8MDLR_TPRD_Pos (8) /*!< DDRPHY_T::DX8MDLR: TPRD Position */ +#define DDRPHY_DX8MDLR_TPRD_Msk (0xfful << DDRPHY_DX8MDLR_TPRD_Pos) /*!< DDRPHY_T::DX8MDLR: TPRD Mask */ + +#define DDRPHY_DX8MDLR_MDLD_Pos (16) /*!< DDRPHY_T::DX8MDLR: MDLD Position */ +#define DDRPHY_DX8MDLR_MDLD_Msk (0xfful << DDRPHY_DX8MDLR_MDLD_Pos) /*!< DDRPHY_T::DX8MDLR: MDLD Mask */ + +#define DDRPHY_DX8GTR_R0DGSL_Pos (0) /*!< DDRPHY_T::DX8GTR: R0DGSL Position */ +#define DDRPHY_DX8GTR_R0DGSL_Msk (0x7ul << DDRPHY_DX8GTR_R0DGSL_Pos) /*!< DDRPHY_T::DX8GTR: R0DGSL Mask */ + +#define DDRPHY_DX8GTR_R1DGSL_Pos (3) /*!< DDRPHY_T::DX8GTR: R1DGSL Position */ +#define DDRPHY_DX8GTR_R1DGSL_Msk (0x7ul << DDRPHY_DX8GTR_R1DGSL_Pos) /*!< DDRPHY_T::DX8GTR: R1DGSL Mask */ + +#define DDRPHY_DX8GTR_R2DGSL_Pos (6) /*!< DDRPHY_T::DX8GTR: R2DGSL Position */ +#define DDRPHY_DX8GTR_R2DGSL_Msk (0x7ul << DDRPHY_DX8GTR_R2DGSL_Pos) /*!< DDRPHY_T::DX8GTR: R2DGSL Mask */ + +#define DDRPHY_DX8GTR_R3DGSL_Pos (9) /*!< DDRPHY_T::DX8GTR: R3DGSL Position */ +#define DDRPHY_DX8GTR_R3DGSL_Msk (0x7ul << DDRPHY_DX8GTR_R3DGSL_Pos) /*!< DDRPHY_T::DX8GTR: R3DGSL Mask */ + +#define DDRPHY_DX8GTR_R0WLSL_Pos (12) /*!< DDRPHY_T::DX8GTR: R0WLSL Position */ +#define DDRPHY_DX8GTR_R0WLSL_Msk (0x3ul << DDRPHY_DX8GTR_R0WLSL_Pos) /*!< DDRPHY_T::DX8GTR: R0WLSL Mask */ + +#define DDRPHY_DX8GTR_R1WLSL_Pos (14) /*!< DDRPHY_T::DX8GTR: R1WLSL Position */ +#define DDRPHY_DX8GTR_R1WLSL_Msk (0x3ul << DDRPHY_DX8GTR_R1WLSL_Pos) /*!< DDRPHY_T::DX8GTR: R1WLSL Mask */ + +#define DDRPHY_DX8GTR_R2WLSL_Pos (16) /*!< DDRPHY_T::DX8GTR: R2WLSL Position */ +#define DDRPHY_DX8GTR_R2WLSL_Msk (0x3ul << DDRPHY_DX8GTR_R2WLSL_Pos) /*!< DDRPHY_T::DX8GTR: R2WLSL Mask */ + +#define DDRPHY_DX8GTR_R3WLSL_Pos (18) /*!< DDRPHY_T::DX8GTR: R3WLSL Position */ +#define DDRPHY_DX8GTR_R3WLSL_Msk (0x3ul << DDRPHY_DX8GTR_R3WLSL_Pos) /*!< DDRPHY_T::DX8GTR: R3WLSL Mask */ + +#define DDRPHY_DX8GSR2_RDERR_Pos (0) /*!< DDRPHY_T::DX8GSR2: RDERR Position */ +#define DDRPHY_DX8GSR2_RDERR_Msk (0x1ul << DDRPHY_DX8GSR2_RDERR_Pos) /*!< DDRPHY_T::DX8GSR2: RDERR Mask */ + +#define DDRPHY_DX8GSR2_RDWN_Pos (1) /*!< DDRPHY_T::DX8GSR2: RDWN Position */ +#define DDRPHY_DX8GSR2_RDWN_Msk (0x1ul << DDRPHY_DX8GSR2_RDWN_Pos) /*!< DDRPHY_T::DX8GSR2: RDWN Mask */ + +#define DDRPHY_DX8GSR2_WDERR_Pos (2) /*!< DDRPHY_T::DX8GSR2: WDERR Position */ +#define DDRPHY_DX8GSR2_WDERR_Msk (0x1ul << DDRPHY_DX8GSR2_WDERR_Pos) /*!< DDRPHY_T::DX8GSR2: WDERR Mask */ + +#define DDRPHY_DX8GSR2_WDWN_Pos (3) /*!< DDRPHY_T::DX8GSR2: WDWN Position */ +#define DDRPHY_DX8GSR2_WDWN_Msk (0x1ul << DDRPHY_DX8GSR2_WDWN_Pos) /*!< DDRPHY_T::DX8GSR2: WDWN Mask */ + +#define DDRPHY_DX8GSR2_REERR_Pos (4) /*!< DDRPHY_T::DX8GSR2: REERR Position */ +#define DDRPHY_DX8GSR2_REERR_Msk (0x1ul << DDRPHY_DX8GSR2_REERR_Pos) /*!< DDRPHY_T::DX8GSR2: REERR Mask */ + +#define DDRPHY_DX8GSR2_REWN_Pos (5) /*!< DDRPHY_T::DX8GSR2: REWN Position */ +#define DDRPHY_DX8GSR2_REWN_Msk (0x1ul << DDRPHY_DX8GSR2_REWN_Pos) /*!< DDRPHY_T::DX8GSR2: REWN Mask */ + +#define DDRPHY_DX8GSR2_WEERR_Pos (6) /*!< DDRPHY_T::DX8GSR2: WEERR Position */ +#define DDRPHY_DX8GSR2_WEERR_Msk (0x1ul << DDRPHY_DX8GSR2_WEERR_Pos) /*!< DDRPHY_T::DX8GSR2: WEERR Mask */ + +#define DDRPHY_DX8GSR2_WEWN_Pos (7) /*!< DDRPHY_T::DX8GSR2: WEWN Position */ +#define DDRPHY_DX8GSR2_WEWN_Msk (0x1ul << DDRPHY_DX8GSR2_WEWN_Pos) /*!< DDRPHY_T::DX8GSR2: WEWN Mask */ + +#define DDRPHY_DX8GSR2_ESTAT_Pos (8) /*!< DDRPHY_T::DX8GSR2: ESTAT Position */ +#define DDRPHY_DX8GSR2_ESTAT_Msk (0xful << DDRPHY_DX8GSR2_ESTAT_Pos) /*!< DDRPHY_T::DX8GSR2: ESTAT Mask */ + +/**@}*/ /* DDRPHY_CONST */ +/**@}*/ /* end of DDRPHY register group */ + + +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __DDR32PHY_REG_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/disp_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/disp_reg.h new file mode 100644 index 0000000000..ece14b5249 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/disp_reg.h @@ -0,0 +1,1432 @@ +/**************************************************************************//** +* @file disp_reg.h +* @brief LCD Display Controller driver header file +* +* SPDX-License-Identifier: Apache-2.0 +* @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#ifndef __DISP_REG_H__ +#define __DISP_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup DISP LCD Display Controller(DISP) + Memory Mapped Structure for DISP Controller +@{ */ + +typedef struct +{ + /** + * @var DISP_T::AQHiClockControl + * Offset: 0x00 Clock Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |CLKDC_DIS |Disable DC clock. + * |[8:2] |FSCALE_VAL|Core clock frequency scale value. + * |[9] |FSCALE_CMD_LOAD|Core clock frequency scale value enable When writing a 1 to this bit, it updates the frequency scale factor with the value FSCALE_VAL[6:0] The bit must be set back to 0 after that If this bit is set and FSCALE_VAL=0 (an invalid combination), the HREADYOUT output signal will get stuck to 0. + * |[10] |DISABLE_RAM_CLOCK_GATING|Disables clock gating for rams. + * |[11] |DISABLE_DEBUG_REGISTERS|Disable debug registers If this bit is 1, debug registers are clock gated(reset=1). + * |[12] |SOFT_RESET|Soft resets the IP. + * |[13] |DISABLE_RAM_POWER_OPTIMIZATION|Disables ram power optimization. + * @var DISP_T::FrameBufferAddress0 + * Offset: 0x1400 Framebuffer Start Address Register. Starting address of the framebuffer. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[30:0] |ADDRESS |Framebuffer Start Address + * |[31] |TYPE |0 => SYSTEM 1 => VIRTUAL_SYSTEM + * @var DISP_T::FrameBufferStride0 + * Offset: 0x1408 Framebuffer Stride Register. Stride of the framebuffer in bytes. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[16:0] |STRIDE |Number of bytes from start of one line to next line. + * @var DISP_T::DisplayDitherConfig0 + * Offset: 0x1410 Display Dither Configuration Register. Configuration register for dithering. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31] |ENABLE |Enabling dithering allows R8G8B8 modes to show better on panels with less bits- per-pixel Note: This field is double buffered. + * @var DISP_T::PanelConfig0 + * Offset: 0x1418 Panel Configuration Register. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DE |Data Enable enabled/disabled 0 => DISABLED 1 => ENABLED + * |[1] |DE_POLARITY|Data Enable polarity 0 => POSITIVE 1 => NEGATIVE + * |[4] |DATA_ENABLE|Data enabled/disabled 0 => DISABLED 1 => ENABLED + * |[5] |DATA_POLARITY|Data polarity 0 => POSITIVE 1 => NEGATIVE + * |[8] |CLOCK |Clock enabled/disabled 0 => DISABLED 1 => ENABLED + * |[9] |CLOCK_POLARITY|Clock polarity 0 => POSITIVE 1 => NEGATIVE + * @var DISP_T::DisplayDitherTableLow0 + * Offset: 0x1420 Display Dither Table Register. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |Y0_X0 |Dither threshold value for x,y=0,0. + * |[7:4] |Y0_X1 |Dither threshold value for x,y=1,0. + * |[11:8] |Y0_X2 |Dither threshold value for x,y=2,0. + * |[15:12] |Y0_X3 |Dither threshold value for x,y=3,0. + * |[19:16] |Y1_X0 |Dither threshold value for x,y=0,1. + * |[23:20] |Y1_X1 |Dither threshold value for x,y=1,1. + * |[27:24] |Y1_X2 |Dither threshold value for x,y=2,1. + * |[31:28] |Y1_X3 |Dither threshold value for x,y=3,1. + * @var DISP_T::DisplayDitherTableHigh0 + * Offset: 0x1428 Display Dither Table Register. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |Y2_X0 |Dither threshold value for x,y=0,2. + * |[7:4] |Y2_X1 |Dither threshold value for x,y=1,2. + * |[11:8] |Y2_X2 |Dither threshold value for x,y=2,2. + * |[15:12] |Y2_X3 |Dither threshold value for x,y=3,2. + * |[19:16] |Y3_X0 |Dither threshold value for x,y=0,3. + * |[23:20] |Y3_X1 |Dither threshold value for x,y=1,3. + * |[27:24] |Y3_X2 |Dither threshold value for x,y=2,3. + * |[31:28] |Y3_X3 |Dither threshold value for x,y=3,3. + * @var DISP_T::HDisplay0 + * Offset: 0x1430 Horizontal Total and Display End Counter Register. Note: This register is double buffered + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[14:0] |DISPLAY_END|Visible number of horizontal pixels. + * |[30:16] |TOTAL |Total number of horizontal pixels. + * @var DISP_T::HSync0 + * Offset: 0x1438 Horizontal Sync Counter Register. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[14:0] |START |Start of horizontal sync pulse. + * |[29:15] |END |End of horizontal sync pulse. + * |[30] |PULSE |Horizontal sync pulse control 0 => DISABLED 1 => ENABLED + * |[31] |POLARITY |Polarity of the horizontal sync pulse 0 => POSITIVE 1 => NEGATIVE + * @var DISP_T::VDisplay0 + * Offset: 0x1440 Vertical Total and Display End Counter Register. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[14:0] |DISPLAY_END|Visible number of vertical lines + * |[30:16] |TOTAL |Total number of vertical lines. + * @var DISP_T::VSync0 + * Offset: 0x1448 Vertical Sync Counter Register. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[14:0] |START |Start of the vertical sync pulse + * |[29:15] |END |End of the vertical sync pulse. + * |[30] |PULSE |Vertical sync pulse control 0 => DISABLED 1 => ENABLED + * |[31] |POLARITY |Polarity of the vertical sync pulse 0 => POSITIVE 1 => NEGATIVE + * @var DISP_T::DisplayCurrentLocation0 + * Offset: 0x1450 Display Current Location Register. Current x,y location of display controller. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |X |Current X location. + * |[31:16] |Y |Current Y location. + * @var DISP_T::GammaIndex0 + * Offset: 0x1458 Gamma Table Index Register. Index into gamma table. See GammaData for more information. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |INDEX |Index into gamma table. + * @var DISP_T::GammaData0 + * Offset: 0x1460 Gamma Data Translation Register. Translation values for the gamma table. When this register gets written, the data gets stored in the gamma table at the index specified by the GammaIndex register. After the register is written, the index gets incremented. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |BLUE |Blue translation value. + * |[19:10] |GREEN |Green translation value. + * |[29:20] |READ |Red translation value. + * @var DISP_T::CursorConfig + * Offset: 0x1468 Cursor Configuration Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |FORMAT |Format of the cursor Note: This field is double buffered. + * |[4] |DISPLAY |Display Controller owning the cursor. + * |[12:8] |HOT_SPOT_Y|Vertical offset to cursor hotspot Note: This field is double buffered. + * |[20:16] |HOT_SPOT_X|Horizontal offset to cursor hotspot Note: This field is double buffered. + * @var DISP_T::CursorAddress + * Offset: 0x146C Cursor Address Register. Address of the cursor shape. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[30:0] |ADDRESS |Cursor Address + * |[31] |TYPE |0 => SYSTEM 1 => VIRTUAL_SYSTEM + * @var DISP_T::CursorLocation + * Offset: 0x1470 Cursor Location Register. Location of the cursor on the owning display. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[14:0] |X |X location of cursor's hotspot. + * |[30:16] |Y |Y location of cursor's hotspot. + * @var DISP_T::CursorBackground + * Offset: 0x1474 Masked Cursor Background Color Register. The background color for Masked cursors. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |Blue value. + * |[15:8] |GREEN |Green value. + * |[23:16] |RED |Red value. + * @var DISP_T::CursorForeground + * Offset: 0x1478 Masked Cursor Foreground Color Register. The foreground color for Masked cursors. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |Blue value. + * |[15:8] |GREEN |Green value. + * |[23:16] |RED |Red value. + * @var DISP_T::DisplayIntr + * Offset: 0x147C Display Interrupt Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DISP0 |Display0 interrupt(read only) + * @var DISP_T::DisplayIntrEnable + * Offset: 0x1480 Display Interrupt Enable Register. The interrupt enable register for display_0. Note: Interrupt enable for register DisplayIntr. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DISP0 |Display0 interrupt enable (read only) + * @var DISP_T::CursorModuleClockGatingControl + * Offset: 0x1484 Clock Gating Control for Cursor Register. Module level clock gating control for cursor. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DISABLE_MODULE_CLOCK_GATING_CURSOR|Disable module clock gating cursor 0 => ENABLED 1 => DISABLED + * @var DISP_T::GeneralConfig0 + * Offset: 0x14B0 General Miscellaneous Configuration Register. Misc option configuration. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |ENDIAN_CONTROL|Control endian swapping 0 => NO_SWAP 1 => SWAP_WORD 2 => SWAP_DWORD 3 => SWAP_DDWORD + * |[2] |STALL_OUTPUT_WHEN_UNDERFLOW|If enabled, when FIFO underflow happens, output is stalled 0 => DISABLED 1 => ENABLED + * |[3] |DISABLE_IDLE|Disable idle signal 0 => DISABLED 1 => ENABLED + * @var DISP_T::DpiConfig0 + * Offset: 0x14B8 DPI Configuration Register. The configuration register for DPI output. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |DPI_DATA_FORMAT|DPI interface data format Refer to DPI spec 'Interface color coding' for details 0 => D16CFG1 1 => D16CFG2 2 => D16CFG3 3 => D18CFG1 4 => D18CFG2 5 => D24 + * @var DISP_T::DebugCounterSelect0 + * Offset: 0x14D0 Debug Counter Selection Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |SELECT |Write a value to this field to pick up from 0~255 counters Then the counter will be on DebugCounterValue 00 => TOTAL_AXI_VIDEO_RD_REQ_CNT * video read request number * 01 => TOTAL_AXI_VIDEO_RD_LAST_CNT * video read return data last number * 02 => TOTAL_AXI_VIDEO_REQ_BURST_CNT * video number of 16 byte burst requests bytes * 03 => TOTAL_AXI_VIDEO_RD_BURST_CUNT * video number of 16 byte burst read return data * 04 => TOTAL_PIXEL_CNT * total pixels sent * 05 => TOTAL_FRAME_CNT * total frames sent * 06 => TOTAL_INPUT_DBI_CMD_CNT * total DBI input command * 07 => TOTAL_OUTPUT_DBI_CMD_CNT * total DBI output command * 08 => DEBUG_SIGNALS0 * debug signals * 09 => TOTAL_AXI_OVERLAY0_RD_REQ_CNT * overlay read request number * 0A => TOTAL_AXI_OVERLAY0_RD_LAST_CNT * overlay read return data last number * 0B => TOTAL_AXI_OVERLAY0_REQ_BURST_CNT * overlay number of 16 byte bursts of request bytes * 0C => TOTAL_AXI_OVERLAY0_RD_BURST_CUNT * overlay number of 16 bytes bursts of read return data * 0D => DEBUG_SIGNALS_FREE_POOL 0E => DEBUG_SIGNALS_INFOBUF_RD 0F => DEBUG_SIGNALS_INFOBUF_WR0 10 => DEBUG_SIGNALS_INFOBUF_WR1 11 => DEBUG_SIGNALS_INFOBUF_WR2 12 => DEBUG_SIGNALS_INFOBUF_WR3 13 => DEBUG_SIGNALS_OVERLAY0_FREE_POOL 14 => DEBUG_SIGNALS_OVERLAY0_INFOBUF_RD 15 => DEBUG_SIGNALS_OVERLAY0_INFOBUF_WR0 16 => DEBUG_SIGNALS_OVERLAY0_INFOBUF_WR1 17 => DEBUG_SIGNALS_OVERLAY0_INFOBUF_WR2 18 => DEBUG_SIGNALS_OVERLAY0_INFOBUF_WR3 19 => OVERLAY_BLEND_DEBUGSIGNALS 1A => CURSOR_BLEND_DEBUGSIGNALS 1C => VIDEO_WALKER_DEBUGSIGNALS_1 1D => VIDEO_WALKER_DEBUGSIGNALS_2 1E => VIDEO_WALKER_DEBUGSIGNALS_3 1F => OVERLAY_WALKER_DEBUGSIGNALS_1 20 => OVERLAY_WALKER_DEBUGSIGNALS_2 21 => OVERLAY_WALKER_DEBUGSIGNALS_3 FF => RESET_ALL_DEBUG_COUNTERS * Reset all debug counters *. + * @var DISP_T::DebugCounterValue0 + * Offset: 0x14D8 Debug Counter Value Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VALUE |Selected debug counter value + * @var DISP_T::FrameBufferColorKey0 + * Offset: 0x1508 Framebuffer Color Key Start Address Register. Start of color key range of framebuffer. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |BLUE value + * |[15:8] |GREEN |GREEN value + * |[23:16] |RED |RED value + * |[31:24] |ALPHA |ALPHA value + * @var DISP_T::FrameBufferColorKeyHigh0 + * Offset: 0x1510 Framebuffer Color Key End Address Register. End of color key range of framebuffer. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |BLUE value + * |[15:8] |GREEN |GREEN value + * |[23:16] |RED |RED value + * |[31:24] |ALPHA |ALPHA value + * @var DISP_T::FrameBufferConfig0 + * Offset: 0x1518 Framebuffer Configuration Register. Framebuffer attribute configuration. Note: This register is double buffered. Some fields are double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |OUTPUT |When Output is enabled, pixels will be displayed When Output is disabled, all pixels will be black This allows a panel to have the correct timing but without any pixels Note: This field is double buffered 0 => DISABLED 1 => ENABLED. + * |[2] |GAMMA |When Gamma is enabled, the R, G, and B channels will be routed through the Gamma LUT to perform gamma correction Note: This field is double buffered 0 => DISABLED 1 => ENABLED. + * |[3] |VALID |The valid field defines whether we can copy a new set of registers at the next VBLANK or not This ensures a frame will always start with a valid working set if this register is programmed last, which reduces the need for SW to wait for the start of a VBLANK signal in order to ensure all states are loaded before the next VBLANK 0 => WORKING 1 => PENDING. + * |[4] |RESET |Enable reset for the display controller + * | | |0: See below for DPI + * | | |For DBI,this field should be 0 + * | | |1: RESET + * | | |Enable DPI timing, start a DPI transfer + * | | |Write 0 to this bit to reset the display controller, then configure the other registers and lastly write a 1 to this bit to let the display controller start + * | | |When the display controller starts, it begins at VBLANK_START, and all registers get flopped to the working set at VSYNC_END + * | | |Counters will be reset to the end of HSYNC and VSYNC + * | | |(Refer the Timing Diagram provided in the Hardware Feature document) + * | | |For DBI, do not write 1 to this field + * | | |Use DbiReset DBI_IF_LEVEL_RESET instead + * | | |This bit is WRITE ONLY. + * | | |1 => RESET. + * |[5] |UNDERFLOW |0: NO 1: YES When the display FIFO underflows, this bit gets set to one Reading this register will reset it back to zero This field is READ ONLY 0 => NO 1 => YES. + * |[6] |FLIP_IN_PROGRESS|0: NO 1: YES When the framebuffer address gets written to, this bit gets set to one It will be reset to zero at the start of the next VBLANK when the registers gets copied into the working set This field is (READ ONLY) 0 => NO 1 => YES. + * |[8] |CLEAR |When enabled, the pixel value of the framebuffer comes from FrameBufferClearValue; otherwise, the pixel value comes from memory 0 => DISABLED 1 => ENABLED + * |[10:9] |TRANSPARENCY|Transparency of framebuffer 0 => OPAQUE 1 => MASK 2 => KEY + * |[16:14] |YUV |YUV standard 1 => SELECT_709 * BT709 * 3 => SELECT_2020 * BT2020 * + * |[24:23] |SWIZZLE |0 => ARGB 1 => RGBA 2 => ABGR 3 => BGRA + * |[25] |UV_SWIZZLE|UV swizzle type + * |[31:26] |FORMAT |The format of the framebuffer 00 => X4R4G4B4 01 => A4R4G4B4 02 => X1R5G5B5 03 => A1R5G5B5 04 => R5G6B5 05 => X8R8G8B8 06 => A8R8G8B8 07 => YUY2 08 => UYVY 09 => INDEX8 0A => MONOCHROME 0F => YV12 10 => A8 11 => NV12 12 => NV16 13 => RG16 14 => R8 15 => NV12_10BIT 16 => A2R10G10B10 17 => NV16_10BIT 18 => INDEX1 19 => INDEX2 1A => INDEX4 1B => P010 1C => NV12_10BIT_L1 1D => NV16_10BIT_L1 + * @var DISP_T::FrameBufferBGColor0 + * Offset: 0x1528 Framebuffer Background Color Register. Background color used when a pixel from the framebuffer falls outside of the range of color key. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |BLUE value + * |[15:8] |GREEN |GREEN value + * |[23:16] |RED |RED value + * |[31:24] |ALPHA |ALPHA value + * @var DISP_T::FrameBufferUPlanarAddress0 + * Offset: 0x1530 Framebuffer Second Plane U Start Address Register. Starting address of the second planar (often the U plane) of the framebuffer if one exists. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[30:0] |ADDRESS |Framebuffer Second Plane U Start Address + * |[31] |TYPE |0 => SYSTEM 1 => VIRTUAL_SYSTEM + * @var DISP_T::FrameBufferVPlanarAddress0 + * Offset: 0x1538 Framebuffer Third Plane V Start Address Register. Starting address of the third planar (often the V plane) of the framebuffer if one exists. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[30:0] |ADDRESS |Framebuffer Third Plane V Start Address + * |[31] |TYPE |0 => SYSTEM 1 => VIRTUAL_SYSTEM + * @var DISP_T::OverlayConfig0 + * Offset: 0x1540 Overlay Configuration Register. Overlay attributes control. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |TRANSPARENCY|Transparency of the overlay 0 => OPAQUE 1 => MASK 2 => KEY + * |[7:5] |YUV |YUV standard + * | | |1 => SELECT_709 * BT709 * 3 => SELECT_2020 * BT2020 *. + * |[14:13] |SWIZZLE |0 => ARGB 1 => RGBA 2 => ABGR 3 => BGRA + * |[15] |UV_SWIZZLE|UV swizzle type. + * |[21:16] |FORMAT |The format of the overlay + * | | |00 => X4R4G4B4 01 => A4R4G4B4 02 => X1R5G5B5 03 => A1R5G5B5 04 => R5G6B5 05 => X8R8G8B8 06 => A8R8G8B8 07 => YUY2 08 => UYVY 09 => INDEX8 0A => MONOCHROME 0F => YV12 10 => A8 11 => NV12 12 => NV16 13 => RG16 14 => R8 15 => NV12_10BIT 16 => A2R10G10B10 17 => NV16_10BIT 18 => INDEX1 19 => INDEX2 1A => INDEX4 1B => P010 1C => NV12_10BIT_L1 1D => NV16_10BIT_L1. + * |[23] |UNDERFLOW |When the overlay FIFO underflows, this bit gets set to one Reading this register will reset it back to zero 0 => NO 1 => YES. + * |[24] |ENABLE |Enable this overlay layer 0 => DISABLE 1 => ENABLE + * |[25] |CLEAR |When enabled, the pixel value of the overlay comes from OverlayClearValue; otherwise the pixel value comes from memory 0 => DISABLED 1 => ENABLED + * @var DISP_T::OverlayAlphaBlendConfig0 + * Offset: 0x1580 Overlay Alpha Blending Configuration Register. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SRC_ALPHA_MODE|0 => NORMAL 1 => INVERSED + * |[1] |DISABLE_ALPHA_BLEND|0 => DISABLED 1 => ENABLED + * |[4:3] |SRC_GLOBAL_ALPHA_MODE|0 => NORMAL 1 => GLOBAL 2 => SCALED + * |[7:5] |SRC_BLENDING_MODE|0 => ZERO 1 => ONE 2 => NORMAL 3 => INVERSED 4 => COLOR 5 => COLOR_INVERSED 6 => SATURATED_ALPHA 7 => SATURATED_DEST_ALPHA + * |[8] |SRC_ALPHA_FACTOR|Src Blending factor is calculated from Src alpha 0 => DISABLED 1 => ENABLED + * |[9] |DST_ALPHA_MODE|0 => NORMAL 1 => INVERSED + * |[11:10] |DST_GLOBAL_ALPHA_MODE|0 => NORMAL 1 => GLOBAL 2 => SCALED + * |[14:12] |DST_BLENDING_MODE|0 => ZERO 1 => ONE 2 => NORMAL 3 => INVERSED 4 => COLOR 5 => COLOR_INVERSED 6 => SATURATED_ALPHA 7 => SATURATED_DEST_ALPHA + * |[15] |DST_ALPHA_FACTOR|Dst Blending factor is calculated from Dst alpha 0 => DISABLED 1 => ENABLED + * @var DISP_T::OverlayAddress0 + * Offset: 0x15C0 Overlay Start Address Register. Starting address of the overlay. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[30:0] |ADDRESS |Overlay Start Address + * |[31] |TYPE |0 => SYSTEM 1 => VIRTUAL_SYSTEM + * @var DISP_T::OverlayStride0 + * Offset: 0x1600 Overlay Stride Register. Stride of the overlay in bytes. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[16:0] |STRIDE |Number of bytes from the start of one line to next line. + * @var DISP_T::OverlayTL0 + * Offset: 0x1640 Overlay Origin Register. Top left coordinate of the panel pixel where the overlay should start. Be aware there is no panning inside the overlay. Note: This register is double buffered + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[14:0] |X |Left boundary of overlay window. + * |[29:15] |Y |Top boundary of overlay window. + * @var DISP_T::OverlayBR0 + * Offset: 0x1680 Overlay End Register. Bottom right coordinate of the panel pixel where the overlay should end. The border is inclusive. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[14:0] |X |Right boundary of overlay. + * |[29:15] |Y |Bottom boundary of overlay. + * @var DISP_T::OverlaySrcGlobalColor0 + * Offset: 0x16C0 Overlay Source Global Color Register. Color value used when alpha blending process is configured to use global color for source. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |BLUE value + * |[15:8] |GREEN |GREEN value + * |[23:16] |RED |RED value + * |[31:24] |ALPHA |ALPHA value + * @var DISP_T::OverlayDstGlobalColor0 + * Offset: 0x1700 Overlay Destination Global Color Register. Color value used when alpha blending process is configured to use global color for destination. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |BLUE value + * |[15:8] |GREEN |GREEN value + * |[23:16] |RED |RED value + * |[31:24] |ALPHA |ALPHA value + * @var DISP_T::OverlayColorKey0 + * Offset: 0x1740 Overlay Color Key Start Address Register. Start of color key range for overlay. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |BLUE value + * |[15:8] |GREEN |GREEN value + * |[23:16] |RED |RED value + * |[31:24] |ALPHA |ALPHA value + * @var DISP_T::OverlayColorKeyHigh0 + * Offset: 0x1780 Overlay Color Key End Address Register. End of color key range for overlay. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |BLUE value + * |[15:8] |GREEN |GREEN value + * |[23:16] |RED |RED value + * |[31:24] |ALPHA |ALPHA value + * @var DISP_T::OverlaySize0 + * Offset: 0x17C0 Overlay Window Size Register. Window size of the overlay buffer in memory - in pixels. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[14:0] |WIDTH |Overlay width + * |[29:15] |HEIGHT |Overlay height + * @var DISP_T::FrameBufferUStride0 + * Offset: 0x1800 Framebuffer Second Plane U Stride Register. Stride of the second planar (often the U plane) of the framebuffer if one exists. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[16:0] |STRIDE |Number of bytes from the start of one line to next line. + * @var DISP_T::FrameBufferVStride0 + * Offset: 0x1808 Framebuffer Third Plane V Stride Register. Stride of the third planar (often the V plane) of the framebuffer if one exists. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[16:0] |STRIDE |Number of bytes from the start of one line to next line. + * @var DISP_T::FrameBufferSize0 + * Offset: 0x1810 Framebuffer Size Register. Window size of the framebuffer in memory - in pixels. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[14:0] |WIDTH |Frame width + * |[29:15] |HEIGHT |Frame height + * @var DISP_T::IndexColorTableIndex0 + * Offset: 0x1818 Index Color Table Index Register. Index into index color table. See IndexColorTableData for more information. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |INDEX |index into index color table. + * @var DISP_T::IndexColorTableData0 + * Offset: 0x1820 Index Color Table Data Translation Register. Translation values for the index color table. When this register gets written, the data gets stored in the index color table at the index specified by the IndexColorTableIndex register. After the register is written, the index gets incremented. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |BLUE value + * |[15:8] |GREEN |GREEN value + * |[23:16] |RED |RED value + * |[31:24] |ALPHA |ALPHA value + * @var DISP_T::OverlayUPlanarAddress0 + * Offset: 0x1840 Overlay Second Plane U Start Address Register. Address of the second planar (often U plane) of the overlay if one exists. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[30:0] |ADDRESS |Overlay Third Plane V Start Address + * |[31] |TYPE |0 => SYSTEM 1 => VIRTUAL_SYSTEM + * @var DISP_T::OverlayVPlanarAddress0 + * Offset: 0x1880 Overlay Third Plane V Start Address Register. Address of the third planar (often V plane) of the overlay if one exists. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[30:0] |ADDRESS |Overlay Second Plane U Stride + * |[31] |TYPE |0 => SYSTEM 1 => VIRTUAL_SYSTEM + * @var DISP_T::OverlayUStride0 + * Offset: 0x18C0 Overlay Second Plane U Stride Register. Stride of the second planar of the overlay if one exists. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[16:0] |STRIDE |Number of bytes from the start of one line to next line. + * @var DISP_T::OverlayVStride0 + * Offset: 0x1900 Overlay Third Plane V Stride Register. Stride of the third planar of the overlay if one exists. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[16:0] |STRIDE |Number of bytes from start of one line to next line. + * @var DISP_T::OverlayClearValue0 + * Offset: 0x1940 Overlay Clear Value Register. Clear value used when OverlayConfig.Clear is enabled. Format is A8R8G8B8. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |BLUE value + * |[15:8] |GREEN |GREEN value + * |[23:16] |RED |RED value + * |[31:24] |ALPHA |ALPHA value + * @var DISP_T::OverlayIndexColorTableIndex0 + * Offset: 0x1980 Overlay Index Color Table Index Register. Index into overlay index color table. See OverlayIndexColorTableData for more information. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |INDEX |Index into index color table. + * @var DISP_T::OverlayIndexColorTableData0 + * Offset: 0x19C0 Index Color Table Data Translation Register. Translation values for the index color table of the overlay. When this register gets written, the data gets stored in the index color table at the index specified by the OverlayIndexColorTableIndex register. After the register is written, the index gets incremented. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |BLUE value + * |[15:8] |GREEN |GREEN value + * |[23:16] |RED |RED value + * |[31:24] |ALPHA |ALPHA value + * @var DISP_T::FrameBufferClearValue0 + * Offset: 0x1A18 Framebuffer Clear Value Register. Clear value used when FrameBufferConfig. Clear is enabled, format is A8R8G8B8. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |BLUE |BLUE value + * |[15:8] |GREEN |GREEN value + * |[23:16] |RED |RED value + * |[31:24] |ALPHA |ALPHA value + * @var DISP_T::ModuleClockGatingControl0 + * Offset: 0x1A28 Clock Gating Module Control Register. Module level clock gating control for video and overlay. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DISABLE_MODULE_CLOCK_GATING_VIDEO|Disable module clock gating video 0 => ENABLE 1 => DISABLE. + * |[1] |DISABLE_MODULE_CLOCK_GATING_OVERLAY0|Disable module clock gating overlay0 0 => ENABLE 1 => DISABLE. + * |[9] |DISABLE_MODULE_CLOCK_GATING_WB_FIFO|Disable module clock gating WBFifo 0 => ENABLE 1 => DISABLE. + * @var DISP_T::LatencyCounter0 + * Offset: 0x1A30 Latency Counter Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |COUNTER |Latency counter value which is used to judge whether latency is low or high. + * @var DISP_T::Qos0 + * Offset: 0x1A38 Quality of Service Latency Value Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |LOW |If latency low, will send low value. + * |[7:4] |HIGH |If latency high, will send high value. + * @var DISP_T::MpuIntfCmd0 + * Offset: 0x1C40 MPU Command Configuration Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |REG_DATA |Register address or register configured parameter. + * |[26:24] |READ_COUNT|0 is invalid value, one read operation returns 1 data at least, Max value is 5 It is designed to prepare 5 registers to save returned data. + * |[29] |START |HW generates a pulse while writing 1 to this field, then HW starts to send display data to the LCD. + * |[31:30] |CMD |0: Not a valid command, HW ignores the CMD/REGDATA/READCOUNT field Usage: only want to trigger HW, don't configure other fields 1: Write register by MPU interface 2: Write register parameter by MPU interface 3: Read register by MPU interface. + * @var DISP_T::MpuIntfReadPara00 + * Offset: 0x1C48 MPU Read Parameter0 Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[17:0] |DATA |Read register returned parameter0. + * @var DISP_T::MpuIntfReadPara10 + * Offset: 0x1C50 MPU Read Parameter1 Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[17:0] |DATA |Read register returned parameter1. + * @var DISP_T::MpuIntfReadPara20 + * Offset: 0x1C58 MPU Read Parameter2 Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[17:0] |DATA |Read register returned parameter2. + * @var DISP_T::MpuIntfReadPara30 + * Offset: 0x1C60 MPU Read Parameter3 Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[17:0] |DATA |Read register returned parameter3. + * @var DISP_T::MpuIntfReadPara40 + * Offset: 0x1C68 MPU Read Parameter4 Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[17:0] |DATA |Read register returned parameter4. + * @var DISP_T::MpuIntfReadStatus0 + * Offset: 0x1C70 MPU Read Parameter Status Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DATA |Returned parameter readiness + * | | |0 = UNREADY + * | | |The returned parameters of all read registers are not ready + * | | |1 = READY + * | | |The returned parameters of all read registers are ready. + * @var DISP_T::MpuIntfConfig0 + * Offset: 0x1C78 MPU Interface Configuration Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |REGISTER_MODE|0: 8 bit register mode, only MpuIntfCmd[7:0] are valid Only send 8 bits valid data each time to LCD by MPU Interface 1: 16 bit register mode, only MpuIntfCmd[15:0] are valid, Only send 16 bits valid data each time to the LCD by MPU Interface 0 = MODE_8_BIT 1 = MODE_16_BIT + * |[2:1] |DATA_BUS_WIDTH|MPU interface bus width 0 = WIDTH_8_BIT 1 = WIDTH_9_BIT 2 = WIDTH_16_BIT 3 = WIDTH_18_BIT + * |[3] |DATA_BUS_MODE|0 = MODE0. Mode0: 8-bit:DB[7:0]; 9-bit:DB[8:0]; 16-bit:DB[15:0]; 18-bit:DB[17:0], 1 = MODE1. Mode1: 8-bit:DB[17:10]; 9-bit:DB[17:9]; 16-bit:{DB[17:10],DB[8:1]}; 18-bit:DB[17:0]. + * |[4] |INTERFACE_MODE|System Interface. + * |[5] |ENABLE_VSYNC|0: Disable; 1: Enable VSYNC interface 0 = DISABLE 1 = ENABLE + * |[6] |VSYNC_POLARITY|VSYNC signal is negative or positive value 0 = NEGATIVE 1 = POSITIVE + * |[7] |ENABLE_TE |0: Disable; 1: Enable TE interface 0 = DISABLE 1 = ENABLE + * |[8] |TE_POLARITY|TE signal is positive or negative value 0 = POSITIVE 1 = NEGATIVE + * |[9] |DCX_POLARITY|DCX polarity for command and data 0 = MODE0. 0-command, 1-data 1 = MODE1. 1-command, 0-data. + * |[10] |DATA_MODE24_BIT|16 bit data bus, 24 bit data output 0 = MODE0. 0: 2 pixels per 3 transfers 1 = MODE1. 1: 1 pixel per 2 transfers. + * |[11] |INTERFACE_RESET|Write 1 to this field, HW will reset the MPU interface. + * |[12] |ENABLE_MPU_INTF|O:Disable; 1: Enable MPU interface 0 = DISABLE 1 = ENABLE + * @var DISP_T::MpuIntfFrame0 + * Offset: 0x1C80 MPU Frame Configuration Register. Note: This register is double buffered. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |FRAME_UPDATE|0: When using VSync interface/TE mode, if this bit is 0, this frame data won't be updated 1: When using VSync interface/TE mode, if this bit is 1, this frame data will be updated 0 => NO 1 => YES. + * |[2:1] |DATA_FORMAT|0: 16 bit format R5G6B5 1: 18 bit format R6G6B6 2: 24 bit format R8G8B8. 3: Reserved 0 => R5G6B5 1 => R6G6B6 2 => R8G8B8 + * |[3] |MPU_WRITE_BACK|0: Disable MPU data write back 1: Enable MPU interface data write back 0 => DISABLE 1 => ENABLE. + * @var DISP_T::MpuIntfACWrI800 + * Offset: 0x1C88 MPU Write AC Characteristics I80 Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |WR_PERIOD_I80|I80 system write period cycle number Minimum number is 3 Default number is 0, 0 means 1024 cycle number Cycle unit is pixel clock. + * |[19:10] |WRX_ASSERT|I80 system WRX assert cycle number Minimum number is 1 Default number is 0, 0 means 1024 cycle number Cycle unit is pixel clock. + * |[29:20] |WRX_DE_ASSERT|I80 system WRX de-assert cycle number Minimum number is 1 Default number is 0, 0 means 1024 cycle number Cycle unit is pixel clock + * @var DISP_T::MpuIntfACRdI800 + * Offset: 0x1C90 MPU Read AC Characteristics I80 Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |RD_PERIOD_I80|I80 system read period cycle number Minimum number is 3 Default number is 0, 0 means 1024 cycle number Cycle unit is pixel clock. + * |[19:10] |RDX_ASSERT|I80 system RDX assert cycle number Minimum number is 1 Default number is 0, 0 means 1024 cycle number Cycle unit is pixel clock. + * |[29:20] |RDX_DE_ASSERT|I80 system RDX de-assert cycle number Minimum number is 1 Default number is 0, 0 means 1024 cycle number Cycle unit is pixel clock. + * @var DISP_T::MpuIntfACWrM680 + * Offset: 0x1C98 MPU Write AC Characteristics M68 Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |WR_PERIOD_M68|M68 system write period cycle number Minimum number is 3 Default number is 0, 0 means 1024 cycle number Cycle unit is pixel clock. + * |[19:10] |WR_EASSERT|M68 system write E assert cycle number Minimum number is 1 Default number is 0, 0 means 1024 cycle number Cycle unit is pixel clock. + * |[29:20] |WR_EDE_ASSERT|M68 system write E de-assert cycle number Minimum number is 1 Default number is 0, 0 means 1024 cycle number Cycle unit is pixel clock. + * @var DISP_T::MpuIntfACRdM680 + * Offset: 0x1CA0 MPU Read AC Characteristics M68 Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |RD_PERIOD_I80|M68 system read period cycle number Minimum number is 3 Default number is 0, 0 means 1024 cycle number Cycle unit is pixel clock. + * |[19:10] |RDX_ASSERT|M68 system RDX assert cycle number Minimum number is 1 Default number is 0, 0 means 1024 cycle number Cycle unit is pixel clock. + * |[29:20] |RDX_DE_ASSERT|M68 system RDX de-assert cycle number Minimum number is 1 Default number is 0, 0 means 1024 cycle number Cycle unit is pixel clock. + * @var DISP_T::MpuIntfACVsyncCSX0 + * Offset: 0x1CA8 MPU CSX Assert Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |CSX_ASSERT|Add delay between VSYNC-high and CSX- low This field specifies how many transfer-one-pixel period. + */ + __IO uint32_t AQHiClockControl; /*!< [0x0000] Clock Control Register */ + __I uint32_t RESERVE0[1279]; + __IO uint32_t FrameBufferAddress0; /*!< [0x1400] Framebuffer Start Address Register. Starting address of the framebuffer. Note: This register is double buffered. */ + __I uint32_t RESERVE1[1]; + __IO uint32_t FrameBufferStride0; /*!< [0x1408] Framebuffer Stride Register. Stride of the framebuffer in bytes. Note: This register is double buffered. */ + __I uint32_t RESERVE2[1]; + __IO uint32_t DisplayDitherConfig0; /*!< [0x1410] Display Dither Configuration Register. Configuration register for dithering. Note: This register is double buffered. */ + __I uint32_t RESERVE3[1]; + __IO uint32_t PanelConfig0; /*!< [0x1418] Panel Configuration Register. Note: This register is double buffered. */ + __I uint32_t RESERVE4[1]; + __IO uint32_t DisplayDitherTableLow0; /*!< [0x1420] Display Dither Table Register. Note: This register is double buffered. */ + __I uint32_t RESERVE5[1]; + __IO uint32_t DisplayDitherTableHigh0; /*!< [0x1428] Display Dither Table Register. Note: This register is double buffered. */ + __I uint32_t RESERVE6[1]; + __IO uint32_t HDisplay0; /*!< [0x1430] Horizontal Total and Display End Counter Register. Note: This register is double buffered */ + __I uint32_t RESERVE7[1]; + __IO uint32_t HSync0; /*!< [0x1438] Horizontal Sync Counter Register. Note: This register is double buffered. */ + __I uint32_t RESERVE8[1]; + __IO uint32_t VDisplay0; /*!< [0x1440] Vertical Total and Display End Counter Register. Note: This register is double buffered. */ + __I uint32_t RESERVE9[1]; + __IO uint32_t VSync0; /*!< [0x1448] Vertical Sync Counter Register. Note: This register is double buffered. */ + __I uint32_t RESERVE10[1]; + __I uint32_t DisplayCurrentLocation0; /*!< [0x1450] Display Current Location Register. Current x,y location of display controller. */ + __I uint32_t RESERVE11[1]; + __O uint32_t GammaIndex0; /*!< [0x1458] Gamma Table Index Register. Index into gamma table. See GammaData for more information. */ + __I uint32_t RESERVE12[1]; + __O uint32_t GammaData0; /*!< [0x1460] Gamma Data Translation Register. Translation values for the gamma table. When this register gets written, the data gets stored in the gamma table at the index specified by the GammaIndex register. After the register is written, the index gets incremented. */ + __I uint32_t RESERVE13[1]; + __IO uint32_t CursorConfig; /*!< [0x1468] Cursor Configuration Register. */ + __IO uint32_t CursorAddress; /*!< [0x146c] Cursor Address Register. Address of the cursor shape. Note: This register is double buffered. */ + __IO uint32_t CursorLocation; /*!< [0x1470] Cursor Location Register. Location of the cursor on the owning display. Note: This register is double buffered. */ + __IO uint32_t CursorBackground; /*!< [0x1474] Masked Cursor Background Color Register. The background color for Masked cursors. Note: This register is double buffered. */ + __IO uint32_t CursorForeground; /*!< [0x1478] Masked Cursor Foreground Color Register. The foreground color for Masked cursors. Note: This register is double buffered. */ + __I uint32_t DisplayIntr; /*!< [0x147c] Display Interrupt Register */ + __IO uint32_t DisplayIntrEnable; /*!< [0x1480] Display Interrupt Enable Register. The interrupt enable register for display_0. Note: Interrupt enable for register DisplayIntr. */ + __IO uint32_t CursorModuleClockGatingControl; /*!< [0x1484] Clock Gating Control for Cursor Register. Module level clock gating control for cursor. */ + __IO uint32_t DbiConfig0; /*!< [0x1488] Wayne Undertable register */ + __I uint32_t RESERVE14[9]; + __IO uint32_t GeneralConfig0; /*!< [0x14b0] General Miscellaneous Configuration Register. Misc option configuration. Note: This register is double buffered. */ + __I uint32_t RESERVE15[1]; + __IO uint32_t DpiConfig0; /*!< [0x14b8] DPI Configuration Register. The configuration register for DPI output. Note: This register is double buffered. */ + __I uint32_t RESERVE16[5]; + __IO uint32_t DebugCounterSelect0; /*!< [0x14d0] Debug Counter Selection Register. */ + __I uint32_t RESERVE17[1]; + __I uint32_t DebugCounterValue0; /*!< [0x14d8] Debug Counter Value Register */ + __I uint32_t RESERVE18[11]; + __IO uint32_t FrameBufferColorKey0; /*!< [0x1508] Framebuffer Color Key Start Address Register. Start of color key range of framebuffer. Note: This register is double buffered. */ + __I uint32_t RESERVE19[1]; + __IO uint32_t FrameBufferColorKeyHigh0; /*!< [0x1510] Framebuffer Color Key End Address Register. End of color key range of framebuffer. Note: This register is double buffered. */ + __I uint32_t RESERVE20[1]; + __IO uint32_t FrameBufferConfig0; /*!< [0x1518] Framebuffer Configuration Register. Framebuffer attribute configuration. Note: This register is double buffered. Some fields are double buffered. */ + __I uint32_t RESERVE21[3]; + __IO uint32_t FrameBufferBGColor0; /*!< [0x1528] Framebuffer Background Color Register. Background color used when a pixel from the framebuffer falls outside of the range of color key. */ + __I uint32_t RESERVE22[1]; + __IO uint32_t FrameBufferUPlanarAddress0; /*!< [0x1530] Framebuffer Second Plane U Start Address Register. Starting address of the second planar (often the U plane) of the framebuffer if one exists. */ + __I uint32_t RESERVE23[1]; + __IO uint32_t FrameBufferVPlanarAddress0; /*!< [0x1538] Framebuffer Third Plane V Start Address Register. Starting address of the third planar (often the V plane) of the framebuffer if one exists. Note: This register is double buffered. */ + __I uint32_t RESERVE24[1]; + __IO uint32_t OverlayConfig0; /*!< [0x1540] Overlay Configuration Register. Overlay attributes control. Note: This register is double buffered. */ + __I uint32_t RESERVE25[15]; + __IO uint32_t OverlayAlphaBlendConfig0; /*!< [0x1580] Overlay Alpha Blending Configuration Register. Note: This register is double buffered. */ + __I uint32_t RESERVE26[15]; + __IO uint32_t OverlayAddress0; /*!< [0x15c0] Overlay Start Address Register. Starting address of the overlay. Note: This register is double buffered. */ + __I uint32_t RESERVE27[15]; + __IO uint32_t OverlayStride0; /*!< [0x1600] Overlay Stride Register. Stride of the overlay in bytes. Note: This register is double buffered. */ + __I uint32_t RESERVE28[15]; + __IO uint32_t OverlayTL0; /*!< [0x1640] Overlay Origin Register. Top left coordinate of the panel pixel where the overlay should start. Be aware there is no panning inside the overlay. Note: This register is double buffered */ + __I uint32_t RESERVE29[15]; + __IO uint32_t OverlayBR0; /*!< [0x1680] Overlay End Register. Bottom right coordinate of the panel pixel where the overlay should end. The border is inclusive. Note: This register is double buffered. */ + __I uint32_t RESERVE30[15]; + __IO uint32_t OverlaySrcGlobalColor0; /*!< [0x16c0] Overlay Source Global Color Register. Color value used when alpha blending process is configured to use global color for source. Note: This register is double buffered. */ + __I uint32_t RESERVE31[15]; + __IO uint32_t OverlayDstGlobalColor0; /*!< [0x1700] Overlay Destination Global Color Register. Color value used when alpha blending process is configured to use global color for destination. Note: This register is double buffered. */ + __I uint32_t RESERVE32[15]; + __IO uint32_t OverlayColorKey0; /*!< [0x1740] Overlay Color Key Start Address Register. Start of color key range for overlay. Note: This register is double buffered. */ + __I uint32_t RESERVE33[15]; + __IO uint32_t OverlayColorKeyHigh0; /*!< [0x1780] Overlay Color Key End Address Register. End of color key range for overlay. Note: This register is double buffered. */ + __I uint32_t RESERVE34[15]; + __IO uint32_t OverlaySize0; /*!< [0x17c0] Overlay Window Size Register. Window size of the overlay buffer in memory - in pixels. Note: This register is double buffered. */ + __I uint32_t RESERVE35[15]; + __IO uint32_t FrameBufferUStride0; /*!< [0x1800] Framebuffer Second Plane U Stride Register. Stride of the second planar (often the U plane) of the framebuffer if one exists. Note: This register is double buffered. */ + __I uint32_t RESERVE36[1]; + __IO uint32_t FrameBufferVStride0; /*!< [0x1808] Framebuffer Third Plane V Stride Register. Stride of the third planar (often the V plane) of the framebuffer if one exists. Note: This register is double buffered. */ + __I uint32_t RESERVE37[1]; + __IO uint32_t FrameBufferSize0; /*!< [0x1810] Framebuffer Size Register. Window size of the framebuffer in memory - in pixels. Note: This register is double buffered. */ + __I uint32_t RESERVE38[1]; + __O uint32_t IndexColorTableIndex0; /*!< [0x1818] Index Color Table Index Register. Index into index color table. See IndexColorTableData for more information. */ + __I uint32_t RESERVE39[1]; + __O uint32_t IndexColorTableData0; /*!< [0x1820] Index Color Table Data Translation Register. Translation values for the index color table. When this register gets written, the data gets stored in the index color table at the index specified by the IndexColorTableIndex register. After the register is written, the index gets incremented. Note: This register is double buffered. */ + __I uint32_t RESERVE40[7]; + __IO uint32_t OverlayUPlanarAddress0; /*!< [0x1840] Overlay Second Plane U Start Address Register. Address of the second planar (often U plane) of the overlay if one exists. Note: This register is double buffered. */ + __I uint32_t RESERVE41[15]; + __IO uint32_t OverlayVPlanarAddress0; /*!< [0x1880] Overlay Third Plane V Start Address Register. Address of the third planar (often V plane) of the overlay if one exists. Note: This register is double buffered. */ + __I uint32_t RESERVE42[15]; + __IO uint32_t OverlayUStride0; /*!< [0x18c0] Overlay Second Plane U Stride Register. Stride of the second planar of the overlay if one exists. Note: This register is double buffered. */ + __I uint32_t RESERVE43[15]; + __IO uint32_t OverlayVStride0; /*!< [0x1900] Overlay Third Plane V Stride Register. Stride of the third planar of the overlay if one exists. Note: This register is double buffered. */ + __I uint32_t RESERVE44[15]; + __IO uint32_t OverlayClearValue0; /*!< [0x1940] Overlay Clear Value Register. Clear value used when OverlayConfig.Clear is enabled. Format is A8R8G8B8. Note: This register is double buffered. */ + __I uint32_t RESERVE45[15]; + __O uint32_t OverlayIndexColorTableIndex0; /*!< [0x1980] Overlay Index Color Table Index Register. Index into overlay index color table. See OverlayIndexColorTableData for more information. */ + __I uint32_t RESERVE46[15]; + __O uint32_t OverlayIndexColorTableData0; /*!< [0x19c0] Index Color Table Data Translation Register. Translation values for the index color table of the overlay. When this register gets written, the data gets stored in the index color table at the index specified by the OverlayIndexColorTableIndex register. After the register is written, the index gets incremented. Note: This register is double buffered. */ + __I uint32_t RESERVE47[21]; + __IO uint32_t FrameBufferClearValue0; /*!< [0x1a18] Framebuffer Clear Value Register. Clear value used when FrameBufferConfig. Clear is enabled, format is A8R8G8B8. Note: This register is double buffered. */ + __I uint32_t RESERVE48[3]; + __IO uint32_t ModuleClockGatingControl0; /*!< [0x1a28] Clock Gating Module Control Register. Module level clock gating control for video and overlay. */ + __I uint32_t RESERVE49[1]; + __IO uint32_t LatencyCounter0; /*!< [0x1a30] Latency Counter Register. */ + __I uint32_t RESERVE50[1]; + __IO uint32_t Qos0; /*!< [0x1a38] Quality of Service Latency Value Register. */ + __I uint32_t RESERVE51[129]; + __IO uint32_t MpuIntfCmd0; /*!< [0x1c40] MPU Command Configuration Register. */ + __I uint32_t RESERVE52[1]; + __I uint32_t MpuIntfReadPara00; /*!< [0x1c48] MPU Read Parameter0 Register. */ + __I uint32_t RESERVE53[1]; + __I uint32_t MpuIntfReadPara10; /*!< [0x1c50] MPU Read Parameter1 Register. */ + __I uint32_t RESERVE54[1]; + __I uint32_t MpuIntfReadPara20; /*!< [0x1c58] MPU Read Parameter2 Register. */ + __I uint32_t RESERVE55[1]; + __I uint32_t MpuIntfReadPara30; /*!< [0x1c60] MPU Read Parameter3 Register. */ + __I uint32_t RESERVE56[1]; + __I uint32_t MpuIntfReadPara40; /*!< [0x1c68] MPU Read Parameter4 Register. */ + __I uint32_t RESERVE57[1]; + __I uint32_t MpuIntfReadStatus0; /*!< [0x1c70] MPU Read Parameter Status Register. */ + __I uint32_t RESERVE58[1]; + __IO uint32_t MpuIntfConfig0; /*!< [0x1c78] MPU Interface Configuration Register. */ + __I uint32_t RESERVE59[1]; + __IO uint32_t MpuIntfFrame0; /*!< [0x1c80] MPU Frame Configuration Register. Note: This register is double buffered. */ + __I uint32_t RESERVE60[1]; + __IO uint32_t MpuIntfACWrI800; /*!< [0x1c88] MPU Write AC Characteristics I80 Register. */ + __I uint32_t RESERVE61[1]; + __IO uint32_t MpuIntfACRdI800; /*!< [0x1c90] MPU Read AC Characteristics I80 Register. */ + __I uint32_t RESERVE62[1]; + __IO uint32_t MpuIntfACWrM680; /*!< [0x1c98] MPU Write AC Characteristics M68 Register. */ + __I uint32_t RESERVE63[1]; + __IO uint32_t MpuIntfACRdM680; /*!< [0x1ca0] MPU Read AC Characteristics M68 Register. */ + __I uint32_t RESERVE64[1]; + __IO uint32_t MpuIntfACVsyncCSX0; /*!< [0x1ca8] MPU CSX Assert Register. */ + +} DISP_T; + +/** + @addtogroup DISP_CONST DISP Bit Field Definition + Constant Definitions for DISP Controller +@{ */ + +#define DISP_AQHiClockControl_CLKDC_DIS_Pos (1) /*!< DISP_T::AQHiClockControl: CLKDC_DIS Position*/ +#define DISP_AQHiClockControl_CLKDC_DIS_Msk (0x1ul << DISP_AQHiClockControl_CLKDC_DIS_Pos) /*!< DISP_T::AQHiClockControl: CLKDC_DIS Mask*/ + +#define DISP_AQHiClockControl_FSCALE_VAL_Pos (2) /*!< DISP_T::AQHiClockControl: FSCALE_VAL Position*/ +#define DISP_AQHiClockControl_FSCALE_VAL_Msk (0x7ful << DISP_AQHiClockControl_FSCALE_VAL_Pos) /*!< DISP_T::AQHiClockControl: FSCALE_VAL Mask*/ + +#define DISP_AQHiClockControl_FSCALE_CMD_LOAD_Pos (9) /*!< DISP_T::AQHiClockControl: FSCALE_CMD_LOAD Position*/ +#define DISP_AQHiClockControl_FSCALE_CMD_LOAD_Msk (0x1ul << DISP_AQHiClockControl_FSCALE_CMD_LOAD_Pos) /*!< DISP_T::AQHiClockControl: FSCALE_CMD_LOAD Mask*/ + +#define DISP_AQHiClockControl_DISABLE_RAM_CLOCK_GATING_Pos (10) /*!< DISP_T::AQHiClockControl: DISABLE_RAM_CLOCK_GATING Position*/ +#define DISP_AQHiClockControl_DISABLE_RAM_CLOCK_GATING_Msk (0x1ul << DISP_AQHiClockControl_DISABLE_RAM_CLOCK_GATING_Pos) /*!< DISP_T::AQHiClockControl: DISABLE_RAM_CLOCK_GATING Mask*/ + +#define DISP_AQHiClockControl_DISABLE_DEBUG_REGISTERS_Pos (11) /*!< DISP_T::AQHiClockControl: DISABLE_DEBUG_REGISTERS Position*/ +#define DISP_AQHiClockControl_DISABLE_DEBUG_REGISTERS_Msk (0x1ul << DISP_AQHiClockControl_DISABLE_DEBUG_REGISTERS_Pos) /*!< DISP_T::AQHiClockControl: DISABLE_DEBUG_REGISTERS Mask*/ + +#define DISP_AQHiClockControl_SOFT_RESET_Pos (12) /*!< DISP_T::AQHiClockControl: SOFT_RESET Position*/ +#define DISP_AQHiClockControl_SOFT_RESET_Msk (0x1ul << DISP_AQHiClockControl_SOFT_RESET_Pos) /*!< DISP_T::AQHiClockControl: SOFT_RESET Mask*/ + +#define DISP_AQHiClockControl_DISABLE_RAM_POWER_OPTIMIZATION_Pos (13) /*!< DISP_T::AQHiClockControl: DISABLE_RAM_POWER_OPTIMIZATION Position*/ +#define DISP_AQHiClockControl_DISABLE_RAM_POWER_OPTIMIZATION_Msk (0x1ul << DISP_AQHiClockControl_DISABLE_RAM_POWER_OPTIMIZATION_Pos) /*!< DISP_T::AQHiClockControl: DISABLE_RAM_POWER_OPTIMIZATION Mask*/ + +#define DISP_FrameBufferAddress0_ADDRESS_Pos (0) /*!< DISP_T::FrameBufferAddress0: ADDRESS Position*/ +#define DISP_FrameBufferAddress0_ADDRESS_Msk (0x7ffffffful << DISP_FrameBufferAddress0_ADDRESS_Pos) /*!< DISP_T::FrameBufferAddress0: ADDRESS Mask*/ + +#define DISP_FrameBufferAddress0_TYPE_Pos (31) /*!< DISP_T::FrameBufferAddress0: TYPE Position*/ +#define DISP_FrameBufferAddress0_TYPE_Msk (0x1ul << DISP_FrameBufferAddress0_TYPE_Pos) /*!< DISP_T::FrameBufferAddress0: TYPE Mask*/ + +#define DISP_FrameBufferStride0_STRIDE_Pos (0) /*!< DISP_T::FrameBufferStride0: STRIDE Position*/ +#define DISP_FrameBufferStride0_STRIDE_Msk (0x1fffful << DISP_FrameBufferStride0_STRIDE_Pos) /*!< DISP_T::FrameBufferStride0: STRIDE Mask*/ + +#define DISP_DisplayDitherConfig0_ENABLE_Pos (31) /*!< DISP_T::DisplayDitherConfig0: ENABLE Position*/ +#define DISP_DisplayDitherConfig0_ENABLE_Msk (0x1ul << DISP_DisplayDitherConfig0_ENABLE_Pos) /*!< DISP_T::DisplayDitherConfig0: ENABLE Mask*/ + +#define DISP_PanelConfig0_DE_Pos (0) /*!< DISP_T::PanelConfig0: DE Position */ +#define DISP_PanelConfig0_DE_Msk (0x1ul << DISP_PanelConfig0_DE_Pos) /*!< DISP_T::PanelConfig0: DE Mask */ + +#define DISP_PanelConfig0_DE_POLARITY_Pos (1) /*!< DISP_T::PanelConfig0: DE_POLARITY Position*/ +#define DISP_PanelConfig0_DE_POLARITY_Msk (0x1ul << DISP_PanelConfig0_DE_POLARITY_Pos) /*!< DISP_T::PanelConfig0: DE_POLARITY Mask*/ + +#define DISP_PanelConfig0_DATA_ENABLE_Pos (4) /*!< DISP_T::PanelConfig0: DATA_ENABLE Position*/ +#define DISP_PanelConfig0_DATA_ENABLE_Msk (0x1ul << DISP_PanelConfig0_DATA_ENABLE_Pos) /*!< DISP_T::PanelConfig0: DATA_ENABLE Mask*/ + +#define DISP_PanelConfig0_DATA_POLARITY_Pos (5) /*!< DISP_T::PanelConfig0: DATA_POLARITY Position*/ +#define DISP_PanelConfig0_DATA_POLARITY_Msk (0x1ul << DISP_PanelConfig0_DATA_POLARITY_Pos) /*!< DISP_T::PanelConfig0: DATA_POLARITY Mask*/ + +#define DISP_PanelConfig0_CLOCK_Pos (8) /*!< DISP_T::PanelConfig0: CLOCK Position*/ +#define DISP_PanelConfig0_CLOCK_Msk (0x1ul << DISP_PanelConfig0_CLOCK_Pos) /*!< DISP_T::PanelConfig0: CLOCK Mask */ + +#define DISP_PanelConfig0_CLOCK_POLARITY_Pos (9) /*!< DISP_T::PanelConfig0: CLOCK_POLARITY Position*/ +#define DISP_PanelConfig0_CLOCK_POLARITY_Msk (0x1ul << DISP_PanelConfig0_CLOCK_POLARITY_Pos) /*!< DISP_T::PanelConfig0: CLOCK_POLARITY Mask*/ + +#define DISP_DisplayDitherTableLow0_Y0_X0_Pos (0) /*!< DISP_T::DisplayDitherTableLow0: Y0_X0 Position*/ +#define DISP_DisplayDitherTableLow0_Y0_X0_Msk (0xful << DISP_DisplayDitherTableLow0_Y0_X0_Pos) /*!< DISP_T::DisplayDitherTableLow0: Y0_X0 Mask*/ + +#define DISP_DisplayDitherTableLow0_Y0_X1_Pos (4) /*!< DISP_T::DisplayDitherTableLow0: Y0_X1 Position*/ +#define DISP_DisplayDitherTableLow0_Y0_X1_Msk (0xful << DISP_DisplayDitherTableLow0_Y0_X1_Pos) /*!< DISP_T::DisplayDitherTableLow0: Y0_X1 Mask*/ + +#define DISP_DisplayDitherTableLow0_Y0_X2_Pos (8) /*!< DISP_T::DisplayDitherTableLow0: Y0_X2 Position*/ +#define DISP_DisplayDitherTableLow0_Y0_X2_Msk (0xful << DISP_DisplayDitherTableLow0_Y0_X2_Pos) /*!< DISP_T::DisplayDitherTableLow0: Y0_X2 Mask*/ + +#define DISP_DisplayDitherTableLow0_Y0_X3_Pos (12) /*!< DISP_T::DisplayDitherTableLow0: Y0_X3 Position*/ +#define DISP_DisplayDitherTableLow0_Y0_X3_Msk (0xful << DISP_DisplayDitherTableLow0_Y0_X3_Pos) /*!< DISP_T::DisplayDitherTableLow0: Y0_X3 Mask*/ + +#define DISP_DisplayDitherTableLow0_Y1_X0_Pos (16) /*!< DISP_T::DisplayDitherTableLow0: Y1_X0 Position*/ +#define DISP_DisplayDitherTableLow0_Y1_X0_Msk (0xful << DISP_DisplayDitherTableLow0_Y1_X0_Pos) /*!< DISP_T::DisplayDitherTableLow0: Y1_X0 Mask*/ + +#define DISP_DisplayDitherTableLow0_Y1_X1_Pos (20) /*!< DISP_T::DisplayDitherTableLow0: Y1_X1 Position*/ +#define DISP_DisplayDitherTableLow0_Y1_X1_Msk (0xful << DISP_DisplayDitherTableLow0_Y1_X1_Pos) /*!< DISP_T::DisplayDitherTableLow0: Y1_X1 Mask*/ + +#define DISP_DisplayDitherTableLow0_Y1_X2_Pos (24) /*!< DISP_T::DisplayDitherTableLow0: Y1_X2 Position*/ +#define DISP_DisplayDitherTableLow0_Y1_X2_Msk (0xful << DISP_DisplayDitherTableLow0_Y1_X2_Pos) /*!< DISP_T::DisplayDitherTableLow0: Y1_X2 Mask*/ + +#define DISP_DisplayDitherTableLow0_Y1_X3_Pos (28) /*!< DISP_T::DisplayDitherTableLow0: Y1_X3 Position*/ +#define DISP_DisplayDitherTableLow0_Y1_X3_Msk (0xful << DISP_DisplayDitherTableLow0_Y1_X3_Pos) /*!< DISP_T::DisplayDitherTableLow0: Y1_X3 Mask*/ + +#define DISP_DisplayDitherTableHigh0_Y2_X0_Pos (0) /*!< DISP_T::DisplayDitherTableHigh0: Y2_X0 Position*/ +#define DISP_DisplayDitherTableHigh0_Y2_X0_Msk (0xful << DISP_DisplayDitherTableHigh0_Y2_X0_Pos) /*!< DISP_T::DisplayDitherTableHigh0: Y2_X0 Mask*/ + +#define DISP_DisplayDitherTableHigh0_Y2_X1_Pos (4) /*!< DISP_T::DisplayDitherTableHigh0: Y2_X1 Position*/ +#define DISP_DisplayDitherTableHigh0_Y2_X1_Msk (0xful << DISP_DisplayDitherTableHigh0_Y2_X1_Pos) /*!< DISP_T::DisplayDitherTableHigh0: Y2_X1 Mask*/ + +#define DISP_DisplayDitherTableHigh0_Y2_X2_Pos (8) /*!< DISP_T::DisplayDitherTableHigh0: Y2_X2 Position*/ +#define DISP_DisplayDitherTableHigh0_Y2_X2_Msk (0xful << DISP_DisplayDitherTableHigh0_Y2_X2_Pos) /*!< DISP_T::DisplayDitherTableHigh0: Y2_X2 Mask*/ + +#define DISP_DisplayDitherTableHigh0_Y2_X3_Pos (12) /*!< DISP_T::DisplayDitherTableHigh0: Y2_X3 Position*/ +#define DISP_DisplayDitherTableHigh0_Y2_X3_Msk (0xful << DISP_DisplayDitherTableHigh0_Y2_X3_Pos) /*!< DISP_T::DisplayDitherTableHigh0: Y2_X3 Mask*/ + +#define DISP_DisplayDitherTableHigh0_Y3_X0_Pos (16) /*!< DISP_T::DisplayDitherTableHigh0: Y3_X0 Position*/ +#define DISP_DisplayDitherTableHigh0_Y3_X0_Msk (0xful << DISP_DisplayDitherTableHigh0_Y3_X0_Pos) /*!< DISP_T::DisplayDitherTableHigh0: Y3_X0 Mask*/ + +#define DISP_DisplayDitherTableHigh0_Y3_X1_Pos (20) /*!< DISP_T::DisplayDitherTableHigh0: Y3_X1 Position*/ +#define DISP_DisplayDitherTableHigh0_Y3_X1_Msk (0xful << DISP_DisplayDitherTableHigh0_Y3_X1_Pos) /*!< DISP_T::DisplayDitherTableHigh0: Y3_X1 Mask*/ + +#define DISP_DisplayDitherTableHigh0_Y3_X2_Pos (24) /*!< DISP_T::DisplayDitherTableHigh0: Y3_X2 Position*/ +#define DISP_DisplayDitherTableHigh0_Y3_X2_Msk (0xful << DISP_DisplayDitherTableHigh0_Y3_X2_Pos) /*!< DISP_T::DisplayDitherTableHigh0: Y3_X2 Mask*/ + +#define DISP_DisplayDitherTableHigh0_Y3_X3_Pos (28) /*!< DISP_T::DisplayDitherTableHigh0: Y3_X3 Position*/ +#define DISP_DisplayDitherTableHigh0_Y3_X3_Msk (0xful << DISP_DisplayDitherTableHigh0_Y3_X3_Pos) /*!< DISP_T::DisplayDitherTableHigh0: Y3_X3 Mask*/ + +#define DISP_HDisplay0_DISPLAY_END_Pos (0) /*!< DISP_T::HDisplay0: DISPLAY_END Position*/ +#define DISP_HDisplay0_DISPLAY_END_Msk (0x7ffful << DISP_HDisplay0_DISPLAY_END_Pos) /*!< DISP_T::HDisplay0: DISPLAY_END Mask*/ + +#define DISP_HDisplay0_TOTAL_Pos (16) /*!< DISP_T::HDisplay0: TOTAL Position */ +#define DISP_HDisplay0_TOTAL_Msk (0x7ffful << DISP_HDisplay0_TOTAL_Pos) /*!< DISP_T::HDisplay0: TOTAL Mask */ + +#define DISP_HSync0_START_Pos (0) /*!< DISP_T::HSync0: START Position */ +#define DISP_HSync0_START_Msk (0x7ffful << DISP_HSync0_START_Pos) /*!< DISP_T::HSync0: START Mask */ + +#define DISP_HSync0_END_Pos (15) /*!< DISP_T::HSync0: END Position */ +#define DISP_HSync0_END_Msk (0x7ffful << DISP_HSync0_END_Pos) /*!< DISP_T::HSync0: END Mask */ + +#define DISP_HSync0_PULSE_Pos (30) /*!< DISP_T::HSync0: PULSE Position */ +#define DISP_HSync0_PULSE_Msk (0x1ul << DISP_HSync0_PULSE_Pos) /*!< DISP_T::HSync0: PULSE Mask */ + +#define DISP_HSync0_POLARITY_Pos (31) /*!< DISP_T::HSync0: POLARITY Position */ +#define DISP_HSync0_POLARITY_Msk (0x1ul << DISP_HSync0_POLARITY_Pos) /*!< DISP_T::HSync0: POLARITY Mask */ + +#define DISP_VDisplay0_DISPLAY_END_Pos (0) /*!< DISP_T::VDisplay0: DISPLAY_END Position*/ +#define DISP_VDisplay0_DISPLAY_END_Msk (0x7ffful << DISP_VDisplay0_DISPLAY_END_Pos) /*!< DISP_T::VDisplay0: DISPLAY_END Mask*/ + +#define DISP_VDisplay0_TOTAL_Pos (16) /*!< DISP_T::VDisplay0: TOTAL Position */ +#define DISP_VDisplay0_TOTAL_Msk (0x7ffful << DISP_VDisplay0_TOTAL_Pos) /*!< DISP_T::VDisplay0: TOTAL Mask */ + +#define DISP_VSync0_START_Pos (0) /*!< DISP_T::VSync0: START Position */ +#define DISP_VSync0_START_Msk (0x7ffful << DISP_VSync0_START_Pos) /*!< DISP_T::VSync0: START Mask */ + +#define DISP_VSync0_END_Pos (15) /*!< DISP_T::VSync0: END Position */ +#define DISP_VSync0_END_Msk (0x7ffful << DISP_VSync0_END_Pos) /*!< DISP_T::VSync0: END Mask */ + +#define DISP_VSync0_PULSE_Pos (30) /*!< DISP_T::VSync0: PULSE Position */ +#define DISP_VSync0_PULSE_Msk (0x1ul << DISP_VSync0_PULSE_Pos) /*!< DISP_T::VSync0: PULSE Mask */ + +#define DISP_VSync0_POLARITY_Pos (31) /*!< DISP_T::VSync0: POLARITY Position */ +#define DISP_VSync0_POLARITY_Msk (0x1ul << DISP_VSync0_POLARITY_Pos) /*!< DISP_T::VSync0: POLARITY Mask */ + +#define DISP_DisplayCurrentLocation0_X_Pos (0) /*!< DISP_T::DisplayCurrentLocation0: X Position*/ +#define DISP_DisplayCurrentLocation0_X_Msk (0xfffful << DISP_DisplayCurrentLocation0_X_Pos) /*!< DISP_T::DisplayCurrentLocation0: X Mask*/ + +#define DISP_DisplayCurrentLocation0_Y_Pos (16) /*!< DISP_T::DisplayCurrentLocation0: Y Position*/ +#define DISP_DisplayCurrentLocation0_Y_Msk (0xfffful << DISP_DisplayCurrentLocation0_Y_Pos) /*!< DISP_T::DisplayCurrentLocation0: Y Mask*/ + +#define DISP_GammaIndex0_INDEX_Pos (0) /*!< DISP_T::GammaIndex0: INDEX Position*/ +#define DISP_GammaIndex0_INDEX_Msk (0xfful << DISP_GammaIndex0_INDEX_Pos) /*!< DISP_T::GammaIndex0: INDEX Mask */ + +#define DISP_GammaData0_BLUE_Pos (0) /*!< DISP_T::GammaData0: BLUE Position */ +#define DISP_GammaData0_BLUE_Msk (0x3fful << DISP_GammaData0_BLUE_Pos) /*!< DISP_T::GammaData0: BLUE Mask */ + +#define DISP_GammaData0_GREEN_Pos (10) /*!< DISP_T::GammaData0: GREEN Position*/ +#define DISP_GammaData0_GREEN_Msk (0x3fful << DISP_GammaData0_GREEN_Pos) /*!< DISP_T::GammaData0: GREEN Mask */ + +#define DISP_GammaData0_READ_Pos (20) /*!< DISP_T::GammaData0: READ Position */ +#define DISP_GammaData0_READ_Msk (0x3fful << DISP_GammaData0_READ_Pos) /*!< DISP_T::GammaData0: READ Mask */ + +#define DISP_CursorConfig_FORMAT_Pos (0) /*!< DISP_T::CursorConfig: FORMAT Position*/ +#define DISP_CursorConfig_FORMAT_Msk (0x3ul << DISP_CursorConfig_FORMAT_Pos) /*!< DISP_T::CursorConfig: FORMAT Mask */ + +#define DISP_CursorConfig_DISPLAY_Pos (4) /*!< DISP_T::CursorConfig: DISPLAY Position*/ +#define DISP_CursorConfig_DISPLAY_Msk (0x1ul << DISP_CursorConfig_DISPLAY_Pos) /*!< DISP_T::CursorConfig: DISPLAY Mask*/ + +#define DISP_CursorConfig_HOT_SPOT_Y_Pos (8) /*!< DISP_T::CursorConfig: HOT_SPOT_Y Position*/ +#define DISP_CursorConfig_HOT_SPOT_Y_Msk (0x1ful << DISP_CursorConfig_HOT_SPOT_Y_Pos) /*!< DISP_T::CursorConfig: HOT_SPOT_Y Mask*/ + +#define DISP_CursorConfig_HOT_SPOT_X_Pos (16) /*!< DISP_T::CursorConfig: HOT_SPOT_X Position*/ +#define DISP_CursorConfig_HOT_SPOT_X_Msk (0x1ful << DISP_CursorConfig_HOT_SPOT_X_Pos) /*!< DISP_T::CursorConfig: HOT_SPOT_X Mask*/ + +#define DISP_CursorAddress_ADDRESS_Pos (0) /*!< DISP_T::CursorAddress: ADDRESS Position*/ +#define DISP_CursorAddress_ADDRESS_Msk (0x7ffffffful << DISP_CursorAddress_ADDRESS_Pos) /*!< DISP_T::CursorAddress: ADDRESS Mask*/ + +#define DISP_CursorAddress_TYPE_Pos (31) /*!< DISP_T::CursorAddress: TYPE Position*/ +#define DISP_CursorAddress_TYPE_Msk (0x1ul << DISP_CursorAddress_TYPE_Pos) /*!< DISP_T::CursorAddress: TYPE Mask */ + +#define DISP_CursorLocation_X_Pos (0) /*!< DISP_T::CursorLocation: X Position*/ +#define DISP_CursorLocation_X_Msk (0x7ffful << DISP_CursorLocation_X_Pos) /*!< DISP_T::CursorLocation: X Mask */ + +#define DISP_CursorLocation_Y_Pos (16) /*!< DISP_T::CursorLocation: Y Position*/ +#define DISP_CursorLocation_Y_Msk (0x7ffful << DISP_CursorLocation_Y_Pos) /*!< DISP_T::CursorLocation: Y Mask */ + +#define DISP_CursorBackground_BLUE_Pos (0) /*!< DISP_T::CursorBackground: BLUE Position*/ +#define DISP_CursorBackground_BLUE_Msk (0xfful << DISP_CursorBackground_BLUE_Pos) /*!< DISP_T::CursorBackground: BLUE Mask*/ + +#define DISP_CursorBackground_GREEN_Pos (8) /*!< DISP_T::CursorBackground: GREEN Position*/ +#define DISP_CursorBackground_GREEN_Msk (0xfful << DISP_CursorBackground_GREEN_Pos) /*!< DISP_T::CursorBackground: GREEN Mask*/ + +#define DISP_CursorBackground_RED_Pos (16) /*!< DISP_T::CursorBackground: RED Position*/ +#define DISP_CursorBackground_RED_Msk (0xfful << DISP_CursorBackground_RED_Pos) /*!< DISP_T::CursorBackground: RED Mask*/ + +#define DISP_CursorForeground_BLUE_Pos (0) /*!< DISP_T::CursorForeground: BLUE Position*/ +#define DISP_CursorForeground_BLUE_Msk (0xfful << DISP_CursorForeground_BLUE_Pos) /*!< DISP_T::CursorForeground: BLUE Mask*/ + +#define DISP_CursorForeground_GREEN_Pos (8) /*!< DISP_T::CursorForeground: GREEN Position*/ +#define DISP_CursorForeground_GREEN_Msk (0xfful << DISP_CursorForeground_GREEN_Pos) /*!< DISP_T::CursorForeground: GREEN Mask*/ + +#define DISP_CursorForeground_RED_Pos (16) /*!< DISP_T::CursorForeground: RED Position*/ +#define DISP_CursorForeground_RED_Msk (0xfful << DISP_CursorForeground_RED_Pos) /*!< DISP_T::CursorForeground: RED Mask*/ + +#define DISP_DisplayIntr_DISP0_Pos (0) /*!< DISP_T::DisplayIntr: DISP0 Position*/ +#define DISP_DisplayIntr_DISP0_Msk (0x1ul << DISP_DisplayIntr_DISP0_Pos) /*!< DISP_T::DisplayIntr: DISP0 Mask */ + +#define DISP_DisplayIntrEnable_DISP0_Pos (0) /*!< DISP_T::DisplayIntrEnable: DISP0 Position*/ +#define DISP_DisplayIntrEnable_DISP0_Msk (0x1ul << DISP_DisplayIntrEnable_DISP0_Pos) /*!< DISP_T::DisplayIntrEnable: DISP0 Mask*/ + +#define DISP_CursorModuleClockGatingControl_DISABLE_MODULE_CLOCK_GATING_CURSOR_Pos (0) /*!< DISP_T::CursorModuleClockGatingControl: DISABLE_MODULE_CLOCK_GATING_CURSOR Position*/ +#define DISP_CursorModuleClockGatingControl_DISABLE_MODULE_CLOCK_GATING_CURSOR_Msk (0x1ul << DISP_CursorModuleClockGatingControl_DISABLE_MODULE_CLOCK_GATING_CURSOR_Pos) /*!< DISP_T::CursorModuleClockGatingControl: DISABLE_MODULE_CLOCK_GATING_CURSOR Mask*/ + +#define DISP_GeneralConfig0_ENDIAN_CONTROL_Pos (0) /*!< DISP_T::GeneralConfig0: ENDIAN_CONTROL Position*/ +#define DISP_GeneralConfig0_ENDIAN_CONTROL_Msk (0x3ul << DISP_GeneralConfig0_ENDIAN_CONTROL_Pos) /*!< DISP_T::GeneralConfig0: ENDIAN_CONTROL Mask*/ + +#define DISP_GeneralConfig0_STALL_OUTPUT_WHEN_UNDERFLOW_Pos (2) /*!< DISP_T::GeneralConfig0: STALL_OUTPUT_WHEN_UNDERFLOW Position*/ +#define DISP_GeneralConfig0_STALL_OUTPUT_WHEN_UNDERFLOW_Msk (0x1ul << DISP_GeneralConfig0_STALL_OUTPUT_WHEN_UNDERFLOW_Pos) /*!< DISP_T::GeneralConfig0: STALL_OUTPUT_WHEN_UNDERFLOW Mask*/ + +#define DISP_GeneralConfig0_DISABLE_IDLE_Pos (3) /*!< DISP_T::GeneralConfig0: DISABLE_IDLE Position*/ +#define DISP_GeneralConfig0_DISABLE_IDLE_Msk (0x1ul << DISP_GeneralConfig0_DISABLE_IDLE_Pos) /*!< DISP_T::GeneralConfig0: DISABLE_IDLE Mask*/ + +#define DISP_DpiConfig0_DPI_DATA_FORMAT_Pos (0) /*!< DISP_T::DpiConfig0: DPI_DATA_FORMAT Position*/ +#define DISP_DpiConfig0_DPI_DATA_FORMAT_Msk (0x7ul << DISP_DpiConfig0_DPI_DATA_FORMAT_Pos) /*!< DISP_T::DpiConfig0: DPI_DATA_FORMAT Mask*/ + +#define DISP_DebugCounterSelect0_SELECT_Pos (0) /*!< DISP_T::DebugCounterSelect0: SELECT Position*/ +#define DISP_DebugCounterSelect0_SELECT_Msk (0xfful << DISP_DebugCounterSelect0_SELECT_Pos) /*!< DISP_T::DebugCounterSelect0: SELECT Mask*/ + +#define DISP_DebugCounterValue0_VALUE_Pos (0) /*!< DISP_T::DebugCounterValue0: VALUE Position*/ +#define DISP_DebugCounterValue0_VALUE_Msk (0xfffffffful << DISP_DebugCounterValue0_VALUE_Pos) /*!< DISP_T::DebugCounterValue0: VALUE Mask*/ + +#define DISP_FrameBufferColorKey0_BLUE_Pos (0) /*!< DISP_T::FrameBufferColorKey0: BLUE Position*/ +#define DISP_FrameBufferColorKey0_BLUE_Msk (0xfful << DISP_FrameBufferColorKey0_BLUE_Pos) /*!< DISP_T::FrameBufferColorKey0: BLUE Mask*/ + +#define DISP_FrameBufferColorKey0_GREEN_Pos (8) /*!< DISP_T::FrameBufferColorKey0: GREEN Position*/ +#define DISP_FrameBufferColorKey0_GREEN_Msk (0xfful << DISP_FrameBufferColorKey0_GREEN_Pos) /*!< DISP_T::FrameBufferColorKey0: GREEN Mask*/ + +#define DISP_FrameBufferColorKey0_RED_Pos (16) /*!< DISP_T::FrameBufferColorKey0: RED Position*/ +#define DISP_FrameBufferColorKey0_RED_Msk (0xfful << DISP_FrameBufferColorKey0_RED_Pos) /*!< DISP_T::FrameBufferColorKey0: RED Mask*/ + +#define DISP_FrameBufferColorKey0_ALPHA_Pos (24) /*!< DISP_T::FrameBufferColorKey0: ALPHA Position*/ +#define DISP_FrameBufferColorKey0_ALPHA_Msk (0xfful << DISP_FrameBufferColorKey0_ALPHA_Pos) /*!< DISP_T::FrameBufferColorKey0: ALPHA Mask*/ + +#define DISP_FrameBufferColorKeyHigh0_BLUE_Pos (0) /*!< DISP_T::FrameBufferColorKeyHigh0: BLUE Position*/ +#define DISP_FrameBufferColorKeyHigh0_BLUE_Msk (0xfful << DISP_FrameBufferColorKeyHigh0_BLUE_Pos) /*!< DISP_T::FrameBufferColorKeyHigh0: BLUE Mask*/ + +#define DISP_FrameBufferColorKeyHigh0_GREEN_Pos (8) /*!< DISP_T::FrameBufferColorKeyHigh0: GREEN Position*/ +#define DISP_FrameBufferColorKeyHigh0_GREEN_Msk (0xfful << DISP_FrameBufferColorKeyHigh0_GREEN_Pos) /*!< DISP_T::FrameBufferColorKeyHigh0: GREEN Mask*/ + +#define DISP_FrameBufferColorKeyHigh0_RED_Pos (16) /*!< DISP_T::FrameBufferColorKeyHigh0: RED Position*/ +#define DISP_FrameBufferColorKeyHigh0_RED_Msk (0xfful << DISP_FrameBufferColorKeyHigh0_RED_Pos) /*!< DISP_T::FrameBufferColorKeyHigh0: RED Mask*/ + +#define DISP_FrameBufferColorKeyHigh0_ALPHA_Pos (24) /*!< DISP_T::FrameBufferColorKeyHigh0: ALPHA Position*/ +#define DISP_FrameBufferColorKeyHigh0_ALPHA_Msk (0xfful << DISP_FrameBufferColorKeyHigh0_ALPHA_Pos) /*!< DISP_T::FrameBufferColorKeyHigh0: ALPHA Mask*/ + +#define DISP_FrameBufferConfig0_OUTPUT_Pos (0) /*!< DISP_T::FrameBufferConfig0: OUTPUT Position*/ +#define DISP_FrameBufferConfig0_OUTPUT_Msk (0x1ul << DISP_FrameBufferConfig0_OUTPUT_Pos) /*!< DISP_T::FrameBufferConfig0: OUTPUT Mask*/ + +#define DISP_FrameBufferConfig0_GAMMA_Pos (2) /*!< DISP_T::FrameBufferConfig0: GAMMA Position*/ +#define DISP_FrameBufferConfig0_GAMMA_Msk (0x1ul << DISP_FrameBufferConfig0_GAMMA_Pos) /*!< DISP_T::FrameBufferConfig0: GAMMA Mask*/ + +#define DISP_FrameBufferConfig0_VALID_Pos (3) /*!< DISP_T::FrameBufferConfig0: VALID Position*/ +#define DISP_FrameBufferConfig0_VALID_Msk (0x1ul << DISP_FrameBufferConfig0_VALID_Pos) /*!< DISP_T::FrameBufferConfig0: VALID Mask*/ + +#define DISP_FrameBufferConfig0_RESET_Pos (4) /*!< DISP_T::FrameBufferConfig0: RESET Position*/ +#define DISP_FrameBufferConfig0_RESET_Msk (0x1ul << DISP_FrameBufferConfig0_RESET_Pos) /*!< DISP_T::FrameBufferConfig0: RESET Mask*/ + +#define DISP_FrameBufferConfig0_UNDERFLOW_Pos (5) /*!< DISP_T::FrameBufferConfig0: UNDERFLOW Position*/ +#define DISP_FrameBufferConfig0_UNDERFLOW_Msk (0x1ul << DISP_FrameBufferConfig0_UNDERFLOW_Pos) /*!< DISP_T::FrameBufferConfig0: UNDERFLOW Mask*/ + +#define DISP_FrameBufferConfig0_FLIP_IN_PROGRESS_Pos (6) /*!< DISP_T::FrameBufferConfig0: FLIP_IN_PROGRESS Position*/ +#define DISP_FrameBufferConfig0_FLIP_IN_PROGRESS_Msk (0x1ul << DISP_FrameBufferConfig0_FLIP_IN_PROGRESS_Pos) /*!< DISP_T::FrameBufferConfig0: FLIP_IN_PROGRESS Mask*/ + +#define DISP_FrameBufferConfig0_CLEAR_Pos (8) /*!< DISP_T::FrameBufferConfig0: CLEAR Position*/ +#define DISP_FrameBufferConfig0_CLEAR_Msk (0x1ul << DISP_FrameBufferConfig0_CLEAR_Pos) /*!< DISP_T::FrameBufferConfig0: CLEAR Mask*/ + +#define DISP_FrameBufferConfig0_TRANSPARENCY_Pos (9) /*!< DISP_T::FrameBufferConfig0: TRANSPARENCY Position*/ +#define DISP_FrameBufferConfig0_TRANSPARENCY_Msk (0x3ul << DISP_FrameBufferConfig0_TRANSPARENCY_Pos) /*!< DISP_T::FrameBufferConfig0: TRANSPARENCY Mask*/ + +#define DISP_FrameBufferConfig0_YUV_Pos (14) /*!< DISP_T::FrameBufferConfig0: YUV Position*/ +#define DISP_FrameBufferConfig0_YUV_Msk (0x7ul << DISP_FrameBufferConfig0_YUV_Pos) /*!< DISP_T::FrameBufferConfig0: YUV Mask*/ + +#define DISP_FrameBufferConfig0_SWIZZLE_Pos (23) /*!< DISP_T::FrameBufferConfig0: SWIZZLE Position*/ +#define DISP_FrameBufferConfig0_SWIZZLE_Msk (0x3ul << DISP_FrameBufferConfig0_SWIZZLE_Pos) /*!< DISP_T::FrameBufferConfig0: SWIZZLE Mask*/ + +#define DISP_FrameBufferConfig0_UV_SWIZZLE_Pos (25) /*!< DISP_T::FrameBufferConfig0: UV_SWIZZLE Position*/ +#define DISP_FrameBufferConfig0_UV_SWIZZLE_Msk (0x1ul << DISP_FrameBufferConfig0_UV_SWIZZLE_Pos) /*!< DISP_T::FrameBufferConfig0: UV_SWIZZLE Mask*/ + +#define DISP_FrameBufferConfig0_FORMAT_Pos (26) /*!< DISP_T::FrameBufferConfig0: FORMAT Position*/ +#define DISP_FrameBufferConfig0_FORMAT_Msk (0x3ful << DISP_FrameBufferConfig0_FORMAT_Pos) /*!< DISP_T::FrameBufferConfig0: FORMAT Mask*/ + +#define DISP_FrameBufferBGColor0_BLUE_Pos (0) /*!< DISP_T::FrameBufferBGColor0: BLUE Position*/ +#define DISP_FrameBufferBGColor0_BLUE_Msk (0xfful << DISP_FrameBufferBGColor0_BLUE_Pos) /*!< DISP_T::FrameBufferBGColor0: BLUE Mask*/ + +#define DISP_FrameBufferBGColor0_GREEN_Pos (8) /*!< DISP_T::FrameBufferBGColor0: GREEN Position*/ +#define DISP_FrameBufferBGColor0_GREEN_Msk (0xfful << DISP_FrameBufferBGColor0_GREEN_Pos) /*!< DISP_T::FrameBufferBGColor0: GREEN Mask*/ + +#define DISP_FrameBufferBGColor0_RED_Pos (16) /*!< DISP_T::FrameBufferBGColor0: RED Position*/ +#define DISP_FrameBufferBGColor0_RED_Msk (0xfful << DISP_FrameBufferBGColor0_RED_Pos) /*!< DISP_T::FrameBufferBGColor0: RED Mask*/ + +#define DISP_FrameBufferBGColor0_ALPHA_Pos (24) /*!< DISP_T::FrameBufferBGColor0: ALPHA Position*/ +#define DISP_FrameBufferBGColor0_ALPHA_Msk (0xfful << DISP_FrameBufferBGColor0_ALPHA_Pos) /*!< DISP_T::FrameBufferBGColor0: ALPHA Mask*/ + +#define DISP_FrameBufferUPlanarAddress0_ADDRESS_Pos (0) /*!< DISP_T::FrameBufferUPlanarAddress0: ADDRESS Position*/ +#define DISP_FrameBufferUPlanarAddress0_ADDRESS_Msk (0x7ffffffful << DISP_FrameBufferUPlanarAddress0_ADDRESS_Pos) /*!< DISP_T::FrameBufferUPlanarAddress0: ADDRESS Mask*/ + +#define DISP_FrameBufferUPlanarAddress0_TYPE_Pos (31) /*!< DISP_T::FrameBufferUPlanarAddress0: TYPE Position*/ +#define DISP_FrameBufferUPlanarAddress0_TYPE_Msk (0x1ul << DISP_FrameBufferUPlanarAddress0_TYPE_Pos) /*!< DISP_T::FrameBufferUPlanarAddress0: TYPE Mask*/ + +#define DISP_FrameBufferVPlanarAddress0_ADDRESS_Pos (0) /*!< DISP_T::FrameBufferVPlanarAddress0: ADDRESS Position*/ +#define DISP_FrameBufferVPlanarAddress0_ADDRESS_Msk (0x7ffffffful << DISP_FrameBufferVPlanarAddress0_ADDRESS_Pos) /*!< DISP_T::FrameBufferVPlanarAddress0: ADDRESS Mask*/ + +#define DISP_FrameBufferVPlanarAddress0_TYPE_Pos (31) /*!< DISP_T::FrameBufferVPlanarAddress0: TYPE Position*/ +#define DISP_FrameBufferVPlanarAddress0_TYPE_Msk (0x1ul << DISP_FrameBufferVPlanarAddress0_TYPE_Pos) /*!< DISP_T::FrameBufferVPlanarAddress0: TYPE Mask*/ + +#define DISP_OverlayConfig0_TRANSPARENCY_Pos (0) /*!< DISP_T::OverlayConfig0: TRANSPARENCY Position*/ +#define DISP_OverlayConfig0_TRANSPARENCY_Msk (0x3ul << DISP_OverlayConfig0_TRANSPARENCY_Pos) /*!< DISP_T::OverlayConfig0: TRANSPARENCY Mask*/ + +#define DISP_OverlayConfig0_YUV_Pos (5) /*!< DISP_T::OverlayConfig0: YUV Position*/ +#define DISP_OverlayConfig0_YUV_Msk (0x7ul << DISP_OverlayConfig0_YUV_Pos) /*!< DISP_T::OverlayConfig0: YUV Mask */ + +#define DISP_OverlayConfig0_SWIZZLE_Pos (13) /*!< DISP_T::OverlayConfig0: SWIZZLE Position*/ +#define DISP_OverlayConfig0_SWIZZLE_Msk (0x3ul << DISP_OverlayConfig0_SWIZZLE_Pos) /*!< DISP_T::OverlayConfig0: SWIZZLE Mask*/ + +#define DISP_OverlayConfig0_UV_SWIZZLE_Pos (15) /*!< DISP_T::OverlayConfig0: UV_SWIZZLE Position*/ +#define DISP_OverlayConfig0_UV_SWIZZLE_Msk (0x1ul << DISP_OverlayConfig0_UV_SWIZZLE_Pos) /*!< DISP_T::OverlayConfig0: UV_SWIZZLE Mask*/ + +#define DISP_OverlayConfig0_FORMAT_Pos (16) /*!< DISP_T::OverlayConfig0: FORMAT Position*/ +#define DISP_OverlayConfig0_FORMAT_Msk (0x3ful << DISP_OverlayConfig0_FORMAT_Pos) /*!< DISP_T::OverlayConfig0: FORMAT Mask*/ + +#define DISP_OverlayConfig0_UNDERFLOW_Pos (23) /*!< DISP_T::OverlayConfig0: UNDERFLOW Position*/ +#define DISP_OverlayConfig0_UNDERFLOW_Msk (0x1ul << DISP_OverlayConfig0_UNDERFLOW_Pos) /*!< DISP_T::OverlayConfig0: UNDERFLOW Mask*/ + +#define DISP_OverlayConfig0_ENABLE_Pos (24) /*!< DISP_T::OverlayConfig0: ENABLE Position*/ +#define DISP_OverlayConfig0_ENABLE_Msk (0x1ul << DISP_OverlayConfig0_ENABLE_Pos) /*!< DISP_T::OverlayConfig0: ENABLE Mask*/ + +#define DISP_OverlayConfig0_CLEAR_Pos (25) /*!< DISP_T::OverlayConfig0: CLEAR Position*/ +#define DISP_OverlayConfig0_CLEAR_Msk (0x1ul << DISP_OverlayConfig0_CLEAR_Pos) /*!< DISP_T::OverlayConfig0: CLEAR Mask*/ + +#define DISP_OverlayAlphaBlendConfig0_SRC_ALPHA_MODE_Pos (0) /*!< DISP_T::OverlayAlphaBlendConfig0: SRC_ALPHA_MODE Position*/ +#define DISP_OverlayAlphaBlendConfig0_SRC_ALPHA_MODE_Msk (0x1ul << DISP_OverlayAlphaBlendConfig0_SRC_ALPHA_MODE_Pos) /*!< DISP_T::OverlayAlphaBlendConfig0: SRC_ALPHA_MODE Mask*/ + +#define DISP_OverlayAlphaBlendConfig0_DISABLE_ALPHA_BLEND_Pos (1) /*!< DISP_T::OverlayAlphaBlendConfig0: DISABLE_ALPHA_BLEND Position*/ +#define DISP_OverlayAlphaBlendConfig0_DISABLE_ALPHA_BLEND_Msk (0x1ul << DISP_OverlayAlphaBlendConfig0_DISABLE_ALPHA_BLEND_Pos) /*!< DISP_T::OverlayAlphaBlendConfig0: DISABLE_ALPHA_BLEND Mask*/ + +#define DISP_OverlayAlphaBlendConfig0_SRC_GLOBAL_ALPHA_MODE_Pos (3) /*!< DISP_T::OverlayAlphaBlendConfig0: SRC_GLOBAL_ALPHA_MODE Position*/ +#define DISP_OverlayAlphaBlendConfig0_SRC_GLOBAL_ALPHA_MODE_Msk (0x3ul << DISP_OverlayAlphaBlendConfig0_SRC_GLOBAL_ALPHA_MODE_Pos) /*!< DISP_T::OverlayAlphaBlendConfig0: SRC_GLOBAL_ALPHA_MODE Mask*/ + +#define DISP_OverlayAlphaBlendConfig0_SRC_BLENDING_MODE_Pos (5) /*!< DISP_T::OverlayAlphaBlendConfig0: SRC_BLENDING_MODE Position*/ +#define DISP_OverlayAlphaBlendConfig0_SRC_BLENDING_MODE_Msk (0x7ul << DISP_OverlayAlphaBlendConfig0_SRC_BLENDING_MODE_Pos) /*!< DISP_T::OverlayAlphaBlendConfig0: SRC_BLENDING_MODE Mask*/ + +#define DISP_OverlayAlphaBlendConfig0_SRC_ALPHA_FACTOR_Pos (8) /*!< DISP_T::OverlayAlphaBlendConfig0: SRC_ALPHA_FACTOR Position*/ +#define DISP_OverlayAlphaBlendConfig0_SRC_ALPHA_FACTOR_Msk (0x1ul << DISP_OverlayAlphaBlendConfig0_SRC_ALPHA_FACTOR_Pos) /*!< DISP_T::OverlayAlphaBlendConfig0: SRC_ALPHA_FACTOR Mask*/ + +#define DISP_OverlayAlphaBlendConfig0_DST_ALPHA_MODE_Pos (9) /*!< DISP_T::OverlayAlphaBlendConfig0: DST_ALPHA_MODE Position*/ +#define DISP_OverlayAlphaBlendConfig0_DST_ALPHA_MODE_Msk (0x1ul << DISP_OverlayAlphaBlendConfig0_DST_ALPHA_MODE_Pos) /*!< DISP_T::OverlayAlphaBlendConfig0: DST_ALPHA_MODE Mask*/ + +#define DISP_OverlayAlphaBlendConfig0_DST_GLOBAL_ALPHA_MODE_Pos (10) /*!< DISP_T::OverlayAlphaBlendConfig0: DST_GLOBAL_ALPHA_MODE Position*/ +#define DISP_OverlayAlphaBlendConfig0_DST_GLOBAL_ALPHA_MODE_Msk (0x3ul << DISP_OverlayAlphaBlendConfig0_DST_GLOBAL_ALPHA_MODE_Pos) /*!< DISP_T::OverlayAlphaBlendConfig0: DST_GLOBAL_ALPHA_MODE Mask*/ + +#define DISP_OverlayAlphaBlendConfig0_DST_BLENDING_MODE_Pos (12) /*!< DISP_T::OverlayAlphaBlendConfig0: DST_BLENDING_MODE Position*/ +#define DISP_OverlayAlphaBlendConfig0_DST_BLENDING_MODE_Msk (0x7ul << DISP_OverlayAlphaBlendConfig0_DST_BLENDING_MODE_Pos) /*!< DISP_T::OverlayAlphaBlendConfig0: DST_BLENDING_MODE Mask*/ + +#define DISP_OverlayAlphaBlendConfig0_DST_ALPHA_FACTOR_Pos (15) /*!< DISP_T::OverlayAlphaBlendConfig0: DST_ALPHA_FACTOR Position*/ +#define DISP_OverlayAlphaBlendConfig0_DST_ALPHA_FACTOR_Msk (0x1ul << DISP_OverlayAlphaBlendConfig0_DST_ALPHA_FACTOR_Pos) /*!< DISP_T::OverlayAlphaBlendConfig0: DST_ALPHA_FACTOR Mask*/ + +#define DISP_OverlayAddress0_ADDRESS_Pos (0) /*!< DISP_T::OverlayAddress0: ADDRESS Position*/ +#define DISP_OverlayAddress0_ADDRESS_Msk (0x7ffffffful << DISP_OverlayAddress0_ADDRESS_Pos) /*!< DISP_T::OverlayAddress0: ADDRESS Mask*/ + +#define DISP_OverlayAddress0_TYPE_Pos (31) /*!< DISP_T::OverlayAddress0: TYPE Position*/ +#define DISP_OverlayAddress0_TYPE_Msk (0x1ul << DISP_OverlayAddress0_TYPE_Pos) /*!< DISP_T::OverlayAddress0: TYPE Mask*/ + +#define DISP_OverlayStride0_STRIDE_Pos (0) /*!< DISP_T::OverlayStride0: STRIDE Position*/ +#define DISP_OverlayStride0_STRIDE_Msk (0x1fffful << DISP_OverlayStride0_STRIDE_Pos) /*!< DISP_T::OverlayStride0: STRIDE Mask*/ + +#define DISP_OverlayTL0_X_Pos (0) /*!< DISP_T::OverlayTL0: X Position */ +#define DISP_OverlayTL0_X_Msk (0x7ffful << DISP_OverlayTL0_X_Pos) /*!< DISP_T::OverlayTL0: X Mask */ + +#define DISP_OverlayTL0_Y_Pos (15) /*!< DISP_T::OverlayTL0: Y Position */ +#define DISP_OverlayTL0_Y_Msk (0x7ffful << DISP_OverlayTL0_Y_Pos) /*!< DISP_T::OverlayTL0: Y Mask */ + +#define DISP_OverlayBR0_X_Pos (0) /*!< DISP_T::OverlayBR0: X Position */ +#define DISP_OverlayBR0_X_Msk (0x7ffful << DISP_OverlayBR0_X_Pos) /*!< DISP_T::OverlayBR0: X Mask */ + +#define DISP_OverlayBR0_Y_Pos (15) /*!< DISP_T::OverlayBR0: Y Position */ +#define DISP_OverlayBR0_Y_Msk (0x7ffful << DISP_OverlayBR0_Y_Pos) /*!< DISP_T::OverlayBR0: Y Mask */ + +#define DISP_OverlaySrcGlobalColor0_BLUE_Pos (0) /*!< DISP_T::OverlaySrcGlobalColor0: BLUE Position*/ +#define DISP_OverlaySrcGlobalColor0_BLUE_Msk (0xfful << DISP_OverlaySrcGlobalColor0_BLUE_Pos) /*!< DISP_T::OverlaySrcGlobalColor0: BLUE Mask*/ + +#define DISP_OverlaySrcGlobalColor0_GREEN_Pos (8) /*!< DISP_T::OverlaySrcGlobalColor0: GREEN Position*/ +#define DISP_OverlaySrcGlobalColor0_GREEN_Msk (0xfful << DISP_OverlaySrcGlobalColor0_GREEN_Pos) /*!< DISP_T::OverlaySrcGlobalColor0: GREEN Mask*/ + +#define DISP_OverlaySrcGlobalColor0_RED_Pos (16) /*!< DISP_T::OverlaySrcGlobalColor0: RED Position*/ +#define DISP_OverlaySrcGlobalColor0_RED_Msk (0xfful << DISP_OverlaySrcGlobalColor0_RED_Pos) /*!< DISP_T::OverlaySrcGlobalColor0: RED Mask*/ + +#define DISP_OverlaySrcGlobalColor0_ALPHA_Pos (24) /*!< DISP_T::OverlaySrcGlobalColor0: ALPHA Position*/ +#define DISP_OverlaySrcGlobalColor0_ALPHA_Msk (0xfful << DISP_OverlaySrcGlobalColor0_ALPHA_Pos) /*!< DISP_T::OverlaySrcGlobalColor0: ALPHA Mask*/ + +#define DISP_OverlayDstGlobalColor0_BLUE_Pos (0) /*!< DISP_T::OverlayDstGlobalColor0: BLUE Position*/ +#define DISP_OverlayDstGlobalColor0_BLUE_Msk (0xfful << DISP_OverlayDstGlobalColor0_BLUE_Pos) /*!< DISP_T::OverlayDstGlobalColor0: BLUE Mask*/ + +#define DISP_OverlayDstGlobalColor0_GREEN_Pos (8) /*!< DISP_T::OverlayDstGlobalColor0: GREEN Position*/ +#define DISP_OverlayDstGlobalColor0_GREEN_Msk (0xfful << DISP_OverlayDstGlobalColor0_GREEN_Pos) /*!< DISP_T::OverlayDstGlobalColor0: GREEN Mask*/ + +#define DISP_OverlayDstGlobalColor0_RED_Pos (16) /*!< DISP_T::OverlayDstGlobalColor0: RED Position*/ +#define DISP_OverlayDstGlobalColor0_RED_Msk (0xfful << DISP_OverlayDstGlobalColor0_RED_Pos) /*!< DISP_T::OverlayDstGlobalColor0: RED Mask*/ + +#define DISP_OverlayDstGlobalColor0_ALPHA_Pos (24) /*!< DISP_T::OverlayDstGlobalColor0: ALPHA Position*/ +#define DISP_OverlayDstGlobalColor0_ALPHA_Msk (0xfful << DISP_OverlayDstGlobalColor0_ALPHA_Pos) /*!< DISP_T::OverlayDstGlobalColor0: ALPHA Mask*/ + +#define DISP_OverlayColorKey0_BLUE_Pos (0) /*!< DISP_T::OverlayColorKey0: BLUE Position*/ +#define DISP_OverlayColorKey0_BLUE_Msk (0xfful << DISP_OverlayColorKey0_BLUE_Pos) /*!< DISP_T::OverlayColorKey0: BLUE Mask*/ + +#define DISP_OverlayColorKey0_GREEN_Pos (8) /*!< DISP_T::OverlayColorKey0: GREEN Position*/ +#define DISP_OverlayColorKey0_GREEN_Msk (0xfful << DISP_OverlayColorKey0_GREEN_Pos) /*!< DISP_T::OverlayColorKey0: GREEN Mask*/ + +#define DISP_OverlayColorKey0_RED_Pos (16) /*!< DISP_T::OverlayColorKey0: RED Position*/ +#define DISP_OverlayColorKey0_RED_Msk (0xfful << DISP_OverlayColorKey0_RED_Pos) /*!< DISP_T::OverlayColorKey0: RED Mask*/ + +#define DISP_OverlayColorKey0_ALPHA_Pos (24) /*!< DISP_T::OverlayColorKey0: ALPHA Position*/ +#define DISP_OverlayColorKey0_ALPHA_Msk (0xfful << DISP_OverlayColorKey0_ALPHA_Pos) /*!< DISP_T::OverlayColorKey0: ALPHA Mask*/ + +#define DISP_OverlayColorKeyHigh0_BLUE_Pos (0) /*!< DISP_T::OverlayColorKeyHigh0: BLUE Position*/ +#define DISP_OverlayColorKeyHigh0_BLUE_Msk (0xfful << DISP_OverlayColorKeyHigh0_BLUE_Pos) /*!< DISP_T::OverlayColorKeyHigh0: BLUE Mask*/ + +#define DISP_OverlayColorKeyHigh0_GREEN_Pos (8) /*!< DISP_T::OverlayColorKeyHigh0: GREEN Position*/ +#define DISP_OverlayColorKeyHigh0_GREEN_Msk (0xfful << DISP_OverlayColorKeyHigh0_GREEN_Pos) /*!< DISP_T::OverlayColorKeyHigh0: GREEN Mask*/ + +#define DISP_OverlayColorKeyHigh0_RED_Pos (16) /*!< DISP_T::OverlayColorKeyHigh0: RED Position*/ +#define DISP_OverlayColorKeyHigh0_RED_Msk (0xfful << DISP_OverlayColorKeyHigh0_RED_Pos) /*!< DISP_T::OverlayColorKeyHigh0: RED Mask*/ + +#define DISP_OverlayColorKeyHigh0_ALPHA_Pos (24) /*!< DISP_T::OverlayColorKeyHigh0: ALPHA Position*/ +#define DISP_OverlayColorKeyHigh0_ALPHA_Msk (0xfful << DISP_OverlayColorKeyHigh0_ALPHA_Pos) /*!< DISP_T::OverlayColorKeyHigh0: ALPHA Mask*/ + +#define DISP_OverlaySize0_WIDTH_Pos (0) /*!< DISP_T::OverlaySize0: WIDTH Position*/ +#define DISP_OverlaySize0_WIDTH_Msk (0x7ffful << DISP_OverlaySize0_WIDTH_Pos) /*!< DISP_T::OverlaySize0: WIDTH Mask */ + +#define DISP_OverlaySize0_HEIGHT_Pos (15) /*!< DISP_T::OverlaySize0: HEIGHT Position*/ +#define DISP_OverlaySize0_HEIGHT_Msk (0x7ffful << DISP_OverlaySize0_HEIGHT_Pos) /*!< DISP_T::OverlaySize0: HEIGHT Mask */ + +#define DISP_FrameBufferUStride0_STRIDE_Pos (0) /*!< DISP_T::FrameBufferUStride0: STRIDE Position*/ +#define DISP_FrameBufferUStride0_STRIDE_Msk (0x1fffful << DISP_FrameBufferUStride0_STRIDE_Pos) /*!< DISP_T::FrameBufferUStride0: STRIDE Mask*/ + +#define DISP_FrameBufferVStride0_STRIDE_Pos (0) /*!< DISP_T::FrameBufferVStride0: STRIDE Position*/ +#define DISP_FrameBufferVStride0_STRIDE_Msk (0x1fffful << DISP_FrameBufferVStride0_STRIDE_Pos) /*!< DISP_T::FrameBufferVStride0: STRIDE Mask*/ + +#define DISP_FrameBufferSize0_WIDTH_Pos (0) /*!< DISP_T::FrameBufferSize0: WIDTH Position*/ +#define DISP_FrameBufferSize0_WIDTH_Msk (0x7ffful << DISP_FrameBufferSize0_WIDTH_Pos) /*!< DISP_T::FrameBufferSize0: WIDTH Mask*/ + +#define DISP_FrameBufferSize0_HEIGHT_Pos (15) /*!< DISP_T::FrameBufferSize0: HEIGHT Position*/ +#define DISP_FrameBufferSize0_HEIGHT_Msk (0x7ffful << DISP_FrameBufferSize0_HEIGHT_Pos) /*!< DISP_T::FrameBufferSize0: HEIGHT Mask*/ + +#define DISP_IndexColorTableIndex0_INDEX_Pos (0) /*!< DISP_T::IndexColorTableIndex0: INDEX Position*/ +#define DISP_IndexColorTableIndex0_INDEX_Msk (0xfful << DISP_IndexColorTableIndex0_INDEX_Pos) /*!< DISP_T::IndexColorTableIndex0: INDEX Mask*/ + +#define DISP_IndexColorTableData0_BLUE_Pos (0) /*!< DISP_T::IndexColorTableData0: BLUE Position*/ +#define DISP_IndexColorTableData0_BLUE_Msk (0xfful << DISP_IndexColorTableData0_BLUE_Pos) /*!< DISP_T::IndexColorTableData0: BLUE Mask*/ + +#define DISP_IndexColorTableData0_GREEN_Pos (8) /*!< DISP_T::IndexColorTableData0: GREEN Position*/ +#define DISP_IndexColorTableData0_GREEN_Msk (0xfful << DISP_IndexColorTableData0_GREEN_Pos) /*!< DISP_T::IndexColorTableData0: GREEN Mask*/ + +#define DISP_IndexColorTableData0_RED_Pos (16) /*!< DISP_T::IndexColorTableData0: RED Position*/ +#define DISP_IndexColorTableData0_RED_Msk (0xfful << DISP_IndexColorTableData0_RED_Pos) /*!< DISP_T::IndexColorTableData0: RED Mask*/ + +#define DISP_IndexColorTableData0_ALPHA_Pos (24) /*!< DISP_T::IndexColorTableData0: ALPHA Position*/ +#define DISP_IndexColorTableData0_ALPHA_Msk (0xfful << DISP_IndexColorTableData0_ALPHA_Pos) /*!< DISP_T::IndexColorTableData0: ALPHA Mask*/ + +#define DISP_OverlayUPlanarAddress0_ADDRESS_Pos (0) /*!< DISP_T::OverlayUPlanarAddress0: ADDRESS Position*/ +#define DISP_OverlayUPlanarAddress0_ADDRESS_Msk (0x7ffffffful << DISP_OverlayUPlanarAddress0_ADDRESS_Pos) /*!< DISP_T::OverlayUPlanarAddress0: ADDRESS Mask*/ + +#define DISP_OverlayUPlanarAddress0_TYPE_Pos (31) /*!< DISP_T::OverlayUPlanarAddress0: TYPE Position*/ +#define DISP_OverlayUPlanarAddress0_TYPE_Msk (0x1ul << DISP_OverlayUPlanarAddress0_TYPE_Pos) /*!< DISP_T::OverlayUPlanarAddress0: TYPE Mask*/ + +#define DISP_OverlayVPlanarAddress0_ADDRESS_Pos (0) /*!< DISP_T::OverlayVPlanarAddress0: ADDRESS Position*/ +#define DISP_OverlayVPlanarAddress0_ADDRESS_Msk (0x7ffffffful << DISP_OverlayVPlanarAddress0_ADDRESS_Pos) /*!< DISP_T::OverlayVPlanarAddress0: ADDRESS Mask*/ + +#define DISP_OverlayVPlanarAddress0_TYPE_Pos (31) /*!< DISP_T::OverlayVPlanarAddress0: TYPE Position*/ +#define DISP_OverlayVPlanarAddress0_TYPE_Msk (0x1ul << DISP_OverlayVPlanarAddress0_TYPE_Pos) /*!< DISP_T::OverlayVPlanarAddress0: TYPE Mask*/ + +#define DISP_OverlayUStride0_STRIDE_Pos (0) /*!< DISP_T::OverlayUStride0: STRIDE Position*/ +#define DISP_OverlayUStride0_STRIDE_Msk (0x1fffful << DISP_OverlayUStride0_STRIDE_Pos) /*!< DISP_T::OverlayUStride0: STRIDE Mask*/ + +#define DISP_OverlayVStride0_STRIDE_Pos (0) /*!< DISP_T::OverlayVStride0: STRIDE Position*/ +#define DISP_OverlayVStride0_STRIDE_Msk (0x1fffful << DISP_OverlayVStride0_STRIDE_Pos) /*!< DISP_T::OverlayVStride0: STRIDE Mask*/ + +#define DISP_OverlayClearValue0_BLUE_Pos (0) /*!< DISP_T::OverlayClearValue0: BLUE Position*/ +#define DISP_OverlayClearValue0_BLUE_Msk (0xfful << DISP_OverlayClearValue0_BLUE_Pos) /*!< DISP_T::OverlayClearValue0: BLUE Mask*/ + +#define DISP_OverlayClearValue0_GREEN_Pos (8) /*!< DISP_T::OverlayClearValue0: GREEN Position*/ +#define DISP_OverlayClearValue0_GREEN_Msk (0xfful << DISP_OverlayClearValue0_GREEN_Pos) /*!< DISP_T::OverlayClearValue0: GREEN Mask*/ + +#define DISP_OverlayClearValue0_RED_Pos (16) /*!< DISP_T::OverlayClearValue0: RED Position*/ +#define DISP_OverlayClearValue0_RED_Msk (0xfful << DISP_OverlayClearValue0_RED_Pos) /*!< DISP_T::OverlayClearValue0: RED Mask*/ + +#define DISP_OverlayClearValue0_ALPHA_Pos (24) /*!< DISP_T::OverlayClearValue0: ALPHA Position*/ +#define DISP_OverlayClearValue0_ALPHA_Msk (0xfful << DISP_OverlayClearValue0_ALPHA_Pos) /*!< DISP_T::OverlayClearValue0: ALPHA Mask*/ + +#define DISP_OverlayIndexColorTableIndex0_INDEX_Pos (0) /*!< DISP_T::OverlayIndexColorTableIndex0: INDEX Position*/ +#define DISP_OverlayIndexColorTableIndex0_INDEX_Msk (0xfful << DISP_OverlayIndexColorTableIndex0_INDEX_Pos) /*!< DISP_T::OverlayIndexColorTableIndex0: INDEX Mask*/ + +#define DISP_OverlayIndexColorTableData0_BLUE_Pos (0) /*!< DISP_T::OverlayIndexColorTableData0: BLUE Position*/ +#define DISP_OverlayIndexColorTableData0_BLUE_Msk (0xfful << DISP_OverlayIndexColorTableData0_BLUE_Pos) /*!< DISP_T::OverlayIndexColorTableData0: BLUE Mask*/ + +#define DISP_OverlayIndexColorTableData0_GREEN_Pos (8) /*!< DISP_T::OverlayIndexColorTableData0: GREEN Position*/ +#define DISP_OverlayIndexColorTableData0_GREEN_Msk (0xfful << DISP_OverlayIndexColorTableData0_GREEN_Pos) /*!< DISP_T::OverlayIndexColorTableData0: GREEN Mask*/ + +#define DISP_OverlayIndexColorTableData0_RED_Pos (16) /*!< DISP_T::OverlayIndexColorTableData0: RED Position*/ +#define DISP_OverlayIndexColorTableData0_RED_Msk (0xfful << DISP_OverlayIndexColorTableData0_RED_Pos) /*!< DISP_T::OverlayIndexColorTableData0: RED Mask*/ + +#define DISP_OverlayIndexColorTableData0_ALPHA_Pos (24) /*!< DISP_T::OverlayIndexColorTableData0: ALPHA Position*/ +#define DISP_OverlayIndexColorTableData0_ALPHA_Msk (0xfful << DISP_OverlayIndexColorTableData0_ALPHA_Pos) /*!< DISP_T::OverlayIndexColorTableData0: ALPHA Mask*/ + +#define DISP_FrameBufferClearValue0_BLUE_Pos (0) /*!< DISP_T::FrameBufferClearValue0: BLUE Position*/ +#define DISP_FrameBufferClearValue0_BLUE_Msk (0xfful << DISP_FrameBufferClearValue0_BLUE_Pos) /*!< DISP_T::FrameBufferClearValue0: BLUE Mask*/ + +#define DISP_FrameBufferClearValue0_GREEN_Pos (8) /*!< DISP_T::FrameBufferClearValue0: GREEN Position*/ +#define DISP_FrameBufferClearValue0_GREEN_Msk (0xfful << DISP_FrameBufferClearValue0_GREEN_Pos) /*!< DISP_T::FrameBufferClearValue0: GREEN Mask*/ + +#define DISP_FrameBufferClearValue0_RED_Pos (16) /*!< DISP_T::FrameBufferClearValue0: RED Position*/ +#define DISP_FrameBufferClearValue0_RED_Msk (0xfful << DISP_FrameBufferClearValue0_RED_Pos) /*!< DISP_T::FrameBufferClearValue0: RED Mask*/ + +#define DISP_FrameBufferClearValue0_ALPHA_Pos (24) /*!< DISP_T::FrameBufferClearValue0: ALPHA Position*/ +#define DISP_FrameBufferClearValue0_ALPHA_Msk (0xfful << DISP_FrameBufferClearValue0_ALPHA_Pos) /*!< DISP_T::FrameBufferClearValue0: ALPHA Mask*/ + +#define DISP_ModuleClockGatingControl0_DISABLE_MODULE_CLOCK_GATING_VIDEO_Pos (0) /*!< DISP_T::ModuleClockGatingControl0: DISABLE_MODULE_CLOCK_GATING_VIDEO Position*/ +#define DISP_ModuleClockGatingControl0_DISABLE_MODULE_CLOCK_GATING_VIDEO_Msk (0x1ul << DISP_ModuleClockGatingControl0_DISABLE_MODULE_CLOCK_GATING_VIDEO_Pos) /*!< DISP_T::ModuleClockGatingControl0: DISABLE_MODULE_CLOCK_GATING_VIDEO Mask*/ + +#define DISP_ModuleClockGatingControl0_DISABLE_MODULE_CLOCK_GATING_OVERLAY0_Pos (1) /*!< DISP_T::ModuleClockGatingControl0: DISABLE_MODULE_CLOCK_GATING_OVERLAY0 Position*/ +#define DISP_ModuleClockGatingControl0_DISABLE_MODULE_CLOCK_GATING_OVERLAY0_Msk (0x1ul << DISP_ModuleClockGatingControl0_DISABLE_MODULE_CLOCK_GATING_OVERLAY0_Pos) /*!< DISP_T::ModuleClockGatingControl0: DISABLE_MODULE_CLOCK_GATING_OVERLAY0 Mask*/ + +#define DISP_ModuleClockGatingControl0_DISABLE_MODULE_CLOCK_GATING_WB_FIFO_Pos (9) /*!< DISP_T::ModuleClockGatingControl0: DISABLE_MODULE_CLOCK_GATING_WB_FIFO Position*/ +#define DISP_ModuleClockGatingControl0_DISABLE_MODULE_CLOCK_GATING_WB_FIFO_Msk (0x1ul << DISP_ModuleClockGatingControl0_DISABLE_MODULE_CLOCK_GATING_WB_FIFO_Pos) /*!< DISP_T::ModuleClockGatingControl0: DISABLE_MODULE_CLOCK_GATING_WB_FIFO Mask*/ + +#define DISP_LatencyCounter0_COUNTER_Pos (0) /*!< DISP_T::LatencyCounter0: COUNTER Position*/ +#define DISP_LatencyCounter0_COUNTER_Msk (0xfffffffful << DISP_LatencyCounter0_COUNTER_Pos) /*!< DISP_T::LatencyCounter0: COUNTER Mask*/ + +#define DISP_Qos0_LOW_Pos (0) /*!< DISP_T::Qos0: LOW Position */ +#define DISP_Qos0_LOW_Msk (0xful << DISP_Qos0_LOW_Pos) /*!< DISP_T::Qos0: LOW Mask */ + +#define DISP_Qos0_HIGH_Pos (4) /*!< DISP_T::Qos0: HIGH Position */ +#define DISP_Qos0_HIGH_Msk (0xful << DISP_Qos0_HIGH_Pos) /*!< DISP_T::Qos0: HIGH Mask */ + +#define DISP_MpuIntfCmd0_REG_DATA_Pos (0) /*!< DISP_T::MpuIntfCmd0: REG_DATA Position*/ +#define DISP_MpuIntfCmd0_REG_DATA_Msk (0xfffful << DISP_MpuIntfCmd0_REG_DATA_Pos) /*!< DISP_T::MpuIntfCmd0: REG_DATA Mask*/ + +#define DISP_MpuIntfCmd0_READ_COUNT_Pos (24) /*!< DISP_T::MpuIntfCmd0: READ_COUNT Position*/ +#define DISP_MpuIntfCmd0_READ_COUNT_Msk (0x7ul << DISP_MpuIntfCmd0_READ_COUNT_Pos) /*!< DISP_T::MpuIntfCmd0: READ_COUNT Mask*/ + +#define DISP_MpuIntfCmd0_START_Pos (29) /*!< DISP_T::MpuIntfCmd0: START Position*/ +#define DISP_MpuIntfCmd0_START_Msk (0x1ul << DISP_MpuIntfCmd0_START_Pos) /*!< DISP_T::MpuIntfCmd0: START Mask */ + +#define DISP_MpuIntfCmd0_CMD_Pos (30) /*!< DISP_T::MpuIntfCmd0: CMD Position */ +#define DISP_MpuIntfCmd0_CMD_Msk (0x3ul << DISP_MpuIntfCmd0_CMD_Pos) /*!< DISP_T::MpuIntfCmd0: CMD Mask */ + +#define DISP_MpuIntfReadPara00_DATA_Pos (0) /*!< DISP_T::MpuIntfReadPara00: DATA Position*/ +#define DISP_MpuIntfReadPara00_DATA_Msk (0x3fffful << DISP_MpuIntfReadPara00_DATA_Pos) /*!< DISP_T::MpuIntfReadPara00: DATA Mask*/ + +#define DISP_MpuIntfReadPara10_DATA_Pos (0) /*!< DISP_T::MpuIntfReadPara10: DATA Position*/ +#define DISP_MpuIntfReadPara10_DATA_Msk (0x3fffful << DISP_MpuIntfReadPara10_DATA_Pos) /*!< DISP_T::MpuIntfReadPara10: DATA Mask*/ + +#define DISP_MpuIntfReadPara20_DATA_Pos (0) /*!< DISP_T::MpuIntfReadPara20: DATA Position*/ +#define DISP_MpuIntfReadPara20_DATA_Msk (0x3fffful << DISP_MpuIntfReadPara20_DATA_Pos) /*!< DISP_T::MpuIntfReadPara20: DATA Mask*/ + +#define DISP_MpuIntfReadPara30_DATA_Pos (0) /*!< DISP_T::MpuIntfReadPara30: DATA Position*/ +#define DISP_MpuIntfReadPara30_DATA_Msk (0x3fffful << DISP_MpuIntfReadPara30_DATA_Pos) /*!< DISP_T::MpuIntfReadPara30: DATA Mask*/ + +#define DISP_MpuIntfReadPara40_DATA_Pos (0) /*!< DISP_T::MpuIntfReadPara40: DATA Position*/ +#define DISP_MpuIntfReadPara40_DATA_Msk (0x3fffful << DISP_MpuIntfReadPara40_DATA_Pos) /*!< DISP_T::MpuIntfReadPara40: DATA Mask*/ + +#define DISP_MpuIntfReadStatus0_DATA_Pos (0) /*!< DISP_T::MpuIntfReadStatus0: DATA Position*/ +#define DISP_MpuIntfReadStatus0_DATA_Msk (0x1ul << DISP_MpuIntfReadStatus0_DATA_Pos) /*!< DISP_T::MpuIntfReadStatus0: DATA Mask*/ + +#define DISP_MpuIntfConfig0_REGISTER_MODE_Pos (0) /*!< DISP_T::MpuIntfConfig0: REGISTER_MODE Position*/ +#define DISP_MpuIntfConfig0_REGISTER_MODE_Msk (0x1ul << DISP_MpuIntfConfig0_REGISTER_MODE_Pos) /*!< DISP_T::MpuIntfConfig0: REGISTER_MODE Mask*/ + +#define DISP_MpuIntfConfig0_DATA_BUS_WIDTH_Pos (1) /*!< DISP_T::MpuIntfConfig0: DATA_BUS_WIDTH Position*/ +#define DISP_MpuIntfConfig0_DATA_BUS_WIDTH_Msk (0x3ul << DISP_MpuIntfConfig0_DATA_BUS_WIDTH_Pos) /*!< DISP_T::MpuIntfConfig0: DATA_BUS_WIDTH Mask*/ + +#define DISP_MpuIntfConfig0_DATA_BUS_MODE_Pos (3) /*!< DISP_T::MpuIntfConfig0: DATA_BUS_MODE Position*/ +#define DISP_MpuIntfConfig0_DATA_BUS_MODE_Msk (0x1ul << DISP_MpuIntfConfig0_DATA_BUS_MODE_Pos) /*!< DISP_T::MpuIntfConfig0: DATA_BUS_MODE Mask*/ + +#define DISP_MpuIntfConfig0_INTERFACE_MODE_Pos (4) /*!< DISP_T::MpuIntfConfig0: INTERFACE_MODE Position*/ +#define DISP_MpuIntfConfig0_INTERFACE_MODE_Msk (0x1ul << DISP_MpuIntfConfig0_INTERFACE_MODE_Pos) /*!< DISP_T::MpuIntfConfig0: INTERFACE_MODE Mask*/ + +#define DISP_MpuIntfConfig0_ENABLE_VSYNC_Pos (5) /*!< DISP_T::MpuIntfConfig0: ENABLE_VSYNC Position*/ +#define DISP_MpuIntfConfig0_ENABLE_VSYNC_Msk (0x1ul << DISP_MpuIntfConfig0_ENABLE_VSYNC_Pos) /*!< DISP_T::MpuIntfConfig0: ENABLE_VSYNC Mask*/ + +#define DISP_MpuIntfConfig0_VSYNC_POLARITY_Pos (6) /*!< DISP_T::MpuIntfConfig0: VSYNC_POLARITY Position*/ +#define DISP_MpuIntfConfig0_VSYNC_POLARITY_Msk (0x1ul << DISP_MpuIntfConfig0_VSYNC_POLARITY_Pos) /*!< DISP_T::MpuIntfConfig0: VSYNC_POLARITY Mask*/ + +#define DISP_MpuIntfConfig0_ENABLE_TE_Pos (7) /*!< DISP_T::MpuIntfConfig0: ENABLE_TE Position*/ +#define DISP_MpuIntfConfig0_ENABLE_TE_Msk (0x1ul << DISP_MpuIntfConfig0_ENABLE_TE_Pos) /*!< DISP_T::MpuIntfConfig0: ENABLE_TE Mask*/ + +#define DISP_MpuIntfConfig0_TE_POLARITY_Pos (8) /*!< DISP_T::MpuIntfConfig0: TE_POLARITY Position*/ +#define DISP_MpuIntfConfig0_TE_POLARITY_Msk (0x1ul << DISP_MpuIntfConfig0_TE_POLARITY_Pos) /*!< DISP_T::MpuIntfConfig0: TE_POLARITY Mask*/ + +#define DISP_MpuIntfConfig0_DCX_POLARITY_Pos (9) /*!< DISP_T::MpuIntfConfig0: DCX_POLARITY Position*/ +#define DISP_MpuIntfConfig0_DCX_POLARITY_Msk (0x1ul << DISP_MpuIntfConfig0_DCX_POLARITY_Pos) /*!< DISP_T::MpuIntfConfig0: DCX_POLARITY Mask*/ + +#define DISP_MpuIntfConfig0_DATA_MODE24_BIT_Pos (10) /*!< DISP_T::MpuIntfConfig0: DATA_MODE24_BIT Position*/ +#define DISP_MpuIntfConfig0_DATA_MODE24_BIT_Msk (0x1ul << DISP_MpuIntfConfig0_DATA_MODE24_BIT_Pos) /*!< DISP_T::MpuIntfConfig0: DATA_MODE24_BIT Mask*/ + +#define DISP_MpuIntfConfig0_INTERFACE_RESET_Pos (11) /*!< DISP_T::MpuIntfConfig0: INTERFACE_RESET Position*/ +#define DISP_MpuIntfConfig0_INTERFACE_RESET_Msk (0x1ul << DISP_MpuIntfConfig0_INTERFACE_RESET_Pos) /*!< DISP_T::MpuIntfConfig0: INTERFACE_RESET Mask*/ + +#define DISP_MpuIntfConfig0_ENABLE_MPU_INTF_Pos (12) /*!< DISP_T::MpuIntfConfig0: ENABLE_MPU_INTF Position*/ +#define DISP_MpuIntfConfig0_ENABLE_MPU_INTF_Msk (0x1ul << DISP_MpuIntfConfig0_ENABLE_MPU_INTF_Pos) /*!< DISP_T::MpuIntfConfig0: ENABLE_MPU_INTF Mask*/ + +#define DISP_MpuIntfFrame0_FRAME_UPDATE_Pos (0) /*!< DISP_T::MpuIntfFrame0: FRAME_UPDATE Position*/ +#define DISP_MpuIntfFrame0_FRAME_UPDATE_Msk (0x1ul << DISP_MpuIntfFrame0_FRAME_UPDATE_Pos) /*!< DISP_T::MpuIntfFrame0: FRAME_UPDATE Mask*/ + +#define DISP_MpuIntfFrame0_DATA_FORMAT_Pos (1) /*!< DISP_T::MpuIntfFrame0: DATA_FORMAT Position*/ +#define DISP_MpuIntfFrame0_DATA_FORMAT_Msk (0x3ul << DISP_MpuIntfFrame0_DATA_FORMAT_Pos) /*!< DISP_T::MpuIntfFrame0: DATA_FORMAT Mask*/ + +#define DISP_MpuIntfFrame0_MPU_WRITE_BACK_Pos (3) /*!< DISP_T::MpuIntfFrame0: MPU_WRITE_BACK Position*/ +#define DISP_MpuIntfFrame0_MPU_WRITE_BACK_Msk (0x1ul << DISP_MpuIntfFrame0_MPU_WRITE_BACK_Pos) /*!< DISP_T::MpuIntfFrame0: MPU_WRITE_BACK Mask*/ + +#define DISP_MpuIntfACWrI800_WR_PERIOD_I80_Pos (0) /*!< DISP_T::MpuIntfACWrI800: WR_PERIOD_I80 Position*/ +#define DISP_MpuIntfACWrI800_WR_PERIOD_I80_Msk (0x3fful << DISP_MpuIntfACWrI800_WR_PERIOD_I80_Pos) /*!< DISP_T::MpuIntfACWrI800: WR_PERIOD_I80 Mask*/ + +#define DISP_MpuIntfACWrI800_WRX_ASSERT_Pos (10) /*!< DISP_T::MpuIntfACWrI800: WRX_ASSERT Position*/ +#define DISP_MpuIntfACWrI800_WRX_ASSERT_Msk (0x3fful << DISP_MpuIntfACWrI800_WRX_ASSERT_Pos) /*!< DISP_T::MpuIntfACWrI800: WRX_ASSERT Mask*/ + +#define DISP_MpuIntfACWrI800_WRX_DE_ASSERT_Pos (20) /*!< DISP_T::MpuIntfACWrI800: WRX_DE_ASSERT Position*/ +#define DISP_MpuIntfACWrI800_WRX_DE_ASSERT_Msk (0x3fful << DISP_MpuIntfACWrI800_WRX_DE_ASSERT_Pos) /*!< DISP_T::MpuIntfACWrI800: WRX_DE_ASSERT Mask*/ + +#define DISP_MpuIntfACRdI800_RD_PERIOD_I80_Pos (0) /*!< DISP_T::MpuIntfACRdI800: RD_PERIOD_I80 Position*/ +#define DISP_MpuIntfACRdI800_RD_PERIOD_I80_Msk (0x3fful << DISP_MpuIntfACRdI800_RD_PERIOD_I80_Pos) /*!< DISP_T::MpuIntfACRdI800: RD_PERIOD_I80 Mask*/ + +#define DISP_MpuIntfACRdI800_RDX_ASSERT_Pos (10) /*!< DISP_T::MpuIntfACRdI800: RDX_ASSERT Position*/ +#define DISP_MpuIntfACRdI800_RDX_ASSERT_Msk (0x3fful << DISP_MpuIntfACRdI800_RDX_ASSERT_Pos) /*!< DISP_T::MpuIntfACRdI800: RDX_ASSERT Mask*/ + +#define DISP_MpuIntfACRdI800_RDX_DE_ASSERT_Pos (20) /*!< DISP_T::MpuIntfACRdI800: RDX_DE_ASSERT Position*/ +#define DISP_MpuIntfACRdI800_RDX_DE_ASSERT_Msk (0x3fful << DISP_MpuIntfACRdI800_RDX_DE_ASSERT_Pos) /*!< DISP_T::MpuIntfACRdI800: RDX_DE_ASSERT Mask*/ + +#define DISP_MpuIntfACWrM680_WR_PERIOD_M68_Pos (0) /*!< DISP_T::MpuIntfACWrM680: WR_PERIOD_M68 Position*/ +#define DISP_MpuIntfACWrM680_WR_PERIOD_M68_Msk (0x3fful << DISP_MpuIntfACWrM680_WR_PERIOD_M68_Pos) /*!< DISP_T::MpuIntfACWrM680: WR_PERIOD_M68 Mask*/ + +#define DISP_MpuIntfACWrM680_WR_EASSERT_Pos (10) /*!< DISP_T::MpuIntfACWrM680: WR_EASSERT Position*/ +#define DISP_MpuIntfACWrM680_WR_EASSERT_Msk (0x3fful << DISP_MpuIntfACWrM680_WR_EASSERT_Pos) /*!< DISP_T::MpuIntfACWrM680: WR_EASSERT Mask*/ + +#define DISP_MpuIntfACWrM680_WR_EDE_ASSERT_Pos (20) /*!< DISP_T::MpuIntfACWrM680: WR_EDE_ASSERT Position*/ +#define DISP_MpuIntfACWrM680_WR_EDE_ASSERT_Msk (0x3fful << DISP_MpuIntfACWrM680_WR_EDE_ASSERT_Pos) /*!< DISP_T::MpuIntfACWrM680: WR_EDE_ASSERT Mask*/ + +#define DISP_MpuIntfACRdM680_RD_PERIOD_I80_Pos (0) /*!< DISP_T::MpuIntfACRdM680: RD_PERIOD_I80 Position*/ +#define DISP_MpuIntfACRdM680_RD_PERIOD_I80_Msk (0x3fful << DISP_MpuIntfACRdM680_RD_PERIOD_I80_Pos) /*!< DISP_T::MpuIntfACRdM680: RD_PERIOD_I80 Mask*/ + +#define DISP_MpuIntfACRdM680_RDX_ASSERT_Pos (10) /*!< DISP_T::MpuIntfACRdM680: RDX_ASSERT Position*/ +#define DISP_MpuIntfACRdM680_RDX_ASSERT_Msk (0x3fful << DISP_MpuIntfACRdM680_RDX_ASSERT_Pos) /*!< DISP_T::MpuIntfACRdM680: RDX_ASSERT Mask*/ + +#define DISP_MpuIntfACRdM680_RDX_DE_ASSERT_Pos (20) /*!< DISP_T::MpuIntfACRdM680: RDX_DE_ASSERT Position*/ +#define DISP_MpuIntfACRdM680_RDX_DE_ASSERT_Msk (0x3fful << DISP_MpuIntfACRdM680_RDX_DE_ASSERT_Pos) /*!< DISP_T::MpuIntfACRdM680: RDX_DE_ASSERT Mask*/ + +#define DISP_MpuIntfACVsyncCSX0_CSX_ASSERT_Pos (0) /*!< DISP_T::MpuIntfACVsyncCSX0: CSX_ASSERT Position*/ +#define DISP_MpuIntfACVsyncCSX0_CSX_ASSERT_Msk (0x3fful << DISP_MpuIntfACVsyncCSX0_CSX_ASSERT_Pos) /*!< DISP_T::MpuIntfACVsyncCSX0: CSX_ASSERT Mask*/ + +/**@}*/ /* DISP_CONST */ +/**@}*/ /* end of DISP register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif //__DISP_REG_H__ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/dpm_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/dpm_reg.h new file mode 100644 index 0000000000..3f056d4596 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/dpm_reg.h @@ -0,0 +1,315 @@ +/**************************************************************************//** + * @file dpm_reg.h + * @brief DPM register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __DPM_REG_H__ +#define __DPM_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/*---------------------- Debug Protection Mechanism -------------------------*/ +/** + @addtogroup DPM Debug Protection Mechanism(DPM) + Memory Mapped Structure for DPM Controller +@{ */ + +typedef struct +{ + + + /** + * @var DPM_T::A35SDS + * Offset: 0x10 DPM A35 Secure Debug State Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |REGDEN |Debug State Register Enable Bit + * | | |0 = Set the debug state to CLOSE state when current state is OPEN state. + * | | |1 = Set the debug state to OPEN state when current state is CLOSE state. + * | | |Note: if SINFAEN.SSPCC is set to high. This bit becomes read-only by Non-Secure software + * |[1] |ODIS |Debug State OTP Disable Bit (Read Only) + * | | |Indicate the Disable bit stored in OTP. + * |[2] |OLOCK |Debug State OTP Lock Bit (Read Only) + * | | |Indicate the Lock bit stored in OTP. + * |[31:24] |VCODE |Write Verify Code and Read Verify Code + * | | |Read operation: + * | | |0xA5 = The read access for DPM_CTL is correct. + * | | |Others = The read access for DPM_CTL is incorrect. + * | | |Write operation: + * | | |0x5A = The write verify code, which is needed to do a valid write to DPM_CA35SDS. + * | | |Others = Invalid write verify code. + * @var DPM_T::A35SNDS + * Offset: 0x14 DPM A35 Secure Non-invasive Debug State Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |REGDEN |Debug State Register Enable Bit + * | | |0 = Set the debug state to CLOSE state when current state is OPEN state. + * | | |1 = Set the debug state to OPEN state when current state is CLOSE state. + * | | |Note: if SINFAEN.SSPCC is set to high. This bit becomes read-only by Non-Secure software + * |[1] |ODIS |Debug State OTP Disable Bit (Read Only) + * | | |Indicate the Disable bit stored in OTP. + * |[2] |OLOCK |Debug State OTP Lock Bit (Read Only) + * | | |Indicate the Lock bit stored in OTP. + * |[31:24] |VCODE |Write Verify Code and Read Verify Code + * | | |Read operation: + * | | |0xA5 = The read access for DPM_CTL is correct. + * | | |Others = The read access for DPM_CTL is incorrect. + * | | |Write operation: + * | | |0x5A = The write verify code, which is needed to do a valid write to DPM_CA35SDS. + * | | |Others = Invalid write verify code. + * @var DPM_T::A35NSDS + * Offset: 0x18 DPM A35 Non-secure Debug State Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |REGDEN |Debug State Register Enable Bit + * | | |0 = Set the debug state to CLOSE state when current state is OPEN state. + * | | |1 = Set the debug state to OPEN state when current state is CLOSE state. + * | | |Note: if SINFAEN.SSPCC is set to high. This bit becomes read-only by Non-Secure software + * |[1] |ODIS |Debug State OTP Disable Bit (Read Only) + * | | |Indicate the Disable bit stored in OTP. + * |[2] |OLOCK |Debug State OTP Lock Bit (Read Only) + * | | |Indicate the Lock bit stored in OTP. + * |[31:24] |VCODE |Write Verify Code and Read Verify Code + * | | |Read operation: + * | | |0xA5 = The read access for DPM_CTL is correct. + * | | |Others = The read access for DPM_CTL is incorrect. + * | | |Write operation: + * | | |0x5A = The write verify code, which is needed to do a valid write to DPM_CA35SDS. + * | | |Others = Invalid write verify code. + * @var DPM_T::A35NSNDS + * Offset: 0x1C DPM A35 Non-secure Non-invasive Debug State Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |REGDEN |Debug State Register Enable Bit + * | | |0 = Set the debug state to CLOSE state when current state is OPEN state. + * | | |1 = Set the debug state to OPEN state when current state is CLOSE state. + * | | |Note: if SINFAEN.SSPCC is set to high. This bit becomes read-only by Non-Secure software + * |[1] |ODIS |Debug State OTP Disable Bit (Read Only) + * | | |Indicate the Disable bit stored in OTP. + * |[2] |OLOCK |Debug State OTP Lock Bit (Read Only) + * | | |Indicate the Lock bit stored in OTP. + * |[31:24] |VCODE |Write Verify Code and Read Verify Code + * | | |Read operation: + * | | |0xA5 = The read access for DPM_CTL is correct. + * | | |Others = The read access for DPM_CTL is incorrect. + * | | |Write operation: + * | | |0x5A = The write verify code, which is needed to do a valid write to DPM_CA35SDS. + * | | |Others = Invalid write verify code. + * @var DPM_T::M4DS + * Offset: 0x20 DPM M4 Debug State Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |REGDEN |Debug State Register Enable Bit + * | | |0 = Set the debug state to CLOSE state when current state is OPEN state. + * | | |1 = Set the debug state to OPEN state when current state is CLOSE state. + * | | |Note: if SINFAEN.SSPCC is set to high. This bit becomes read-only by Non-Secure software + * |[1] |ODIS |Debug State OTP Disable Bit (Read Only) + * | | |Indicate the Disable bit stored in OTP. + * |[2] |OLOCK |Debug State OTP Lock Bit (Read Only) + * | | |Indicate the Lock bit stored in OTP. + * |[31:24] |VCODE |Write Verify Code and Read Verify Code + * | | |Read operation: + * | | |0xA5 = The read access for DPM_CTL is correct. + * | | |Others = The read access for DPM_CTL is incorrect. + * | | |Write operation: + * | | |0x5A = The write verify code, which is needed to do a valid write to DPM_CA35SDS. + * | | |Others = Invalid write verify code. + * @var DPM_T::M4NDS + * Offset: 0x24 DPM M4 Non-invasive Debug State Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |REGDEN |Debug State Register Enable Bit + * | | |0 = Set the debug state to CLOSE state when current state is OPEN state. + * | | |1 = Set the debug state to OPEN state when current state is CLOSE state. + * | | |Note: if SINFAEN.SSPCC is set to high. This bit becomes read-only by Non-Secure software + * |[1] |ODIS |Debug State OTP Disable Bit (Read Only) + * | | |Indicate the Disable bit stored in OTP. + * |[2] |OLOCK |Debug State OTP Lock Bit (Read Only) + * | | |Indicate the Lock bit stored in OTP. + * |[31:24] |VCODE |Write Verify Code and Read Verify Code + * | | |Read operation: + * | | |0xA5 = The read access for DPM_CTL is correct. + * | | |Others = The read access for DPM_CTL is incorrect. + * | | |Write operation: + * | | |0x5A = The write verify code, which is needed to do a valid write to DPM_CA35SDS. + * | | |Others = Invalid write verify code. + * @var DPM_T::EXTDS + * Offset: 0x30 DPM External Debug State Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |REGDEN |Debug State Register Enable Bit + * | | |0 = Set the debug state to CLOSE state when current state is OPEN state. + * | | |1 = Set the debug state to OPEN state when current state is CLOSE state. + * | | |Note: if SINFAEN.SSPCC is set to high. This bit becomes read-only by Non-Secure software + * |[1] |ODIS |Debug State OTP Disable Bit (Read Only) + * | | |Indicate the Disable bit stored in OTP. + * |[2] |OLOCK |Debug State OTP Lock Bit (Read Only) + * | | |Indicate the Lock bit stored in OTP. + * |[31:24] |VCODE |Write Verify Code and Read Verify Code + * | | |Read operation: + * | | |0xA5 = The read access for DPM_CTL is correct. + * | | |Others = The read access for DPM_CTL is incorrect. + * | | |Write operation: + * | | |0x5A = The write verify code, which is needed to do a valid write to DPM_CA35SDS. + * | | |Others = Invalid write verify code. + * @var DPM_T::EXTTDS + * Offset: 0x34 DPM External Tracing Debug State Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |REGDEN |Debug State Register Enable Bit + * | | |0 = Set the debug state to CLOSE state when current state is OPEN state. + * | | |1 = Set the debug state to OPEN state when current state is CLOSE state. + * | | |Note: if SINFAEN.SSPCC is set to high. This bit becomes read-only by Non-Secure software + * |[1] |ODIS |Debug State OTP Disable Bit (Read Only) + * | | |Indicate the Disable bit stored in OTP. + * |[2] |OLOCK |Debug State OTP Lock Bit (Read Only) + * | | |Indicate the Lock bit stored in OTP. + * |[31:24] |VCODE |Write Verify Code and Read Verify Code + * | | |Read operation: + * | | |0xA5 = The read access for DPM_CTL is correct. + * | | |Others = The read access for DPM_CTL is incorrect. + * | | |Write operation: + * | | |0x5A = The write verify code, which is needed to do a valid write to DPM_CA35SDS. + * | | |Others = Invalid write verify code. + */ + __I uint32_t RESERVE0[4]; + __IO uint32_t A35SDS; /*!< [0x0010] DPM A35 Secure Debug State Register */ + __IO uint32_t A35SNDS; /*!< [0x0014] DPM A35 Secure Non-invasive Debug State Register */ + __IO uint32_t A35NSDS; /*!< [0x0018] DPM A35 Non-secure Debug State Register */ + __IO uint32_t A35NSNDS; /*!< [0x001c] DPM A35 Non-secure Non-invasive Debug State Register */ + __IO uint32_t M4DS; /*!< [0x0020] DPM M4 Debug State Register */ + __IO uint32_t M4NDS; /*!< [0x0024] DPM M4 Non-invasive Debug State Register */ + __I uint32_t RESERVE1[2]; + __IO uint32_t EXTDS; /*!< [0x0030] DPM External Debug State Register */ + __IO uint32_t EXTTDS; /*!< [0x0034] DPM External Tracing Debug State Register */ + +} DPM_T; + +/** + @addtogroup DPM_CONST DPM Bit Field Definition + Constant Definitions for DPM Controller +@{ */ + +#define DPM_A35SDS_REGDEN_Pos (0) /*!< DPM_T::A35SDS: REGDEN Position */ +#define DPM_A35SDS_REGDEN_Msk (0x1ul << DPM_A35SDS_REGDEN_Pos) /*!< DPM_T::A35SDS: REGDEN Mask */ + +#define DPM_A35SDS_ODIS_Pos (1) /*!< DPM_T::A35SDS: ODIS Position */ +#define DPM_A35SDS_ODIS_Msk (0x1ul << DPM_A35SDS_ODIS_Pos) /*!< DPM_T::A35SDS: ODIS Mask */ + +#define DPM_A35SDS_OLOCK_Pos (2) /*!< DPM_T::A35SDS: OLOCK Position */ +#define DPM_A35SDS_OLOCK_Msk (0x1ul << DPM_A35SDS_OLOCK_Pos) /*!< DPM_T::A35SDS: OLOCK Mask */ + +#define DPM_A35SDS_VCODE_Pos (24) /*!< DPM_T::A35SDS: VCODE Position */ +#define DPM_A35SDS_VCODE_Msk (0xfful << DPM_A35SDS_VCODE_Pos) /*!< DPM_T::A35SDS: VCODE Mask */ + +#define DPM_A35SNDS_REGDEN_Pos (0) /*!< DPM_T::A35SNDS: REGDEN Position */ +#define DPM_A35SNDS_REGDEN_Msk (0x1ul << DPM_A35SNDS_REGDEN_Pos) /*!< DPM_T::A35SNDS: REGDEN Mask */ + +#define DPM_A35SNDS_ODIS_Pos (1) /*!< DPM_T::A35SNDS: ODIS Position */ +#define DPM_A35SNDS_ODIS_Msk (0x1ul << DPM_A35SNDS_ODIS_Pos) /*!< DPM_T::A35SNDS: ODIS Mask */ + +#define DPM_A35SNDS_OLOCK_Pos (2) /*!< DPM_T::A35SNDS: OLOCK Position */ +#define DPM_A35SNDS_OLOCK_Msk (0x1ul << DPM_A35SNDS_OLOCK_Pos) /*!< DPM_T::A35SNDS: OLOCK Mask */ + +#define DPM_A35SNDS_VCODE_Pos (24) /*!< DPM_T::A35SNDS: VCODE Position */ +#define DPM_A35SNDS_VCODE_Msk (0xfful << DPM_A35SNDS_VCODE_Pos) /*!< DPM_T::A35SNDS: VCODE Mask */ + +#define DPM_A35NSDS_REGDEN_Pos (0) /*!< DPM_T::A35NSDS: REGDEN Position */ +#define DPM_A35NSDS_REGDEN_Msk (0x1ul << DPM_A35NSDS_REGDEN_Pos) /*!< DPM_T::A35NSDS: REGDEN Mask */ + +#define DPM_A35NSDS_ODIS_Pos (1) /*!< DPM_T::A35NSDS: ODIS Position */ +#define DPM_A35NSDS_ODIS_Msk (0x1ul << DPM_A35NSDS_ODIS_Pos) /*!< DPM_T::A35NSDS: ODIS Mask */ + +#define DPM_A35NSDS_OLOCK_Pos (2) /*!< DPM_T::A35NSDS: OLOCK Position */ +#define DPM_A35NSDS_OLOCK_Msk (0x1ul << DPM_A35NSDS_OLOCK_Pos) /*!< DPM_T::A35NSDS: OLOCK Mask */ + +#define DPM_A35NSDS_VCODE_Pos (24) /*!< DPM_T::A35NSDS: VCODE Position */ +#define DPM_A35NSDS_VCODE_Msk (0xfful << DPM_A35NSDS_VCODE_Pos) /*!< DPM_T::A35NSDS: VCODE Mask */ + +#define DPM_A35NSNDS_REGDEN_Pos (0) /*!< DPM_T::A35NSNDS: REGDEN Position */ +#define DPM_A35NSNDS_REGDEN_Msk (0x1ul << DPM_A35NSNDS_REGDEN_Pos) /*!< DPM_T::A35NSNDS: REGDEN Mask */ + +#define DPM_A35NSNDS_ODIS_Pos (1) /*!< DPM_T::A35NSNDS: ODIS Position */ +#define DPM_A35NSNDS_ODIS_Msk (0x1ul << DPM_A35NSNDS_ODIS_Pos) /*!< DPM_T::A35NSNDS: ODIS Mask */ + +#define DPM_A35NSNDS_OLOCK_Pos (2) /*!< DPM_T::A35NSNDS: OLOCK Position */ +#define DPM_A35NSNDS_OLOCK_Msk (0x1ul << DPM_A35NSNDS_OLOCK_Pos) /*!< DPM_T::A35NSNDS: OLOCK Mask */ + +#define DPM_A35NSNDS_VCODE_Pos (24) /*!< DPM_T::A35NSNDS: VCODE Position */ +#define DPM_A35NSNDS_VCODE_Msk (0xfful << DPM_A35NSNDS_VCODE_Pos) /*!< DPM_T::A35NSNDS: VCODE Mask */ + +#define DPM_M4DS_REGDEN_Pos (0) /*!< DPM_T::M4DS: REGDEN Position */ +#define DPM_M4DS_REGDEN_Msk (0x1ul << DPM_M4DS_REGDEN_Pos) /*!< DPM_T::M4DS: REGDEN Mask */ + +#define DPM_M4DS_ODIS_Pos (1) /*!< DPM_T::M4DS: ODIS Position */ +#define DPM_M4DS_ODIS_Msk (0x1ul << DPM_M4DS_ODIS_Pos) /*!< DPM_T::M4DS: ODIS Mask */ + +#define DPM_M4DS_OLOCK_Pos (2) /*!< DPM_T::M4DS: OLOCK Position */ +#define DPM_M4DS_OLOCK_Msk (0x1ul << DPM_M4DS_OLOCK_Pos) /*!< DPM_T::M4DS: OLOCK Mask */ + +#define DPM_M4DS_VCODE_Pos (24) /*!< DPM_T::M4DS: VCODE Position */ +#define DPM_M4DS_VCODE_Msk (0xfful << DPM_M4DS_VCODE_Pos) /*!< DPM_T::M4DS: VCODE Mask */ + +#define DPM_M4NDS_REGDEN_Pos (0) /*!< DPM_T::M4NDS: REGDEN Position */ +#define DPM_M4NDS_REGDEN_Msk (0x1ul << DPM_M4NDS_REGDEN_Pos) /*!< DPM_T::M4NDS: REGDEN Mask */ + +#define DPM_M4NDS_ODIS_Pos (1) /*!< DPM_T::M4NDS: ODIS Position */ +#define DPM_M4NDS_ODIS_Msk (0x1ul << DPM_M4NDS_ODIS_Pos) /*!< DPM_T::M4NDS: ODIS Mask */ + +#define DPM_M4NDS_OLOCK_Pos (2) /*!< DPM_T::M4NDS: OLOCK Position */ +#define DPM_M4NDS_OLOCK_Msk (0x1ul << DPM_M4NDS_OLOCK_Pos) /*!< DPM_T::M4NDS: OLOCK Mask */ + +#define DPM_M4NDS_VCODE_Pos (24) /*!< DPM_T::M4NDS: VCODE Position */ +#define DPM_M4NDS_VCODE_Msk (0xfful << DPM_M4NDS_VCODE_Pos) /*!< DPM_T::M4NDS: VCODE Mask */ + +#define DPM_EXTDS_REGDEN_Pos (0) /*!< DPM_T::EXTDS: REGDEN Position */ +#define DPM_EXTDS_REGDEN_Msk (0x1ul << DPM_EXTDS_REGDEN_Pos) /*!< DPM_T::EXTDS: REGDEN Mask */ + +#define DPM_EXTDS_ODIS_Pos (1) /*!< DPM_T::EXTDS: ODIS Position */ +#define DPM_EXTDS_ODIS_Msk (0x1ul << DPM_EXTDS_ODIS_Pos) /*!< DPM_T::EXTDS: ODIS Mask */ + +#define DPM_EXTDS_OLOCK_Pos (2) /*!< DPM_T::EXTDS: OLOCK Position */ +#define DPM_EXTDS_OLOCK_Msk (0x1ul << DPM_EXTDS_OLOCK_Pos) /*!< DPM_T::EXTDS: OLOCK Mask */ + +#define DPM_EXTDS_VCODE_Pos (24) /*!< DPM_T::EXTDS: VCODE Position */ +#define DPM_EXTDS_VCODE_Msk (0xfful << DPM_EXTDS_VCODE_Pos) /*!< DPM_T::EXTDS: VCODE Mask */ + +#define DPM_EXTTDS_REGDEN_Pos (0) /*!< DPM_T::EXTTDS: REGDEN Position */ +#define DPM_EXTTDS_REGDEN_Msk (0x1ul << DPM_EXTTDS_REGDEN_Pos) /*!< DPM_T::EXTTDS: REGDEN Mask */ + +#define DPM_EXTTDS_ODIS_Pos (1) /*!< DPM_T::EXTTDS: ODIS Position */ +#define DPM_EXTTDS_ODIS_Msk (0x1ul << DPM_EXTTDS_ODIS_Pos) /*!< DPM_T::EXTTDS: ODIS Mask */ + +#define DPM_EXTTDS_OLOCK_Pos (2) /*!< DPM_T::EXTTDS: OLOCK Position */ +#define DPM_EXTTDS_OLOCK_Msk (0x1ul << DPM_EXTTDS_OLOCK_Pos) /*!< DPM_T::EXTTDS: OLOCK Mask */ + +#define DPM_EXTTDS_VCODE_Pos (24) /*!< DPM_T::EXTTDS: VCODE Position */ +#define DPM_EXTTDS_VCODE_Msk (0xfful << DPM_EXTTDS_VCODE_Pos) /*!< DPM_T::EXTTDS: VCODE Mask */ + +/**@}*/ /* DPM_CONST */ +/**@}*/ /* end of DPM register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __DPM_REG_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/eadc_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/eadc_reg.h new file mode 100644 index 0000000000..aae9b39239 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/eadc_reg.h @@ -0,0 +1,2278 @@ +/**************************************************************************//** + * @file eadc_reg.h + * @brief EADC register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __EADC_REG_H__ +#define __EADC_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup EADC Enhanced Analog to Digital Converter(EADC) + Memory Mapped Structure for EADC Controller +@{ */ + +typedef struct +{ + + + /** + * @var EADC_T::DAT0 + * Offset: 0x00 ADC Data Register 0 for Sample Module 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Result + * | | |This field contains 12 bits conversion result. + * | | |When DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT[11:0] and zero will be filled in RESULT[15:12]. + * | | |When DMOF (EADC_CTL[9]) set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT[11:0] and signed bits to will be filled in RESULT[15:12]. + * |[16] |OV |Overrun Flag + * | | |If converted data in RESULT[11:0] has not been read before new conversion result is loaded to this register, OV is set to 1. + * | | |0 = Data in RESULT[11:0] is recent conversion result. + * | | |1 = Data in RESULT[11:0] is overwrite. + * | | |Note: It is cleared by hardware after EADC_DAT register is read. + * |[17] |VALID |Valid Flag + * | | |This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DAT register is read. + * | | |0 = Data in RESULT[11:0] bits is not valid. + * | | |1 = Data in RESULT[11:0] bits is valid. + * @var EADC_T::DAT1 + * Offset: 0x04 ADC Data Register 1 for Sample Module 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Result + * | | |This field contains 12 bits conversion result. + * | | |When DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT[11:0] and zero will be filled in RESULT[15:12]. + * | | |When DMOF (EADC_CTL[9]) set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT[11:0] and signed bits to will be filled in RESULT[15:12]. + * |[16] |OV |Overrun Flag + * | | |If converted data in RESULT[11:0] has not been read before new conversion result is loaded to this register, OV is set to 1. + * | | |0 = Data in RESULT[11:0] is recent conversion result. + * | | |1 = Data in RESULT[11:0] is overwrite. + * | | |Note: It is cleared by hardware after EADC_DAT register is read. + * |[17] |VALID |Valid Flag + * | | |This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DAT register is read. + * | | |0 = Data in RESULT[11:0] bits is not valid. + * | | |1 = Data in RESULT[11:0] bits is valid. + * @var EADC_T::DAT2 + * Offset: 0x08 ADC Data Register 2 for Sample Module 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Result + * | | |This field contains 12 bits conversion result. + * | | |When DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT[11:0] and zero will be filled in RESULT[15:12]. + * | | |When DMOF (EADC_CTL[9]) set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT[11:0] and signed bits to will be filled in RESULT[15:12]. + * |[16] |OV |Overrun Flag + * | | |If converted data in RESULT[11:0] has not been read before new conversion result is loaded to this register, OV is set to 1. + * | | |0 = Data in RESULT[11:0] is recent conversion result. + * | | |1 = Data in RESULT[11:0] is overwrite. + * | | |Note: It is cleared by hardware after EADC_DAT register is read. + * |[17] |VALID |Valid Flag + * | | |This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DAT register is read. + * | | |0 = Data in RESULT[11:0] bits is not valid. + * | | |1 = Data in RESULT[11:0] bits is valid. + * @var EADC_T::DAT3 + * Offset: 0x0C ADC Data Register 3 for Sample Module 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Result + * | | |This field contains 12 bits conversion result. + * | | |When DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT[11:0] and zero will be filled in RESULT[15:12]. + * | | |When DMOF (EADC_CTL[9]) set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT[11:0] and signed bits to will be filled in RESULT[15:12]. + * |[16] |OV |Overrun Flag + * | | |If converted data in RESULT[11:0] has not been read before new conversion result is loaded to this register, OV is set to 1. + * | | |0 = Data in RESULT[11:0] is recent conversion result. + * | | |1 = Data in RESULT[11:0] is overwrite. + * | | |Note: It is cleared by hardware after EADC_DAT register is read. + * |[17] |VALID |Valid Flag + * | | |This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DAT register is read. + * | | |0 = Data in RESULT[11:0] bits is not valid. + * | | |1 = Data in RESULT[11:0] bits is valid. + * @var EADC_T::DAT4 + * Offset: 0x10 ADC Data Register 4 for Sample Module 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Result + * | | |This field contains 12 bits conversion result. + * | | |When DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT[11:0] and zero will be filled in RESULT[15:12]. + * | | |When DMOF (EADC_CTL[9]) set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT[11:0] and signed bits to will be filled in RESULT[15:12]. + * |[16] |OV |Overrun Flag + * | | |If converted data in RESULT[11:0] has not been read before new conversion result is loaded to this register, OV is set to 1. + * | | |0 = Data in RESULT[11:0] is recent conversion result. + * | | |1 = Data in RESULT[11:0] is overwrite. + * | | |Note: It is cleared by hardware after EADC_DAT register is read. + * |[17] |VALID |Valid Flag + * | | |This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DAT register is read. + * | | |0 = Data in RESULT[11:0] bits is not valid. + * | | |1 = Data in RESULT[11:0] bits is valid. + * @var EADC_T::DAT5 + * Offset: 0x14 ADC Data Register 5 for Sample Module 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Result + * | | |This field contains 12 bits conversion result. + * | | |When DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT[11:0] and zero will be filled in RESULT[15:12]. + * | | |When DMOF (EADC_CTL[9]) set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT[11:0] and signed bits to will be filled in RESULT[15:12]. + * |[16] |OV |Overrun Flag + * | | |If converted data in RESULT[11:0] has not been read before new conversion result is loaded to this register, OV is set to 1. + * | | |0 = Data in RESULT[11:0] is recent conversion result. + * | | |1 = Data in RESULT[11:0] is overwrite. + * | | |Note: It is cleared by hardware after EADC_DAT register is read. + * |[17] |VALID |Valid Flag + * | | |This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DAT register is read. + * | | |0 = Data in RESULT[11:0] bits is not valid. + * | | |1 = Data in RESULT[11:0] bits is valid. + * @var EADC_T::DAT6 + * Offset: 0x18 ADC Data Register 6 for Sample Module 6 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Result + * | | |This field contains 12 bits conversion result. + * | | |When DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT[11:0] and zero will be filled in RESULT[15:12]. + * | | |When DMOF (EADC_CTL[9]) set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT[11:0] and signed bits to will be filled in RESULT[15:12]. + * |[16] |OV |Overrun Flag + * | | |If converted data in RESULT[11:0] has not been read before new conversion result is loaded to this register, OV is set to 1. + * | | |0 = Data in RESULT[11:0] is recent conversion result. + * | | |1 = Data in RESULT[11:0] is overwrite. + * | | |Note: It is cleared by hardware after EADC_DAT register is read. + * |[17] |VALID |Valid Flag + * | | |This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DAT register is read. + * | | |0 = Data in RESULT[11:0] bits is not valid. + * | | |1 = Data in RESULT[11:0] bits is valid. + * @var EADC_T::DAT7 + * Offset: 0x1C ADC Data Register 7 for Sample Module 7 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Result + * | | |This field contains 12 bits conversion result. + * | | |When DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT[11:0] and zero will be filled in RESULT[15:12]. + * | | |When DMOF (EADC_CTL[9]) set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT[11:0] and signed bits to will be filled in RESULT[15:12]. + * |[16] |OV |Overrun Flag + * | | |If converted data in RESULT[11:0] has not been read before new conversion result is loaded to this register, OV is set to 1. + * | | |0 = Data in RESULT[11:0] is recent conversion result. + * | | |1 = Data in RESULT[11:0] is overwrite. + * | | |Note: It is cleared by hardware after EADC_DAT register is read. + * |[17] |VALID |Valid Flag + * | | |This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DAT register is read. + * | | |0 = Data in RESULT[11:0] bits is not valid. + * | | |1 = Data in RESULT[11:0] bits is valid. + * @var EADC_T::DAT8 + * Offset: 0x20 ADC Data Register 8 for Sample Module 8 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Result + * | | |This field contains 12 bits conversion result. + * | | |When DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT[11:0] and zero will be filled in RESULT[15:12]. + * | | |When DMOF (EADC_CTL[9]) set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT[11:0] and signed bits to will be filled in RESULT[15:12]. + * |[16] |OV |Overrun Flag + * | | |If converted data in RESULT[11:0] has not been read before new conversion result is loaded to this register, OV is set to 1. + * | | |0 = Data in RESULT[11:0] is recent conversion result. + * | | |1 = Data in RESULT[11:0] is overwrite. + * | | |Note: It is cleared by hardware after EADC_DAT register is read. + * |[17] |VALID |Valid Flag + * | | |This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DAT register is read. + * | | |0 = Data in RESULT[11:0] bits is not valid. + * | | |1 = Data in RESULT[11:0] bits is valid. + * @var EADC_T::CURDAT + * Offset: 0x4C ADC PDMA Current Transfer Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[17:0] |CURDAT |ADC PDMA Current Transfer Data (Read Only) + * | | |This register is a shadow register of EADC_DATn (n=0~8) for PDMA support. + * @var EADC_T::CTL + * Offset: 0x50 ADC Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ADCEN |ADC Converter Enable Bit + * | | |0 = EADC Disabled. + * | | |1 = EADC Enabled. + * | | |Note: Before starting ADC conversion function, this bit should be set to 1 + * | | |Clear it to 0 to disable ADC converter analog circuit power consumption. + * |[1] |ADCRST |ADC Converter Control Circuits Reset + * | | |0 = No effect. + * | | |1 = Cause ADC control circuits reset to initial state, but not change the ADC registers value. + * | | |Note: ADCRST bit remains 1 during ADC reset, when ADC reset end, the ADCRST bit is automatically cleared to 0. + * |[2] |ADCIEN0 |Specific Sample Module ADC ADINT0 Interrupt Enable Bit + * | | |The ADC converter generates a conversion end ADIF0 (EADC_STATUS2[0]) upon the end of specific sample module ADC conversion + * | | |If ADCIEN0 bit is set then conversion end interrupt request ADINT0 is generated. + * | | |0 = Specific sample module ADC ADINT0 interrupt function Disabled. + * | | |1 = Specific sample module ADC ADINT0 interrupt function Enabled. + * |[3] |ADCIEN1 |Specific Sample Module ADC ADINT1 Interrupt Enable Bit + * | | |The ADC converter generates a conversion end ADIF1 (EADC_STATUS2[1]) upon the end of specific sample module ADC conversion + * | | |If ADCIEN1 bit is set then conversion end interrupt request ADINT1 is generated. + * | | |0 = Specific sample module ADC ADINT1 interrupt function Disabled. + * | | |1 = Specific sample module ADC ADINT1 interrupt function Enabled. + * |[4] |ADCIEN2 |Specific Sample Module ADC ADINT2 Interrupt Enable Bit + * | | |The ADC converter generates a conversion end ADIF2 (EADC_STATUS2[2]) upon the end of specific sample module ADC conversion + * | | |If ADCIEN2 bit is set then conversion end interrupt request ADINT2 is generated. + * | | |0 = Specific sample module ADC ADINT2 interrupt function Disabled. + * | | |1 = Specific sample module ADC ADINT2 interrupt function Enabled. + * |[5] |ADCIEN3 |Specific Sample Module ADC ADINT3 Interrupt Enable Bit + * | | |The ADC converter generates a conversion end ADIF3 (EADC_STATUS2[3]) upon the end of specific sample module ADC conversion + * | | |If ADCIEN3 bit is set then conversion end interrupt request ADINT3 is generated. + * | | |0 = Specific sample module ADC ADINT3 interrupt function Disabled. + * | | |1 = Specific sample module ADC ADINT3 interrupt function Enabled. + * |[7:6] |RES |Resolution (Read Only) + * | | |11 = 12-bit ADC result will be put at RESULT (EADC_DATn[11:0]). + * |[8] |DIFFEN |Differential Analog Input Mode Enable Bit + * | | |0 = Single-end analog input mode. + * | | |1 = Differential analog input mode. + * |[9] |DMOF |ADC Differential Input Mode Output Format + * | | |0 = ADC conversion result will be filled in RESULT (EADC_DATn[15:0], where n= 0 ~ 8) with unsigned format. + * | | |1 = ADC conversion result will be filled in RESULT (EADC_DATn[15:0], where n= 0 ~ 8) with 2'complement format. + * |[11:10] |VREFSEL |Internal Voltage Reference Select Bit + * | | |ADC have internal voltage reference, user can control this bit to select reference voltage for ADC + * | | |00 = 1.6V. + * | | |01 = 2.0V. + * | | |10 = 2.5V (AVDD33 >= 2.8V). + * | | |11 = 3.0V (AVDD33 >= 3.3V). + * |[12] |SPEED |Speed Mode Select Bit + * | | |Control signal for ADC conversion speed + * | | |0 = Low speed mode. + * | | |1 = High speed mode. + * @var EADC_T::SWTRG + * Offset: 0x54 ADC Sample Module Software Start Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |SWTRG |ADC Sample Module 0~8 Software Force to Start ADC Conversion + * | | |0 = No effect. + * | | |1 = Cause an ADC conversion when the priority is given to sample module. + * | | |Note: After writing this register to start ADC conversion, the EADC_PENDSTS register will show which sample module will conversion + * | | |If user want to disable the conversion of the sample module, user can write EADC_PENDSTS register to clear it. + * @var EADC_T::PENDSTS + * Offset: 0x58 ADC Start of Conversion Pending Flag Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |STPF |ADC Sample Module 0~8 Start of Conversion Pending Flag + * | | |Read Operation: + * | | |0 = There is no pending conversion for sample module. + * | | |1 = Sample module ADC start of conversion is pending. + * | | |Write Operation: + * | | |1 = Clear pending flag & cancel the conversion for sample module. + * | | |Note: This bit remains 1 during pending state + * | | |When the respective ADC conversion is ended, the STPFn (n=0~8) bit is automatically cleared to 0 + * @var EADC_T::OVSTS + * Offset: 0x5C ADC Sample Module Start of Conversion Overrun Flag Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |SPOVF |ADC SAMPLE0~8 Overrun Flag + * | | |0 = No sample module event overrun. + * | | |1 = Indicates a new sample module event is generated while an old one event is pending. + * | | |Note: This bit is cleared by writing 1 to it. + * @var EADC_T::SCTL0 + * Offset: 0x80 ADC Sample Module 0 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |CHSEL |ADC Sample Module Channel Selection + * | | |00H = EADC_CH0. + * | | |01H = EADC_CH1. + * | | |02H = EADC_CH2. + * | | |03H = EADC_CH3. + * | | |04H = EADC_CH4. + * | | |05H = EADC_CH5. + * | | |06H = EADC_CH6. + * | | |07H = EADC_CH7. + * | | |08H = VBAT/4. + * |[4] |EXTREN |ADC External Trigger Rising Edge Enable Bit + * | | |0 = Rising edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Rising edge Enabled when ADC selects EADC0_ST as trigger source. + * |[5] |EXTFEN |ADC External Trigger Falling Edge Enable Bit + * | | |0 = Falling edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Falling edge Enabled when ADC selects EADC0_ST as trigger source. + * |[7:6] |TRGDLYDIV |ADC Sample Module Start of Conversion Trigger Delay Clock Divider Selection + * | | |Trigger delay clock frequency: + * | | |00 = ADC_CLK/1. + * | | |01 = ADC_CLK/2. + * | | |10 = ADC_CLK/4. + * | | |11 = ADC_CLK/16. + * |[15:8] |TRGDLYCNT |ADC Sample Module Start of Conversion Trigger Delay Time + * | | |Trigger delay time = TRGDLYCNT x ADC_CLK period x n (n=1,2,4,16 from TRGDLYDIV setting). + * | | |Note: If TRGDLYCNT is set to 1, trigger delay time is actually the same as TRGDLYCNT is set to 2 for hardware operation. + * |[21:16] |TRGSEL |ADC Sample Module Start of Conversion Trigger Source Selection + * | | |0H = Disable trigger. + * | | |1H = External trigger from EADC0_ST pin input. + * | | |2H = ADC ADINT0 interrupt EOC (End of conversion) pulse trigger. + * | | |3H = ADC ADINT1 interrupt EOC (End of conversion) pulse trigger. + * | | |4H = Timer0 overflow pulse trigger. + * | | |5H = Timer1 overflow pulse trigger. + * | | |6H = Timer2 overflow pulse trigger. + * | | |7H = Timer3 overflow pulse trigger. + * | | |8H = Timer4 overflow pulse trigger. + * | | |9H = Timer5 overflow pulse trigger. + * | | |AH = Timer6 overflow pulse trigger. + * | | |BH = Timer7 overflow pulse trigger. + * | | |CH = Timer8 overflow pulse trigger. + * | | |DH = Timer9 overflow pulse trigger. + * | | |EH = Timer10 overflow pulse trigger. + * | | |FH = Timer11 overflow pulse trigger. + * | | |10H = EPWM0TG0. + * | | |11H = EPWM0TG1. + * | | |12H = EPWM0TG2. + * | | |13H = EPWM0TG3. + * | | |14H = EPWM0TG4. + * | | |15H = EPWM0TG5. + * | | |16H = EPWM1TG0. + * | | |17H = EPWM1TG1. + * | | |18H = EPWM1TG2. + * | | |19H = EPWM1TG3. + * | | |1AH = EPWM1TG4. + * | | |1BH = EPWM1TG5. + * | | |1CH = EPWM2TG0. + * | | |1DH = EPWM2TG1. + * | | |1EH = EPWM2TG2. + * | | |1FH = EPWM2TG3. + * | | |20H = EPWM2TG4. + * | | |21H = EPWM2TG5. + * | | |other = Reserved. + * |[22] |INTPOS |Interrupt Flag Position Select + * | | |0 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC end of conversion. + * | | |1 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC start of conversion. + * |[23] |DBMEN |Double Buffer Mode Enable Bit + * | | |0 = Sample has one sample result register (default). + * | | |1 = Sample has two sample result registers. + * @var EADC_T::SCTL1 + * Offset: 0x84 ADC Sample Module 1 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |CHSEL |ADC Sample Module Channel Selection + * | | |00H = EADC_CH0. + * | | |01H = EADC_CH1. + * | | |02H = EADC_CH2. + * | | |03H = EADC_CH3. + * | | |04H = EADC_CH4. + * | | |05H = EADC_CH5. + * | | |06H = EADC_CH6. + * | | |07H = EADC_CH7. + * | | |08H = VBAT/4. + * |[4] |EXTREN |ADC External Trigger Rising Edge Enable Bit + * | | |0 = Rising edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Rising edge Enabled when ADC selects EADC0_ST as trigger source. + * |[5] |EXTFEN |ADC External Trigger Falling Edge Enable Bit + * | | |0 = Falling edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Falling edge Enabled when ADC selects EADC0_ST as trigger source. + * |[7:6] |TRGDLYDIV |ADC Sample Module Start of Conversion Trigger Delay Clock Divider Selection + * | | |Trigger delay clock frequency: + * | | |00 = ADC_CLK/1. + * | | |01 = ADC_CLK/2. + * | | |10 = ADC_CLK/4. + * | | |11 = ADC_CLK/16. + * |[15:8] |TRGDLYCNT |ADC Sample Module Start of Conversion Trigger Delay Time + * | | |Trigger delay time = TRGDLYCNT x ADC_CLK period x n (n=1,2,4,16 from TRGDLYDIV setting). + * | | |Note: If TRGDLYCNT is set to 1, trigger delay time is actually the same as TRGDLYCNT is set to 2 for hardware operation. + * |[21:16] |TRGSEL |ADC Sample Module Start of Conversion Trigger Source Selection + * | | |0H = Disable trigger. + * | | |1H = External trigger from EADC0_ST pin input. + * | | |2H = ADC ADINT0 interrupt EOC (End of conversion) pulse trigger. + * | | |3H = ADC ADINT1 interrupt EOC (End of conversion) pulse trigger. + * | | |4H = Timer0 overflow pulse trigger. + * | | |5H = Timer1 overflow pulse trigger. + * | | |6H = Timer2 overflow pulse trigger. + * | | |7H = Timer3 overflow pulse trigger. + * | | |8H = Timer4 overflow pulse trigger. + * | | |9H = Timer5 overflow pulse trigger. + * | | |AH = Timer6 overflow pulse trigger. + * | | |BH = Timer7 overflow pulse trigger. + * | | |CH = Timer8 overflow pulse trigger. + * | | |DH = Timer9 overflow pulse trigger. + * | | |EH = Timer10 overflow pulse trigger. + * | | |FH = Timer11 overflow pulse trigger. + * | | |10H = EPWM0TG0. + * | | |11H = EPWM0TG1. + * | | |12H = EPWM0TG2. + * | | |13H = EPWM0TG3. + * | | |14H = EPWM0TG4. + * | | |15H = EPWM0TG5. + * | | |16H = EPWM1TG0. + * | | |17H = EPWM1TG1. + * | | |18H = EPWM1TG2. + * | | |19H = EPWM1TG3. + * | | |1AH = EPWM1TG4. + * | | |1BH = EPWM1TG5. + * | | |1CH = EPWM2TG0. + * | | |1DH = EPWM2TG1. + * | | |1EH = EPWM2TG2. + * | | |1FH = EPWM2TG3. + * | | |20H = EPWM2TG4. + * | | |21H = EPWM2TG5. + * | | |other = Reserved. + * |[22] |INTPOS |Interrupt Flag Position Select + * | | |0 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC end of conversion. + * | | |1 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC start of conversion. + * |[23] |DBMEN |Double Buffer Mode Enable Bit + * | | |0 = Sample has one sample result register (default). + * | | |1 = Sample has two sample result registers. + * @var EADC_T::SCTL2 + * Offset: 0x88 ADC Sample Module 2 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |CHSEL |ADC Sample Module Channel Selection + * | | |00H = EADC_CH0. + * | | |01H = EADC_CH1. + * | | |02H = EADC_CH2. + * | | |03H = EADC_CH3. + * | | |04H = EADC_CH4. + * | | |05H = EADC_CH5. + * | | |06H = EADC_CH6. + * | | |07H = EADC_CH7. + * | | |08H = VBAT/4. + * |[4] |EXTREN |ADC External Trigger Rising Edge Enable Bit + * | | |0 = Rising edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Rising edge Enabled when ADC selects EADC0_ST as trigger source. + * |[5] |EXTFEN |ADC External Trigger Falling Edge Enable Bit + * | | |0 = Falling edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Falling edge Enabled when ADC selects EADC0_ST as trigger source. + * |[7:6] |TRGDLYDIV |ADC Sample Module Start of Conversion Trigger Delay Clock Divider Selection + * | | |Trigger delay clock frequency: + * | | |00 = ADC_CLK/1. + * | | |01 = ADC_CLK/2. + * | | |10 = ADC_CLK/4. + * | | |11 = ADC_CLK/16. + * |[15:8] |TRGDLYCNT |ADC Sample Module Start of Conversion Trigger Delay Time + * | | |Trigger delay time = TRGDLYCNT x ADC_CLK period x n (n=1,2,4,16 from TRGDLYDIV setting). + * | | |Note: If TRGDLYCNT is set to 1, trigger delay time is actually the same as TRGDLYCNT is set to 2 for hardware operation. + * |[21:16] |TRGSEL |ADC Sample Module Start of Conversion Trigger Source Selection + * | | |0H = Disable trigger. + * | | |1H = External trigger from EADC0_ST pin input. + * | | |2H = ADC ADINT0 interrupt EOC (End of conversion) pulse trigger. + * | | |3H = ADC ADINT1 interrupt EOC (End of conversion) pulse trigger. + * | | |4H = Timer0 overflow pulse trigger. + * | | |5H = Timer1 overflow pulse trigger. + * | | |6H = Timer2 overflow pulse trigger. + * | | |7H = Timer3 overflow pulse trigger. + * | | |8H = Timer4 overflow pulse trigger. + * | | |9H = Timer5 overflow pulse trigger. + * | | |AH = Timer6 overflow pulse trigger. + * | | |BH = Timer7 overflow pulse trigger. + * | | |CH = Timer8 overflow pulse trigger. + * | | |DH = Timer9 overflow pulse trigger. + * | | |EH = Timer10 overflow pulse trigger. + * | | |FH = Timer11 overflow pulse trigger. + * | | |10H = EPWM0TG0. + * | | |11H = EPWM0TG1. + * | | |12H = EPWM0TG2. + * | | |13H = EPWM0TG3. + * | | |14H = EPWM0TG4. + * | | |15H = EPWM0TG5. + * | | |16H = EPWM1TG0. + * | | |17H = EPWM1TG1. + * | | |18H = EPWM1TG2. + * | | |19H = EPWM1TG3. + * | | |1AH = EPWM1TG4. + * | | |1BH = EPWM1TG5. + * | | |1CH = EPWM2TG0. + * | | |1DH = EPWM2TG1. + * | | |1EH = EPWM2TG2. + * | | |1FH = EPWM2TG3. + * | | |20H = EPWM2TG4. + * | | |21H = EPWM2TG5. + * | | |other = Reserved. + * |[22] |INTPOS |Interrupt Flag Position Select + * | | |0 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC end of conversion. + * | | |1 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC start of conversion. + * |[23] |DBMEN |Double Buffer Mode Enable Bit + * | | |0 = Sample has one sample result register (default). + * | | |1 = Sample has two sample result registers. + * @var EADC_T::SCTL3 + * Offset: 0x8C ADC Sample Module 3 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |CHSEL |ADC Sample Module Channel Selection + * | | |00H = EADC_CH0. + * | | |01H = EADC_CH1. + * | | |02H = EADC_CH2. + * | | |03H = EADC_CH3. + * | | |04H = EADC_CH4. + * | | |05H = EADC_CH5. + * | | |06H = EADC_CH6. + * | | |07H = EADC_CH7. + * | | |08H = VBAT/4. + * |[4] |EXTREN |ADC External Trigger Rising Edge Enable Bit + * | | |0 = Rising edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Rising edge Enabled when ADC selects EADC0_ST as trigger source. + * |[5] |EXTFEN |ADC External Trigger Falling Edge Enable Bit + * | | |0 = Falling edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Falling edge Enabled when ADC selects EADC0_ST as trigger source. + * |[7:6] |TRGDLYDIV |ADC Sample Module Start of Conversion Trigger Delay Clock Divider Selection + * | | |Trigger delay clock frequency: + * | | |00 = ADC_CLK/1. + * | | |01 = ADC_CLK/2. + * | | |10 = ADC_CLK/4. + * | | |11 = ADC_CLK/16. + * |[15:8] |TRGDLYCNT |ADC Sample Module Start of Conversion Trigger Delay Time + * | | |Trigger delay time = TRGDLYCNT x ADC_CLK period x n (n=1,2,4,16 from TRGDLYDIV setting). + * | | |Note: If TRGDLYCNT is set to 1, trigger delay time is actually the same as TRGDLYCNT is set to 2 for hardware operation. + * |[21:16] |TRGSEL |ADC Sample Module Start of Conversion Trigger Source Selection + * | | |0H = Disable trigger. + * | | |1H = External trigger from EADC0_ST pin input. + * | | |2H = ADC ADINT0 interrupt EOC (End of conversion) pulse trigger. + * | | |3H = ADC ADINT1 interrupt EOC (End of conversion) pulse trigger. + * | | |4H = Timer0 overflow pulse trigger. + * | | |5H = Timer1 overflow pulse trigger. + * | | |6H = Timer2 overflow pulse trigger. + * | | |7H = Timer3 overflow pulse trigger. + * | | |8H = Timer4 overflow pulse trigger. + * | | |9H = Timer5 overflow pulse trigger. + * | | |AH = Timer6 overflow pulse trigger. + * | | |BH = Timer7 overflow pulse trigger. + * | | |CH = Timer8 overflow pulse trigger. + * | | |DH = Timer9 overflow pulse trigger. + * | | |EH = Timer10 overflow pulse trigger. + * | | |FH = Timer11 overflow pulse trigger. + * | | |10H = EPWM0TG0. + * | | |11H = EPWM0TG1. + * | | |12H = EPWM0TG2. + * | | |13H = EPWM0TG3. + * | | |14H = EPWM0TG4. + * | | |15H = EPWM0TG5. + * | | |16H = EPWM1TG0. + * | | |17H = EPWM1TG1. + * | | |18H = EPWM1TG2. + * | | |19H = EPWM1TG3. + * | | |1AH = EPWM1TG4. + * | | |1BH = EPWM1TG5. + * | | |1CH = EPWM2TG0. + * | | |1DH = EPWM2TG1. + * | | |1EH = EPWM2TG2. + * | | |1FH = EPWM2TG3. + * | | |20H = EPWM2TG4. + * | | |21H = EPWM2TG5. + * | | |other = Reserved. + * |[22] |INTPOS |Interrupt Flag Position Select + * | | |0 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC end of conversion. + * | | |1 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC start of conversion. + * |[23] |DBMEN |Double Buffer Mode Enable Bit + * | | |0 = Sample has one sample result register (default). + * | | |1 = Sample has two sample result registers. + * @var EADC_T::SCTL4 + * Offset: 0x90 ADC Sample Module 4 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |CHSEL |ADC Sample Module Channel Selection + * | | |00H = EADC_CH0. + * | | |01H = EADC_CH1. + * | | |02H = EADC_CH2. + * | | |03H = EADC_CH3. + * | | |04H = EADC_CH4. + * | | |05H = EADC_CH5. + * | | |06H = EADC_CH6. + * | | |07H = EADC_CH7. + * | | |08H = VBAT/4. + * |[4] |EXTREN |ADC External Trigger Rising Edge Enable Bit + * | | |0 = Rising edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Rising edge Enabled when ADC selects EADC0_ST as trigger source. + * |[5] |EXTFEN |ADC External Trigger Falling Edge Enable Bit + * | | |0 = Falling edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Falling edge Enabled when ADC selects EADC0_ST as trigger source. + * |[7:6] |TRGDLYDIV |ADC Sample Module Start of Conversion Trigger Delay Clock Divider Selection + * | | |Trigger delay clock frequency: + * | | |00 = ADC_CLK/1. + * | | |01 = ADC_CLK/2. + * | | |10 = ADC_CLK/4. + * | | |11 = ADC_CLK/16. + * |[15:8] |TRGDLYCNT |ADC Sample Module Start of Conversion Trigger Delay Time + * | | |Trigger delay time = TRGDLYCNT x ADC_CLK period x n (n=1,2,4,16 from TRGDLYDIV setting). + * | | |Note: If TRGDLYCNT is set to 1, trigger delay time is actually the same as TRGDLYCNT is set to 2 for hardware operation. + * |[21:16] |TRGSEL |ADC Sample Module Start of Conversion Trigger Source Selection + * | | |0H = Disable trigger. + * | | |1H = External trigger from EADC0_ST pin input. + * | | |2H = ADC ADINT0 interrupt EOC (End of conversion) pulse trigger. + * | | |3H = ADC ADINT1 interrupt EOC (End of conversion) pulse trigger. + * | | |4H = Timer0 overflow pulse trigger. + * | | |5H = Timer1 overflow pulse trigger. + * | | |6H = Timer2 overflow pulse trigger. + * | | |7H = Timer3 overflow pulse trigger. + * | | |8H = Timer4 overflow pulse trigger. + * | | |9H = Timer5 overflow pulse trigger. + * | | |AH = Timer6 overflow pulse trigger. + * | | |BH = Timer7 overflow pulse trigger. + * | | |CH = Timer8 overflow pulse trigger. + * | | |DH = Timer9 overflow pulse trigger. + * | | |EH = Timer10 overflow pulse trigger. + * | | |FH = Timer11 overflow pulse trigger. + * | | |10H = EPWM0TG0. + * | | |11H = EPWM0TG1. + * | | |12H = EPWM0TG2. + * | | |13H = EPWM0TG3. + * | | |14H = EPWM0TG4. + * | | |15H = EPWM0TG5. + * | | |16H = EPWM1TG0. + * | | |17H = EPWM1TG1. + * | | |18H = EPWM1TG2. + * | | |19H = EPWM1TG3. + * | | |1AH = EPWM1TG4. + * | | |1BH = EPWM1TG5. + * | | |1CH = EPWM2TG0. + * | | |1DH = EPWM2TG1. + * | | |1EH = EPWM2TG2. + * | | |1FH = EPWM2TG3. + * | | |20H = EPWM2TG4. + * | | |21H = EPWM2TG5. + * | | |other = Reserved. + * |[22] |INTPOS |Interrupt Flag Position Select + * | | |0 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC end of conversion. + * | | |1 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC start of conversion. + * @var EADC_T::SCTL5 + * Offset: 0x94 ADC Sample Module 5 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |CHSEL |ADC Sample Module Channel Selection + * | | |00H = EADC_CH0. + * | | |01H = EADC_CH1. + * | | |02H = EADC_CH2. + * | | |03H = EADC_CH3. + * | | |04H = EADC_CH4. + * | | |05H = EADC_CH5. + * | | |06H = EADC_CH6. + * | | |07H = EADC_CH7. + * | | |08H = VBAT/4. + * |[4] |EXTREN |ADC External Trigger Rising Edge Enable Bit + * | | |0 = Rising edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Rising edge Enabled when ADC selects EADC0_ST as trigger source. + * |[5] |EXTFEN |ADC External Trigger Falling Edge Enable Bit + * | | |0 = Falling edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Falling edge Enabled when ADC selects EADC0_ST as trigger source. + * |[7:6] |TRGDLYDIV |ADC Sample Module Start of Conversion Trigger Delay Clock Divider Selection + * | | |Trigger delay clock frequency: + * | | |00 = ADC_CLK/1. + * | | |01 = ADC_CLK/2. + * | | |10 = ADC_CLK/4. + * | | |11 = ADC_CLK/16. + * |[15:8] |TRGDLYCNT |ADC Sample Module Start of Conversion Trigger Delay Time + * | | |Trigger delay time = TRGDLYCNT x ADC_CLK period x n (n=1,2,4,16 from TRGDLYDIV setting). + * | | |Note: If TRGDLYCNT is set to 1, trigger delay time is actually the same as TRGDLYCNT is set to 2 for hardware operation. + * |[21:16] |TRGSEL |ADC Sample Module Start of Conversion Trigger Source Selection + * | | |0H = Disable trigger. + * | | |1H = External trigger from EADC0_ST pin input. + * | | |2H = ADC ADINT0 interrupt EOC (End of conversion) pulse trigger. + * | | |3H = ADC ADINT1 interrupt EOC (End of conversion) pulse trigger. + * | | |4H = Timer0 overflow pulse trigger. + * | | |5H = Timer1 overflow pulse trigger. + * | | |6H = Timer2 overflow pulse trigger. + * | | |7H = Timer3 overflow pulse trigger. + * | | |8H = Timer4 overflow pulse trigger. + * | | |9H = Timer5 overflow pulse trigger. + * | | |AH = Timer6 overflow pulse trigger. + * | | |BH = Timer7 overflow pulse trigger. + * | | |CH = Timer8 overflow pulse trigger. + * | | |DH = Timer9 overflow pulse trigger. + * | | |EH = Timer10 overflow pulse trigger. + * | | |FH = Timer11 overflow pulse trigger. + * | | |10H = EPWM0TG0. + * | | |11H = EPWM0TG1. + * | | |12H = EPWM0TG2. + * | | |13H = EPWM0TG3. + * | | |14H = EPWM0TG4. + * | | |15H = EPWM0TG5. + * | | |16H = EPWM1TG0. + * | | |17H = EPWM1TG1. + * | | |18H = EPWM1TG2. + * | | |19H = EPWM1TG3. + * | | |1AH = EPWM1TG4. + * | | |1BH = EPWM1TG5. + * | | |1CH = EPWM2TG0. + * | | |1DH = EPWM2TG1. + * | | |1EH = EPWM2TG2. + * | | |1FH = EPWM2TG3. + * | | |20H = EPWM2TG4. + * | | |21H = EPWM2TG5. + * | | |other = Reserved. + * |[22] |INTPOS |Interrupt Flag Position Select + * | | |0 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC end of conversion. + * | | |1 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC start of conversion. + * @var EADC_T::SCTL6 + * Offset: 0x98 ADC Sample Module 6 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |CHSEL |ADC Sample Module Channel Selection + * | | |00H = EADC_CH0. + * | | |01H = EADC_CH1. + * | | |02H = EADC_CH2. + * | | |03H = EADC_CH3. + * | | |04H = EADC_CH4. + * | | |05H = EADC_CH5. + * | | |06H = EADC_CH6. + * | | |07H = EADC_CH7. + * | | |08H = VBAT/4. + * |[4] |EXTREN |ADC External Trigger Rising Edge Enable Bit + * | | |0 = Rising edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Rising edge Enabled when ADC selects EADC0_ST as trigger source. + * |[5] |EXTFEN |ADC External Trigger Falling Edge Enable Bit + * | | |0 = Falling edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Falling edge Enabled when ADC selects EADC0_ST as trigger source. + * |[7:6] |TRGDLYDIV |ADC Sample Module Start of Conversion Trigger Delay Clock Divider Selection + * | | |Trigger delay clock frequency: + * | | |00 = ADC_CLK/1. + * | | |01 = ADC_CLK/2. + * | | |10 = ADC_CLK/4. + * | | |11 = ADC_CLK/16. + * |[15:8] |TRGDLYCNT |ADC Sample Module Start of Conversion Trigger Delay Time + * | | |Trigger delay time = TRGDLYCNT x ADC_CLK period x n (n=1,2,4,16 from TRGDLYDIV setting). + * | | |Note: If TRGDLYCNT is set to 1, trigger delay time is actually the same as TRGDLYCNT is set to 2 for hardware operation. + * |[21:16] |TRGSEL |ADC Sample Module Start of Conversion Trigger Source Selection + * | | |0H = Disable trigger. + * | | |1H = External trigger from EADC0_ST pin input. + * | | |2H = ADC ADINT0 interrupt EOC (End of conversion) pulse trigger. + * | | |3H = ADC ADINT1 interrupt EOC (End of conversion) pulse trigger. + * | | |4H = Timer0 overflow pulse trigger. + * | | |5H = Timer1 overflow pulse trigger. + * | | |6H = Timer2 overflow pulse trigger. + * | | |7H = Timer3 overflow pulse trigger. + * | | |8H = Timer4 overflow pulse trigger. + * | | |9H = Timer5 overflow pulse trigger. + * | | |AH = Timer6 overflow pulse trigger. + * | | |BH = Timer7 overflow pulse trigger. + * | | |CH = Timer8 overflow pulse trigger. + * | | |DH = Timer9 overflow pulse trigger. + * | | |EH = Timer10 overflow pulse trigger. + * | | |FH = Timer11 overflow pulse trigger. + * | | |10H = EPWM0TG0. + * | | |11H = EPWM0TG1. + * | | |12H = EPWM0TG2. + * | | |13H = EPWM0TG3. + * | | |14H = EPWM0TG4. + * | | |15H = EPWM0TG5. + * | | |16H = EPWM1TG0. + * | | |17H = EPWM1TG1. + * | | |18H = EPWM1TG2. + * | | |19H = EPWM1TG3. + * | | |1AH = EPWM1TG4. + * | | |1BH = EPWM1TG5. + * | | |1CH = EPWM2TG0. + * | | |1DH = EPWM2TG1. + * | | |1EH = EPWM2TG2. + * | | |1FH = EPWM2TG3. + * | | |20H = EPWM2TG4. + * | | |21H = EPWM2TG5. + * | | |other = Reserved. + * |[22] |INTPOS |Interrupt Flag Position Select + * | | |0 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC end of conversion. + * | | |1 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC start of conversion. + * @var EADC_T::SCTL7 + * Offset: 0x9C ADC Sample Module 7 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |CHSEL |ADC Sample Module Channel Selection + * | | |00H = EADC_CH0. + * | | |01H = EADC_CH1. + * | | |02H = EADC_CH2. + * | | |03H = EADC_CH3. + * | | |04H = EADC_CH4. + * | | |05H = EADC_CH5. + * | | |06H = EADC_CH6. + * | | |07H = EADC_CH7. + * | | |08H = VBAT/4. + * |[4] |EXTREN |ADC External Trigger Rising Edge Enable Bit + * | | |0 = Rising edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Rising edge Enabled when ADC selects EADC0_ST as trigger source. + * |[5] |EXTFEN |ADC External Trigger Falling Edge Enable Bit + * | | |0 = Falling edge Disabled when ADC selects EADC0_ST as trigger source. + * | | |1 = Falling edge Enabled when ADC selects EADC0_ST as trigger source. + * |[7:6] |TRGDLYDIV |ADC Sample Module Start of Conversion Trigger Delay Clock Divider Selection + * | | |Trigger delay clock frequency: + * | | |00 = ADC_CLK/1. + * | | |01 = ADC_CLK/2. + * | | |10 = ADC_CLK/4. + * | | |11 = ADC_CLK/16. + * |[15:8] |TRGDLYCNT |ADC Sample Module Start of Conversion Trigger Delay Time + * | | |Trigger delay time = TRGDLYCNT x ADC_CLK period x n (n=1,2,4,16 from TRGDLYDIV setting). + * | | |Note: If TRGDLYCNT is set to 1, trigger delay time is actually the same as TRGDLYCNT is set to 2 for hardware operation. + * |[21:16] |TRGSEL |ADC Sample Module Start of Conversion Trigger Source Selection + * | | |0H = Disable trigger. + * | | |1H = External trigger from EADC0_ST pin input. + * | | |2H = ADC ADINT0 interrupt EOC (End of conversion) pulse trigger. + * | | |3H = ADC ADINT1 interrupt EOC (End of conversion) pulse trigger. + * | | |4H = Timer0 overflow pulse trigger. + * | | |5H = Timer1 overflow pulse trigger. + * | | |6H = Timer2 overflow pulse trigger. + * | | |7H = Timer3 overflow pulse trigger. + * | | |8H = Timer4 overflow pulse trigger. + * | | |9H = Timer5 overflow pulse trigger. + * | | |AH = Timer6 overflow pulse trigger. + * | | |BH = Timer7 overflow pulse trigger. + * | | |CH = Timer8 overflow pulse trigger. + * | | |DH = Timer9 overflow pulse trigger. + * | | |EH = Timer10 overflow pulse trigger. + * | | |FH = Timer11 overflow pulse trigger. + * | | |10H = EPWM0TG0. + * | | |11H = EPWM0TG1. + * | | |12H = EPWM0TG2. + * | | |13H = EPWM0TG3. + * | | |14H = EPWM0TG4. + * | | |15H = EPWM0TG5. + * | | |16H = EPWM1TG0. + * | | |17H = EPWM1TG1. + * | | |18H = EPWM1TG2. + * | | |19H = EPWM1TG3. + * | | |1AH = EPWM1TG4. + * | | |1BH = EPWM1TG5. + * | | |1CH = EPWM2TG0. + * | | |1DH = EPWM2TG1. + * | | |1EH = EPWM2TG2. + * | | |1FH = EPWM2TG3. + * | | |20H = EPWM2TG4. + * | | |21H = EPWM2TG5. + * | | |other = Reserved. + * |[22] |INTPOS |Interrupt Flag Position Select + * | | |0 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC end of conversion. + * | | |1 = Set ADIFn (EADC_STATUS2[n], n=0~3) at ADC start of conversion. + * @var EADC_T::INTSRC0 + * Offset: 0xD0 ADC Interrupt 0 Source Enable Control Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SPLIE0 |Sample Module 0 Interrupt Enable Bit + * | | |0 = Sample Module 0 interrupt Disabled. + * | | |1 = Sample Module 0 interrupt Enabled. + * |[1] |SPLIE1 |Sample Module 1 Interrupt Enable Bit + * | | |0 = Sample Module 1 interrupt Disabled. + * | | |1 = Sample Module 1 interrupt Enabled. + * |[2] |SPLIE2 |Sample Module 2 Interrupt Enable Bit + * | | |0 = Sample Module 2 interrupt Disabled. + * | | |1 = Sample Module 2 interrupt Enabled. + * |[3] |SPLIE3 |Sample Module 3 Interrupt Enable Bit + * | | |0 = Sample Module 3 interrupt Disabled. + * | | |1 = Sample Module 3 interrupt Enabled. + * |[4] |SPLIE4 |Sample Module 4 Interrupt Enable Bit + * | | |0 = Sample Module 4 interrupt Disabled. + * | | |1 = Sample Module 4 interrupt Enabled. + * |[5] |SPLIE5 |Sample Module 5 Interrupt Enable Bit + * | | |0 = Sample Module 5 interrupt Disabled. + * | | |1 = Sample Module 5 interrupt Enabled. + * |[6] |SPLIE6 |Sample Module 6 Interrupt Enable Bit + * | | |0 = Sample Module 6 interrupt Disabled. + * | | |1 = Sample Module 6 interrupt Enabled. + * |[7] |SPLIE7 |Sample Module 7 Interrupt Enable Bit + * | | |0 = Sample Module 7 interrupt Disabled. + * | | |1 = Sample Module 7 interrupt Enabled. + * |[8] |SPLIE8 |Sample Module 8 Interrupt Enable Bit + * | | |0 = Sample Module 8 interrupt Disabled. + * | | |1 = Sample Module 8 interrupt Enabled. + * @var EADC_T::INTSRC1 + * Offset: 0xD4 ADC Interrupt 1 Source Enable Control Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SPLIE0 |Sample Module 0 Interrupt Enable Bit + * | | |0 = Sample Module 0 interrupt Disabled. + * | | |1 = Sample Module 0 interrupt Enabled. + * |[1] |SPLIE1 |Sample Module 1 Interrupt Enable Bit + * | | |0 = Sample Module 1 interrupt Disabled. + * | | |1 = Sample Module 1 interrupt Enabled. + * |[2] |SPLIE2 |Sample Module 2 Interrupt Enable Bit + * | | |0 = Sample Module 2 interrupt Disabled. + * | | |1 = Sample Module 2 interrupt Enabled. + * |[3] |SPLIE3 |Sample Module 3 Interrupt Enable Bit + * | | |0 = Sample Module 3 interrupt Disabled. + * | | |1 = Sample Module 3 interrupt Enabled. + * |[4] |SPLIE4 |Sample Module 4 Interrupt Enable Bit + * | | |0 = Sample Module 4 interrupt Disabled. + * | | |1 = Sample Module 4 interrupt Enabled. + * |[5] |SPLIE5 |Sample Module 5 Interrupt Enable Bit + * | | |0 = Sample Module 5 interrupt Disabled. + * | | |1 = Sample Module 5 interrupt Enabled. + * |[6] |SPLIE6 |Sample Module 6 Interrupt Enable Bit + * | | |0 = Sample Module 6 interrupt Disabled. + * | | |1 = Sample Module 6 interrupt Enabled. + * |[7] |SPLIE7 |Sample Module 7 Interrupt Enable Bit + * | | |0 = Sample Module 7 interrupt Disabled. + * | | |1 = Sample Module 7 interrupt Enabled. + * |[8] |SPLIE8 |Sample Module 8 Interrupt Enable Bit + * | | |0 = Sample Module 8 interrupt Disabled. + * | | |1 = Sample Module 8 interrupt Enabled. + * @var EADC_T::INTSRC2 + * Offset: 0xD8 ADC Interrupt 2 Source Enable Control Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SPLIE0 |Sample Module 0 Interrupt Enable Bit + * | | |0 = Sample Module 0 interrupt Disabled. + * | | |1 = Sample Module 0 interrupt Enabled. + * |[1] |SPLIE1 |Sample Module 1 Interrupt Enable Bit + * | | |0 = Sample Module 1 interrupt Disabled. + * | | |1 = Sample Module 1 interrupt Enabled. + * |[2] |SPLIE2 |Sample Module 2 Interrupt Enable Bit + * | | |0 = Sample Module 2 interrupt Disabled. + * | | |1 = Sample Module 2 interrupt Enabled. + * |[3] |SPLIE3 |Sample Module 3 Interrupt Enable Bit + * | | |0 = Sample Module 3 interrupt Disabled. + * | | |1 = Sample Module 3 interrupt Enabled. + * |[4] |SPLIE4 |Sample Module 4 Interrupt Enable Bit + * | | |0 = Sample Module 4 interrupt Disabled. + * | | |1 = Sample Module 4 interrupt Enabled. + * |[5] |SPLIE5 |Sample Module 5 Interrupt Enable Bit + * | | |0 = Sample Module 5 interrupt Disabled. + * | | |1 = Sample Module 5 interrupt Enabled. + * |[6] |SPLIE6 |Sample Module 6 Interrupt Enable Bit + * | | |0 = Sample Module 6 interrupt Disabled. + * | | |1 = Sample Module 6 interrupt Enabled. + * |[7] |SPLIE7 |Sample Module 7 Interrupt Enable Bit + * | | |0 = Sample Module 7 interrupt Disabled. + * | | |1 = Sample Module 7 interrupt Enabled. + * |[8] |SPLIE8 |Sample Module 8 Interrupt Enable Bit + * | | |0 = Sample Module 8 interrupt Disabled. + * | | |1 = Sample Module 8 interrupt Enabled. + * @var EADC_T::INTSRC3 + * Offset: 0xDC ADC Interrupt 3 Source Enable Control Register. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SPLIE0 |Sample Module 0 Interrupt Enable Bit + * | | |0 = Sample Module 0 interrupt Disabled. + * | | |1 = Sample Module 0 interrupt Enabled. + * |[1] |SPLIE1 |Sample Module 1 Interrupt Enable Bit + * | | |0 = Sample Module 1 interrupt Disabled. + * | | |1 = Sample Module 1 interrupt Enabled. + * |[2] |SPLIE2 |Sample Module 2 Interrupt Enable Bit + * | | |0 = Sample Module 2 interrupt Disabled. + * | | |1 = Sample Module 2 interrupt Enabled. + * |[3] |SPLIE3 |Sample Module 3 Interrupt Enable Bit + * | | |0 = Sample Module 3 interrupt Disabled. + * | | |1 = Sample Module 3 interrupt Enabled. + * |[4] |SPLIE4 |Sample Module 4 Interrupt Enable Bit + * | | |0 = Sample Module 4 interrupt Disabled. + * | | |1 = Sample Module 4 interrupt Enabled. + * |[5] |SPLIE5 |Sample Module 5 Interrupt Enable Bit + * | | |0 = Sample Module 5 interrupt Disabled. + * | | |1 = Sample Module 5 interrupt Enabled. + * |[6] |SPLIE6 |Sample Module 6 Interrupt Enable Bit + * | | |0 = Sample Module 6 interrupt Disabled. + * | | |1 = Sample Module 6 interrupt Enabled. + * |[7] |SPLIE7 |Sample Module 7 Interrupt Enable Bit + * | | |0 = Sample Module 7 interrupt Disabled. + * | | |1 = Sample Module 7 interrupt Enabled. + * |[8] |SPLIE8 |Sample Module 8 Interrupt Enable Bit + * | | |0 = Sample Module 8 interrupt Disabled. + * | | |1 = Sample Module 8 interrupt Enabled. + * @var EADC_T::CMP0 + * Offset: 0xE0 ADC Result Compare Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ADCMPEN |ADC Result Compare Enable Bit + * | | |0 = Compare Disabled. + * | | |1 = Compare Enabled. + * | | |Set this bit to 1 to enable compare CMPDAT (EADC_CMPn[27:16], n=0~3) with specified sample module conversion result when converted data is loaded into EADC_DAT register. + * |[1] |ADCMPIE |ADC Result Compare Interrupt Enable Bit + * | | |0 = Compare function interrupt Disabled. + * | | |1 = Compare function interrupt Enabled. + * | | |If the compare function is enabled and the compare condition matches the setting of CMPCOND (EADC_CMPn[2], n=0~3) and CMPMCNT (EADC_CMPn[11:8], n=0~3), ADCMPFn (EADC_STATUS2[7:4], n=0~3) will be asserted, in the meanwhile, if ADCMPIE is set to 1, a compare interrupt request is generated. + * |[2] |CMPCOND |Compare Condition + * | | |0= Set the compare condition as that when a 12-bit ADC conversion result is less than the 12-bit CMPDAT (EADC_CMPn [27:16]), the internal match counter will increase one. + * | | |1= Set the compare condition as that when a 12-bit ADC conversion result is greater or equal to the 12-bit CMPDAT (EADC_CMPn [27:16]), the internal match counter will increase one. + * | | |Note: When the internal counter reaches the value to (CMPMCNT (EADC_CMPn[11:8], n=0~3) +1), the CMPF bit will be set. + * |[6:3] |CMPSPL |Compare Sample Module Selection + * | | |00000 = Sample Module 0 conversion result EADC_DAT0 is selected to be compared. + * | | |00001 = Sample Module 1 conversion result EADC_DAT1 is selected to be compared. + * | | |00010 = Sample Module 2 conversion result EADC_DAT2 is selected to be compared. + * | | |00011 = Sample Module 3 conversion result EADC_DAT3 is selected to be compared. + * | | |00100 = Sample Module 4 conversion result EADC_DAT4 is selected to be compared. + * | | |00101 = Sample Module 5 conversion result EADC_DAT5 is selected to be compared. + * | | |00110 = Sample Module 6 conversion result EADC_DAT6 is selected to be compared. + * | | |00111 = Sample Module 7 conversion result EADC_DAT7 is selected to be compared. + * | | |01000 = Sample Module 8 conversion result EADC_DAT8 is selected to be compared. + * |[11:8] |CMPMCNT |Compare Match Count + * | | |When the specified ADC sample module analog conversion result matches the compare condition defined by CMPCOND (EADC_CMPn[2], n=0~3), the internal match counter will increase 1 + * | | |If the compare result does not meet the compare condition, the internal compare match counter will reset to 0 + * | | |When the internal counter reaches the value to (CMPMCNT +1), the ADCMPFn (EADC_STATUS2[7:4], n=0~3) will be set. + * |[15] |CMPWEN |Compare Window Mode Enable Bit + * | | |0 = ADCMPF0 (EADC_STATUS2[4]) will be set when EADC_CMP0 compared condition matched + * | | |ADCMPF2 (EADC_STATUS2[6]) will be set when EADC_CMP2 compared condition matched + * | | |1 = ADCMPF0 (EADC_STATUS2[4]) will be set when both EADC_CMP0 and EADC_CMP1 compared condition matched + * | | |ADCMPF2 (EADC_STATUS2[6]) will be set when both EADC_CMP2 and EADC_CMP3 compared condition matched. + * | | |Note: This bit is only present in EADC_CMP0 and EADC_CMP2 register. + * |[27:16] |CMPDAT |Comparison Data + * | | |The 12 bits data is used to compare with conversion result of specified sample module + * | | |User can use it to monitor the external analog input pin voltage transition without imposing a load on software. + * @var EADC_T::CMP1 + * Offset: 0xE4 ADC Result Compare Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ADCMPEN |ADC Result Compare Enable Bit + * | | |0 = Compare Disabled. + * | | |1 = Compare Enabled. + * | | |Set this bit to 1 to enable compare CMPDAT (EADC_CMPn[27:16], n=0~3) with specified sample module conversion result when converted data is loaded into EADC_DAT register. + * |[1] |ADCMPIE |ADC Result Compare Interrupt Enable Bit + * | | |0 = Compare function interrupt Disabled. + * | | |1 = Compare function interrupt Enabled. + * | | |If the compare function is enabled and the compare condition matches the setting of CMPCOND (EADC_CMPn[2], n=0~3) and CMPMCNT (EADC_CMPn[11:8], n=0~3), ADCMPFn (EADC_STATUS2[7:4], n=0~3) will be asserted, in the meanwhile, if ADCMPIE is set to 1, a compare interrupt request is generated. + * |[2] |CMPCOND |Compare Condition + * | | |0= Set the compare condition as that when a 12-bit ADC conversion result is less than the 12-bit CMPDAT (EADC_CMPn [27:16]), the internal match counter will increase one. + * | | |1= Set the compare condition as that when a 12-bit ADC conversion result is greater or equal to the 12-bit CMPDAT (EADC_CMPn [27:16]), the internal match counter will increase one. + * | | |Note: When the internal counter reaches the value to (CMPMCNT (EADC_CMPn[11:8], n=0~3) +1), the CMPF bit will be set. + * |[6:3] |CMPSPL |Compare Sample Module Selection + * | | |00000 = Sample Module 0 conversion result EADC_DAT0 is selected to be compared. + * | | |00001 = Sample Module 1 conversion result EADC_DAT1 is selected to be compared. + * | | |00010 = Sample Module 2 conversion result EADC_DAT2 is selected to be compared. + * | | |00011 = Sample Module 3 conversion result EADC_DAT3 is selected to be compared. + * | | |00100 = Sample Module 4 conversion result EADC_DAT4 is selected to be compared. + * | | |00101 = Sample Module 5 conversion result EADC_DAT5 is selected to be compared. + * | | |00110 = Sample Module 6 conversion result EADC_DAT6 is selected to be compared. + * | | |00111 = Sample Module 7 conversion result EADC_DAT7 is selected to be compared. + * | | |01000 = Sample Module 8 conversion result EADC_DAT8 is selected to be compared. + * |[11:8] |CMPMCNT |Compare Match Count + * | | |When the specified ADC sample module analog conversion result matches the compare condition defined by CMPCOND (EADC_CMPn[2], n=0~3), the internal match counter will increase 1 + * | | |If the compare result does not meet the compare condition, the internal compare match counter will reset to 0 + * | | |When the internal counter reaches the value to (CMPMCNT +1), the ADCMPFn (EADC_STATUS2[7:4], n=0~3) will be set. + * |[15] |CMPWEN |Compare Window Mode Enable Bit + * | | |0 = ADCMPF0 (EADC_STATUS2[4]) will be set when EADC_CMP0 compared condition matched + * | | |ADCMPF2 (EADC_STATUS2[6]) will be set when EADC_CMP2 compared condition matched + * | | |1 = ADCMPF0 (EADC_STATUS2[4]) will be set when both EADC_CMP0 and EADC_CMP1 compared condition matched + * | | |ADCMPF2 (EADC_STATUS2[6]) will be set when both EADC_CMP2 and EADC_CMP3 compared condition matched. + * | | |Note: This bit is only present in EADC_CMP0 and EADC_CMP2 register. + * |[27:16] |CMPDAT |Comparison Data + * | | |The 12 bits data is used to compare with conversion result of specified sample module + * | | |User can use it to monitor the external analog input pin voltage transition without imposing a load on software. + * @var EADC_T::CMP2 + * Offset: 0xE8 ADC Result Compare Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ADCMPEN |ADC Result Compare Enable Bit + * | | |0 = Compare Disabled. + * | | |1 = Compare Enabled. + * | | |Set this bit to 1 to enable compare CMPDAT (EADC_CMPn[27:16], n=0~3) with specified sample module conversion result when converted data is loaded into EADC_DAT register. + * |[1] |ADCMPIE |ADC Result Compare Interrupt Enable Bit + * | | |0 = Compare function interrupt Disabled. + * | | |1 = Compare function interrupt Enabled. + * | | |If the compare function is enabled and the compare condition matches the setting of CMPCOND (EADC_CMPn[2], n=0~3) and CMPMCNT (EADC_CMPn[11:8], n=0~3), ADCMPFn (EADC_STATUS2[7:4], n=0~3) will be asserted, in the meanwhile, if ADCMPIE is set to 1, a compare interrupt request is generated. + * |[2] |CMPCOND |Compare Condition + * | | |0= Set the compare condition as that when a 12-bit ADC conversion result is less than the 12-bit CMPDAT (EADC_CMPn [27:16]), the internal match counter will increase one. + * | | |1= Set the compare condition as that when a 12-bit ADC conversion result is greater or equal to the 12-bit CMPDAT (EADC_CMPn [27:16]), the internal match counter will increase one. + * | | |Note: When the internal counter reaches the value to (CMPMCNT (EADC_CMPn[11:8], n=0~3) +1), the CMPF bit will be set. + * |[6:3] |CMPSPL |Compare Sample Module Selection + * | | |00000 = Sample Module 0 conversion result EADC_DAT0 is selected to be compared. + * | | |00001 = Sample Module 1 conversion result EADC_DAT1 is selected to be compared. + * | | |00010 = Sample Module 2 conversion result EADC_DAT2 is selected to be compared. + * | | |00011 = Sample Module 3 conversion result EADC_DAT3 is selected to be compared. + * | | |00100 = Sample Module 4 conversion result EADC_DAT4 is selected to be compared. + * | | |00101 = Sample Module 5 conversion result EADC_DAT5 is selected to be compared. + * | | |00110 = Sample Module 6 conversion result EADC_DAT6 is selected to be compared. + * | | |00111 = Sample Module 7 conversion result EADC_DAT7 is selected to be compared. + * | | |01000 = Sample Module 8 conversion result EADC_DAT8 is selected to be compared. + * |[11:8] |CMPMCNT |Compare Match Count + * | | |When the specified ADC sample module analog conversion result matches the compare condition defined by CMPCOND (EADC_CMPn[2], n=0~3), the internal match counter will increase 1 + * | | |If the compare result does not meet the compare condition, the internal compare match counter will reset to 0 + * | | |When the internal counter reaches the value to (CMPMCNT +1), the ADCMPFn (EADC_STATUS2[7:4], n=0~3) will be set. + * |[15] |CMPWEN |Compare Window Mode Enable Bit + * | | |0 = ADCMPF0 (EADC_STATUS2[4]) will be set when EADC_CMP0 compared condition matched + * | | |ADCMPF2 (EADC_STATUS2[6]) will be set when EADC_CMP2 compared condition matched + * | | |1 = ADCMPF0 (EADC_STATUS2[4]) will be set when both EADC_CMP0 and EADC_CMP1 compared condition matched + * | | |ADCMPF2 (EADC_STATUS2[6]) will be set when both EADC_CMP2 and EADC_CMP3 compared condition matched. + * | | |Note: This bit is only present in EADC_CMP0 and EADC_CMP2 register. + * |[27:16] |CMPDAT |Comparison Data + * | | |The 12 bits data is used to compare with conversion result of specified sample module + * | | |User can use it to monitor the external analog input pin voltage transition without imposing a load on software. + * @var EADC_T::CMP3 + * Offset: 0xEC ADC Result Compare Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ADCMPEN |ADC Result Compare Enable Bit + * | | |0 = Compare Disabled. + * | | |1 = Compare Enabled. + * | | |Set this bit to 1 to enable compare CMPDAT (EADC_CMPn[27:16], n=0~3) with specified sample module conversion result when converted data is loaded into EADC_DAT register. + * |[1] |ADCMPIE |ADC Result Compare Interrupt Enable Bit + * | | |0 = Compare function interrupt Disabled. + * | | |1 = Compare function interrupt Enabled. + * | | |If the compare function is enabled and the compare condition matches the setting of CMPCOND (EADC_CMPn[2], n=0~3) and CMPMCNT (EADC_CMPn[11:8], n=0~3), ADCMPFn (EADC_STATUS2[7:4], n=0~3) will be asserted, in the meanwhile, if ADCMPIE is set to 1, a compare interrupt request is generated. + * |[2] |CMPCOND |Compare Condition + * | | |0= Set the compare condition as that when a 12-bit ADC conversion result is less than the 12-bit CMPDAT (EADC_CMPn [27:16]), the internal match counter will increase one. + * | | |1= Set the compare condition as that when a 12-bit ADC conversion result is greater or equal to the 12-bit CMPDAT (EADC_CMPn [27:16]), the internal match counter will increase one. + * | | |Note: When the internal counter reaches the value to (CMPMCNT (EADC_CMPn[11:8], n=0~3) +1), the CMPF bit will be set. + * |[6:3] |CMPSPL |Compare Sample Module Selection + * | | |00000 = Sample Module 0 conversion result EADC_DAT0 is selected to be compared. + * | | |00001 = Sample Module 1 conversion result EADC_DAT1 is selected to be compared. + * | | |00010 = Sample Module 2 conversion result EADC_DAT2 is selected to be compared. + * | | |00011 = Sample Module 3 conversion result EADC_DAT3 is selected to be compared. + * | | |00100 = Sample Module 4 conversion result EADC_DAT4 is selected to be compared. + * | | |00101 = Sample Module 5 conversion result EADC_DAT5 is selected to be compared. + * | | |00110 = Sample Module 6 conversion result EADC_DAT6 is selected to be compared. + * | | |00111 = Sample Module 7 conversion result EADC_DAT7 is selected to be compared. + * | | |01000 = Sample Module 8 conversion result EADC_DAT8 is selected to be compared. + * |[11:8] |CMPMCNT |Compare Match Count + * | | |When the specified ADC sample module analog conversion result matches the compare condition defined by CMPCOND (EADC_CMPn[2], n=0~3), the internal match counter will increase 1 + * | | |If the compare result does not meet the compare condition, the internal compare match counter will reset to 0 + * | | |When the internal counter reaches the value to (CMPMCNT +1), the ADCMPFn (EADC_STATUS2[7:4], n=0~3) will be set. + * |[15] |CMPWEN |Compare Window Mode Enable Bit + * | | |0 = ADCMPF0 (EADC_STATUS2[4]) will be set when EADC_CMP0 compared condition matched + * | | |ADCMPF2 (EADC_STATUS2[6]) will be set when EADC_CMP2 compared condition matched + * | | |1 = ADCMPF0 (EADC_STATUS2[4]) will be set when both EADC_CMP0 and EADC_CMP1 compared condition matched + * | | |ADCMPF2 (EADC_STATUS2[6]) will be set when both EADC_CMP2 and EADC_CMP3 compared condition matched. + * | | |Note: This bit is only present in EADC_CMP0 and EADC_CMP2 register. + * |[27:16] |CMPDAT |Comparison Data + * | | |The 12 bits data is used to compare with conversion result of specified sample module + * | | |User can use it to monitor the external analog input pin voltage transition without imposing a load on software. + * @var EADC_T::STATUS0 + * Offset: 0xF0 ADC Status Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |VALID |EADC_DAT0~8 Data Valid Flag + * | | |It is a mirror of VALID bit in sample module ADC result data register EADC_DATn. (n=0~8). + * |[24:16] |OV |EADC_DAT0~8 Overrun Flag + * | | |It is a mirror to OV bit in sample module ADC result data register EADC_DATn. (n=0~8). + * @var EADC_T::STATUS2 + * Offset: 0xF8 ADC Status Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ADIF0 |ADC ADINT0 Interrupt Flag + * | | |0 = No ADINT0 interrupt pulse received. + * | | |1 = ADINT0 interrupt pulse has been received. + * | | |Note 1: This bit is cleared by writing 1 to it. + * | | |Note 2:This bit indicates whether an ADC conversion of specific sample module has been completed + * |[1] |ADIF1 |ADC ADINT1 Interrupt Flag + * | | |0 = No ADINT1 interrupt pulse received. + * | | |1 = ADINT1 interrupt pulse has been received. + * | | |Note 1: This bit is cleared by writing 1 to it. + * | | |Note 2:This bit indicates whether an ADC conversion of specific sample module has been completed + * |[2] |ADIF2 |ADC ADINT2 Interrupt Flag + * | | |0 = No ADINT2 interrupt pulse received. + * | | |1 = ADINT2 interrupt pulse has been received. + * | | |Note 1: This bit is cleared by writing 1 to it. + * | | |Note 2:This bit indicates whether an ADC conversion of specific sample module has been completed + * |[3] |ADIF3 |ADC ADINT3 Interrupt Flag + * | | |0 = No ADINT3 interrupt pulse received. + * | | |1 = ADINT3 interrupt pulse has been received. + * | | |Note 1: This bit is cleared by writing 1 to it. + * | | |Note 2:This bit indicates whether an ADC conversion of specific sample module has been completed + * |[4] |ADCMPF0 |ADC Compare 0 Flag + * | | |When the specific sample module ADC conversion result meets setting condition in EADC_CMP0 then this bit is set to 1. + * | | |0 = Conversion result in EADC_DAT does not meet EADC_CMP0 register setting. + * | | |1 = Conversion result in EADC_DAT meets EADC_CMP0 register setting. + * | | |Note: This bit is cleared by writing 1 to it. + * |[5] |ADCMPF1 |ADC Compare 1 Flag + * | | |When the specific sample module ADC conversion result meets setting condition in EADC_CMP1 then this bit is set to 1. + * | | |0 = Conversion result in EADC_DAT does not meet EADC_CMP1 register setting. + * | | |1 = Conversion result in EADC_DAT meets EADC_CMP1 register setting. + * | | |Note: This bit is cleared by writing 1 to it. + * |[6] |ADCMPF2 |ADC Compare 2 Flag + * | | |When the specific sample module ADC conversion result meets setting condition in EADC_CMP2 then this bit is set to 1. + * | | |0 = Conversion result in EADC_DAT does not meet EADC_CMP2 register setting. + * | | |1 = Conversion result in EADC_DAT meets EADC_CMP2 register setting. + * | | |Note: This bit is cleared by writing 1 to it. + * |[7] |ADCMPF3 |ADC Compare 3 Flag + * | | |When the specific sample module ADC conversion result meets setting condition in EADC_CMP3 then this bit is set to 1. + * | | |0 = Conversion result in EADC_DAT does not meet EADC_CMP3 register setting. + * | | |1 = Conversion result in EADC_DAT meets EADC_CMP3 register setting. + * | | |Note: This bit is cleared by writing 1 to it. + * |[8] |ADOVIF0 |ADC ADINT0 Interrupt Flag Overrun + * | | |0 = ADINT0 interrupt flag is not overwritten to 1. + * | | |1 = ADINT0 interrupt flag is overwritten to 1. + * | | |Note: This bit is cleared by writing 1 to it. + * |[9] |ADOVIF1 |ADC ADINT1 Interrupt Flag Overrun + * | | |0 = ADINT1 interrupt flag is not overwritten to 1. + * | | |1 = ADINT1 interrupt flag is overwritten to 1. + * | | |Note: This bit is cleared by writing 1 to it. + * |[10] |ADOVIF2 |ADC ADINT2 Interrupt Flag Overrun + * | | |0 = ADINT2 interrupt flag is not overwritten to 1. + * | | |1 = ADINT2 interrupt flag is overwritten to 1. + * | | |Note: This bit is cleared by writing 1 to it. + * |[11] |ADOVIF3 |ADC ADINT3 Interrupt Flag Overrun + * | | |0 = ADINT3 interrupt flag is not overwritten to 1. + * | | |1 = ADINT3 interrupt flag is overwritten to 1. + * | | |Note: This bit is cleared by writing 1 to it. + * |[12] |ADCMPO0 |ADC Compare 0 Output Status (Read Only) + * | | |The 12 bits compare0 data CMPDAT0 (EADC_CMP0[27:16]) is used to compare with conversion result of specified sample module + * | | |User can use it to monitor the external analog input pin voltage status. + * | | |0 = Conversion result in EADC_DAT is less than CMPDAT0 setting. + * | | |1 = Conversion result in EADC_DAT is greater than or equal to CMPDAT0 setting. + * |[13] |ADCMPO1 |ADC Compare 1 Output Status (Read Only) + * | | |The 12 bits compare1 data CMPDAT1 (EADC_CMP1[27:16]) is used to compare with conversion result of specified sample module + * | | |User can use it to monitor the external analog input pin voltage status. + * | | |0 = Conversion result in EADC_DAT is less than CMPDAT1 setting. + * | | |1 = Conversion result in EADC_DAT is greater than or equal to CMPDAT1 setting. + * |[14] |ADCMPO2 |ADC Compare 2 Output Status (Read Only) + * | | |The 12 bits compare2 data CMPDAT2 (EADC_CMP2[27:16]) is used to compare with conversion result of specified sample module + * | | |User can use it to monitor the external analog input pin voltage status. + * | | |0 = Conversion result in EADC_DAT is less than CMPDAT2 setting. + * | | |1 = Conversion result in EADC_DAT is greater than or equal to CMPDAT2 setting. + * |[15] |ADCMPO3 |ADC Compare 3 Output Status (Read Only) + * | | |The 12 bits compare3 data CMPDAT3 (EADC_CMP3[27:16]) is used to compare with conversion result of specified sample module + * | | |User can use it to monitor the external analog input pin voltage status. + * | | |0 = Conversion result in EADC_DAT is less than CMPDAT3 setting. + * | | |1 = Conversion result in EADC_DAT is greater than or equal to CMPDAT3 setting. + * |[20:16] |CHANNEL |Current Conversion Channel (Read Only) + * | | |This filed reflects ADC current conversion channel when BUSY=1. + * | | |00H = EADC_CH0. + * | | |01H = EADC_CH1. + * | | |02H = EADC_CH2. + * | | |03H = EADC_CH3. + * | | |04H = EADC_CH4. + * | | |05H = EADC_CH5. + * | | |06H = EADC_CH6. + * | | |07H = EADC_CH7. + * | | |08H = VBAT/4. + * |[23] |BUSY |Busy/Idle (Read Only) + * | | |0 = EADC is in idle state. + * | | |1 = EADC is busy at conversion. + * |[24] |ADOVIF |All ADC Interrupt Flag Overrun Bits Check (Read Only) + * | | |n=0~3. + * | | |0 = None of ADINT interrupt flag ADOVIFn (EADC_STATUS2[11:8]) is overwritten to 1. + * | | |1 = Any one of ADINT interrupt flag ADOVIFn (EADC_STATUS2[11:8]) is overwritten to 1. + * | | |Note: This bit will keep 1 when any ADOVIFn Flag is equal to 1. + * |[25] |STOVF |All ADC Sample Module Start of Conversion Overrun Flags Check (Read Only) + * | | |n=0~8. + * | | |0 = None of sample module event overrun flag SPOVF (EADC_OVSTS[n]) is set to 1. + * | | |1 = Any one of sample module event overrun flag SPOVF (EADC_OVSTS[n]) is set to 1. + * | | |Note: This bit will keep 1 when any SPOVF Flag is equal to 1. + * |[26] |AVALID |All Sample Module ADC Result Data Register EADC_DAT Data Valid Flag Check (Read Only) + * | | |n=0~8. + * | | |0 = None of sample module data register valid flag VALID (EADC_DATn[17]) is set to 1. + * | | |1 = Any one of sample module data register valid flag VALID (EADC_DATn[17]) is set to 1. + * | | |Note: This bit will keep 1 when any VALID Flag is equal to 1. + * |[27] |AOV |All Sample Module ADC Result Data Register Overrun Flags Check (Read Only) + * | | |n=0~8. + * | | |0 = None of sample module data register overrun flag OV (EADC_DATn[16]) is set to 1. + * | | |1 = Any one of sample module data register overrun flag OV (EADC_DATn[16]) is set to 1. + * | | |Note: This bit will keep 1 when any OV Flag is equal to 1. + * @var EADC_T::STATUS3 + * Offset: 0xFC ADC Status Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |CURSPL |ADC Current Sample Module (Read Only) + * | | |This register shows the current ADC is controlled by which sample module control logic modules. + * | | |If the ADC is Idle, the bit filed will be set to 0x1F. + * @var EADC_T::DDAT0 + * Offset: 0x100 ADC Double Data Register 0 for Sample Module 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Results + * | | |This field contains 12 bits conversion results. + * | | |When the DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT [11:0] and zero will be filled in RESULT [15:12]. + * | | |When DMOF (EADC_CTL[9]) is set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT [11:0] and signed bits to will be filled in RESULT [15:12]. + * |[16] |OV |Overrun Flag + * | | |0 = Data in RESULT (EADC_DATn[15:0], n=0~3) is recent conversion result. + * | | |1 = Data in RESULT (EADC_DATn[15:0], n=0~3) is overwrite. + * | | |Note: If converted data in RESULT[15:0] has not been read before new conversion result is loaded to this register, OV is set to 1 + * | | |It is cleared by hardware after EADC_DDAT register is read. + * |[17] |VALID |Valid Flag + * | | |0 = Double data in RESULT (EADC_DDATn[15:0]) is not valid. + * | | |1 = Double data in RESULT (EADC_DDATn[15:0]) is valid. + * | | |Note: This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DDATn register is read (n=0~3). + * @var EADC_T::DDAT1 + * Offset: 0x104 ADC Double Data Register 1 for Sample Module 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Results + * | | |This field contains 12 bits conversion results. + * | | |When the DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT [11:0] and zero will be filled in RESULT [15:12]. + * | | |When DMOF (EADC_CTL[9]) is set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT [11:0] and signed bits to will be filled in RESULT [15:12]. + * |[16] |OV |Overrun Flag + * | | |0 = Data in RESULT (EADC_DATn[15:0], n=0~3) is recent conversion result. + * | | |1 = Data in RESULT (EADC_DATn[15:0], n=0~3) is overwrite. + * | | |Note: If converted data in RESULT[15:0] has not been read before new conversion result is loaded to this register, OV is set to 1 + * | | |It is cleared by hardware after EADC_DDAT register is read. + * |[17] |VALID |Valid Flag + * | | |0 = Double data in RESULT (EADC_DDATn[15:0]) is not valid. + * | | |1 = Double data in RESULT (EADC_DDATn[15:0]) is valid. + * | | |Note: This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DDATn register is read (n=0~3). + * @var EADC_T::DDAT2 + * Offset: 0x108 ADC Double Data Register 2 for Sample Module 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Results + * | | |This field contains 12 bits conversion results. + * | | |When the DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT [11:0] and zero will be filled in RESULT [15:12]. + * | | |When DMOF (EADC_CTL[9]) is set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT [11:0] and signed bits to will be filled in RESULT [15:12]. + * |[16] |OV |Overrun Flag + * | | |0 = Data in RESULT (EADC_DATn[15:0], n=0~3) is recent conversion result. + * | | |1 = Data in RESULT (EADC_DATn[15:0], n=0~3) is overwrite. + * | | |Note: If converted data in RESULT[15:0] has not been read before new conversion result is loaded to this register, OV is set to 1 + * | | |It is cleared by hardware after EADC_DDAT register is read. + * |[17] |VALID |Valid Flag + * | | |0 = Double data in RESULT (EADC_DDATn[15:0]) is not valid. + * | | |1 = Double data in RESULT (EADC_DDATn[15:0]) is valid. + * | | |Note: This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DDATn register is read (n=0~3). + * @var EADC_T::DDAT3 + * Offset: 0x10C ADC Double Data Register 3 for Sample Module 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RESULT |ADC Conversion Results + * | | |This field contains 12 bits conversion results. + * | | |When the DMOF (EADC_CTL[9]) is set to 0, 12-bit ADC conversion result with unsigned format will be filled in RESULT [11:0] and zero will be filled in RESULT [15:12]. + * | | |When DMOF (EADC_CTL[9]) is set to 1, 12-bit ADC conversion result with 2's complement format will be filled in RESULT [11:0] and signed bits to will be filled in RESULT [15:12]. + * |[16] |OV |Overrun Flag + * | | |0 = Data in RESULT (EADC_DATn[15:0], n=0~3) is recent conversion result. + * | | |1 = Data in RESULT (EADC_DATn[15:0], n=0~3) is overwrite. + * | | |Note: If converted data in RESULT[15:0] has not been read before new conversion result is loaded to this register, OV is set to 1 + * | | |It is cleared by hardware after EADC_DDAT register is read. + * |[17] |VALID |Valid Flag + * | | |0 = Double data in RESULT (EADC_DDATn[15:0]) is not valid. + * | | |1 = Double data in RESULT (EADC_DDATn[15:0]) is valid. + * | | |Note: This bit is set to 1 when corresponding sample module channel analog input conversion is completed and cleared by hardware after EADC_DDATn register is read (n=0~3). + * @var EADC_T::PWRM + * Offset: 0x110 ADC Power Management Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PWUPRDY |ADC Power-up Sequence Completed and Ready for Conversion (Read Only) + * | | |0 = ADC is not ready for conversion may be in power down state or in the progress of start-up. + * | | |1 = ADC is ready for conversion. + * |[1] |PWUCALEN |Power Up Calibration Function Enable Bit + * | | |0 = Calibration function Disabled at power up. + * | | |1 = Calibration function Enabled at power up. + * | | |Note: This bit works together with CALSEL (EADC_CALCTL [3]), see the following + * | | |{PWUCALEN, CALSEL } Description: + * | | |PWUCALEN is 0 and CALSEL is 0: No need to calibrate. + * | | |PWUCALEN is 0 and CALSEL is 1: No need to calibrate. + * | | |PWUCALEN is 1 and CALSEL is 1: Calibrate when power up. + * |[3:2] |PWDMOD |ADC Power-down Mode + * | | |Set this bit field to select ADC Power-down mode when system power-down. + * | | |00 = ADC Deep Power-down mode. + * | | |01 = ADC Power down. + * | | |10 = ADC Standby mode. + * | | |11 = ADC Deep Power-down mode. + * | | |Note: Different PWDMOD has different power down/up sequence; in order to avoid ADC powering up with wrong sequence, user must keep PWMOD consistent each time in power down and start-up + * |[27:8] |IREFSUT |ADC Internal REF Start-up Time + * | | |Set this bit field to control internal reference start-up time + * | | |The typical required internal reference start-up time is 1ms when ADC fully power down + * | | |Internal reference start-up time = (1/ADC_CLK) x IREFSUT. + * | | |Note 1: ADC fully Power-down mode means both ADC macro and internal reference enter Power-down mode. + * | | |Note 2: ADC macro enters Power-down mode when ADCEN(EADC_CTL[0] = 0. + * | | |Note 3: ADC internal reference enters Power-down mode when PDREF(EADC_REFADJCT[0] = 1. + * @var EADC_T::CALCTL + * Offset: 0x114 ADC Calibration Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |CALSTART |Calibration Functional Block Start + * | | |0 = Stop calibration functional block. + * | | |1 = Start calibration functional block. + * | | |Note: This bit is set by software and cleared by hardware after re-calibration is finished. + * |[2] |CALDONE |Calibration Functional Block Complete (Read Only) + * | | |0 = During a calibration. + * | | |1 = Calibration is completed. + * |[3] |CALSEL |Select Calibration Functional Block Enable Bit + * | | |0 = Calibration functional block Disabled. + * | | |1 = Calibration functional block Enabled. + * @var EADC_T::PDMACTL + * Offset: 0x130 ADC PDMA Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |PDMATEN |PDMA Transfer Enable Bit + * | | |When EADC conversion is completed, the converted data is loaded into EADC_DATn (n: 0 ~ 8) register, user can enable this bit to generate a PDMA data transfer request. + * | | |0 = PDMA data transfer Disabled. + * | | |1 = PDMA data transfer Enabled. + * | | |Note:When this bit field is set to 1, user must set EADCIENn (EADC_CTL[5:2], n=0~3) = 0 to disable interrupt. + * |[31] |PDMABUSY |PDMA Busy Bit + * | | |When EADC conversion is completed, the converted data is loaded into EADC_DATn (n: 0 ~ 8) register + * | | |User can trigger PDMA to read converted data + * | | |When PDMA is too busy to read converted data, this bit field to 1. + * | | |Note: This bit is cleared by writing 1 to it. + * @var EADC_T::SELSMP0 + * Offset: 0x140 ADC Select Sampling Time Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |SELSMP0 |Channel n Select Sampling Time Option + * | | |ADC sampling time selection bit, in case more sampling time is needed when the input signal resistance is higher. + * | | |00 = 3+0 ADC_CLK. + * | | |01 = 3+2 ADC_CLK. + * | | |10 = 3+4 ADC_CLK. + * | | |11 = 3+6 ADC_CLK. + * | | |Note: Please set the same value in all of SELSMPn (n = 0,1..8). + * |[5:4] |SELSMP1 |Channel n Select Sampling Time Option + * | | |ADC sampling time selection bit, in case more sampling time is needed when the input signal resistance is higher. + * | | |00 = 3+0 ADC_CLK. + * | | |01 = 3+2 ADC_CLK. + * | | |10 = 3+4 ADC_CLK. + * | | |11 = 3+6 ADC_CLK. + * | | |Note: Please set the same value in all of SELSMPn (n = 0,1..8). + * |[9:8] |SELSMP2 |Channel n Select Sampling Time Option + * | | |ADC sampling time selection bit, in case more sampling time is needed when the input signal resistance is higher. + * | | |00 = 3+0 ADC_CLK. + * | | |01 = 3+2 ADC_CLK. + * | | |10 = 3+4 ADC_CLK. + * | | |11 = 3+6 ADC_CLK. + * | | |Note: Please set the same value in all of SELSMPn (n = 0,1..8). + * |[13:12] |SELSMP3 |Channel n Select Sampling Time Option + * | | |ADC sampling time selection bit, in case more sampling time is needed when the input signal resistance is higher. + * | | |00 = 3+0 ADC_CLK. + * | | |01 = 3+2 ADC_CLK. + * | | |10 = 3+4 ADC_CLK. + * | | |11 = 3+6 ADC_CLK. + * | | |Note: Please set the same value in all of SELSMPn (n = 0,1..8). + * |[17:16] |SELSMP4 |Channel n Select Sampling Time Option + * | | |ADC sampling time selection bit, in case more sampling time is needed when the input signal resistance is higher. + * | | |00 = 3+0 ADC_CLK. + * | | |01 = 3+2 ADC_CLK. + * | | |10 = 3+4 ADC_CLK. + * | | |11 = 3+6 ADC_CLK. + * | | |Note: Please set the same value in all of SELSMPn (n = 0,1..8). + * |[21:20] |SELSMP5 |Channel n Select Sampling Time Option + * | | |ADC sampling time selection bit, in case more sampling time is needed when the input signal resistance is higher. + * | | |00 = 3+0 ADC_CLK. + * | | |01 = 3+2 ADC_CLK. + * | | |10 = 3+4 ADC_CLK. + * | | |11 = 3+6 ADC_CLK. + * | | |Note: Please set the same value in all of SELSMPn (n = 0,1..8). + * |[25:24] |SELSMP6 |Channel n Select Sampling Time Option + * | | |ADC sampling time selection bit, in case more sampling time is needed when the input signal resistance is higher. + * | | |00 = 3+0 ADC_CLK. + * | | |01 = 3+2 ADC_CLK. + * | | |10 = 3+4 ADC_CLK. + * | | |11 = 3+6 ADC_CLK. + * | | |Note: Please set the same value in all of SELSMPn (n = 0,1..8). + * |[29:28] |SELSMP7 |Channel n Select Sampling Time Option + * | | |ADC sampling time selection bit, in case more sampling time is needed when the input signal resistance is higher. + * | | |00 = 3+0 ADC_CLK. + * | | |01 = 3+2 ADC_CLK. + * | | |10 = 3+4 ADC_CLK. + * | | |11 = 3+6 ADC_CLK. + * | | |Note: Please set the same value in all of SELSMPn (n = 0,1..8). + * @var EADC_T::SELSMP1 + * Offset: 0x144 ADC Select Sampling Time Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |SELSMP8 |Channel 8 Select Sampling Time Option + * | | |ADC sampling time selection bit, in case more sampling time is needed when the input signal resistance is higher. + * | | |00 = 3+0 ADC_CLK. + * | | |01 = 3+2 ADC_CLK. + * | | |10 = 3+4 ADC_CLK. + * | | |11 = 3+6 ADC_CLK. + * | | |Note: Please set the same value in all of SELSMPn (n = 0,1..8). + * @var EADC_T::REFADJCTL + * Offset: 0x150 ADC Reference Voltage Adjust Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PDREF |ADC Power Down Internal Reference Control Bit + * | | |0 = Normal operating mode. + * | | |1 = Power-down mode. + * | | |Note: If power down internal reference, ADC's reference voltage must come from external VREF. + * |[4:1] |REFADJ |ADC Internal Band-gap Voltage Option + * | | |By setting REFADJ according to the following formula and configuration table, one can adjust reference voltage VREF in a small range: + * | | |VREF = GAIN x VBG. + * | | |GAIN = 1.6, 2.0, 2.5, 3.0(by setting VREFSEL(EADC_CTL[11:10]) = 00, 01, 10, 11 respectively). + * | | |VBG is internal band-gap voltage, typical 1.0V, VBG can be configured by the following: + * | | |0000 = VBG_type. + * | | |0001 = VBG_type + 20 mV. + * | | |0010 = VBG_type + 40 mV. + * | | |0011 = VBG_type + 60 mV. + * | | |0100 = VBG_type + 80 mV. + * | | |0101 = VBG_type + 100 mV. + * | | |0110 = VBG_type + 120 mV. + * | | |0111 = VBG_type + 160 mV. + * | | |1000 = VBG_type - 20 mV. + * | | |1001 = VBG_type - 40 mV. + * | | |1010 = VBG_type - 60 mV. + * | | |1011 = VBG_type - 80 mV. + * | | |1100 = VBG_type - 100 mV. + * | | |1101 = VBG_type - 120 mV. + * | | |1110 = VBG_type - 140 mV. + * | | |1111 = VBG_type - 160 mV. + * | | |Note: VBG_type = 1.0 V. + */ + __I uint32_t DAT[19]; /*!< [0x0000] ADC Data Register 0~18 for Sample Module 0~18 */ + __I uint32_t CURDAT; /*!< [0x004c] ADC PDMA Current Transfer Data Register */ + __IO uint32_t CTL; /*!< [0x0050] ADC Control Register */ + __O uint32_t SWTRG; /*!< [0x0054] ADC Sample Module Software Start Register */ + __IO uint32_t PENDSTS; /*!< [0x0058] ADC Start of Conversion Pending Flag Register */ + __IO uint32_t OVSTS; /*!< [0x005c] ADC Sample Module Start of Conversion Overrun Flag Register */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE0[8]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t SCTL[19]; /*!< [0x0080] ADC Sample Module 0~18 Control Register */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE1[1]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t INTSRC[4]; /*!< [0x00d0] ADC interrupt 0~3 Source Enable Control Register. */ + __IO uint32_t CMP[4]; /*!< [0x00e0] ADC Result Compare Register 0~3 */ + __I uint32_t STATUS0; /*!< [0x00f0] ADC Status Register 0 */ + __I uint32_t STATUS1; /*!< [0x00f4] ADC Status Register 1 */ + __IO uint32_t STATUS2; /*!< [0x00f8] ADC Status Register 2 */ + __I uint32_t STATUS3; /*!< [0x00fc] ADC Status Register 3 */ + __I uint32_t DDAT[4]; /*!< [0x0100] ADC Double Data Register 0~3 for Sample Module 0~3 */ + __IO uint32_t PWRM; /*!< [0x0110] ADC Power Management Register */ + __IO uint32_t CALCTL; /*!< [0x0114] ADC Calibration Control Register */ + __IO uint32_t CALDWRD; /*!< [0x0118] ADC Calibration Load Word Register */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE2[5]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t PDMACTL; /*!< [0x0130] ADC PDMA Control Register */ + __I uint32_t RESERVE5[3]; + __IO uint32_t SELSMP0; /*!< [0x0140] ADC Select Sampling Time Register 0 */ + __IO uint32_t SELSMP1; /*!< [0x0144] ADC Select Sampling Time Register 1 */ + __I uint32_t RESERVE6[2]; + __IO uint32_t REFADJCTL; /*!< [0x0150] ADC Reference Voltage Adjust Control Register */ + +} EADC_T; + +/** + @addtogroup EADC_CONST EADC Bit Field Definition + Constant Definitions for EADC Controller +@{ */ + +#define EADC_DAT_RESULT_Pos (0) /*!< EADC_T::DAT: RESULT Position */ +#define EADC_DAT_RESULT_Msk (0xfffful << EADC_DAT_RESULT_Pos) /*!< EADC_T::DAT: RESULT Mask */ + +#define EADC_DAT_OV_Pos (16) /*!< EADC_T::DAT: OV Position */ +#define EADC_DAT_OV_Msk (0x1ul << EADC_DAT_OV_Pos) /*!< EADC_T::DAT: OV Mask */ + +#define EADC_DAT_VALID_Pos (17) /*!< EADC_T::DAT: VALID Position */ +#define EADC_DAT_VALID_Msk (0x1ul << EADC_DAT_VALID_Pos) /*!< EADC_T::DAT: VALID Mask */ + +#define EADC_DAT0_RESULT_Pos (0) /*!< EADC_T::DAT0: RESULT Position */ +#define EADC_DAT0_RESULT_Msk (0xfffful << EADC_DAT0_RESULT_Pos) /*!< EADC_T::DAT0: RESULT Mask */ + +#define EADC_DAT0_OV_Pos (16) /*!< EADC_T::DAT0: OV Position */ +#define EADC_DAT0_OV_Msk (0x1ul << EADC_DAT0_OV_Pos) /*!< EADC_T::DAT0: OV Mask */ + +#define EADC_DAT0_VALID_Pos (17) /*!< EADC_T::DAT0: VALID Position */ +#define EADC_DAT0_VALID_Msk (0x1ul << EADC_DAT0_VALID_Pos) /*!< EADC_T::DAT0: VALID Mask */ + +#define EADC_DAT1_RESULT_Pos (0) /*!< EADC_T::DAT1: RESULT Position */ +#define EADC_DAT1_RESULT_Msk (0xfffful << EADC_DAT1_RESULT_Pos) /*!< EADC_T::DAT1: RESULT Mask */ + +#define EADC_DAT1_OV_Pos (16) /*!< EADC_T::DAT1: OV Position */ +#define EADC_DAT1_OV_Msk (0x1ul << EADC_DAT1_OV_Pos) /*!< EADC_T::DAT1: OV Mask */ + +#define EADC_DAT1_VALID_Pos (17) /*!< EADC_T::DAT1: VALID Position */ +#define EADC_DAT1_VALID_Msk (0x1ul << EADC_DAT1_VALID_Pos) /*!< EADC_T::DAT1: VALID Mask */ + +#define EADC_DAT2_RESULT_Pos (0) /*!< EADC_T::DAT2: RESULT Position */ +#define EADC_DAT2_RESULT_Msk (0xfffful << EADC_DAT2_RESULT_Pos) /*!< EADC_T::DAT2: RESULT Mask */ + +#define EADC_DAT2_OV_Pos (16) /*!< EADC_T::DAT2: OV Position */ +#define EADC_DAT2_OV_Msk (0x1ul << EADC_DAT2_OV_Pos) /*!< EADC_T::DAT2: OV Mask */ + +#define EADC_DAT2_VALID_Pos (17) /*!< EADC_T::DAT2: VALID Position */ +#define EADC_DAT2_VALID_Msk (0x1ul << EADC_DAT2_VALID_Pos) /*!< EADC_T::DAT2: VALID Mask */ + +#define EADC_DAT3_RESULT_Pos (0) /*!< EADC_T::DAT3: RESULT Position */ +#define EADC_DAT3_RESULT_Msk (0xfffful << EADC_DAT3_RESULT_Pos) /*!< EADC_T::DAT3: RESULT Mask */ + +#define EADC_DAT3_OV_Pos (16) /*!< EADC_T::DAT3: OV Position */ +#define EADC_DAT3_OV_Msk (0x1ul << EADC_DAT3_OV_Pos) /*!< EADC_T::DAT3: OV Mask */ + +#define EADC_DAT3_VALID_Pos (17) /*!< EADC_T::DAT3: VALID Position */ +#define EADC_DAT3_VALID_Msk (0x1ul << EADC_DAT3_VALID_Pos) /*!< EADC_T::DAT3: VALID Mask */ + +#define EADC_DAT4_RESULT_Pos (0) /*!< EADC_T::DAT4: RESULT Position */ +#define EADC_DAT4_RESULT_Msk (0xfffful << EADC_DAT4_RESULT_Pos) /*!< EADC_T::DAT4: RESULT Mask */ + +#define EADC_DAT4_OV_Pos (16) /*!< EADC_T::DAT4: OV Position */ +#define EADC_DAT4_OV_Msk (0x1ul << EADC_DAT4_OV_Pos) /*!< EADC_T::DAT4: OV Mask */ + +#define EADC_DAT4_VALID_Pos (17) /*!< EADC_T::DAT4: VALID Position */ +#define EADC_DAT4_VALID_Msk (0x1ul << EADC_DAT4_VALID_Pos) /*!< EADC_T::DAT4: VALID Mask */ + +#define EADC_DAT5_RESULT_Pos (0) /*!< EADC_T::DAT5: RESULT Position */ +#define EADC_DAT5_RESULT_Msk (0xfffful << EADC_DAT5_RESULT_Pos) /*!< EADC_T::DAT5: RESULT Mask */ + +#define EADC_DAT5_OV_Pos (16) /*!< EADC_T::DAT5: OV Position */ +#define EADC_DAT5_OV_Msk (0x1ul << EADC_DAT5_OV_Pos) /*!< EADC_T::DAT5: OV Mask */ + +#define EADC_DAT5_VALID_Pos (17) /*!< EADC_T::DAT5: VALID Position */ +#define EADC_DAT5_VALID_Msk (0x1ul << EADC_DAT5_VALID_Pos) /*!< EADC_T::DAT5: VALID Mask */ + +#define EADC_DAT6_RESULT_Pos (0) /*!< EADC_T::DAT6: RESULT Position */ +#define EADC_DAT6_RESULT_Msk (0xfffful << EADC_DAT6_RESULT_Pos) /*!< EADC_T::DAT6: RESULT Mask */ + +#define EADC_DAT6_OV_Pos (16) /*!< EADC_T::DAT6: OV Position */ +#define EADC_DAT6_OV_Msk (0x1ul << EADC_DAT6_OV_Pos) /*!< EADC_T::DAT6: OV Mask */ + +#define EADC_DAT6_VALID_Pos (17) /*!< EADC_T::DAT6: VALID Position */ +#define EADC_DAT6_VALID_Msk (0x1ul << EADC_DAT6_VALID_Pos) /*!< EADC_T::DAT6: VALID Mask */ + +#define EADC_DAT7_RESULT_Pos (0) /*!< EADC_T::DAT7: RESULT Position */ +#define EADC_DAT7_RESULT_Msk (0xfffful << EADC_DAT7_RESULT_Pos) /*!< EADC_T::DAT7: RESULT Mask */ + +#define EADC_DAT7_OV_Pos (16) /*!< EADC_T::DAT7: OV Position */ +#define EADC_DAT7_OV_Msk (0x1ul << EADC_DAT7_OV_Pos) /*!< EADC_T::DAT7: OV Mask */ + +#define EADC_DAT7_VALID_Pos (17) /*!< EADC_T::DAT7: VALID Position */ +#define EADC_DAT7_VALID_Msk (0x1ul << EADC_DAT7_VALID_Pos) /*!< EADC_T::DAT7: VALID Mask */ + +#define EADC_DAT8_RESULT_Pos (0) /*!< EADC_T::DAT8: RESULT Position */ +#define EADC_DAT8_RESULT_Msk (0xfffful << EADC_DAT8_RESULT_Pos) /*!< EADC_T::DAT8: RESULT Mask */ + +#define EADC_DAT8_OV_Pos (16) /*!< EADC_T::DAT8: OV Position */ +#define EADC_DAT8_OV_Msk (0x1ul << EADC_DAT8_OV_Pos) /*!< EADC_T::DAT8: OV Mask */ + +#define EADC_DAT8_VALID_Pos (17) /*!< EADC_T::DAT8: VALID Position */ +#define EADC_DAT8_VALID_Msk (0x1ul << EADC_DAT8_VALID_Pos) /*!< EADC_T::DAT8: VALID Mask */ + +#define EADC_CURDAT_CURDAT_Pos (0) /*!< EADC_T::CURDAT: CURDAT Position */ +#define EADC_CURDAT_CURDAT_Msk (0x3fffful << EADC_CURDAT_CURDAT_Pos) /*!< EADC_T::CURDAT: CURDAT Mask */ + +#define EADC_CTL_ADCEN_Pos (0) /*!< EADC_T::CTL: ADCEN Position */ +#define EADC_CTL_ADCEN_Msk (0x1ul << EADC_CTL_ADCEN_Pos) /*!< EADC_T::CTL: ADCEN Mask */ + +#define EADC_CTL_ADCRST_Pos (1) /*!< EADC_T::CTL: ADCRST Position */ +#define EADC_CTL_ADCRST_Msk (0x1ul << EADC_CTL_ADCRST_Pos) /*!< EADC_T::CTL: ADCRST Mask */ + +#define EADC_CTL_ADCIEN0_Pos (2) /*!< EADC_T::CTL: ADCIEN0 Position */ +#define EADC_CTL_ADCIEN0_Msk (0x1ul << EADC_CTL_ADCIEN0_Pos) /*!< EADC_T::CTL: ADCIEN0 Mask */ + +#define EADC_CTL_ADCIEN1_Pos (3) /*!< EADC_T::CTL: ADCIEN1 Position */ +#define EADC_CTL_ADCIEN1_Msk (0x1ul << EADC_CTL_ADCIEN1_Pos) /*!< EADC_T::CTL: ADCIEN1 Mask */ + +#define EADC_CTL_ADCIEN2_Pos (4) /*!< EADC_T::CTL: ADCIEN2 Position */ +#define EADC_CTL_ADCIEN2_Msk (0x1ul << EADC_CTL_ADCIEN2_Pos) /*!< EADC_T::CTL: ADCIEN2 Mask */ + +#define EADC_CTL_ADCIEN3_Pos (5) /*!< EADC_T::CTL: ADCIEN3 Position */ +#define EADC_CTL_ADCIEN3_Msk (0x1ul << EADC_CTL_ADCIEN3_Pos) /*!< EADC_T::CTL: ADCIEN3 Mask */ + +#define EADC_CTL_RES_Pos (6) /*!< EADC_T::CTL: RES Position */ +#define EADC_CTL_RES_Msk (0x3ul << EADC_CTL_RES_Pos) /*!< EADC_T::CTL: RES Mask */ + +#define EADC_CTL_DIFFEN_Pos (8) /*!< EADC_T::CTL: DIFFEN Position */ +#define EADC_CTL_DIFFEN_Msk (0x1ul << EADC_CTL_DIFFEN_Pos) /*!< EADC_T::CTL: DIFFEN Mask */ + +#define EADC_CTL_DMOF_Pos (9) /*!< EADC_T::CTL: DMOF Position */ +#define EADC_CTL_DMOF_Msk (0x1ul << EADC_CTL_DMOF_Pos) /*!< EADC_T::CTL: DMOF Mask */ + +#define EADC_CTL_VREFSEL_Pos (10) /*!< EADC_T::CTL: VREFSEL Position */ +#define EADC_CTL_VREFSEL_Msk (0x3ul << EADC_CTL_VREFSEL_Pos) /*!< EADC_T::CTL: VREFSEL Mask */ + +#define EADC_CTL_SPEED_Pos (12) /*!< EADC_T::CTL: SPEED Position */ +#define EADC_CTL_SPEED_Msk (0x1ul << EADC_CTL_SPEED_Pos) /*!< EADC_T::CTL: SPEED Mask */ + +#define EADC_SWTRG_SWTRG_Pos (0) /*!< EADC_T::SWTRG: SWTRG Position */ +#define EADC_SWTRG_SWTRG_Msk (0x1fful << EADC_SWTRG_SWTRG_Pos) /*!< EADC_T::SWTRG: SWTRG Mask */ + +#define EADC_PENDSTS_STPF_Pos (0) /*!< EADC_T::PENDSTS: STPF Position */ +#define EADC_PENDSTS_STPF_Msk (0x1fful << EADC_PENDSTS_STPF_Pos) /*!< EADC_T::PENDSTS: STPF Mask */ + +#define EADC_OVSTS_SPOVF_Pos (0) /*!< EADC_T::OVSTS: SPOVF Position */ +#define EADC_OVSTS_SPOVF_Msk (0x1fful << EADC_OVSTS_SPOVF_Pos) /*!< EADC_T::OVSTS: SPOVF Mask */ + +#define EADC_SCTL_CHSEL_Pos (0) /*!< EADC_T::SCTL: CHSEL Position */ +#define EADC_SCTL_CHSEL_Msk (0xful << EADC_SCTL_CHSEL_Pos) /*!< EADC_T::SCTL: CHSEL Mask */ + +#define EADC_SCTL_EXTREN_Pos (4) /*!< EADC_T::SCTL: EXTREN Position */ +#define EADC_SCTL_EXTREN_Msk (0x1ul << EADC_SCTL_EXTREN_Pos) /*!< EADC_T::SCTL: EXTREN Mask */ + +#define EADC_SCTL_EXTFEN_Pos (5) /*!< EADC_T::SCTL: EXTFEN Position */ +#define EADC_SCTL_EXTFEN_Msk (0x1ul << EADC_SCTL_EXTFEN_Pos) /*!< EADC_T::SCTL: EXTFEN Mask */ + +#define EADC_SCTL_TRGDLYDIV_Pos (6) /*!< EADC_T::SCTL: TRGDLYDIV Position */ +#define EADC_SCTL_TRGDLYDIV_Msk (0x3ul << EADC_SCTL_TRGDLYDIV_Pos) /*!< EADC_T::SCTL: TRGDLYDIV Mask */ + +#define EADC_SCTL_TRGDLYCNT_Pos (8) /*!< EADC_T::SCTL: TRGDLYCNT Position */ +#define EADC_SCTL_TRGDLYCNT_Msk (0xfful << EADC_SCTL_TRGDLYCNT_Pos) /*!< EADC_T::SCTL: TRGDLYCNT Mask */ + +#define EADC_SCTL_TRGSEL_Pos (16) /*!< EADC_T::SCTL: TRGSEL Position */ +#define EADC_SCTL_TRGSEL_Msk (0x1ful << EADC_SCTL_TRGSEL_Pos) /*!< EADC_T::SCTL: TRGSEL Mask */ + +#define EADC_SCTL_INTPOS_Pos (22) /*!< EADC_T::SCTL: INTPOS Position */ +#define EADC_SCTL_INTPOS_Msk (0x1ul << EADC_SCTL_INTPOS_Pos) /*!< EADC_T::SCTL: INTPOS Mask */ + +#define EADC_SCTL_DBMEN_Pos (23) /*!< EADC_T::SCTL: DBMEN Position */ +#define EADC_SCTL_DBMEN_Msk (0x1ul << EADC_SCTL_DBMEN_Pos) /*!< EADC_T::SCTL: DBMEN Mask */ + +#define EADC_SCTL_EXTSMPT_Pos (24) /*!< EADC_T::SCTL: EXTSMPT Position */ +#define EADC_SCTL_EXTSMPT_Msk (0xfful << EADC_SCTL_EXTSMPT_Pos) /*!< EADC_T::SCTL: EXTSMPT Mask */ + +#define EADC_SCTL0_CHSEL_Pos (0) /*!< EADC_T::SCTL0: CHSEL Position */ +#define EADC_SCTL0_CHSEL_Msk (0xful << EADC_SCTL0_CHSEL_Pos) /*!< EADC_T::SCTL0: CHSEL Mask */ + +#define EADC_SCTL0_EXTREN_Pos (4) /*!< EADC_T::SCTL0: EXTREN Position */ +#define EADC_SCTL0_EXTREN_Msk (0x1ul << EADC_SCTL0_EXTREN_Pos) /*!< EADC_T::SCTL0: EXTREN Mask */ + +#define EADC_SCTL0_EXTFEN_Pos (5) /*!< EADC_T::SCTL0: EXTFEN Position */ +#define EADC_SCTL0_EXTFEN_Msk (0x1ul << EADC_SCTL0_EXTFEN_Pos) /*!< EADC_T::SCTL0: EXTFEN Mask */ + +#define EADC_SCTL0_TRGDLYDIV_Pos (6) /*!< EADC_T::SCTL0: TRGDLYDIV Position */ +#define EADC_SCTL0_TRGDLYDIV_Msk (0x3ul << EADC_SCTL0_TRGDLYDIV_Pos) /*!< EADC_T::SCTL0: TRGDLYDIV Mask */ + +#define EADC_SCTL0_TRGDLYCNT_Pos (8) /*!< EADC_T::SCTL0: TRGDLYCNT Position */ +#define EADC_SCTL0_TRGDLYCNT_Msk (0xfful << EADC_SCTL0_TRGDLYCNT_Pos) /*!< EADC_T::SCTL0: TRGDLYCNT Mask */ + +#define EADC_SCTL0_TRGSEL_Pos (16) /*!< EADC_T::SCTL0: TRGSEL Position */ +#define EADC_SCTL0_TRGSEL_Msk (0x3ful << EADC_SCTL0_TRGSEL_Pos) /*!< EADC_T::SCTL0: TRGSEL Mask */ + +#define EADC_SCTL0_INTPOS_Pos (22) /*!< EADC_T::SCTL0: INTPOS Position */ +#define EADC_SCTL0_INTPOS_Msk (0x1ul << EADC_SCTL0_INTPOS_Pos) /*!< EADC_T::SCTL0: INTPOS Mask */ + +#define EADC_SCTL0_DBMEN_Pos (23) /*!< EADC_T::SCTL0: DBMEN Position */ +#define EADC_SCTL0_DBMEN_Msk (0x1ul << EADC_SCTL0_DBMEN_Pos) /*!< EADC_T::SCTL0: DBMEN Mask */ + +#define EADC_SCTL1_CHSEL_Pos (0) /*!< EADC_T::SCTL1: CHSEL Position */ +#define EADC_SCTL1_CHSEL_Msk (0xful << EADC_SCTL1_CHSEL_Pos) /*!< EADC_T::SCTL1: CHSEL Mask */ + +#define EADC_SCTL1_EXTREN_Pos (4) /*!< EADC_T::SCTL1: EXTREN Position */ +#define EADC_SCTL1_EXTREN_Msk (0x1ul << EADC_SCTL1_EXTREN_Pos) /*!< EADC_T::SCTL1: EXTREN Mask */ + +#define EADC_SCTL1_EXTFEN_Pos (5) /*!< EADC_T::SCTL1: EXTFEN Position */ +#define EADC_SCTL1_EXTFEN_Msk (0x1ul << EADC_SCTL1_EXTFEN_Pos) /*!< EADC_T::SCTL1: EXTFEN Mask */ + +#define EADC_SCTL1_TRGDLYDIV_Pos (6) /*!< EADC_T::SCTL1: TRGDLYDIV Position */ +#define EADC_SCTL1_TRGDLYDIV_Msk (0x3ul << EADC_SCTL1_TRGDLYDIV_Pos) /*!< EADC_T::SCTL1: TRGDLYDIV Mask */ + +#define EADC_SCTL1_TRGDLYCNT_Pos (8) /*!< EADC_T::SCTL1: TRGDLYCNT Position */ +#define EADC_SCTL1_TRGDLYCNT_Msk (0xfful << EADC_SCTL1_TRGDLYCNT_Pos) /*!< EADC_T::SCTL1: TRGDLYCNT Mask */ + +#define EADC_SCTL1_TRGSEL_Pos (16) /*!< EADC_T::SCTL1: TRGSEL Position */ +#define EADC_SCTL1_TRGSEL_Msk (0x3ful << EADC_SCTL1_TRGSEL_Pos) /*!< EADC_T::SCTL1: TRGSEL Mask */ + +#define EADC_SCTL1_INTPOS_Pos (22) /*!< EADC_T::SCTL1: INTPOS Position */ +#define EADC_SCTL1_INTPOS_Msk (0x1ul << EADC_SCTL1_INTPOS_Pos) /*!< EADC_T::SCTL1: INTPOS Mask */ + +#define EADC_SCTL1_DBMEN_Pos (23) /*!< EADC_T::SCTL1: DBMEN Position */ +#define EADC_SCTL1_DBMEN_Msk (0x1ul << EADC_SCTL1_DBMEN_Pos) /*!< EADC_T::SCTL1: DBMEN Mask */ + +#define EADC_SCTL2_CHSEL_Pos (0) /*!< EADC_T::SCTL2: CHSEL Position */ +#define EADC_SCTL2_CHSEL_Msk (0xful << EADC_SCTL2_CHSEL_Pos) /*!< EADC_T::SCTL2: CHSEL Mask */ + +#define EADC_SCTL2_EXTREN_Pos (4) /*!< EADC_T::SCTL2: EXTREN Position */ +#define EADC_SCTL2_EXTREN_Msk (0x1ul << EADC_SCTL2_EXTREN_Pos) /*!< EADC_T::SCTL2: EXTREN Mask */ + +#define EADC_SCTL2_EXTFEN_Pos (5) /*!< EADC_T::SCTL2: EXTFEN Position */ +#define EADC_SCTL2_EXTFEN_Msk (0x1ul << EADC_SCTL2_EXTFEN_Pos) /*!< EADC_T::SCTL2: EXTFEN Mask */ + +#define EADC_SCTL2_TRGDLYDIV_Pos (6) /*!< EADC_T::SCTL2: TRGDLYDIV Position */ +#define EADC_SCTL2_TRGDLYDIV_Msk (0x3ul << EADC_SCTL2_TRGDLYDIV_Pos) /*!< EADC_T::SCTL2: TRGDLYDIV Mask */ + +#define EADC_SCTL2_TRGDLYCNT_Pos (8) /*!< EADC_T::SCTL2: TRGDLYCNT Position */ +#define EADC_SCTL2_TRGDLYCNT_Msk (0xfful << EADC_SCTL2_TRGDLYCNT_Pos) /*!< EADC_T::SCTL2: TRGDLYCNT Mask */ + +#define EADC_SCTL2_TRGSEL_Pos (16) /*!< EADC_T::SCTL2: TRGSEL Position */ +#define EADC_SCTL2_TRGSEL_Msk (0x3ful << EADC_SCTL2_TRGSEL_Pos) /*!< EADC_T::SCTL2: TRGSEL Mask */ + +#define EADC_SCTL2_INTPOS_Pos (22) /*!< EADC_T::SCTL2: INTPOS Position */ +#define EADC_SCTL2_INTPOS_Msk (0x1ul << EADC_SCTL2_INTPOS_Pos) /*!< EADC_T::SCTL2: INTPOS Mask */ + +#define EADC_SCTL2_DBMEN_Pos (23) /*!< EADC_T::SCTL2: DBMEN Position */ +#define EADC_SCTL2_DBMEN_Msk (0x1ul << EADC_SCTL2_DBMEN_Pos) /*!< EADC_T::SCTL2: DBMEN Mask */ + +#define EADC_SCTL3_CHSEL_Pos (0) /*!< EADC_T::SCTL3: CHSEL Position */ +#define EADC_SCTL3_CHSEL_Msk (0xful << EADC_SCTL3_CHSEL_Pos) /*!< EADC_T::SCTL3: CHSEL Mask */ + +#define EADC_SCTL3_EXTREN_Pos (4) /*!< EADC_T::SCTL3: EXTREN Position */ +#define EADC_SCTL3_EXTREN_Msk (0x1ul << EADC_SCTL3_EXTREN_Pos) /*!< EADC_T::SCTL3: EXTREN Mask */ + +#define EADC_SCTL3_EXTFEN_Pos (5) /*!< EADC_T::SCTL3: EXTFEN Position */ +#define EADC_SCTL3_EXTFEN_Msk (0x1ul << EADC_SCTL3_EXTFEN_Pos) /*!< EADC_T::SCTL3: EXTFEN Mask */ + +#define EADC_SCTL3_TRGDLYDIV_Pos (6) /*!< EADC_T::SCTL3: TRGDLYDIV Position */ +#define EADC_SCTL3_TRGDLYDIV_Msk (0x3ul << EADC_SCTL3_TRGDLYDIV_Pos) /*!< EADC_T::SCTL3: TRGDLYDIV Mask */ + +#define EADC_SCTL3_TRGDLYCNT_Pos (8) /*!< EADC_T::SCTL3: TRGDLYCNT Position */ +#define EADC_SCTL3_TRGDLYCNT_Msk (0xfful << EADC_SCTL3_TRGDLYCNT_Pos) /*!< EADC_T::SCTL3: TRGDLYCNT Mask */ + +#define EADC_SCTL3_TRGSEL_Pos (16) /*!< EADC_T::SCTL3: TRGSEL Position */ +#define EADC_SCTL3_TRGSEL_Msk (0x3ful << EADC_SCTL3_TRGSEL_Pos) /*!< EADC_T::SCTL3: TRGSEL Mask */ + +#define EADC_SCTL3_INTPOS_Pos (22) /*!< EADC_T::SCTL3: INTPOS Position */ +#define EADC_SCTL3_INTPOS_Msk (0x1ul << EADC_SCTL3_INTPOS_Pos) /*!< EADC_T::SCTL3: INTPOS Mask */ + +#define EADC_SCTL3_DBMEN_Pos (23) /*!< EADC_T::SCTL3: DBMEN Position */ +#define EADC_SCTL3_DBMEN_Msk (0x1ul << EADC_SCTL3_DBMEN_Pos) /*!< EADC_T::SCTL3: DBMEN Mask */ + +#define EADC_SCTL4_CHSEL_Pos (0) /*!< EADC_T::SCTL4: CHSEL Position */ +#define EADC_SCTL4_CHSEL_Msk (0xful << EADC_SCTL4_CHSEL_Pos) /*!< EADC_T::SCTL4: CHSEL Mask */ + +#define EADC_SCTL4_EXTREN_Pos (4) /*!< EADC_T::SCTL4: EXTREN Position */ +#define EADC_SCTL4_EXTREN_Msk (0x1ul << EADC_SCTL4_EXTREN_Pos) /*!< EADC_T::SCTL4: EXTREN Mask */ + +#define EADC_SCTL4_EXTFEN_Pos (5) /*!< EADC_T::SCTL4: EXTFEN Position */ +#define EADC_SCTL4_EXTFEN_Msk (0x1ul << EADC_SCTL4_EXTFEN_Pos) /*!< EADC_T::SCTL4: EXTFEN Mask */ + +#define EADC_SCTL4_TRGDLYDIV_Pos (6) /*!< EADC_T::SCTL4: TRGDLYDIV Position */ +#define EADC_SCTL4_TRGDLYDIV_Msk (0x3ul << EADC_SCTL4_TRGDLYDIV_Pos) /*!< EADC_T::SCTL4: TRGDLYDIV Mask */ + +#define EADC_SCTL4_TRGDLYCNT_Pos (8) /*!< EADC_T::SCTL4: TRGDLYCNT Position */ +#define EADC_SCTL4_TRGDLYCNT_Msk (0xfful << EADC_SCTL4_TRGDLYCNT_Pos) /*!< EADC_T::SCTL4: TRGDLYCNT Mask */ + +#define EADC_SCTL4_TRGSEL_Pos (16) /*!< EADC_T::SCTL4: TRGSEL Position */ +#define EADC_SCTL4_TRGSEL_Msk (0x3ful << EADC_SCTL4_TRGSEL_Pos) /*!< EADC_T::SCTL4: TRGSEL Mask */ + +#define EADC_SCTL4_INTPOS_Pos (22) /*!< EADC_T::SCTL4: INTPOS Position */ +#define EADC_SCTL4_INTPOS_Msk (0x1ul << EADC_SCTL4_INTPOS_Pos) /*!< EADC_T::SCTL4: INTPOS Mask */ + +#define EADC_SCTL5_CHSEL_Pos (0) /*!< EADC_T::SCTL5: CHSEL Position */ +#define EADC_SCTL5_CHSEL_Msk (0xful << EADC_SCTL5_CHSEL_Pos) /*!< EADC_T::SCTL5: CHSEL Mask */ + +#define EADC_SCTL5_EXTREN_Pos (4) /*!< EADC_T::SCTL5: EXTREN Position */ +#define EADC_SCTL5_EXTREN_Msk (0x1ul << EADC_SCTL5_EXTREN_Pos) /*!< EADC_T::SCTL5: EXTREN Mask */ + +#define EADC_SCTL5_EXTFEN_Pos (5) /*!< EADC_T::SCTL5: EXTFEN Position */ +#define EADC_SCTL5_EXTFEN_Msk (0x1ul << EADC_SCTL5_EXTFEN_Pos) /*!< EADC_T::SCTL5: EXTFEN Mask */ + +#define EADC_SCTL5_TRGDLYDIV_Pos (6) /*!< EADC_T::SCTL5: TRGDLYDIV Position */ +#define EADC_SCTL5_TRGDLYDIV_Msk (0x3ul << EADC_SCTL5_TRGDLYDIV_Pos) /*!< EADC_T::SCTL5: TRGDLYDIV Mask */ + +#define EADC_SCTL5_TRGDLYCNT_Pos (8) /*!< EADC_T::SCTL5: TRGDLYCNT Position */ +#define EADC_SCTL5_TRGDLYCNT_Msk (0xfful << EADC_SCTL5_TRGDLYCNT_Pos) /*!< EADC_T::SCTL5: TRGDLYCNT Mask */ + +#define EADC_SCTL5_TRGSEL_Pos (16) /*!< EADC_T::SCTL5: TRGSEL Position */ +#define EADC_SCTL5_TRGSEL_Msk (0x3ful << EADC_SCTL5_TRGSEL_Pos) /*!< EADC_T::SCTL5: TRGSEL Mask */ + +#define EADC_SCTL5_INTPOS_Pos (22) /*!< EADC_T::SCTL5: INTPOS Position */ +#define EADC_SCTL5_INTPOS_Msk (0x1ul << EADC_SCTL5_INTPOS_Pos) /*!< EADC_T::SCTL5: INTPOS Mask */ + +#define EADC_SCTL6_CHSEL_Pos (0) /*!< EADC_T::SCTL6: CHSEL Position */ +#define EADC_SCTL6_CHSEL_Msk (0xful << EADC_SCTL6_CHSEL_Pos) /*!< EADC_T::SCTL6: CHSEL Mask */ + +#define EADC_SCTL6_EXTREN_Pos (4) /*!< EADC_T::SCTL6: EXTREN Position */ +#define EADC_SCTL6_EXTREN_Msk (0x1ul << EADC_SCTL6_EXTREN_Pos) /*!< EADC_T::SCTL6: EXTREN Mask */ + +#define EADC_SCTL6_EXTFEN_Pos (5) /*!< EADC_T::SCTL6: EXTFEN Position */ +#define EADC_SCTL6_EXTFEN_Msk (0x1ul << EADC_SCTL6_EXTFEN_Pos) /*!< EADC_T::SCTL6: EXTFEN Mask */ + +#define EADC_SCTL6_TRGDLYDIV_Pos (6) /*!< EADC_T::SCTL6: TRGDLYDIV Position */ +#define EADC_SCTL6_TRGDLYDIV_Msk (0x3ul << EADC_SCTL6_TRGDLYDIV_Pos) /*!< EADC_T::SCTL6: TRGDLYDIV Mask */ + +#define EADC_SCTL6_TRGDLYCNT_Pos (8) /*!< EADC_T::SCTL6: TRGDLYCNT Position */ +#define EADC_SCTL6_TRGDLYCNT_Msk (0xfful << EADC_SCTL6_TRGDLYCNT_Pos) /*!< EADC_T::SCTL6: TRGDLYCNT Mask */ + +#define EADC_SCTL6_TRGSEL_Pos (16) /*!< EADC_T::SCTL6: TRGSEL Position */ +#define EADC_SCTL6_TRGSEL_Msk (0x3ful << EADC_SCTL6_TRGSEL_Pos) /*!< EADC_T::SCTL6: TRGSEL Mask */ + +#define EADC_SCTL6_INTPOS_Pos (22) /*!< EADC_T::SCTL6: INTPOS Position */ +#define EADC_SCTL6_INTPOS_Msk (0x1ul << EADC_SCTL6_INTPOS_Pos) /*!< EADC_T::SCTL6: INTPOS Mask */ + +#define EADC_SCTL7_CHSEL_Pos (0) /*!< EADC_T::SCTL7: CHSEL Position */ +#define EADC_SCTL7_CHSEL_Msk (0xful << EADC_SCTL7_CHSEL_Pos) /*!< EADC_T::SCTL7: CHSEL Mask */ + +#define EADC_SCTL7_EXTREN_Pos (4) /*!< EADC_T::SCTL7: EXTREN Position */ +#define EADC_SCTL7_EXTREN_Msk (0x1ul << EADC_SCTL7_EXTREN_Pos) /*!< EADC_T::SCTL7: EXTREN Mask */ + +#define EADC_SCTL7_EXTFEN_Pos (5) /*!< EADC_T::SCTL7: EXTFEN Position */ +#define EADC_SCTL7_EXTFEN_Msk (0x1ul << EADC_SCTL7_EXTFEN_Pos) /*!< EADC_T::SCTL7: EXTFEN Mask */ + +#define EADC_SCTL7_TRGDLYDIV_Pos (6) /*!< EADC_T::SCTL7: TRGDLYDIV Position */ +#define EADC_SCTL7_TRGDLYDIV_Msk (0x3ul << EADC_SCTL7_TRGDLYDIV_Pos) /*!< EADC_T::SCTL7: TRGDLYDIV Mask */ + +#define EADC_SCTL7_TRGDLYCNT_Pos (8) /*!< EADC_T::SCTL7: TRGDLYCNT Position */ +#define EADC_SCTL7_TRGDLYCNT_Msk (0xfful << EADC_SCTL7_TRGDLYCNT_Pos) /*!< EADC_T::SCTL7: TRGDLYCNT Mask */ + +#define EADC_SCTL7_TRGSEL_Pos (16) /*!< EADC_T::SCTL7: TRGSEL Position */ +#define EADC_SCTL7_TRGSEL_Msk (0x3ful << EADC_SCTL7_TRGSEL_Pos) /*!< EADC_T::SCTL7: TRGSEL Mask */ + +#define EADC_SCTL7_INTPOS_Pos (22) /*!< EADC_T::SCTL7: INTPOS Position */ +#define EADC_SCTL7_INTPOS_Msk (0x1ul << EADC_SCTL7_INTPOS_Pos) /*!< EADC_T::SCTL7: INTPOS Mask */ + +#define EADC_INTSRC0_SPLIE0_Pos (0) /*!< EADC_T::INTSRC0: SPLIE0 Position */ +#define EADC_INTSRC0_SPLIE0_Msk (0x1ul << EADC_INTSRC0_SPLIE0_Pos) /*!< EADC_T::INTSRC0: SPLIE0 Mask */ + +#define EADC_INTSRC0_SPLIE1_Pos (1) /*!< EADC_T::INTSRC0: SPLIE1 Position */ +#define EADC_INTSRC0_SPLIE1_Msk (0x1ul << EADC_INTSRC0_SPLIE1_Pos) /*!< EADC_T::INTSRC0: SPLIE1 Mask */ + +#define EADC_INTSRC0_SPLIE2_Pos (2) /*!< EADC_T::INTSRC0: SPLIE2 Position */ +#define EADC_INTSRC0_SPLIE2_Msk (0x1ul << EADC_INTSRC0_SPLIE2_Pos) /*!< EADC_T::INTSRC0: SPLIE2 Mask */ + +#define EADC_INTSRC0_SPLIE3_Pos (3) /*!< EADC_T::INTSRC0: SPLIE3 Position */ +#define EADC_INTSRC0_SPLIE3_Msk (0x1ul << EADC_INTSRC0_SPLIE3_Pos) /*!< EADC_T::INTSRC0: SPLIE3 Mask */ + +#define EADC_INTSRC0_SPLIE4_Pos (4) /*!< EADC_T::INTSRC0: SPLIE4 Position */ +#define EADC_INTSRC0_SPLIE4_Msk (0x1ul << EADC_INTSRC0_SPLIE4_Pos) /*!< EADC_T::INTSRC0: SPLIE4 Mask */ + +#define EADC_INTSRC0_SPLIE5_Pos (5) /*!< EADC_T::INTSRC0: SPLIE5 Position */ +#define EADC_INTSRC0_SPLIE5_Msk (0x1ul << EADC_INTSRC0_SPLIE5_Pos) /*!< EADC_T::INTSRC0: SPLIE5 Mask */ + +#define EADC_INTSRC0_SPLIE6_Pos (6) /*!< EADC_T::INTSRC0: SPLIE6 Position */ +#define EADC_INTSRC0_SPLIE6_Msk (0x1ul << EADC_INTSRC0_SPLIE6_Pos) /*!< EADC_T::INTSRC0: SPLIE6 Mask */ + +#define EADC_INTSRC0_SPLIE7_Pos (7) /*!< EADC_T::INTSRC0: SPLIE7 Position */ +#define EADC_INTSRC0_SPLIE7_Msk (0x1ul << EADC_INTSRC0_SPLIE7_Pos) /*!< EADC_T::INTSRC0: SPLIE7 Mask */ + +#define EADC_INTSRC0_SPLIE8_Pos (8) /*!< EADC_T::INTSRC0: SPLIE8 Position */ +#define EADC_INTSRC0_SPLIE8_Msk (0x1ul << EADC_INTSRC0_SPLIE8_Pos) /*!< EADC_T::INTSRC0: SPLIE8 Mask */ + +#define EADC_INTSRC1_SPLIE0_Pos (0) /*!< EADC_T::INTSRC1: SPLIE0 Position */ +#define EADC_INTSRC1_SPLIE0_Msk (0x1ul << EADC_INTSRC1_SPLIE0_Pos) /*!< EADC_T::INTSRC1: SPLIE0 Mask */ + +#define EADC_INTSRC1_SPLIE1_Pos (1) /*!< EADC_T::INTSRC1: SPLIE1 Position */ +#define EADC_INTSRC1_SPLIE1_Msk (0x1ul << EADC_INTSRC1_SPLIE1_Pos) /*!< EADC_T::INTSRC1: SPLIE1 Mask */ + +#define EADC_INTSRC1_SPLIE2_Pos (2) /*!< EADC_T::INTSRC1: SPLIE2 Position */ +#define EADC_INTSRC1_SPLIE2_Msk (0x1ul << EADC_INTSRC1_SPLIE2_Pos) /*!< EADC_T::INTSRC1: SPLIE2 Mask */ + +#define EADC_INTSRC1_SPLIE3_Pos (3) /*!< EADC_T::INTSRC1: SPLIE3 Position */ +#define EADC_INTSRC1_SPLIE3_Msk (0x1ul << EADC_INTSRC1_SPLIE3_Pos) /*!< EADC_T::INTSRC1: SPLIE3 Mask */ + +#define EADC_INTSRC1_SPLIE4_Pos (4) /*!< EADC_T::INTSRC1: SPLIE4 Position */ +#define EADC_INTSRC1_SPLIE4_Msk (0x1ul << EADC_INTSRC1_SPLIE4_Pos) /*!< EADC_T::INTSRC1: SPLIE4 Mask */ + +#define EADC_INTSRC1_SPLIE5_Pos (5) /*!< EADC_T::INTSRC1: SPLIE5 Position */ +#define EADC_INTSRC1_SPLIE5_Msk (0x1ul << EADC_INTSRC1_SPLIE5_Pos) /*!< EADC_T::INTSRC1: SPLIE5 Mask */ + +#define EADC_INTSRC1_SPLIE6_Pos (6) /*!< EADC_T::INTSRC1: SPLIE6 Position */ +#define EADC_INTSRC1_SPLIE6_Msk (0x1ul << EADC_INTSRC1_SPLIE6_Pos) /*!< EADC_T::INTSRC1: SPLIE6 Mask */ + +#define EADC_INTSRC1_SPLIE7_Pos (7) /*!< EADC_T::INTSRC1: SPLIE7 Position */ +#define EADC_INTSRC1_SPLIE7_Msk (0x1ul << EADC_INTSRC1_SPLIE7_Pos) /*!< EADC_T::INTSRC1: SPLIE7 Mask */ + +#define EADC_INTSRC1_SPLIE8_Pos (8) /*!< EADC_T::INTSRC1: SPLIE8 Position */ +#define EADC_INTSRC1_SPLIE8_Msk (0x1ul << EADC_INTSRC1_SPLIE8_Pos) /*!< EADC_T::INTSRC1: SPLIE8 Mask */ + +#define EADC_INTSRC2_SPLIE0_Pos (0) /*!< EADC_T::INTSRC2: SPLIE0 Position */ +#define EADC_INTSRC2_SPLIE0_Msk (0x1ul << EADC_INTSRC2_SPLIE0_Pos) /*!< EADC_T::INTSRC2: SPLIE0 Mask */ + +#define EADC_INTSRC2_SPLIE1_Pos (1) /*!< EADC_T::INTSRC2: SPLIE1 Position */ +#define EADC_INTSRC2_SPLIE1_Msk (0x1ul << EADC_INTSRC2_SPLIE1_Pos) /*!< EADC_T::INTSRC2: SPLIE1 Mask */ + +#define EADC_INTSRC2_SPLIE2_Pos (2) /*!< EADC_T::INTSRC2: SPLIE2 Position */ +#define EADC_INTSRC2_SPLIE2_Msk (0x1ul << EADC_INTSRC2_SPLIE2_Pos) /*!< EADC_T::INTSRC2: SPLIE2 Mask */ + +#define EADC_INTSRC2_SPLIE3_Pos (3) /*!< EADC_T::INTSRC2: SPLIE3 Position */ +#define EADC_INTSRC2_SPLIE3_Msk (0x1ul << EADC_INTSRC2_SPLIE3_Pos) /*!< EADC_T::INTSRC2: SPLIE3 Mask */ + +#define EADC_INTSRC2_SPLIE4_Pos (4) /*!< EADC_T::INTSRC2: SPLIE4 Position */ +#define EADC_INTSRC2_SPLIE4_Msk (0x1ul << EADC_INTSRC2_SPLIE4_Pos) /*!< EADC_T::INTSRC2: SPLIE4 Mask */ + +#define EADC_INTSRC2_SPLIE5_Pos (5) /*!< EADC_T::INTSRC2: SPLIE5 Position */ +#define EADC_INTSRC2_SPLIE5_Msk (0x1ul << EADC_INTSRC2_SPLIE5_Pos) /*!< EADC_T::INTSRC2: SPLIE5 Mask */ + +#define EADC_INTSRC2_SPLIE6_Pos (6) /*!< EADC_T::INTSRC2: SPLIE6 Position */ +#define EADC_INTSRC2_SPLIE6_Msk (0x1ul << EADC_INTSRC2_SPLIE6_Pos) /*!< EADC_T::INTSRC2: SPLIE6 Mask */ + +#define EADC_INTSRC2_SPLIE7_Pos (7) /*!< EADC_T::INTSRC2: SPLIE7 Position */ +#define EADC_INTSRC2_SPLIE7_Msk (0x1ul << EADC_INTSRC2_SPLIE7_Pos) /*!< EADC_T::INTSRC2: SPLIE7 Mask */ + +#define EADC_INTSRC2_SPLIE8_Pos (8) /*!< EADC_T::INTSRC2: SPLIE8 Position */ +#define EADC_INTSRC2_SPLIE8_Msk (0x1ul << EADC_INTSRC2_SPLIE8_Pos) /*!< EADC_T::INTSRC2: SPLIE8 Mask */ + +#define EADC_INTSRC3_SPLIE0_Pos (0) /*!< EADC_T::INTSRC3: SPLIE0 Position */ +#define EADC_INTSRC3_SPLIE0_Msk (0x1ul << EADC_INTSRC3_SPLIE0_Pos) /*!< EADC_T::INTSRC3: SPLIE0 Mask */ + +#define EADC_INTSRC3_SPLIE1_Pos (1) /*!< EADC_T::INTSRC3: SPLIE1 Position */ +#define EADC_INTSRC3_SPLIE1_Msk (0x1ul << EADC_INTSRC3_SPLIE1_Pos) /*!< EADC_T::INTSRC3: SPLIE1 Mask */ + +#define EADC_INTSRC3_SPLIE2_Pos (2) /*!< EADC_T::INTSRC3: SPLIE2 Position */ +#define EADC_INTSRC3_SPLIE2_Msk (0x1ul << EADC_INTSRC3_SPLIE2_Pos) /*!< EADC_T::INTSRC3: SPLIE2 Mask */ + +#define EADC_INTSRC3_SPLIE3_Pos (3) /*!< EADC_T::INTSRC3: SPLIE3 Position */ +#define EADC_INTSRC3_SPLIE3_Msk (0x1ul << EADC_INTSRC3_SPLIE3_Pos) /*!< EADC_T::INTSRC3: SPLIE3 Mask */ + +#define EADC_INTSRC3_SPLIE4_Pos (4) /*!< EADC_T::INTSRC3: SPLIE4 Position */ +#define EADC_INTSRC3_SPLIE4_Msk (0x1ul << EADC_INTSRC3_SPLIE4_Pos) /*!< EADC_T::INTSRC3: SPLIE4 Mask */ + +#define EADC_INTSRC3_SPLIE5_Pos (5) /*!< EADC_T::INTSRC3: SPLIE5 Position */ +#define EADC_INTSRC3_SPLIE5_Msk (0x1ul << EADC_INTSRC3_SPLIE5_Pos) /*!< EADC_T::INTSRC3: SPLIE5 Mask */ + +#define EADC_INTSRC3_SPLIE6_Pos (6) /*!< EADC_T::INTSRC3: SPLIE6 Position */ +#define EADC_INTSRC3_SPLIE6_Msk (0x1ul << EADC_INTSRC3_SPLIE6_Pos) /*!< EADC_T::INTSRC3: SPLIE6 Mask */ + +#define EADC_INTSRC3_SPLIE7_Pos (7) /*!< EADC_T::INTSRC3: SPLIE7 Position */ +#define EADC_INTSRC3_SPLIE7_Msk (0x1ul << EADC_INTSRC3_SPLIE7_Pos) /*!< EADC_T::INTSRC3: SPLIE7 Mask */ + +#define EADC_INTSRC3_SPLIE8_Pos (8) /*!< EADC_T::INTSRC3: SPLIE8 Position */ +#define EADC_INTSRC3_SPLIE8_Msk (0x1ul << EADC_INTSRC3_SPLIE8_Pos) /*!< EADC_T::INTSRC3: SPLIE8 Mask */ + +#define EADC_CMP_ADCMPEN_Pos (0) /*!< EADC_T::CMP: ADCMPEN Position */ +#define EADC_CMP_ADCMPEN_Msk (0x1ul << EADC_CMP_ADCMPEN_Pos) /*!< EADC_T::CMP: ADCMPEN Mask */ + +#define EADC_CMP_ADCMPIE_Pos (1) /*!< EADC_T::CMP: ADCMPIE Position */ +#define EADC_CMP_ADCMPIE_Msk (0x1ul << EADC_CMP_ADCMPIE_Pos) /*!< EADC_T::CMP: ADCMPIE Mask */ + +#define EADC_CMP_CMPCOND_Pos (2) /*!< EADC_T::CMP: CMPCOND Position */ +#define EADC_CMP_CMPCOND_Msk (0x1ul << EADC_CMP_CMPCOND_Pos) /*!< EADC_T::CMP: CMPCOND Mask */ + +#define EADC_CMP_CMPSPL_Pos (3) /*!< EADC_T::CMP: CMPSPL Position */ +#define EADC_CMP_CMPSPL_Msk (0x1ful << EADC_CMP_CMPSPL_Pos) /*!< EADC_T::CMP: CMPSPL Mask */ + +#define EADC_CMP_CMPMCNT_Pos (8) /*!< EADC_T::CMP: CMPMCNT Position */ +#define EADC_CMP_CMPMCNT_Msk (0xful << EADC_CMP_CMPMCNT_Pos) /*!< EADC_T::CMP: CMPMCNT Mask */ + +#define EADC_CMP_CMPWEN_Pos (15) /*!< EADC_T::CMP: CMPWEN Position */ +#define EADC_CMP_CMPWEN_Msk (0x1ul << EADC_CMP_CMPWEN_Pos) /*!< EADC_T::CMP: CMPWEN Mask */ + +#define EADC_CMP_CMPDAT_Pos (16) /*!< EADC_T::CMP: CMPDAT Position */ +#define EADC_CMP_CMPDAT_Msk (0xffful << EADC_CMP_CMPDAT_Pos) /*!< EADC_T::CMP: CMPDAT Mask */ + +#define EADC_CMP0_ADCMPEN_Pos (0) /*!< EADC_T::CMP0: ADCMPEN Position */ +#define EADC_CMP0_ADCMPEN_Msk (0x1ul << EADC_CMP0_ADCMPEN_Pos) /*!< EADC_T::CMP0: ADCMPEN Mask */ + +#define EADC_CMP0_ADCMPIE_Pos (1) /*!< EADC_T::CMP0: ADCMPIE Position */ +#define EADC_CMP0_ADCMPIE_Msk (0x1ul << EADC_CMP0_ADCMPIE_Pos) /*!< EADC_T::CMP0: ADCMPIE Mask */ + +#define EADC_CMP0_CMPCOND_Pos (2) /*!< EADC_T::CMP0: CMPCOND Position */ +#define EADC_CMP0_CMPCOND_Msk (0x1ul << EADC_CMP0_CMPCOND_Pos) /*!< EADC_T::CMP0: CMPCOND Mask */ + +#define EADC_CMP0_CMPSPL_Pos (3) /*!< EADC_T::CMP0: CMPSPL Position */ +#define EADC_CMP0_CMPSPL_Msk (0xful << EADC_CMP0_CMPSPL_Pos) /*!< EADC_T::CMP0: CMPSPL Mask */ + +#define EADC_CMP0_CMPMCNT_Pos (8) /*!< EADC_T::CMP0: CMPMCNT Position */ +#define EADC_CMP0_CMPMCNT_Msk (0xful << EADC_CMP0_CMPMCNT_Pos) /*!< EADC_T::CMP0: CMPMCNT Mask */ + +#define EADC_CMP0_CMPWEN_Pos (15) /*!< EADC_T::CMP0: CMPWEN Position */ +#define EADC_CMP0_CMPWEN_Msk (0x1ul << EADC_CMP0_CMPWEN_Pos) /*!< EADC_T::CMP0: CMPWEN Mask */ + +#define EADC_CMP0_CMPDAT_Pos (16) /*!< EADC_T::CMP0: CMPDAT Position */ +#define EADC_CMP0_CMPDAT_Msk (0xffful << EADC_CMP0_CMPDAT_Pos) /*!< EADC_T::CMP0: CMPDAT Mask */ + +#define EADC_CMP1_ADCMPEN_Pos (0) /*!< EADC_T::CMP1: ADCMPEN Position */ +#define EADC_CMP1_ADCMPEN_Msk (0x1ul << EADC_CMP1_ADCMPEN_Pos) /*!< EADC_T::CMP1: ADCMPEN Mask */ + +#define EADC_CMP1_ADCMPIE_Pos (1) /*!< EADC_T::CMP1: ADCMPIE Position */ +#define EADC_CMP1_ADCMPIE_Msk (0x1ul << EADC_CMP1_ADCMPIE_Pos) /*!< EADC_T::CMP1: ADCMPIE Mask */ + +#define EADC_CMP1_CMPCOND_Pos (2) /*!< EADC_T::CMP1: CMPCOND Position */ +#define EADC_CMP1_CMPCOND_Msk (0x1ul << EADC_CMP1_CMPCOND_Pos) /*!< EADC_T::CMP1: CMPCOND Mask */ + +#define EADC_CMP1_CMPSPL_Pos (3) /*!< EADC_T::CMP1: CMPSPL Position */ +#define EADC_CMP1_CMPSPL_Msk (0xful << EADC_CMP1_CMPSPL_Pos) /*!< EADC_T::CMP1: CMPSPL Mask */ + +#define EADC_CMP1_CMPMCNT_Pos (8) /*!< EADC_T::CMP1: CMPMCNT Position */ +#define EADC_CMP1_CMPMCNT_Msk (0xful << EADC_CMP1_CMPMCNT_Pos) /*!< EADC_T::CMP1: CMPMCNT Mask */ + +#define EADC_CMP1_CMPWEN_Pos (15) /*!< EADC_T::CMP1: CMPWEN Position */ +#define EADC_CMP1_CMPWEN_Msk (0x1ul << EADC_CMP1_CMPWEN_Pos) /*!< EADC_T::CMP1: CMPWEN Mask */ + +#define EADC_CMP1_CMPDAT_Pos (16) /*!< EADC_T::CMP1: CMPDAT Position */ +#define EADC_CMP1_CMPDAT_Msk (0xffful << EADC_CMP1_CMPDAT_Pos) /*!< EADC_T::CMP1: CMPDAT Mask */ + +#define EADC_CMP2_ADCMPEN_Pos (0) /*!< EADC_T::CMP2: ADCMPEN Position */ +#define EADC_CMP2_ADCMPEN_Msk (0x1ul << EADC_CMP2_ADCMPEN_Pos) /*!< EADC_T::CMP2: ADCMPEN Mask */ + +#define EADC_CMP2_ADCMPIE_Pos (1) /*!< EADC_T::CMP2: ADCMPIE Position */ +#define EADC_CMP2_ADCMPIE_Msk (0x1ul << EADC_CMP2_ADCMPIE_Pos) /*!< EADC_T::CMP2: ADCMPIE Mask */ + +#define EADC_CMP2_CMPCOND_Pos (2) /*!< EADC_T::CMP2: CMPCOND Position */ +#define EADC_CMP2_CMPCOND_Msk (0x1ul << EADC_CMP2_CMPCOND_Pos) /*!< EADC_T::CMP2: CMPCOND Mask */ + +#define EADC_CMP2_CMPSPL_Pos (3) /*!< EADC_T::CMP2: CMPSPL Position */ +#define EADC_CMP2_CMPSPL_Msk (0xful << EADC_CMP2_CMPSPL_Pos) /*!< EADC_T::CMP2: CMPSPL Mask */ + +#define EADC_CMP2_CMPMCNT_Pos (8) /*!< EADC_T::CMP2: CMPMCNT Position */ +#define EADC_CMP2_CMPMCNT_Msk (0xful << EADC_CMP2_CMPMCNT_Pos) /*!< EADC_T::CMP2: CMPMCNT Mask */ + +#define EADC_CMP2_CMPWEN_Pos (15) /*!< EADC_T::CMP2: CMPWEN Position */ +#define EADC_CMP2_CMPWEN_Msk (0x1ul << EADC_CMP2_CMPWEN_Pos) /*!< EADC_T::CMP2: CMPWEN Mask */ + +#define EADC_CMP2_CMPDAT_Pos (16) /*!< EADC_T::CMP2: CMPDAT Position */ +#define EADC_CMP2_CMPDAT_Msk (0xffful << EADC_CMP2_CMPDAT_Pos) /*!< EADC_T::CMP2: CMPDAT Mask */ + +#define EADC_CMP3_ADCMPEN_Pos (0) /*!< EADC_T::CMP3: ADCMPEN Position */ +#define EADC_CMP3_ADCMPEN_Msk (0x1ul << EADC_CMP3_ADCMPEN_Pos) /*!< EADC_T::CMP3: ADCMPEN Mask */ + +#define EADC_CMP3_ADCMPIE_Pos (1) /*!< EADC_T::CMP3: ADCMPIE Position */ +#define EADC_CMP3_ADCMPIE_Msk (0x1ul << EADC_CMP3_ADCMPIE_Pos) /*!< EADC_T::CMP3: ADCMPIE Mask */ + +#define EADC_CMP3_CMPCOND_Pos (2) /*!< EADC_T::CMP3: CMPCOND Position */ +#define EADC_CMP3_CMPCOND_Msk (0x1ul << EADC_CMP3_CMPCOND_Pos) /*!< EADC_T::CMP3: CMPCOND Mask */ + +#define EADC_CMP3_CMPSPL_Pos (3) /*!< EADC_T::CMP3: CMPSPL Position */ +#define EADC_CMP3_CMPSPL_Msk (0xful << EADC_CMP3_CMPSPL_Pos) /*!< EADC_T::CMP3: CMPSPL Mask */ + +#define EADC_CMP3_CMPMCNT_Pos (8) /*!< EADC_T::CMP3: CMPMCNT Position */ +#define EADC_CMP3_CMPMCNT_Msk (0xful << EADC_CMP3_CMPMCNT_Pos) /*!< EADC_T::CMP3: CMPMCNT Mask */ + +#define EADC_CMP3_CMPWEN_Pos (15) /*!< EADC_T::CMP3: CMPWEN Position */ +#define EADC_CMP3_CMPWEN_Msk (0x1ul << EADC_CMP3_CMPWEN_Pos) /*!< EADC_T::CMP3: CMPWEN Mask */ + +#define EADC_CMP3_CMPDAT_Pos (16) /*!< EADC_T::CMP3: CMPDAT Position */ +#define EADC_CMP3_CMPDAT_Msk (0xffful << EADC_CMP3_CMPDAT_Pos) /*!< EADC_T::CMP3: CMPDAT Mask */ + +#define EADC_STATUS0_VALID_Pos (0) /*!< EADC_T::STATUS0: VALID Position */ +#define EADC_STATUS0_VALID_Msk (0x1fful << EADC_STATUS0_VALID_Pos) /*!< EADC_T::STATUS0: VALID Mask */ + +#define EADC_STATUS0_OV_Pos (16) /*!< EADC_T::STATUS0: OV Position */ +#define EADC_STATUS0_OV_Msk (0x1fful << EADC_STATUS0_OV_Pos) /*!< EADC_T::STATUS0: OV Mask */ + +#define EADC_STATUS2_ADIF0_Pos (0) /*!< EADC_T::STATUS2: ADIF0 Position */ +#define EADC_STATUS2_ADIF0_Msk (0x1ul << EADC_STATUS2_ADIF0_Pos) /*!< EADC_T::STATUS2: ADIF0 Mask */ + +#define EADC_STATUS2_ADIF1_Pos (1) /*!< EADC_T::STATUS2: ADIF1 Position */ +#define EADC_STATUS2_ADIF1_Msk (0x1ul << EADC_STATUS2_ADIF1_Pos) /*!< EADC_T::STATUS2: ADIF1 Mask */ + +#define EADC_STATUS2_ADIF2_Pos (2) /*!< EADC_T::STATUS2: ADIF2 Position */ +#define EADC_STATUS2_ADIF2_Msk (0x1ul << EADC_STATUS2_ADIF2_Pos) /*!< EADC_T::STATUS2: ADIF2 Mask */ + +#define EADC_STATUS2_ADIF3_Pos (3) /*!< EADC_T::STATUS2: ADIF3 Position */ +#define EADC_STATUS2_ADIF3_Msk (0x1ul << EADC_STATUS2_ADIF3_Pos) /*!< EADC_T::STATUS2: ADIF3 Mask */ + +#define EADC_STATUS2_ADCMPF0_Pos (4) /*!< EADC_T::STATUS2: ADCMPF0 Position */ +#define EADC_STATUS2_ADCMPF0_Msk (0x1ul << EADC_STATUS2_ADCMPF0_Pos) /*!< EADC_T::STATUS2: ADCMPF0 Mask */ + +#define EADC_STATUS2_ADCMPF1_Pos (5) /*!< EADC_T::STATUS2: ADCMPF1 Position */ +#define EADC_STATUS2_ADCMPF1_Msk (0x1ul << EADC_STATUS2_ADCMPF1_Pos) /*!< EADC_T::STATUS2: ADCMPF1 Mask */ + +#define EADC_STATUS2_ADCMPF2_Pos (6) /*!< EADC_T::STATUS2: ADCMPF2 Position */ +#define EADC_STATUS2_ADCMPF2_Msk (0x1ul << EADC_STATUS2_ADCMPF2_Pos) /*!< EADC_T::STATUS2: ADCMPF2 Mask */ + +#define EADC_STATUS2_ADCMPF3_Pos (7) /*!< EADC_T::STATUS2: ADCMPF3 Position */ +#define EADC_STATUS2_ADCMPF3_Msk (0x1ul << EADC_STATUS2_ADCMPF3_Pos) /*!< EADC_T::STATUS2: ADCMPF3 Mask */ + +#define EADC_STATUS2_ADOVIF0_Pos (8) /*!< EADC_T::STATUS2: ADOVIF0 Position */ +#define EADC_STATUS2_ADOVIF0_Msk (0x1ul << EADC_STATUS2_ADOVIF0_Pos) /*!< EADC_T::STATUS2: ADOVIF0 Mask */ + +#define EADC_STATUS2_ADOVIF1_Pos (9) /*!< EADC_T::STATUS2: ADOVIF1 Position */ +#define EADC_STATUS2_ADOVIF1_Msk (0x1ul << EADC_STATUS2_ADOVIF1_Pos) /*!< EADC_T::STATUS2: ADOVIF1 Mask */ + +#define EADC_STATUS2_ADOVIF2_Pos (10) /*!< EADC_T::STATUS2: ADOVIF2 Position */ +#define EADC_STATUS2_ADOVIF2_Msk (0x1ul << EADC_STATUS2_ADOVIF2_Pos) /*!< EADC_T::STATUS2: ADOVIF2 Mask */ + +#define EADC_STATUS2_ADOVIF3_Pos (11) /*!< EADC_T::STATUS2: ADOVIF3 Position */ +#define EADC_STATUS2_ADOVIF3_Msk (0x1ul << EADC_STATUS2_ADOVIF3_Pos) /*!< EADC_T::STATUS2: ADOVIF3 Mask */ + +#define EADC_STATUS2_ADCMPO0_Pos (12) /*!< EADC_T::STATUS2: ADCMPO0 Position */ +#define EADC_STATUS2_ADCMPO0_Msk (0x1ul << EADC_STATUS2_ADCMPO0_Pos) /*!< EADC_T::STATUS2: ADCMPO0 Mask */ + +#define EADC_STATUS2_ADCMPO1_Pos (13) /*!< EADC_T::STATUS2: ADCMPO1 Position */ +#define EADC_STATUS2_ADCMPO1_Msk (0x1ul << EADC_STATUS2_ADCMPO1_Pos) /*!< EADC_T::STATUS2: ADCMPO1 Mask */ + +#define EADC_STATUS2_ADCMPO2_Pos (14) /*!< EADC_T::STATUS2: ADCMPO2 Position */ +#define EADC_STATUS2_ADCMPO2_Msk (0x1ul << EADC_STATUS2_ADCMPO2_Pos) /*!< EADC_T::STATUS2: ADCMPO2 Mask */ + +#define EADC_STATUS2_ADCMPO3_Pos (15) /*!< EADC_T::STATUS2: ADCMPO3 Position */ +#define EADC_STATUS2_ADCMPO3_Msk (0x1ul << EADC_STATUS2_ADCMPO3_Pos) /*!< EADC_T::STATUS2: ADCMPO3 Mask */ + +#define EADC_STATUS2_CHANNEL_Pos (16) /*!< EADC_T::STATUS2: CHANNEL Position */ +#define EADC_STATUS2_CHANNEL_Msk (0x1ful << EADC_STATUS2_CHANNEL_Pos) /*!< EADC_T::STATUS2: CHANNEL Mask */ + +#define EADC_STATUS2_BUSY_Pos (23) /*!< EADC_T::STATUS2: BUSY Position */ +#define EADC_STATUS2_BUSY_Msk (0x1ul << EADC_STATUS2_BUSY_Pos) /*!< EADC_T::STATUS2: BUSY Mask */ + +#define EADC_STATUS2_ADOVIF_Pos (24) /*!< EADC_T::STATUS2: ADOVIF Position */ +#define EADC_STATUS2_ADOVIF_Msk (0x1ul << EADC_STATUS2_ADOVIF_Pos) /*!< EADC_T::STATUS2: ADOVIF Mask */ + +#define EADC_STATUS2_STOVF_Pos (25) /*!< EADC_T::STATUS2: STOVF Position */ +#define EADC_STATUS2_STOVF_Msk (0x1ul << EADC_STATUS2_STOVF_Pos) /*!< EADC_T::STATUS2: STOVF Mask */ + +#define EADC_STATUS2_AVALID_Pos (26) /*!< EADC_T::STATUS2: AVALID Position */ +#define EADC_STATUS2_AVALID_Msk (0x1ul << EADC_STATUS2_AVALID_Pos) /*!< EADC_T::STATUS2: AVALID Mask */ + +#define EADC_STATUS2_AOV_Pos (27) /*!< EADC_T::STATUS2: AOV Position */ +#define EADC_STATUS2_AOV_Msk (0x1ul << EADC_STATUS2_AOV_Pos) /*!< EADC_T::STATUS2: AOV Mask */ + +#define EADC_STATUS3_CURSPL_Pos (0) /*!< EADC_T::STATUS3: CURSPL Position */ +#define EADC_STATUS3_CURSPL_Msk (0x1ful << EADC_STATUS3_CURSPL_Pos) /*!< EADC_T::STATUS3: CURSPL Mask */ + +#define EADC_DDAT0_RESULT_Pos (0) /*!< EADC_T::DDAT0: RESULT Position */ +#define EADC_DDAT0_RESULT_Msk (0xfffful << EADC_DDAT0_RESULT_Pos) /*!< EADC_T::DDAT0: RESULT Mask */ + +#define EADC_DDAT0_OV_Pos (16) /*!< EADC_T::DDAT0: OV Position */ +#define EADC_DDAT0_OV_Msk (0x1ul << EADC_DDAT0_OV_Pos) /*!< EADC_T::DDAT0: OV Mask */ + +#define EADC_DDAT0_VALID_Pos (17) /*!< EADC_T::DDAT0: VALID Position */ +#define EADC_DDAT0_VALID_Msk (0x1ul << EADC_DDAT0_VALID_Pos) /*!< EADC_T::DDAT0: VALID Mask */ + +#define EADC_DDAT1_RESULT_Pos (0) /*!< EADC_T::DDAT1: RESULT Position */ +#define EADC_DDAT1_RESULT_Msk (0xfffful << EADC_DDAT1_RESULT_Pos) /*!< EADC_T::DDAT1: RESULT Mask */ + +#define EADC_DDAT1_OV_Pos (16) /*!< EADC_T::DDAT1: OV Position */ +#define EADC_DDAT1_OV_Msk (0x1ul << EADC_DDAT1_OV_Pos) /*!< EADC_T::DDAT1: OV Mask */ + +#define EADC_DDAT1_VALID_Pos (17) /*!< EADC_T::DDAT1: VALID Position */ +#define EADC_DDAT1_VALID_Msk (0x1ul << EADC_DDAT1_VALID_Pos) /*!< EADC_T::DDAT1: VALID Mask */ + +#define EADC_DDAT2_RESULT_Pos (0) /*!< EADC_T::DDAT2: RESULT Position */ +#define EADC_DDAT2_RESULT_Msk (0xfffful << EADC_DDAT2_RESULT_Pos) /*!< EADC_T::DDAT2: RESULT Mask */ + +#define EADC_DDAT2_OV_Pos (16) /*!< EADC_T::DDAT2: OV Position */ +#define EADC_DDAT2_OV_Msk (0x1ul << EADC_DDAT2_OV_Pos) /*!< EADC_T::DDAT2: OV Mask */ + +#define EADC_DDAT2_VALID_Pos (17) /*!< EADC_T::DDAT2: VALID Position */ +#define EADC_DDAT2_VALID_Msk (0x1ul << EADC_DDAT2_VALID_Pos) /*!< EADC_T::DDAT2: VALID Mask */ + +#define EADC_DDAT3_RESULT_Pos (0) /*!< EADC_T::DDAT3: RESULT Position */ +#define EADC_DDAT3_RESULT_Msk (0xfffful << EADC_DDAT3_RESULT_Pos) /*!< EADC_T::DDAT3: RESULT Mask */ + +#define EADC_DDAT3_OV_Pos (16) /*!< EADC_T::DDAT3: OV Position */ +#define EADC_DDAT3_OV_Msk (0x1ul << EADC_DDAT3_OV_Pos) /*!< EADC_T::DDAT3: OV Mask */ + +#define EADC_DDAT3_VALID_Pos (17) /*!< EADC_T::DDAT3: VALID Position */ +#define EADC_DDAT3_VALID_Msk (0x1ul << EADC_DDAT3_VALID_Pos) /*!< EADC_T::DDAT3: VALID Mask */ + +#define EADC_PWRM_PWUPRDY_Pos (0) /*!< EADC_T::PWRM: PWUPRDY Position */ +#define EADC_PWRM_PWUPRDY_Msk (0x1ul << EADC_PWRM_PWUPRDY_Pos) /*!< EADC_T::PWRM: PWUPRDY Mask */ + +#define EADC_PWRM_PWUCALEN_Pos (1) /*!< EADC_T::PWRM: PWUCALEN Position */ +#define EADC_PWRM_PWUCALEN_Msk (0x1ul << EADC_PWRM_PWUCALEN_Pos) /*!< EADC_T::PWRM: PWUCALEN Mask */ + +#define EADC_PWRM_PWDMOD_Pos (2) /*!< EADC_T::PWRM: PWDMOD Position */ +#define EADC_PWRM_PWDMOD_Msk (0x3ul << EADC_PWRM_PWDMOD_Pos) /*!< EADC_T::PWRM: PWDMOD Mask */ + +#define EADC_PWRM_IREFSUT_Pos (8) /*!< EADC_T::PWRM: IREFSUT Position */ +#define EADC_PWRM_IREFSUT_Msk (0xffffful << EADC_PWRM_IREFSUT_Pos) /*!< EADC_T::PWRM: IREFSUT Mask */ + +#define EADC_CALCTL_CALSTART_Pos (1) /*!< EADC_T::CALCTL: CALSTART Position */ +#define EADC_CALCTL_CALSTART_Msk (0x1ul << EADC_CALCTL_CALSTART_Pos) /*!< EADC_T::CALCTL: CALSTART Mask */ + +#define EADC_CALCTL_CALDONE_Pos (2) /*!< EADC_T::CALCTL: CALDONE Position */ +#define EADC_CALCTL_CALDONE_Msk (0x1ul << EADC_CALCTL_CALDONE_Pos) /*!< EADC_T::CALCTL: CALDONE Mask */ + +#define EADC_CALCTL_CALSEL_Pos (3) /*!< EADC_T::CALCTL: CALSEL Position */ +#define EADC_CALCTL_CALSEL_Msk (0x1ul << EADC_CALCTL_CALSEL_Pos) /*!< EADC_T::CALCTL: CALSEL Mask */ + +#define EADC_PDMACTL_PDMATEN_Pos (0) /*!< EADC_T::PDMACTL: PDMATEN Position */ +#define EADC_PDMACTL_PDMATEN_Msk (0x1fful << EADC_PDMACTL_PDMATEN_Pos) /*!< EADC_T::PDMACTL: PDMATEN Mask */ + +#define EADC_PDMACTL_PDMABUSY_Pos (31) /*!< EADC_T::PDMACTL: PDMABUSY Position */ +#define EADC_PDMACTL_PDMABUSY_Msk (0x1ul << EADC_PDMACTL_PDMABUSY_Pos) /*!< EADC_T::PDMACTL: PDMABUSY Mask */ + +#define EADC_SELSMP0_SELSMP0_Pos (0) /*!< EADC_T::SELSMP0: SELSMP0 Position */ +#define EADC_SELSMP0_SELSMP0_Msk (0x3ul << EADC_SELSMP0_SELSMP0_Pos) /*!< EADC_T::SELSMP0: SELSMP0 Mask */ + +#define EADC_SELSMP0_SELSMP1_Pos (4) /*!< EADC_T::SELSMP0: SELSMP1 Position */ +#define EADC_SELSMP0_SELSMP1_Msk (0x3ul << EADC_SELSMP0_SELSMP1_Pos) /*!< EADC_T::SELSMP0: SELSMP1 Mask */ + +#define EADC_SELSMP0_SELSMP2_Pos (8) /*!< EADC_T::SELSMP0: SELSMP2 Position */ +#define EADC_SELSMP0_SELSMP2_Msk (0x3ul << EADC_SELSMP0_SELSMP2_Pos) /*!< EADC_T::SELSMP0: SELSMP2 Mask */ + +#define EADC_SELSMP0_SELSMP3_Pos (12) /*!< EADC_T::SELSMP0: SELSMP3 Position */ +#define EADC_SELSMP0_SELSMP3_Msk (0x3ul << EADC_SELSMP0_SELSMP3_Pos) /*!< EADC_T::SELSMP0: SELSMP3 Mask */ + +#define EADC_SELSMP0_SELSMP4_Pos (16) /*!< EADC_T::SELSMP0: SELSMP4 Position */ +#define EADC_SELSMP0_SELSMP4_Msk (0x3ul << EADC_SELSMP0_SELSMP4_Pos) /*!< EADC_T::SELSMP0: SELSMP4 Mask */ + +#define EADC_SELSMP0_SELSMP5_Pos (20) /*!< EADC_T::SELSMP0: SELSMP5 Position */ +#define EADC_SELSMP0_SELSMP5_Msk (0x3ul << EADC_SELSMP0_SELSMP5_Pos) /*!< EADC_T::SELSMP0: SELSMP5 Mask */ + +#define EADC_SELSMP0_SELSMP6_Pos (24) /*!< EADC_T::SELSMP0: SELSMP6 Position */ +#define EADC_SELSMP0_SELSMP6_Msk (0x3ul << EADC_SELSMP0_SELSMP6_Pos) /*!< EADC_T::SELSMP0: SELSMP6 Mask */ + +#define EADC_SELSMP0_SELSMP7_Pos (28) /*!< EADC_T::SELSMP0: SELSMP7 Position */ +#define EADC_SELSMP0_SELSMP7_Msk (0x3ul << EADC_SELSMP0_SELSMP7_Pos) /*!< EADC_T::SELSMP0: SELSMP7 Mask */ + +#define EADC_SELSMP1_SELSMP8_Pos (0) /*!< EADC_T::SELSMP1: SELSMP8 Position */ +#define EADC_SELSMP1_SELSMP8_Msk (0x3ul << EADC_SELSMP1_SELSMP8_Pos) /*!< EADC_T::SELSMP1: SELSMP8 Mask */ + +#define EADC_REFADJCTL_PDREF_Pos (0) /*!< EADC_T::REFADJCTL: PDREF Position */ +#define EADC_REFADJCTL_PDREF_Msk (0x1ul << EADC_REFADJCTL_PDREF_Pos) /*!< EADC_T::REFADJCTL: PDREF Mask */ + +#define EADC_REFADJCTL_REFADJ_Pos (1) /*!< EADC_T::REFADJCTL: REFADJ Position */ +#define EADC_REFADJCTL_REFADJ_Msk (0xful << EADC_REFADJCTL_REFADJ_Pos) /*!< EADC_T::REFADJCTL: REFADJ Mask */ + +/**@}*/ /* EADC_CONST */ +/**@}*/ /* end of EADC register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __EADC_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ebi_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ebi_reg.h new file mode 100644 index 0000000000..f56049f135 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ebi_reg.h @@ -0,0 +1,428 @@ +/**************************************************************************//** + * @file ebi_reg.h + * @brief EBI register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __EBI_REG_H__ +#define __EBI_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup EBI External Bus Interface Controller(EBI) + Memory Mapped Structure for EBI Controller +@{ */ + +typedef struct +{ + + + /** + * @var EBI_T::CTL0 + * Offset: 0x00 External Bus Interface Bank0 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |EN |EBI Enable Bit + * | | |This bit is the functional enable bit for EBI. + * | | |0 = EBI function Disabled. + * | | |1 = EBI function Enabled. + * |[1] |DW16 |EBI Data Width 16-bit Select + * | | |This bit defines if the EBI data width is 8-bit or 16-bit. + * | | |0 = EBI data width is 8-bit. + * | | |1 = EBI data width is 16-bit. + * |[2] |CSPOLINV |Chip Select Pin Polar Inverse + * | | |This bit defines the active level of EBI chip select pin (EBI_nCS). + * | | |0 = Chip select pin (EBI_nCS) is active low. + * | | |1 = Chip select pin (EBI_nCS) is active high. + * |[3] |ADSEPEN |EBI Address/Data Bus Separate Mode Enable Bit + * | | |0 = Address/Data Bus Separate Mode Disabled. + * | | |1 = Address/Data Bus Separate Mode Enabled. + * |[4] |CACCESS |Continuous Data Access Mode + * | | |When continuous access mode enabled, the tASU, tALE and tLHD cycles are bypass for continuous data transfer request. + * | | |0 = Continuous data access mode Disabled. + * | | |1 = Continuous data access mode Enabled. + * |[10:8] |MCLKDIV |External Output Clock Divider + * | | |The frequency of EBI output clock (MCLK) is controlled by MCLKDIV as follow: + * | | |000 = HCLK/1. + * | | |001 = HCLK/2. + * | | |010 = HCLK/4. + * | | |011 = HCLK/8. + * | | |100 = HCLK/16. + * | | |101 = HCLK/32. + * | | |110 = HCLK/64. + * | | |111 = HCLK/128. + * |[18:16] |TALE |Extend Time of ALE + * | | |The EBI_ALE high pulse period (tALE) to latch the address can be controlled by TALE. + * | | |tALE = (TALE+1)*EBI_MCLK. + * | | |Note: This field only available in EBI_CTL0 register. + * |[24] |WBUFEN |EBI Write Buffer Enable Bit + * | | |0 = EBI write buffer Disabled. + * | | |1 = EBI write buffer Enabled. + * | | |Note: This bit only available in EBI_CTL0 register. + * @var EBI_T::TCTL0 + * Offset: 0x04 External Bus Interface Bank0 Timing Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:3] |TACC |EBI Data Access Time + * | | |TACC defines data access time (tACC). + * | | |tACC = (TACC +1) * EBI_MCLK. + * |[10:8] |TAHD |EBI Data Access Hold Time + * | | |TAHD defines data access hold time (tAHD). + * | | |tAHD = (TAHD +1) * EBI_MCLK. + * |[15:12] |W2X |Idle Cycle After Write + * | | |This field defines the number of W2X idle cycle. + * | | |W2X idle cycle = (W2X * EBI_MCLK). + * | | |When write action is finished, W2X idle cycle is inserted and EBI_nCS return to idle state. + * |[22] |RAHDOFF |Access Hold Time Disable Control When Read + * | | |0 = Data Access Hold Time (tAHD) during EBI reading Enabled. + * | | |1 = Data Access Hold Time (tAHD) during EBI reading Disabled. + * |[23] |WAHDOFF |Access Hold Time Disable Control When Write + * | | |0 = Data Access Hold Time (tAHD) during EBI writing Enabled. + * | | |1 = Data Access Hold Time (tAHD) during EBI writing Disabled. + * |[27:24] |R2R |Idle Cycle Between Read-to-read + * | | |This field defines the number of R2R idle cycle. + * | | |R2R idle cycle = (R2R * EBI_MCLK). + * | | |When read action is finished and the next action is going to read, R2R idle cycle is inserted and EBI_nCS return to idle state. + * @var EBI_T::CTL1 + * Offset: 0x10 External Bus Interface Bank1 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |EN |EBI Enable Bit + * | | |This bit is the functional enable bit for EBI. + * | | |0 = EBI function Disabled. + * | | |1 = EBI function Enabled. + * |[1] |DW16 |EBI Data Width 16-bit Select + * | | |This bit defines if the EBI data width is 8-bit or 16-bit. + * | | |0 = EBI data width is 8-bit. + * | | |1 = EBI data width is 16-bit. + * |[2] |CSPOLINV |Chip Select Pin Polar Inverse + * | | |This bit defines the active level of EBI chip select pin (EBI_nCS). + * | | |0 = Chip select pin (EBI_nCS) is active low. + * | | |1 = Chip select pin (EBI_nCS) is active high. + * |[3] |ADSEPEN |EBI Address/Data Bus Separate Mode Enable Bit + * | | |0 = Address/Data Bus Separate Mode Disabled. + * | | |1 = Address/Data Bus Separate Mode Enabled. + * |[4] |CACCESS |Continuous Data Access Mode + * | | |When continuous access mode enabled, the tASU, tALE and tLHD cycles are bypass for continuous data transfer request. + * | | |0 = Continuous data access mode Disabled. + * | | |1 = Continuous data access mode Enabled. + * |[10:8] |MCLKDIV |External Output Clock Divider + * | | |The frequency of EBI output clock (MCLK) is controlled by MCLKDIV as follow: + * | | |000 = HCLK/1. + * | | |001 = HCLK/2. + * | | |010 = HCLK/4. + * | | |011 = HCLK/8. + * | | |100 = HCLK/16. + * | | |101 = HCLK/32. + * | | |110 = HCLK/64. + * | | |111 = HCLK/128. + * |[18:16] |TALE |Extend Time of ALE + * | | |The EBI_ALE high pulse period (tALE) to latch the address can be controlled by TALE. + * | | |tALE = (TALE+1)*EBI_MCLK. + * | | |Note: This field only available in EBI_CTL0 register. + * |[24] |WBUFEN |EBI Write Buffer Enable Bit + * | | |0 = EBI write buffer Disabled. + * | | |1 = EBI write buffer Enabled. + * | | |Note: This bit only available in EBI_CTL0 register. + * @var EBI_T::TCTL1 + * Offset: 0x14 External Bus Interface Bank1 Timing Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:3] |TACC |EBI Data Access Time + * | | |TACC defines data access time (tACC). + * | | |tACC = (TACC +1) * EBI_MCLK. + * |[10:8] |TAHD |EBI Data Access Hold Time + * | | |TAHD defines data access hold time (tAHD). + * | | |tAHD = (TAHD +1) * EBI_MCLK. + * |[15:12] |W2X |Idle Cycle After Write + * | | |This field defines the number of W2X idle cycle. + * | | |W2X idle cycle = (W2X * EBI_MCLK). + * | | |When write action is finished, W2X idle cycle is inserted and EBI_nCS return to idle state. + * |[22] |RAHDOFF |Access Hold Time Disable Control When Read + * | | |0 = Data Access Hold Time (tAHD) during EBI reading Enabled. + * | | |1 = Data Access Hold Time (tAHD) during EBI reading Disabled. + * |[23] |WAHDOFF |Access Hold Time Disable Control When Write + * | | |0 = Data Access Hold Time (tAHD) during EBI writing Enabled. + * | | |1 = Data Access Hold Time (tAHD) during EBI writing Disabled. + * |[27:24] |R2R |Idle Cycle Between Read-to-read + * | | |This field defines the number of R2R idle cycle. + * | | |R2R idle cycle = (R2R * EBI_MCLK). + * | | |When read action is finished and the next action is going to read, R2R idle cycle is inserted and EBI_nCS return to idle state. + * @var EBI_T::CTL2 + * Offset: 0x20 External Bus Interface Bank2 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |EN |EBI Enable Bit + * | | |This bit is the functional enable bit for EBI. + * | | |0 = EBI function Disabled. + * | | |1 = EBI function Enabled. + * |[1] |DW16 |EBI Data Width 16-bit Select + * | | |This bit defines if the EBI data width is 8-bit or 16-bit. + * | | |0 = EBI data width is 8-bit. + * | | |1 = EBI data width is 16-bit. + * |[2] |CSPOLINV |Chip Select Pin Polar Inverse + * | | |This bit defines the active level of EBI chip select pin (EBI_nCS). + * | | |0 = Chip select pin (EBI_nCS) is active low. + * | | |1 = Chip select pin (EBI_nCS) is active high. + * |[3] |ADSEPEN |EBI Address/Data Bus Separate Mode Enable Bit + * | | |0 = Address/Data Bus Separate Mode Disabled. + * | | |1 = Address/Data Bus Separate Mode Enabled. + * |[4] |CACCESS |Continuous Data Access Mode + * | | |When continuous access mode enabled, the tASU, tALE and tLHD cycles are bypass for continuous data transfer request. + * | | |0 = Continuous data access mode Disabled. + * | | |1 = Continuous data access mode Enabled. + * |[10:8] |MCLKDIV |External Output Clock Divider + * | | |The frequency of EBI output clock (MCLK) is controlled by MCLKDIV as follow: + * | | |000 = HCLK/1. + * | | |001 = HCLK/2. + * | | |010 = HCLK/4. + * | | |011 = HCLK/8. + * | | |100 = HCLK/16. + * | | |101 = HCLK/32. + * | | |110 = HCLK/64. + * | | |111 = HCLK/128. + * |[18:16] |TALE |Extend Time of ALE + * | | |The EBI_ALE high pulse period (tALE) to latch the address can be controlled by TALE. + * | | |tALE = (TALE+1)*EBI_MCLK. + * | | |Note: This field only available in EBI_CTL0 register. + * |[24] |WBUFEN |EBI Write Buffer Enable Bit + * | | |0 = EBI write buffer Disabled. + * | | |1 = EBI write buffer Enabled. + * | | |Note: This bit only available in EBI_CTL0 register. + * @var EBI_T::TCTL2 + * Offset: 0x24 External Bus Interface Bank2 Timing Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:3] |TACC |EBI Data Access Time + * | | |TACC defines data access time (tACC). + * | | |tACC = (TACC +1) * EBI_MCLK. + * |[10:8] |TAHD |EBI Data Access Hold Time + * | | |TAHD defines data access hold time (tAHD). + * | | |tAHD = (TAHD +1) * EBI_MCLK. + * |[15:12] |W2X |Idle Cycle After Write + * | | |This field defines the number of W2X idle cycle. + * | | |W2X idle cycle = (W2X * EBI_MCLK). + * | | |When write action is finished, W2X idle cycle is inserted and EBI_nCS return to idle state. + * |[22] |RAHDOFF |Access Hold Time Disable Control When Read + * | | |0 = Data Access Hold Time (tAHD) during EBI reading Enabled. + * | | |1 = Data Access Hold Time (tAHD) during EBI reading Disabled. + * |[23] |WAHDOFF |Access Hold Time Disable Control When Write + * | | |0 = Data Access Hold Time (tAHD) during EBI writing Enabled. + * | | |1 = Data Access Hold Time (tAHD) during EBI writing Disabled. + * |[27:24] |R2R |Idle Cycle Between Read-to-read + * | | |This field defines the number of R2R idle cycle. + * | | |R2R idle cycle = (R2R * EBI_MCLK). + * | | |When read action is finished and the next action is going to read, R2R idle cycle is inserted and EBI_nCS return to idle state. + */ + __IO uint32_t CTL0; /*!< [0x0000] External Bus Interface Bank0 Control Register */ + __IO uint32_t TCTL0; /*!< [0x0004] External Bus Interface Bank0 Timing Control Register */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE0[2]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t CTL1; /*!< [0x0010] External Bus Interface Bank1 Control Register */ + __IO uint32_t TCTL1; /*!< [0x0014] External Bus Interface Bank1 Timing Control Register */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE1[2]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t CTL2; /*!< [0x0020] External Bus Interface Bank2 Control Register */ + __IO uint32_t TCTL2; /*!< [0x0024] External Bus Interface Bank2 Timing Control Register */ + +} EBI_T; + +/** + @addtogroup EBI_CONST EBI Bit Field Definition + Constant Definitions for EBI Controller +@{ */ + +#define EBI_CTL_EN_Pos (0) /*!< EBI_T::CTL: EN Position */ +#define EBI_CTL_EN_Msk (0x1ul << EBI_CTL_EN_Pos) /*!< EBI_T::CTL: EN Mask */ + +#define EBI_CTL_DW16_Pos (1) /*!< EBI_T::CTL: DW16 Position */ +#define EBI_CTL_DW16_Msk (0x1ul << EBI_CTL_DW16_Pos) /*!< EBI_T::CTL: DW16 Mask */ + +#define EBI_CTL_CSPOLINV_Pos (2) /*!< EBI_T::CTL: CSPOLINV Position */ +#define EBI_CTL_CSPOLINV_Msk (0x1ul << EBI_CTL_CSPOLINV_Pos) /*!< EBI_T::CTL: CSPOLINV Mask */ + +#define EBI_CTL_ADSEPEN_Pos (3) /*!< EBI_T::CTL: ADSEPEN Position */ +#define EBI_CTL_ADSEPEN_Msk (0x1ul << EBI_CTL_ADSEPEN_Pos) /*!< EBI_T::CTL: ADSEPEN Mask */ + +#define EBI_CTL_CACCESS_Pos (4) /*!< EBI_T::CTL: CACCESS Position */ +#define EBI_CTL_CACCESS_Msk (0x1ul << EBI_CTL_CACCESS_Pos) /*!< EBI_T::CTL: CACCESS Mask */ + +#define EBI_CTL_MCLKDIV_Pos (8) /*!< EBI_T::CTL: MCLKDIV Position */ +#define EBI_CTL_MCLKDIV_Msk (0x7ul << EBI_CTL_MCLKDIV_Pos) /*!< EBI_T::CTL: MCLKDIV Mask */ + +#define EBI_CTL_TALE_Pos (16) /*!< EBI_T::CTL: TALE Position */ +#define EBI_CTL_TALE_Msk (0x7ul << EBI_CTL_TALE_Pos) /*!< EBI_T::CTL: TALE Mask */ + +#define EBI_CTL_WBUFEN_Pos (24) /*!< EBI_T::CTL: WBUFEN Position */ +#define EBI_CTL_WBUFEN_Msk (0x1ul << EBI_CTL_WBUFEN_Pos) /*!< EBI_T::CTL: WBUFEN Mask */ + +#define EBI_TCTL_TACC_Pos (3) /*!< EBI_T::TCTL: TACC Position */ +#define EBI_TCTL_TACC_Msk (0x1ful << EBI_TCTL_TACC_Pos) /*!< EBI_T::TCTL: TACC Mask */ + +#define EBI_TCTL_TAHD_Pos (8) /*!< EBI_T::TCTL: TAHD Position */ +#define EBI_TCTL_TAHD_Msk (0x7ul << EBI_TCTL_TAHD_Pos) /*!< EBI_T::TCTL: TAHD Mask */ + +#define EBI_TCTL_W2X_Pos (12) /*!< EBI_T::TCTL: W2X Position */ +#define EBI_TCTL_W2X_Msk (0xful << EBI_TCTL_W2X_Pos) /*!< EBI_T::TCTL: W2X Mask */ + +#define EBI_TCTL_RAHDOFF_Pos (22) /*!< EBI_T::TCTL: RAHDOFF Position */ +#define EBI_TCTL_RAHDOFF_Msk (0x1ul << EBI_TCTL_RAHDOFF_Pos) /*!< EBI_T::TCTL: RAHDOFF Mask */ + +#define EBI_TCTL_WAHDOFF_Pos (23) /*!< EBI_T::TCTL: WAHDOFF Position */ +#define EBI_TCTL_WAHDOFF_Msk (0x1ul << EBI_TCTL_WAHDOFF_Pos) /*!< EBI_T::TCTL: WAHDOFF Mask */ + +#define EBI_TCTL_R2R_Pos (24) /*!< EBI_T::TCTL: R2R Position */ +#define EBI_TCTL_R2R_Msk (0xful << EBI_TCTL_R2R_Pos) /*!< EBI_T::TCTL: R2R Mask */ + +#define EBI_CTL0_EN_Pos (0) /*!< EBI_T::CTL0: EN Position */ +#define EBI_CTL0_EN_Msk (0x1ul << EBI_CTL0_EN_Pos) /*!< EBI_T::CTL0: EN Mask */ + +#define EBI_CTL0_DW16_Pos (1) /*!< EBI_T::CTL0: DW16 Position */ +#define EBI_CTL0_DW16_Msk (0x1ul << EBI_CTL0_DW16_Pos) /*!< EBI_T::CTL0: DW16 Mask */ + +#define EBI_CTL0_CSPOLINV_Pos (2) /*!< EBI_T::CTL0: CSPOLINV Position */ +#define EBI_CTL0_CSPOLINV_Msk (0x1ul << EBI_CTL0_CSPOLINV_Pos) /*!< EBI_T::CTL0: CSPOLINV Mask */ + +#define EBI_CTL0_ADSEPEN_Pos (3) /*!< EBI_T::CTL0: ADSEPEN Position */ +#define EBI_CTL0_ADSEPEN_Msk (0x1ul << EBI_CTL0_ADSEPEN_Pos) /*!< EBI_T::CTL0: ADSEPEN Mask */ + +#define EBI_CTL0_CACCESS_Pos (4) /*!< EBI_T::CTL0: CACCESS Position */ +#define EBI_CTL0_CACCESS_Msk (0x1ul << EBI_CTL0_CACCESS_Pos) /*!< EBI_T::CTL0: CACCESS Mask */ + +#define EBI_CTL0_MCLKDIV_Pos (8) /*!< EBI_T::CTL0: MCLKDIV Position */ +#define EBI_CTL0_MCLKDIV_Msk (0x7ul << EBI_CTL0_MCLKDIV_Pos) /*!< EBI_T::CTL0: MCLKDIV Mask */ + +#define EBI_CTL0_TALE_Pos (16) /*!< EBI_T::CTL0: TALE Position */ +#define EBI_CTL0_TALE_Msk (0x7ul << EBI_CTL0_TALE_Pos) /*!< EBI_T::CTL0: TALE Mask */ + +#define EBI_CTL0_WBUFEN_Pos (24) /*!< EBI_T::CTL0: WBUFEN Position */ +#define EBI_CTL0_WBUFEN_Msk (0x1ul << EBI_CTL0_WBUFEN_Pos) /*!< EBI_T::CTL0: WBUFEN Mask */ + +#define EBI_TCTL0_TACC_Pos (3) /*!< EBI_T::TCTL0: TACC Position */ +#define EBI_TCTL0_TACC_Msk (0x1ful << EBI_TCTL0_TACC_Pos) /*!< EBI_T::TCTL0: TACC Mask */ + +#define EBI_TCTL0_TAHD_Pos (8) /*!< EBI_T::TCTL0: TAHD Position */ +#define EBI_TCTL0_TAHD_Msk (0x7ul << EBI_TCTL0_TAHD_Pos) /*!< EBI_T::TCTL0: TAHD Mask */ + +#define EBI_TCTL0_W2X_Pos (12) /*!< EBI_T::TCTL0: W2X Position */ +#define EBI_TCTL0_W2X_Msk (0xful << EBI_TCTL0_W2X_Pos) /*!< EBI_T::TCTL0: W2X Mask */ + +#define EBI_TCTL0_RAHDOFF_Pos (22) /*!< EBI_T::TCTL0: RAHDOFF Position */ +#define EBI_TCTL0_RAHDOFF_Msk (0x1ul << EBI_TCTL0_RAHDOFF_Pos) /*!< EBI_T::TCTL0: RAHDOFF Mask */ + +#define EBI_TCTL0_WAHDOFF_Pos (23) /*!< EBI_T::TCTL0: WAHDOFF Position */ +#define EBI_TCTL0_WAHDOFF_Msk (0x1ul << EBI_TCTL0_WAHDOFF_Pos) /*!< EBI_T::TCTL0: WAHDOFF Mask */ + +#define EBI_TCTL0_R2R_Pos (24) /*!< EBI_T::TCTL0: R2R Position */ +#define EBI_TCTL0_R2R_Msk (0xful << EBI_TCTL0_R2R_Pos) /*!< EBI_T::TCTL0: R2R Mask */ + +#define EBI_CTL1_EN_Pos (0) /*!< EBI_T::CTL1: EN Position */ +#define EBI_CTL1_EN_Msk (0x1ul << EBI_CTL1_EN_Pos) /*!< EBI_T::CTL1: EN Mask */ + +#define EBI_CTL1_DW16_Pos (1) /*!< EBI_T::CTL1: DW16 Position */ +#define EBI_CTL1_DW16_Msk (0x1ul << EBI_CTL1_DW16_Pos) /*!< EBI_T::CTL1: DW16 Mask */ + +#define EBI_CTL1_CSPOLINV_Pos (2) /*!< EBI_T::CTL1: CSPOLINV Position */ +#define EBI_CTL1_CSPOLINV_Msk (0x1ul << EBI_CTL1_CSPOLINV_Pos) /*!< EBI_T::CTL1: CSPOLINV Mask */ + +#define EBI_CTL1_ADSEPEN_Pos (3) /*!< EBI_T::CTL1: ADSEPEN Position */ +#define EBI_CTL1_ADSEPEN_Msk (0x1ul << EBI_CTL1_ADSEPEN_Pos) /*!< EBI_T::CTL1: ADSEPEN Mask */ + +#define EBI_CTL1_CACCESS_Pos (4) /*!< EBI_T::CTL1: CACCESS Position */ +#define EBI_CTL1_CACCESS_Msk (0x1ul << EBI_CTL1_CACCESS_Pos) /*!< EBI_T::CTL1: CACCESS Mask */ + +#define EBI_CTL1_MCLKDIV_Pos (8) /*!< EBI_T::CTL1: MCLKDIV Position */ +#define EBI_CTL1_MCLKDIV_Msk (0x7ul << EBI_CTL1_MCLKDIV_Pos) /*!< EBI_T::CTL1: MCLKDIV Mask */ + +#define EBI_CTL1_TALE_Pos (16) /*!< EBI_T::CTL1: TALE Position */ +#define EBI_CTL1_TALE_Msk (0x7ul << EBI_CTL1_TALE_Pos) /*!< EBI_T::CTL1: TALE Mask */ + +#define EBI_CTL1_WBUFEN_Pos (24) /*!< EBI_T::CTL1: WBUFEN Position */ +#define EBI_CTL1_WBUFEN_Msk (0x1ul << EBI_CTL1_WBUFEN_Pos) /*!< EBI_T::CTL1: WBUFEN Mask */ + +#define EBI_TCTL1_TACC_Pos (3) /*!< EBI_T::TCTL1: TACC Position */ +#define EBI_TCTL1_TACC_Msk (0x1ful << EBI_TCTL1_TACC_Pos) /*!< EBI_T::TCTL1: TACC Mask */ + +#define EBI_TCTL1_TAHD_Pos (8) /*!< EBI_T::TCTL1: TAHD Position */ +#define EBI_TCTL1_TAHD_Msk (0x7ul << EBI_TCTL1_TAHD_Pos) /*!< EBI_T::TCTL1: TAHD Mask */ + +#define EBI_TCTL1_W2X_Pos (12) /*!< EBI_T::TCTL1: W2X Position */ +#define EBI_TCTL1_W2X_Msk (0xful << EBI_TCTL1_W2X_Pos) /*!< EBI_T::TCTL1: W2X Mask */ + +#define EBI_TCTL1_RAHDOFF_Pos (22) /*!< EBI_T::TCTL1: RAHDOFF Position */ +#define EBI_TCTL1_RAHDOFF_Msk (0x1ul << EBI_TCTL1_RAHDOFF_Pos) /*!< EBI_T::TCTL1: RAHDOFF Mask */ + +#define EBI_TCTL1_WAHDOFF_Pos (23) /*!< EBI_T::TCTL1: WAHDOFF Position */ +#define EBI_TCTL1_WAHDOFF_Msk (0x1ul << EBI_TCTL1_WAHDOFF_Pos) /*!< EBI_T::TCTL1: WAHDOFF Mask */ + +#define EBI_TCTL1_R2R_Pos (24) /*!< EBI_T::TCTL1: R2R Position */ +#define EBI_TCTL1_R2R_Msk (0xful << EBI_TCTL1_R2R_Pos) /*!< EBI_T::TCTL1: R2R Mask */ + +#define EBI_CTL2_EN_Pos (0) /*!< EBI_T::CTL2: EN Position */ +#define EBI_CTL2_EN_Msk (0x1ul << EBI_CTL2_EN_Pos) /*!< EBI_T::CTL2: EN Mask */ + +#define EBI_CTL2_DW16_Pos (1) /*!< EBI_T::CTL2: DW16 Position */ +#define EBI_CTL2_DW16_Msk (0x1ul << EBI_CTL2_DW16_Pos) /*!< EBI_T::CTL2: DW16 Mask */ + +#define EBI_CTL2_CSPOLINV_Pos (2) /*!< EBI_T::CTL2: CSPOLINV Position */ +#define EBI_CTL2_CSPOLINV_Msk (0x1ul << EBI_CTL2_CSPOLINV_Pos) /*!< EBI_T::CTL2: CSPOLINV Mask */ + +#define EBI_CTL2_ADSEPEN_Pos (3) /*!< EBI_T::CTL2: ADSEPEN Position */ +#define EBI_CTL2_ADSEPEN_Msk (0x1ul << EBI_CTL2_ADSEPEN_Pos) /*!< EBI_T::CTL2: ADSEPEN Mask */ + +#define EBI_CTL2_CACCESS_Pos (4) /*!< EBI_T::CTL2: CACCESS Position */ +#define EBI_CTL2_CACCESS_Msk (0x1ul << EBI_CTL2_CACCESS_Pos) /*!< EBI_T::CTL2: CACCESS Mask */ + +#define EBI_CTL2_MCLKDIV_Pos (8) /*!< EBI_T::CTL2: MCLKDIV Position */ +#define EBI_CTL2_MCLKDIV_Msk (0x7ul << EBI_CTL2_MCLKDIV_Pos) /*!< EBI_T::CTL2: MCLKDIV Mask */ + +#define EBI_CTL2_TALE_Pos (16) /*!< EBI_T::CTL2: TALE Position */ +#define EBI_CTL2_TALE_Msk (0x7ul << EBI_CTL2_TALE_Pos) /*!< EBI_T::CTL2: TALE Mask */ + +#define EBI_CTL2_WBUFEN_Pos (24) /*!< EBI_T::CTL2: WBUFEN Position */ +#define EBI_CTL2_WBUFEN_Msk (0x1ul << EBI_CTL2_WBUFEN_Pos) /*!< EBI_T::CTL2: WBUFEN Mask */ + +#define EBI_TCTL2_TACC_Pos (3) /*!< EBI_T::TCTL2: TACC Position */ +#define EBI_TCTL2_TACC_Msk (0x1ful << EBI_TCTL2_TACC_Pos) /*!< EBI_T::TCTL2: TACC Mask */ + +#define EBI_TCTL2_TAHD_Pos (8) /*!< EBI_T::TCTL2: TAHD Position */ +#define EBI_TCTL2_TAHD_Msk (0x7ul << EBI_TCTL2_TAHD_Pos) /*!< EBI_T::TCTL2: TAHD Mask */ + +#define EBI_TCTL2_W2X_Pos (12) /*!< EBI_T::TCTL2: W2X Position */ +#define EBI_TCTL2_W2X_Msk (0xful << EBI_TCTL2_W2X_Pos) /*!< EBI_T::TCTL2: W2X Mask */ + +#define EBI_TCTL2_RAHDOFF_Pos (22) /*!< EBI_T::TCTL2: RAHDOFF Position */ +#define EBI_TCTL2_RAHDOFF_Msk (0x1ul << EBI_TCTL2_RAHDOFF_Pos) /*!< EBI_T::TCTL2: RAHDOFF Mask */ + +#define EBI_TCTL2_WAHDOFF_Pos (23) /*!< EBI_T::TCTL2: WAHDOFF Position */ +#define EBI_TCTL2_WAHDOFF_Msk (0x1ul << EBI_TCTL2_WAHDOFF_Pos) /*!< EBI_T::TCTL2: WAHDOFF Mask */ + +#define EBI_TCTL2_R2R_Pos (24) /*!< EBI_T::TCTL2: R2R Position */ +#define EBI_TCTL2_R2R_Msk (0xful << EBI_TCTL2_R2R_Pos) /*!< EBI_T::TCTL2: R2R Mask */ + +/**@}*/ /* EBI_CONST */ +/**@}*/ /* end of EBI register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __EBI_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ecap_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ecap_reg.h new file mode 100644 index 0000000000..6584e6f556 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ecap_reg.h @@ -0,0 +1,389 @@ +/**************************************************************************//** + * @file ecap_reg.h + * @brief ECAP register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __ECAP_REG_H__ +#define __ECAP_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup ECAP Enhanced Input Capture Timer(ECAP) + Memory Mapped Structure for ECAP Controller +@{ */ + +typedef struct +{ + + /** + * @var ECAP_T::CNT + * Offset: 0x00 Input Capture Counter (24-bit up counter) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |CNT |Input Capture Timer/Counter + * | | |The input Capture Timer/Counter is a 24-bit up-counting counter + * | | |The clock source for the counter is from the clock divider + * @var ECAP_T::HLD0 + * Offset: 0x04 Input Capture Hold Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |HOLD |Input Capture Counter Hold Register + * | | |When an active input capture channel detects a valid edge signal change, the ECAPCNT value is latched into the corresponding holding register + * | | |Each input channel has its own holding register named by ECAP_HLDx where x is from 0 to 2 to indicate inputs from IC0 to IC2, respectively. + * @var ECAP_T::HLD1 + * Offset: 0x08 Input Capture Hold Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |HOLD |Input Capture Counter Hold Register + * | | |When an active input capture channel detects a valid edge signal change, the ECAPCNT value is latched into the corresponding holding register + * | | |Each input channel has its own holding register named by ECAP_HLDx where x is from 0 to 2 to indicate inputs from IC0 to IC2, respectively. + * @var ECAP_T::HLD2 + * Offset: 0x0C Input Capture Hold Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |HOLD |Input Capture Counter Hold Register + * | | |When an active input capture channel detects a valid edge signal change, the ECAPCNT value is latched into the corresponding holding register + * | | |Each input channel has its own holding register named by ECAP_HLDx where x is from 0 to 2 to indicate inputs from IC0 to IC2, respectively. + * @var ECAP_T::CNTCMP + * Offset: 0x10 Input Capture Compare Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |CNTCMP |Input Capture Counter Compare Register + * | | |If the compare function is enabled (CMPEN = 1), this register (ECAP_CNTCMP) is used to compare with the capture counter (ECAP_CNT). + * | | |If the reload control is enabled (RLDEN[n] = 1, n=0~3), an overflow event or capture events will trigger the hardware to load the value of this register (ECAP_CNTCMP) into ECAP_CNT. + * @var ECAP_T::CTL0 + * Offset: 0x14 Input Capture Control Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |NFCLKSEL |Noise Filter Clock Pre-divide Selection + * | | |To determine the sampling frequency of the Noise Filter clock + * | | |000 = CAP_CLK. + * | | |001 = CAP_CLK/2. + * | | |010 = CAP_CLK/4. + * | | |011 = CAP_CLK/16. + * | | |100 = CAP_CLK/32. + * | | |101 = CAP_CLK/64. + * |[3] |CAPNFDIS |Input Capture Noise Filter Disable Control + * | | |0 = Noise filter of Input Capture Enabled. + * | | |1 = Noise filter of Input Capture Disabled (Bypass). + * |[4] |IC0EN |Port Pin IC0 Input to Input Capture Unit Enable Control + * | | |0 = IC0 input to Input Capture Unit Disabled. + * | | |1 = IC0 input to Input Capture Unit Enabled. + * |[5] |IC1EN |Port Pin IC1 Input to Input Capture Unit Enable Control + * | | |0 = IC1 input to Input Capture Unit Disabled. + * | | |1 = IC1 input to Input Capture Unit Enabled. + * |[6] |IC2EN |Port Pin IC2 Input to Input Capture Unit Enable Control + * | | |0 = IC2 input to Input Capture Unit Disabled. + * | | |1 = IC2 input to Input Capture Unit Enabled. + * |[9:8] |CAPSEL0 |CAP0 Input Source Selection + * | | |00 = CAP0 input is from port pin ICAP0. + * | | |01 = Reserved. + * | | |10 = CAP0 input is from signal CHA of QEI controller unit n. + * | | |11 = Reserved. + * | | |Note: Input capture unit n matches QEIn, where n = 0~1. + * |[11:10] |CAPSEL1 |CAP1 Input Source Selection + * | | |00 = CAP1 input is from port pin ICAP1. + * | | |01 = Reserved. + * | | |10 = CAP1 input is from signal CHB of QEI controller unit n. + * | | |11 = Reserved. + * | | |Note: Input capture unit n matches QEIn, where n = 0~1. + * |[13:12] |CAPSEL2 |CAP2 Input Source Selection + * | | |00 = CAP2 input is from port pin ICAP2. + * | | |01 = Reserved. + * | | |10 = CAP2 input is from signal CHX of QEI controller unit n. + * | | |11 = Reserved. + * | | |Note: Input capture unit n matches QEIn, where n = 0~1. + * |[16] |CAPIEN0 |Input Capture Channel 0 Interrupt Enable Control + * | | |0 = The flag CAPTF0 can trigger Input Capture interrupt Disabled. + * | | |1 = The flag CAPTF0 can trigger Input Capture interrupt Enabled. + * |[17] |CAPIEN1 |Input Capture Channel 1 Interrupt Enable Control + * | | |0 = The flag CAPTF1 can trigger Input Capture interrupt Disabled. + * | | |1 = The flag CAPTF1 can trigger Input Capture interrupt Enabled. + * |[18] |CAPIEN2 |Input Capture Channel 2 Interrupt Enable Control + * | | |0 = The flag CAPTF2 can trigger Input Capture interrupt Disabled. + * | | |1 = The flag CAPTF2 can trigger Input Capture interrupt Enabled. + * |[20] |OVIEN |CAPOVF Trigger Input Capture Interrupt Enable Control + * | | |0 = The flag CAPOVF can trigger Input Capture interrupt Disabled. + * | | |1 = The flag CAPOVF can trigger Input Capture interrupt Enabled. + * |[21] |CMPIEN |CAPCMPF Trigger Input Capture Interrupt Enable Control + * | | |0 = The flag CAPCMPF can trigger Input Capture interrupt Disabled. + * | | |1 = The flag CAPCMPF can trigger Input Capture interrupt Enabled. + * |[24] |CNTEN |Input Capture Counter Start Counting Control + * | | |Setting this bit to 1, the capture counter (ECAP_CNT) starts up-counting synchronously with the clock from the . + * | | |0 = ECAP_CNT stop counting. + * | | |1 = ECAP_CNT starts up-counting. + * |[25] |CMPCLREN |Input Capture Counter Cleared by Compare-match Control + * | | |If this bit is set to 1, the capture counter (ECAP_CNT) will be cleared to 0 when the compare-match event (CAPCMPF = 1) occurs. + * | | |0 = Compare-match event (CAPCMPF) can clear capture counter (ECAP_CNT) Disabled. + * | | |1 = Compare-match event (CAPCMPF) can clear capture counter (ECAP_CNT) Enabled. + * |[28] |CMPEN |Compare Function Enable Control + * | | |The compare function in input capture timer/counter is to compare the dynamic counting ECAP_CNT with the compare register ECAP_CNTCMP, if ECAP_CNT value reaches ECAP_CNTCMP, the flag CAPCMPF will be set. + * | | |0 = The compare function Disabled. + * | | |1 = The compare function Enabled. + * |[29] |CAPEN |Input Capture Timer/Counter Enable Control + * | | |0 = Input Capture function Disabled. + * | | |1 = Input Capture function Enabled. + * @var ECAP_T::CTL1 + * Offset: 0x18 Input Capture Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |EDGESEL0 |Channel 0 Captured Edge Selection + * | | |Input capture0 can detect falling edge change only, rising edge change only or both edge change + * | | |00 = Detect rising edge only. + * | | |01 = Detect falling edge only. + * | | |1x = Detect both rising and falling edge. + * |[3:2] |EDGESEL1 |Channel 1 Captured Edge Selection + * | | |Input capture1 can detect falling edge change only, rising edge change only or both edge change + * | | |00 = Detect rising edge only. + * | | |01 = Detect falling edge only. + * | | |1x = Detect both rising and falling edge. + * |[5:4] |EDGESEL2 |Channel 2 Captured Edge Selection + * | | |Input capture2 can detect falling edge change only, rising edge change only or both edge changes + * | | |00 = Detect rising edge only. + * | | |01 = Detect falling edge only. + * | | |1x = Detect both rising and falling edge. + * |[8] |CAP0RLDEN |Capture Counter Reload Function Triggered by Event CAPTE0 Enable Bit + * | | |0 = The reload triggered by Event CAPTE0 Disabled. + * | | |1 = The reload triggered by Event CAPTE0 Enabled. + * |[9] |CAP1RLDEN |Capture Counter Reload Function Triggered by Event CAPTE1 Enable Bit + * | | |0 = The reload triggered by Event CAPTE1 Disabled. + * | | |1 = The reload triggered by Event CAPTE1 Enabled. + * |[10] |CAP2RLDEN |Capture Counter Reload Function Triggered by Event CAPTE2 Enable Bit + * | | |0 = The reload triggered by Event CAPTE2 Disabled. + * | | |1 = The reload triggered by Event CAPTE2 Enabled. + * |[11] |OVRLDEN |Capture Counter Reload Function Triggered by Overflow Enable Bit + * | | |0 = The reload triggered by CAPOV Disabled. + * | | |1 = The reload triggered by CAPOV Enabled. + * |[14:12] |CLKSEL |Capture Timer Clock Divide Selection + * | | |The capture timer clock has a pre-divider with eight divided options controlled by CLKSEL[2:0]. + * | | |000 = CAP_CLK/1. + * | | |001 = CAP_CLK/4. + * | | |010 = CAP_CLK/16. + * | | |011 = CAP_CLK/32. + * | | |100 = CAP_CLK/64. + * | | |101 = CAP_CLK/96. + * | | |110 = CAP_CLK/112. + * | | |111 = CAP_CLK/128. + * |[17:16] |CNTSRCSEL |Capture Timer/Counter Clock Source Selection + * | | |Select the capture timer/counter clock source. + * | | |00 = CAP_CLK (default). + * | | |01 = CAP0. + * | | |10 = CAP1. + * | | |11 = CAP2. + * |[20] |CAP0CLREN |Capture Counter Cleared by Capture Event0 Control + * | | |0 = Event CAPTE0 can clear capture counter (ECAP_CNT) Disabled. + * | | |1 = Event CAPTE0 can clear capture counter (ECAP_CNT) Enabled. + * |[21] |CAP1CLREN |Capture Counter Cleared by Capture Event1 Control + * | | |0 = Event CAPTE1 can clear capture counter (ECAP_CNT) Disabled. + * | | |1 = Event CAPTE1 can clear capture counter (ECAP_CNT) Enabled. + * |[22] |CAP2CLREN |Capture Counter Cleared by Capture Event2 Control + * | | |0 = Event CAPTE2 can clear capture counter (ECAP_CNT) Disabled. + * | | |1 = Event CAPTE2 can clear capture counter (ECAP_CNT) Enabled. + * @var ECAP_T::STATUS + * Offset: 0x1C Input Capture Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CAPTF0 |Input Capture Channel 0 Triggered Flag + * | | |When the input capture channel 0 detects a valid edge change at CAP0 input, it will set flag CAPTF0 to high. + * | | |0 = No valid edge change has been detected at CAP0 input since last clear. + * | | |1 = At least a valid edge change has been detected at CAP0 input since last clear. + * | | |Note: This bit is only cleared by writing 1 to it. + * |[1] |CAPTF1 |Input Capture Channel 1 Triggered Flag + * | | |When the input capture channel 1 detects a valid edge change at CAP1 input, it will set flag CAPTF1 to high. + * | | |0 = No valid edge change has been detected at CAP1 input since last clear. + * | | |1 = At least a valid edge change has been detected at CAP1 input since last clear. + * | | |Note: This bit is only cleared by writing 1 to it. + * |[2] |CAPTF2 |Input Capture Channel 2 Triggered Flag + * | | |When the input capture channel 2 detects a valid edge change at CAP2 input, it will set flag CAPTF2 to high. + * | | |0 = No valid edge change has been detected at CAP2 input since last clear. + * | | |1 = At least a valid edge change has been detected at CAP2 input since last clear. + * | | |Note: This bit is only cleared by writing 1 to it. + * |[4] |CAPCMPF |Input Capture Compare-match Flag + * | | |If the input capture compare function is enabled, the flag is set by hardware when capture counter (ECAP_CNT) up counts and reaches the ECAP_CNTCMP value. + * | | |0 = ECAP_CNT has not matched ECAP_CNTCMP value since last clear. + * | | |1 = ECAP_CNT has matched ECAP_CNTCMP value at least once since last clear. + * | | |Note: This bit is only cleared by writing 1 to it. + * |[5] |CAPOVF |Input Capture Counter Overflow Flag + * | | |Flag is set by hardware when counter (ECAP_CNT) overflows from 0x00FF_FFFF to zero. + * | | |0 = No overflow event has occurred since last clear. + * | | |1 = Overflow event(s) has/have occurred since last clear. + * | | |Note: This bit is only cleared by writing 1 to it. + * |[6] |CAP0 |Value of Input Channel 0, CAP0 (Read Only) + * | | |Reflecting the value of input channel 0, CAP0 + * | | |(The bit is read only and write is ignored) + * |[7] |CAP1 |Value of Input Channel 1, CAP1 (Read Only) + * | | |Reflecting the value of input channel 1, CAP1 + * | | |(The bit is read only and write is ignored) + * |[8] |CAP2 |Value of Input Channel 2, CAP2 (Read Only) + * | | |Reflecting the value of input channel 2, CAP2. + * | | |(The bit is read only and write is ignored) + */ + __IO uint32_t CNT; /*!< [0x0000] Input Capture Counter */ + __IO uint32_t HLD0; /*!< [0x0004] Input Capture Hold Register 0 */ + __IO uint32_t HLD1; /*!< [0x0008] Input Capture Hold Register 1 */ + __IO uint32_t HLD2; /*!< [0x000c] Input Capture Hold Register 2 */ + __IO uint32_t CNTCMP; /*!< [0x0010] Input Capture Compare Register */ + __IO uint32_t CTL0; /*!< [0x0014] Input Capture Control Register 0 */ + __IO uint32_t CTL1; /*!< [0x0018] Input Capture Control Register 1 */ + __IO uint32_t STATUS; /*!< [0x001c] Input Capture Status Register */ + +} ECAP_T; + +/** + @addtogroup ECAP_CONST ECAP Bit Field Definition + Constant Definitions for ECAP Controller +@{ */ + +#define ECAP_CNT_CNT_Pos (0) /*!< ECAP_T::CNT: CNT Position */ +#define ECAP_CNT_CNT_Msk (0xfffffful << ECAP_CNT_CNT_Pos) /*!< ECAP_T::CNT: CNT Mask */ + +#define ECAP_HLD0_HOLD_Pos (0) /*!< ECAP_T::HLD0: HOLD Position */ +#define ECAP_HLD0_HOLD_Msk (0xfffffful << ECAP_HLD0_HOLD_Pos) /*!< ECAP_T::HLD0: HOLD Mask */ + +#define ECAP_HLD1_HOLD_Pos (0) /*!< ECAP_T::HLD1: HOLD Position */ +#define ECAP_HLD1_HOLD_Msk (0xfffffful << ECAP_HLD1_HOLD_Pos) /*!< ECAP_T::HLD1: HOLD Mask */ + +#define ECAP_HLD2_HOLD_Pos (0) /*!< ECAP_T::HLD2: HOLD Position */ +#define ECAP_HLD2_HOLD_Msk (0xfffffful << ECAP_HLD2_HOLD_Pos) /*!< ECAP_T::HLD2: HOLD Mask */ + +#define ECAP_CNTCMP_CNTCMP_Pos (0) /*!< ECAP_T::CNTCMP: CNTCMP Position */ +#define ECAP_CNTCMP_CNTCMP_Msk (0xfffffful << ECAP_CNTCMP_CNTCMP_Pos) /*!< ECAP_T::CNTCMP: CNTCMP Mask */ + +#define ECAP_CTL0_NFCLKSEL_Pos (0) /*!< ECAP_T::CTL0: NFCLKSEL Position */ +#define ECAP_CTL0_NFCLKSEL_Msk (0x7ul << ECAP_CTL0_NFCLKSEL_Pos) /*!< ECAP_T::CTL0: NFCLKSEL Mask */ + +#define ECAP_CTL0_CAPNFDIS_Pos (3) /*!< ECAP_T::CTL0: CAPNFDIS Position */ +#define ECAP_CTL0_CAPNFDIS_Msk (0x1ul << ECAP_CTL0_CAPNFDIS_Pos) /*!< ECAP_T::CTL0: CAPNFDIS Mask */ + +#define ECAP_CTL0_IC0EN_Pos (4) /*!< ECAP_T::CTL0: IC0EN Position */ +#define ECAP_CTL0_IC0EN_Msk (0x1ul << ECAP_CTL0_IC0EN_Pos) /*!< ECAP_T::CTL0: IC0EN Mask */ + +#define ECAP_CTL0_IC1EN_Pos (5) /*!< ECAP_T::CTL0: IC1EN Position */ +#define ECAP_CTL0_IC1EN_Msk (0x1ul << ECAP_CTL0_IC1EN_Pos) /*!< ECAP_T::CTL0: IC1EN Mask */ + +#define ECAP_CTL0_IC2EN_Pos (6) /*!< ECAP_T::CTL0: IC2EN Position */ +#define ECAP_CTL0_IC2EN_Msk (0x1ul << ECAP_CTL0_IC2EN_Pos) /*!< ECAP_T::CTL0: IC2EN Mask */ + +#define ECAP_CTL0_CAPSEL0_Pos (8) /*!< ECAP_T::CTL0: CAPSEL0 Position */ +#define ECAP_CTL0_CAPSEL0_Msk (0x3ul << ECAP_CTL0_CAPSEL0_Pos) /*!< ECAP_T::CTL0: CAPSEL0 Mask */ + +#define ECAP_CTL0_CAPSEL1_Pos (10) /*!< ECAP_T::CTL0: CAPSEL1 Position */ +#define ECAP_CTL0_CAPSEL1_Msk (0x3ul << ECAP_CTL0_CAPSEL1_Pos) /*!< ECAP_T::CTL0: CAPSEL1 Mask */ + +#define ECAP_CTL0_CAPSEL2_Pos (12) /*!< ECAP_T::CTL0: CAPSEL2 Position */ +#define ECAP_CTL0_CAPSEL2_Msk (0x3ul << ECAP_CTL0_CAPSEL2_Pos) /*!< ECAP_T::CTL0: CAPSEL2 Mask */ + +#define ECAP_CTL0_CAPIEN0_Pos (16) /*!< ECAP_T::CTL0: CAPIEN0 Position */ +#define ECAP_CTL0_CAPIEN0_Msk (0x1ul << ECAP_CTL0_CAPIEN0_Pos) /*!< ECAP_T::CTL0: CAPIEN0 Mask */ + +#define ECAP_CTL0_CAPIEN1_Pos (17) /*!< ECAP_T::CTL0: CAPIEN1 Position */ +#define ECAP_CTL0_CAPIEN1_Msk (0x1ul << ECAP_CTL0_CAPIEN1_Pos) /*!< ECAP_T::CTL0: CAPIEN1 Mask */ + +#define ECAP_CTL0_CAPIEN2_Pos (18) /*!< ECAP_T::CTL0: CAPIEN2 Position */ +#define ECAP_CTL0_CAPIEN2_Msk (0x1ul << ECAP_CTL0_CAPIEN2_Pos) /*!< ECAP_T::CTL0: CAPIEN2 Mask */ + +#define ECAP_CTL0_OVIEN_Pos (20) /*!< ECAP_T::CTL0: OVIEN Position */ +#define ECAP_CTL0_OVIEN_Msk (0x1ul << ECAP_CTL0_OVIEN_Pos) /*!< ECAP_T::CTL0: OVIEN Mask */ + +#define ECAP_CTL0_CMPIEN_Pos (21) /*!< ECAP_T::CTL0: CMPIEN Position */ +#define ECAP_CTL0_CMPIEN_Msk (0x1ul << ECAP_CTL0_CMPIEN_Pos) /*!< ECAP_T::CTL0: CMPIEN Mask */ + +#define ECAP_CTL0_CNTEN_Pos (24) /*!< ECAP_T::CTL0: CNTEN Position */ +#define ECAP_CTL0_CNTEN_Msk (0x1ul << ECAP_CTL0_CNTEN_Pos) /*!< ECAP_T::CTL0: CNTEN Mask */ + +#define ECAP_CTL0_CMPCLREN_Pos (25) /*!< ECAP_T::CTL0: CMPCLREN Position */ +#define ECAP_CTL0_CMPCLREN_Msk (0x1ul << ECAP_CTL0_CMPCLREN_Pos) /*!< ECAP_T::CTL0: CMPCLREN Mask */ + +#define ECAP_CTL0_CMPEN_Pos (28) /*!< ECAP_T::CTL0: CMPEN Position */ +#define ECAP_CTL0_CMPEN_Msk (0x1ul << ECAP_CTL0_CMPEN_Pos) /*!< ECAP_T::CTL0: CMPEN Mask */ + +#define ECAP_CTL0_CAPEN_Pos (29) /*!< ECAP_T::CTL0: CAPEN Position */ +#define ECAP_CTL0_CAPEN_Msk (0x1ul << ECAP_CTL0_CAPEN_Pos) /*!< ECAP_T::CTL0: CAPEN Mask */ + +#define ECAP_CTL1_EDGESEL0_Pos (0) /*!< ECAP_T::CTL1: EDGESEL0 Position */ +#define ECAP_CTL1_EDGESEL0_Msk (0x3ul << ECAP_CTL1_EDGESEL0_Pos) /*!< ECAP_T::CTL1: EDGESEL0 Mask */ + +#define ECAP_CTL1_EDGESEL1_Pos (2) /*!< ECAP_T::CTL1: EDGESEL1 Position */ +#define ECAP_CTL1_EDGESEL1_Msk (0x3ul << ECAP_CTL1_EDGESEL1_Pos) /*!< ECAP_T::CTL1: EDGESEL1 Mask */ + +#define ECAP_CTL1_EDGESEL2_Pos (4) /*!< ECAP_T::CTL1: EDGESEL2 Position */ +#define ECAP_CTL1_EDGESEL2_Msk (0x3ul << ECAP_CTL1_EDGESEL2_Pos) /*!< ECAP_T::CTL1: EDGESEL2 Mask */ + +#define ECAP_CTL1_CAP0RLDEN_Pos (8) /*!< ECAP_T::CTL1: CAP0RLDEN Position */ +#define ECAP_CTL1_CAP0RLDEN_Msk (0x1ul << ECAP_CTL1_CAP0RLDEN_Pos) /*!< ECAP_T::CTL1: CAP0RLDEN Mask */ + +#define ECAP_CTL1_CAP1RLDEN_Pos (9) /*!< ECAP_T::CTL1: CAP1RLDEN Position */ +#define ECAP_CTL1_CAP1RLDEN_Msk (0x1ul << ECAP_CTL1_CAP1RLDEN_Pos) /*!< ECAP_T::CTL1: CAP1RLDEN Mask */ + +#define ECAP_CTL1_CAP2RLDEN_Pos (10) /*!< ECAP_T::CTL1: CAP2RLDEN Position */ +#define ECAP_CTL1_CAP2RLDEN_Msk (0x1ul << ECAP_CTL1_CAP2RLDEN_Pos) /*!< ECAP_T::CTL1: CAP2RLDEN Mask */ + +#define ECAP_CTL1_OVRLDEN_Pos (11) /*!< ECAP_T::CTL1: OVRLDEN Position */ +#define ECAP_CTL1_OVRLDEN_Msk (0x1ul << ECAP_CTL1_OVRLDEN_Pos) /*!< ECAP_T::CTL1: OVRLDEN Mask */ + +#define ECAP_CTL1_CLKSEL_Pos (12) /*!< ECAP_T::CTL1: CLKSEL Position */ +#define ECAP_CTL1_CLKSEL_Msk (0x7ul << ECAP_CTL1_CLKSEL_Pos) /*!< ECAP_T::CTL1: CLKSEL Mask */ + +#define ECAP_CTL1_CNTSRCSEL_Pos (16) /*!< ECAP_T::CTL1: CNTSRCSEL Position */ +#define ECAP_CTL1_CNTSRCSEL_Msk (0x3ul << ECAP_CTL1_CNTSRCSEL_Pos) /*!< ECAP_T::CTL1: CNTSRCSEL Mask */ + +#define ECAP_CTL1_CAP0CLREN_Pos (20) /*!< ECAP_T::CTL1: CAP0CLREN Position */ +#define ECAP_CTL1_CAP0CLREN_Msk (0x1ul << ECAP_CTL1_CAP0CLREN_Pos) /*!< ECAP_T::CTL1: CAP0CLREN Mask */ + +#define ECAP_CTL1_CAP1CLREN_Pos (21) /*!< ECAP_T::CTL1: CAP1CLREN Position */ +#define ECAP_CTL1_CAP1CLREN_Msk (0x1ul << ECAP_CTL1_CAP1CLREN_Pos) /*!< ECAP_T::CTL1: CAP1CLREN Mask */ + +#define ECAP_CTL1_CAP2CLREN_Pos (22) /*!< ECAP_T::CTL1: CAP2CLREN Position */ +#define ECAP_CTL1_CAP2CLREN_Msk (0x1ul << ECAP_CTL1_CAP2CLREN_Pos) /*!< ECAP_T::CTL1: CAP2CLREN Mask */ + +#define ECAP_STATUS_CAPTF0_Pos (0) /*!< ECAP_T::STATUS: CAPTF0 Position */ +#define ECAP_STATUS_CAPTF0_Msk (0x1ul << ECAP_STATUS_CAPTF0_Pos) /*!< ECAP_T::STATUS: CAPTF0 Mask */ + +#define ECAP_STATUS_CAPTF1_Pos (1) /*!< ECAP_T::STATUS: CAPTF1 Position */ +#define ECAP_STATUS_CAPTF1_Msk (0x1ul << ECAP_STATUS_CAPTF1_Pos) /*!< ECAP_T::STATUS: CAPTF1 Mask */ + +#define ECAP_STATUS_CAPTF2_Pos (2) /*!< ECAP_T::STATUS: CAPTF2 Position */ +#define ECAP_STATUS_CAPTF2_Msk (0x1ul << ECAP_STATUS_CAPTF2_Pos) /*!< ECAP_T::STATUS: CAPTF2 Mask */ + +#define ECAP_STATUS_CAPCMPF_Pos (4) /*!< ECAP_T::STATUS: CAPCMPF Position */ +#define ECAP_STATUS_CAPCMPF_Msk (0x1ul << ECAP_STATUS_CAPCMPF_Pos) /*!< ECAP_T::STATUS: CAPCMPF Mask */ + +#define ECAP_STATUS_CAPOVF_Pos (5) /*!< ECAP_T::STATUS: CAPOVF Position */ +#define ECAP_STATUS_CAPOVF_Msk (0x1ul << ECAP_STATUS_CAPOVF_Pos) /*!< ECAP_T::STATUS: CAPOVF Mask */ + +#define ECAP_STATUS_CAP0_Pos (8) /*!< ECAP_T::STATUS: CAP0 Position */ +#define ECAP_STATUS_CAP0_Msk (0x1ul << ECAP_STATUS_CAP0_Pos) /*!< ECAP_T::STATUS: CAP0 Mask */ + +#define ECAP_STATUS_CAP1_Pos (9) /*!< ECAP_T::STATUS: CAP1 Position */ +#define ECAP_STATUS_CAP1_Msk (0x1ul << ECAP_STATUS_CAP1_Pos) /*!< ECAP_T::STATUS: CAP1 Mask */ + +#define ECAP_STATUS_CAP2_Pos (10) /*!< ECAP_T::STATUS: CAP2 Position */ +#define ECAP_STATUS_CAP2_Msk (0x1ul << ECAP_STATUS_CAP2_Pos) /*!< ECAP_T::STATUS: CAP2 Mask */ + +/**@}*/ /* ECAP_CONST */ +/**@}*/ /* end of ECAP register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __ECAP_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/epwm_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/epwm_reg.h new file mode 100644 index 0000000000..7f6d087900 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/epwm_reg.h @@ -0,0 +1,4978 @@ +/**************************************************************************//** + * @file epwm_reg.h + * @brief EPWM register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __EPWM_REG_H__ +#define __EPWM_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/*---------------------- Enhanced PWM Generator -------------------------*/ +/** + @addtogroup EPWM Enhanced PWM Generator(EPWM) + Memory Mapped Structure for EPWM Controller +@{ */ + +typedef struct +{ + /** + * @var ECAPDAT_T::RCAPDAT + * Offset: 0x20C EPWM Rising Capture Data Register 0~5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RCAPDAT |EPWM Rising Capture Data (Read Only) + * | | |When rising capture condition happened, the EPWM counter value will be saved in this register. + * @var ECAPDAT_T::FCAPDAT + * Offset: 0x210 EPWM Falling Capture Data Register 0~5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FCAPDAT |EPWM Falling Capture Data (Read Only) + * | | |When falling capture condition happened, the EPWM counter value will be saved in this register. + */ + __IO uint32_t RCAPDAT; /*!< [0x20C/0x214/0x21C/0x224/0x22C/0x234] EPWM Rising Capture Data Register 0~5 */ + __IO uint32_t FCAPDAT; /*!< [0x210/0x218/0x220/0x228/0x230/0x238] EPWM Falling Capture Data Register 0~5 */ +} ECAPDAT_T; + +typedef struct +{ + + + /** + * @var EPWM_T::CTL0 + * Offset: 0x00 EPWM Control Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CTRLD0 |Center Re-load + * | | |In up-down counter type, PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the center point of a period + * |[1] |CTRLD1 |Center Re-load + * | | |In up-down counter type, PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the center point of a period + * |[2] |CTRLD2 |Center Re-load + * | | |In up-down counter type, PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the center point of a period + * |[3] |CTRLD3 |Center Re-load + * | | |In up-down counter type, PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the center point of a period + * |[4] |CTRLD4 |Center Re-load + * | | |In up-down counter type, PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the center point of a period + * |[5] |CTRLD5 |Center Re-load + * | | |In up-down counter type, PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the center point of a period + * |[8] |WINLDEN0 |Window Load Enable Bits + * | | |0 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point or center point of each period by setting CTRLD bit. + * | | |1 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point of each period when valid reload window is set + * | | |The valid reload window is set by software write 1 to EPWM_LOAD register and cleared by hardware after load success. + * |[9] |WINLDEN1 |Window Load Enable Bits + * | | |0 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point or center point of each period by setting CTRLD bit. + * | | |1 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point of each period when valid reload window is set + * | | |The valid reload window is set by software write 1 to EPWM_LOAD register and cleared by hardware after load success. + * |[10] |WINLDEN2 |Window Load Enable Bits + * | | |0 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point or center point of each period by setting CTRLD bit. + * | | |1 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point of each period when valid reload window is set + * | | |The valid reload window is set by software write 1 to EPWM_LOAD register and cleared by hardware after load success. + * |[11] |WINLDEN3 |Window Load Enable Bits + * | | |0 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point or center point of each period by setting CTRLD bit. + * | | |1 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point of each period when valid reload window is set + * | | |The valid reload window is set by software write 1 to EPWM_LOAD register and cleared by hardware after load success. + * |[12] |WINLDEN4 |Window Load Enable Bits + * | | |0 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point or center point of each period by setting CTRLD bit. + * | | |1 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point of each period when valid reload window is set + * | | |The valid reload window is set by software write 1 to EPWM_LOAD register and cleared by hardware after load success. + * |[13] |WINLDEN5 |Window Load Enable Bits + * | | |0 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point or center point of each period by setting CTRLD bit. + * | | |1 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point of each period when valid reload window is set + * | | |The valid reload window is set by software write 1 to EPWM_LOAD register and cleared by hardware after load success. + * |[16] |IMMLDEN0 |Immediately Load Enable Bits + * | | |0 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point or center point of each period by setting CTRLD bit. + * | | |1 = PERIOD/CMPDAT will load to PBUF and CMPBUF immediately when software update PERIOD/CMPDAT. + * | | |Note: If IMMLDENn is enabled, WINLDENn and CTRLDn will be invalid. + * |[17] |IMMLDEN1 |Immediately Load Enable Bits + * | | |0 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point or center point of each period by setting CTRLD bit. + * | | |1 = PERIOD/CMPDAT will load to PBUF and CMPBUF immediately when software update PERIOD/CMPDAT. + * | | |Note: If IMMLDENn is enabled, WINLDENn and CTRLDn will be invalid. + * |[18] |IMMLDEN2 |Immediately Load Enable Bits + * | | |0 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point or center point of each period by setting CTRLD bit. + * | | |1 = PERIOD/CMPDAT will load to PBUF and CMPBUF immediately when software update PERIOD/CMPDAT. + * | | |Note: If IMMLDENn is enabled, WINLDENn and CTRLDn will be invalid. + * |[19] |IMMLDEN3 |Immediately Load Enable Bits + * | | |0 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point or center point of each period by setting CTRLD bit. + * | | |1 = PERIOD/CMPDAT will load to PBUF and CMPBUF immediately when software update PERIOD/CMPDAT. + * | | |Note: If IMMLDENn is enabled, WINLDENn and CTRLDn will be invalid. + * |[20] |IMMLDEN4 |Immediately Load Enable Bits + * | | |0 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point or center point of each period by setting CTRLD bit. + * | | |1 = PERIOD/CMPDAT will load to PBUF and CMPBUF immediately when software update PERIOD/CMPDAT. + * | | |Note: If IMMLDENn is enabled, WINLDENn and CTRLDn will be invalid. + * |[21] |IMMLDEN5 |Immediately Load Enable Bits + * | | |0 = PERIOD will load to PBUF at the end point of each period + * | | |CMPDAT will load to CMPBUF at the end point or center point of each period by setting CTRLD bit. + * | | |1 = PERIOD/CMPDAT will load to PBUF and CMPBUF immediately when software update PERIOD/CMPDAT. + * | | |Note: If IMMLDENn is enabled, WINLDENn and CTRLDn will be invalid. + * |[24] |GROUPEN |Group Function Enable Bit + * | | |0 = The output waveform of each EPWM channel are independent. + * | | |1 = Unify the EPWM_CH2 and EPWM_CH4 to output the same waveform as EPWM_CH0 and unify the EPWM_CH3 and EPWM_CH5 to output the same waveform as EPWM_CH1. + * |[30] |DBGHALT |ICE Debug Mode Counter Halt (Write Protect) + * | | |If counter halt is enabled, all EPWM counters will keep current value until exit ICE debug mode. + * | | |0 = ICE debug mode counter halt Disabled. + * | | |1 = ICE debug mode counter halt Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[31] |DBGTRIOFF |ICE Debug Mode Acknowledge Disable Bit (Write Protect) + * | | |0 = ICE debug mode acknowledgement effects EPWM output. + * | | |EPWM pin will be forced as tri-state while ICE debug mode acknowledged. + * | | |1 = ICE debug mode acknowledgement disabled. + * | | |EPWM pin will keep output no matter ICE debug mode acknowledged or not. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * @var EPWM_T::CTL1 + * Offset: 0x04 EPWM Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |CNTTYPE0 |EPWM Counter Behavior Type + * | | |00 = Up counter type (supported in capture mode). + * | | |01 = Down count type (supported in capture mode). + * | | |10 = Up-down counter type. + * | | |11 = Reserved. + * |[3:2] |CNTTYPE1 |EPWM Counter Behavior Type + * | | |00 = Up counter type (supported in capture mode). + * | | |01 = Down count type (supported in capture mode). + * | | |10 = Up-down counter type. + * | | |11 = Reserved. + * |[5:4] |CNTTYPE2 |EPWM Counter Behavior Type + * | | |00 = Up counter type (supported in capture mode). + * | | |01 = Down count type (supported in capture mode). + * | | |10 = Up-down counter type. + * | | |11 = Reserved. + * |[7:6] |CNTTYPE3 |EPWM Counter Behavior Type + * | | |00 = Up counter type (supported in capture mode). + * | | |01 = Down count type (supported in capture mode). + * | | |10 = Up-down counter type. + * | | |11 = Reserved. + * |[9:8] |CNTTYPE4 |EPWM Counter Behavior Type + * | | |00 = Up counter type (supported in capture mode). + * | | |01 = Down count type (supported in capture mode). + * | | |10 = Up-down counter type. + * | | |11 = Reserved. + * |[11:10] |CNTTYPE5 |EPWM Counter Behavior Type + * | | |00 = Up counter type (supported in capture mode). + * | | |01 = Down count type (supported in capture mode). + * | | |10 = Up-down counter type. + * | | |11 = Reserved. + * |[16] |CNTMODE0 |EPWM Counter Mode + * | | |0 = Auto-reload mode. + * | | |1 = One-shot mode. + * |[17] |CNTMODE1 |EPWM Counter Mode + * | | |0 = Auto-reload mode. + * | | |1 = One-shot mode. + * |[18] |CNTMODE2 |EPWM Counter Mode + * | | |0 = Auto-reload mode. + * | | |1 = One-shot mode. + * |[19] |CNTMODE3 |EPWM Counter Mode + * | | |0 = Auto-reload mode. + * | | |1 = One-shot mode. + * |[20] |CNTMODE4 |EPWM Counter Mode + * | | |0 = Auto-reload mode. + * | | |1 = One-shot mode. + * |[21] |CNTMODE5 |EPWM Counter Mode + * | | |0 = Auto-reload mode. + * | | |1 = One-shot mode. + * |[24] |OUTMODE0 |EPWM Output Mode + * | | |Each bit n controls the output mode of corresponding EPWM channel n. + * | | |0 = EPWM independent mode. + * | | |1 = EPWM complementary mode. + * | | |Note: When operating in group function, these bits must all set to the same mode. + * |[25] |OUTMODE2 |EPWM Output Mode + * | | |Each bit n controls the output mode of corresponding EPWM channel n. + * | | |0 = EPWM independent mode. + * | | |1 = EPWM complementary mode. + * | | |Note: When operating in group function, these bits must all set to the same mode. + * |[26] |OUTMODE4 |EPWM Output Mode + * | | |Each bit n controls the output mode of corresponding EPWM channel n. + * | | |0 = EPWM independent mode. + * | | |1 = EPWM complementary mode. + * | | |Note: When operating in group function, these bits must all set to the same mode. + * @var EPWM_T::SYNC + * Offset: 0x08 EPWM Synchronization Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PHSEN0 |SYNC Phase Enable Bits + * | | |0 = EPWM counter disabled to load PHS value. + * | | |1 = EPWM counter enabled to load PHS value. + * |[1] |PHSEN2 |SYNC Phase Enable Bits + * | | |0 = EPWM counter disabled to load PHS value. + * | | |1 = EPWM counter enabled to load PHS value. + * |[2] |PHSEN4 |SYNC Phase Enable Bits + * | | |0 = EPWM counter disabled to load PHS value. + * | | |1 = EPWM counter enabled to load PHS value. + * |[9:8] |SINSRC0 |EPWM0_SYNC_IN Source Selection + * | | |00 = Synchronize source from SYNC_IN or SWSYNC. + * | | |01 = Counter equal to 0. + * | | |10 = Counter equal to EPWM_CMPDATm, m denotes 1, 3, 5. + * | | |11 = SYNC_OUT will not be generated. + * |[11:10] |SINSRC2 |EPWM0_SYNC_IN Source Selection + * | | |00 = Synchronize source from SYNC_IN or SWSYNC. + * | | |01 = Counter equal to 0. + * | | |10 = Counter equal to EPWM_CMPDATm, m denotes 1, 3, 5. + * | | |11 = SYNC_OUT will not be generated. + * |[13:12] |SINSRC4 |EPWM0_SYNC_IN Source Selection + * | | |00 = Synchronize source from SYNC_IN or SWSYNC. + * | | |01 = Counter equal to 0. + * | | |10 = Counter equal to EPWM_CMPDATm, m denotes 1, 3, 5. + * | | |11 = SYNC_OUT will not be generated. + * |[16] |SNFLTEN |EPWM0_SYNC_IN Noise Filter Enable Bits + * | | |0 = Noise filter of input pin EPWM0_SYNC_IN Disabled. + * | | |1 = Noise filter of input pin EPWM0_SYNC_IN Enabled. + * |[19:17] |SFLTCSEL |SYNC Edge Detector Filter Clock Selection + * | | |000 = Filter clock = HCLK. + * | | |001 = Filter clock = HCLK/2. + * | | |010 = Filter clock = HCLK/4. + * | | |011 = Filter clock = HCLK/8. + * | | |100 = Filter clock = HCLK/16. + * | | |101 = Filter clock = HCLK/32. + * | | |110 = Filter clock = HCLK/64. + * | | |111 = Filter clock = HCLK/128. + * |[22:20] |SFLTCNT |SYNC Edge Detector Filter Count + * | | |The register bits control the counter number of edge detector. + * |[23] |SINPINV |SYNC Input Pin Inverse + * | | |0 = The state of pin SYNC is passed to the negative edge detector. + * | | |1 = The inversed state of pin SYNC is passed to the negative edge detector. + * |[24] |PHSDIR0 |EPWM Phase Direction Control + * | | |0 = Control EPWM counter count decrement after synchronizing. + * | | |1 = Control EPWM counter count increment after synchronizing. + * |[25] |PHSDIR2 |EPWM Phase Direction Control + * | | |0 = Control EPWM counter count decrement after synchronizing. + * | | |1 = Control EPWM counter count increment after synchronizing. + * |[26] |PHSDIR4 |EPWM Phase Direction Control + * | | |0 = Control EPWM counter count decrement after synchronizing. + * | | |1 = Control EPWM counter count increment after synchronizing. + * @var EPWM_T::SWSYNC + * Offset: 0x0C EPWM Software Control Synchronization Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SWSYNC0 |Software SYNC Function + * | | |When SINSRCn (EPWM_SYNC[13:8]) is selected to 0, SYNC_OUT source comes from SYNC_IN or this bit. + * |[1] |SWSYNC2 |Software SYNC Function + * | | |When SINSRCn (EPWM_SYNC[13:8]) is selected to 0, SYNC_OUT source comes from SYNC_IN or this bit. + * |[2] |SWSYNC4 |Software SYNC Function + * | | |When SINSRCn (EPWM_SYNC[13:8]) is selected to 0, SYNC_OUT source comes from SYNC_IN or this bit. + * @var EPWM_T::CLKSRC + * Offset: 0x10 EPWM Clock Source Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |ECLKSRC0 |EPWM_CH01 External Clock Source Select + * | | |0000 = EPWMx_CLK, x denotes 0, 1 or 2. + * | | |0001 = TIMER0 overflow. + * | | |0010 = TIMER1 overflow. + * | | |0011 = TIMER2 overflow. + * | | |0100 = TIMER3 overflow. + * | | |0101 = TIMER4 overflow. + * | | |0110 = TIMER5 overflow. + * | | |0111 = TIMER6 overflow. + * | | |1000 = TIMER7 overflow. + * | | |1001 = TIMER8 overflow. + * | | |1010 = TIMER9 overflow. + * | | |1011 = TIMER10 overflow. + * | | |1100 = TIMER11 overflow. + * | | |Others = Reserved. + * |[11:8] |ECLKSRC2 |EPWM_CH23 External Clock Source Select + * | | |0000 = EPWMx_CLK, x denotes 0, 1 or 2. + * | | |0001 = TIMER0 overflow. + * | | |0010 = TIMER1 overflow. + * | | |0011 = TIMER2 overflow. + * | | |0100 = TIMER3 overflow. + * | | |0101 = TIMER4 overflow. + * | | |0110 = TIMER5 overflow. + * | | |0111 = TIMER6 overflow. + * | | |1000 = TIMER7 overflow. + * | | |1001 = TIMER8 overflow. + * | | |1010 = TIMER9 overflow. + * | | |1011 = TIMER10 overflow. + * | | |1100 = TIMER11 overflow. + * | | |Others = Reserved. + * |[19:16] |ECLKSRC4 |EPWM_CH45 External Clock Source Select + * | | |0000 = EPWMx_CLK, x denotes 0, 1 or 2. + * | | |0001 = TIMER0 overflow. + * | | |0010 = TIMER1 overflow. + * | | |0011 = TIMER2 overflow. + * | | |0100 = TIMER3 overflow. + * | | |0101 = TIMER4 overflow. + * | | |0110 = TIMER5 overflow. + * | | |0111 = TIMER6 overflow. + * | | |1000 = TIMER7 overflow. + * | | |1001 = TIMER8 overflow. + * | | |1010 = TIMER9 overflow. + * | | |1011 = TIMER10 overflow. + * | | |1100 = TIMER11 overflow. + * | | |Others = Reserved. + * @var EPWM_T::CLKPSC0_1 + * Offset: 0x14 EPWM Clock Prescale Register 0/1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |CLKPSC |EPWM Counter Clock Prescale + * | | |The clock of EPWM counter is decided by clock prescaler + * | | |Each EPWM pair share one EPWM counter clock prescaler + * | | |The clock of EPWM counter is divided by (CLKPSC+ 1) + * @var EPWM_T::CLKPSC2_3 + * Offset: 0x18 EPWM Clock Prescale Register 2/3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |CLKPSC |EPWM Counter Clock Prescale + * | | |The clock of EPWM counter is decided by clock prescaler + * | | |Each EPWM pair share one EPWM counter clock prescaler + * | | |The clock of EPWM counter is divided by (CLKPSC+ 1) + * @var EPWM_T::CLKPSC4_5 + * Offset: 0x1C EPWM Clock Prescale Register 4/5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |CLKPSC |EPWM Counter Clock Prescale + * | | |The clock of EPWM counter is decided by clock prescaler + * | | |Each EPWM pair share one EPWM counter clock prescaler + * | | |The clock of EPWM counter is divided by (CLKPSC+ 1) + * @var EPWM_T::CNTEN + * Offset: 0x20 EPWM Counter Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CNTEN0 |EPWM Counter Enable Bits + * | | |0 = EPWM Counter and clock prescaler stop running. + * | | |1 = EPWM Counter and clock prescaler start running. + * |[1] |CNTEN1 |EPWM Counter Enable Bits + * | | |0 = EPWM Counter and clock prescaler stop running. + * | | |1 = EPWM Counter and clock prescaler start running. + * |[2] |CNTEN2 |EPWM Counter Enable Bits + * | | |0 = EPWM Counter and clock prescaler stop running. + * | | |1 = EPWM Counter and clock prescaler start running. + * |[3] |CNTEN3 |EPWM Counter Enable Bits + * | | |0 = EPWM Counter and clock prescaler stop running. + * | | |1 = EPWM Counter and clock prescaler start running. + * |[4] |CNTEN4 |EPWM Counter Enable Bits + * | | |0 = EPWM Counter and clock prescaler stop running. + * | | |1 = EPWM Counter and clock prescaler start running. + * |[5] |CNTEN5 |EPWM Counter Enable Bits + * | | |0 = EPWM Counter and clock prescaler stop running. + * | | |1 = EPWM Counter and clock prescaler start running. + * @var EPWM_T::CNTCLR + * Offset: 0x24 EPWM Clear Counter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CNTCLR0 |Clear EPWM Counter Control Bit + * | | |It is automatically cleared by hardware. Each bit n controls the corresponding EPWM channel n. + * | | |0 = No effect. + * | | |1 = Clear 16-bit EPWM counter to 0000H. + * |[1] |CNTCLR1 |Clear EPWM Counter Control Bit + * | | |It is automatically cleared by hardware. Each bit n controls the corresponding EPWM channel n. + * | | |0 = No effect. + * | | |1 = Clear 16-bit EPWM counter to 0000H. + * |[2] |CNTCLR2 |Clear EPWM Counter Control Bit + * | | |It is automatically cleared by hardware. Each bit n controls the corresponding EPWM channel n. + * | | |0 = No effect. + * | | |1 = Clear 16-bit EPWM counter to 0000H. + * |[3] |CNTCLR3 |Clear EPWM Counter Control Bit + * | | |It is automatically cleared by hardware. Each bit n controls the corresponding EPWM channel n. + * | | |0 = No effect. + * | | |1 = Clear 16-bit EPWM counter to 0000H. + * |[4] |CNTCLR4 |Clear EPWM Counter Control Bit + * | | |It is automatically cleared by hardware. Each bit n controls the corresponding EPWM channel n. + * | | |0 = No effect. + * | | |1 = Clear 16-bit EPWM counter to 0000H. + * |[5] |CNTCLR5 |Clear EPWM Counter Control Bit + * | | |It is automatically cleared by hardware. Each bit n controls the corresponding EPWM channel n. + * | | |0 = No effect. + * | | |1 = Clear 16-bit EPWM counter to 0000H. + * @var EPWM_T::LOAD + * Offset: 0x28 EPWM Load Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |LOAD0 |Re-load EPWM Comparator Register Control Bit + * | | |This bit is software write, hardware clear when current EPWM period ended. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Set load window of window loading mode. + * | | |Read Operation: + * | | |0 = No load window is set. + * | | |1 = Load window is set. + * | | |Note: This bit is only used in window loading mode, WINLDENn(EPWM_CTL0[13:8]) = 1. + * |[1] |LOAD1 |Re-load EPWM Comparator Register Control Bit + * | | |This bit is software write, hardware clear when current EPWM period ended. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Set load window of window loading mode. + * | | |Read Operation: + * | | |0 = No load window is set. + * | | |1 = Load window is set. + * | | |Note: This bit is only used in window loading mode, WINLDENn(EPWM_CTL0[13:8]) = 1. + * |[2] |LOAD2 |Re-load EPWM Comparator Register Control Bit + * | | |This bit is software write, hardware clear when current EPWM period ended. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Set load window of window loading mode. + * | | |Read Operation: + * | | |0 = No load window is set. + * | | |1 = Load window is set. + * | | |Note: This bit is only used in window loading mode, WINLDENn(EPWM_CTL0[13:8]) = 1. + * |[3] |LOAD3 |Re-load EPWM Comparator Register Control Bit + * | | |This bit is software write, hardware clear when current EPWM period ended. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Set load window of window loading mode. + * | | |Read Operation: + * | | |0 = No load window is set. + * | | |1 = Load window is set. + * | | |Note: This bit is only used in window loading mode, WINLDENn(EPWM_CTL0[13:8]) = 1. + * |[4] |LOAD4 |Re-load EPWM Comparator Register Control Bit + * | | |This bit is software write, hardware clear when current EPWM period ended. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Set load window of window loading mode. + * | | |Read Operation: + * | | |0 = No load window is set. + * | | |1 = Load window is set. + * | | |Note: This bit is only used in window loading mode, WINLDENn(EPWM_CTL0[13:8]) = 1. + * |[5] |LOAD5 |Re-load EPWM Comparator Register Control Bit + * | | |This bit is software write, hardware clear when current EPWM period ended. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Set load window of window loading mode. + * | | |Read Operation: + * | | |0 = No load window is set. + * | | |1 = Load window is set. + * | | |Note: This bit is only used in window loading mode, WINLDENn(EPWM_CTL0[13:8]) = 1. + * @var EPWM_T::PERIOD0 + * Offset: 0x30 EPWM Period Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PERIOD |EPWM Period Register + * | | |Up-Count mode: + * | | |In this mode, EPWM counter counts from 0 to PERIOD, and restarts from 0. + * | | |EPWM period time = (PERIOD+1) * (CLKPSC+1) * EPWM_CLK . + * | | |Down-Count mode: + * | | |In this mode, EPWM counter counts from PERIOD to 0, and restarts from PERIOD. + * | | |EPWM period time = (PERIOD+1) * (CLKPSC+1) * EPWM_CLK . + * | | |Up-Down-Count mode: + * | | |In this mode, EPWM counter counts from 0 to PERIOD, then decrements to 0 and repeats again. + * | | |EPWM period time = 2 * PERIOD * (CLKPSC+1) * EPWM_CLK. + * @var EPWM_T::PERIOD1 + * Offset: 0x34 EPWM Period Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PERIOD |EPWM Period Register + * | | |Up-Count mode: + * | | |In this mode, EPWM counter counts from 0 to PERIOD, and restarts from 0. + * | | |EPWM period time = (PERIOD+1) * (CLKPSC+1) * EPWM_CLK . + * | | |Down-Count mode: + * | | |In this mode, EPWM counter counts from PERIOD to 0, and restarts from PERIOD. + * | | |EPWM period time = (PERIOD+1) * (CLKPSC+1) * EPWM_CLK . + * | | |Up-Down-Count mode: + * | | |In this mode, EPWM counter counts from 0 to PERIOD, then decrements to 0 and repeats again. + * | | |EPWM period time = 2 * PERIOD * (CLKPSC+1) * EPWM_CLK. + * @var EPWM_T::PERIOD2 + * Offset: 0x38 EPWM Period Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PERIOD |EPWM Period Register + * | | |Up-Count mode: + * | | |In this mode, EPWM counter counts from 0 to PERIOD, and restarts from 0. + * | | |EPWM period time = (PERIOD+1) * (CLKPSC+1) * EPWM_CLK . + * | | |Down-Count mode: + * | | |In this mode, EPWM counter counts from PERIOD to 0, and restarts from PERIOD. + * | | |EPWM period time = (PERIOD+1) * (CLKPSC+1) * EPWM_CLK . + * | | |Up-Down-Count mode: + * | | |In this mode, EPWM counter counts from 0 to PERIOD, then decrements to 0 and repeats again. + * | | |EPWM period time = 2 * PERIOD * (CLKPSC+1) * EPWM_CLK. + * @var EPWM_T::PERIOD3 + * Offset: 0x3C EPWM Period Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PERIOD |EPWM Period Register + * | | |Up-Count mode: + * | | |In this mode, EPWM counter counts from 0 to PERIOD, and restarts from 0. + * | | |EPWM period time = (PERIOD+1) * (CLKPSC+1) * EPWM_CLK . + * | | |Down-Count mode: + * | | |In this mode, EPWM counter counts from PERIOD to 0, and restarts from PERIOD. + * | | |EPWM period time = (PERIOD+1) * (CLKPSC+1) * EPWM_CLK . + * | | |Up-Down-Count mode: + * | | |In this mode, EPWM counter counts from 0 to PERIOD, then decrements to 0 and repeats again. + * | | |EPWM period time = 2 * PERIOD * (CLKPSC+1) * EPWM_CLK. + * @var EPWM_T::PERIOD4 + * Offset: 0x40 EPWM Period Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PERIOD |EPWM Period Register + * | | |Up-Count mode: + * | | |In this mode, EPWM counter counts from 0 to PERIOD, and restarts from 0. + * | | |EPWM period time = (PERIOD+1) * (CLKPSC+1) * EPWM_CLK . + * | | |Down-Count mode: + * | | |In this mode, EPWM counter counts from PERIOD to 0, and restarts from PERIOD. + * | | |EPWM period time = (PERIOD+1) * (CLKPSC+1) * EPWM_CLK . + * | | |Up-Down-Count mode: + * | | |In this mode, EPWM counter counts from 0 to PERIOD, then decrements to 0 and repeats again. + * | | |EPWM period time = 2 * PERIOD * (CLKPSC+1) * EPWM_CLK. + * @var EPWM_T::PERIOD5 + * Offset: 0x44 EPWM Period Register 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PERIOD |EPWM Period Register + * | | |Up-Count mode: + * | | |In this mode, EPWM counter counts from 0 to PERIOD, and restarts from 0. + * | | |EPWM period time = (PERIOD+1) * (CLKPSC+1) * EPWM_CLK . + * | | |Down-Count mode: + * | | |In this mode, EPWM counter counts from PERIOD to 0, and restarts from PERIOD. + * | | |EPWM period time = (PERIOD+1) * (CLKPSC+1) * EPWM_CLK . + * | | |Up-Down-Count mode: + * | | |In this mode, EPWM counter counts from 0 to PERIOD, then decrements to 0 and repeats again. + * | | |EPWM period time = 2 * PERIOD * (CLKPSC+1) * EPWM_CLK. + * @var EPWM_T::CMPDAT0 + * Offset: 0x50 EPWM Comparator Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMP |EPWM Comparator Register + * | | |CMP is used to compare with CNT (EPWM_CNTn[15:0]) bits to generate EPWM waveform, interrupt and trigger EADC. + * | | |In independent mode, CMPDAT0~5 is denoted as 6 independent EPWM_CH0~5 compared point. + * | | |In complementary mode, CMPDAT0, 2, 4 is denoted as the first compared point, and CMPDAT1, 3, 5 is denoted as the second compared point for the corresponding 3 complementary pairs EPWM_CH0 and EPWM_CH1, EPWM_CH2 and EPWM_CH3, EPWM_CH4 and EPWM_CH5. + * @var EPWM_T::CMPDAT1 + * Offset: 0x54 EPWM Comparator Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMP |EPWM Comparator Register + * | | |CMP is used to compare with CNT (EPWM_CNTn[15:0]) bits to generate EPWM waveform, interrupt and trigger EADC. + * | | |In independent mode, CMPDAT0~5 is denoted as 6 independent EPWM_CH0~5 compared point. + * | | |In complementary mode, CMPDAT0, 2, 4 is denoted as the first compared point, and CMPDAT1, 3, 5 is denoted as the second compared point for the corresponding 3 complementary pairs EPWM_CH0 and EPWM_CH1, EPWM_CH2 and EPWM_CH3, EPWM_CH4 and EPWM_CH5. + * @var EPWM_T::CMPDAT2 + * Offset: 0x58 EPWM Comparator Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMP |EPWM Comparator Register + * | | |CMP is used to compare with CNT (EPWM_CNTn[15:0]) bits to generate EPWM waveform, interrupt and trigger EADC. + * | | |In independent mode, CMPDAT0~5 is denoted as 6 independent EPWM_CH0~5 compared point. + * | | |In complementary mode, CMPDAT0, 2, 4 is denoted as the first compared point, and CMPDAT1, 3, 5 is denoted as the second compared point for the corresponding 3 complementary pairs EPWM_CH0 and EPWM_CH1, EPWM_CH2 and EPWM_CH3, EPWM_CH4 and EPWM_CH5. + * @var EPWM_T::CMPDAT3 + * Offset: 0x5C EPWM Comparator Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMP |EPWM Comparator Register + * | | |CMP is used to compare with CNT (EPWM_CNTn[15:0]) bits to generate EPWM waveform, interrupt and trigger EADC. + * | | |In independent mode, CMPDAT0~5 is denoted as 6 independent EPWM_CH0~5 compared point. + * | | |In complementary mode, CMPDAT0, 2, 4 is denoted as the first compared point, and CMPDAT1, 3, 5 is denoted as the second compared point for the corresponding 3 complementary pairs EPWM_CH0 and EPWM_CH1, EPWM_CH2 and EPWM_CH3, EPWM_CH4 and EPWM_CH5. + * @var EPWM_T::CMPDAT4 + * Offset: 0x60 EPWM Comparator Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMP |EPWM Comparator Register + * | | |CMP is used to compare with CNT (EPWM_CNTn[15:0]) bits to generate EPWM waveform, interrupt and trigger EADC. + * | | |In independent mode, CMPDAT0~5 is denoted as 6 independent EPWM_CH0~5 compared point. + * | | |In complementary mode, CMPDAT0, 2, 4 is denoted as the first compared point, and CMPDAT1, 3, 5 is denoted as the second compared point for the corresponding 3 complementary pairs EPWM_CH0 and EPWM_CH1, EPWM_CH2 and EPWM_CH3, EPWM_CH4 and EPWM_CH5. + * @var EPWM_T::CMPDAT5 + * Offset: 0x64 EPWM Comparator Register 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMP |EPWM Comparator Register + * | | |CMP is used to compare with CNT (EPWM_CNTn[15:0]) bits to generate EPWM waveform, interrupt and trigger EADC. + * | | |In independent mode, CMPDAT0~5 is denoted as 6 independent EPWM_CH0~5 compared point. + * | | |In complementary mode, CMPDAT0, 2, 4 is denoted as the first compared point, and CMPDAT1, 3, 5 is denoted as the second compared point for the corresponding 3 complementary pairs EPWM_CH0 and EPWM_CH1, EPWM_CH2 and EPWM_CH3, EPWM_CH4 and EPWM_CH5. + * @var EPWM_T::DTCTL0_1 + * Offset: 0x70 EPWM Dead-time Control Register 0/1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |DTCNT |Dead-time Counter (Write Protect) + * | | |The dead-time can be calculated from the following formula: + * | | |DTCKSEL=0: Dead-time = (DTCNT[11:0]+1) * EPWM_CLK period. + * | | |DTCKSEL=1: Dead-time = (DTCNT[11:0]+1) * EPWM_CLK period * (CLKPSC+1). + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[16] |DTEN |Enable Dead-time Insertion for EPWM Pair (Write Protect) + * | | |Dead-time insertion is only active when this pair of complementary EPWM is enabled + * | | |If dead- time insertion is inactive, the outputs of pin pair are complementary without any delay. + * | | |0 = Dead-time insertion disabled on the pin pair. + * | | |1 = Dead-time insertion enabled on the pin pair. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[24] |DTCKSEL |Dead-time Clock Select (Write Protect) + * | | |0 = Dead-time clock source from EPWM_CLK. + * | | |1 = Dead-time clock source from prescaler output. + * | | |Note: This bit is write protected. Refer to REGWRPROT register. + * @var EPWM_T::DTCTL2_3 + * Offset: 0x74 EPWM Dead-time Control Register 2/3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |DTCNT |Dead-time Counter (Write Protect) + * | | |The dead-time can be calculated from the following formula: + * | | |DTCKSEL=0: Dead-time = (DTCNT[11:0]+1) * EPWM_CLK period. + * | | |DTCKSEL=1: Dead-time = (DTCNT[11:0]+1) * EPWM_CLK period * (CLKPSC+1). + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[16] |DTEN |Enable Dead-time Insertion for EPWM Pair (Write Protect) + * | | |Dead-time insertion is only active when this pair of complementary EPWM is enabled + * | | |If dead- time insertion is inactive, the outputs of pin pair are complementary without any delay. + * | | |0 = Dead-time insertion disabled on the pin pair. + * | | |1 = Dead-time insertion enabled on the pin pair. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[24] |DTCKSEL |Dead-time Clock Select (Write Protect) + * | | |0 = Dead-time clock source from EPWM_CLK. + * | | |1 = Dead-time clock source from prescaler output. + * | | |Note: This bit is write protected. Refer to REGWRPROT register. + * @var EPWM_T::DTCTL4_5 + * Offset: 0x78 EPWM Dead-time Control Register 4/5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |DTCNT |Dead-time Counter (Write Protect) + * | | |The dead-time can be calculated from the following formula: + * | | |DTCKSEL=0: Dead-time = (DTCNT[11:0]+1) * EPWM_CLK period. + * | | |DTCKSEL=1: Dead-time = (DTCNT[11:0]+1) * EPWM_CLK period * (CLKPSC+1). + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[16] |DTEN |Enable Dead-time Insertion for EPWM Pair (Write Protect) + * | | |Dead-time insertion is only active when this pair of complementary EPWM is enabled + * | | |If dead- time insertion is inactive, the outputs of pin pair are complementary without any delay. + * | | |0 = Dead-time insertion disabled on the pin pair. + * | | |1 = Dead-time insertion enabled on the pin pair. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[24] |DTCKSEL |Dead-time Clock Select (Write Protect) + * | | |0 = Dead-time clock source from EPWM_CLK. + * | | |1 = Dead-time clock source from prescaler output. + * | | |Note: This bit is write protected. Refer to REGWRPROT register. + * @var EPWM_T::PHS0_1 + * Offset: 0x80 EPWM Counter Phase Register 0/1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PHS |EPWM Synchronous Start Phase Bits + * | | |PHS determines the EPWM synchronous start phase value + * | | |These bits are only used for synchronous function. + * @var EPWM_T::PHS2_3 + * Offset: 0x84 EPWM Counter Phase Register 2/3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PHS |EPWM Synchronous Start Phase Bits + * | | |PHS determines the EPWM synchronous start phase value + * | | |These bits are only used for synchronous function. + * @var EPWM_T::PHS4_5 + * Offset: 0x88 EPWM Counter Phase Register 4/5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PHS |EPWM Synchronous Start Phase Bits + * | | |PHS determines the EPWM synchronous start phase value + * | | |These bits are only used for synchronous function. + * @var EPWM_T::CNT0 + * Offset: 0x90 EPWM Counter Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CNT |EPWM Data Register (Read Only) + * | | |User can monitor CNT to know the current value in 16-bit period counter. + * |[16] |DIRF |EPWM Direction Indicator Flag (Read Only) + * | | |0 = Counter is counting down. + * | | |1 = Counter is counting up. + * @var EPWM_T::CNT1 + * Offset: 0x94 EPWM Counter Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CNT |EPWM Data Register (Read Only) + * | | |User can monitor CNT to know the current value in 16-bit period counter. + * |[16] |DIRF |EPWM Direction Indicator Flag (Read Only) + * | | |0 = Counter is counting down. + * | | |1 = Counter is counting up. + * @var EPWM_T::CNT2 + * Offset: 0x98 EPWM Counter Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CNT |EPWM Data Register (Read Only) + * | | |User can monitor CNT to know the current value in 16-bit period counter. + * |[16] |DIRF |EPWM Direction Indicator Flag (Read Only) + * | | |0 = Counter is counting down. + * | | |1 = Counter is counting up. + * @var EPWM_T::CNT3 + * Offset: 0x9C EPWM Counter Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CNT |EPWM Data Register (Read Only) + * | | |User can monitor CNT to know the current value in 16-bit period counter. + * |[16] |DIRF |EPWM Direction Indicator Flag (Read Only) + * | | |0 = Counter is counting down. + * | | |1 = Counter is counting up. + * @var EPWM_T::CNT4 + * Offset: 0xA0 EPWM Counter Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CNT |EPWM Data Register (Read Only) + * | | |User can monitor CNT to know the current value in 16-bit period counter. + * |[16] |DIRF |EPWM Direction Indicator Flag (Read Only) + * | | |0 = Counter is counting down. + * | | |1 = Counter is counting up. + * @var EPWM_T::CNT5 + * Offset: 0xA4 EPWM Counter Register 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CNT |EPWM Data Register (Read Only) + * | | |User can monitor CNT to know the current value in 16-bit period counter. + * |[16] |DIRF |EPWM Direction Indicator Flag (Read Only) + * | | |0 = Counter is counting down. + * | | |1 = Counter is counting up. + * @var EPWM_T::WGCTL0 + * Offset: 0xB0 EPWM Generation Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |ZPCTL0 |EPWM Zero Point Control + * | | |EPWM can control output level when EPWM counter counts to 0. + * | | |00 = Do nothing. + * | | |01 = EPWM zero point output Low. + * | | |10 = EPWM zero point output High. + * | | |11 = EPWM zero point output Toggle. + * |[3:2] |ZPCTL1 |EPWM Zero Point Control + * | | |EPWM can control output level when EPWM counter counts to 0. + * | | |00 = Do nothing. + * | | |01 = EPWM zero point output Low. + * | | |10 = EPWM zero point output High. + * | | |11 = EPWM zero point output Toggle. + * |[5:4] |ZPCTL2 |EPWM Zero Point Control + * | | |EPWM can control output level when EPWM counter counts to 0. + * | | |00 = Do nothing. + * | | |01 = EPWM zero point output Low. + * | | |10 = EPWM zero point output High. + * | | |11 = EPWM zero point output Toggle. + * |[7:6] |ZPCTL3 |EPWM Zero Point Control + * | | |EPWM can control output level when EPWM counter counts to 0. + * | | |00 = Do nothing. + * | | |01 = EPWM zero point output Low. + * | | |10 = EPWM zero point output High. + * | | |11 = EPWM zero point output Toggle. + * |[9:8] |ZPCTL4 |EPWM Zero Point Control + * | | |EPWM can control output level when EPWM counter counts to 0. + * | | |00 = Do nothing. + * | | |01 = EPWM zero point output Low. + * | | |10 = EPWM zero point output High. + * | | |11 = EPWM zero point output Toggle. + * |[11:10] |ZPCTL5 |EPWM Zero Point Control + * | | |EPWM can control output level when EPWM counter counts to 0. + * | | |00 = Do nothing. + * | | |01 = EPWM zero point output Low. + * | | |10 = EPWM zero point output High. + * | | |11 = EPWM zero point output Toggle. + * |[17:16] |PRDPCTL0 |EPWM Period Point Control + * | | |EPWM can control output level when EPWM counter counts to (PERIODn+1). + * | | |00 = Do nothing. + * | | |01 = EPWM period (center) point output Low. + * | | |10 = EPWM period (center) point output High. + * | | |11 = EPWM period (center) point output Toggle. + * | | |Note: This bit is center point control when EPWM counter operating in up-down counter type. + * |[19:18] |PRDPCTL1 |EPWM Period Point Control + * | | |EPWM can control output level when EPWM counter counts to (PERIODn+1). + * | | |00 = Do nothing. + * | | |01 = EPWM period (center) point output Low. + * | | |10 = EPWM period (center) point output High. + * | | |11 = EPWM period (center) point output Toggle. + * | | |Note: This bit is center point control when EPWM counter operating in up-down counter type. + * |[21:20] |PRDPCTL2 |EPWM Period Point Control + * | | |EPWM can control output level when EPWM counter counts to (PERIODn+1). + * | | |00 = Do nothing. + * | | |01 = EPWM period (center) point output Low. + * | | |10 = EPWM period (center) point output High. + * | | |11 = EPWM period (center) point output Toggle. + * | | |Note: This bit is center point control when EPWM counter operating in up-down counter type. + * |[23:22] |PRDPCTL3 |EPWM Period Point Control + * | | |EPWM can control output level when EPWM counter counts to (PERIODn+1). + * | | |00 = Do nothing. + * | | |01 = EPWM period (center) point output Low. + * | | |10 = EPWM period (center) point output High. + * | | |11 = EPWM period (center) point output Toggle. + * | | |Note: This bit is center point control when EPWM counter operating in up-down counter type. + * |[25:24] |PRDPCTL4 |EPWM Period Point Control + * | | |EPWM can control output level when EPWM counter counts to (PERIODn+1). + * | | |00 = Do nothing. + * | | |01 = EPWM period (center) point output Low. + * | | |10 = EPWM period (center) point output High. + * | | |11 = EPWM period (center) point output Toggle. + * | | |Note: This bit is center point control when EPWM counter operating in up-down counter type. + * |[27:26] |PRDPCTL5 |EPWM Period Point Control + * | | |EPWM can control output level when EPWM counter counts to (PERIODn+1). + * | | |00 = Do nothing. + * | | |01 = EPWM period (center) point output Low. + * | | |10 = EPWM period (center) point output High. + * | | |11 = EPWM period (center) point output Toggle. + * | | |Note: This bit is center point control when EPWM counter operating in up-down counter type. + * @var EPWM_T::WGCTL1 + * Offset: 0xB4 EPWM Generation Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |CMPUCTL0 |EPWM Compare Up Point Control + * | | |EPWM can control output level when EPWM counter counts up to CMPDAT. + * | | |00 = Do nothing. + * | | |01 = EPWM compare up point output Low. + * | | |10 = EPWM compare up point output High. + * | | |11 = EPWM compare up point output Toggle. + * | | |Note: In complementary mode, CMPUCTL1, 3, 5 is used as another CMPUCTL for channel 0, 2, 4. + * |[3:2] |CMPUCTL1 |EPWM Compare Up Point Control + * | | |EPWM can control output level when EPWM counter counts up to CMPDAT. + * | | |00 = Do nothing. + * | | |01 = EPWM compare up point output Low. + * | | |10 = EPWM compare up point output High. + * | | |11 = EPWM compare up point output Toggle. + * | | |Note: In complementary mode, CMPUCTL1, 3, 5 is used as another CMPUCTL for channel 0, 2, 4. + * |[5:4] |CMPUCTL2 |EPWM Compare Up Point Control + * | | |EPWM can control output level when EPWM counter counts up to CMPDAT. + * | | |00 = Do nothing. + * | | |01 = EPWM compare up point output Low. + * | | |10 = EPWM compare up point output High. + * | | |11 = EPWM compare up point output Toggle. + * | | |Note: In complementary mode, CMPUCTL1, 3, 5 is used as another CMPUCTL for channel 0, 2, 4. + * |[7:6] |CMPUCTL3 |EPWM Compare Up Point Control + * | | |EPWM can control output level when EPWM counter counts up to CMPDAT. + * | | |00 = Do nothing. + * | | |01 = EPWM compare up point output Low. + * | | |10 = EPWM compare up point output High. + * | | |11 = EPWM compare up point output Toggle. + * | | |Note: In complementary mode, CMPUCTL1, 3, 5 is used as another CMPUCTL for channel 0, 2, 4. + * |[9:8] |CMPUCTL4 |EPWM Compare Up Point Control + * | | |EPWM can control output level when EPWM counter counts up to CMPDAT. + * | | |00 = Do nothing. + * | | |01 = EPWM compare up point output Low. + * | | |10 = EPWM compare up point output High. + * | | |11 = EPWM compare up point output Toggle. + * | | |Note: In complementary mode, CMPUCTL1, 3, 5 is used as another CMPUCTL for channel 0, 2, 4. + * |[11:10] |CMPUCTL5 |EPWM Compare Up Point Control + * | | |EPWM can control output level when EPWM counter counts up to CMPDAT. + * | | |00 = Do nothing. + * | | |01 = EPWM compare up point output Low. + * | | |10 = EPWM compare up point output High. + * | | |11 = EPWM compare up point output Toggle. + * | | |Note: In complementary mode, CMPUCTL1, 3, 5 is used as another CMPUCTL for channel 0, 2, 4. + * |[17:16] |CMPDCTL0 |EPWM Compare Down Point Control + * | | |EPWM can control output level when EPWM counter counts down to CMPDAT. + * | | |00 = Do nothing. + * | | |01 = EPWM compare down point output Low. + * | | |10 = EPWM compare down point output High. + * | | |11 = EPWM compare down point output Toggle. + * | | |Note: In complementary mode, CMPDCTL1, 3, 5 is used as another CMPDCTL for channel 0, 2, 4. + * |[19:18] |CMPDCTL1 |EPWM Compare Down Point Control + * | | |EPWM can control output level when EPWM counter counts down to CMPDAT. + * | | |00 = Do nothing. + * | | |01 = EPWM compare down point output Low. + * | | |10 = EPWM compare down point output High. + * | | |11 = EPWM compare down point output Toggle. + * | | |Note: In complementary mode, CMPDCTL1, 3, 5 is used as another CMPDCTL for channel 0, 2, 4. + * |[21:20] |CMPDCTL2 |EPWM Compare Down Point Control + * | | |EPWM can control output level when EPWM counter counts down to CMPDAT. + * | | |00 = Do nothing. + * | | |01 = EPWM compare down point output Low. + * | | |10 = EPWM compare down point output High. + * | | |11 = EPWM compare down point output Toggle. + * | | |Note: In complementary mode, CMPDCTL1, 3, 5 is used as another CMPDCTL for channel 0, 2, 4. + * |[23:22] |CMPDCTL3 |EPWM Compare Down Point Control + * | | |EPWM can control output level when EPWM counter counts down to CMPDAT. + * | | |00 = Do nothing. + * | | |01 = EPWM compare down point output Low. + * | | |10 = EPWM compare down point output High. + * | | |11 = EPWM compare down point output Toggle. + * | | |Note: In complementary mode, CMPDCTL1, 3, 5 is used as another CMPDCTL for channel 0, 2, 4. + * |[25:24] |CMPDCTL4 |EPWM Compare Down Point Control + * | | |EPWM can control output level when EPWM counter counts down to CMPDAT. + * | | |00 = Do nothing. + * | | |01 = EPWM compare down point output Low. + * | | |10 = EPWM compare down point output High. + * | | |11 = EPWM compare down point output Toggle. + * | | |Note: In complementary mode, CMPDCTL1, 3, 5 is used as another CMPDCTL for channel 0, 2, 4. + * |[27:26] |CMPDCTL5 |EPWM Compare Down Point Control + * | | |EPWM can control output level when EPWM counter counts down to CMPDAT. + * | | |00 = Do nothing. + * | | |01 = EPWM compare down point output Low. + * | | |10 = EPWM compare down point output High. + * | | |11 = EPWM compare down point output Toggle. + * | | |Note: In complementary mode, CMPDCTL1, 3, 5 is used as another CMPDCTL for channel 0, 2, 4. + * @var EPWM_T::MSKEN + * Offset: 0xB8 EPWM Mask Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |MSKEN0 |EPWM Mask Enable Bits + * | | |The EPWM output signal will be masked when this bit is enabled + * | | |The corresponding EPWM channel n will output MSKDATn (EPWM_MSK[5:0]) data. + * | | |0 = EPWM output signal is non-masked. + * | | |1 = EPWM output signal is masked and output MSKDATn data. + * |[1] |MSKEN1 |EPWM Mask Enable Bits + * | | |The EPWM output signal will be masked when this bit is enabled + * | | |The corresponding EPWM channel n will output MSKDATn (EPWM_MSK[5:0]) data. + * | | |0 = EPWM output signal is non-masked. + * | | |1 = EPWM output signal is masked and output MSKDATn data. + * |[2] |MSKEN2 |EPWM Mask Enable Bits + * | | |The EPWM output signal will be masked when this bit is enabled + * | | |The corresponding EPWM channel n will output MSKDATn (EPWM_MSK[5:0]) data. + * | | |0 = EPWM output signal is non-masked. + * | | |1 = EPWM output signal is masked and output MSKDATn data. + * |[3] |MSKEN3 |EPWM Mask Enable Bits + * | | |The EPWM output signal will be masked when this bit is enabled + * | | |The corresponding EPWM channel n will output MSKDATn (EPWM_MSK[5:0]) data. + * | | |0 = EPWM output signal is non-masked. + * | | |1 = EPWM output signal is masked and output MSKDATn data. + * |[4] |MSKEN4 |EPWM Mask Enable Bits + * | | |The EPWM output signal will be masked when this bit is enabled + * | | |The corresponding EPWM channel n will output MSKDATn (EPWM_MSK[5:0]) data. + * | | |0 = EPWM output signal is non-masked. + * | | |1 = EPWM output signal is masked and output MSKDATn data. + * |[5] |MSKEN5 |EPWM Mask Enable Bits + * | | |The EPWM output signal will be masked when this bit is enabled + * | | |The corresponding EPWM channel n will output MSKDATn (EPWM_MSK[5:0]) data. + * | | |0 = EPWM output signal is non-masked. + * | | |1 = EPWM output signal is masked and output MSKDATn data. + * @var EPWM_T::MSK + * Offset: 0xBC EPWM Mask Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |MSKDAT0 |EPWM Mask Data Bit + * | | |This data bit control the state of EPWMn output pin, if corresponding mask function is enabled. + * | | |0 = Output logic low to EPWM channel n. + * | | |1 = Output logic high to EPWM channel n. + * |[1] |MSKDAT1 |EPWM Mask Data Bit + * | | |This data bit control the state of EPWMn output pin, if corresponding mask function is enabled. + * | | |0 = Output logic low to EPWM channel n. + * | | |1 = Output logic high to EPWM channel n. + * |[2] |MSKDAT2 |EPWM Mask Data Bit + * | | |This data bit control the state of EPWMn output pin, if corresponding mask function is enabled. + * | | |0 = Output logic low to EPWM channel n. + * | | |1 = Output logic high to EPWM channel n. + * |[3] |MSKDAT3 |EPWM Mask Data Bit + * | | |This data bit control the state of EPWMn output pin, if corresponding mask function is enabled. + * | | |0 = Output logic low to EPWM channel n. + * | | |1 = Output logic high to EPWM channel n. + * |[4] |MSKDAT4 |EPWM Mask Data Bit + * | | |This data bit control the state of EPWMn output pin, if corresponding mask function is enabled. + * | | |0 = Output logic low to EPWM channel n. + * | | |1 = Output logic high to EPWM channel n. + * |[5] |MSKDAT5 |EPWM Mask Data Bit + * | | |This data bit control the state of EPWMn output pin, if corresponding mask function is enabled. + * | | |0 = Output logic low to EPWM channel n. + * | | |1 = Output logic high to EPWM channel n. + * @var EPWM_T::BNF + * Offset: 0xC0 EPWM Brake Noise Filter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BRK0NFEN |EPWM Brake 0 Noise Filter Enable Bit + * | | |0 = Noise filter of EPWM Brake 0 Disabled. + * | | |1 = Noise filter of EPWM Brake 0 Enabled. + * |[3:1] |BRK0NFSEL |Brake 0 Edge Detector Filter Clock Selection + * | | |000 = Filter clock = HCLK. + * | | |001 = Filter clock = HCLK/2. + * | | |010 = Filter clock = HCLK/4. + * | | |011 = Filter clock = HCLK/8. + * | | |100 = Filter clock = HCLK/16. + * | | |101 = Filter clock = HCLK/32. + * | | |110 = Filter clock = HCLK/64. + * | | |111 = Filter clock = HCLK/128. + * |[6:4] |BRK0FCNT |Brake 0 Edge Detector Filter Count + * | | |The register bits control the Brake0 filter counter to count from 0 to BRK0FCNT. + * |[7] |BRK0PINV |Brake 0 Pin Inverse + * | | |0 = brake pin event will be detected if EPWMx BRAKE0 pin status transfer from low to high in edge-detect, or pin status is high in level-detect. + * | | |1 = brake pin event will be detected if EPWMx BRAKE0 pin status transfer from high to low in edge-detect, or pin status is low in level-detect. + * |[8] |BRK1NFEN |EPWM Brake 1 Noise Filter Enable Bit + * | | |0 = Noise filter of EPWM Brake 1 Disabled. + * | | |1 = Noise filter of EPWM Brake 1 Enabled. + * |[11:9] |BRK1NFSEL |Brake 1 Edge Detector Filter Clock Selection + * | | |000 = Filter clock = HCLK. + * | | |001 = Filter clock = HCLK/2. + * | | |010 = Filter clock = HCLK/4. + * | | |011 = Filter clock = HCLK/8. + * | | |100 = Filter clock = HCLK/16. + * | | |101 = Filter clock = HCLK/32. + * | | |110 = Filter clock = HCLK/64. + * | | |111 = Filter clock = HCLK/128. + * |[14:12] |BRK1FCNT |Brake 1 Edge Detector Filter Count + * | | |The register bits control the Brake1 filter counter to count from 0 to BRK1FCNT. + * |[15] |BRK1PINV |Brake 1 Pin Inverse + * | | |0 = brake pin event will be detected if EPWMx BRAKE1 pin status transfer from low to high in edge-detect, or pin status is high in level-detect. + * | | |1 = brake pin event will be detected if EPWMx BRAKE1 pin status transfer from high to low in edge-detect, or pin status is low in level-detect. + * |[17:16] |BK0SRC |Brake 0 Pin Source Select + * | | |For EPWM0 setting: + * | | |0 = Brake 0 pin source come from EPWM0_BRAKE0. + * | | |1 = Brake 0 pin source come from EPWM1_BRAKE0. + * | | |2 = Brake 0 pin source come from EPWM2_BRAKE0. + * | | |For EPWM1 setting: + * | | |0 = Brake 0 pin source come from EPWM1_BRAKE0. + * | | |1 = Brake 0 pin source come from EPWM0_BRAKE0. + * | | |2 = Brake 1 pin source come from EPWM2_BRAKE0. + * | | |For EPWM2 setting: + * | | |0 = Brake 0 pin source come from EPWM2_BRAKE0. + * | | |1 = Brake 0 pin source come from EPWM0_BRAKE0. + * | | |2 = Brake 1 pin source come from EPWM1_BRAKE0. + * |[25:24] |BK1SRC |Brake 1 Pin Source Select + * | | |For EPWM0 setting: + * | | |0 = Brake 1 pin source come from EPWM0_BRAKE1. + * | | |1 = Brake 1 pin source come from EPWM1_BRAKE1. + * | | |2 = Brake 1 pin source come from EPWM2_BRAKE1. + * | | |For EPWM1 setting: + * | | |0 = Brake 1 pin source come from EPWM1_BRAKE1. + * | | |1 = Brake 1 pin source come from EPWM0_BRAKE1. + * | | |2 = Brake 1 pin source come from EPWM2_BRAKE1. + * | | |For EPWM2 setting: + * | | |0 = Brake 1 pin source come from EPWM2_BRAKE1. + * | | |1 = Brake 1 pin source come from EPWM0_BRAKE1. + * | | |2 = Brake 1 pin source come from EPWM1_BRAKE1. + * @var EPWM_T::FAILBRK + * Offset: 0xC4 EPWM System Fail Brake Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CSSBRKEN |Clock Security System Detection Trigger EPWM Brake Function 0 Enable Bit + * | | |0 = Brake Function triggered by CSS detection Disabled. + * | | |1 = Brake Function triggered by CSS detection Enabled. + * |[1] |LVDBRKEN |Low Voltage Interrupt Flag Detection Trigger EPWM Brake Function 0 Enable Bit + * | | |0 = Brake Function triggered by LVD Disabled. + * | | |1 = Brake Function triggered by LVD Enabled. + * |[3] |CORBRKEN |Core Lockup Detection Trigger EPWM Brake Function 0 Enable Bit + * | | |0 = Brake Function triggered by Core lockup detection Disabled. + * | | |1 = Brake Function triggered by Core lockup detection Enabled. + * @var EPWM_T::BRKCTL0_1 + * Offset: 0xC8 EPWM Brake Edge Detect Control Register 0/1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4] |BRKP0EEN |Enable EPWMx_BRAKE0 Pin As Edge-detect Brake Source (Write Protect) + * | | |0 = EPWMx_BRAKE0 pin as edge-detect brake source Disabled. + * | | |1 = EPWMx_BRAKE0 pin as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[5] |BRKP1EEN |Enable EPWMx_BRAKE1 Pin As Edge-detect Brake Source (Write Protect) + * | | |0 = EPWMx_BRAKE1 pin as edge-detect brake source Disabled. + * | | |1 = EPWMx_BRAKE1 pin as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[7] |SYSEBEN |Enable System Fail As Edge-detect Brake Source (Write Protect) + * | | |0 = System Fail condition as edge-detect brake source Disabled. + * | | |1 = System Fail condition as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[12] |BRKP0LEN |Enable BKP0 Pin As Level-detect Brake Source (Write Protect) + * | | |0 = EPWMx_BRAKE0 pin as level-detect brake source Disabled. + * | | |1 = EPWMx_BRAKE0 pin as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[13] |BRKP1LEN |Enable BKP1 Pin As Level-detect Brake Source (Write Protect) + * | | |0 = EPWMx_BRAKE1 pin as level-detect brake source Disabled. + * | | |1 = EPWMx_BRAKE1 pin as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[15] |SYSLBEN |Enable System Fail As Level-detect Brake Source (Write Protect) + * | | |0 = System Fail condition as level-detect brake source Disabled. + * | | |1 = System Fail condition as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[17:16] |BRKAEVEN |EPWM Brake Action Select for Even Channel (Write Protect) + * | | |00 = EPWMx brake event will not affect even channels output. + * | | |01 = EPWM even channel output tri-state when EPWMx brake event happened. + * | | |10 = EPWM even channel output low level when EPWMx brake event happened. + * | | |11 = EPWM even channel output high level when EPWMx brake event happened. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[19:18] |BRKAODD |EPWM Brake Action Select for Odd Channel (Write Protect) + * | | |00 = EPWMx brake event will not affect odd channels output. + * | | |01 = EPWM odd channel output tri-state when EPWMx brake event happened. + * | | |10 = EPWM odd channel output low level when EPWMx brake event happened. + * | | |11 = EPWM odd channel output high level when EPWMx brake event happened. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[20] |EADCEBEN |Enable EADC Result Monitor As Edge-detect Brake Source (Write Protect) + * | | |0 = EADCRM as edge-detect brake source Disabled. + * | | |1 = EADCRM as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[28] |EADCLBEN |Enable EADC Result Monitor As Level-detect Brake Source (Write Protect) + * | | |0 = EADCRM as level-detect brake source Disabled. + * | | |1 = EADCRM as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * @var EPWM_T::BRKCTL2_3 + * Offset: 0xCC EPWM Brake Edge Detect Control Register 2/3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4] |BRKP0EEN |Enable EPWMx_BRAKE0 Pin As Edge-detect Brake Source (Write Protect) + * | | |0 = EPWMx_BRAKE0 pin as edge-detect brake source Disabled. + * | | |1 = EPWMx_BRAKE0 pin as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[5] |BRKP1EEN |Enable EPWMx_BRAKE1 Pin As Edge-detect Brake Source (Write Protect) + * | | |0 = EPWMx_BRAKE1 pin as edge-detect brake source Disabled. + * | | |1 = EPWMx_BRAKE1 pin as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[7] |SYSEBEN |Enable System Fail As Edge-detect Brake Source (Write Protect) + * | | |0 = System Fail condition as edge-detect brake source Disabled. + * | | |1 = System Fail condition as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[12] |BRKP0LEN |Enable BKP0 Pin As Level-detect Brake Source (Write Protect) + * | | |0 = EPWMx_BRAKE0 pin as level-detect brake source Disabled. + * | | |1 = EPWMx_BRAKE0 pin as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[13] |BRKP1LEN |Enable BKP1 Pin As Level-detect Brake Source (Write Protect) + * | | |0 = EPWMx_BRAKE1 pin as level-detect brake source Disabled. + * | | |1 = EPWMx_BRAKE1 pin as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[15] |SYSLBEN |Enable System Fail As Level-detect Brake Source (Write Protect) + * | | |0 = System Fail condition as level-detect brake source Disabled. + * | | |1 = System Fail condition as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[17:16] |BRKAEVEN |EPWM Brake Action Select for Even Channel (Write Protect) + * | | |00 = EPWMx brake event will not affect even channels output. + * | | |01 = EPWM even channel output tri-state when EPWMx brake event happened. + * | | |10 = EPWM even channel output low level when EPWMx brake event happened. + * | | |11 = EPWM even channel output high level when EPWMx brake event happened. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[19:18] |BRKAODD |EPWM Brake Action Select for Odd Channel (Write Protect) + * | | |00 = EPWMx brake event will not affect odd channels output. + * | | |01 = EPWM odd channel output tri-state when EPWMx brake event happened. + * | | |10 = EPWM odd channel output low level when EPWMx brake event happened. + * | | |11 = EPWM odd channel output high level when EPWMx brake event happened. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[20] |EADCEBEN |Enable EADC Result Monitor As Edge-detect Brake Source (Write Protect) + * | | |0 = EADCRM as edge-detect brake source Disabled. + * | | |1 = EADCRM as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[28] |EADCLBEN |Enable EADC Result Monitor As Level-detect Brake Source (Write Protect) + * | | |0 = EADCRM as level-detect brake source Disabled. + * | | |1 = EADCRM as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * @var EPWM_T::BRKCTL4_5 + * Offset: 0xD0 EPWM Brake Edge Detect Control Register 4/5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4] |BRKP0EEN |Enable EPWMx_BRAKE0 Pin As Edge-detect Brake Source (Write Protect) + * | | |0 = EPWMx_BRAKE0 pin as edge-detect brake source Disabled. + * | | |1 = EPWMx_BRAKE0 pin as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[5] |BRKP1EEN |Enable EPWMx_BRAKE1 Pin As Edge-detect Brake Source (Write Protect) + * | | |0 = EPWMx_BRAKE1 pin as edge-detect brake source Disabled. + * | | |1 = EPWMx_BRAKE1 pin as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[7] |SYSEBEN |Enable System Fail As Edge-detect Brake Source (Write Protect) + * | | |0 = System Fail condition as edge-detect brake source Disabled. + * | | |1 = System Fail condition as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[12] |BRKP0LEN |Enable BKP0 Pin As Level-detect Brake Source (Write Protect) + * | | |0 = EPWMx_BRAKE0 pin as level-detect brake source Disabled. + * | | |1 = EPWMx_BRAKE0 pin as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[13] |BRKP1LEN |Enable BKP1 Pin As Level-detect Brake Source (Write Protect) + * | | |0 = EPWMx_BRAKE1 pin as level-detect brake source Disabled. + * | | |1 = EPWMx_BRAKE1 pin as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[15] |SYSLBEN |Enable System Fail As Level-detect Brake Source (Write Protect) + * | | |0 = System Fail condition as level-detect brake source Disabled. + * | | |1 = System Fail condition as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[17:16] |BRKAEVEN |EPWM Brake Action Select for Even Channel (Write Protect) + * | | |00 = EPWMx brake event will not affect even channels output. + * | | |01 = EPWM even channel output tri-state when EPWMx brake event happened. + * | | |10 = EPWM even channel output low level when EPWMx brake event happened. + * | | |11 = EPWM even channel output high level when EPWMx brake event happened. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[19:18] |BRKAODD |EPWM Brake Action Select for Odd Channel (Write Protect) + * | | |00 = EPWMx brake event will not affect odd channels output. + * | | |01 = EPWM odd channel output tri-state when EPWMx brake event happened. + * | | |10 = EPWM odd channel output low level when EPWMx brake event happened. + * | | |11 = EPWM odd channel output high level when EPWMx brake event happened. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[20] |EADCEBEN |Enable EADC Result Monitor As Edge-detect Brake Source (Write Protect) + * | | |0 = EADCRM as edge-detect brake source Disabled. + * | | |1 = EADCRM as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[28] |EADCLBEN |Enable EADC Result Monitor As Level-detect Brake Source (Write Protect) + * | | |0 = EADCRM as level-detect brake source Disabled. + * | | |1 = EADCRM as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * @var EPWM_T::POLCTL + * Offset: 0xD4 EPWM Pin Polar Inverse Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PINV0 |EPWM PIN Polar Inverse Control + * | | |The register controls polarity state of EPWMx_CHn output pin. + * | | |0 = EPWMx_CHn output pin polar inverse Disabled. + * | | |1 = EPWMx_CHn output pin polar inverse Enabled. + * |[1] |PINV1 |EPWM PIN Polar Inverse Control + * | | |The register controls polarity state of EPWMx_CHn output pin. + * | | |0 = EPWMx_CHn output pin polar inverse Disabled. + * | | |1 = EPWMx_CHn output pin polar inverse Enabled. + * |[2] |PINV2 |EPWM PIN Polar Inverse Control + * | | |The register controls polarity state of EPWMx_CHn output pin. + * | | |0 = EPWMx_CHn output pin polar inverse Disabled. + * | | |1 = EPWMx_CHn output pin polar inverse Enabled. + * |[3] |PINV3 |EPWM PIN Polar Inverse Control + * | | |The register controls polarity state of EPWMx_CHn output pin. + * | | |0 = EPWMx_CHn output pin polar inverse Disabled. + * | | |1 = EPWMx_CHn output pin polar inverse Enabled. + * |[4] |PINV4 |EPWM PIN Polar Inverse Control + * | | |The register controls polarity state of EPWMx_CHn output pin. + * | | |0 = EPWMx_CHn output pin polar inverse Disabled. + * | | |1 = EPWMx_CHn output pin polar inverse Enabled. + * |[5] |PINV5 |EPWM PIN Polar Inverse Control + * | | |The register controls polarity state of EPWMx_CHn output pin. + * | | |0 = EPWMx_CHn output pin polar inverse Disabled. + * | | |1 = EPWMx_CHn output pin polar inverse Enabled. + * @var EPWM_T::POEN + * Offset: 0xD8 EPWM Output Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |POEN0 |EPWM Pin Output Enable Bits + * | | |0 = EPWMx_CHn pin at tri-state. + * | | |1 = EPWMx_CHn pin in output mode. + * |[1] |POEN1 |EPWM Pin Output Enable Bits + * | | |0 = EPWMx_CHn pin at tri-state. + * | | |1 = EPWMx_CHn pin in output mode. + * |[2] |POEN2 |EPWM Pin Output Enable Bits + * | | |0 = EPWMx_CHn pin at tri-state. + * | | |1 = EPWMx_CHn pin in output mode. + * |[3] |POEN3 |EPWM Pin Output Enable Bits + * | | |0 = EPWMx_CHn pin at tri-state. + * | | |1 = EPWMx_CHn pin in output mode. + * |[4] |POEN4 |EPWM Pin Output Enable Bits + * | | |0 = EPWMx_CHn pin at tri-state. + * | | |1 = EPWMx_CHn pin in output mode. + * |[5] |POEN5 |EPWM Pin Output Enable Bits + * | | |0 = EPWMx_CHn pin at tri-state. + * | | |1 = EPWMx_CHn pin in output mode. + * @var EPWM_T::SWBRK + * Offset: 0xDC EPWM Software Brake Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BRKETRG0 |EPWM Edge Brake Software Trigger (Write Only) (Write Protect) + * | | |Write 1 to this bit will trigger edge brake, and set BRKEIFn to 1 in EPWM_INTSTS1 register. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[1] |BRKETRG2 |EPWM Edge Brake Software Trigger (Write Only) (Write Protect) + * | | |Write 1 to this bit will trigger edge brake, and set BRKEIFn to 1 in EPWM_INTSTS1 register. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[2] |BRKETRG4 |EPWM Edge Brake Software Trigger (Write Only) (Write Protect) + * | | |Write 1 to this bit will trigger edge brake, and set BRKEIFn to 1 in EPWM_INTSTS1 register. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[8] |BRKLTRG0 |EPWM Level Brake Software Trigger (Write Only) (Write Protect) + * | | |Write 1 to this bit will trigger level brake, and set BRKLIFn to 1 in EPWM_INTSTS1 register. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[9] |BRKLTRG2 |EPWM Level Brake Software Trigger (Write Only) (Write Protect) + * | | |Write 1 to this bit will trigger level brake, and set BRKLIFn to 1 in EPWM_INTSTS1 register. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[10] |BRKLTRG4 |EPWM Level Brake Software Trigger (Write Only) (Write Protect) + * | | |Write 1 to this bit will trigger level brake, and set BRKLIFn to 1 in EPWM_INTSTS1 register. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * @var EPWM_T::INTEN0 + * Offset: 0xE0 EPWM Interrupt Enable Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ZIEN0 |EPWM Zero Point Interrupt Enable Bits + * | | |0 = Zero point interrupt Disabled. + * | | |1 = Zero point interrupt Enabled. + * | | |Note: Odd channels will read always 0 at complementary mode. + * |[1] |ZIEN1 |EPWM Zero Point Interrupt Enable Bits + * | | |0 = Zero point interrupt Disabled. + * | | |1 = Zero point interrupt Enabled. + * | | |Note: Odd channels will read always 0 at complementary mode. + * |[2] |ZIEN2 |EPWM Zero Point Interrupt Enable Bits + * | | |0 = Zero point interrupt Disabled. + * | | |1 = Zero point interrupt Enabled. + * | | |Note: Odd channels will read always 0 at complementary mode. + * |[3] |ZIEN3 |EPWM Zero Point Interrupt Enable Bits + * | | |0 = Zero point interrupt Disabled. + * | | |1 = Zero point interrupt Enabled. + * | | |Note: Odd channels will read always 0 at complementary mode. + * |[4] |ZIEN4 |EPWM Zero Point Interrupt Enable Bits + * | | |0 = Zero point interrupt Disabled. + * | | |1 = Zero point interrupt Enabled. + * | | |Note: Odd channels will read always 0 at complementary mode. + * |[5] |ZIEN5 |EPWM Zero Point Interrupt Enable Bits + * | | |0 = Zero point interrupt Disabled. + * | | |1 = Zero point interrupt Enabled. + * | | |Note: Odd channels will read always 0 at complementary mode. + * |[8] |PIEN0 |EPWM Period Point Interrupt Enable Bits + * | | |0 = Period point interrupt Disabled. + * | | |1 = Period point interrupt Enabled. + * | | |Note 1: When up-down counter type period point means center point. + * | | |Note 2: Odd channels will read always 0 at complementary mode. + * |[9] |PIEN1 |EPWM Period Point Interrupt Enable Bits + * | | |0 = Period point interrupt Disabled. + * | | |1 = Period point interrupt Enabled. + * | | |Note 1: When up-down counter type period point means center point. + * | | |Note 2: Odd channels will read always 0 at complementary mode. + * |[10] |PIEN2 |EPWM Period Point Interrupt Enable Bits + * | | |0 = Period point interrupt Disabled. + * | | |1 = Period point interrupt Enabled. + * | | |Note 1: When up-down counter type period point means center point. + * | | |Note 2: Odd channels will read always 0 at complementary mode. + * |[11] |PIEN3 |EPWM Period Point Interrupt Enable Bits + * | | |0 = Period point interrupt Disabled. + * | | |1 = Period point interrupt Enabled. + * | | |Note 1: When up-down counter type period point means center point. + * | | |Note 2: Odd channels will read always 0 at complementary mode. + * |[12] |PIEN4 |EPWM Period Point Interrupt Enable Bits + * | | |0 = Period point interrupt Disabled. + * | | |1 = Period point interrupt Enabled. + * | | |Note 1: When up-down counter type period point means center point. + * | | |Note 2: Odd channels will read always 0 at complementary mode. + * |[13] |PIEN5 |EPWM Period Point Interrupt Enable Bits + * | | |0 = Period point interrupt Disabled. + * | | |1 = Period point interrupt Enabled. + * | | |Note 1: When up-down counter type period point means center point. + * | | |Note 2: Odd channels will read always 0 at complementary mode. + * |[16] |CMPUIEN0 |EPWM Compare Up Count Interrupt Enable Bits + * | | |0 = Compare up count interrupt Disabled. + * | | |1 = Compare up count interrupt Enabled. + * | | |Note: In complementary mode, CMPUIEN1, 3, 5 is used as another CMPUIEN for channel 0, 2, 4. + * |[17] |CMPUIEN1 |EPWM Compare Up Count Interrupt Enable Bits + * | | |0 = Compare up count interrupt Disabled. + * | | |1 = Compare up count interrupt Enabled. + * | | |Note: In complementary mode, CMPUIEN1, 3, 5 is used as another CMPUIEN for channel 0, 2, 4. + * |[18] |CMPUIEN2 |EPWM Compare Up Count Interrupt Enable Bits + * | | |0 = Compare up count interrupt Disabled. + * | | |1 = Compare up count interrupt Enabled. + * | | |Note: In complementary mode, CMPUIEN1, 3, 5 is used as another CMPUIEN for channel 0, 2, 4. + * |[19] |CMPUIEN3 |EPWM Compare Up Count Interrupt Enable Bits + * | | |0 = Compare up count interrupt Disabled. + * | | |1 = Compare up count interrupt Enabled. + * | | |Note: In complementary mode, CMPUIEN1, 3, 5 is used as another CMPUIEN for channel 0, 2, 4. + * |[20] |CMPUIEN4 |EPWM Compare Up Count Interrupt Enable Bits + * | | |0 = Compare up count interrupt Disabled. + * | | |1 = Compare up count interrupt Enabled. + * | | |Note: In complementary mode, CMPUIEN1, 3, 5 is used as another CMPUIEN for channel 0, 2, 4. + * |[21] |CMPUIEN5 |EPWM Compare Up Count Interrupt Enable Bits + * | | |0 = Compare up count interrupt Disabled. + * | | |1 = Compare up count interrupt Enabled. + * | | |Note: In complementary mode, CMPUIEN1, 3, 5 is used as another CMPUIEN for channel 0, 2, 4. + * |[24] |CMPDIEN0 |EPWM Compare Down Count Interrupt Enable Bits + * | | |0 = Compare down count interrupt Disabled. + * | | |1 = Compare down count interrupt Enabled. + * | | |Note: In complementary mode, CMPDIEN1, 3, 5 is used as another CMPDIEN for channel 0, 2, 4. + * |[25] |CMPDIEN1 |EPWM Compare Down Count Interrupt Enable Bits + * | | |0 = Compare down count interrupt Disabled. + * | | |1 = Compare down count interrupt Enabled. + * | | |Note: In complementary mode, CMPDIEN1, 3, 5 is used as another CMPDIEN for channel 0, 2, 4. + * |[26] |CMPDIEN2 |EPWM Compare Down Count Interrupt Enable Bits + * | | |0 = Compare down count interrupt Disabled. + * | | |1 = Compare down count interrupt Enabled. + * | | |Note: In complementary mode, CMPDIEN1, 3, 5 is used as another CMPDIEN for channel 0, 2, 4. + * |[27] |CMPDIEN3 |EPWM Compare Down Count Interrupt Enable Bits + * | | |0 = Compare down count interrupt Disabled. + * | | |1 = Compare down count interrupt Enabled. + * | | |Note: In complementary mode, CMPDIEN1, 3, 5 is used as another CMPDIEN for channel 0, 2, 4. + * |[28] |CMPDIEN4 |EPWM Compare Down Count Interrupt Enable Bits + * | | |0 = Compare down count interrupt Disabled. + * | | |1 = Compare down count interrupt Enabled. + * | | |Note: In complementary mode, CMPDIEN1, 3, 5 is used as another CMPDIEN for channel 0, 2, 4. + * |[29] |CMPDIEN5 |EPWM Compare Down Count Interrupt Enable Bits + * | | |0 = Compare down count interrupt Disabled. + * | | |1 = Compare down count interrupt Enabled. + * | | |Note: In complementary mode, CMPDIEN1, 3, 5 is used as another CMPDIEN for channel 0, 2, 4. + * @var EPWM_T::INTEN1 + * Offset: 0xE4 EPWM Interrupt Enable Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BRKEIEN0_1|EPWM Edge-detect Brake Interrupt Enable for Channel0/1 (Write Protect) + * | | |0 = Edge-detect Brake interrupt for channel0/1 Disabled. + * | | |1 = Edge-detect Brake interrupt for channel0/1 Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[1] |BRKEIEN2_3|EPWM Edge-detect Brake Interrupt Enable for Channel2/3 (Write Protect) + * | | |0 = Edge-detect Brake interrupt for channel2/3 Disabled. + * | | |1 = Edge-detect Brake interrupt for channel2/3 Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[2] |BRKEIEN4_5|EPWM Edge-detect Brake Interrupt Enable for Channel4/5 (Write Protect) + * | | |0 = Edge-detect Brake interrupt for channel4/5 Disabled. + * | | |1 = Edge-detect Brake interrupt for channel4/5 Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[8] |BRKLIEN0_1|EPWM Level-detect Brake Interrupt Enable for Channel0/1 (Write Protect) + * | | |0 = Level-detect Brake interrupt for channel0/1 Disabled. + * | | |1 = Level-detect Brake interrupt for channel0/1 Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[9] |BRKLIEN2_3|EPWM Level-detect Brake Interrupt Enable for Channel2/3 (Write Protect) + * | | |0 = Level-detect Brake interrupt for channel2/3 Disabled. + * | | |1 = Level-detect Brake interrupt for channel2/3 Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[10] |BRKLIEN4_5|EPWM Level-detect Brake Interrupt Enable for Channel4/5 (Write Protect) + * | | |0 = Level-detect Brake interrupt for channel4/5 Disabled. + * | | |1 = Level-detect Brake interrupt for channel4/5 Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * @var EPWM_T::INTSTS0 + * Offset: 0xE8 EPWM Interrupt Flag Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ZIF0 |EPWM Zero Point Interrupt Flag + * | | |This bit is set by hardware when EPWM counter reaches 0. + * | | |Note: This bit can be cleared to 0 by software writing 1 + * |[1] |ZIF1 |EPWM Zero Point Interrupt Flag + * | | |This bit is set by hardware when EPWM counter reaches 0. + * | | |Note: This bit can be cleared to 0 by software writing 1 + * |[2] |ZIF2 |EPWM Zero Point Interrupt Flag + * | | |This bit is set by hardware when EPWM counter reaches 0. + * | | |Note: This bit can be cleared to 0 by software writing 1 + * |[3] |ZIF3 |EPWM Zero Point Interrupt Flag + * | | |This bit is set by hardware when EPWM counter reaches 0. + * | | |Note: This bit can be cleared to 0 by software writing 1 + * |[4] |ZIF4 |EPWM Zero Point Interrupt Flag + * | | |This bit is set by hardware when EPWM counter reaches 0. + * | | |Note: This bit can be cleared to 0 by software writing 1 + * |[5] |ZIF5 |EPWM Zero Point Interrupt Flag + * | | |This bit is set by hardware when EPWM counter reaches 0. + * | | |Note: This bit can be cleared to 0 by software writing 1 + * |[8] |PIF0 |EPWM Period Point Interrupt Flag + * | | |This bit is set by hardware when EPWM counter reaches EPWM_PERIODn. + * | | |Note: This bit can be cleared to 0 by software writing 1. + * |[9] |PIF1 |EPWM Period Point Interrupt Flag + * | | |This bit is set by hardware when EPWM counter reaches EPWM_PERIODn. + * | | |Note: This bit can be cleared to 0 by software writing 1. + * |[10] |PIF2 |EPWM Period Point Interrupt Flag + * | | |This bit is set by hardware when EPWM counter reaches EPWM_PERIODn. + * | | |Note: This bit can be cleared to 0 by software writing 1. + * |[11] |PIF3 |EPWM Period Point Interrupt Flag + * | | |This bit is set by hardware when EPWM counter reaches EPWM_PERIODn. + * | | |Note: This bit can be cleared to 0 by software writing 1. + * |[12] |PIF4 |EPWM Period Point Interrupt Flag + * | | |This bit is set by hardware when EPWM counter reaches EPWM_PERIODn. + * | | |Note: This bit can be cleared to 0 by software writing 1. + * |[13] |PIF5 |EPWM Period Point Interrupt Flag + * | | |This bit is set by hardware when EPWM counter reaches EPWM_PERIODn. + * | | |Note: This bit can be cleared to 0 by software writing 1. + * |[16] |CMPUIF0 |EPWM Compare Up Count Interrupt Flag + * | | |Flag is set by hardware when EPWM counter up count and reaches EPWM_CMPDATn, software can clear this bit by writing 1 to it. + * | | |Note: In complementary mode, CMPUIF1, 3, 5 is used as another CMPUIF for channel 0, 2, 4. + * |[17] |CMPUIF1 |EPWM Compare Up Count Interrupt Flag + * | | |Flag is set by hardware when EPWM counter up count and reaches EPWM_CMPDATn, software can clear this bit by writing 1 to it. + * | | |Note: In complementary mode, CMPUIF1, 3, 5 is used as another CMPUIF for channel 0, 2, 4. + * |[18] |CMPUIF2 |EPWM Compare Up Count Interrupt Flag + * | | |Flag is set by hardware when EPWM counter up count and reaches EPWM_CMPDATn, software can clear this bit by writing 1 to it. + * | | |Note: In complementary mode, CMPUIF1, 3, 5 is used as another CMPUIF for channel 0, 2, 4. + * |[19] |CMPUIF3 |EPWM Compare Up Count Interrupt Flag + * | | |Flag is set by hardware when EPWM counter up count and reaches EPWM_CMPDATn, software can clear this bit by writing 1 to it. + * | | |Note: In complementary mode, CMPUIF1, 3, 5 is used as another CMPUIF for channel 0, 2, 4. + * |[20] |CMPUIF4 |EPWM Compare Up Count Interrupt Flag + * | | |Flag is set by hardware when EPWM counter up count and reaches EPWM_CMPDATn, software can clear this bit by writing 1 to it. + * | | |Note: In complementary mode, CMPUIF1, 3, 5 is used as another CMPUIF for channel 0, 2, 4. + * |[21] |CMPUIF5 |EPWM Compare Up Count Interrupt Flag + * | | |Flag is set by hardware when EPWM counter up count and reaches EPWM_CMPDATn, software can clear this bit by writing 1 to it. + * | | |Note: In complementary mode, CMPUIF1, 3, 5 is used as another CMPUIF for channel 0, 2, 4. + * |[24] |CMPDIF0 |EPWM Compare Down Count Interrupt Flag + * | | |Flag is set by hardware when EPWM counter down count and reaches EPWM_CMPDATn, software can clear this bit by writing 1 to it. + * | | |Note: In complementary mode, CMPDIF1, 3, 5 is used as another CMPDIF for channel 0, 2, 4. + * |[25] |CMPDIF1 |EPWM Compare Down Count Interrupt Flag + * | | |Flag is set by hardware when EPWM counter down count and reaches EPWM_CMPDATn, software can clear this bit by writing 1 to it. + * | | |Note: In complementary mode, CMPDIF1, 3, 5 is used as another CMPDIF for channel 0, 2, 4. + * |[26] |CMPDIF2 |EPWM Compare Down Count Interrupt Flag + * | | |Flag is set by hardware when EPWM counter down count and reaches EPWM_CMPDATn, software can clear this bit by writing 1 to it. + * | | |Note: In complementary mode, CMPDIF1, 3, 5 is used as another CMPDIF for channel 0, 2, 4. + * |[27] |CMPDIF3 |EPWM Compare Down Count Interrupt Flag + * | | |Flag is set by hardware when EPWM counter down count and reaches EPWM_CMPDATn, software can clear this bit by writing 1 to it. + * | | |Note: In complementary mode, CMPDIF1, 3, 5 is used as another CMPDIF for channel 0, 2, 4. + * |[28] |CMPDIF4 |EPWM Compare Down Count Interrupt Flag + * | | |Flag is set by hardware when EPWM counter down count and reaches EPWM_CMPDATn, software can clear this bit by writing 1 to it. + * | | |Note: In complementary mode, CMPDIF1, 3, 5 is used as another CMPDIF for channel 0, 2, 4. + * |[29] |CMPDIF5 |EPWM Compare Down Count Interrupt Flag + * | | |Flag is set by hardware when EPWM counter down count and reaches EPWM_CMPDATn, software can clear this bit by writing 1 to it. + * | | |Note: In complementary mode, CMPDIF1, 3, 5 is used as another CMPDIF for channel 0, 2, 4. + * @var EPWM_T::INTSTS1 + * Offset: 0xEC EPWM Interrupt Flag Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BRKEIF0 |EPWM Channel n Edge-detect Brake Interrupt Flag (Write Protect) + * | | |0 = EPWM channel n edge-detect brake event do not happened. + * | | |1 = When EPWM channel n edge-detect brake event happened, this bit is set to 1, writing 1 to clear. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[1] |BRKEIF1 |EPWM Channel n Edge-detect Brake Interrupt Flag (Write Protect) + * | | |0 = EPWM channel n edge-detect brake event do not happened. + * | | |1 = When EPWM channel n edge-detect brake event happened, this bit is set to 1, writing 1 to clear. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[2] |BRKEIF2 |EPWM Channel n Edge-detect Brake Interrupt Flag (Write Protect) + * | | |0 = EPWM channel n edge-detect brake event do not happened. + * | | |1 = When EPWM channel n edge-detect brake event happened, this bit is set to 1, writing 1 to clear. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[3] |BRKEIF3 |EPWM Channel n Edge-detect Brake Interrupt Flag (Write Protect) + * | | |0 = EPWM channel n edge-detect brake event do not happened. + * | | |1 = When EPWM channel n edge-detect brake event happened, this bit is set to 1, writing 1 to clear. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[4] |BRKEIF4 |EPWM Channel n Edge-detect Brake Interrupt Flag (Write Protect) + * | | |0 = EPWM channel n edge-detect brake event do not happened. + * | | |1 = When EPWM channel n edge-detect brake event happened, this bit is set to 1, writing 1 to clear. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[5] |BRKEIF5 |EPWM Channel n Edge-detect Brake Interrupt Flag (Write Protect) + * | | |0 = EPWM channel n edge-detect brake event do not happened. + * | | |1 = When EPWM channel n edge-detect brake event happened, this bit is set to 1, writing 1 to clear. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[8] |BRKLIF0 |EPWM Channel n Level-detect Brake Interrupt Flag (Write Protect) + * | | |0 = EPWM channel n level-detect brake event do not happened. + * | | |1 = When EPWM channel n level-detect brake event happened, this bit is set to 1, writing 1 to clear. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[9] |BRKLIF1 |EPWM Channel n Level-detect Brake Interrupt Flag (Write Protect) + * | | |0 = EPWM channel n level-detect brake event do not happened. + * | | |1 = When EPWM channel n level-detect brake event happened, this bit is set to 1, writing 1 to clear. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[10] |BRKLIF2 |EPWM Channel n Level-detect Brake Interrupt Flag (Write Protect) + * | | |0 = EPWM channel n level-detect brake event do not happened. + * | | |1 = When EPWM channel n level-detect brake event happened, this bit is set to 1, writing 1 to clear. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[11] |BRKLIF3 |EPWM Channel n Level-detect Brake Interrupt Flag (Write Protect) + * | | |0 = EPWM channel n level-detect brake event do not happened. + * | | |1 = When EPWM channel n level-detect brake event happened, this bit is set to 1, writing 1 to clear. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[12] |BRKLIF4 |EPWM Channel n Level-detect Brake Interrupt Flag (Write Protect) + * | | |0 = EPWM channel n level-detect brake event do not happened. + * | | |1 = When EPWM channel n level-detect brake event happened, this bit is set to 1, writing 1 to clear. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[13] |BRKLIF5 |EPWM Channel n Level-detect Brake Interrupt Flag (Write Protect) + * | | |0 = EPWM channel n level-detect brake event do not happened. + * | | |1 = When EPWM channel n level-detect brake event happened, this bit is set to 1, writing 1 to clear. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[16] |BRKESTS0 |EPWM Channel n Edge-detect Brake Status (Read Only) + * | | |0 = EPWM channel n edge-detect brake state is released. + * | | |1 = When EPWM channel n edge-detect brake detects a falling edge of any enabled brake source; this flag will be set to indicate the EPWM channel n at brake state. + * | | |Note: This bit is read only and auto cleared by hardware + * | | |When edge-detect brake interrupt flag is cleared, EPWM will release brake state until current EPWM period finished + * | | |The EPWM waveform will start output from next full EPWM period. + * |[17] |BRKESTS1 |EPWM Channel n Edge-detect Brake Status (Read Only) + * | | |0 = EPWM channel n edge-detect brake state is released. + * | | |1 = When EPWM channel n edge-detect brake detects a falling edge of any enabled brake source; this flag will be set to indicate the EPWM channel n at brake state. + * | | |Note: This bit is read only and auto cleared by hardware + * | | |When edge-detect brake interrupt flag is cleared, EPWM will release brake state until current EPWM period finished + * | | |The EPWM waveform will start output from next full EPWM period. + * |[18] |BRKESTS2 |EPWM Channel n Edge-detect Brake Status (Read Only) + * | | |0 = EPWM channel n edge-detect brake state is released. + * | | |1 = When EPWM channel n edge-detect brake detects a falling edge of any enabled brake source; this flag will be set to indicate the EPWM channel n at brake state. + * | | |Note: This bit is read only and auto cleared by hardware + * | | |When edge-detect brake interrupt flag is cleared, EPWM will release brake state until current EPWM period finished + * | | |The EPWM waveform will start output from next full EPWM period. + * |[19] |BRKESTS3 |EPWM Channel n Edge-detect Brake Status (Read Only) + * | | |0 = EPWM channel n edge-detect brake state is released. + * | | |1 = When EPWM channel n edge-detect brake detects a falling edge of any enabled brake source; this flag will be set to indicate the EPWM channel n at brake state. + * | | |Note: This bit is read only and auto cleared by hardware + * | | |When edge-detect brake interrupt flag is cleared, EPWM will release brake state until current EPWM period finished + * | | |The EPWM waveform will start output from next full EPWM period. + * |[20] |BRKESTS4 |EPWM Channel n Edge-detect Brake Status (Read Only) + * | | |0 = EPWM channel n edge-detect brake state is released. + * | | |1 = When EPWM channel n edge-detect brake detects a falling edge of any enabled brake source; this flag will be set to indicate the EPWM channel n at brake state. + * | | |Note: This bit is read only and auto cleared by hardware + * | | |When edge-detect brake interrupt flag is cleared, EPWM will release brake state until current EPWM period finished + * | | |The EPWM waveform will start output from next full EPWM period. + * |[21] |BRKESTS5 |EPWM Channel n Edge-detect Brake Status (Read Only) + * | | |0 = EPWM channel n edge-detect brake state is released. + * | | |1 = When EPWM channel n edge-detect brake detects a falling edge of any enabled brake source; this flag will be set to indicate the EPWM channel n at brake state. + * | | |Note: This bit is read only and auto cleared by hardware + * | | |When edge-detect brake interrupt flag is cleared, EPWM will release brake state until current EPWM period finished + * | | |The EPWM waveform will start output from next full EPWM period. + * |[24] |BRKLSTS0 |EPWM Channel n Level-detect Brake Status (Read Only) + * | | |0 = EPWM channel n level-detect brake state is released. + * | | |1 = When EPWM channel n level-detect brake detects a falling edge of any enabled brake source; this flag will be set to indicate the EPWM channel n at brake state. + * | | |Note: This bit is read only and auto cleared by hardware + * | | |When enabled brake source return to high level, EPWM will release brake state until current EPWM period finished + * | | |The EPWM waveform will start output from next full EPWM period. + * |[25] |BRKLSTS1 |EPWM Channel n Level-detect Brake Status (Read Only) + * | | |0 = EPWM channel n level-detect brake state is released. + * | | |1 = When EPWM channel n level-detect brake detects a falling edge of any enabled brake source; this flag will be set to indicate the EPWM channel n at brake state. + * | | |Note: This bit is read only and auto cleared by hardware + * | | |When enabled brake source return to high level, EPWM will release brake state until current EPWM period finished + * | | |The EPWM waveform will start output from next full EPWM period. + * |[26] |BRKLSTS2 |EPWM Channel n Level-detect Brake Status (Read Only) + * | | |0 = EPWM channel n level-detect brake state is released. + * | | |1 = When EPWM channel n level-detect brake detects a falling edge of any enabled brake source; this flag will be set to indicate the EPWM channel n at brake state. + * | | |Note: This bit is read only and auto cleared by hardware + * | | |When enabled brake source return to high level, EPWM will release brake state until current EPWM period finished + * | | |The EPWM waveform will start output from next full EPWM period. + * |[27] |BRKLSTS3 |EPWM Channel n Level-detect Brake Status (Read Only) + * | | |0 = EPWM channel n level-detect brake state is released. + * | | |1 = When EPWM channel n level-detect brake detects a falling edge of any enabled brake source; this flag will be set to indicate the EPWM channel n at brake state. + * | | |Note: This bit is read only and auto cleared by hardware + * | | |When enabled brake source return to high level, EPWM will release brake state until current EPWM period finished + * | | |The EPWM waveform will start output from next full EPWM period. + * |[28] |BRKLSTS4 |EPWM Channel n Level-detect Brake Status (Read Only) + * | | |0 = EPWM channel n level-detect brake state is released. + * | | |1 = When EPWM channel n level-detect brake detects a falling edge of any enabled brake source; this flag will be set to indicate the EPWM channel n at brake state. + * | | |Note: This bit is read only and auto cleared by hardware + * | | |When enabled brake source return to high level, EPWM will release brake state until current EPWM period finished + * | | |The EPWM waveform will start output from next full EPWM period. + * |[29] |BRKLSTS5 |EPWM Channel n Level-detect Brake Status (Read Only) + * | | |0 = EPWM channel n level-detect brake state is released. + * | | |1 = When EPWM channel n level-detect brake detects a falling edge of any enabled brake source; this flag will be set to indicate the EPWM channel n at brake state. + * | | |Note: This bit is read only and auto cleared by hardware + * | | |When enabled brake source return to high level, EPWM will release brake state until current EPWM period finished + * | | |The EPWM waveform will start output from next full EPWM period. + * @var EPWM_T::EADCTS0 + * Offset: 0xF8 EPWM Trigger EADC Source Select Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |TRGSEL0 |EPWM_CH0 Trigger EADC Source Select + * | | |0000 = EPWM_CH0 zero point. + * | | |0001 = EPWM_CH0 period point. + * | | |0010 = EPWM_CH0 zero or period point. + * | | |0011 = EPWM_CH0 up-count compared point. + * | | |0100 = EPWM_CH0 down-count compared point. + * | | |0101 = EPWM_CH1 zero point. + * | | |0110 = EPWM_CH1 period point. + * | | |0111 = EPWM_CH1 zero or period point. + * | | |1000 = EPWM_CH1 up-count compared point. + * | | |1001 = EPWM_CH1 down-count compared point. + * | | |1010 = EPWM_CH0 up-count free trigger compared point. + * | | |1011 = EPWM_CH0 down-count free trigger compared point. + * | | |1100 = EPWM_CH2 up-count free trigger compared point. + * | | |1101 = EPWM_CH2 down-count free trigger compared point. + * | | |1110 = EPWM_CH4 up-count free trigger compared point. + * | | |1111 = EPWM_CH4 down-count free trigger compared point. + * |[7] |TRGEN0 |EPWM_CH0 Trigger EADC Enable Bit + * | | |0 = EPWM_CH0 Trigger EADC function Disabled. + * | | |1 = EPWM_CH0 Trigger EADC function Enabled. + * |[11:8] |TRGSEL1 |EPWM_CH1 Trigger EADC Source Select + * | | |0000 = EPWM_CH0 zero point. + * | | |0001 = EPWM_CH0 period point. + * | | |0010 = EPWM_CH0 zero or period point. + * | | |0011 = EPWM_CH0 up-count compared point. + * | | |0100 = EPWM_CH0 down-count compared point. + * | | |0101 = EPWM_CH1 zero point. + * | | |0110 = EPWM_CH1 period point. + * | | |0111 = EPWM_CH1 zero or period point. + * | | |1000 = EPWM_CH1 up-count compared point. + * | | |1001 = EPWM_CH1 down-count compared point. + * | | |1010 = EPWM_CH0 up-count free trigger compared point. + * | | |1011 = EPWM_CH0 down-count free trigger compared point. + * | | |1100 = EPWM_CH2 up-count free trigger compared point. + * | | |1101 = EPWM_CH2 down-count free trigger compared point. + * | | |1110 = EPWM_CH4 up-count free trigger compared point. + * | | |1111 = EPWM_CH4 down-count free trigger compared point. + * |[15] |TRGEN1 |EPWM_CH1 Trigger EADC Enable Bit + * | | |0 = EPWM_CH1 Trigger EADC function Disabled. + * | | |1 = EPWM_CH1 Trigger EADC function Enabled. + * |[19:16] |TRGSEL2 |EPWM_CH2 Trigger EADC Source Select + * | | |0000 = EPWM_CH2 zero point. + * | | |0001 = EPWM_CH2 period point. + * | | |0010 = EPWM_CH2 zero or period point. + * | | |0011 = EPWM_CH2 up-count compared point. + * | | |0100 = EPWM_CH2 down-count compared point. + * | | |0101 = EPWM_CH3 zero point. + * | | |0110 = EPWM_CH3 period point. + * | | |0111 = EPWM_CH3 zero or period point. + * | | |1000 = EPWM_CH3 up-count compared point. + * | | |1001 = EPWM_CH3 down-count compared point. + * | | |1010 = EPWM_CH0 up-count free trigger compared point. + * | | |1011 = EPWM_CH0 down-count free trigger compared point. + * | | |1100 = EPWM_CH2 up-count free trigger compared point. + * | | |1101 = EPWM_CH2 down-count free trigger compared point. + * | | |1110 = EPWM_CH4 up-count free trigger compared point. + * | | |1111 = EPWM_CH4 down-count free trigger compared point. + * |[23] |TRGEN2 |EPWM_CH2 Trigger EADC Enable Bit + * | | |0 = EPWM_CH2 Trigger EADC function Disabled. + * | | |1 = EPWM_CH2 Trigger EADC function Enabled. + * |[27:24] |TRGSEL3 |EPWM_CH3 Trigger EADC Source Select + * | | |0000 = EPWM_CH2 zero point. + * | | |0001 = EPWM_CH2 period point. + * | | |0010 = EPWM_CH2 zero or period point. + * | | |0011 = EPWM_CH2 up-count compared point. + * | | |0100 = EPWM_CH2 down-count compared point. + * | | |0101 = EPWM_CH3 zero point. + * | | |0110 = EPWM_CH3 period point. + * | | |0111 = EPWM_CH3 zero or period point. + * | | |1000 = EPWM_CH3 up-count compared point. + * | | |1001 = EPWM_CH3 down-count compared point. + * | | |1010 = EPWM_CH0 up-count free trigger compared point. + * | | |1011 = EPWM_CH0 down-count free trigger compared point. + * | | |1100 = EPWM_CH2 up-count free trigger compared point. + * | | |1101 = EPWM_CH2 down-count free trigger compared point. + * | | |1110 = EPWM_CH4 up-count free trigger compared point. + * | | |1111 = EPWM_CH4 down-count free trigger compared point. + * |[31] |TRGEN3 |EPWM_CH3 Trigger EADC Enable Bit + * | | |0 = EPWM_CH3 Trigger EADC function Disabled. + * | | |1 = EPWM_CH3 Trigger EADC function Enabled. + * @var EPWM_T::EADCTS1 + * Offset: 0xFC EPWM Trigger EADC Source Select Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |TRGSEL4 |EPWM_CH4 Trigger EADC Source Select + * | | |0000 = EPWM_CH4 zero point. + * | | |0001 = EPWM_CH4 period point. + * | | |0010 = EPWM_CH4 zero or period point. + * | | |0011 = EPWM_CH4 up-count compared point. + * | | |0100 = EPWM_CH4 down-count compared point. + * | | |0101 = EPWM_CH5 zero point. + * | | |0110 = EPWM_CH5 period point. + * | | |0111 = EPWM_CH5 zero or period point. + * | | |1000 = EPWM_CH5 up-count compared point. + * | | |1001 = EPWM_CH5 down-count compared point. + * | | |1010 = EPWM_CH0 up-count free trigger compared point. + * | | |1011 = EPWM_CH0 down-count free trigger compared point. + * | | |1100 = EPWM_CH2 up-count free trigger compared point. + * | | |1101 = EPWM_CH2 down-count free trigger compared point. + * | | |1110 = EPWM_CH4 up-count free trigger compared point. + * | | |1111 = EPWM_CH4 down-count free trigger compared point. + * |[7] |TRGEN4 |EPWM_CH4 Trigger EADC Enable Bit + * | | |0 = EPWM_CH4 Trigger EADC function Disabled. + * | | |1 = EPWM_CH4 Trigger EADC function Enabled. + * |[11:8] |TRGSEL5 |EPWM_CH5 Trigger EADC Source Select + * | | |0000 = EPWM_CH4 zero point. + * | | |0001 = EPWM_CH4 period point. + * | | |0010 = EPWM_CH4 zero or period point. + * | | |0011 = EPWM_CH4 up-count compared point. + * | | |0100 = EPWM_CH4 down-count compared point. + * | | |0101 = EPWM_CH5 zero point. + * | | |0110 = EPWM_CH5 period point. + * | | |0111 = EPWM_CH5 zero or period point. + * | | |1000 = EPWM_CH5 up-count compared point. + * | | |1001 = EPWM_CH5 down-count compared point. + * | | |1010 = EPWM_CH0 up-count free trigger compared point. + * | | |1011 = EPWM_CH0 down-count free trigger compared point. + * | | |1100 = EPWM_CH2 up-count free trigger compared point. + * | | |1101 = EPWM_CH2 down-count free trigger compared point. + * | | |1110 = EPWM_CH4 up-count free trigger compared point. + * | | |1111 = EPWM_CH4 down-count free trigger compared point. + * |[15] |TRGEN5 |EPWM_CH5 Trigger EADC Enable Bit + * | | |0 = EPWM_CH5 Trigger EADC function Disabled. + * | | |1 = EPWM_CH5 Trigger EADC function Enabled. + * @var EPWM_T::FTCMPDAT0_1 + * Offset: 0x100 EPWM Free Trigger Compare Register 0/1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FTCMP |EPWM Free Trigger Compare Register + * | | |FTCMP uses to compare with even CNT (EPWM_CNTm[15:0], m=0,2,4) to trigger EADC + * | | |FTCMPDAT0, 2, 4 corresponding complementary pairs EPWM_CH0and EPWM_CH1, EPWM_CH2 and EPWM_CH3, EPWM_CH4 and EPWM_CH5. + * @var EPWM_T::FTCMPDAT2_3 + * Offset: 0x104 EPWM Free Trigger Compare Register 2/3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FTCMP |EPWM Free Trigger Compare Register + * | | |FTCMP uses to compare with even CNT (EPWM_CNTm[15:0], m=0,2,4) to trigger EADC + * | | |FTCMPDAT0, 2, 4 corresponding complementary pairs EPWM_CH0and EPWM_CH1, EPWM_CH2 and EPWM_CH3, EPWM_CH4 and EPWM_CH5. + * @var EPWM_T::FTCMPDAT4_5 + * Offset: 0x108 EPWM Free Trigger Compare Register 4/5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FTCMP |EPWM Free Trigger Compare Register + * | | |FTCMP uses to compare with even CNT (EPWM_CNTm[15:0], m=0,2,4) to trigger EADC + * | | |FTCMPDAT0, 2, 4 corresponding complementary pairs EPWM_CH0and EPWM_CH1, EPWM_CH2 and EPWM_CH3, EPWM_CH4 and EPWM_CH5. + * @var EPWM_T::SSCTL + * Offset: 0x110 EPWM Synchronous Start Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SSEN0 |EPWM Synchronous Start Function Enable Bits + * | | |When synchronous start function is enabled, the EPWM counter enable register (EPWM_CNTEN) can be enabled by writing EPWM synchronous start trigger bit (CNTSEN). + * | | |0 = EPWM synchronous start function Disabled. + * | | |1 = EPWM synchronous start function Enabled. + * |[1] |SSEN1 |EPWM Synchronous Start Function Enable Bits + * | | |When synchronous start function is enabled, the EPWM counter enable register (EPWM_CNTEN) can be enabled by writing EPWM synchronous start trigger bit (CNTSEN). + * | | |0 = EPWM synchronous start function Disabled. + * | | |1 = EPWM synchronous start function Enabled. + * |[2] |SSEN2 |EPWM Synchronous Start Function Enable Bits + * | | |When synchronous start function is enabled, the EPWM counter enable register (EPWM_CNTEN) can be enabled by writing EPWM synchronous start trigger bit (CNTSEN). + * | | |0 = EPWM synchronous start function Disabled. + * | | |1 = EPWM synchronous start function Enabled. + * |[3] |SSEN3 |EPWM Synchronous Start Function Enable Bits + * | | |When synchronous start function is enabled, the EPWM counter enable register (EPWM_CNTEN) can be enabled by writing EPWM synchronous start trigger bit (CNTSEN). + * | | |0 = EPWM synchronous start function Disabled. + * | | |1 = EPWM synchronous start function Enabled. + * |[4] |SSEN4 |EPWM Synchronous Start Function Enable Bits + * | | |When synchronous start function is enabled, the EPWM counter enable register (EPWM_CNTEN) can be enabled by writing EPWM synchronous start trigger bit (CNTSEN). + * | | |0 = EPWM synchronous start function Disabled. + * | | |1 = EPWM synchronous start function Enabled. + * |[5] |SSEN5 |EPWM Synchronous Start Function Enable Bits + * | | |When synchronous start function is enabled, the EPWM counter enable register (EPWM_CNTEN) can be enabled by writing EPWM synchronous start trigger bit (CNTSEN). + * | | |0 = EPWM synchronous start function Disabled. + * | | |1 = EPWM synchronous start function Enabled. + * |[9:8] |SSRC |EPWM Synchronous Start Source Select Bits + * | | |00 = Synchronous start source come from EPWM0. + * | | |01 = Synchronous start source come from EPWM1. + * | | |10 = Synchronous start source come from EPWM2. + * | | |11 = Reserved. + * @var EPWM_T::SSTRG + * Offset: 0x114 EPWM Synchronous Start Trigger Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CNTSEN |EPWM Counter Synchronous Start Enable (Write Only) + * | | |PMW counter synchronous enable function is used to make selected EPWM channels (include EPWM0_CHx and EPWM1_CHx) start counting at the same time. + * | | |Writing this bit to 1 will also set the counter enable bit (CNTENn, n denotes channel 0 to 5) if correlated EPWM channel counter synchronous start function is enabled. + * @var EPWM_T::LEBCTL + * Offset: 0x118 EPWM Leading Edge Blanking Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |LEBEN |EPWM Leading Edge Blanking Enable Bit + * | | |0 = EPWM Leading Edge Blanking Disabled. + * | | |1 = EPWM Leading Edge Blanking Enabled. + * |[8] |SRCEN0 |EPWM Leading Edge Blanking Source From EPWM_CH0 Enable Bit + * | | |0 = EPWM Leading Edge Blanking Source from EPWM_CH0 Disabled. + * | | |1 = EPWM Leading Edge Blanking Source from EPWM_CH0 Enabled. + * |[9] |SRCEN2 |EPWM Leading Edge Blanking Source From EPWM_CH2 Enable Bit + * | | |0 = EPWM Leading Edge Blanking Source from EPWM_CH2 Disabled. + * | | |1 = EPWM Leading Edge Blanking Source from EPWM_CH2 Enabled. + * |[10] |SRCEN4 |EPWM Leading Edge Blanking Source From EPWM_CH4 Enable Bit + * | | |0 = EPWM Leading Edge Blanking Source from EPWM_CH4 Disabled. + * | | |1 = EPWM Leading Edge Blanking Source from EPWM_CH4 Enabled. + * |[17:16] |TRGTYPE |EPWM Leading Edge Blanking Trigger Type + * | | |0 = When detect leading edge blanking source rising edge, blanking counter start counting. + * | | |1 = When detect leading edge blanking source falling edge, blanking counter start counting. + * | | |2 = When detect leading edge blanking source rising or falling edge, blanking counter start counting. + * | | |3 = Reserved. + * @var EPWM_T::LEBCNT + * Offset: 0x11C EPWM Leading Edge Blanking Counter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |LEBCNT |EPWM Leading Edge Blanking Counter + * | | |This counter value decides leading edge blanking window size + * | | |Blanking window size = LEBCNT+1, and LEB counter clock base is ECLK. + * @var EPWM_T::STATUS + * Offset: 0x120 EPWM Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CNTMAXF0 |Time-base Counter Equal to 0xFFFF Latched Flag + * | | |0 = The time-base counter never reached its maximum value 0xFFFF. + * | | |1 = The time-base counter reached its maximum value. + * | | |Note: This bit can be cleared by software writing 1. + * |[1] |CNTMAXF1 |Time-base Counter Equal to 0xFFFF Latched Flag + * | | |0 = The time-base counter never reached its maximum value 0xFFFF. + * | | |1 = The time-base counter reached its maximum value. + * | | |Note: This bit can be cleared by software writing 1. + * |[2] |CNTMAXF2 |Time-base Counter Equal to 0xFFFF Latched Flag + * | | |0 = The time-base counter never reached its maximum value 0xFFFF. + * | | |1 = The time-base counter reached its maximum value. + * | | |Note: This bit can be cleared by software writing 1. + * |[3] |CNTMAXF3 |Time-base Counter Equal to 0xFFFF Latched Flag + * | | |0 = The time-base counter never reached its maximum value 0xFFFF. + * | | |1 = The time-base counter reached its maximum value. + * | | |Note: This bit can be cleared by software writing 1. + * |[4] |CNTMAXF4 |Time-base Counter Equal to 0xFFFF Latched Flag + * | | |0 = The time-base counter never reached its maximum value 0xFFFF. + * | | |1 = The time-base counter reached its maximum value. + * | | |Note: This bit can be cleared by software writing 1. + * |[5] |CNTMAXF5 |Time-base Counter Equal to 0xFFFF Latched Flag + * | | |0 = The time-base counter never reached its maximum value 0xFFFF. + * | | |1 = The time-base counter reached its maximum value. + * | | |Note: This bit can be cleared by software writing 1. + * |[8] |SYNCINF0 |Input Synchronization Latched Flag + * | | |0 = No SYNC_IN event occurred. + * | | |1 = A SYNC_IN event occurred. + * | | |Note: This bit can be cleared by software writing 1. + * |[9] |SYNCINF2 |Input Synchronization Latched Flag + * | | |0 = No SYNC_IN event occurred. + * | | |1 = A SYNC_IN event occurred. + * | | |Note: This bit can be cleared by software writing 1. + * |[10] |SYNCINF4 |Input Synchronization Latched Flag + * | | |0 = No SYNC_IN event occurred. + * | | |1 = A SYNC_IN event occurred. + * | | |Note: This bit can be cleared by software writing 1. + * |[16] |EADCTRGF0 |EADC Start of Conversion Flag + * | | |0 = No EADC start of conversion trigger event occurred. + * | | |1 = An EADC start of conversion trigger event occurred. + * | | |Note: This bit can be cleared by software writing 1. + * |[17] |EADCTRGF1 |EADC Start of Conversion Flag + * | | |0 = No EADC start of conversion trigger event occurred. + * | | |1 = An EADC start of conversion trigger event occurred. + * | | |Note: This bit can be cleared by software writing 1. + * |[18] |EADCTRGF2 |EADC Start of Conversion Flag + * | | |0 = No EADC start of conversion trigger event occurred. + * | | |1 = An EADC start of conversion trigger event occurred. + * | | |Note: This bit can be cleared by software writing 1. + * |[19] |EADCTRGF3 |EADC Start of Conversion Flag + * | | |0 = No EADC start of conversion trigger event occurred. + * | | |1 = An EADC start of conversion trigger event occurred. + * | | |Note: This bit can be cleared by software writing 1. + * |[20] |EADCTRGF4 |EADC Start of Conversion Flag + * | | |0 = No EADC start of conversion trigger event occurred. + * | | |1 = An EADC start of conversion trigger event occurred. + * | | |Note: This bit can be cleared by software writing 1. + * |[21] |EADCTRGF5 |EADC Start of Conversion Flag + * | | |0 = No EADC start of conversion trigger event occurred. + * | | |1 = An EADC start of conversion trigger event occurred. + * | | |Note: This bit can be cleared by software writing 1. + * @var EPWM_T::IFA0 + * Offset: 0x130 EPWM Interrupt Flag Accumulator Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |IFACNT |EPWM_CHn Interrupt Flag Counter + * | | |The register sets the count number which defines how many times of EPWM_CHn period occurs to set bit IFAIFn to request the EPWM period interrupt. + * | | |EPWM flag will be set in every IFACNT[15:0] times of EPWM period. + * |[24] |STPMOD |EPWM_CHn Accumulator Stop Mode Enable Bits + * | | |0 = EPWM_CHn Stop Mode Disable. + * | | |1 = EPWM_CHn Stop Mode Enable. + * |[29:28] |IFASEL |EPWM_CHn Interrupt Flag Accumulator Source Select + * | | |00 = EPWM_CHn zero point. + * | | |01 = EPWM_CHn period in channel n. + * | | |10 = EPWM_CHn up-count compared point. + * | | |11 = EPWM_CHn down-count compared point. + * |[31] |IFAEN |EPWM_CHn Interrupt Flag Accumulator Enable Bits + * | | |0 = EPWM_CHn interrupt flag accumulator Disabled. + * | | |1 = EPWM_CHn interrupt flag accumulator Enabled. + * @var EPWM_T::IFA1 + * Offset: 0x134 EPWM Interrupt Flag Accumulator Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |IFACNT |EPWM_CHn Interrupt Flag Counter + * | | |The register sets the count number which defines how many times of EPWM_CHn period occurs to set bit IFAIFn to request the EPWM period interrupt. + * | | |EPWM flag will be set in every IFACNT[15:0] times of EPWM period. + * |[24] |STPMOD |EPWM_CHn Accumulator Stop Mode Enable Bits + * | | |0 = EPWM_CHn Stop Mode Disable. + * | | |1 = EPWM_CHn Stop Mode Enable. + * |[29:28] |IFASEL |EPWM_CHn Interrupt Flag Accumulator Source Select + * | | |00 = EPWM_CHn zero point. + * | | |01 = EPWM_CHn period in channel n. + * | | |10 = EPWM_CHn up-count compared point. + * | | |11 = EPWM_CHn down-count compared point. + * |[31] |IFAEN |EPWM_CHn Interrupt Flag Accumulator Enable Bits + * | | |0 = EPWM_CHn interrupt flag accumulator Disabled. + * | | |1 = EPWM_CHn interrupt flag accumulator Enabled. + * @var EPWM_T::IFA2 + * Offset: 0x138 EPWM Interrupt Flag Accumulator Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |IFACNT |EPWM_CHn Interrupt Flag Counter + * | | |The register sets the count number which defines how many times of EPWM_CHn period occurs to set bit IFAIFn to request the EPWM period interrupt. + * | | |EPWM flag will be set in every IFACNT[15:0] times of EPWM period. + * |[24] |STPMOD |EPWM_CHn Accumulator Stop Mode Enable Bits + * | | |0 = EPWM_CHn Stop Mode Disable. + * | | |1 = EPWM_CHn Stop Mode Enable. + * |[29:28] |IFASEL |EPWM_CHn Interrupt Flag Accumulator Source Select + * | | |00 = EPWM_CHn zero point. + * | | |01 = EPWM_CHn period in channel n. + * | | |10 = EPWM_CHn up-count compared point. + * | | |11 = EPWM_CHn down-count compared point. + * |[31] |IFAEN |EPWM_CHn Interrupt Flag Accumulator Enable Bits + * | | |0 = EPWM_CHn interrupt flag accumulator Disabled. + * | | |1 = EPWM_CHn interrupt flag accumulator Enabled. + * @var EPWM_T::IFA3 + * Offset: 0x13C EPWM Interrupt Flag Accumulator Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |IFACNT |EPWM_CHn Interrupt Flag Counter + * | | |The register sets the count number which defines how many times of EPWM_CHn period occurs to set bit IFAIFn to request the EPWM period interrupt. + * | | |EPWM flag will be set in every IFACNT[15:0] times of EPWM period. + * |[24] |STPMOD |EPWM_CHn Accumulator Stop Mode Enable Bits + * | | |0 = EPWM_CHn Stop Mode Disable. + * | | |1 = EPWM_CHn Stop Mode Enable. + * |[29:28] |IFASEL |EPWM_CHn Interrupt Flag Accumulator Source Select + * | | |00 = EPWM_CHn zero point. + * | | |01 = EPWM_CHn period in channel n. + * | | |10 = EPWM_CHn up-count compared point. + * | | |11 = EPWM_CHn down-count compared point. + * |[31] |IFAEN |EPWM_CHn Interrupt Flag Accumulator Enable Bits + * | | |0 = EPWM_CHn interrupt flag accumulator Disabled. + * | | |1 = EPWM_CHn interrupt flag accumulator Enabled. + * @var EPWM_T::IFA4 + * Offset: 0x140 EPWM Interrupt Flag Accumulator Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |IFACNT |EPWM_CHn Interrupt Flag Counter + * | | |The register sets the count number which defines how many times of EPWM_CHn period occurs to set bit IFAIFn to request the EPWM period interrupt. + * | | |EPWM flag will be set in every IFACNT[15:0] times of EPWM period. + * |[24] |STPMOD |EPWM_CHn Accumulator Stop Mode Enable Bits + * | | |0 = EPWM_CHn Stop Mode Disable. + * | | |1 = EPWM_CHn Stop Mode Enable. + * |[29:28] |IFASEL |EPWM_CHn Interrupt Flag Accumulator Source Select + * | | |00 = EPWM_CHn zero point. + * | | |01 = EPWM_CHn period in channel n. + * | | |10 = EPWM_CHn up-count compared point. + * | | |11 = EPWM_CHn down-count compared point. + * |[31] |IFAEN |EPWM_CHn Interrupt Flag Accumulator Enable Bits + * | | |0 = EPWM_CHn interrupt flag accumulator Disabled. + * | | |1 = EPWM_CHn interrupt flag accumulator Enabled. + * @var EPWM_T::IFA5 + * Offset: 0x144 EPWM Interrupt Flag Accumulator Register 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |IFACNT |EPWM_CHn Interrupt Flag Counter + * | | |The register sets the count number which defines how many times of EPWM_CHn period occurs to set bit IFAIFn to request the EPWM period interrupt. + * | | |EPWM flag will be set in every IFACNT[15:0] times of EPWM period. + * |[24] |STPMOD |EPWM_CHn Accumulator Stop Mode Enable Bits + * | | |0 = EPWM_CHn Stop Mode Disable. + * | | |1 = EPWM_CHn Stop Mode Enable. + * |[29:28] |IFASEL |EPWM_CHn Interrupt Flag Accumulator Source Select + * | | |00 = EPWM_CHn zero point. + * | | |01 = EPWM_CHn period in channel n. + * | | |10 = EPWM_CHn up-count compared point. + * | | |11 = EPWM_CHn down-count compared point. + * |[31] |IFAEN |EPWM_CHn Interrupt Flag Accumulator Enable Bits + * | | |0 = EPWM_CHn interrupt flag accumulator Disabled. + * | | |1 = EPWM_CHn interrupt flag accumulator Enabled. + * @var EPWM_T::AINTSTS + * Offset: 0x150 EPWM Accumulator Interrupt Flag Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |IFAIF0 |EPWM_CHn Interrupt Flag Accumulator Interrupt Flag + * | | |Flag is set by hardware when condition matches IFASEL in EPWM_IFAn register, software can clear this bit by writing 1 to it. + * |[1] |IFAIF1 |EPWM_CHn Interrupt Flag Accumulator Interrupt Flag + * | | |Flag is set by hardware when condition matches IFASEL in EPWM_IFAn register, software can clear this bit by writing 1 to it. + * |[2] |IFAIF2 |EPWM_CHn Interrupt Flag Accumulator Interrupt Flag + * | | |Flag is set by hardware when condition matches IFASEL in EPWM_IFAn register, software can clear this bit by writing 1 to it. + * |[3] |IFAIF3 |EPWM_CHn Interrupt Flag Accumulator Interrupt Flag + * | | |Flag is set by hardware when condition matches IFASEL in EPWM_IFAn register, software can clear this bit by writing 1 to it. + * |[4] |IFAIF4 |EPWM_CHn Interrupt Flag Accumulator Interrupt Flag + * | | |Flag is set by hardware when condition matches IFASEL in EPWM_IFAn register, software can clear this bit by writing 1 to it. + * |[5] |IFAIF5 |EPWM_CHn Interrupt Flag Accumulator Interrupt Flag + * | | |Flag is set by hardware when condition matches IFASEL in EPWM_IFAn register, software can clear this bit by writing 1 to it. + * @var EPWM_T::AINTEN + * Offset: 0x154 EPWM Accumulator Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |IFAIEN0 |EPWM_CHn Interrupt Flag Accumulator Interrupt Enable Bits + * | | |0 = Interrupt Flag accumulator interrupt Disabled. + * | | |1 = Interrupt Flag accumulator interrupt Enabled. + * |[1] |IFAIEN1 |EPWM_CHn Interrupt Flag Accumulator Interrupt Enable Bits + * | | |0 = Interrupt Flag accumulator interrupt Disabled. + * | | |1 = Interrupt Flag accumulator interrupt Enabled. + * |[2] |IFAIEN2 |EPWM_CHn Interrupt Flag Accumulator Interrupt Enable Bits + * | | |0 = Interrupt Flag accumulator interrupt Disabled. + * | | |1 = Interrupt Flag accumulator interrupt Enabled. + * |[3] |IFAIEN3 |EPWM_CHn Interrupt Flag Accumulator Interrupt Enable Bits + * | | |0 = Interrupt Flag accumulator interrupt Disabled. + * | | |1 = Interrupt Flag accumulator interrupt Enabled. + * |[4] |IFAIEN4 |EPWM_CHn Interrupt Flag Accumulator Interrupt Enable Bits + * | | |0 = Interrupt Flag accumulator interrupt Disabled. + * | | |1 = Interrupt Flag accumulator interrupt Enabled. + * |[5] |IFAIEN5 |EPWM_CHn Interrupt Flag Accumulator Interrupt Enable Bits + * | | |0 = Interrupt Flag accumulator interrupt Disabled. + * | | |1 = Interrupt Flag accumulator interrupt Enabled. + * @var EPWM_T::APDMACTL + * Offset: 0x158 EPWM Accumulator PDMA Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |APDMAEN0 |Channel n Accumulator PDMA Enable Bits + * | | |0 = Channel n PDMA function Disabled. + * | | |1 = Channel n PDMA function Enabled for the channel n to trigger PDMA to transfer memory data to register. + * |[1] |APDMAEN1 |Channel n Accumulator PDMA Enable Bits + * | | |0 = Channel n PDMA function Disabled. + * | | |1 = Channel n PDMA function Enabled for the channel n to trigger PDMA to transfer memory data to register. + * |[2] |APDMAEN2 |Channel n Accumulator PDMA Enable Bits + * | | |0 = Channel n PDMA function Disabled. + * | | |1 = Channel n PDMA function Enabled for the channel n to trigger PDMA to transfer memory data to register. + * |[3] |APDMAEN3 |Channel n Accumulator PDMA Enable Bits + * | | |0 = Channel n PDMA function Disabled. + * | | |1 = Channel n PDMA function Enabled for the channel n to trigger PDMA to transfer memory data to register. + * |[4] |APDMAEN4 |Channel n Accumulator PDMA Enable Bits + * | | |0 = Channel n PDMA function Disabled. + * | | |1 = Channel n PDMA function Enabled for the channel n to trigger PDMA to transfer memory data to register. + * |[5] |APDMAEN5 |Channel n Accumulator PDMA Enable Bits + * | | |0 = Channel n PDMA function Disabled. + * | | |1 = Channel n PDMA function Enabled for the channel n to trigger PDMA to transfer memory data to register. + * @var EPWM_T::FDEN + * Offset: 0x160 EPWM Fault Detect Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |FDEN0 |EPWM Fault Detect Function Enable Bit + * | | |0 = Fault detect function Disable. + * | | |1 = Fault detect function Enable. + * |[1] |FDEN1 |EPWM Fault Detect Function Enable Bit + * | | |0 = Fault detect function Disable. + * | | |1 = Fault detect function Enable. + * |[2] |FDEN2 |EPWM Fault Detect Function Enable Bit + * | | |0 = Fault detect function Disable. + * | | |1 = Fault detect function Enable. + * |[3] |FDEN3 |EPWM Fault Detect Function Enable Bit + * | | |0 = Fault detect function Disable. + * | | |1 = Fault detect function Enable. + * |[4] |FDEN4 |EPWM Fault Detect Function Enable Bit + * | | |0 = Fault detect function Disable. + * | | |1 = Fault detect function Enable. + * |[5] |FDEN5 |EPWM Fault Detect Function Enable Bit + * | | |0 = Fault detect function Disable. + * | | |1 = Fault detect function Enable. + * |[8] |FDODIS0 |EPWM Channel n Output Fault Detect Disable Bit + * | | |0 = EPWM detect fault and output Enable. + * | | |1 = EPWM detect fault and output Disable. + * |[9] |FDODIS1 |EPWM Channel n Output Fault Detect Disable Bit + * | | |0 = EPWM detect fault and output Enable. + * | | |1 = EPWM detect fault and output Disable. + * |[10] |FDODIS2 |EPWM Channel n Output Fault Detect Disable Bit + * | | |0 = EPWM detect fault and output Enable. + * | | |1 = EPWM detect fault and output Disable. + * |[11] |FDODIS3 |EPWM Channel n Output Fault Detect Disable Bit + * | | |0 = EPWM detect fault and output Enable. + * | | |1 = EPWM detect fault and output Disable. + * |[12] |FDODIS4 |EPWM Channel n Output Fault Detect Disable Bit + * | | |0 = EPWM detect fault and output Enable. + * | | |1 = EPWM detect fault and output Disable. + * |[13] |FDODIS5 |EPWM Channel n Output Fault Detect Disable Bit + * | | |0 = EPWM detect fault and output Enable. + * | | |1 = EPWM detect fault and output Disable. + * |[16] |FDCKS0 |EPWM Channel n Fault Detect Clock Source Select Bit + * | | |0 = EPWMx_CLK, x denotes 0, 1or 2. + * | | |1 = EPWMx_CLK divide by prescaler, x denotes 0, 1 or 2. + * |[17] |FDCKS1 |EPWM Channel n Fault Detect Clock Source Select Bit + * | | |0 = EPWMx_CLK, x denotes 0, 1or 2. + * | | |1 = EPWMx_CLK divide by prescaler, x denotes 0, 1 or 2. + * |[18] |FDCKS2 |EPWM Channel n Fault Detect Clock Source Select Bit + * | | |0 = EPWMx_CLK, x denotes 0, 1or 2. + * | | |1 = EPWMx_CLK divide by prescaler, x denotes 0, 1 or 2. + * |[19] |FDCKS3 |EPWM Channel n Fault Detect Clock Source Select Bit + * | | |0 = EPWMx_CLK, x denotes 0, 1or 2. + * | | |1 = EPWMx_CLK divide by prescaler, x denotes 0, 1 or 2. + * |[20] |FDCKS4 |EPWM Channel n Fault Detect Clock Source Select Bit + * | | |0 = EPWMx_CLK, x denotes 0, 1or 2. + * | | |1 = EPWMx_CLK divide by prescaler, x denotes 0, 1 or 2. + * |[21] |FDCKS5 |EPWM Channel n Fault Detect Clock Source Select Bit + * | | |0 = EPWMx_CLK, x denotes 0, 1or 2. + * | | |1 = EPWMx_CLK divide by prescaler, x denotes 0, 1 or 2. + * @var EPWM_T::FDCTL0 + * Offset: 0x164 EPWM Fault Detect Control Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |TRMSKCNT |Transition Mask Counter + * | | |The fault detect result will be masked before counter count from 0 to TRMSKCNT. + * | | |FDCKS is set to 0: + * | | |Mask time is EPWMx_CLK * (2^FDCKSEL) * (TRMSKCNT +2) + * | | |FDCKS is set to 1: + * | | |Mask time EPWMx_CLK * CLKPSC * (2^FDCKSEL) * (TRMSKCNT +2) + * | | |Note: + * | | |CLKPSC (EPWM_CLKPSC) is 0: + * | | |TRMSKCNT >= DGSMPCYC + 2. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 1: + * | | |TRMSKCNT >= DGSMPCYC + 1. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 2: + * | | |TRMSKCNT >= DGSMPCYC. + * |[15] |FDMSKEN |Fault Detect Mask Enable Bit + * | | |0 = Fault detect mask function Disabled. + * | | |1 = Fault detect mask function Enabled. + * |[18:16] |DGSMPCYC |Deglitch Sampling Cycle + * | | |FDCKS is set to 0: + * | | |Sampling detect signal each EPWMx_CLK * (2^FDCKSEL) period and detect DGSMPCYC+1 times + * | | |FDCKS is set to 1: + * | | |Sampling detect signal each EPWMx_CLK * CLKPSC * (2^FDCKSEL) period and detect DGSMPCYC+1 times + * | | |Note: + * | | |CLKPSC (EPWM_CLKPSC) is 0: + * | | |TRMSKCNT >= DGSMPCYC + 2. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 1: + * | | |TRMSKCNT >= DGSMPCYC + 1. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 2: + * | | |TRMSKCNT >= DGSMPCYC. + * |[29:28] |FDCKSEL |EPWM Channel Fault Detect Clock Select + * | | |00 = FLT_CLK/1. + * | | |01 = FLT_CLK/2. + * | | |10 = FLT_CLK/4. + * | | |11 = FLT_CLK/8. + * | | |Note: FLT_CLK is FDCKSn (EPWM_FDENn[16+n], n=0,1..5) selected clock. + * |[31] |FDDGEN |Fault Detect Deglitch Enable Bit + * | | |0 = Fault detect deglitch function Disable. + * | | |1 = Fault detect deglitch function Enable. + * @var EPWM_T::FDCTL1 + * Offset: 0x168 EPWM Fault Detect Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |TRMSKCNT |Transition Mask Counter + * | | |The fault detect result will be masked before counter count from 0 to TRMSKCNT. + * | | |FDCKS is set to 0: + * | | |Mask time is EPWMx_CLK * (2^FDCKSEL) * (TRMSKCNT +2) + * | | |FDCKS is set to 1: + * | | |Mask time EPWMx_CLK * CLKPSC * (2^FDCKSEL) * (TRMSKCNT +2) + * | | |Note: + * | | |CLKPSC (EPWM_CLKPSC) is 0: + * | | |TRMSKCNT >= DGSMPCYC + 2. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 1: + * | | |TRMSKCNT >= DGSMPCYC + 1. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 2: + * | | |TRMSKCNT >= DGSMPCYC. + * |[15] |FDMSKEN |Fault Detect Mask Enable Bit + * | | |0 = Fault detect mask function Disabled. + * | | |1 = Fault detect mask function Enabled. + * |[18:16] |DGSMPCYC |Deglitch Sampling Cycle + * | | |FDCKS is set to 0: + * | | |Sampling detect signal each EPWMx_CLK * (2^FDCKSEL) period and detect DGSMPCYC+1 times + * | | |FDCKS is set to 1: + * | | |Sampling detect signal each EPWMx_CLK * CLKPSC * (2^FDCKSEL) period and detect DGSMPCYC+1 times + * | | |Note: + * | | |CLKPSC (EPWM_CLKPSC) is 0: + * | | |TRMSKCNT >= DGSMPCYC + 2. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 1: + * | | |TRMSKCNT >= DGSMPCYC + 1. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 2: + * | | |TRMSKCNT >= DGSMPCYC. + * |[29:28] |FDCKSEL |EPWM Channel Fault Detect Clock Select + * | | |00 = FLT_CLK/1. + * | | |01 = FLT_CLK/2. + * | | |10 = FLT_CLK/4. + * | | |11 = FLT_CLK/8. + * | | |Note: FLT_CLK is FDCKSn (EPWM_FDENn[16+n], n=0,1..5) selected clock. + * |[31] |FDDGEN |Fault Detect Deglitch Enable Bit + * | | |0 = Fault detect deglitch function Disable. + * | | |1 = Fault detect deglitch function Enable. + * @var EPWM_T::FDCTL2 + * Offset: 0x16C EPWM Fault Detect Control Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |TRMSKCNT |Transition Mask Counter + * | | |The fault detect result will be masked before counter count from 0 to TRMSKCNT. + * | | |FDCKS is set to 0: + * | | |Mask time is EPWMx_CLK * (2^FDCKSEL) * (TRMSKCNT +2) + * | | |FDCKS is set to 1: + * | | |Mask time EPWMx_CLK * CLKPSC * (2^FDCKSEL) * (TRMSKCNT +2) + * | | |Note: + * | | |CLKPSC (EPWM_CLKPSC) is 0: + * | | |TRMSKCNT >= DGSMPCYC + 2. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 1: + * | | |TRMSKCNT >= DGSMPCYC + 1. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 2: + * | | |TRMSKCNT >= DGSMPCYC. + * |[15] |FDMSKEN |Fault Detect Mask Enable Bit + * | | |0 = Fault detect mask function Disabled. + * | | |1 = Fault detect mask function Enabled. + * |[18:16] |DGSMPCYC |Deglitch Sampling Cycle + * | | |FDCKS is set to 0: + * | | |Sampling detect signal each EPWMx_CLK * (2^FDCKSEL) period and detect DGSMPCYC+1 times + * | | |FDCKS is set to 1: + * | | |Sampling detect signal each EPWMx_CLK * CLKPSC * (2^FDCKSEL) period and detect DGSMPCYC+1 times + * | | |Note: + * | | |CLKPSC (EPWM_CLKPSC) is 0: + * | | |TRMSKCNT >= DGSMPCYC + 2. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 1: + * | | |TRMSKCNT >= DGSMPCYC + 1. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 2: + * | | |TRMSKCNT >= DGSMPCYC. + * |[29:28] |FDCKSEL |EPWM Channel Fault Detect Clock Select + * | | |00 = FLT_CLK/1. + * | | |01 = FLT_CLK/2. + * | | |10 = FLT_CLK/4. + * | | |11 = FLT_CLK/8. + * | | |Note: FLT_CLK is FDCKSn (EPWM_FDENn[16+n], n=0,1..5) selected clock. + * |[31] |FDDGEN |Fault Detect Deglitch Enable Bit + * | | |0 = Fault detect deglitch function Disable. + * | | |1 = Fault detect deglitch function Enable. + * @var EPWM_T::FDCTL3 + * Offset: 0x170 EPWM Fault Detect Control Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |TRMSKCNT |Transition Mask Counter + * | | |The fault detect result will be masked before counter count from 0 to TRMSKCNT. + * | | |FDCKS is set to 0: + * | | |Mask time is EPWMx_CLK * (2^FDCKSEL) * (TRMSKCNT +2) + * | | |FDCKS is set to 1: + * | | |Mask time EPWMx_CLK * CLKPSC * (2^FDCKSEL) * (TRMSKCNT +2) + * | | |Note: + * | | |CLKPSC (EPWM_CLKPSC) is 0: + * | | |TRMSKCNT >= DGSMPCYC + 2. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 1: + * | | |TRMSKCNT >= DGSMPCYC + 1. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 2: + * | | |TRMSKCNT >= DGSMPCYC. + * |[15] |FDMSKEN |Fault Detect Mask Enable Bit + * | | |0 = Fault detect mask function Disabled. + * | | |1 = Fault detect mask function Enabled. + * |[18:16] |DGSMPCYC |Deglitch Sampling Cycle + * | | |FDCKS is set to 0: + * | | |Sampling detect signal each EPWMx_CLK * (2^FDCKSEL) period and detect DGSMPCYC+1 times + * | | |FDCKS is set to 1: + * | | |Sampling detect signal each EPWMx_CLK * CLKPSC * (2^FDCKSEL) period and detect DGSMPCYC+1 times + * | | |Note: + * | | |CLKPSC (EPWM_CLKPSC) is 0: + * | | |TRMSKCNT >= DGSMPCYC + 2. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 1: + * | | |TRMSKCNT >= DGSMPCYC + 1. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 2: + * | | |TRMSKCNT >= DGSMPCYC. + * |[29:28] |FDCKSEL |EPWM Channel Fault Detect Clock Select + * | | |00 = FLT_CLK/1. + * | | |01 = FLT_CLK/2. + * | | |10 = FLT_CLK/4. + * | | |11 = FLT_CLK/8. + * | | |Note: FLT_CLK is FDCKSn (EPWM_FDENn[16+n], n=0,1..5) selected clock. + * |[31] |FDDGEN |Fault Detect Deglitch Enable Bit + * | | |0 = Fault detect deglitch function Disable. + * | | |1 = Fault detect deglitch function Enable. + * @var EPWM_T::FDCTL4 + * Offset: 0x174 EPWM Fault Detect Control Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |TRMSKCNT |Transition Mask Counter + * | | |The fault detect result will be masked before counter count from 0 to TRMSKCNT. + * | | |FDCKS is set to 0: + * | | |Mask time is EPWMx_CLK * (2^FDCKSEL) * (TRMSKCNT +2) + * | | |FDCKS is set to 1: + * | | |Mask time EPWMx_CLK * CLKPSC * (2^FDCKSEL) * (TRMSKCNT +2) + * | | |Note: + * | | |CLKPSC (EPWM_CLKPSC) is 0: + * | | |TRMSKCNT >= DGSMPCYC + 2. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 1: + * | | |TRMSKCNT >= DGSMPCYC + 1. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 2: + * | | |TRMSKCNT >= DGSMPCYC. + * |[15] |FDMSKEN |Fault Detect Mask Enable Bit + * | | |0 = Fault detect mask function Disabled. + * | | |1 = Fault detect mask function Enabled. + * |[18:16] |DGSMPCYC |Deglitch Sampling Cycle + * | | |FDCKS is set to 0: + * | | |Sampling detect signal each EPWMx_CLK * (2^FDCKSEL) period and detect DGSMPCYC+1 times + * | | |FDCKS is set to 1: + * | | |Sampling detect signal each EPWMx_CLK * CLKPSC * (2^FDCKSEL) period and detect DGSMPCYC+1 times + * | | |Note: + * | | |CLKPSC (EPWM_CLKPSC) is 0: + * | | |TRMSKCNT >= DGSMPCYC + 2. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 1: + * | | |TRMSKCNT >= DGSMPCYC + 1. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 2: + * | | |TRMSKCNT >= DGSMPCYC. + * |[29:28] |FDCKSEL |EPWM Channel Fault Detect Clock Select + * | | |00 = FLT_CLK/1. + * | | |01 = FLT_CLK/2. + * | | |10 = FLT_CLK/4. + * | | |11 = FLT_CLK/8. + * | | |Note: FLT_CLK is FDCKSn (EPWM_FDENn[16+n], n=0,1..5) selected clock. + * |[31] |FDDGEN |Fault Detect Deglitch Enable Bit + * | | |0 = Fault detect deglitch function Disable. + * | | |1 = Fault detect deglitch function Enable. + * @var EPWM_T::FDCTL5 + * Offset: 0x178 EPWM Fault Detect Control Register 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |TRMSKCNT |Transition Mask Counter + * | | |The fault detect result will be masked before counter count from 0 to TRMSKCNT. + * | | |FDCKS is set to 0: + * | | |Mask time is EPWMx_CLK * (2^FDCKSEL) * (TRMSKCNT +2) + * | | |FDCKS is set to 1: + * | | |Mask time EPWMx_CLK * CLKPSC * (2^FDCKSEL) * (TRMSKCNT +2) + * | | |Note: + * | | |CLKPSC (EPWM_CLKPSC) is 0: + * | | |TRMSKCNT >= DGSMPCYC + 2. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 1: + * | | |TRMSKCNT >= DGSMPCYC + 1. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 2: + * | | |TRMSKCNT >= DGSMPCYC. + * |[15] |FDMSKEN |Fault Detect Mask Enable Bit + * | | |0 = Fault detect mask function Disabled. + * | | |1 = Fault detect mask function Enabled. + * |[18:16] |DGSMPCYC |Deglitch Sampling Cycle + * | | |FDCKS is set to 0: + * | | |Sampling detect signal each EPWMx_CLK * (2^FDCKSEL) period and detect DGSMPCYC+1 times + * | | |FDCKS is set to 1: + * | | |Sampling detect signal each EPWMx_CLK * CLKPSC * (2^FDCKSEL) period and detect DGSMPCYC+1 times + * | | |Note: + * | | |CLKPSC (EPWM_CLKPSC) is 0: + * | | |TRMSKCNT >= DGSMPCYC + 2. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 1: + * | | |TRMSKCNT >= DGSMPCYC + 1. + * | | |FDCKS is 1 and CLKPSC (EPWM_CLKPSC) is 2: + * | | |TRMSKCNT >= DGSMPCYC. + * |[29:28] |FDCKSEL |EPWM Channel Fault Detect Clock Select + * | | |00 = FLT_CLK/1. + * | | |01 = FLT_CLK/2. + * | | |10 = FLT_CLK/4. + * | | |11 = FLT_CLK/8. + * | | |Note: FLT_CLK is FDCKSn (EPWM_FDENn[16+n], n=0,1..5) selected clock. + * |[31] |FDDGEN |Fault Detect Deglitch Enable Bit + * | | |0 = Fault detect deglitch function Disable. + * | | |1 = Fault detect deglitch function Enable. + * @var EPWM_T::FDIEN + * Offset: 0x17C EPWM Fault Detect Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |FDIENn |EPWM Channel n Fault Detect Interrupt Enable Bit + * | | |0 = EPWM Channel n Fault Detect Interrupt Disabled. + * | | |1 = EPWM Channel n Fault Detect Interrupt Enabled. + * @var EPWM_T::FDSTS + * Offset: 0x180 EPWM Fault Detect Interrupt Flag Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |FDIFn |EPWM Channel n Fault Detect Interrupt Flag Bit + * | | |Fault Detect Interrupt Flag will be set when EPWM output short + * | | |Software can clear this bit by writing 1 to it. + * @var EPWM_T::EADCPSCCTL + * Offset: 0x184 EPWM Trigger EADC Prescale Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PSCEN0 |EPWM Trigger EADC Pre-scale Function Enable Bits + * | | |0 = EPWM Trigger EADC Pre-scale Function Disabled. + * | | |1 = EPWM Trigger EADC Pre-scale Function Enabled. + * |[1] |PSCEN1 |EPWM Trigger EADC Pre-scale Function Enable Bits + * | | |0 = EPWM Trigger EADC Pre-scale Function Disabled. + * | | |1 = EPWM Trigger EADC Pre-scale Function Enabled. + * |[2] |PSCEN2 |EPWM Trigger EADC Pre-scale Function Enable Bits + * | | |0 = EPWM Trigger EADC Pre-scale Function Disabled. + * | | |1 = EPWM Trigger EADC Pre-scale Function Enabled. + * |[3] |PSCEN3 |EPWM Trigger EADC Pre-scale Function Enable Bits + * | | |0 = EPWM Trigger EADC Pre-scale Function Disabled. + * | | |1 = EPWM Trigger EADC Pre-scale Function Enabled. + * |[4] |PSCEN4 |EPWM Trigger EADC Pre-scale Function Enable Bits + * | | |0 = EPWM Trigger EADC Pre-scale Function Disabled. + * | | |1 = EPWM Trigger EADC Pre-scale Function Enabled. + * |[5] |PSCEN5 |EPWM Trigger EADC Pre-scale Function Enable Bits + * | | |0 = EPWM Trigger EADC Pre-scale Function Disabled. + * | | |1 = EPWM Trigger EADC Pre-scale Function Enabled. + * @var EPWM_T::EADCPSC0 + * Offset: 0x188 EPWM Trigger EADC Prescale Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |EADCPSC0 |EPWM Channel 0 Trigger EADC Prescale + * | | |The register sets the count number which defines (EADCPSC0+1) times of EPWM_CH0 trigger EADC event occurs to trigger EADC and set trigger EADC flag bit EADCTRGF0. + * |[11:8] |EADCPSC1 |EPWM Channel 1 Trigger EADC Prescale + * | | |The register sets the count number which defines (EADCPSC1+1) times of EPWM_CH1 trigger EADC event occurs to trigger EADC and set trigger EADC flag bit EADCTRGF1. + * |[19:16] |EADCPSC2 |EPWM Channel 2 Trigger EADC Prescale + * | | |The register sets the count number which defines (EADCPSC2+1) times of EPWM_CH2 trigger EADC event occurs to trigger EADC and set trigger EADC flag bit EADCTRGF3. + * |[27:24] |EADCPSC3 |EPWM Channel 3 Trigger EADC Prescale + * | | |The register sets the count number which defines (EADCPSC3+1) times of EPWM_CH3 trigger EADC event occurs to trigger EADC and set trigger EADC flag bit EADCTRGF3. + * @var EPWM_T::EADCPSC1 + * Offset: 0x18C EPWM Trigger EADC Prescale Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |EADCPSC4 |EPWM Channel 4 Trigger EADC Prescale + * | | |The register sets the count number which defines (EADCPSC4+1) times of EPWM_CH3 trigger EADC event occurs to trigger EADC and set trigger EADC flag bit EADCTRGF4. + * |[11:8] |EADCPSC5 |EPWM Channel 5 Trigger EADC Prescale + * | | |The register sets the count number which defines (EADCPSC5+1) times of EPWM_CH3 trigger EADC event occurs to trigger EADC and set trigger EADC flag bit EADCTRGF5. + * @var EPWM_T::EADCPSCNT0 + * Offset: 0x190 EPWM Trigger EADC Prescale Counter Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PSCNT0 |EPWM Trigger EADC Prescale Counter 0 + * | | |User can monitor PSCNT0 to know the current value in 4-bit trigger EADC prescale counter. + * | | |Note 1: user can write only when PSCEN0 is 0. + * | | |Note 2: Write data limitation: PSCNT0 < EADCPSC0. + * |[11:8] |PSCNT1 |EPWM Trigger EADC Prescale Counter 1 + * | | |User can monitor PSCNT1 to know the current value in 4-bit trigger EADC prescale counter. + * | | |Note 1: user can write only when PSCEN1 is 0. + * | | |Note 2: Write data limitation: PSCNT1 < EADCPSC1. + * |[19:16] |PSCNT2 |EPWM Trigger EADC Prescale Counter 2 + * | | |User can monitor PSCNT2 to know the current value in 4-bit trigger EADC prescale counter. + * | | |Note 1: user can write only when PSCEN2 is 0. + * | | |Note 2: Write data limitation: PSCNT2 < EADCPSC2. + * |[27:24] |PSCNT3 |EPWM Trigger EADC Prescale Counter 3 + * | | |User can monitor PSCNT3 to know the current value in 4-bit trigger EADC prescale counter. + * | | |Note 1: user can write only when PSCEN3 is 0. + * | | |Note 2: Write data limitation: PSCNT3 < EADCPSC3. + * @var EPWM_T::EADCPSCNT1 + * Offset: 0x194 EPWM Trigger EADC Prescale Counter Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PSCNT4 |EPWM Trigger EADC Prescale Counter 4 + * | | |User can monitor PSCNT4 to know the current value in 4-bit trigger EADC prescale counter. + * | | |Note 1: user can write only when PSCEN4 is 0. + * | | |Note 2: Write data limitation: PSCNT4 < EADCPSC4. + * |[11:8] |PSCNT5 |EPWM Trigger EADC Prescale Counter 5 + * | | |User can monitor PSCNT5 to know the current value in 4-bit trigger EADC prescale counter. + * | | |Note 1: user can write only when PSCEN5 is 0. + * | | |Note 2: Write data limitation: PSCNT5 < EADCPSC5. + * @var EPWM_T::CAPINEN + * Offset: 0x200 EPWM Capture Input Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CAPINEN0 |Capture Input Enable Bits + * | | |0 = EPWM Channel capture input path Disabled + * | | |The input of EPWM channel capture function is always regarded as 0. + * | | |1 = EPWM Channel capture input path Enabled + * | | |The input of EPWM channel capture function comes from correlative multifunction pin. + * |[1] |CAPINEN1 |Capture Input Enable Bits + * | | |0 = EPWM Channel capture input path Disabled + * | | |The input of EPWM channel capture function is always regarded as 0. + * | | |1 = EPWM Channel capture input path Enabled + * | | |The input of EPWM channel capture function comes from correlative multifunction pin. + * |[2] |CAPINEN2 |Capture Input Enable Bits + * | | |0 = EPWM Channel capture input path Disabled + * | | |The input of EPWM channel capture function is always regarded as 0. + * | | |1 = EPWM Channel capture input path Enabled + * | | |The input of EPWM channel capture function comes from correlative multifunction pin. + * |[3] |CAPINEN3 |Capture Input Enable Bits + * | | |0 = EPWM Channel capture input path Disabled + * | | |The input of EPWM channel capture function is always regarded as 0. + * | | |1 = EPWM Channel capture input path Enabled + * | | |The input of EPWM channel capture function comes from correlative multifunction pin. + * |[4] |CAPINEN4 |Capture Input Enable Bits + * | | |0 = EPWM Channel capture input path Disabled + * | | |The input of EPWM channel capture function is always regarded as 0. + * | | |1 = EPWM Channel capture input path Enabled + * | | |The input of EPWM channel capture function comes from correlative multifunction pin. + * |[5] |CAPINEN5 |Capture Input Enable Bits + * | | |0 = EPWM Channel capture input path Disabled + * | | |The input of EPWM channel capture function is always regarded as 0. + * | | |1 = EPWM Channel capture input path Enabled + * | | |The input of EPWM channel capture function comes from correlative multifunction pin. + * @var EPWM_T::CAPCTL + * Offset: 0x204 EPWM Capture Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CAPEN0 |Capture Function Enable Bits + * | | |0 = Capture function Disabled. RCAPDAT/FCAPDAT register will not be updated. + * | | |1 = Capture function Enabled + * | | |Capture latched the EPWM counter value when detected rising or falling edge of input signal and saved to RCAPDAT (Rising latch) and FCAPDAT (Falling latch). + * |[1] |CAPEN1 |Capture Function Enable Bits + * | | |0 = Capture function Disabled. RCAPDAT/FCAPDAT register will not be updated. + * | | |1 = Capture function Enabled + * | | |Capture latched the EPWM counter value when detected rising or falling edge of input signal and saved to RCAPDAT (Rising latch) and FCAPDAT (Falling latch). + * |[2] |CAPEN2 |Capture Function Enable Bits + * | | |0 = Capture function Disabled. RCAPDAT/FCAPDAT register will not be updated. + * | | |1 = Capture function Enabled + * | | |Capture latched the EPWM counter value when detected rising or falling edge of input signal and saved to RCAPDAT (Rising latch) and FCAPDAT (Falling latch). + * |[3] |CAPEN3 |Capture Function Enable Bits + * | | |0 = Capture function Disabled. RCAPDAT/FCAPDAT register will not be updated. + * | | |1 = Capture function Enabled + * | | |Capture latched the EPWM counter value when detected rising or falling edge of input signal and saved to RCAPDAT (Rising latch) and FCAPDAT (Falling latch). + * |[4] |CAPEN4 |Capture Function Enable Bits + * | | |0 = Capture function Disabled. RCAPDAT/FCAPDAT register will not be updated. + * | | |1 = Capture function Enabled + * | | |Capture latched the EPWM counter value when detected rising or falling edge of input signal and saved to RCAPDAT (Rising latch) and FCAPDAT (Falling latch). + * |[5] |CAPEN5 |Capture Function Enable Bits + * | | |0 = Capture function Disabled. RCAPDAT/FCAPDAT register will not be updated. + * | | |1 = Capture function Enabled + * | | |Capture latched the EPWM counter value when detected rising or falling edge of input signal and saved to RCAPDAT (Rising latch) and FCAPDAT (Falling latch). + * |[8] |CAPINV0 |Capture Inverter Enable Bits + * | | |0 = Capture source inverter Disabled. + * | | |1 = Capture source inverter Enabled. Reverse the input signal from GPIO. + * |[9] |CAPINV1 |Capture Inverter Enable Bits + * | | |0 = Capture source inverter Disabled. + * | | |1 = Capture source inverter Enabled. Reverse the input signal from GPIO. + * |[10] |CAPINV2 |Capture Inverter Enable Bits + * | | |0 = Capture source inverter Disabled. + * | | |1 = Capture source inverter Enabled. Reverse the input signal from GPIO. + * |[11] |CAPINV3 |Capture Inverter Enable Bits + * | | |0 = Capture source inverter Disabled. + * | | |1 = Capture source inverter Enabled. Reverse the input signal from GPIO. + * |[12] |CAPINV4 |Capture Inverter Enable Bits + * | | |0 = Capture source inverter Disabled. + * | | |1 = Capture source inverter Enabled. Reverse the input signal from GPIO. + * |[13] |CAPINV5 |Capture Inverter Enable Bits + * | | |0 = Capture source inverter Disabled. + * | | |1 = Capture source inverter Enabled. Reverse the input signal from GPIO. + * |[16] |RCRLDEN0 |Rising Capture Reload Enable Bits + * | | |0 = Rising capture reload counter Disabled. + * | | |1 = Rising capture reload counter Enabled. + * |[17] |RCRLDEN1 |Rising Capture Reload Enable Bits + * | | |0 = Rising capture reload counter Disabled. + * | | |1 = Rising capture reload counter Enabled. + * |[18] |RCRLDEN2 |Rising Capture Reload Enable Bits + * | | |0 = Rising capture reload counter Disabled. + * | | |1 = Rising capture reload counter Enabled. + * |[19] |RCRLDEN3 |Rising Capture Reload Enable Bits + * | | |0 = Rising capture reload counter Disabled. + * | | |1 = Rising capture reload counter Enabled. + * |[20] |RCRLDEN4 |Rising Capture Reload Enable Bits + * | | |0 = Rising capture reload counter Disabled. + * | | |1 = Rising capture reload counter Enabled. + * |[21] |RCRLDEN5 |Rising Capture Reload Enable Bits + * | | |0 = Rising capture reload counter Disabled. + * | | |1 = Rising capture reload counter Enabled. + * |[24] |FCRLDEN0 |Falling Capture Reload Enable Bits + * | | |0 = Falling capture reload counter Disabled. + * | | |1 = Falling capture reload counter Enabled. + * |[25] |FCRLDEN1 |Falling Capture Reload Enable Bits + * | | |0 = Falling capture reload counter Disabled. + * | | |1 = Falling capture reload counter Enabled. + * |[26] |FCRLDEN2 |Falling Capture Reload Enable Bits + * | | |0 = Falling capture reload counter Disabled. + * | | |1 = Falling capture reload counter Enabled. + * |[27] |FCRLDEN3 |Falling Capture Reload Enable Bits + * | | |0 = Falling capture reload counter Disabled. + * | | |1 = Falling capture reload counter Enabled. + * |[28] |FCRLDEN4 |Falling Capture Reload Enable Bits + * | | |0 = Falling capture reload counter Disabled. + * | | |1 = Falling capture reload counter Enabled. + * |[29] |FCRLDEN5 |Falling Capture Reload Enable Bits + * | | |0 = Falling capture reload counter Disabled. + * | | |1 = Falling capture reload counter Enabled. + * @var EPWM_T::CAPSTS + * Offset: 0x208 EPWM Capture Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CRLIFOV0 |Capture Rising Latch Interrupt Flag Overrun Status (Read Only) + * | | |This flag indicates if rising latch happened when the corresponding CRLIF is 1. + * | | |Note: This bit will be cleared automatically when user clear corresponding CRLIF. + * |[1] |CRLIFOV1 |Capture Rising Latch Interrupt Flag Overrun Status (Read Only) + * | | |This flag indicates if rising latch happened when the corresponding CRLIF is 1. + * | | |Note: This bit will be cleared automatically when user clear corresponding CRLIF. + * |[2] |CRLIFOV2 |Capture Rising Latch Interrupt Flag Overrun Status (Read Only) + * | | |This flag indicates if rising latch happened when the corresponding CRLIF is 1. + * | | |Note: This bit will be cleared automatically when user clear corresponding CRLIF. + * |[3] |CRLIFOV3 |Capture Rising Latch Interrupt Flag Overrun Status (Read Only) + * | | |This flag indicates if rising latch happened when the corresponding CRLIF is 1. + * | | |Note: This bit will be cleared automatically when user clear corresponding CRLIF. + * |[4] |CRLIFOV4 |Capture Rising Latch Interrupt Flag Overrun Status (Read Only) + * | | |This flag indicates if rising latch happened when the corresponding CRLIF is 1. + * | | |Note: This bit will be cleared automatically when user clear corresponding CRLIF. + * |[5] |CRLIFOV5 |Capture Rising Latch Interrupt Flag Overrun Status (Read Only) + * | | |This flag indicates if rising latch happened when the corresponding CRLIF is 1. + * | | |Note: This bit will be cleared automatically when user clear corresponding CRLIF. + * |[8] |CFLIFOV0 |Capture Falling Latch Interrupt Flag Overrun Status (Read Only) + * | | |This flag indicates if falling latch happened when the corresponding CFLIF is 1. + * | | |Note: This bit will be cleared automatically when user clear corresponding CFLIF. + * |[9] |CFLIFOV1 |Capture Falling Latch Interrupt Flag Overrun Status (Read Only) + * | | |This flag indicates if falling latch happened when the corresponding CFLIF is 1. + * | | |Note: This bit will be cleared automatically when user clear corresponding CFLIF. + * |[10] |CFLIFOV2 |Capture Falling Latch Interrupt Flag Overrun Status (Read Only) + * | | |This flag indicates if falling latch happened when the corresponding CFLIF is 1. + * | | |Note: This bit will be cleared automatically when user clear corresponding CFLIF. + * |[11] |CFLIFOV3 |Capture Falling Latch Interrupt Flag Overrun Status (Read Only) + * | | |This flag indicates if falling latch happened when the corresponding CFLIF is 1. + * | | |Note: This bit will be cleared automatically when user clear corresponding CFLIF. + * |[12] |CFLIFOV4 |Capture Falling Latch Interrupt Flag Overrun Status (Read Only) + * | | |This flag indicates if falling latch happened when the corresponding CFLIF is 1. + * | | |Note: This bit will be cleared automatically when user clear corresponding CFLIF. + * |[13] |CFLIFOV5 |Capture Falling Latch Interrupt Flag Overrun Status (Read Only) + * | | |This flag indicates if falling latch happened when the corresponding CFLIF is 1. + * | | |Note: This bit will be cleared automatically when user clear corresponding CFLIF. + * @var EPWM_T::RCAPDAT0 + * Offset: 0x20C EPWM Rising Capture Data Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RCAPDAT |EPWM Rising Capture Data Register (Read Only) + * | | |When rising capture condition happened, the EPWM counter value will be saved in this register. + * @var EPWM_T::FCAPDAT0 + * Offset: 0x210 EPWM Falling Capture Data Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FCAPDAT |EPWM Falling Capture Data Register (Read Only) + * | | |When falling capture condition happened, the EPWM counter value will be saved in this register. + * @var EPWM_T::RCAPDAT1 + * Offset: 0x214 EPWM Rising Capture Data Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RCAPDAT |EPWM Rising Capture Data Register (Read Only) + * | | |When rising capture condition happened, the EPWM counter value will be saved in this register. + * @var EPWM_T::FCAPDAT1 + * Offset: 0x218 EPWM Falling Capture Data Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FCAPDAT |EPWM Falling Capture Data Register (Read Only) + * | | |When falling capture condition happened, the EPWM counter value will be saved in this register. + * @var EPWM_T::RCAPDAT2 + * Offset: 0x21C EPWM Rising Capture Data Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RCAPDAT |EPWM Rising Capture Data Register (Read Only) + * | | |When rising capture condition happened, the EPWM counter value will be saved in this register. + * @var EPWM_T::FCAPDAT2 + * Offset: 0x220 EPWM Falling Capture Data Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FCAPDAT |EPWM Falling Capture Data Register (Read Only) + * | | |When falling capture condition happened, the EPWM counter value will be saved in this register. + * @var EPWM_T::RCAPDAT3 + * Offset: 0x224 EPWM Rising Capture Data Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RCAPDAT |EPWM Rising Capture Data Register (Read Only) + * | | |When rising capture condition happened, the EPWM counter value will be saved in this register. + * @var EPWM_T::FCAPDAT3 + * Offset: 0x228 EPWM Falling Capture Data Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FCAPDAT |EPWM Falling Capture Data Register (Read Only) + * | | |When falling capture condition happened, the EPWM counter value will be saved in this register. + * @var EPWM_T::RCAPDAT4 + * Offset: 0x22C EPWM Rising Capture Data Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RCAPDAT |EPWM Rising Capture Data Register (Read Only) + * | | |When rising capture condition happened, the EPWM counter value will be saved in this register. + * @var EPWM_T::FCAPDAT4 + * Offset: 0x230 EPWM Falling Capture Data Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FCAPDAT |EPWM Falling Capture Data Register (Read Only) + * | | |When falling capture condition happened, the EPWM counter value will be saved in this register. + * @var EPWM_T::RCAPDAT5 + * Offset: 0x234 EPWM Rising Capture Data Register 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |RCAPDAT |EPWM Rising Capture Data Register (Read Only) + * | | |When rising capture condition happened, the EPWM counter value will be saved in this register. + * @var EPWM_T::FCAPDAT5 + * Offset: 0x238 EPWM Falling Capture Data Register 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FCAPDAT |EPWM Falling Capture Data Register (Read Only) + * | | |When falling capture condition happened, the EPWM counter value will be saved in this register. + * @var EPWM_T::PDMACTL + * Offset: 0x23C EPWM PDMA Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CHEN0_1 |Channel 0/1 PDMA Enable Bit + * | | |0 = Channel 0/1 PDMA function Disabled. + * | | |1 = Channel 0/1 PDMA function Enabled for the channel 0/1 captured data and transfer to memory. + * |[2:1] |CAPMOD0_1 |Select EPWM_RCAPDAT0/1 or EPWM_FCAPDAT0/1 to Do PDMA Transfer + * | | |00 = Reserved. + * | | |01 = EPWM_RCAPDAT0/1. + * | | |10 = EPWM_FCAPDAT0/1. + * | | |11 = Both EPWM_RCAPDAT0/1 and EPWM_FCAPDAT0/1. + * |[3] |CAPORD0_1 |Capture Channel 0/1 Rising/Falling Order + * | | |Set this bit to determine whether the EPWM_RCAPDAT0/1 or EPWM_FCAPDAT0/1 is the first captured data transferred to memory through PDMA when CAPMOD0_1 =11. + * | | |0 = EPWM_FCAPDAT0/1 is the first captured data to memory. + * | | |1 = EPWM_RCAPDAT0/1 is the first captured data to memory. + * |[4] |CHSEL0_1 |Select Channel 0/1 to Do PDMA Transfer + * | | |0 = Channel0. + * | | |1 = Channel1. + * |[8] |CHEN2_3 |Channel 2/3 PDMA Enable Bit + * | | |0 = Channel 2/3 PDMA function Disabled. + * | | |1 = Channel 2/3 PDMA function Enabled for the channel 2/3 captured data and transfer to memory. + * |[10:9] |CAPMOD2_3 |Select EPWM_RCAPDAT2/3 or EPWM_FCAODAT2/3 to Do PDMA Transfer + * | | |00 = Reserved. + * | | |01 = EPWM_RCAPDAT2/3. + * | | |10 = EPWM_FCAPDAT2/3. + * | | |11 = Both EPWM_RCAPDAT2/3 and EPWM_FCAPDAT2/3. + * |[11] |CAPORD2_3 |Capture Channel 2/3 Rising/Falling Order + * | | |Set this bit to determine whether the EPWM_RCAPDAT2/3 or EPWM_FCAPDAT2/3 is the first captured data transferred to memory through PDMA when CAPMOD2_3 =11. + * | | |0 = EPWM_FCAPDAT2/3 is the first captured data to memory. + * | | |1 = EPWM_RCAPDAT2/3 is the first captured data to memory. + * |[12] |CHSEL2_3 |Select Channel 2/3 to Do PDMA Transfer + * | | |0 = Channel2. + * | | |1 = Channel3. + * |[16] |CHEN4_5 |Channel 4/5 PDMA Enable Bit + * | | |0 = Channel 4/5 PDMA function Disabled. + * | | |1 = Channel 4/5 PDMA function Enabled for the channel 4/5 captured data and transfer to memory. + * |[18:17] |CAPMOD4_5 |Select EPWM_RCAPDAT4/5 or EPWM_FCAPDAT4/5 to Do PDMA Transfer + * | | |00 = Reserved. + * | | |01 = EPWM_RCAPDAT4/5. + * | | |10 = EPWM_FCAPDAT4/5. + * | | |11 = Both EPWM_RCAPDAT4/5 and EPWM_FCAPDAT4/5. + * |[19] |CAPORD4_5 |Capture Channel 4/5 Rising/Falling Order + * | | |Set this bit to determine whether the EPWM_RCAPDAT4/5 or EPWM_FCAPDAT4/5 is the first captured data transferred to memory through PDMA when CAPMOD4_5 =11. + * | | |0 = EPWM_FCAPDAT4/5 is the first captured data to memory. + * | | |1 = EPWM_RCAPDAT4/5 is the first captured data to memory. + * |[20] |CHSEL4_5 |Select Channel 4/5 to Do PDMA Transfer + * | | |0 = Channel4. + * | | |1 = Channel5. + * @var EPWM_T::PDMACAP0_1 + * Offset: 0x240 EPWM Capture Channel 01 PDMA Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CAPBUF |EPWM Capture PDMA Register (Read Only) + * | | |This register is used as a buffer to transfer EPWM capture rising or falling data to memory by PDMA. + * @var EPWM_T::PDMACAP2_3 + * Offset: 0x244 EPWM Capture Channel 23 PDMA Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CAPBUF |EPWM Capture PDMA Register (Read Only) + * | | |This register is used as a buffer to transfer EPWM capture rising or falling data to memory by PDMA. + * @var EPWM_T::PDMACAP4_5 + * Offset: 0x248 EPWM Capture Channel 45 PDMA Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CAPBUF |EPWM Capture PDMA Register (Read Only) + * | | |This register is used as a buffer to transfer EPWM capture rising or falling data to memory by PDMA. + * @var EPWM_T::CAPIEN + * Offset: 0x250 EPWM Capture Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CAPRIEN0 |EPWM Capture Rising Latch Interrupt Enable Bits + * | | |0 = Capture rising edge latch interrupt Disabled. + * | | |1 = Capture rising edge latch interrupt Enabled. + * |[1] |CAPRIEN1 |EPWM Capture Rising Latch Interrupt Enable Bits + * | | |0 = Capture rising edge latch interrupt Disabled. + * | | |1 = Capture rising edge latch interrupt Enabled. + * |[2] |CAPRIEN2 |EPWM Capture Rising Latch Interrupt Enable Bits + * | | |0 = Capture rising edge latch interrupt Disabled. + * | | |1 = Capture rising edge latch interrupt Enabled. + * |[3] |CAPRIEN3 |EPWM Capture Rising Latch Interrupt Enable Bits + * | | |0 = Capture rising edge latch interrupt Disabled. + * | | |1 = Capture rising edge latch interrupt Enabled. + * |[4] |CAPRIEN4 |EPWM Capture Rising Latch Interrupt Enable Bits + * | | |0 = Capture rising edge latch interrupt Disabled. + * | | |1 = Capture rising edge latch interrupt Enabled. + * |[5] |CAPRIEN5 |EPWM Capture Rising Latch Interrupt Enable Bits + * | | |0 = Capture rising edge latch interrupt Disabled. + * | | |1 = Capture rising edge latch interrupt Enabled. + * |[8] |CAPFIEN0 |EPWM Capture Falling Latch Interrupt Enable Bits + * | | |0 = Capture falling edge latch interrupt Disabled. + * | | |1 = Capture falling edge latch interrupt Enabled. + * |[9] |CAPFIEN1 |EPWM Capture Falling Latch Interrupt Enable Bits + * | | |0 = Capture falling edge latch interrupt Disabled. + * | | |1 = Capture falling edge latch interrupt Enabled. + * |[10] |CAPFIEN2 |EPWM Capture Falling Latch Interrupt Enable Bits + * | | |0 = Capture falling edge latch interrupt Disabled. + * | | |1 = Capture falling edge latch interrupt Enabled. + * |[11] |CAPFIEN3 |EPWM Capture Falling Latch Interrupt Enable Bits + * | | |0 = Capture falling edge latch interrupt Disabled. + * | | |1 = Capture falling edge latch interrupt Enabled. + * |[12] |CAPFIEN4 |EPWM Capture Falling Latch Interrupt Enable Bits + * | | |0 = Capture falling edge latch interrupt Disabled. + * | | |1 = Capture falling edge latch interrupt Enabled. + * |[13] |CAPFIEN5 |EPWM Capture Falling Latch Interrupt Enable Bits + * | | |0 = Capture falling edge latch interrupt Disabled. + * | | |1 = Capture falling edge latch interrupt Enabled. + * @var EPWM_T::CAPIF + * Offset: 0x254 EPWM Capture Interrupt Flag Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CRLIF0 |EPWM Capture Rising Latch Interrupt Flag + * | | |0 = No capture rising latch condition happened. + * | | |1 = Capture rising latch condition happened, this flag will be set to high. + * | | |Note 1: When Capture with PDMA operating, CAPIF corresponding channel CRLIF will be cleared by hardware after PDMA transfer data. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[1] |CRLIF1 |EPWM Capture Rising Latch Interrupt Flag + * | | |0 = No capture rising latch condition happened. + * | | |1 = Capture rising latch condition happened, this flag will be set to high. + * | | |Note 1: When Capture with PDMA operating, CAPIF corresponding channel CRLIF will be cleared by hardware after PDMA transfer data. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[2] |CRLIF2 |EPWM Capture Rising Latch Interrupt Flag + * | | |0 = No capture rising latch condition happened. + * | | |1 = Capture rising latch condition happened, this flag will be set to high. + * | | |Note 1: When Capture with PDMA operating, CAPIF corresponding channel CRLIF will be cleared by hardware after PDMA transfer data. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[3] |CRLIF3 |EPWM Capture Rising Latch Interrupt Flag + * | | |0 = No capture rising latch condition happened. + * | | |1 = Capture rising latch condition happened, this flag will be set to high. + * | | |Note 1: When Capture with PDMA operating, CAPIF corresponding channel CRLIF will be cleared by hardware after PDMA transfer data. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[4] |CRLIF4 |EPWM Capture Rising Latch Interrupt Flag + * | | |0 = No capture rising latch condition happened. + * | | |1 = Capture rising latch condition happened, this flag will be set to high. + * | | |Note 1: When Capture with PDMA operating, CAPIF corresponding channel CRLIF will be cleared by hardware after PDMA transfer data. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[5] |CRLIF5 |EPWM Capture Rising Latch Interrupt Flag + * | | |0 = No capture rising latch condition happened. + * | | |1 = Capture rising latch condition happened, this flag will be set to high. + * | | |Note 1: When Capture with PDMA operating, CAPIF corresponding channel CRLIF will be cleared by hardware after PDMA transfer data. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[8] |CFLIF0 |EPWM Capture Falling Latch Interrupt Flag + * | | |0 = No capture falling latch condition happened. + * | | |1 = Capture falling latch condition happened, this flag will be set to high. + * | | |Note 1: When Capture with PDMA operating, CAPIF corresponding channel CFLIF will be cleared by hardware after PDMA transfer data. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[9] |CFLIF1 |EPWM Capture Falling Latch Interrupt Flag + * | | |0 = No capture falling latch condition happened. + * | | |1 = Capture falling latch condition happened, this flag will be set to high. + * | | |Note 1: When Capture with PDMA operating, CAPIF corresponding channel CFLIF will be cleared by hardware after PDMA transfer data. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[10] |CFLIF2 |EPWM Capture Falling Latch Interrupt Flag + * | | |0 = No capture falling latch condition happened. + * | | |1 = Capture falling latch condition happened, this flag will be set to high. + * | | |Note 1: When Capture with PDMA operating, CAPIF corresponding channel CFLIF will be cleared by hardware after PDMA transfer data. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[11] |CFLIF3 |EPWM Capture Falling Latch Interrupt Flag + * | | |0 = No capture falling latch condition happened. + * | | |1 = Capture falling latch condition happened, this flag will be set to high. + * | | |Note 1: When Capture with PDMA operating, CAPIF corresponding channel CFLIF will be cleared by hardware after PDMA transfer data. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[12] |CFLIF4 |EPWM Capture Falling Latch Interrupt Flag + * | | |0 = No capture falling latch condition happened. + * | | |1 = Capture falling latch condition happened, this flag will be set to high. + * | | |Note 1: When Capture with PDMA operating, CAPIF corresponding channel CFLIF will be cleared by hardware after PDMA transfer data. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[13] |CFLIF5 |EPWM Capture Falling Latch Interrupt Flag + * | | |0 = No capture falling latch condition happened. + * | | |1 = Capture falling latch condition happened, this flag will be set to high. + * | | |Note 1: When Capture with PDMA operating, CAPIF corresponding channel CFLIF will be cleared by hardware after PDMA transfer data. + * | | |Note 2: This bit is cleared by writing 1 to it. + * @var EPWM_T::PBUF0 + * Offset: 0x304 EPWM PERIOD0 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PBUF |EPWM Period Register Buffer (Read Only) + * | | |Used as PERIOD active register. + * @var EPWM_T::PBUF1 + * Offset: 0x308 EPWM PERIOD1 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PBUF |EPWM Period Register Buffer (Read Only) + * | | |Used as PERIOD active register. + * @var EPWM_T::PBUF2 + * Offset: 0x30C EPWM PERIOD2 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PBUF |EPWM Period Register Buffer (Read Only) + * | | |Used as PERIOD active register. + * @var EPWM_T::PBUF3 + * Offset: 0x310 EPWM PERIOD3 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PBUF |EPWM Period Register Buffer (Read Only) + * | | |Used as PERIOD active register. + * @var EPWM_T::PBUF4 + * Offset: 0x314 EPWM PERIOD4 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PBUF |EPWM Period Register Buffer (Read Only) + * | | |Used as PERIOD active register. + * @var EPWM_T::PBUF5 + * Offset: 0x318 EPWM PERIOD5 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PBUF |EPWM Period Register Buffer (Read Only) + * | | |Used as PERIOD active register. + * @var EPWM_T::CMPBUF0 + * Offset: 0x31C EPWM CMPDAT0 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMPBUF |EPWM Comparator Register Buffer (Read Only) + * | | |Used as CMP active register. + * @var EPWM_T::CMPBUF1 + * Offset: 0x320 EPWM CMPDAT1 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMPBUF |EPWM Comparator Register Buffer (Read Only) + * | | |Used as CMP active register. + * @var EPWM_T::CMPBUF2 + * Offset: 0x324 EPWM CMPDAT2 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMPBUF |EPWM Comparator Register Buffer (Read Only) + * | | |Used as CMP active register. + * @var EPWM_T::CMPBUF3 + * Offset: 0x328 EPWM CMPDAT3 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMPBUF |EPWM Comparator Register Buffer (Read Only) + * | | |Used as CMP active register. + * @var EPWM_T::CMPBUF4 + * Offset: 0x32C EPWM CMPDAT4 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMPBUF |EPWM Comparator Register Buffer (Read Only) + * | | |Used as CMP active register. + * @var EPWM_T::CMPBUF5 + * Offset: 0x330 EPWM CMPDAT5 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMPBUF |EPWM Comparator Register Buffer (Read Only) + * | | |Used as CMP active register. + * @var EPWM_T::CPSCBUF0_1 + * Offset: 0x334 EPWM CLKPSC0_1 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |CPSCBUF |EPWM Counter Clock Prescale Buffer + * | | |Used as EPWM counter clock pre-scare active register. + * @var EPWM_T::CPSCBUF2_3 + * Offset: 0x338 EPWM CLKPSC2_3 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |CPSCBUF |EPWM Counter Clock Prescale Buffer + * | | |Used as EPWM counter clock pre-scare active register. + * @var EPWM_T::CPSCBUF4_5 + * Offset: 0x33C EPWM CLKPSC4_5 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |CPSCBUF |EPWM Counter Clock Prescale Buffer + * | | |Used as EPWM counter clock pre-scare active register. + * @var EPWM_T::FTCBUF0_1 + * Offset: 0x340 EPWM FTCMPDAT0_1 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FTCMPBUF |EPWM FTCMPDAT Buffer (Read Only) + * | | |Used as FTCMPDAT active register. + * @var EPWM_T::FTCBUF2_3 + * Offset: 0x344 EPWM FTCMPDAT2_3 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FTCMPBUF |EPWM FTCMPDAT Buffer (Read Only) + * | | |Used as FTCMPDAT active register. + * @var EPWM_T::FTCBUF4_5 + * Offset: 0x348 EPWM FTCMPDAT4_5 Buffer + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FTCMPBUF |EPWM FTCMPDAT Buffer (Read Only) + * | | |Used as FTCMPDAT active register. + * @var EPWM_T::FTCI + * Offset: 0x34C EPWM FTCMPDAT Indicator Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |FTCMU0 |EPWM FTCMPDAT Up Indicator + * | | |Indicator is set by hardware when EPWM counter up count and reaches EPWM_FTCMPDATn, software can clear this bit by writing 1 to it. + * |[1] |FTCMU2 |EPWM FTCMPDAT Up Indicator + * | | |Indicator is set by hardware when EPWM counter up count and reaches EPWM_FTCMPDATn, software can clear this bit by writing 1 to it. + * |[2] |FTCMU4 |EPWM FTCMPDAT Up Indicator + * | | |Indicator is set by hardware when EPWM counter up count and reaches EPWM_FTCMPDATn, software can clear this bit by writing 1 to it. + * |[8] |FTCMD0 |EPWM FTCMPDAT Down Indicator + * | | |Indicator is set by hardware when EPWM counter down count and reaches EPWM_FTCMPDATn, software can clear this bit by writing 1 to it. + * |[9] |FTCMD2 |EPWM FTCMPDAT Down Indicator + * | | |Indicator is set by hardware when EPWM counter down count and reaches EPWM_FTCMPDATn, software can clear this bit by writing 1 to it. + * |[10] |FTCMD4 |EPWM FTCMPDAT Down Indicator + * | | |Indicator is set by hardware when EPWM counter down count and reaches EPWM_FTCMPDATn, software can clear this bit by writing 1 to it. + */ + __IO uint32_t CTL0; /*!< [0x0000] EPWM Control Register 0 */ + __IO uint32_t CTL1; /*!< [0x0004] EPWM Control Register 1 */ + __IO uint32_t SYNC; /*!< [0x0008] EPWM Synchronization Register */ + __IO uint32_t SWSYNC; /*!< [0x000c] EPWM Software Control Synchronization Register */ + __IO uint32_t CLKSRC; /*!< [0x0010] EPWM Clock Source Register */ + __IO uint32_t CLKPSC[3]; /*!< [0x0014] EPWM Clock Prescale Register 0/1,2/3,4/5 */ + __IO uint32_t CNTEN; /*!< [0x0020] EPWM Counter Enable Register */ + __IO uint32_t CNTCLR; /*!< [0x0024] EPWM Clear Counter Register */ + __IO uint32_t LOAD; /*!< [0x0028] EPWM Load Register */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE0[1]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t PERIOD[6]; /*!< [0x0030] EPWM Period Register 0~5 */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE1[2]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t CMPDAT[6]; /*!< [0x0050] EPWM Comparator Register 0~5 */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE2[2]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t DTCTL[3]; /*!< [0x0070] EPWM Dead-Time Control Register 0/1,2/3,4/5 */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE3[1]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t PHS[3]; /*!< [0x0080] EPWM Counter Phase Register 0/1,2/3,4/5 */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE4[1]; + /// @endcond //HIDDEN_SYMBOLS + __I uint32_t CNT[6]; /*!< [0x0090] EPWM Counter Register 0~5 */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE5[2]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t WGCTL0; /*!< [0x00b0] EPWM Generation Register 0 */ + __IO uint32_t WGCTL1; /*!< [0x00b4] EPWM Generation Register 1 */ + __IO uint32_t MSKEN; /*!< [0x00b8] EPWM Mask Enable Register */ + __IO uint32_t MSK; /*!< [0x00bc] EPWM Mask Data Register */ + __IO uint32_t BNF; /*!< [0x00c0] EPWM Brake Noise Filter Register */ + __IO uint32_t FAILBRK; /*!< [0x00c4] EPWM System Fail Brake Control Register */ + __IO uint32_t BRKCTL[3]; /*!< [0x00c8] EPWM Brake Edge Detect Control Register 0/1,2/3,4/5 */ + __IO uint32_t POLCTL; /*!< [0x00d4] EPWM Pin Polar Inverse Register */ + __IO uint32_t POEN; /*!< [0x00d8] EPWM Output Enable Register */ + __O uint32_t SWBRK; /*!< [0x00dc] EPWM Software Brake Control Register */ + __IO uint32_t INTEN0; /*!< [0x00e0] EPWM Interrupt Enable Register 0 */ + __IO uint32_t INTEN1; /*!< [0x00e4] EPWM Interrupt Enable Register 1 */ + __IO uint32_t INTSTS0; /*!< [0x00e8] EPWM Interrupt Flag Register 0 */ + __IO uint32_t INTSTS1; /*!< [0x00ec] EPWM Interrupt Flag Register 1 */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE6[1]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t DACTRGEN; /*!< [0x00f4] EPWM Trigger DAC Enable Register */ + __IO uint32_t EADCTS0; /*!< [0x00f8] EPWM Trigger EADC Source Select Register 0 */ + __IO uint32_t EADCTS1; /*!< [0x00fc] EPWM Trigger EADC Source Select Register 1 */ + __IO uint32_t FTCMPDAT[3]; /*!< [0x0100] EPWM Free Trigger Compare Register 0/1,2/3,4/5 */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE7[1]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t SSCTL; /*!< [0x0110] EPWM Synchronous Start Control Register */ + __O uint32_t SSTRG; /*!< [0x0114] EPWM Synchronous Start Trigger Register */ + __IO uint32_t LEBCTL; /*!< [0x0118] EPWM Leading Edge Blanking Control Register */ + __IO uint32_t LEBCNT; /*!< [0x011c] EPWM Leading Edge Blanking Counter Register */ + __IO uint32_t STATUS; /*!< [0x0120] EPWM Status Register */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE8[3]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t IFA[6]; /*!< [0x0130] EPWM Interrupt Flag Accumulator Register 0~5 */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE9[2]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t AINTSTS; /*!< [0x0150] EPWM Accumulator Interrupt Flag Register */ + __IO uint32_t AINTEN; /*!< [0x0154] EPWM Accumulator Interrupt Enable Register */ + __IO uint32_t APDMACTL; /*!< [0x0158] EPWM Accumulator PDMA Control Register */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE10[1]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t FDEN; /*!< [0x0160] EPWM Fault Detect Enable Register */ + __IO uint32_t FDCTL[6]; /*!< [0x0164~0x178] EPWM Fault Detect Control Register 0~5 */ + __IO uint32_t FDIEN; /*!< [0x017C] EPWM Fault Detect Interrupt Enable Register */ + __IO uint32_t FDSTS; /*!< [0x0180] EPWM Fault Detect Interrupt Flag Register */ + __IO uint32_t EADCPSCCTL; /*!< [0x0184] EPWM Trigger EADC Prescale Control Register */ + __IO uint32_t EADCPSC0; /*!< [0x0188] EPWM Trigger EADC Prescale Register 0 */ + __IO uint32_t EADCPSC1; /*!< [0x018C] EPWM Trigger EADC Prescale Register 1 */ + __IO uint32_t EADCPSCNT0; /*!< [0x0190] EPWM Trigger EADC Prescale Counter Register 0 */ + __IO uint32_t EADCPSCNT1; /*!< [0x0194] EPWM Trigger EADC Prescale Counter Register 1 */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE11[26]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t CAPINEN; /*!< [0x0200] EPWM Capture Input Enable Register */ + __IO uint32_t CAPCTL; /*!< [0x0204] EPWM Capture Control Register */ + __I uint32_t CAPSTS; /*!< [0x0208] EPWM Capture Status Register */ + ECAPDAT_T CAPDAT[6]; /*!< [0x020C] EPWM Rising and Falling Capture Data Register 0~5 */ + __IO uint32_t PDMACTL; /*!< [0x023c] EPWM PDMA Control Register */ + __I uint32_t PDMACAP[3]; /*!< [0x0240] EPWM Capture Channel 01,23,45 PDMA Register */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE12[1]; + /// @endcond //HIDDEN_SYMBOLS + __IO uint32_t CAPIEN; /*!< [0x0250] EPWM Capture Interrupt Enable Register */ + __IO uint32_t CAPIF; /*!< [0x0254] EPWM Capture Interrupt Flag Register */ + /// @cond HIDDEN_SYMBOLS + __I uint32_t RESERVE13[43]; + /// @endcond //HIDDEN_SYMBOLS + __I uint32_t PBUF[6]; /*!< [0x0304] EPWM PERIOD0~5 Buffer */ + __I uint32_t CMPBUF[6]; /*!< [0x031c] EPWM CMPDAT0~5 Buffer */ + __I uint32_t CPSCBUF[3]; /*!< [0x0334] EPWM CLKPSC0_1/2_3/4_5 Buffer */ + __I uint32_t FTCBUF[3]; /*!< [0x0340] EPWM FTCMPDAT0_1/2_3/4_5 Buffer */ + __IO uint32_t FTCI; /*!< [0x034c] EPWM FTCMPDAT Indicator Register */ + +} EPWM_T; + +/** + @addtogroup EPWM_CONST EPWM Bit Field Definition + Constant Definitions for EPWM Controller +@{ */ + +#define EPWM_CTL0_CTRLD0_Pos (0) /*!< EPWM_T::CTL0: CTRLD0 Position */ +#define EPWM_CTL0_CTRLD0_Msk (0x1ul << EPWM_CTL0_CTRLD0_Pos) /*!< EPWM_T::CTL0: CTRLD0 Mask */ + +#define EPWM_CTL0_CTRLD1_Pos (1) /*!< EPWM_T::CTL0: CTRLD1 Position */ +#define EPWM_CTL0_CTRLD1_Msk (0x1ul << EPWM_CTL0_CTRLD1_Pos) /*!< EPWM_T::CTL0: CTRLD1 Mask */ + +#define EPWM_CTL0_CTRLD2_Pos (2) /*!< EPWM_T::CTL0: CTRLD2 Position */ +#define EPWM_CTL0_CTRLD2_Msk (0x1ul << EPWM_CTL0_CTRLD2_Pos) /*!< EPWM_T::CTL0: CTRLD2 Mask */ + +#define EPWM_CTL0_CTRLD3_Pos (3) /*!< EPWM_T::CTL0: CTRLD3 Position */ +#define EPWM_CTL0_CTRLD3_Msk (0x1ul << EPWM_CTL0_CTRLD3_Pos) /*!< EPWM_T::CTL0: CTRLD3 Mask */ + +#define EPWM_CTL0_CTRLD4_Pos (4) /*!< EPWM_T::CTL0: CTRLD4 Position */ +#define EPWM_CTL0_CTRLD4_Msk (0x1ul << EPWM_CTL0_CTRLD4_Pos) /*!< EPWM_T::CTL0: CTRLD4 Mask */ + +#define EPWM_CTL0_CTRLD5_Pos (5) /*!< EPWM_T::CTL0: CTRLD5 Position */ +#define EPWM_CTL0_CTRLD5_Msk (0x1ul << EPWM_CTL0_CTRLD5_Pos) /*!< EPWM_T::CTL0: CTRLD5 Mask */ + +#define EPWM_CTL0_WINLDEN0_Pos (8) /*!< EPWM_T::CTL0: WINLDEN0 Position */ +#define EPWM_CTL0_WINLDEN0_Msk (0x1ul << EPWM_CTL0_WINLDEN0_Pos) /*!< EPWM_T::CTL0: WINLDEN0 Mask */ + +#define EPWM_CTL0_WINLDEN1_Pos (9) /*!< EPWM_T::CTL0: WINLDEN1 Position */ +#define EPWM_CTL0_WINLDEN1_Msk (0x1ul << EPWM_CTL0_WINLDEN1_Pos) /*!< EPWM_T::CTL0: WINLDEN1 Mask */ + +#define EPWM_CTL0_WINLDEN2_Pos (10) /*!< EPWM_T::CTL0: WINLDEN2 Position */ +#define EPWM_CTL0_WINLDEN2_Msk (0x1ul << EPWM_CTL0_WINLDEN2_Pos) /*!< EPWM_T::CTL0: WINLDEN2 Mask */ + +#define EPWM_CTL0_WINLDEN3_Pos (11) /*!< EPWM_T::CTL0: WINLDEN3 Position */ +#define EPWM_CTL0_WINLDEN3_Msk (0x1ul << EPWM_CTL0_WINLDEN3_Pos) /*!< EPWM_T::CTL0: WINLDEN3 Mask */ + +#define EPWM_CTL0_WINLDEN4_Pos (12) /*!< EPWM_T::CTL0: WINLDEN4 Position */ +#define EPWM_CTL0_WINLDEN4_Msk (0x1ul << EPWM_CTL0_WINLDEN4_Pos) /*!< EPWM_T::CTL0: WINLDEN4 Mask */ + +#define EPWM_CTL0_WINLDEN5_Pos (13) /*!< EPWM_T::CTL0: WINLDEN5 Position */ +#define EPWM_CTL0_WINLDEN5_Msk (0x1ul << EPWM_CTL0_WINLDEN5_Pos) /*!< EPWM_T::CTL0: WINLDEN5 Mask */ + +#define EPWM_CTL0_IMMLDEN0_Pos (16) /*!< EPWM_T::CTL0: IMMLDEN0 Position */ +#define EPWM_CTL0_IMMLDEN0_Msk (0x1ul << EPWM_CTL0_IMMLDEN0_Pos) /*!< EPWM_T::CTL0: IMMLDEN0 Mask */ + +#define EPWM_CTL0_IMMLDEN1_Pos (17) /*!< EPWM_T::CTL0: IMMLDEN1 Position */ +#define EPWM_CTL0_IMMLDEN1_Msk (0x1ul << EPWM_CTL0_IMMLDEN1_Pos) /*!< EPWM_T::CTL0: IMMLDEN1 Mask */ + +#define EPWM_CTL0_IMMLDEN2_Pos (18) /*!< EPWM_T::CTL0: IMMLDEN2 Position */ +#define EPWM_CTL0_IMMLDEN2_Msk (0x1ul << EPWM_CTL0_IMMLDEN2_Pos) /*!< EPWM_T::CTL0: IMMLDEN2 Mask */ + +#define EPWM_CTL0_IMMLDEN3_Pos (19) /*!< EPWM_T::CTL0: IMMLDEN3 Position */ +#define EPWM_CTL0_IMMLDEN3_Msk (0x1ul << EPWM_CTL0_IMMLDEN3_Pos) /*!< EPWM_T::CTL0: IMMLDEN3 Mask */ + +#define EPWM_CTL0_IMMLDEN4_Pos (20) /*!< EPWM_T::CTL0: IMMLDEN4 Position */ +#define EPWM_CTL0_IMMLDEN4_Msk (0x1ul << EPWM_CTL0_IMMLDEN4_Pos) /*!< EPWM_T::CTL0: IMMLDEN4 Mask */ + +#define EPWM_CTL0_IMMLDEN5_Pos (21) /*!< EPWM_T::CTL0: IMMLDEN5 Position */ +#define EPWM_CTL0_IMMLDEN5_Msk (0x1ul << EPWM_CTL0_IMMLDEN5_Pos) /*!< EPWM_T::CTL0: IMMLDEN5 Mask */ + +#define EPWM_CTL0_GROUPEN_Pos (24) /*!< EPWM_T::CTL0: GROUPEN Position */ +#define EPWM_CTL0_GROUPEN_Msk (0x1ul << EPWM_CTL0_GROUPEN_Pos) /*!< EPWM_T::CTL0: GROUPEN Mask */ + +#define EPWM_CTL0_DBGHALT_Pos (30) /*!< EPWM_T::CTL0: DBGHALT Position */ +#define EPWM_CTL0_DBGHALT_Msk (0x1ul << EPWM_CTL0_DBGHALT_Pos) /*!< EPWM_T::CTL0: DBGHALT Mask */ + +#define EPWM_CTL0_DBGTRIOFF_Pos (31) /*!< EPWM_T::CTL0: DBGTRIOFF Position */ +#define EPWM_CTL0_DBGTRIOFF_Msk (0x1ul << EPWM_CTL0_DBGTRIOFF_Pos) /*!< EPWM_T::CTL0: DBGTRIOFF Mask */ + +#define EPWM_CTL1_CNTTYPE0_Pos (0) /*!< EPWM_T::CTL1: CNTTYPE0 Position */ +#define EPWM_CTL1_CNTTYPE0_Msk (0x3ul << EPWM_CTL1_CNTTYPE0_Pos) /*!< EPWM_T::CTL1: CNTTYPE0 Mask */ + +#define EPWM_CTL1_CNTTYPE1_Pos (2) /*!< EPWM_T::CTL1: CNTTYPE1 Position */ +#define EPWM_CTL1_CNTTYPE1_Msk (0x3ul << EPWM_CTL1_CNTTYPE1_Pos) /*!< EPWM_T::CTL1: CNTTYPE1 Mask */ + +#define EPWM_CTL1_CNTTYPE2_Pos (4) /*!< EPWM_T::CTL1: CNTTYPE2 Position */ +#define EPWM_CTL1_CNTTYPE2_Msk (0x3ul << EPWM_CTL1_CNTTYPE2_Pos) /*!< EPWM_T::CTL1: CNTTYPE2 Mask */ + +#define EPWM_CTL1_CNTTYPE3_Pos (6) /*!< EPWM_T::CTL1: CNTTYPE3 Position */ +#define EPWM_CTL1_CNTTYPE3_Msk (0x3ul << EPWM_CTL1_CNTTYPE3_Pos) /*!< EPWM_T::CTL1: CNTTYPE3 Mask */ + +#define EPWM_CTL1_CNTTYPE4_Pos (8) /*!< EPWM_T::CTL1: CNTTYPE4 Position */ +#define EPWM_CTL1_CNTTYPE4_Msk (0x3ul << EPWM_CTL1_CNTTYPE4_Pos) /*!< EPWM_T::CTL1: CNTTYPE4 Mask */ + +#define EPWM_CTL1_CNTTYPE5_Pos (10) /*!< EPWM_T::CTL1: CNTTYPE5 Position */ +#define EPWM_CTL1_CNTTYPE5_Msk (0x3ul << EPWM_CTL1_CNTTYPE5_Pos) /*!< EPWM_T::CTL1: CNTTYPE5 Mask */ + +#define EPWM_CTL1_CNTMODE0_Pos (16) /*!< EPWM_T::CTL1: CNTMODE0 Position */ +#define EPWM_CTL1_CNTMODE0_Msk (0x1ul << EPWM_CTL1_CNTMODE0_Pos) /*!< EPWM_T::CTL1: CNTMODE0 Mask */ + +#define EPWM_CTL1_CNTMODE1_Pos (17) /*!< EPWM_T::CTL1: CNTMODE1 Position */ +#define EPWM_CTL1_CNTMODE1_Msk (0x1ul << EPWM_CTL1_CNTMODE1_Pos) /*!< EPWM_T::CTL1: CNTMODE1 Mask */ + +#define EPWM_CTL1_CNTMODE2_Pos (18) /*!< EPWM_T::CTL1: CNTMODE2 Position */ +#define EPWM_CTL1_CNTMODE2_Msk (0x1ul << EPWM_CTL1_CNTMODE2_Pos) /*!< EPWM_T::CTL1: CNTMODE2 Mask */ + +#define EPWM_CTL1_CNTMODE3_Pos (19) /*!< EPWM_T::CTL1: CNTMODE3 Position */ +#define EPWM_CTL1_CNTMODE3_Msk (0x1ul << EPWM_CTL1_CNTMODE3_Pos) /*!< EPWM_T::CTL1: CNTMODE3 Mask */ + +#define EPWM_CTL1_CNTMODE4_Pos (20) /*!< EPWM_T::CTL1: CNTMODE4 Position */ +#define EPWM_CTL1_CNTMODE4_Msk (0x1ul << EPWM_CTL1_CNTMODE4_Pos) /*!< EPWM_T::CTL1: CNTMODE4 Mask */ + +#define EPWM_CTL1_CNTMODE5_Pos (21) /*!< EPWM_T::CTL1: CNTMODE5 Position */ +#define EPWM_CTL1_CNTMODE5_Msk (0x1ul << EPWM_CTL1_CNTMODE5_Pos) /*!< EPWM_T::CTL1: CNTMODE5 Mask */ + +#define EPWM_CTL1_OUTMODE0_Pos (24) /*!< EPWM_T::CTL1: OUTMODE0 Position */ +#define EPWM_CTL1_OUTMODE0_Msk (0x1ul << EPWM_CTL1_OUTMODE0_Pos) /*!< EPWM_T::CTL1: OUTMODE0 Mask */ + +#define EPWM_CTL1_OUTMODE2_Pos (25) /*!< EPWM_T::CTL1: OUTMODE2 Position */ +#define EPWM_CTL1_OUTMODE2_Msk (0x1ul << EPWM_CTL1_OUTMODE2_Pos) /*!< EPWM_T::CTL1: OUTMODE2 Mask */ + +#define EPWM_CTL1_OUTMODE4_Pos (26) /*!< EPWM_T::CTL1: OUTMODE4 Position */ +#define EPWM_CTL1_OUTMODE4_Msk (0x1ul << EPWM_CTL1_OUTMODE4_Pos) /*!< EPWM_T::CTL1: OUTMODE4 Mask */ + +#define EPWM_SYNC_PHSEN0_Pos (0) /*!< EPWM_T::SYNC: PHSEN0 Position */ +#define EPWM_SYNC_PHSEN0_Msk (0x1ul << EPWM_SYNC_PHSEN0_Pos) /*!< EPWM_T::SYNC: PHSEN0 Mask */ + +#define EPWM_SYNC_PHSEN2_Pos (1) /*!< EPWM_T::SYNC: PHSEN2 Position */ +#define EPWM_SYNC_PHSEN2_Msk (0x1ul << EPWM_SYNC_PHSEN2_Pos) /*!< EPWM_T::SYNC: PHSEN2 Mask */ + +#define EPWM_SYNC_PHSEN4_Pos (2) /*!< EPWM_T::SYNC: PHSEN4 Position */ +#define EPWM_SYNC_PHSEN4_Msk (0x1ul << EPWM_SYNC_PHSEN4_Pos) /*!< EPWM_T::SYNC: PHSEN4 Mask */ + +#define EPWM_SYNC_SINSRC0_Pos (8) /*!< EPWM_T::SYNC: SINSRC0 Position */ +#define EPWM_SYNC_SINSRC0_Msk (0x3ul << EPWM_SYNC_SINSRC0_Pos) /*!< EPWM_T::SYNC: SINSRC0 Mask */ + +#define EPWM_SYNC_SINSRC2_Pos (10) /*!< EPWM_T::SYNC: SINSRC2 Position */ +#define EPWM_SYNC_SINSRC2_Msk (0x3ul << EPWM_SYNC_SINSRC2_Pos) /*!< EPWM_T::SYNC: SINSRC2 Mask */ + +#define EPWM_SYNC_SINSRC4_Pos (12) /*!< EPWM_T::SYNC: SINSRC4 Position */ +#define EPWM_SYNC_SINSRC4_Msk (0x3ul << EPWM_SYNC_SINSRC4_Pos) /*!< EPWM_T::SYNC: SINSRC4 Mask */ + +#define EPWM_SYNC_SNFLTEN_Pos (16) /*!< EPWM_T::SYNC: SNFLTEN Position */ +#define EPWM_SYNC_SNFLTEN_Msk (0x1ul << EPWM_SYNC_SNFLTEN_Pos) /*!< EPWM_T::SYNC: SNFLTEN Mask */ + +#define EPWM_SYNC_SFLTCSEL_Pos (17) /*!< EPWM_T::SYNC: SFLTCSEL Position */ +#define EPWM_SYNC_SFLTCSEL_Msk (0x7ul << EPWM_SYNC_SFLTCSEL_Pos) /*!< EPWM_T::SYNC: SFLTCSEL Mask */ + +#define EPWM_SYNC_SFLTCNT_Pos (20) /*!< EPWM_T::SYNC: SFLTCNT Position */ +#define EPWM_SYNC_SFLTCNT_Msk (0x7ul << EPWM_SYNC_SFLTCNT_Pos) /*!< EPWM_T::SYNC: SFLTCNT Mask */ + +#define EPWM_SYNC_SINPINV_Pos (23) /*!< EPWM_T::SYNC: SINPINV Position */ +#define EPWM_SYNC_SINPINV_Msk (0x1ul << EPWM_SYNC_SINPINV_Pos) /*!< EPWM_T::SYNC: SINPINV Mask */ + +#define EPWM_SYNC_PHSDIR0_Pos (24) /*!< EPWM_T::SYNC: PHSDIR0 Position */ +#define EPWM_SYNC_PHSDIR0_Msk (0x1ul << EPWM_SYNC_PHSDIR0_Pos) /*!< EPWM_T::SYNC: PHSDIR0 Mask */ + +#define EPWM_SYNC_PHSDIR2_Pos (25) /*!< EPWM_T::SYNC: PHSDIR2 Position */ +#define EPWM_SYNC_PHSDIR2_Msk (0x1ul << EPWM_SYNC_PHSDIR2_Pos) /*!< EPWM_T::SYNC: PHSDIR2 Mask */ + +#define EPWM_SYNC_PHSDIR4_Pos (26) /*!< EPWM_T::SYNC: PHSDIR4 Position */ +#define EPWM_SYNC_PHSDIR4_Msk (0x1ul << EPWM_SYNC_PHSDIR4_Pos) /*!< EPWM_T::SYNC: PHSDIR4 Mask */ + +#define EPWM_SWSYNC_SWSYNC0_Pos (0) /*!< EPWM_T::SWSYNC: SWSYNC0 Position */ +#define EPWM_SWSYNC_SWSYNC0_Msk (0x1ul << EPWM_SWSYNC_SWSYNC0_Pos) /*!< EPWM_T::SWSYNC: SWSYNC0 Mask */ + +#define EPWM_SWSYNC_SWSYNC2_Pos (1) /*!< EPWM_T::SWSYNC: SWSYNC2 Position */ +#define EPWM_SWSYNC_SWSYNC2_Msk (0x1ul << EPWM_SWSYNC_SWSYNC2_Pos) /*!< EPWM_T::SWSYNC: SWSYNC2 Mask */ + +#define EPWM_SWSYNC_SWSYNC4_Pos (2) /*!< EPWM_T::SWSYNC: SWSYNC4 Position */ +#define EPWM_SWSYNC_SWSYNC4_Msk (0x1ul << EPWM_SWSYNC_SWSYNC4_Pos) /*!< EPWM_T::SWSYNC: SWSYNC4 Mask */ + +#define EPWM_CLKSRC_ECLKSRC0_Pos (0) /*!< EPWM_T::CLKSRC: ECLKSRC0 Position */ +#define EPWM_CLKSRC_ECLKSRC0_Msk (0xful << EPWM_CLKSRC_ECLKSRC0_Pos) /*!< EPWM_T::CLKSRC: ECLKSRC0 Mask */ + +#define EPWM_CLKSRC_ECLKSRC2_Pos (8) /*!< EPWM_T::CLKSRC: ECLKSRC2 Position */ +#define EPWM_CLKSRC_ECLKSRC2_Msk (0xful << EPWM_CLKSRC_ECLKSRC2_Pos) /*!< EPWM_T::CLKSRC: ECLKSRC2 Mask */ + +#define EPWM_CLKSRC_ECLKSRC4_Pos (16) /*!< EPWM_T::CLKSRC: ECLKSRC4 Position */ +#define EPWM_CLKSRC_ECLKSRC4_Msk (0xful << EPWM_CLKSRC_ECLKSRC4_Pos) /*!< EPWM_T::CLKSRC: ECLKSRC4 Mask */ + +#define EPWM_CLKPSC0_1_CLKPSC_Pos (0) /*!< EPWM_T::CLKPSC0_1: CLKPSC Position */ +#define EPWM_CLKPSC0_1_CLKPSC_Msk (0xffful << EPWM_CLKPSC0_1_CLKPSC_Pos) /*!< EPWM_T::CLKPSC0_1: CLKPSC Mask */ + +#define EPWM_CLKPSC2_3_CLKPSC_Pos (0) /*!< EPWM_T::CLKPSC2_3: CLKPSC Position */ +#define EPWM_CLKPSC2_3_CLKPSC_Msk (0xffful << EPWM_CLKPSC2_3_CLKPSC_Pos) /*!< EPWM_T::CLKPSC2_3: CLKPSC Mask */ + +#define EPWM_CLKPSC4_5_CLKPSC_Pos (0) /*!< EPWM_T::CLKPSC4_5: CLKPSC Position */ +#define EPWM_CLKPSC4_5_CLKPSC_Msk (0xffful << EPWM_CLKPSC4_5_CLKPSC_Pos) /*!< EPWM_T::CLKPSC4_5: CLKPSC Mask */ + +#define EPWM_CNTEN_CNTEN0_Pos (0) /*!< EPWM_T::CNTEN: CNTEN0 Position */ +#define EPWM_CNTEN_CNTEN0_Msk (0x1ul << EPWM_CNTEN_CNTEN0_Pos) /*!< EPWM_T::CNTEN: CNTEN0 Mask */ + +#define EPWM_CNTEN_CNTEN1_Pos (1) /*!< EPWM_T::CNTEN: CNTEN1 Position */ +#define EPWM_CNTEN_CNTEN1_Msk (0x1ul << EPWM_CNTEN_CNTEN1_Pos) /*!< EPWM_T::CNTEN: CNTEN1 Mask */ + +#define EPWM_CNTEN_CNTEN2_Pos (2) /*!< EPWM_T::CNTEN: CNTEN2 Position */ +#define EPWM_CNTEN_CNTEN2_Msk (0x1ul << EPWM_CNTEN_CNTEN2_Pos) /*!< EPWM_T::CNTEN: CNTEN2 Mask */ + +#define EPWM_CNTEN_CNTEN3_Pos (3) /*!< EPWM_T::CNTEN: CNTEN3 Position */ +#define EPWM_CNTEN_CNTEN3_Msk (0x1ul << EPWM_CNTEN_CNTEN3_Pos) /*!< EPWM_T::CNTEN: CNTEN3 Mask */ + +#define EPWM_CNTEN_CNTEN4_Pos (4) /*!< EPWM_T::CNTEN: CNTEN4 Position */ +#define EPWM_CNTEN_CNTEN4_Msk (0x1ul << EPWM_CNTEN_CNTEN4_Pos) /*!< EPWM_T::CNTEN: CNTEN4 Mask */ + +#define EPWM_CNTEN_CNTEN5_Pos (5) /*!< EPWM_T::CNTEN: CNTEN5 Position */ +#define EPWM_CNTEN_CNTEN5_Msk (0x1ul << EPWM_CNTEN_CNTEN5_Pos) /*!< EPWM_T::CNTEN: CNTEN5 Mask */ + +#define EPWM_CNTCLR_CNTCLR0_Pos (0) /*!< EPWM_T::CNTCLR: CNTCLR0 Position */ +#define EPWM_CNTCLR_CNTCLR0_Msk (0x1ul << EPWM_CNTCLR_CNTCLR0_Pos) /*!< EPWM_T::CNTCLR: CNTCLR0 Mask */ + +#define EPWM_CNTCLR_CNTCLR1_Pos (1) /*!< EPWM_T::CNTCLR: CNTCLR1 Position */ +#define EPWM_CNTCLR_CNTCLR1_Msk (0x1ul << EPWM_CNTCLR_CNTCLR1_Pos) /*!< EPWM_T::CNTCLR: CNTCLR1 Mask */ + +#define EPWM_CNTCLR_CNTCLR2_Pos (2) /*!< EPWM_T::CNTCLR: CNTCLR2 Position */ +#define EPWM_CNTCLR_CNTCLR2_Msk (0x1ul << EPWM_CNTCLR_CNTCLR2_Pos) /*!< EPWM_T::CNTCLR: CNTCLR2 Mask */ + +#define EPWM_CNTCLR_CNTCLR3_Pos (3) /*!< EPWM_T::CNTCLR: CNTCLR3 Position */ +#define EPWM_CNTCLR_CNTCLR3_Msk (0x1ul << EPWM_CNTCLR_CNTCLR3_Pos) /*!< EPWM_T::CNTCLR: CNTCLR3 Mask */ + +#define EPWM_CNTCLR_CNTCLR4_Pos (4) /*!< EPWM_T::CNTCLR: CNTCLR4 Position */ +#define EPWM_CNTCLR_CNTCLR4_Msk (0x1ul << EPWM_CNTCLR_CNTCLR4_Pos) /*!< EPWM_T::CNTCLR: CNTCLR4 Mask */ + +#define EPWM_CNTCLR_CNTCLR5_Pos (5) /*!< EPWM_T::CNTCLR: CNTCLR5 Position */ +#define EPWM_CNTCLR_CNTCLR5_Msk (0x1ul << EPWM_CNTCLR_CNTCLR5_Pos) /*!< EPWM_T::CNTCLR: CNTCLR5 Mask */ + +#define EPWM_LOAD_LOAD0_Pos (0) /*!< EPWM_T::LOAD: LOAD0 Position */ +#define EPWM_LOAD_LOAD0_Msk (0x1ul << EPWM_LOAD_LOAD0_Pos) /*!< EPWM_T::LOAD: LOAD0 Mask */ + +#define EPWM_LOAD_LOAD1_Pos (1) /*!< EPWM_T::LOAD: LOAD1 Position */ +#define EPWM_LOAD_LOAD1_Msk (0x1ul << EPWM_LOAD_LOAD1_Pos) /*!< EPWM_T::LOAD: LOAD1 Mask */ + +#define EPWM_LOAD_LOAD2_Pos (2) /*!< EPWM_T::LOAD: LOAD2 Position */ +#define EPWM_LOAD_LOAD2_Msk (0x1ul << EPWM_LOAD_LOAD2_Pos) /*!< EPWM_T::LOAD: LOAD2 Mask */ + +#define EPWM_LOAD_LOAD3_Pos (3) /*!< EPWM_T::LOAD: LOAD3 Position */ +#define EPWM_LOAD_LOAD3_Msk (0x1ul << EPWM_LOAD_LOAD3_Pos) /*!< EPWM_T::LOAD: LOAD3 Mask */ + +#define EPWM_LOAD_LOAD4_Pos (4) /*!< EPWM_T::LOAD: LOAD4 Position */ +#define EPWM_LOAD_LOAD4_Msk (0x1ul << EPWM_LOAD_LOAD4_Pos) /*!< EPWM_T::LOAD: LOAD4 Mask */ + +#define EPWM_LOAD_LOAD5_Pos (5) /*!< EPWM_T::LOAD: LOAD5 Position */ +#define EPWM_LOAD_LOAD5_Msk (0x1ul << EPWM_LOAD_LOAD5_Pos) /*!< EPWM_T::LOAD: LOAD5 Mask */ + +#define EPWM_PERIOD0_PERIOD_Pos (0) /*!< EPWM_T::PERIOD0: PERIOD Position */ +#define EPWM_PERIOD0_PERIOD_Msk (0xfffful << EPWM_PERIOD0_PERIOD_Pos) /*!< EPWM_T::PERIOD0: PERIOD Mask */ + +#define EPWM_PERIOD1_PERIOD_Pos (0) /*!< EPWM_T::PERIOD1: PERIOD Position */ +#define EPWM_PERIOD1_PERIOD_Msk (0xfffful << EPWM_PERIOD1_PERIOD_Pos) /*!< EPWM_T::PERIOD1: PERIOD Mask */ + +#define EPWM_PERIOD2_PERIOD_Pos (0) /*!< EPWM_T::PERIOD2: PERIOD Position */ +#define EPWM_PERIOD2_PERIOD_Msk (0xfffful << EPWM_PERIOD2_PERIOD_Pos) /*!< EPWM_T::PERIOD2: PERIOD Mask */ + +#define EPWM_PERIOD3_PERIOD_Pos (0) /*!< EPWM_T::PERIOD3: PERIOD Position */ +#define EPWM_PERIOD3_PERIOD_Msk (0xfffful << EPWM_PERIOD3_PERIOD_Pos) /*!< EPWM_T::PERIOD3: PERIOD Mask */ + +#define EPWM_PERIOD4_PERIOD_Pos (0) /*!< EPWM_T::PERIOD4: PERIOD Position */ +#define EPWM_PERIOD4_PERIOD_Msk (0xfffful << EPWM_PERIOD4_PERIOD_Pos) /*!< EPWM_T::PERIOD4: PERIOD Mask */ + +#define EPWM_PERIOD5_PERIOD_Pos (0) /*!< EPWM_T::PERIOD5: PERIOD Position */ +#define EPWM_PERIOD5_PERIOD_Msk (0xfffful << EPWM_PERIOD5_PERIOD_Pos) /*!< EPWM_T::PERIOD5: PERIOD Mask */ + +#define EPWM_CMPDAT0_CMP_Pos (0) /*!< EPWM_T::CMPDAT0: CMP Position */ +#define EPWM_CMPDAT0_CMP_Msk (0xfffful << EPWM_CMPDAT0_CMP_Pos) /*!< EPWM_T::CMPDAT0: CMP Mask */ + +#define EPWM_CMPDAT1_CMP_Pos (0) /*!< EPWM_T::CMPDAT1: CMP Position */ +#define EPWM_CMPDAT1_CMP_Msk (0xfffful << EPWM_CMPDAT1_CMP_Pos) /*!< EPWM_T::CMPDAT1: CMP Mask */ + +#define EPWM_CMPDAT2_CMP_Pos (0) /*!< EPWM_T::CMPDAT2: CMP Position */ +#define EPWM_CMPDAT2_CMP_Msk (0xfffful << EPWM_CMPDAT2_CMP_Pos) /*!< EPWM_T::CMPDAT2: CMP Mask */ + +#define EPWM_CMPDAT3_CMP_Pos (0) /*!< EPWM_T::CMPDAT3: CMP Position */ +#define EPWM_CMPDAT3_CMP_Msk (0xfffful << EPWM_CMPDAT3_CMP_Pos) /*!< EPWM_T::CMPDAT3: CMP Mask */ + +#define EPWM_CMPDAT4_CMP_Pos (0) /*!< EPWM_T::CMPDAT4: CMP Position */ +#define EPWM_CMPDAT4_CMP_Msk (0xfffful << EPWM_CMPDAT4_CMP_Pos) /*!< EPWM_T::CMPDAT4: CMP Mask */ + +#define EPWM_CMPDAT5_CMP_Pos (0) /*!< EPWM_T::CMPDAT5: CMP Position */ +#define EPWM_CMPDAT5_CMP_Msk (0xfffful << EPWM_CMPDAT5_CMP_Pos) /*!< EPWM_T::CMPDAT5: CMP Mask */ + +#define EPWM_DTCTL0_1_DTCNT_Pos (0) /*!< EPWM_T::DTCTL0_1: DTCNT Position */ +#define EPWM_DTCTL0_1_DTCNT_Msk (0xffful << EPWM_DTCTL0_1_DTCNT_Pos) /*!< EPWM_T::DTCTL0_1: DTCNT Mask */ + +#define EPWM_DTCTL0_1_DTEN_Pos (16) /*!< EPWM_T::DTCTL0_1: DTEN Position */ +#define EPWM_DTCTL0_1_DTEN_Msk (0x1ul << EPWM_DTCTL0_1_DTEN_Pos) /*!< EPWM_T::DTCTL0_1: DTEN Mask */ + +#define EPWM_DTCTL0_1_DTCKSEL_Pos (24) /*!< EPWM_T::DTCTL0_1: DTCKSEL Position */ +#define EPWM_DTCTL0_1_DTCKSEL_Msk (0x1ul << EPWM_DTCTL0_1_DTCKSEL_Pos) /*!< EPWM_T::DTCTL0_1: DTCKSEL Mask */ + +#define EPWM_DTCTL2_3_DTCNT_Pos (0) /*!< EPWM_T::DTCTL2_3: DTCNT Position */ +#define EPWM_DTCTL2_3_DTCNT_Msk (0xffful << EPWM_DTCTL2_3_DTCNT_Pos) /*!< EPWM_T::DTCTL2_3: DTCNT Mask */ + +#define EPWM_DTCTL2_3_DTEN_Pos (16) /*!< EPWM_T::DTCTL2_3: DTEN Position */ +#define EPWM_DTCTL2_3_DTEN_Msk (0x1ul << EPWM_DTCTL2_3_DTEN_Pos) /*!< EPWM_T::DTCTL2_3: DTEN Mask */ + +#define EPWM_DTCTL2_3_DTCKSEL_Pos (24) /*!< EPWM_T::DTCTL2_3: DTCKSEL Position */ +#define EPWM_DTCTL2_3_DTCKSEL_Msk (0x1ul << EPWM_DTCTL2_3_DTCKSEL_Pos) /*!< EPWM_T::DTCTL2_3: DTCKSEL Mask */ + +#define EPWM_DTCTL4_5_DTCNT_Pos (0) /*!< EPWM_T::DTCTL4_5: DTCNT Position */ +#define EPWM_DTCTL4_5_DTCNT_Msk (0xffful << EPWM_DTCTL4_5_DTCNT_Pos) /*!< EPWM_T::DTCTL4_5: DTCNT Mask */ + +#define EPWM_DTCTL4_5_DTEN_Pos (16) /*!< EPWM_T::DTCTL4_5: DTEN Position */ +#define EPWM_DTCTL4_5_DTEN_Msk (0x1ul << EPWM_DTCTL4_5_DTEN_Pos) /*!< EPWM_T::DTCTL4_5: DTEN Mask */ + +#define EPWM_DTCTL4_5_DTCKSEL_Pos (24) /*!< EPWM_T::DTCTL4_5: DTCKSEL Position */ +#define EPWM_DTCTL4_5_DTCKSEL_Msk (0x1ul << EPWM_DTCTL4_5_DTCKSEL_Pos) /*!< EPWM_T::DTCTL4_5: DTCKSEL Mask */ + +#define EPWM_PHS0_1_PHS_Pos (0) /*!< EPWM_T::PHS0_1: PHS Position */ +#define EPWM_PHS0_1_PHS_Msk (0xfffful << EPWM_PHS0_1_PHS_Pos) /*!< EPWM_T::PHS0_1: PHS Mask */ + +#define EPWM_PHS2_3_PHS_Pos (0) /*!< EPWM_T::PHS2_3: PHS Position */ +#define EPWM_PHS2_3_PHS_Msk (0xfffful << EPWM_PHS2_3_PHS_Pos) /*!< EPWM_T::PHS2_3: PHS Mask */ + +#define EPWM_PHS4_5_PHS_Pos (0) /*!< EPWM_T::PHS4_5: PHS Position */ +#define EPWM_PHS4_5_PHS_Msk (0xfffful << EPWM_PHS4_5_PHS_Pos) /*!< EPWM_T::PHS4_5: PHS Mask */ + +#define EPWM_CNT0_CNT_Pos (0) /*!< EPWM_T::CNT0: CNT Position */ +#define EPWM_CNT0_CNT_Msk (0xfffful << EPWM_CNT0_CNT_Pos) /*!< EPWM_T::CNT0: CNT Mask */ + +#define EPWM_CNT0_DIRF_Pos (16) /*!< EPWM_T::CNT0: DIRF Position */ +#define EPWM_CNT0_DIRF_Msk (0x1ul << EPWM_CNT0_DIRF_Pos) /*!< EPWM_T::CNT0: DIRF Mask */ + +#define EPWM_CNT1_CNT_Pos (0) /*!< EPWM_T::CNT1: CNT Position */ +#define EPWM_CNT1_CNT_Msk (0xfffful << EPWM_CNT1_CNT_Pos) /*!< EPWM_T::CNT1: CNT Mask */ + +#define EPWM_CNT1_DIRF_Pos (16) /*!< EPWM_T::CNT1: DIRF Position */ +#define EPWM_CNT1_DIRF_Msk (0x1ul << EPWM_CNT1_DIRF_Pos) /*!< EPWM_T::CNT1: DIRF Mask */ + +#define EPWM_CNT2_CNT_Pos (0) /*!< EPWM_T::CNT2: CNT Position */ +#define EPWM_CNT2_CNT_Msk (0xfffful << EPWM_CNT2_CNT_Pos) /*!< EPWM_T::CNT2: CNT Mask */ + +#define EPWM_CNT2_DIRF_Pos (16) /*!< EPWM_T::CNT2: DIRF Position */ +#define EPWM_CNT2_DIRF_Msk (0x1ul << EPWM_CNT2_DIRF_Pos) /*!< EPWM_T::CNT2: DIRF Mask */ + +#define EPWM_CNT3_CNT_Pos (0) /*!< EPWM_T::CNT3: CNT Position */ +#define EPWM_CNT3_CNT_Msk (0xfffful << EPWM_CNT3_CNT_Pos) /*!< EPWM_T::CNT3: CNT Mask */ + +#define EPWM_CNT3_DIRF_Pos (16) /*!< EPWM_T::CNT3: DIRF Position */ +#define EPWM_CNT3_DIRF_Msk (0x1ul << EPWM_CNT3_DIRF_Pos) /*!< EPWM_T::CNT3: DIRF Mask */ + +#define EPWM_CNT4_CNT_Pos (0) /*!< EPWM_T::CNT4: CNT Position */ +#define EPWM_CNT4_CNT_Msk (0xfffful << EPWM_CNT4_CNT_Pos) /*!< EPWM_T::CNT4: CNT Mask */ + +#define EPWM_CNT4_DIRF_Pos (16) /*!< EPWM_T::CNT4: DIRF Position */ +#define EPWM_CNT4_DIRF_Msk (0x1ul << EPWM_CNT4_DIRF_Pos) /*!< EPWM_T::CNT4: DIRF Mask */ + +#define EPWM_CNT5_CNT_Pos (0) /*!< EPWM_T::CNT5: CNT Position */ +#define EPWM_CNT5_CNT_Msk (0xfffful << EPWM_CNT5_CNT_Pos) /*!< EPWM_T::CNT5: CNT Mask */ + +#define EPWM_CNT5_DIRF_Pos (16) /*!< EPWM_T::CNT5: DIRF Position */ +#define EPWM_CNT5_DIRF_Msk (0x1ul << EPWM_CNT5_DIRF_Pos) /*!< EPWM_T::CNT5: DIRF Mask */ + +#define EPWM_WGCTL0_ZPCTL0_Pos (0) /*!< EPWM_T::WGCTL0: ZPCTL0 Position */ +#define EPWM_WGCTL0_ZPCTL0_Msk (0x3ul << EPWM_WGCTL0_ZPCTL0_Pos) /*!< EPWM_T::WGCTL0: ZPCTL0 Mask */ + +#define EPWM_WGCTL0_ZPCTL1_Pos (2) /*!< EPWM_T::WGCTL0: ZPCTL1 Position */ +#define EPWM_WGCTL0_ZPCTL1_Msk (0x3ul << EPWM_WGCTL0_ZPCTL1_Pos) /*!< EPWM_T::WGCTL0: ZPCTL1 Mask */ + +#define EPWM_WGCTL0_ZPCTL2_Pos (4) /*!< EPWM_T::WGCTL0: ZPCTL2 Position */ +#define EPWM_WGCTL0_ZPCTL2_Msk (0x3ul << EPWM_WGCTL0_ZPCTL2_Pos) /*!< EPWM_T::WGCTL0: ZPCTL2 Mask */ + +#define EPWM_WGCTL0_ZPCTL3_Pos (6) /*!< EPWM_T::WGCTL0: ZPCTL3 Position */ +#define EPWM_WGCTL0_ZPCTL3_Msk (0x3ul << EPWM_WGCTL0_ZPCTL3_Pos) /*!< EPWM_T::WGCTL0: ZPCTL3 Mask */ + +#define EPWM_WGCTL0_ZPCTL4_Pos (8) /*!< EPWM_T::WGCTL0: ZPCTL4 Position */ +#define EPWM_WGCTL0_ZPCTL4_Msk (0x3ul << EPWM_WGCTL0_ZPCTL4_Pos) /*!< EPWM_T::WGCTL0: ZPCTL4 Mask */ + +#define EPWM_WGCTL0_ZPCTL5_Pos (10) /*!< EPWM_T::WGCTL0: ZPCTL5 Position */ +#define EPWM_WGCTL0_ZPCTL5_Msk (0x3ul << EPWM_WGCTL0_ZPCTL5_Pos) /*!< EPWM_T::WGCTL0: ZPCTL5 Mask */ + +#define EPWM_WGCTL0_PRDPCTL0_Pos (16) /*!< EPWM_T::WGCTL0: PRDPCTL0 Position */ +#define EPWM_WGCTL0_PRDPCTL0_Msk (0x3ul << EPWM_WGCTL0_PRDPCTL0_Pos) /*!< EPWM_T::WGCTL0: PRDPCTL0 Mask */ + +#define EPWM_WGCTL0_PRDPCTL1_Pos (18) /*!< EPWM_T::WGCTL0: PRDPCTL1 Position */ +#define EPWM_WGCTL0_PRDPCTL1_Msk (0x3ul << EPWM_WGCTL0_PRDPCTL1_Pos) /*!< EPWM_T::WGCTL0: PRDPCTL1 Mask */ + +#define EPWM_WGCTL0_PRDPCTL2_Pos (20) /*!< EPWM_T::WGCTL0: PRDPCTL2 Position */ +#define EPWM_WGCTL0_PRDPCTL2_Msk (0x3ul << EPWM_WGCTL0_PRDPCTL2_Pos) /*!< EPWM_T::WGCTL0: PRDPCTL2 Mask */ + +#define EPWM_WGCTL0_PRDPCTL3_Pos (22) /*!< EPWM_T::WGCTL0: PRDPCTL3 Position */ +#define EPWM_WGCTL0_PRDPCTL3_Msk (0x3ul << EPWM_WGCTL0_PRDPCTL3_Pos) /*!< EPWM_T::WGCTL0: PRDPCTL3 Mask */ + +#define EPWM_WGCTL0_PRDPCTL4_Pos (24) /*!< EPWM_T::WGCTL0: PRDPCTL4 Position */ +#define EPWM_WGCTL0_PRDPCTL4_Msk (0x3ul << EPWM_WGCTL0_PRDPCTL4_Pos) /*!< EPWM_T::WGCTL0: PRDPCTL4 Mask */ + +#define EPWM_WGCTL0_PRDPCTL5_Pos (26) /*!< EPWM_T::WGCTL0: PRDPCTL5 Position */ +#define EPWM_WGCTL0_PRDPCTL5_Msk (0x3ul << EPWM_WGCTL0_PRDPCTL5_Pos) /*!< EPWM_T::WGCTL0: PRDPCTL5 Mask */ + +#define EPWM_WGCTL1_CMPUCTL0_Pos (0) /*!< EPWM_T::WGCTL1: CMPUCTL0 Position */ +#define EPWM_WGCTL1_CMPUCTL0_Msk (0x3ul << EPWM_WGCTL1_CMPUCTL0_Pos) /*!< EPWM_T::WGCTL1: CMPUCTL0 Mask */ + +#define EPWM_WGCTL1_CMPUCTL1_Pos (2) /*!< EPWM_T::WGCTL1: CMPUCTL1 Position */ +#define EPWM_WGCTL1_CMPUCTL1_Msk (0x3ul << EPWM_WGCTL1_CMPUCTL1_Pos) /*!< EPWM_T::WGCTL1: CMPUCTL1 Mask */ + +#define EPWM_WGCTL1_CMPUCTL2_Pos (4) /*!< EPWM_T::WGCTL1: CMPUCTL2 Position */ +#define EPWM_WGCTL1_CMPUCTL2_Msk (0x3ul << EPWM_WGCTL1_CMPUCTL2_Pos) /*!< EPWM_T::WGCTL1: CMPUCTL2 Mask */ + +#define EPWM_WGCTL1_CMPUCTL3_Pos (6) /*!< EPWM_T::WGCTL1: CMPUCTL3 Position */ +#define EPWM_WGCTL1_CMPUCTL3_Msk (0x3ul << EPWM_WGCTL1_CMPUCTL3_Pos) /*!< EPWM_T::WGCTL1: CMPUCTL3 Mask */ + +#define EPWM_WGCTL1_CMPUCTL4_Pos (8) /*!< EPWM_T::WGCTL1: CMPUCTL4 Position */ +#define EPWM_WGCTL1_CMPUCTL4_Msk (0x3ul << EPWM_WGCTL1_CMPUCTL4_Pos) /*!< EPWM_T::WGCTL1: CMPUCTL4 Mask */ + +#define EPWM_WGCTL1_CMPUCTL5_Pos (10) /*!< EPWM_T::WGCTL1: CMPUCTL5 Position */ +#define EPWM_WGCTL1_CMPUCTL5_Msk (0x3ul << EPWM_WGCTL1_CMPUCTL5_Pos) /*!< EPWM_T::WGCTL1: CMPUCTL5 Mask */ + +#define EPWM_WGCTL1_CMPDCTL0_Pos (16) /*!< EPWM_T::WGCTL1: CMPDCTL0 Position */ +#define EPWM_WGCTL1_CMPDCTL0_Msk (0x3ul << EPWM_WGCTL1_CMPDCTL0_Pos) /*!< EPWM_T::WGCTL1: CMPDCTL0 Mask */ + +#define EPWM_WGCTL1_CMPDCTL1_Pos (18) /*!< EPWM_T::WGCTL1: CMPDCTL1 Position */ +#define EPWM_WGCTL1_CMPDCTL1_Msk (0x3ul << EPWM_WGCTL1_CMPDCTL1_Pos) /*!< EPWM_T::WGCTL1: CMPDCTL1 Mask */ + +#define EPWM_WGCTL1_CMPDCTL2_Pos (20) /*!< EPWM_T::WGCTL1: CMPDCTL2 Position */ +#define EPWM_WGCTL1_CMPDCTL2_Msk (0x3ul << EPWM_WGCTL1_CMPDCTL2_Pos) /*!< EPWM_T::WGCTL1: CMPDCTL2 Mask */ + +#define EPWM_WGCTL1_CMPDCTL3_Pos (22) /*!< EPWM_T::WGCTL1: CMPDCTL3 Position */ +#define EPWM_WGCTL1_CMPDCTL3_Msk (0x3ul << EPWM_WGCTL1_CMPDCTL3_Pos) /*!< EPWM_T::WGCTL1: CMPDCTL3 Mask */ + +#define EPWM_WGCTL1_CMPDCTL4_Pos (24) /*!< EPWM_T::WGCTL1: CMPDCTL4 Position */ +#define EPWM_WGCTL1_CMPDCTL4_Msk (0x3ul << EPWM_WGCTL1_CMPDCTL4_Pos) /*!< EPWM_T::WGCTL1: CMPDCTL4 Mask */ + +#define EPWM_WGCTL1_CMPDCTL5_Pos (26) /*!< EPWM_T::WGCTL1: CMPDCTL5 Position */ +#define EPWM_WGCTL1_CMPDCTL5_Msk (0x3ul << EPWM_WGCTL1_CMPDCTL5_Pos) /*!< EPWM_T::WGCTL1: CMPDCTL5 Mask */ + +#define EPWM_MSKEN_MSKEN0_Pos (0) /*!< EPWM_T::MSKEN: MSKEN0 Position */ +#define EPWM_MSKEN_MSKEN0_Msk (0x1ul << EPWM_MSKEN_MSKEN0_Pos) /*!< EPWM_T::MSKEN: MSKEN0 Mask */ + +#define EPWM_MSKEN_MSKEN1_Pos (1) /*!< EPWM_T::MSKEN: MSKEN1 Position */ +#define EPWM_MSKEN_MSKEN1_Msk (0x1ul << EPWM_MSKEN_MSKEN1_Pos) /*!< EPWM_T::MSKEN: MSKEN1 Mask */ + +#define EPWM_MSKEN_MSKEN2_Pos (2) /*!< EPWM_T::MSKEN: MSKEN2 Position */ +#define EPWM_MSKEN_MSKEN2_Msk (0x1ul << EPWM_MSKEN_MSKEN2_Pos) /*!< EPWM_T::MSKEN: MSKEN2 Mask */ + +#define EPWM_MSKEN_MSKEN3_Pos (3) /*!< EPWM_T::MSKEN: MSKEN3 Position */ +#define EPWM_MSKEN_MSKEN3_Msk (0x1ul << EPWM_MSKEN_MSKEN3_Pos) /*!< EPWM_T::MSKEN: MSKEN3 Mask */ + +#define EPWM_MSKEN_MSKEN4_Pos (4) /*!< EPWM_T::MSKEN: MSKEN4 Position */ +#define EPWM_MSKEN_MSKEN4_Msk (0x1ul << EPWM_MSKEN_MSKEN4_Pos) /*!< EPWM_T::MSKEN: MSKEN4 Mask */ + +#define EPWM_MSKEN_MSKEN5_Pos (5) /*!< EPWM_T::MSKEN: MSKEN5 Position */ +#define EPWM_MSKEN_MSKEN5_Msk (0x1ul << EPWM_MSKEN_MSKEN5_Pos) /*!< EPWM_T::MSKEN: MSKEN5 Mask */ + +#define EPWM_MSK_MSKDAT0_Pos (0) /*!< EPWM_T::MSK: MSKDAT0 Position */ +#define EPWM_MSK_MSKDAT0_Msk (0x1ul << EPWM_MSK_MSKDAT0_Pos) /*!< EPWM_T::MSK: MSKDAT0 Mask */ + +#define EPWM_MSK_MSKDAT1_Pos (1) /*!< EPWM_T::MSK: MSKDAT1 Position */ +#define EPWM_MSK_MSKDAT1_Msk (0x1ul << EPWM_MSK_MSKDAT1_Pos) /*!< EPWM_T::MSK: MSKDAT1 Mask */ + +#define EPWM_MSK_MSKDAT2_Pos (2) /*!< EPWM_T::MSK: MSKDAT2 Position */ +#define EPWM_MSK_MSKDAT2_Msk (0x1ul << EPWM_MSK_MSKDAT2_Pos) /*!< EPWM_T::MSK: MSKDAT2 Mask */ + +#define EPWM_MSK_MSKDAT3_Pos (3) /*!< EPWM_T::MSK: MSKDAT3 Position */ +#define EPWM_MSK_MSKDAT3_Msk (0x1ul << EPWM_MSK_MSKDAT3_Pos) /*!< EPWM_T::MSK: MSKDAT3 Mask */ + +#define EPWM_MSK_MSKDAT4_Pos (4) /*!< EPWM_T::MSK: MSKDAT4 Position */ +#define EPWM_MSK_MSKDAT4_Msk (0x1ul << EPWM_MSK_MSKDAT4_Pos) /*!< EPWM_T::MSK: MSKDAT4 Mask */ + +#define EPWM_MSK_MSKDAT5_Pos (5) /*!< EPWM_T::MSK: MSKDAT5 Position */ +#define EPWM_MSK_MSKDAT5_Msk (0x1ul << EPWM_MSK_MSKDAT5_Pos) /*!< EPWM_T::MSK: MSKDAT5 Mask */ + +#define EPWM_BNF_BRK0NFEN_Pos (0) /*!< EPWM_T::BNF: BRK0NFEN Position */ +#define EPWM_BNF_BRK0NFEN_Msk (0x1ul << EPWM_BNF_BRK0NFEN_Pos) /*!< EPWM_T::BNF: BRK0NFEN Mask */ + +#define EPWM_BNF_BRK0NFSEL_Pos (1) /*!< EPWM_T::BNF: BRK0NFSEL Position */ +#define EPWM_BNF_BRK0NFSEL_Msk (0x7ul << EPWM_BNF_BRK0NFSEL_Pos) /*!< EPWM_T::BNF: BRK0NFSEL Mask */ + +#define EPWM_BNF_BRK0FCNT_Pos (4) /*!< EPWM_T::BNF: BRK0FCNT Position */ +#define EPWM_BNF_BRK0FCNT_Msk (0x7ul << EPWM_BNF_BRK0FCNT_Pos) /*!< EPWM_T::BNF: BRK0FCNT Mask */ + +#define EPWM_BNF_BRK0PINV_Pos (7) /*!< EPWM_T::BNF: BRK0PINV Position */ +#define EPWM_BNF_BRK0PINV_Msk (0x1ul << EPWM_BNF_BRK0PINV_Pos) /*!< EPWM_T::BNF: BRK0PINV Mask */ + +#define EPWM_BNF_BRK1NFEN_Pos (8) /*!< EPWM_T::BNF: BRK1NFEN Position */ +#define EPWM_BNF_BRK1NFEN_Msk (0x1ul << EPWM_BNF_BRK1NFEN_Pos) /*!< EPWM_T::BNF: BRK1NFEN Mask */ + +#define EPWM_BNF_BRK1NFSEL_Pos (9) /*!< EPWM_T::BNF: BRK1NFSEL Position */ +#define EPWM_BNF_BRK1NFSEL_Msk (0x7ul << EPWM_BNF_BRK1NFSEL_Pos) /*!< EPWM_T::BNF: BRK1NFSEL Mask */ + +#define EPWM_BNF_BRK1FCNT_Pos (12) /*!< EPWM_T::BNF: BRK1FCNT Position */ +#define EPWM_BNF_BRK1FCNT_Msk (0x7ul << EPWM_BNF_BRK1FCNT_Pos) /*!< EPWM_T::BNF: BRK1FCNT Mask */ + +#define EPWM_BNF_BRK1PINV_Pos (15) /*!< EPWM_T::BNF: BRK1PINV Position */ +#define EPWM_BNF_BRK1PINV_Msk (0x1ul << EPWM_BNF_BRK1PINV_Pos) /*!< EPWM_T::BNF: BRK1PINV Mask */ + +#define EPWM_BNF_BK0SRC_Pos (16) /*!< EPWM_T::BNF: BK0SRC Position */ +#define EPWM_BNF_BK0SRC_Msk (0x3ul << EPWM_BNF_BK0SRC_Pos) /*!< EPWM_T::BNF: BK0SRC Mask */ + +#define EPWM_BNF_BK1SRC_Pos (24) /*!< EPWM_T::BNF: BK1SRC Position */ +#define EPWM_BNF_BK1SRC_Msk (0x3ul << EPWM_BNF_BK1SRC_Pos) /*!< EPWM_T::BNF: BK1SRC Mask */ + +#define EPWM_FAILBRK_CSSBRKEN_Pos (0) /*!< EPWM_T::FAILBRK: CSSBRKEN Position */ +#define EPWM_FAILBRK_CSSBRKEN_Msk (0x1ul << EPWM_FAILBRK_CSSBRKEN_Pos) /*!< EPWM_T::FAILBRK: CSSBRKEN Mask */ + +#define EPWM_FAILBRK_LVDBRKEN_Pos (1) /*!< EPWM_T::FAILBRK: LVDBRKEN Position */ +#define EPWM_FAILBRK_LVDBRKEN_Msk (0x1ul << EPWM_FAILBRK_LVDBRKEN_Pos) /*!< EPWM_T::FAILBRK: LVDBRKEN Mask */ + +#define EPWM_FAILBRK_BODBRKEN_Pos (1) /*!< EPWM_T::FAILBRK: BODBRKEN Position */ +#define EPWM_FAILBRK_BODBRKEN_Msk (0x1ul << EPWM_FAILBRK_BODBRKEN_Pos) /*!< EPWM_T::FAILBRK: BODBRKEN Mask */ + +#define EPWM_FAILBRK_RAMBRKEN_Pos (2) /*!< EPWM_T::FAILBRK: RAMBRKEN Position */ +#define EPWM_FAILBRK_RAMBRKEN_Msk (0x1ul << EPWM_FAILBRK_RAMBRKEN_Pos) /*!< EPWM_T::FAILBRK: RAMBRKEN Mask */ + +#define EPWM_FAILBRK_CORBRKEN_Pos (3) /*!< EPWM_T::FAILBRK: CORBRKEN Position */ +#define EPWM_FAILBRK_CORBRKEN_Msk (0x1ul << EPWM_FAILBRK_CORBRKEN_Pos) /*!< EPWM_T::FAILBRK: CORBRKEN Mask */ + +#define EPWM_BRKCTL0_1_BRKP0EEN_Pos (4) /*!< EPWM_T::BRKCTL0_1: BRKP0EEN Position */ +#define EPWM_BRKCTL0_1_BRKP0EEN_Msk (0x1ul << EPWM_BRKCTL0_1_BRKP0EEN_Pos) /*!< EPWM_T::BRKCTL0_1: BRKP0EEN Mask */ + +#define EPWM_BRKCTL0_1_BRKP1EEN_Pos (5) /*!< EPWM_T::BRKCTL0_1: BRKP1EEN Position */ +#define EPWM_BRKCTL0_1_BRKP1EEN_Msk (0x1ul << EPWM_BRKCTL0_1_BRKP1EEN_Pos) /*!< EPWM_T::BRKCTL0_1: BRKP1EEN Mask */ + +#define EPWM_BRKCTL0_1_SYSEBEN_Pos (7) /*!< EPWM_T::BRKCTL0_1: SYSEBEN Position */ +#define EPWM_BRKCTL0_1_SYSEBEN_Msk (0x1ul << EPWM_BRKCTL0_1_SYSEBEN_Pos) /*!< EPWM_T::BRKCTL0_1: SYSEBEN Mask */ + +#define EPWM_BRKCTL0_1_BRKP0LEN_Pos (12) /*!< EPWM_T::BRKCTL0_1: BRKP0LEN Position */ +#define EPWM_BRKCTL0_1_BRKP0LEN_Msk (0x1ul << EPWM_BRKCTL0_1_BRKP0LEN_Pos) /*!< EPWM_T::BRKCTL0_1: BRKP0LEN Mask */ + +#define EPWM_BRKCTL0_1_BRKP1LEN_Pos (13) /*!< EPWM_T::BRKCTL0_1: BRKP1LEN Position */ +#define EPWM_BRKCTL0_1_BRKP1LEN_Msk (0x1ul << EPWM_BRKCTL0_1_BRKP1LEN_Pos) /*!< EPWM_T::BRKCTL0_1: BRKP1LEN Mask */ + +#define EPWM_BRKCTL0_1_SYSLBEN_Pos (15) /*!< EPWM_T::BRKCTL0_1: SYSLBEN Position */ +#define EPWM_BRKCTL0_1_SYSLBEN_Msk (0x1ul << EPWM_BRKCTL0_1_SYSLBEN_Pos) /*!< EPWM_T::BRKCTL0_1: SYSLBEN Mask */ + +#define EPWM_BRKCTL0_1_BRKAEVEN_Pos (16) /*!< EPWM_T::BRKCTL0_1: BRKAEVEN Position */ +#define EPWM_BRKCTL0_1_BRKAEVEN_Msk (0x3ul << EPWM_BRKCTL0_1_BRKAEVEN_Pos) /*!< EPWM_T::BRKCTL0_1: BRKAEVEN Mask */ + +#define EPWM_BRKCTL0_1_BRKAODD_Pos (18) /*!< EPWM_T::BRKCTL0_1: BRKAODD Position */ +#define EPWM_BRKCTL0_1_BRKAODD_Msk (0x3ul << EPWM_BRKCTL0_1_BRKAODD_Pos) /*!< EPWM_T::BRKCTL0_1: BRKAODD Mask */ + +#define EPWM_BRKCTL0_1_EADCEBEN_Pos (20) /*!< EPWM_T::BRKCTL0_1: EADCEBEN Position */ +#define EPWM_BRKCTL0_1_EADCEBEN_Msk (0x1ul << EPWM_BRKCTL0_1_EADCEBEN_Pos) /*!< EPWM_T::BRKCTL0_1: EADCEBEN Mask */ + +#define EPWM_BRKCTL0_1_EADCLBEN_Pos (28) /*!< EPWM_T::BRKCTL0_1: EADCLBEN Position */ +#define EPWM_BRKCTL0_1_EADCLBEN_Msk (0x1ul << EPWM_BRKCTL0_1_EADCLBEN_Pos) /*!< EPWM_T::BRKCTL0_1: EADCLBEN Mask */ + +#define EPWM_BRKCTL2_3_BRKP0EEN_Pos (4) /*!< EPWM_T::BRKCTL2_3: BRKP0EEN Position */ +#define EPWM_BRKCTL2_3_BRKP0EEN_Msk (0x1ul << EPWM_BRKCTL2_3_BRKP0EEN_Pos) /*!< EPWM_T::BRKCTL2_3: BRKP0EEN Mask */ + +#define EPWM_BRKCTL2_3_BRKP1EEN_Pos (5) /*!< EPWM_T::BRKCTL2_3: BRKP1EEN Position */ +#define EPWM_BRKCTL2_3_BRKP1EEN_Msk (0x1ul << EPWM_BRKCTL2_3_BRKP1EEN_Pos) /*!< EPWM_T::BRKCTL2_3: BRKP1EEN Mask */ + +#define EPWM_BRKCTL2_3_SYSEBEN_Pos (7) /*!< EPWM_T::BRKCTL2_3: SYSEBEN Position */ +#define EPWM_BRKCTL2_3_SYSEBEN_Msk (0x1ul << EPWM_BRKCTL2_3_SYSEBEN_Pos) /*!< EPWM_T::BRKCTL2_3: SYSEBEN Mask */ + +#define EPWM_BRKCTL2_3_BRKP0LEN_Pos (12) /*!< EPWM_T::BRKCTL2_3: BRKP0LEN Position */ +#define EPWM_BRKCTL2_3_BRKP0LEN_Msk (0x1ul << EPWM_BRKCTL2_3_BRKP0LEN_Pos) /*!< EPWM_T::BRKCTL2_3: BRKP0LEN Mask */ + +#define EPWM_BRKCTL2_3_BRKP1LEN_Pos (13) /*!< EPWM_T::BRKCTL2_3: BRKP1LEN Position */ +#define EPWM_BRKCTL2_3_BRKP1LEN_Msk (0x1ul << EPWM_BRKCTL2_3_BRKP1LEN_Pos) /*!< EPWM_T::BRKCTL2_3: BRKP1LEN Mask */ + +#define EPWM_BRKCTL2_3_SYSLBEN_Pos (15) /*!< EPWM_T::BRKCTL2_3: SYSLBEN Position */ +#define EPWM_BRKCTL2_3_SYSLBEN_Msk (0x1ul << EPWM_BRKCTL2_3_SYSLBEN_Pos) /*!< EPWM_T::BRKCTL2_3: SYSLBEN Mask */ + +#define EPWM_BRKCTL2_3_BRKAEVEN_Pos (16) /*!< EPWM_T::BRKCTL2_3: BRKAEVEN Position */ +#define EPWM_BRKCTL2_3_BRKAEVEN_Msk (0x3ul << EPWM_BRKCTL2_3_BRKAEVEN_Pos) /*!< EPWM_T::BRKCTL2_3: BRKAEVEN Mask */ + +#define EPWM_BRKCTL2_3_BRKAODD_Pos (18) /*!< EPWM_T::BRKCTL2_3: BRKAODD Position */ +#define EPWM_BRKCTL2_3_BRKAODD_Msk (0x3ul << EPWM_BRKCTL2_3_BRKAODD_Pos) /*!< EPWM_T::BRKCTL2_3: BRKAODD Mask */ + +#define EPWM_BRKCTL2_3_EADCEBEN_Pos (20) /*!< EPWM_T::BRKCTL2_3: EADCEBEN Position */ +#define EPWM_BRKCTL2_3_EADCEBEN_Msk (0x1ul << EPWM_BRKCTL2_3_EADCEBEN_Pos) /*!< EPWM_T::BRKCTL2_3: EADCEBEN Mask */ + +#define EPWM_BRKCTL2_3_EADCLBEN_Pos (28) /*!< EPWM_T::BRKCTL2_3: EADCLBEN Position */ +#define EPWM_BRKCTL2_3_EADCLBEN_Msk (0x1ul << EPWM_BRKCTL2_3_EADCLBEN_Pos) /*!< EPWM_T::BRKCTL2_3: EADCLBEN Mask */ + +#define EPWM_BRKCTL4_5_BRKP0EEN_Pos (4) /*!< EPWM_T::BRKCTL4_5: BRKP0EEN Position */ +#define EPWM_BRKCTL4_5_BRKP0EEN_Msk (0x1ul << EPWM_BRKCTL4_5_BRKP0EEN_Pos) /*!< EPWM_T::BRKCTL4_5: BRKP0EEN Mask */ + +#define EPWM_BRKCTL4_5_BRKP1EEN_Pos (5) /*!< EPWM_T::BRKCTL4_5: BRKP1EEN Position */ +#define EPWM_BRKCTL4_5_BRKP1EEN_Msk (0x1ul << EPWM_BRKCTL4_5_BRKP1EEN_Pos) /*!< EPWM_T::BRKCTL4_5: BRKP1EEN Mask */ + +#define EPWM_BRKCTL4_5_SYSEBEN_Pos (7) /*!< EPWM_T::BRKCTL4_5: SYSEBEN Position */ +#define EPWM_BRKCTL4_5_SYSEBEN_Msk (0x1ul << EPWM_BRKCTL4_5_SYSEBEN_Pos) /*!< EPWM_T::BRKCTL4_5: SYSEBEN Mask */ + +#define EPWM_BRKCTL4_5_BRKP0LEN_Pos (12) /*!< EPWM_T::BRKCTL4_5: BRKP0LEN Position */ +#define EPWM_BRKCTL4_5_BRKP0LEN_Msk (0x1ul << EPWM_BRKCTL4_5_BRKP0LEN_Pos) /*!< EPWM_T::BRKCTL4_5: BRKP0LEN Mask */ + +#define EPWM_BRKCTL4_5_BRKP1LEN_Pos (13) /*!< EPWM_T::BRKCTL4_5: BRKP1LEN Position */ +#define EPWM_BRKCTL4_5_BRKP1LEN_Msk (0x1ul << EPWM_BRKCTL4_5_BRKP1LEN_Pos) /*!< EPWM_T::BRKCTL4_5: BRKP1LEN Mask */ + +#define EPWM_BRKCTL4_5_SYSLBEN_Pos (15) /*!< EPWM_T::BRKCTL4_5: SYSLBEN Position */ +#define EPWM_BRKCTL4_5_SYSLBEN_Msk (0x1ul << EPWM_BRKCTL4_5_SYSLBEN_Pos) /*!< EPWM_T::BRKCTL4_5: SYSLBEN Mask */ + +#define EPWM_BRKCTL4_5_BRKAEVEN_Pos (16) /*!< EPWM_T::BRKCTL4_5: BRKAEVEN Position */ +#define EPWM_BRKCTL4_5_BRKAEVEN_Msk (0x3ul << EPWM_BRKCTL4_5_BRKAEVEN_Pos) /*!< EPWM_T::BRKCTL4_5: BRKAEVEN Mask */ + +#define EPWM_BRKCTL4_5_BRKAODD_Pos (18) /*!< EPWM_T::BRKCTL4_5: BRKAODD Position */ +#define EPWM_BRKCTL4_5_BRKAODD_Msk (0x3ul << EPWM_BRKCTL4_5_BRKAODD_Pos) /*!< EPWM_T::BRKCTL4_5: BRKAODD Mask */ + +#define EPWM_BRKCTL4_5_EADCEBEN_Pos (20) /*!< EPWM_T::BRKCTL4_5: EADCEBEN Position */ +#define EPWM_BRKCTL4_5_EADCEBEN_Msk (0x1ul << EPWM_BRKCTL4_5_EADCEBEN_Pos) /*!< EPWM_T::BRKCTL4_5: EADCEBEN Mask */ + +#define EPWM_BRKCTL4_5_EADCLBEN_Pos (28) /*!< EPWM_T::BRKCTL4_5: EADCLBEN Position */ +#define EPWM_BRKCTL4_5_EADCLBEN_Msk (0x1ul << EPWM_BRKCTL4_5_EADCLBEN_Pos) /*!< EPWM_T::BRKCTL4_5: EADCLBEN Mask */ + +#define EPWM_POLCTL_PINV0_Pos (0) /*!< EPWM_T::POLCTL: PINV0 Position */ +#define EPWM_POLCTL_PINV0_Msk (0x1ul << EPWM_POLCTL_PINV0_Pos) /*!< EPWM_T::POLCTL: PINV0 Mask */ + +#define EPWM_POLCTL_PINV1_Pos (1) /*!< EPWM_T::POLCTL: PINV1 Position */ +#define EPWM_POLCTL_PINV1_Msk (0x1ul << EPWM_POLCTL_PINV1_Pos) /*!< EPWM_T::POLCTL: PINV1 Mask */ + +#define EPWM_POLCTL_PINV2_Pos (2) /*!< EPWM_T::POLCTL: PINV2 Position */ +#define EPWM_POLCTL_PINV2_Msk (0x1ul << EPWM_POLCTL_PINV2_Pos) /*!< EPWM_T::POLCTL: PINV2 Mask */ + +#define EPWM_POLCTL_PINV3_Pos (3) /*!< EPWM_T::POLCTL: PINV3 Position */ +#define EPWM_POLCTL_PINV3_Msk (0x1ul << EPWM_POLCTL_PINV3_Pos) /*!< EPWM_T::POLCTL: PINV3 Mask */ + +#define EPWM_POLCTL_PINV4_Pos (4) /*!< EPWM_T::POLCTL: PINV4 Position */ +#define EPWM_POLCTL_PINV4_Msk (0x1ul << EPWM_POLCTL_PINV4_Pos) /*!< EPWM_T::POLCTL: PINV4 Mask */ + +#define EPWM_POLCTL_PINV5_Pos (5) /*!< EPWM_T::POLCTL: PINV5 Position */ +#define EPWM_POLCTL_PINV5_Msk (0x1ul << EPWM_POLCTL_PINV5_Pos) /*!< EPWM_T::POLCTL: PINV5 Mask */ + +#define EPWM_POEN_POEN0_Pos (0) /*!< EPWM_T::POEN: POEN0 Position */ +#define EPWM_POEN_POEN0_Msk (0x1ul << EPWM_POEN_POEN0_Pos) /*!< EPWM_T::POEN: POEN0 Mask */ + +#define EPWM_POEN_POEN1_Pos (1) /*!< EPWM_T::POEN: POEN1 Position */ +#define EPWM_POEN_POEN1_Msk (0x1ul << EPWM_POEN_POEN1_Pos) /*!< EPWM_T::POEN: POEN1 Mask */ + +#define EPWM_POEN_POEN2_Pos (2) /*!< EPWM_T::POEN: POEN2 Position */ +#define EPWM_POEN_POEN2_Msk (0x1ul << EPWM_POEN_POEN2_Pos) /*!< EPWM_T::POEN: POEN2 Mask */ + +#define EPWM_POEN_POEN3_Pos (3) /*!< EPWM_T::POEN: POEN3 Position */ +#define EPWM_POEN_POEN3_Msk (0x1ul << EPWM_POEN_POEN3_Pos) /*!< EPWM_T::POEN: POEN3 Mask */ + +#define EPWM_POEN_POEN4_Pos (4) /*!< EPWM_T::POEN: POEN4 Position */ +#define EPWM_POEN_POEN4_Msk (0x1ul << EPWM_POEN_POEN4_Pos) /*!< EPWM_T::POEN: POEN4 Mask */ + +#define EPWM_POEN_POEN5_Pos (5) /*!< EPWM_T::POEN: POEN5 Position */ +#define EPWM_POEN_POEN5_Msk (0x1ul << EPWM_POEN_POEN5_Pos) /*!< EPWM_T::POEN: POEN5 Mask */ + +#define EPWM_SWBRK_BRKETRG0_Pos (0) /*!< EPWM_T::SWBRK: BRKETRG0 Position */ +#define EPWM_SWBRK_BRKETRG0_Msk (0x1ul << EPWM_SWBRK_BRKETRG0_Pos) /*!< EPWM_T::SWBRK: BRKETRG0 Mask */ + +#define EPWM_SWBRK_BRKETRG2_Pos (1) /*!< EPWM_T::SWBRK: BRKETRG2 Position */ +#define EPWM_SWBRK_BRKETRG2_Msk (0x1ul << EPWM_SWBRK_BRKETRG2_Pos) /*!< EPWM_T::SWBRK: BRKETRG2 Mask */ + +#define EPWM_SWBRK_BRKETRG4_Pos (2) /*!< EPWM_T::SWBRK: BRKETRG4 Position */ +#define EPWM_SWBRK_BRKETRG4_Msk (0x1ul << EPWM_SWBRK_BRKETRG4_Pos) /*!< EPWM_T::SWBRK: BRKETRG4 Mask */ + +#define EPWM_SWBRK_BRKLTRG0_Pos (8) /*!< EPWM_T::SWBRK: BRKLTRG0 Position */ +#define EPWM_SWBRK_BRKLTRG0_Msk (0x1ul << EPWM_SWBRK_BRKLTRG0_Pos) /*!< EPWM_T::SWBRK: BRKLTRG0 Mask */ + +#define EPWM_SWBRK_BRKLTRG2_Pos (9) /*!< EPWM_T::SWBRK: BRKLTRG2 Position */ +#define EPWM_SWBRK_BRKLTRG2_Msk (0x1ul << EPWM_SWBRK_BRKLTRG2_Pos) /*!< EPWM_T::SWBRK: BRKLTRG2 Mask */ + +#define EPWM_SWBRK_BRKLTRG4_Pos (10) /*!< EPWM_T::SWBRK: BRKLTRG4 Position */ +#define EPWM_SWBRK_BRKLTRG4_Msk (0x1ul << EPWM_SWBRK_BRKLTRG4_Pos) /*!< EPWM_T::SWBRK: BRKLTRG4 Mask */ + +#define EPWM_INTEN0_ZIEN0_Pos (0) /*!< EPWM_T::INTEN0: ZIEN0 Position */ +#define EPWM_INTEN0_ZIEN0_Msk (0x1ul << EPWM_INTEN0_ZIEN0_Pos) /*!< EPWM_T::INTEN0: ZIEN0 Mask */ + +#define EPWM_INTEN0_ZIEN1_Pos (1) /*!< EPWM_T::INTEN0: ZIEN1 Position */ +#define EPWM_INTEN0_ZIEN1_Msk (0x1ul << EPWM_INTEN0_ZIEN1_Pos) /*!< EPWM_T::INTEN0: ZIEN1 Mask */ + +#define EPWM_INTEN0_ZIEN2_Pos (2) /*!< EPWM_T::INTEN0: ZIEN2 Position */ +#define EPWM_INTEN0_ZIEN2_Msk (0x1ul << EPWM_INTEN0_ZIEN2_Pos) /*!< EPWM_T::INTEN0: ZIEN2 Mask */ + +#define EPWM_INTEN0_ZIEN3_Pos (3) /*!< EPWM_T::INTEN0: ZIEN3 Position */ +#define EPWM_INTEN0_ZIEN3_Msk (0x1ul << EPWM_INTEN0_ZIEN3_Pos) /*!< EPWM_T::INTEN0: ZIEN3 Mask */ + +#define EPWM_INTEN0_ZIEN4_Pos (4) /*!< EPWM_T::INTEN0: ZIEN4 Position */ +#define EPWM_INTEN0_ZIEN4_Msk (0x1ul << EPWM_INTEN0_ZIEN4_Pos) /*!< EPWM_T::INTEN0: ZIEN4 Mask */ + +#define EPWM_INTEN0_ZIEN5_Pos (5) /*!< EPWM_T::INTEN0: ZIEN5 Position */ +#define EPWM_INTEN0_ZIEN5_Msk (0x1ul << EPWM_INTEN0_ZIEN5_Pos) /*!< EPWM_T::INTEN0: ZIEN5 Mask */ + +#define EPWM_INTEN0_PIEN0_Pos (8) /*!< EPWM_T::INTEN0: PIEN0 Position */ +#define EPWM_INTEN0_PIEN0_Msk (0x1ul << EPWM_INTEN0_PIEN0_Pos) /*!< EPWM_T::INTEN0: PIEN0 Mask */ + +#define EPWM_INTEN0_PIEN1_Pos (9) /*!< EPWM_T::INTEN0: PIEN1 Position */ +#define EPWM_INTEN0_PIEN1_Msk (0x1ul << EPWM_INTEN0_PIEN1_Pos) /*!< EPWM_T::INTEN0: PIEN1 Mask */ + +#define EPWM_INTEN0_PIEN2_Pos (10) /*!< EPWM_T::INTEN0: PIEN2 Position */ +#define EPWM_INTEN0_PIEN2_Msk (0x1ul << EPWM_INTEN0_PIEN2_Pos) /*!< EPWM_T::INTEN0: PIEN2 Mask */ + +#define EPWM_INTEN0_PIEN3_Pos (11) /*!< EPWM_T::INTEN0: PIEN3 Position */ +#define EPWM_INTEN0_PIEN3_Msk (0x1ul << EPWM_INTEN0_PIEN3_Pos) /*!< EPWM_T::INTEN0: PIEN3 Mask */ + +#define EPWM_INTEN0_PIEN4_Pos (12) /*!< EPWM_T::INTEN0: PIEN4 Position */ +#define EPWM_INTEN0_PIEN4_Msk (0x1ul << EPWM_INTEN0_PIEN4_Pos) /*!< EPWM_T::INTEN0: PIEN4 Mask */ + +#define EPWM_INTEN0_PIEN5_Pos (13) /*!< EPWM_T::INTEN0: PIEN5 Position */ +#define EPWM_INTEN0_PIEN5_Msk (0x1ul << EPWM_INTEN0_PIEN5_Pos) /*!< EPWM_T::INTEN0: PIEN5 Mask */ + +#define EPWM_INTEN0_CMPUIEN0_Pos (16) /*!< EPWM_T::INTEN0: CMPUIEN0 Position */ +#define EPWM_INTEN0_CMPUIEN0_Msk (0x1ul << EPWM_INTEN0_CMPUIEN0_Pos) /*!< EPWM_T::INTEN0: CMPUIEN0 Mask */ + +#define EPWM_INTEN0_CMPUIEN1_Pos (17) /*!< EPWM_T::INTEN0: CMPUIEN1 Position */ +#define EPWM_INTEN0_CMPUIEN1_Msk (0x1ul << EPWM_INTEN0_CMPUIEN1_Pos) /*!< EPWM_T::INTEN0: CMPUIEN1 Mask */ + +#define EPWM_INTEN0_CMPUIEN2_Pos (18) /*!< EPWM_T::INTEN0: CMPUIEN2 Position */ +#define EPWM_INTEN0_CMPUIEN2_Msk (0x1ul << EPWM_INTEN0_CMPUIEN2_Pos) /*!< EPWM_T::INTEN0: CMPUIEN2 Mask */ + +#define EPWM_INTEN0_CMPUIEN3_Pos (19) /*!< EPWM_T::INTEN0: CMPUIEN3 Position */ +#define EPWM_INTEN0_CMPUIEN3_Msk (0x1ul << EPWM_INTEN0_CMPUIEN3_Pos) /*!< EPWM_T::INTEN0: CMPUIEN3 Mask */ + +#define EPWM_INTEN0_CMPUIEN4_Pos (20) /*!< EPWM_T::INTEN0: CMPUIEN4 Position */ +#define EPWM_INTEN0_CMPUIEN4_Msk (0x1ul << EPWM_INTEN0_CMPUIEN4_Pos) /*!< EPWM_T::INTEN0: CMPUIEN4 Mask */ + +#define EPWM_INTEN0_CMPUIEN5_Pos (21) /*!< EPWM_T::INTEN0: CMPUIEN5 Position */ +#define EPWM_INTEN0_CMPUIEN5_Msk (0x1ul << EPWM_INTEN0_CMPUIEN5_Pos) /*!< EPWM_T::INTEN0: CMPUIEN5 Mask */ + +#define EPWM_INTEN0_CMPDIEN0_Pos (24) /*!< EPWM_T::INTEN0: CMPDIEN0 Position */ +#define EPWM_INTEN0_CMPDIEN0_Msk (0x1ul << EPWM_INTEN0_CMPDIEN0_Pos) /*!< EPWM_T::INTEN0: CMPDIEN0 Mask */ + +#define EPWM_INTEN0_CMPDIEN1_Pos (25) /*!< EPWM_T::INTEN0: CMPDIEN1 Position */ +#define EPWM_INTEN0_CMPDIEN1_Msk (0x1ul << EPWM_INTEN0_CMPDIEN1_Pos) /*!< EPWM_T::INTEN0: CMPDIEN1 Mask */ + +#define EPWM_INTEN0_CMPDIEN2_Pos (26) /*!< EPWM_T::INTEN0: CMPDIEN2 Position */ +#define EPWM_INTEN0_CMPDIEN2_Msk (0x1ul << EPWM_INTEN0_CMPDIEN2_Pos) /*!< EPWM_T::INTEN0: CMPDIEN2 Mask */ + +#define EPWM_INTEN0_CMPDIEN3_Pos (27) /*!< EPWM_T::INTEN0: CMPDIEN3 Position */ +#define EPWM_INTEN0_CMPDIEN3_Msk (0x1ul << EPWM_INTEN0_CMPDIEN3_Pos) /*!< EPWM_T::INTEN0: CMPDIEN3 Mask */ + +#define EPWM_INTEN0_CMPDIEN4_Pos (28) /*!< EPWM_T::INTEN0: CMPDIEN4 Position */ +#define EPWM_INTEN0_CMPDIEN4_Msk (0x1ul << EPWM_INTEN0_CMPDIEN4_Pos) /*!< EPWM_T::INTEN0: CMPDIEN4 Mask */ + +#define EPWM_INTEN0_CMPDIEN5_Pos (29) /*!< EPWM_T::INTEN0: CMPDIEN5 Position */ +#define EPWM_INTEN0_CMPDIEN5_Msk (0x1ul << EPWM_INTEN0_CMPDIEN5_Pos) /*!< EPWM_T::INTEN0: CMPDIEN5 Mask */ + +#define EPWM_INTEN1_BRKEIEN0_1_Pos (0) /*!< EPWM_T::INTEN1: BRKEIEN0_1 Position */ +#define EPWM_INTEN1_BRKEIEN0_1_Msk (0x1ul << EPWM_INTEN1_BRKEIEN0_1_Pos) /*!< EPWM_T::INTEN1: BRKEIEN0_1 Mask */ + +#define EPWM_INTEN1_BRKEIEN2_3_Pos (1) /*!< EPWM_T::INTEN1: BRKEIEN2_3 Position */ +#define EPWM_INTEN1_BRKEIEN2_3_Msk (0x1ul << EPWM_INTEN1_BRKEIEN2_3_Pos) /*!< EPWM_T::INTEN1: BRKEIEN2_3 Mask */ + +#define EPWM_INTEN1_BRKEIEN4_5_Pos (2) /*!< EPWM_T::INTEN1: BRKEIEN4_5 Position */ +#define EPWM_INTEN1_BRKEIEN4_5_Msk (0x1ul << EPWM_INTEN1_BRKEIEN4_5_Pos) /*!< EPWM_T::INTEN1: BRKEIEN4_5 Mask */ + +#define EPWM_INTEN1_BRKLIEN0_1_Pos (8) /*!< EPWM_T::INTEN1: BRKLIEN0_1 Position */ +#define EPWM_INTEN1_BRKLIEN0_1_Msk (0x1ul << EPWM_INTEN1_BRKLIEN0_1_Pos) /*!< EPWM_T::INTEN1: BRKLIEN0_1 Mask */ + +#define EPWM_INTEN1_BRKLIEN2_3_Pos (9) /*!< EPWM_T::INTEN1: BRKLIEN2_3 Position */ +#define EPWM_INTEN1_BRKLIEN2_3_Msk (0x1ul << EPWM_INTEN1_BRKLIEN2_3_Pos) /*!< EPWM_T::INTEN1: BRKLIEN2_3 Mask */ + +#define EPWM_INTEN1_BRKLIEN4_5_Pos (10) /*!< EPWM_T::INTEN1: BRKLIEN4_5 Position */ +#define EPWM_INTEN1_BRKLIEN4_5_Msk (0x1ul << EPWM_INTEN1_BRKLIEN4_5_Pos) /*!< EPWM_T::INTEN1: BRKLIEN4_5 Mask */ + +#define EPWM_INTSTS0_ZIF0_Pos (0) /*!< EPWM_T::INTSTS0: ZIF0 Position */ +#define EPWM_INTSTS0_ZIF0_Msk (0x1ul << EPWM_INTSTS0_ZIF0_Pos) /*!< EPWM_T::INTSTS0: ZIF0 Mask */ + +#define EPWM_INTSTS0_ZIF1_Pos (1) /*!< EPWM_T::INTSTS0: ZIF1 Position */ +#define EPWM_INTSTS0_ZIF1_Msk (0x1ul << EPWM_INTSTS0_ZIF1_Pos) /*!< EPWM_T::INTSTS0: ZIF1 Mask */ + +#define EPWM_INTSTS0_ZIF2_Pos (2) /*!< EPWM_T::INTSTS0: ZIF2 Position */ +#define EPWM_INTSTS0_ZIF2_Msk (0x1ul << EPWM_INTSTS0_ZIF2_Pos) /*!< EPWM_T::INTSTS0: ZIF2 Mask */ + +#define EPWM_INTSTS0_ZIF3_Pos (3) /*!< EPWM_T::INTSTS0: ZIF3 Position */ +#define EPWM_INTSTS0_ZIF3_Msk (0x1ul << EPWM_INTSTS0_ZIF3_Pos) /*!< EPWM_T::INTSTS0: ZIF3 Mask */ + +#define EPWM_INTSTS0_ZIF4_Pos (4) /*!< EPWM_T::INTSTS0: ZIF4 Position */ +#define EPWM_INTSTS0_ZIF4_Msk (0x1ul << EPWM_INTSTS0_ZIF4_Pos) /*!< EPWM_T::INTSTS0: ZIF4 Mask */ + +#define EPWM_INTSTS0_ZIF5_Pos (5) /*!< EPWM_T::INTSTS0: ZIF5 Position */ +#define EPWM_INTSTS0_ZIF5_Msk (0x1ul << EPWM_INTSTS0_ZIF5_Pos) /*!< EPWM_T::INTSTS0: ZIF5 Mask */ + +#define EPWM_INTSTS0_PIF0_Pos (8) /*!< EPWM_T::INTSTS0: PIF0 Position */ +#define EPWM_INTSTS0_PIF0_Msk (0x1ul << EPWM_INTSTS0_PIF0_Pos) /*!< EPWM_T::INTSTS0: PIF0 Mask */ + +#define EPWM_INTSTS0_PIF1_Pos (9) /*!< EPWM_T::INTSTS0: PIF1 Position */ +#define EPWM_INTSTS0_PIF1_Msk (0x1ul << EPWM_INTSTS0_PIF1_Pos) /*!< EPWM_T::INTSTS0: PIF1 Mask */ + +#define EPWM_INTSTS0_PIF2_Pos (10) /*!< EPWM_T::INTSTS0: PIF2 Position */ +#define EPWM_INTSTS0_PIF2_Msk (0x1ul << EPWM_INTSTS0_PIF2_Pos) /*!< EPWM_T::INTSTS0: PIF2 Mask */ + +#define EPWM_INTSTS0_PIF3_Pos (11) /*!< EPWM_T::INTSTS0: PIF3 Position */ +#define EPWM_INTSTS0_PIF3_Msk (0x1ul << EPWM_INTSTS0_PIF3_Pos) /*!< EPWM_T::INTSTS0: PIF3 Mask */ + +#define EPWM_INTSTS0_PIF4_Pos (12) /*!< EPWM_T::INTSTS0: PIF4 Position */ +#define EPWM_INTSTS0_PIF4_Msk (0x1ul << EPWM_INTSTS0_PIF4_Pos) /*!< EPWM_T::INTSTS0: PIF4 Mask */ + +#define EPWM_INTSTS0_PIF5_Pos (13) /*!< EPWM_T::INTSTS0: PIF5 Position */ +#define EPWM_INTSTS0_PIF5_Msk (0x1ul << EPWM_INTSTS0_PIF5_Pos) /*!< EPWM_T::INTSTS0: PIF5 Mask */ + +#define EPWM_INTSTS0_CMPUIF0_Pos (16) /*!< EPWM_T::INTSTS0: CMPUIF0 Position */ +#define EPWM_INTSTS0_CMPUIF0_Msk (0x1ul << EPWM_INTSTS0_CMPUIF0_Pos) /*!< EPWM_T::INTSTS0: CMPUIF0 Mask */ + +#define EPWM_INTSTS0_CMPUIF1_Pos (17) /*!< EPWM_T::INTSTS0: CMPUIF1 Position */ +#define EPWM_INTSTS0_CMPUIF1_Msk (0x1ul << EPWM_INTSTS0_CMPUIF1_Pos) /*!< EPWM_T::INTSTS0: CMPUIF1 Mask */ + +#define EPWM_INTSTS0_CMPUIF2_Pos (18) /*!< EPWM_T::INTSTS0: CMPUIF2 Position */ +#define EPWM_INTSTS0_CMPUIF2_Msk (0x1ul << EPWM_INTSTS0_CMPUIF2_Pos) /*!< EPWM_T::INTSTS0: CMPUIF2 Mask */ + +#define EPWM_INTSTS0_CMPUIF3_Pos (19) /*!< EPWM_T::INTSTS0: CMPUIF3 Position */ +#define EPWM_INTSTS0_CMPUIF3_Msk (0x1ul << EPWM_INTSTS0_CMPUIF3_Pos) /*!< EPWM_T::INTSTS0: CMPUIF3 Mask */ + +#define EPWM_INTSTS0_CMPUIF4_Pos (20) /*!< EPWM_T::INTSTS0: CMPUIF4 Position */ +#define EPWM_INTSTS0_CMPUIF4_Msk (0x1ul << EPWM_INTSTS0_CMPUIF4_Pos) /*!< EPWM_T::INTSTS0: CMPUIF4 Mask */ + +#define EPWM_INTSTS0_CMPUIF5_Pos (21) /*!< EPWM_T::INTSTS0: CMPUIF5 Position */ +#define EPWM_INTSTS0_CMPUIF5_Msk (0x1ul << EPWM_INTSTS0_CMPUIF5_Pos) /*!< EPWM_T::INTSTS0: CMPUIF5 Mask */ + +#define EPWM_INTSTS0_CMPDIF0_Pos (24) /*!< EPWM_T::INTSTS0: CMPDIF0 Position */ +#define EPWM_INTSTS0_CMPDIF0_Msk (0x1ul << EPWM_INTSTS0_CMPDIF0_Pos) /*!< EPWM_T::INTSTS0: CMPDIF0 Mask */ + +#define EPWM_INTSTS0_CMPDIF1_Pos (25) /*!< EPWM_T::INTSTS0: CMPDIF1 Position */ +#define EPWM_INTSTS0_CMPDIF1_Msk (0x1ul << EPWM_INTSTS0_CMPDIF1_Pos) /*!< EPWM_T::INTSTS0: CMPDIF1 Mask */ + +#define EPWM_INTSTS0_CMPDIF2_Pos (26) /*!< EPWM_T::INTSTS0: CMPDIF2 Position */ +#define EPWM_INTSTS0_CMPDIF2_Msk (0x1ul << EPWM_INTSTS0_CMPDIF2_Pos) /*!< EPWM_T::INTSTS0: CMPDIF2 Mask */ + +#define EPWM_INTSTS0_CMPDIF3_Pos (27) /*!< EPWM_T::INTSTS0: CMPDIF3 Position */ +#define EPWM_INTSTS0_CMPDIF3_Msk (0x1ul << EPWM_INTSTS0_CMPDIF3_Pos) /*!< EPWM_T::INTSTS0: CMPDIF3 Mask */ + +#define EPWM_INTSTS0_CMPDIF4_Pos (28) /*!< EPWM_T::INTSTS0: CMPDIF4 Position */ +#define EPWM_INTSTS0_CMPDIF4_Msk (0x1ul << EPWM_INTSTS0_CMPDIF4_Pos) /*!< EPWM_T::INTSTS0: CMPDIF4 Mask */ + +#define EPWM_INTSTS0_CMPDIF5_Pos (29) /*!< EPWM_T::INTSTS0: CMPDIF5 Position */ +#define EPWM_INTSTS0_CMPDIF5_Msk (0x1ul << EPWM_INTSTS0_CMPDIF5_Pos) /*!< EPWM_T::INTSTS0: CMPDIF5 Mask */ + +#define EPWM_INTSTS1_BRKEIF0_Pos (0) /*!< EPWM_T::INTSTS1: BRKEIF0 Position */ +#define EPWM_INTSTS1_BRKEIF0_Msk (0x1ul << EPWM_INTSTS1_BRKEIF0_Pos) /*!< EPWM_T::INTSTS1: BRKEIF0 Mask */ + +#define EPWM_INTSTS1_BRKEIF1_Pos (1) /*!< EPWM_T::INTSTS1: BRKEIF1 Position */ +#define EPWM_INTSTS1_BRKEIF1_Msk (0x1ul << EPWM_INTSTS1_BRKEIF1_Pos) /*!< EPWM_T::INTSTS1: BRKEIF1 Mask */ + +#define EPWM_INTSTS1_BRKEIF2_Pos (2) /*!< EPWM_T::INTSTS1: BRKEIF2 Position */ +#define EPWM_INTSTS1_BRKEIF2_Msk (0x1ul << EPWM_INTSTS1_BRKEIF2_Pos) /*!< EPWM_T::INTSTS1: BRKEIF2 Mask */ + +#define EPWM_INTSTS1_BRKEIF3_Pos (3) /*!< EPWM_T::INTSTS1: BRKEIF3 Position */ +#define EPWM_INTSTS1_BRKEIF3_Msk (0x1ul << EPWM_INTSTS1_BRKEIF3_Pos) /*!< EPWM_T::INTSTS1: BRKEIF3 Mask */ + +#define EPWM_INTSTS1_BRKEIF4_Pos (4) /*!< EPWM_T::INTSTS1: BRKEIF4 Position */ +#define EPWM_INTSTS1_BRKEIF4_Msk (0x1ul << EPWM_INTSTS1_BRKEIF4_Pos) /*!< EPWM_T::INTSTS1: BRKEIF4 Mask */ + +#define EPWM_INTSTS1_BRKEIF5_Pos (5) /*!< EPWM_T::INTSTS1: BRKEIF5 Position */ +#define EPWM_INTSTS1_BRKEIF5_Msk (0x1ul << EPWM_INTSTS1_BRKEIF5_Pos) /*!< EPWM_T::INTSTS1: BRKEIF5 Mask */ + +#define EPWM_INTSTS1_BRKLIF0_Pos (8) /*!< EPWM_T::INTSTS1: BRKLIF0 Position */ +#define EPWM_INTSTS1_BRKLIF0_Msk (0x1ul << EPWM_INTSTS1_BRKLIF0_Pos) /*!< EPWM_T::INTSTS1: BRKLIF0 Mask */ + +#define EPWM_INTSTS1_BRKLIF1_Pos (9) /*!< EPWM_T::INTSTS1: BRKLIF1 Position */ +#define EPWM_INTSTS1_BRKLIF1_Msk (0x1ul << EPWM_INTSTS1_BRKLIF1_Pos) /*!< EPWM_T::INTSTS1: BRKLIF1 Mask */ + +#define EPWM_INTSTS1_BRKLIF2_Pos (10) /*!< EPWM_T::INTSTS1: BRKLIF2 Position */ +#define EPWM_INTSTS1_BRKLIF2_Msk (0x1ul << EPWM_INTSTS1_BRKLIF2_Pos) /*!< EPWM_T::INTSTS1: BRKLIF2 Mask */ + +#define EPWM_INTSTS1_BRKLIF3_Pos (11) /*!< EPWM_T::INTSTS1: BRKLIF3 Position */ +#define EPWM_INTSTS1_BRKLIF3_Msk (0x1ul << EPWM_INTSTS1_BRKLIF3_Pos) /*!< EPWM_T::INTSTS1: BRKLIF3 Mask */ + +#define EPWM_INTSTS1_BRKLIF4_Pos (12) /*!< EPWM_T::INTSTS1: BRKLIF4 Position */ +#define EPWM_INTSTS1_BRKLIF4_Msk (0x1ul << EPWM_INTSTS1_BRKLIF4_Pos) /*!< EPWM_T::INTSTS1: BRKLIF4 Mask */ + +#define EPWM_INTSTS1_BRKLIF5_Pos (13) /*!< EPWM_T::INTSTS1: BRKLIF5 Position */ +#define EPWM_INTSTS1_BRKLIF5_Msk (0x1ul << EPWM_INTSTS1_BRKLIF5_Pos) /*!< EPWM_T::INTSTS1: BRKLIF5 Mask */ + +#define EPWM_INTSTS1_BRKESTS0_Pos (16) /*!< EPWM_T::INTSTS1: BRKESTS0 Position */ +#define EPWM_INTSTS1_BRKESTS0_Msk (0x1ul << EPWM_INTSTS1_BRKESTS0_Pos) /*!< EPWM_T::INTSTS1: BRKESTS0 Mask */ + +#define EPWM_INTSTS1_BRKESTS1_Pos (17) /*!< EPWM_T::INTSTS1: BRKESTS1 Position */ +#define EPWM_INTSTS1_BRKESTS1_Msk (0x1ul << EPWM_INTSTS1_BRKESTS1_Pos) /*!< EPWM_T::INTSTS1: BRKESTS1 Mask */ + +#define EPWM_INTSTS1_BRKESTS2_Pos (18) /*!< EPWM_T::INTSTS1: BRKESTS2 Position */ +#define EPWM_INTSTS1_BRKESTS2_Msk (0x1ul << EPWM_INTSTS1_BRKESTS2_Pos) /*!< EPWM_T::INTSTS1: BRKESTS2 Mask */ + +#define EPWM_INTSTS1_BRKESTS3_Pos (19) /*!< EPWM_T::INTSTS1: BRKESTS3 Position */ +#define EPWM_INTSTS1_BRKESTS3_Msk (0x1ul << EPWM_INTSTS1_BRKESTS3_Pos) /*!< EPWM_T::INTSTS1: BRKESTS3 Mask */ + +#define EPWM_INTSTS1_BRKESTS4_Pos (20) /*!< EPWM_T::INTSTS1: BRKESTS4 Position */ +#define EPWM_INTSTS1_BRKESTS4_Msk (0x1ul << EPWM_INTSTS1_BRKESTS4_Pos) /*!< EPWM_T::INTSTS1: BRKESTS4 Mask */ + +#define EPWM_INTSTS1_BRKESTS5_Pos (21) /*!< EPWM_T::INTSTS1: BRKESTS5 Position */ +#define EPWM_INTSTS1_BRKESTS5_Msk (0x1ul << EPWM_INTSTS1_BRKESTS5_Pos) /*!< EPWM_T::INTSTS1: BRKESTS5 Mask */ + +#define EPWM_INTSTS1_BRKLSTS0_Pos (24) /*!< EPWM_T::INTSTS1: BRKLSTS0 Position */ +#define EPWM_INTSTS1_BRKLSTS0_Msk (0x1ul << EPWM_INTSTS1_BRKLSTS0_Pos) /*!< EPWM_T::INTSTS1: BRKLSTS0 Mask */ + +#define EPWM_INTSTS1_BRKLSTS1_Pos (25) /*!< EPWM_T::INTSTS1: BRKLSTS1 Position */ +#define EPWM_INTSTS1_BRKLSTS1_Msk (0x1ul << EPWM_INTSTS1_BRKLSTS1_Pos) /*!< EPWM_T::INTSTS1: BRKLSTS1 Mask */ + +#define EPWM_INTSTS1_BRKLSTS2_Pos (26) /*!< EPWM_T::INTSTS1: BRKLSTS2 Position */ +#define EPWM_INTSTS1_BRKLSTS2_Msk (0x1ul << EPWM_INTSTS1_BRKLSTS2_Pos) /*!< EPWM_T::INTSTS1: BRKLSTS2 Mask */ + +#define EPWM_INTSTS1_BRKLSTS3_Pos (27) /*!< EPWM_T::INTSTS1: BRKLSTS3 Position */ +#define EPWM_INTSTS1_BRKLSTS3_Msk (0x1ul << EPWM_INTSTS1_BRKLSTS3_Pos) /*!< EPWM_T::INTSTS1: BRKLSTS3 Mask */ + +#define EPWM_INTSTS1_BRKLSTS4_Pos (28) /*!< EPWM_T::INTSTS1: BRKLSTS4 Position */ +#define EPWM_INTSTS1_BRKLSTS4_Msk (0x1ul << EPWM_INTSTS1_BRKLSTS4_Pos) /*!< EPWM_T::INTSTS1: BRKLSTS4 Mask */ + +#define EPWM_INTSTS1_BRKLSTS5_Pos (29) /*!< EPWM_T::INTSTS1: BRKLSTS5 Position */ +#define EPWM_INTSTS1_BRKLSTS5_Msk (0x1ul << EPWM_INTSTS1_BRKLSTS5_Pos) /*!< EPWM_T::INTSTS1: BRKLSTS5 Mask */ + +#define EPWM_EADCTS0_TRGSEL0_Pos (0) /*!< EPWM_T::EADCTS0: TRGSEL0 Position */ +#define EPWM_EADCTS0_TRGSEL0_Msk (0xful << EPWM_EADCTS0_TRGSEL0_Pos) /*!< EPWM_T::EADCTS0: TRGSEL0 Mask */ + +#define EPWM_EADCTS0_TRGEN0_Pos (7) /*!< EPWM_T::EADCTS0: TRGEN0 Position */ +#define EPWM_EADCTS0_TRGEN0_Msk (0x1ul << EPWM_EADCTS0_TRGEN0_Pos) /*!< EPWM_T::EADCTS0: TRGEN0 Mask */ + +#define EPWM_EADCTS0_TRGSEL1_Pos (8) /*!< EPWM_T::EADCTS0: TRGSEL1 Position */ +#define EPWM_EADCTS0_TRGSEL1_Msk (0xful << EPWM_EADCTS0_TRGSEL1_Pos) /*!< EPWM_T::EADCTS0: TRGSEL1 Mask */ + +#define EPWM_EADCTS0_TRGEN1_Pos (15) /*!< EPWM_T::EADCTS0: TRGEN1 Position */ +#define EPWM_EADCTS0_TRGEN1_Msk (0x1ul << EPWM_EADCTS0_TRGEN1_Pos) /*!< EPWM_T::EADCTS0: TRGEN1 Mask */ + +#define EPWM_EADCTS0_TRGSEL2_Pos (16) /*!< EPWM_T::EADCTS0: TRGSEL2 Position */ +#define EPWM_EADCTS0_TRGSEL2_Msk (0xful << EPWM_EADCTS0_TRGSEL2_Pos) /*!< EPWM_T::EADCTS0: TRGSEL2 Mask */ + +#define EPWM_EADCTS0_TRGEN2_Pos (23) /*!< EPWM_T::EADCTS0: TRGEN2 Position */ +#define EPWM_EADCTS0_TRGEN2_Msk (0x1ul << EPWM_EADCTS0_TRGEN2_Pos) /*!< EPWM_T::EADCTS0: TRGEN2 Mask */ + +#define EPWM_EADCTS0_TRGSEL3_Pos (24) /*!< EPWM_T::EADCTS0: TRGSEL3 Position */ +#define EPWM_EADCTS0_TRGSEL3_Msk (0xful << EPWM_EADCTS0_TRGSEL3_Pos) /*!< EPWM_T::EADCTS0: TRGSEL3 Mask */ + +#define EPWM_EADCTS0_TRGEN3_Pos (31) /*!< EPWM_T::EADCTS0: TRGEN3 Position */ +#define EPWM_EADCTS0_TRGEN3_Msk (0x1ul << EPWM_EADCTS0_TRGEN3_Pos) /*!< EPWM_T::EADCTS0: TRGEN3 Mask */ + +#define EPWM_EADCTS1_TRGSEL4_Pos (0) /*!< EPWM_T::EADCTS1: TRGSEL4 Position */ +#define EPWM_EADCTS1_TRGSEL4_Msk (0xful << EPWM_EADCTS1_TRGSEL4_Pos) /*!< EPWM_T::EADCTS1: TRGSEL4 Mask */ + +#define EPWM_EADCTS1_TRGEN4_Pos (7) /*!< EPWM_T::EADCTS1: TRGEN4 Position */ +#define EPWM_EADCTS1_TRGEN4_Msk (0x1ul << EPWM_EADCTS1_TRGEN4_Pos) /*!< EPWM_T::EADCTS1: TRGEN4 Mask */ + +#define EPWM_EADCTS1_TRGSEL5_Pos (8) /*!< EPWM_T::EADCTS1: TRGSEL5 Position */ +#define EPWM_EADCTS1_TRGSEL5_Msk (0xful << EPWM_EADCTS1_TRGSEL5_Pos) /*!< EPWM_T::EADCTS1: TRGSEL5 Mask */ + +#define EPWM_EADCTS1_TRGEN5_Pos (15) /*!< EPWM_T::EADCTS1: TRGEN5 Position */ +#define EPWM_EADCTS1_TRGEN5_Msk (0x1ul << EPWM_EADCTS1_TRGEN5_Pos) /*!< EPWM_T::EADCTS1: TRGEN5 Mask */ + +#define EPWM_FTCMPDAT0_1_FTCMP_Pos (0) /*!< EPWM_T::FTCMPDAT0_1: FTCMP Position */ +#define EPWM_FTCMPDAT0_1_FTCMP_Msk (0xfffful << EPWM_FTCMPDAT0_1_FTCMP_Pos) /*!< EPWM_T::FTCMPDAT0_1: FTCMP Mask */ + +#define EPWM_FTCMPDAT2_3_FTCMP_Pos (0) /*!< EPWM_T::FTCMPDAT2_3: FTCMP Position */ +#define EPWM_FTCMPDAT2_3_FTCMP_Msk (0xfffful << EPWM_FTCMPDAT2_3_FTCMP_Pos) /*!< EPWM_T::FTCMPDAT2_3: FTCMP Mask */ + +#define EPWM_FTCMPDAT4_5_FTCMP_Pos (0) /*!< EPWM_T::FTCMPDAT4_5: FTCMP Position */ +#define EPWM_FTCMPDAT4_5_FTCMP_Msk (0xfffful << EPWM_FTCMPDAT4_5_FTCMP_Pos) /*!< EPWM_T::FTCMPDAT4_5: FTCMP Mask */ + +#define EPWM_SSCTL_SSEN0_Pos (0) /*!< EPWM_T::SSCTL: SSEN0 Position */ +#define EPWM_SSCTL_SSEN0_Msk (0x1ul << EPWM_SSCTL_SSEN0_Pos) /*!< EPWM_T::SSCTL: SSEN0 Mask */ + +#define EPWM_SSCTL_SSEN1_Pos (1) /*!< EPWM_T::SSCTL: SSEN1 Position */ +#define EPWM_SSCTL_SSEN1_Msk (0x1ul << EPWM_SSCTL_SSEN1_Pos) /*!< EPWM_T::SSCTL: SSEN1 Mask */ + +#define EPWM_SSCTL_SSEN2_Pos (2) /*!< EPWM_T::SSCTL: SSEN2 Position */ +#define EPWM_SSCTL_SSEN2_Msk (0x1ul << EPWM_SSCTL_SSEN2_Pos) /*!< EPWM_T::SSCTL: SSEN2 Mask */ + +#define EPWM_SSCTL_SSEN3_Pos (3) /*!< EPWM_T::SSCTL: SSEN3 Position */ +#define EPWM_SSCTL_SSEN3_Msk (0x1ul << EPWM_SSCTL_SSEN3_Pos) /*!< EPWM_T::SSCTL: SSEN3 Mask */ + +#define EPWM_SSCTL_SSEN4_Pos (4) /*!< EPWM_T::SSCTL: SSEN4 Position */ +#define EPWM_SSCTL_SSEN4_Msk (0x1ul << EPWM_SSCTL_SSEN4_Pos) /*!< EPWM_T::SSCTL: SSEN4 Mask */ + +#define EPWM_SSCTL_SSEN5_Pos (5) /*!< EPWM_T::SSCTL: SSEN5 Position */ +#define EPWM_SSCTL_SSEN5_Msk (0x1ul << EPWM_SSCTL_SSEN5_Pos) /*!< EPWM_T::SSCTL: SSEN5 Mask */ + +#define EPWM_SSCTL_SSRC_Pos (8) /*!< EPWM_T::SSCTL: SSRC Position */ +#define EPWM_SSCTL_SSRC_Msk (0x3ul << EPWM_SSCTL_SSRC_Pos) /*!< EPWM_T::SSCTL: SSRC Mask */ + +#define EPWM_SSTRG_CNTSEN_Pos (0) /*!< EPWM_T::SSTRG: CNTSEN Position */ +#define EPWM_SSTRG_CNTSEN_Msk (0x1ul << EPWM_SSTRG_CNTSEN_Pos) /*!< EPWM_T::SSTRG: CNTSEN Mask */ + +#define EPWM_LEBCTL_LEBEN_Pos (0) /*!< EPWM_T::LEBCTL: LEBEN Position */ +#define EPWM_LEBCTL_LEBEN_Msk (0x1ul << EPWM_LEBCTL_LEBEN_Pos) /*!< EPWM_T::LEBCTL: LEBEN Mask */ + +#define EPWM_LEBCTL_SRCEN0_Pos (8) /*!< EPWM_T::LEBCTL: SRCEN0 Position */ +#define EPWM_LEBCTL_SRCEN0_Msk (0x1ul << EPWM_LEBCTL_SRCEN0_Pos) /*!< EPWM_T::LEBCTL: SRCEN0 Mask */ + +#define EPWM_LEBCTL_SRCEN2_Pos (9) /*!< EPWM_T::LEBCTL: SRCEN2 Position */ +#define EPWM_LEBCTL_SRCEN2_Msk (0x1ul << EPWM_LEBCTL_SRCEN2_Pos) /*!< EPWM_T::LEBCTL: SRCEN2 Mask */ + +#define EPWM_LEBCTL_SRCEN4_Pos (10) /*!< EPWM_T::LEBCTL: SRCEN4 Position */ +#define EPWM_LEBCTL_SRCEN4_Msk (0x1ul << EPWM_LEBCTL_SRCEN4_Pos) /*!< EPWM_T::LEBCTL: SRCEN4 Mask */ + +#define EPWM_LEBCTL_TRGTYPE_Pos (16) /*!< EPWM_T::LEBCTL: TRGTYPE Position */ +#define EPWM_LEBCTL_TRGTYPE_Msk (0x3ul << EPWM_LEBCTL_TRGTYPE_Pos) /*!< EPWM_T::LEBCTL: TRGTYPE Mask */ + +#define EPWM_LEBCNT_LEBCNT_Pos (0) /*!< EPWM_T::LEBCNT: LEBCNT Position */ +#define EPWM_LEBCNT_LEBCNT_Msk (0x1fful << EPWM_LEBCNT_LEBCNT_Pos) /*!< EPWM_T::LEBCNT: LEBCNT Mask */ + +#define EPWM_STATUS_CNTMAXF0_Pos (0) /*!< EPWM_T::STATUS: CNTMAXF0 Position */ +#define EPWM_STATUS_CNTMAXF0_Msk (0x1ul << EPWM_STATUS_CNTMAXF0_Pos) /*!< EPWM_T::STATUS: CNTMAXF0 Mask */ + +#define EPWM_STATUS_CNTMAXF1_Pos (1) /*!< EPWM_T::STATUS: CNTMAXF1 Position */ +#define EPWM_STATUS_CNTMAXF1_Msk (0x1ul << EPWM_STATUS_CNTMAXF1_Pos) /*!< EPWM_T::STATUS: CNTMAXF1 Mask */ + +#define EPWM_STATUS_CNTMAXF2_Pos (2) /*!< EPWM_T::STATUS: CNTMAXF2 Position */ +#define EPWM_STATUS_CNTMAXF2_Msk (0x1ul << EPWM_STATUS_CNTMAXF2_Pos) /*!< EPWM_T::STATUS: CNTMAXF2 Mask */ + +#define EPWM_STATUS_CNTMAXF3_Pos (3) /*!< EPWM_T::STATUS: CNTMAXF3 Position */ +#define EPWM_STATUS_CNTMAXF3_Msk (0x1ul << EPWM_STATUS_CNTMAXF3_Pos) /*!< EPWM_T::STATUS: CNTMAXF3 Mask */ + +#define EPWM_STATUS_CNTMAXF4_Pos (4) /*!< EPWM_T::STATUS: CNTMAXF4 Position */ +#define EPWM_STATUS_CNTMAXF4_Msk (0x1ul << EPWM_STATUS_CNTMAXF4_Pos) /*!< EPWM_T::STATUS: CNTMAXF4 Mask */ + +#define EPWM_STATUS_CNTMAXF5_Pos (5) /*!< EPWM_T::STATUS: CNTMAXF5 Position */ +#define EPWM_STATUS_CNTMAXF5_Msk (0x1ul << EPWM_STATUS_CNTMAXF5_Pos) /*!< EPWM_T::STATUS: CNTMAXF5 Mask */ + +#define EPWM_STATUS_SYNCINF0_Pos (8) /*!< EPWM_T::STATUS: SYNCINF0 Position */ +#define EPWM_STATUS_SYNCINF0_Msk (0x1ul << EPWM_STATUS_SYNCINF0_Pos) /*!< EPWM_T::STATUS: SYNCINF0 Mask */ + +#define EPWM_STATUS_SYNCINF2_Pos (9) /*!< EPWM_T::STATUS: SYNCINF2 Position */ +#define EPWM_STATUS_SYNCINF2_Msk (0x1ul << EPWM_STATUS_SYNCINF2_Pos) /*!< EPWM_T::STATUS: SYNCINF2 Mask */ + +#define EPWM_STATUS_SYNCINF4_Pos (10) /*!< EPWM_T::STATUS: SYNCINF4 Position */ +#define EPWM_STATUS_SYNCINF4_Msk (0x1ul << EPWM_STATUS_SYNCINF4_Pos) /*!< EPWM_T::STATUS: SYNCINF4 Mask */ + +#define EPWM_STATUS_EADCTRGF0_Pos (16) /*!< EPWM_T::STATUS: EADCTRGF0 Position */ +#define EPWM_STATUS_EADCTRGF0_Msk (0x1ul << EPWM_STATUS_EADCTRGF0_Pos) /*!< EPWM_T::STATUS: EADCTRGF0 Mask */ + +#define EPWM_STATUS_EADCTRGF1_Pos (17) /*!< EPWM_T::STATUS: EADCTRGF1 Position */ +#define EPWM_STATUS_EADCTRGF1_Msk (0x1ul << EPWM_STATUS_EADCTRGF1_Pos) /*!< EPWM_T::STATUS: EADCTRGF1 Mask */ + +#define EPWM_STATUS_EADCTRGF2_Pos (18) /*!< EPWM_T::STATUS: EADCTRGF2 Position */ +#define EPWM_STATUS_EADCTRGF2_Msk (0x1ul << EPWM_STATUS_EADCTRGF2_Pos) /*!< EPWM_T::STATUS: EADCTRGF2 Mask */ + +#define EPWM_STATUS_EADCTRGF3_Pos (19) /*!< EPWM_T::STATUS: EADCTRGF3 Position */ +#define EPWM_STATUS_EADCTRGF3_Msk (0x1ul << EPWM_STATUS_EADCTRGF3_Pos) /*!< EPWM_T::STATUS: EADCTRGF3 Mask */ + +#define EPWM_STATUS_EADCTRGF4_Pos (20) /*!< EPWM_T::STATUS: EADCTRGF4 Position */ +#define EPWM_STATUS_EADCTRGF4_Msk (0x1ul << EPWM_STATUS_EADCTRGF4_Pos) /*!< EPWM_T::STATUS: EADCTRGF4 Mask */ + +#define EPWM_STATUS_EADCTRGF5_Pos (21) /*!< EPWM_T::STATUS: EADCTRGF5 Position */ +#define EPWM_STATUS_EADCTRGF5_Msk (0x1ul << EPWM_STATUS_EADCTRGF5_Pos) /*!< EPWM_T::STATUS: EADCTRGF5 Mask */ + +#define EPWM_IFA0_IFACNT_Pos (0) /*!< EPWM_T::IFA0: IFACNT Position */ +#define EPWM_IFA0_IFACNT_Msk (0xfffful << EPWM_IFA0_IFACNT_Pos) /*!< EPWM_T::IFA0: IFACNT Mask */ + +#define EPWM_IFA0_STPMOD_Pos (24) /*!< EPWM_T::IFA0: STPMOD Position */ +#define EPWM_IFA0_STPMOD_Msk (0x1ul << EPWM_IFA0_STPMOD_Pos) /*!< EPWM_T::IFA0: STPMOD Mask */ + +#define EPWM_IFA0_IFASEL_Pos (28) /*!< EPWM_T::IFA0: IFASEL Position */ +#define EPWM_IFA0_IFASEL_Msk (0x3ul << EPWM_IFA0_IFASEL_Pos) /*!< EPWM_T::IFA0: IFASEL Mask */ + +#define EPWM_IFA0_IFAEN_Pos (31) /*!< EPWM_T::IFA0: IFAEN Position */ +#define EPWM_IFA0_IFAEN_Msk (0x1ul << EPWM_IFA0_IFAEN_Pos) /*!< EPWM_T::IFA0: IFAEN Mask */ + +#define EPWM_IFA1_IFACNT_Pos (0) /*!< EPWM_T::IFA1: IFACNT Position */ +#define EPWM_IFA1_IFACNT_Msk (0xfffful << EPWM_IFA1_IFACNT_Pos) /*!< EPWM_T::IFA1: IFACNT Mask */ + +#define EPWM_IFA1_STPMOD_Pos (24) /*!< EPWM_T::IFA1: STPMOD Position */ +#define EPWM_IFA1_STPMOD_Msk (0x1ul << EPWM_IFA1_STPMOD_Pos) /*!< EPWM_T::IFA1: STPMOD Mask */ + +#define EPWM_IFA1_IFASEL_Pos (28) /*!< EPWM_T::IFA1: IFASEL Position */ +#define EPWM_IFA1_IFASEL_Msk (0x3ul << EPWM_IFA1_IFASEL_Pos) /*!< EPWM_T::IFA1: IFASEL Mask */ + +#define EPWM_IFA1_IFAEN_Pos (31) /*!< EPWM_T::IFA1: IFAEN Position */ +#define EPWM_IFA1_IFAEN_Msk (0x1ul << EPWM_IFA1_IFAEN_Pos) /*!< EPWM_T::IFA1: IFAEN Mask */ + +#define EPWM_IFA2_IFACNT_Pos (0) /*!< EPWM_T::IFA2: IFACNT Position */ +#define EPWM_IFA2_IFACNT_Msk (0xfffful << EPWM_IFA2_IFACNT_Pos) /*!< EPWM_T::IFA2: IFACNT Mask */ + +#define EPWM_IFA2_STPMOD_Pos (24) /*!< EPWM_T::IFA2: STPMOD Position */ +#define EPWM_IFA2_STPMOD_Msk (0x1ul << EPWM_IFA2_STPMOD_Pos) /*!< EPWM_T::IFA2: STPMOD Mask */ + +#define EPWM_IFA2_IFASEL_Pos (28) /*!< EPWM_T::IFA2: IFASEL Position */ +#define EPWM_IFA2_IFASEL_Msk (0x3ul << EPWM_IFA2_IFASEL_Pos) /*!< EPWM_T::IFA2: IFASEL Mask */ + +#define EPWM_IFA2_IFAEN_Pos (31) /*!< EPWM_T::IFA2: IFAEN Position */ +#define EPWM_IFA2_IFAEN_Msk (0x1ul << EPWM_IFA2_IFAEN_Pos) /*!< EPWM_T::IFA2: IFAEN Mask */ + +#define EPWM_IFA3_IFACNT_Pos (0) /*!< EPWM_T::IFA3: IFACNT Position */ +#define EPWM_IFA3_IFACNT_Msk (0xfffful << EPWM_IFA3_IFACNT_Pos) /*!< EPWM_T::IFA3: IFACNT Mask */ + +#define EPWM_IFA3_STPMOD_Pos (24) /*!< EPWM_T::IFA3: STPMOD Position */ +#define EPWM_IFA3_STPMOD_Msk (0x1ul << EPWM_IFA3_STPMOD_Pos) /*!< EPWM_T::IFA3: STPMOD Mask */ + +#define EPWM_IFA3_IFASEL_Pos (28) /*!< EPWM_T::IFA3: IFASEL Position */ +#define EPWM_IFA3_IFASEL_Msk (0x3ul << EPWM_IFA3_IFASEL_Pos) /*!< EPWM_T::IFA3: IFASEL Mask */ + +#define EPWM_IFA3_IFAEN_Pos (31) /*!< EPWM_T::IFA3: IFAEN Position */ +#define EPWM_IFA3_IFAEN_Msk (0x1ul << EPWM_IFA3_IFAEN_Pos) /*!< EPWM_T::IFA3: IFAEN Mask */ + +#define EPWM_IFA4_IFACNT_Pos (0) /*!< EPWM_T::IFA4: IFACNT Position */ +#define EPWM_IFA4_IFACNT_Msk (0xfffful << EPWM_IFA4_IFACNT_Pos) /*!< EPWM_T::IFA4: IFACNT Mask */ + +#define EPWM_IFA4_STPMOD_Pos (24) /*!< EPWM_T::IFA4: STPMOD Position */ +#define EPWM_IFA4_STPMOD_Msk (0x1ul << EPWM_IFA4_STPMOD_Pos) /*!< EPWM_T::IFA4: STPMOD Mask */ + +#define EPWM_IFA4_IFASEL_Pos (28) /*!< EPWM_T::IFA4: IFASEL Position */ +#define EPWM_IFA4_IFASEL_Msk (0x3ul << EPWM_IFA4_IFASEL_Pos) /*!< EPWM_T::IFA4: IFASEL Mask */ + +#define EPWM_IFA4_IFAEN_Pos (31) /*!< EPWM_T::IFA4: IFAEN Position */ +#define EPWM_IFA4_IFAEN_Msk (0x1ul << EPWM_IFA4_IFAEN_Pos) /*!< EPWM_T::IFA4: IFAEN Mask */ + +#define EPWM_IFA5_IFACNT_Pos (0) /*!< EPWM_T::IFA5: IFACNT Position */ +#define EPWM_IFA5_IFACNT_Msk (0xfffful << EPWM_IFA5_IFACNT_Pos) /*!< EPWM_T::IFA5: IFACNT Mask */ + +#define EPWM_IFA5_STPMOD_Pos (24) /*!< EPWM_T::IFA5: STPMOD Position */ +#define EPWM_IFA5_STPMOD_Msk (0x1ul << EPWM_IFA5_STPMOD_Pos) /*!< EPWM_T::IFA5: STPMOD Mask */ + +#define EPWM_IFA5_IFASEL_Pos (28) /*!< EPWM_T::IFA5: IFASEL Position */ +#define EPWM_IFA5_IFASEL_Msk (0x3ul << EPWM_IFA5_IFASEL_Pos) /*!< EPWM_T::IFA5: IFASEL Mask */ + +#define EPWM_IFA5_IFAEN_Pos (31) /*!< EPWM_T::IFA5: IFAEN Position */ +#define EPWM_IFA5_IFAEN_Msk (0x1ul << EPWM_IFA5_IFAEN_Pos) /*!< EPWM_T::IFA5: IFAEN Mask */ + +#define EPWM_AINTSTS_IFAIF0_Pos (0) /*!< EPWM_T::AINTSTS: IFAIF0 Position */ +#define EPWM_AINTSTS_IFAIF0_Msk (0x1ul << EPWM_AINTSTS_IFAIF0_Pos) /*!< EPWM_T::AINTSTS: IFAIF0 Mask */ + +#define EPWM_AINTSTS_IFAIF1_Pos (1) /*!< EPWM_T::AINTSTS: IFAIF1 Position */ +#define EPWM_AINTSTS_IFAIF1_Msk (0x1ul << EPWM_AINTSTS_IFAIF1_Pos) /*!< EPWM_T::AINTSTS: IFAIF1 Mask */ + +#define EPWM_AINTSTS_IFAIF2_Pos (2) /*!< EPWM_T::AINTSTS: IFAIF2 Position */ +#define EPWM_AINTSTS_IFAIF2_Msk (0x1ul << EPWM_AINTSTS_IFAIF2_Pos) /*!< EPWM_T::AINTSTS: IFAIF2 Mask */ + +#define EPWM_AINTSTS_IFAIF3_Pos (3) /*!< EPWM_T::AINTSTS: IFAIF3 Position */ +#define EPWM_AINTSTS_IFAIF3_Msk (0x1ul << EPWM_AINTSTS_IFAIF3_Pos) /*!< EPWM_T::AINTSTS: IFAIF3 Mask */ + +#define EPWM_AINTSTS_IFAIF4_Pos (4) /*!< EPWM_T::AINTSTS: IFAIF4 Position */ +#define EPWM_AINTSTS_IFAIF4_Msk (0x1ul << EPWM_AINTSTS_IFAIF4_Pos) /*!< EPWM_T::AINTSTS: IFAIF4 Mask */ + +#define EPWM_AINTSTS_IFAIF5_Pos (5) /*!< EPWM_T::AINTSTS: IFAIF5 Position */ +#define EPWM_AINTSTS_IFAIF5_Msk (0x1ul << EPWM_AINTSTS_IFAIF5_Pos) /*!< EPWM_T::AINTSTS: IFAIF5 Mask */ + +#define EPWM_AINTEN_IFAIEN0_Pos (0) /*!< EPWM_T::AINTEN: IFAIEN0 Position */ +#define EPWM_AINTEN_IFAIEN0_Msk (0x1ul << EPWM_AINTEN_IFAIEN0_Pos) /*!< EPWM_T::AINTEN: IFAIEN0 Mask */ + +#define EPWM_AINTEN_IFAIEN1_Pos (1) /*!< EPWM_T::AINTEN: IFAIEN1 Position */ +#define EPWM_AINTEN_IFAIEN1_Msk (0x1ul << EPWM_AINTEN_IFAIEN1_Pos) /*!< EPWM_T::AINTEN: IFAIEN1 Mask */ + +#define EPWM_AINTEN_IFAIEN2_Pos (2) /*!< EPWM_T::AINTEN: IFAIEN2 Position */ +#define EPWM_AINTEN_IFAIEN2_Msk (0x1ul << EPWM_AINTEN_IFAIEN2_Pos) /*!< EPWM_T::AINTEN: IFAIEN2 Mask */ + +#define EPWM_AINTEN_IFAIEN3_Pos (3) /*!< EPWM_T::AINTEN: IFAIEN3 Position */ +#define EPWM_AINTEN_IFAIEN3_Msk (0x1ul << EPWM_AINTEN_IFAIEN3_Pos) /*!< EPWM_T::AINTEN: IFAIEN3 Mask */ + +#define EPWM_AINTEN_IFAIEN4_Pos (4) /*!< EPWM_T::AINTEN: IFAIEN4 Position */ +#define EPWM_AINTEN_IFAIEN4_Msk (0x1ul << EPWM_AINTEN_IFAIEN4_Pos) /*!< EPWM_T::AINTEN: IFAIEN4 Mask */ + +#define EPWM_AINTEN_IFAIEN5_Pos (5) /*!< EPWM_T::AINTEN: IFAIEN5 Position */ +#define EPWM_AINTEN_IFAIEN5_Msk (0x1ul << EPWM_AINTEN_IFAIEN5_Pos) /*!< EPWM_T::AINTEN: IFAIEN5 Mask */ + +#define EPWM_APDMACTL_APDMAEN0_Pos (0) /*!< EPWM_T::APDMACTL: APDMAEN0 Position */ +#define EPWM_APDMACTL_APDMAEN0_Msk (0x1ul << EPWM_APDMACTL_APDMAEN0_Pos) /*!< EPWM_T::APDMACTL: APDMAEN0 Mask */ + +#define EPWM_APDMACTL_APDMAEN1_Pos (1) /*!< EPWM_T::APDMACTL: APDMAEN1 Position */ +#define EPWM_APDMACTL_APDMAEN1_Msk (0x1ul << EPWM_APDMACTL_APDMAEN1_Pos) /*!< EPWM_T::APDMACTL: APDMAEN1 Mask */ + +#define EPWM_APDMACTL_APDMAEN2_Pos (2) /*!< EPWM_T::APDMACTL: APDMAEN2 Position */ +#define EPWM_APDMACTL_APDMAEN2_Msk (0x1ul << EPWM_APDMACTL_APDMAEN2_Pos) /*!< EPWM_T::APDMACTL: APDMAEN2 Mask */ + +#define EPWM_APDMACTL_APDMAEN3_Pos (3) /*!< EPWM_T::APDMACTL: APDMAEN3 Position */ +#define EPWM_APDMACTL_APDMAEN3_Msk (0x1ul << EPWM_APDMACTL_APDMAEN3_Pos) /*!< EPWM_T::APDMACTL: APDMAEN3 Mask */ + +#define EPWM_APDMACTL_APDMAEN4_Pos (4) /*!< EPWM_T::APDMACTL: APDMAEN4 Position */ +#define EPWM_APDMACTL_APDMAEN4_Msk (0x1ul << EPWM_APDMACTL_APDMAEN4_Pos) /*!< EPWM_T::APDMACTL: APDMAEN4 Mask */ + +#define EPWM_APDMACTL_APDMAEN5_Pos (5) /*!< EPWM_T::APDMACTL: APDMAEN5 Position */ +#define EPWM_APDMACTL_APDMAEN5_Msk (0x1ul << EPWM_APDMACTL_APDMAEN5_Pos) /*!< EPWM_T::APDMACTL: APDMAEN5 Mask */ + +#define EPWM_FDEN_FDEN0_Pos (0) /*!< EPWM_T::FDEN: FDEN0 Position */ +#define EPWM_FDEN_FDEN0_Msk (0x1ul << EPWM_FDEN_FDEN0_Pos) /*!< EPWM_T::FDEN: FDEN0 Mask */ + +#define EPWM_FDEN_FDEN1_Pos (1) /*!< EPWM_T::FDEN: FDEN1 Position */ +#define EPWM_FDEN_FDEN1_Msk (0x1ul << EPWM_FDEN_FDEN1_Pos) /*!< EPWM_T::FDEN: FDEN1 Mask */ + +#define EPWM_FDEN_FDEN2_Pos (2) /*!< EPWM_T::FDEN: FDEN2 Position */ +#define EPWM_FDEN_FDEN2_Msk (0x1ul << EPWM_FDEN_FDEN2_Pos) /*!< EPWM_T::FDEN: FDEN2 Mask */ + +#define EPWM_FDEN_FDEN3_Pos (3) /*!< EPWM_T::FDEN: FDEN3 Position */ +#define EPWM_FDEN_FDEN3_Msk (0x1ul << EPWM_FDEN_FDEN3_Pos) /*!< EPWM_T::FDEN: FDEN3 Mask */ + +#define EPWM_FDEN_FDEN4_Pos (4) /*!< EPWM_T::FDEN: FDEN4 Position */ +#define EPWM_FDEN_FDEN4_Msk (0x1ul << EPWM_FDEN_FDEN4_Pos) /*!< EPWM_T::FDEN: FDEN4 Mask */ + +#define EPWM_FDEN_FDEN5_Pos (5) /*!< EPWM_T::FDEN: FDEN5 Position */ +#define EPWM_FDEN_FDEN5_Msk (0x1ul << EPWM_FDEN_FDEN5_Pos) /*!< EPWM_T::FDEN: FDEN5 Mask */ + +#define EPWM_FDEN_FDODIS0_Pos (8) /*!< EPWM_T::FDEN: FDODIS0 Position */ +#define EPWM_FDEN_FDODIS0_Msk (0x1ul << EPWM_FDEN_FDODIS0_Pos) /*!< EPWM_T::FDEN: FDODIS0 Mask */ + +#define EPWM_FDEN_FDODIS1_Pos (9) /*!< EPWM_T::FDEN: FDODIS1 Position */ +#define EPWM_FDEN_FDODIS1_Msk (0x1ul << EPWM_FDEN_FDODIS1_Pos) /*!< EPWM_T::FDEN: FDODIS1 Mask */ + +#define EPWM_FDEN_FDODIS2_Pos (10) /*!< EPWM_T::FDEN: FDODIS2 Position */ +#define EPWM_FDEN_FDODIS2_Msk (0x1ul << EPWM_FDEN_FDODIS2_Pos) /*!< EPWM_T::FDEN: FDODIS2 Mask */ + +#define EPWM_FDEN_FDODIS3_Pos (11) /*!< EPWM_T::FDEN: FDODIS3 Position */ +#define EPWM_FDEN_FDODIS3_Msk (0x1ul << EPWM_FDEN_FDODIS3_Pos) /*!< EPWM_T::FDEN: FDODIS3 Mask */ + +#define EPWM_FDEN_FDODIS4_Pos (12) /*!< EPWM_T::FDEN: FDODIS4 Position */ +#define EPWM_FDEN_FDODIS4_Msk (0x1ul << EPWM_FDEN_FDODIS4_Pos) /*!< EPWM_T::FDEN: FDODIS4 Mask */ + +#define EPWM_FDEN_FDODIS5_Pos (13) /*!< EPWM_T::FDEN: FDODIS5 Position */ +#define EPWM_FDEN_FDODIS5_Msk (0x1ul << EPWM_FDEN_FDODIS5_Pos) /*!< EPWM_T::FDEN: FDODIS5 Mask */ + +#define EPWM_FDEN_FDCKS0_Pos (16) /*!< EPWM_T::FDEN: FDCKS0 Position */ +#define EPWM_FDEN_FDCKS0_Msk (0x1ul << EPWM_FDEN_FDCKS0_Pos) /*!< EPWM_T::FDEN: FDCKS0 Mask */ + +#define EPWM_FDEN_FDCKS1_Pos (17) /*!< EPWM_T::FDEN: FDCKS1 Position */ +#define EPWM_FDEN_FDCKS1_Msk (0x1ul << EPWM_FDEN_FDCKS1_Pos) /*!< EPWM_T::FDEN: FDCKS1 Mask */ + +#define EPWM_FDEN_FDCKS2_Pos (18) /*!< EPWM_T::FDEN: FDCKS2 Position */ +#define EPWM_FDEN_FDCKS2_Msk (0x1ul << EPWM_FDEN_FDCKS2_Pos) /*!< EPWM_T::FDEN: FDCKS2 Mask */ + +#define EPWM_FDEN_FDCKS3_Pos (19) /*!< EPWM_T::FDEN: FDCKS3 Position */ +#define EPWM_FDEN_FDCKS3_Msk (0x1ul << EPWM_FDEN_FDCKS3_Pos) /*!< EPWM_T::FDEN: FDCKS3 Mask */ + +#define EPWM_FDEN_FDCKS4_Pos (20) /*!< EPWM_T::FDEN: FDCKS4 Position */ +#define EPWM_FDEN_FDCKS4_Msk (0x1ul << EPWM_FDEN_FDCKS4_Pos) /*!< EPWM_T::FDEN: FDCKS4 Mask */ + +#define EPWM_FDEN_FDCKS5_Pos (21) /*!< EPWM_T::FDEN: FDCKS5 Position */ +#define EPWM_FDEN_FDCKS5_Msk (0x1ul << EPWM_FDEN_FDCKS5_Pos) /*!< EPWM_T::FDEN: FDCKS5 Mask */ + +#define EPWM_FDCTL0_TRMSKCNT_Pos (0) /*!< EPWM_T::FDCTL0: TRMSKCNT Position */ +#define EPWM_FDCTL0_TRMSKCNT_Msk (0x7ful << EPWM_FDCTL0_TRMSKCNT_Pos) /*!< EPWM_T::FDCTL0: TRMSKCNT Mask */ + +#define EPWM_FDCTL0_FDMSKEN_Pos (15) /*!< EPWM_T::FDCTL0: FDMSKEN Position */ +#define EPWM_FDCTL0_FDMSKEN_Msk (0x1ul << EPWM_FDCTL0_FDMSKEN_Pos) /*!< EPWM_T::FDCTL0: FDMSKEN Mask */ + +#define EPWM_FDCTL0_DGSMPCYC_Pos (16) /*!< EPWM_T::FDCTL0: DGSMPCYC Position */ +#define EPWM_FDCTL0_DGSMPCYC_Msk (0x7ul << EPWM_FDCTL0_DGSMPCYC_Pos) /*!< EPWM_T::FDCTL0: DGSMPCYC Mask */ + +#define EPWM_FDCTL0_FDCKSEL_Pos (28) /*!< EPWM_T::FDCTL0: FDCKSEL Position */ +#define EPWM_FDCTL0_FDCKSEL_Msk (0x3ul << EPWM_FDCTL0_FDCKSEL_Pos) /*!< EPWM_T::FDCTL0: FDCKSEL Mask */ + +#define EPWM_FDCTL0_FDDGEN_Pos (31) /*!< EPWM_T::FDCTL0: FDDGEN Position */ +#define EPWM_FDCTL0_FDDGEN_Msk (0x1ul << EPWM_FDCTL0_FDDGEN_Pos) /*!< EPWM_T::FDCTL0: FDDGEN Mask */ + +#define EPWM_FDCTL1_TRMSKCNT_Pos (0) /*!< EPWM_T::FDCTL1: TRMSKCNT Position */ +#define EPWM_FDCTL1_TRMSKCNT_Msk (0x7ful << EPWM_FDCTL1_TRMSKCNT_Pos) /*!< EPWM_T::FDCTL1: TRMSKCNT Mask */ + +#define EPWM_FDCTL1_FDMSKEN_Pos (15) /*!< EPWM_T::FDCTL1: FDMSKEN Position */ +#define EPWM_FDCTL1_FDMSKEN_Msk (0x1ul << EPWM_FDCTL1_FDMSKEN_Pos) /*!< EPWM_T::FDCTL1: FDMSKEN Mask */ + +#define EPWM_FDCTL1_DGSMPCYC_Pos (16) /*!< EPWM_T::FDCTL1: DGSMPCYC Position */ +#define EPWM_FDCTL1_DGSMPCYC_Msk (0x7ul << EPWM_FDCTL1_DGSMPCYC_Pos) /*!< EPWM_T::FDCTL1: DGSMPCYC Mask */ + +#define EPWM_FDCTL1_FDCKSEL_Pos (28) /*!< EPWM_T::FDCTL1: FDCKSEL Position */ +#define EPWM_FDCTL1_FDCKSEL_Msk (0x3ul << EPWM_FDCTL1_FDCKSEL_Pos) /*!< EPWM_T::FDCTL1: FDCKSEL Mask */ + +#define EPWM_FDCTL1_FDDGEN_Pos (31) /*!< EPWM_T::FDCTL1: FDDGEN Position */ +#define EPWM_FDCTL1_FDDGEN_Msk (0x1ul << EPWM_FDCTL1_FDDGEN_Pos) /*!< EPWM_T::FDCTL1: FDDGEN Mask */ + +#define EPWM_FDCTL2_TRMSKCNT_Pos (0) /*!< EPWM_T::FDCTL2: TRMSKCNT Position */ +#define EPWM_FDCTL2_TRMSKCNT_Msk (0x7ful << EPWM_FDCTL2_TRMSKCNT_Pos) /*!< EPWM_T::FDCTL2: TRMSKCNT Mask */ + +#define EPWM_FDCTL2_FDMSKEN_Pos (15) /*!< EPWM_T::FDCTL2: FDMSKEN Position */ +#define EPWM_FDCTL2_FDMSKEN_Msk (0x1ul << EPWM_FDCTL2_FDMSKEN_Pos) /*!< EPWM_T::FDCTL2: FDMSKEN Mask */ + +#define EPWM_FDCTL2_DGSMPCYC_Pos (16) /*!< EPWM_T::FDCTL2: DGSMPCYC Position */ +#define EPWM_FDCTL2_DGSMPCYC_Msk (0x7ul << EPWM_FDCTL2_DGSMPCYC_Pos) /*!< EPWM_T::FDCTL2: DGSMPCYC Mask */ + +#define EPWM_FDCTL2_FDCKSEL_Pos (28) /*!< EPWM_T::FDCTL2: FDCKSEL Position */ +#define EPWM_FDCTL2_FDCKSEL_Msk (0x3ul << EPWM_FDCTL2_FDCKSEL_Pos) /*!< EPWM_T::FDCTL2: FDCKSEL Mask */ + +#define EPWM_FDCTL2_FDDGEN_Pos (31) /*!< EPWM_T::FDCTL2: FDDGEN Position */ +#define EPWM_FDCTL2_FDDGEN_Msk (0x1ul << EPWM_FDCTL2_FDDGEN_Pos) /*!< EPWM_T::FDCTL2: FDDGEN Mask */ + +#define EPWM_FDCTL3_TRMSKCNT_Pos (0) /*!< EPWM_T::FDCTL3: TRMSKCNT Position */ +#define EPWM_FDCTL3_TRMSKCNT_Msk (0x7ful << EPWM_FDCTL3_TRMSKCNT_Pos) /*!< EPWM_T::FDCTL3: TRMSKCNT Mask */ + +#define EPWM_FDCTL3_FDMSKEN_Pos (15) /*!< EPWM_T::FDCTL3: FDMSKEN Position */ +#define EPWM_FDCTL3_FDMSKEN_Msk (0x1ul << EPWM_FDCTL3_FDMSKEN_Pos) /*!< EPWM_T::FDCTL3: FDMSKEN Mask */ + +#define EPWM_FDCTL3_DGSMPCYC_Pos (16) /*!< EPWM_T::FDCTL3: DGSMPCYC Position */ +#define EPWM_FDCTL3_DGSMPCYC_Msk (0x7ul << EPWM_FDCTL3_DGSMPCYC_Pos) /*!< EPWM_T::FDCTL3: DGSMPCYC Mask */ + +#define EPWM_FDCTL3_FDCKSEL_Pos (28) /*!< EPWM_T::FDCTL3: FDCKSEL Position */ +#define EPWM_FDCTL3_FDCKSEL_Msk (0x3ul << EPWM_FDCTL3_FDCKSEL_Pos) /*!< EPWM_T::FDCTL3: FDCKSEL Mask */ + +#define EPWM_FDCTL3_FDDGEN_Pos (31) /*!< EPWM_T::FDCTL3: FDDGEN Position */ +#define EPWM_FDCTL3_FDDGEN_Msk (0x1ul << EPWM_FDCTL3_FDDGEN_Pos) /*!< EPWM_T::FDCTL3: FDDGEN Mask */ + +#define EPWM_FDCTL4_TRMSKCNT_Pos (0) /*!< EPWM_T::FDCTL4: TRMSKCNT Position */ +#define EPWM_FDCTL4_TRMSKCNT_Msk (0x7ful << EPWM_FDCTL4_TRMSKCNT_Pos) /*!< EPWM_T::FDCTL4: TRMSKCNT Mask */ + +#define EPWM_FDCTL4_FDMSKEN_Pos (15) /*!< EPWM_T::FDCTL4: FDMSKEN Position */ +#define EPWM_FDCTL4_FDMSKEN_Msk (0x1ul << EPWM_FDCTL4_FDMSKEN_Pos) /*!< EPWM_T::FDCTL4: FDMSKEN Mask */ + +#define EPWM_FDCTL4_DGSMPCYC_Pos (16) /*!< EPWM_T::FDCTL4: DGSMPCYC Position */ +#define EPWM_FDCTL4_DGSMPCYC_Msk (0x7ul << EPWM_FDCTL4_DGSMPCYC_Pos) /*!< EPWM_T::FDCTL4: DGSMPCYC Mask */ + +#define EPWM_FDCTL4_FDCKSEL_Pos (28) /*!< EPWM_T::FDCTL4: FDCKSEL Position */ +#define EPWM_FDCTL4_FDCKSEL_Msk (0x3ul << EPWM_FDCTL4_FDCKSEL_Pos) /*!< EPWM_T::FDCTL4: FDCKSEL Mask */ + +#define EPWM_FDCTL4_FDDGEN_Pos (31) /*!< EPWM_T::FDCTL4: FDDGEN Position */ +#define EPWM_FDCTL4_FDDGEN_Msk (0x1ul << EPWM_FDCTL4_FDDGEN_Pos) /*!< EPWM_T::FDCTL4: FDDGEN Mask */ + +#define EPWM_FDCTL5_TRMSKCNT_Pos (0) /*!< EPWM_T::FDCTL5: TRMSKCNT Position */ +#define EPWM_FDCTL5_TRMSKCNT_Msk (0x7ful << EPWM_FDCTL5_TRMSKCNT_Pos) /*!< EPWM_T::FDCTL5: TRMSKCNT Mask */ + +#define EPWM_FDCTL5_FDMSKEN_Pos (15) /*!< EPWM_T::FDCTL5: FDMSKEN Position */ +#define EPWM_FDCTL5_FDMSKEN_Msk (0x1ul << EPWM_FDCTL5_FDMSKEN_Pos) /*!< EPWM_T::FDCTL5: FDMSKEN Mask */ + +#define EPWM_FDCTL5_DGSMPCYC_Pos (16) /*!< EPWM_T::FDCTL5: DGSMPCYC Position */ +#define EPWM_FDCTL5_DGSMPCYC_Msk (0x7ul << EPWM_FDCTL5_DGSMPCYC_Pos) /*!< EPWM_T::FDCTL5: DGSMPCYC Mask */ + +#define EPWM_FDCTL5_FDCKSEL_Pos (28) /*!< EPWM_T::FDCTL5: FDCKSEL Position */ +#define EPWM_FDCTL5_FDCKSEL_Msk (0x3ul << EPWM_FDCTL5_FDCKSEL_Pos) /*!< EPWM_T::FDCTL5: FDCKSEL Mask */ + +#define EPWM_FDCTL5_FDDGEN_Pos (31) /*!< EPWM_T::FDCTL5: FDDGEN Position */ +#define EPWM_FDCTL5_FDDGEN_Msk (0x1ul << EPWM_FDCTL5_FDDGEN_Pos) /*!< EPWM_T::FDCTL5: FDDGEN Mask */ + +#define EPWM_FDIEN_FDIENn_Pos (0) /*!< EPWM_T::FDIEN: FDIENn Position */ +#define EPWM_FDIEN_FDIENn_Msk (0x1ul << EPWM_FDIEN_FDIENn_Pos) /*!< EPWM_T::FDIEN: FDIENn Mask */ + +#define EPWM_FDSTS_FDIFn_Pos (0) /*!< EPWM_T::FDSTS: FDIFn Position */ +#define EPWM_FDSTS_FDIFn_Msk (0x3ful << EPWM_FDSTS_FDIFn_Pos) /*!< EPWM_T::FDSTS: FDIFn Mask */ + +#define EPWM_FDIEN_FDIEN0_Pos (0) /*!< EPWM_T::FDIEN: FDIEN0 Position */ +#define EPWM_FDIEN_FDIEN0_Msk (0x1ul << EPWM_FDIEN_FDIEN0_Pos) /*!< EPWM_T::FDIEN: FDIEN0 Mask */ + +#define EPWM_FDIEN_FDIEN1_Pos (1) /*!< EPWM_T::FDIEN: FDIEN1 Position */ +#define EPWM_FDIEN_FDIEN1_Msk (0x1ul << EPWM_FDIEN_FDIEN1_Pos) /*!< EPWM_T::FDIEN: FDIEN1 Mask */ + +#define EPWM_FDIEN_FDIEN2_Pos (2) /*!< EPWM_T::FDIEN: FDIEN2 Position */ +#define EPWM_FDIEN_FDIEN2_Msk (0x1ul << EPWM_FDIEN_FDIEN2_Pos) /*!< EPWM_T::FDIEN: FDIEN2 Mask */ + +#define EPWM_FDIEN_FDIEN3_Pos (3) /*!< EPWM_T::FDIEN: FDIEN3 Position */ +#define EPWM_FDIEN_FDIEN3_Msk (0x1ul << EPWM_FDIEN_FDIEN3_Pos) /*!< EPWM_T::FDIEN: FDIEN3 Mask */ + +#define EPWM_FDIEN_FDIEN4_Pos (4) /*!< EPWM_T::FDIEN: FDIEN4 Position */ +#define EPWM_FDIEN_FDIEN4_Msk (0x1ul << EPWM_FDIEN_FDIEN4_Pos) /*!< EPWM_T::FDIEN: FDIEN4 Mask */ + +#define EPWM_FDIEN_FDIEN5_Pos (5) /*!< EPWM_T::FDIEN: FDIEN5 Position */ +#define EPWM_FDIEN_FDIEN5_Msk (0x1ul << EPWM_FDIEN_FDIEN5_Pos) /*!< EPWM_T::FDIEN: FDIEN5 Mask */ + +#define EPWM_FDSTS_FDIF0_Pos (0) /*!< EPWM_T::FDSTS: FDIF0 Position */ +#define EPWM_FDSTS_FDIF0_Msk (0x1ul << EPWM_FDSTS_FDIF0_Pos) /*!< EPWM_T::FDSTS: FDIF0 Mask */ + +#define EPWM_FDSTS_FDIF1_Pos (1) /*!< EPWM_T::FDSTS: FDIF1 Position */ +#define EPWM_FDSTS_FDIF1_Msk (0x1ul << EPWM_FDSTS_FDIF1_Pos) /*!< EPWM_T::FDSTS: FDIF1 Mask */ + +#define EPWM_FDSTS_FDIF2_Pos (2) /*!< EPWM_T::FDSTS: FDIF2 Position */ +#define EPWM_FDSTS_FDIF2_Msk (0x1ul << EPWM_FDSTS_FDIF2_Pos) /*!< EPWM_T::FDSTS: FDIF2 Mask */ + +#define EPWM_FDSTS_FDIF3_Pos (3) /*!< EPWM_T::FDSTS: FDIF3 Position */ +#define EPWM_FDSTS_FDIF3_Msk (0x1ul << EPWM_FDSTS_FDIF3_Pos) /*!< EPWM_T::FDSTS: FDIF3 Mask */ + +#define EPWM_FDSTS_FDIF4_Pos (4) /*!< EPWM_T::FDSTS: FDIF4 Position */ +#define EPWM_FDSTS_FDIF4_Msk (0x1ul << EPWM_FDSTS_FDIF4_Pos) /*!< EPWM_T::FDSTS: FDIF4 Mask */ + +#define EPWM_FDSTS_FDIF5_Pos (5) /*!< EPWM_T::FDSTS: FDIF5 Position */ +#define EPWM_FDSTS_FDIF5_Msk (0x1ul << EPWM_FDSTS_FDIF5_Pos) /*!< EPWM_T::FDSTS: FDIF5 Mask */ + +#define EPWM_EADCPSCCTL_PSCEN0_Pos (0) /*!< EPWM_T::EADCPSCCTL: PSCEN0 Position */ +#define EPWM_EADCPSCCTL_PSCEN0_Msk (0x1ul << EPWM_EADCPSCCTL_PSCEN0_Pos) /*!< EPWM_T::EADCPSCCTL: PSCEN0 Mask */ + +#define EPWM_EADCPSCCTL_PSCEN1_Pos (1) /*!< EPWM_T::EADCPSCCTL: PSCEN1 Position */ +#define EPWM_EADCPSCCTL_PSCEN1_Msk (0x1ul << EPWM_EADCPSCCTL_PSCEN1_Pos) /*!< EPWM_T::EADCPSCCTL: PSCEN1 Mask */ + +#define EPWM_EADCPSCCTL_PSCEN2_Pos (2) /*!< EPWM_T::EADCPSCCTL: PSCEN2 Position */ +#define EPWM_EADCPSCCTL_PSCEN2_Msk (0x1ul << EPWM_EADCPSCCTL_PSCEN2_Pos) /*!< EPWM_T::EADCPSCCTL: PSCEN2 Mask */ + +#define EPWM_EADCPSCCTL_PSCEN3_Pos (3) /*!< EPWM_T::EADCPSCCTL: PSCEN3 Position */ +#define EPWM_EADCPSCCTL_PSCEN3_Msk (0x1ul << EPWM_EADCPSCCTL_PSCEN3_Pos) /*!< EPWM_T::EADCPSCCTL: PSCEN3 Mask */ + +#define EPWM_EADCPSCCTL_PSCEN4_Pos (4) /*!< EPWM_T::EADCPSCCTL: PSCEN4 Position */ +#define EPWM_EADCPSCCTL_PSCEN4_Msk (0x1ul << EPWM_EADCPSCCTL_PSCEN4_Pos) /*!< EPWM_T::EADCPSCCTL: PSCEN4 Mask */ + +#define EPWM_EADCPSCCTL_PSCEN5_Pos (5) /*!< EPWM_T::EADCPSCCTL: PSCEN5 Position */ +#define EPWM_EADCPSCCTL_PSCEN5_Msk (0x1ul << EPWM_EADCPSCCTL_PSCEN5_Pos) /*!< EPWM_T::EADCPSCCTL: PSCEN5 Mask */ + +#define EPWM_EADCPSC0_EADCPSC0_Pos (0) /*!< EPWM_T::EADCPSC0: EADCPSC0 Position */ +#define EPWM_EADCPSC0_EADCPSC0_Msk (0xful << EPWM_EADCPSC0_EADCPSC0_Pos) /*!< EPWM_T::EADCPSC0: EADCPSC0 Mask */ + +#define EPWM_EADCPSC0_EADCPSC1_Pos (8) /*!< EPWM_T::EADCPSC0: EADCPSC1 Position */ +#define EPWM_EADCPSC0_EADCPSC1_Msk (0xful << EPWM_EADCPSC0_EADCPSC1_Pos) /*!< EPWM_T::EADCPSC0: EADCPSC1 Mask */ + +#define EPWM_EADCPSC0_EADCPSC2_Pos (16) /*!< EPWM_T::EADCPSC0: EADCPSC2 Position */ +#define EPWM_EADCPSC0_EADCPSC2_Msk (0xful << EPWM_EADCPSC0_EADCPSC2_Pos) /*!< EPWM_T::EADCPSC0: EADCPSC2 Mask */ + +#define EPWM_EADCPSC0_EADCPSC3_Pos (24) /*!< EPWM_T::EADCPSC0: EADCPSC3 Position */ +#define EPWM_EADCPSC0_EADCPSC3_Msk (0xful << EPWM_EADCPSC0_EADCPSC3_Pos) /*!< EPWM_T::EADCPSC0: EADCPSC3 Mask */ + +#define EPWM_EADCPSC1_EADCPSC4_Pos (0) /*!< EPWM_T::EADCPSC1: EADCPSC4 Position */ +#define EPWM_EADCPSC1_EADCPSC4_Msk (0xful << EPWM_EADCPSC1_EADCPSC4_Pos) /*!< EPWM_T::EADCPSC1: EADCPSC4 Mask */ + +#define EPWM_EADCPSC1_EADCPSC5_Pos (8) /*!< EPWM_T::EADCPSC1: EADCPSC5 Position */ +#define EPWM_EADCPSC1_EADCPSC5_Msk (0xful << EPWM_EADCPSC1_EADCPSC5_Pos) /*!< EPWM_T::EADCPSC1: EADCPSC5 Mask */ + +#define EPWM_EADCPSCNT0_PSCNT0_Pos (0) /*!< EPWM_T::EADCPSCNT0: PSCNT0 Position */ +#define EPWM_EADCPSCNT0_PSCNT0_Msk (0xful << EPWM_EADCPSCNT0_PSCNT0_Pos) /*!< EPWM_T::EADCPSCNT0: PSCNT0 Mask */ + +#define EPWM_EADCPSCNT0_PSCNT1_Pos (8) /*!< EPWM_T::EADCPSCNT0: PSCNT1 Position */ +#define EPWM_EADCPSCNT0_PSCNT1_Msk (0xful << EPWM_EADCPSCNT0_PSCNT1_Pos) /*!< EPWM_T::EADCPSCNT0: PSCNT1 Mask */ + +#define EPWM_EADCPSCNT0_PSCNT2_Pos (16) /*!< EPWM_T::EADCPSCNT0: PSCNT2 Position */ +#define EPWM_EADCPSCNT0_PSCNT2_Msk (0xful << EPWM_EADCPSCNT0_PSCNT2_Pos) /*!< EPWM_T::EADCPSCNT0: PSCNT2 Mask */ + +#define EPWM_EADCPSCNT0_PSCNT3_Pos (24) /*!< EPWM_T::EADCPSCNT0: PSCNT3 Position */ +#define EPWM_EADCPSCNT0_PSCNT3_Msk (0xful << EPWM_EADCPSCNT0_PSCNT3_Pos) /*!< EPWM_T::EADCPSCNT0: PSCNT3 Mask */ + +#define EPWM_EADCPSCNT1_PSCNT4_Pos (0) /*!< EPWM_T::EADCPSCNT1: PSCNT4 Position */ +#define EPWM_EADCPSCNT1_PSCNT4_Msk (0xful << EPWM_EADCPSCNT1_PSCNT4_Pos) /*!< EPWM_T::EADCPSCNT1: PSCNT4 Mask */ + +#define EPWM_EADCPSCNT1_PSCNT5_Pos (8) /*!< EPWM_T::EADCPSCNT1: PSCNT5 Position */ +#define EPWM_EADCPSCNT1_PSCNT5_Msk (0xful << EPWM_EADCPSCNT1_PSCNT5_Pos) /*!< EPWM_T::EADCPSCNT1: PSCNT5 Mask */ + +#define EPWM_CAPINEN_CAPINEN0_Pos (0) /*!< EPWM_T::CAPINEN: CAPINEN0 Position */ +#define EPWM_CAPINEN_CAPINEN0_Msk (0x1ul << EPWM_CAPINEN_CAPINEN0_Pos) /*!< EPWM_T::CAPINEN: CAPINEN0 Mask */ + +#define EPWM_CAPINEN_CAPINEN1_Pos (1) /*!< EPWM_T::CAPINEN: CAPINEN1 Position */ +#define EPWM_CAPINEN_CAPINEN1_Msk (0x1ul << EPWM_CAPINEN_CAPINEN1_Pos) /*!< EPWM_T::CAPINEN: CAPINEN1 Mask */ + +#define EPWM_CAPINEN_CAPINEN2_Pos (2) /*!< EPWM_T::CAPINEN: CAPINEN2 Position */ +#define EPWM_CAPINEN_CAPINEN2_Msk (0x1ul << EPWM_CAPINEN_CAPINEN2_Pos) /*!< EPWM_T::CAPINEN: CAPINEN2 Mask */ + +#define EPWM_CAPINEN_CAPINEN3_Pos (3) /*!< EPWM_T::CAPINEN: CAPINEN3 Position */ +#define EPWM_CAPINEN_CAPINEN3_Msk (0x1ul << EPWM_CAPINEN_CAPINEN3_Pos) /*!< EPWM_T::CAPINEN: CAPINEN3 Mask */ + +#define EPWM_CAPINEN_CAPINEN4_Pos (4) /*!< EPWM_T::CAPINEN: CAPINEN4 Position */ +#define EPWM_CAPINEN_CAPINEN4_Msk (0x1ul << EPWM_CAPINEN_CAPINEN4_Pos) /*!< EPWM_T::CAPINEN: CAPINEN4 Mask */ + +#define EPWM_CAPINEN_CAPINEN5_Pos (5) /*!< EPWM_T::CAPINEN: CAPINEN5 Position */ +#define EPWM_CAPINEN_CAPINEN5_Msk (0x1ul << EPWM_CAPINEN_CAPINEN5_Pos) /*!< EPWM_T::CAPINEN: CAPINEN5 Mask */ + +#define EPWM_CAPCTL_CAPEN0_Pos (0) /*!< EPWM_T::CAPCTL: CAPEN0 Position */ +#define EPWM_CAPCTL_CAPEN0_Msk (0x1ul << EPWM_CAPCTL_CAPEN0_Pos) /*!< EPWM_T::CAPCTL: CAPEN0 Mask */ + +#define EPWM_CAPCTL_CAPEN1_Pos (1) /*!< EPWM_T::CAPCTL: CAPEN1 Position */ +#define EPWM_CAPCTL_CAPEN1_Msk (0x1ul << EPWM_CAPCTL_CAPEN1_Pos) /*!< EPWM_T::CAPCTL: CAPEN1 Mask */ + +#define EPWM_CAPCTL_CAPEN2_Pos (2) /*!< EPWM_T::CAPCTL: CAPEN2 Position */ +#define EPWM_CAPCTL_CAPEN2_Msk (0x1ul << EPWM_CAPCTL_CAPEN2_Pos) /*!< EPWM_T::CAPCTL: CAPEN2 Mask */ + +#define EPWM_CAPCTL_CAPEN3_Pos (3) /*!< EPWM_T::CAPCTL: CAPEN3 Position */ +#define EPWM_CAPCTL_CAPEN3_Msk (0x1ul << EPWM_CAPCTL_CAPEN3_Pos) /*!< EPWM_T::CAPCTL: CAPEN3 Mask */ + +#define EPWM_CAPCTL_CAPEN4_Pos (4) /*!< EPWM_T::CAPCTL: CAPEN4 Position */ +#define EPWM_CAPCTL_CAPEN4_Msk (0x1ul << EPWM_CAPCTL_CAPEN4_Pos) /*!< EPWM_T::CAPCTL: CAPEN4 Mask */ + +#define EPWM_CAPCTL_CAPEN5_Pos (5) /*!< EPWM_T::CAPCTL: CAPEN5 Position */ +#define EPWM_CAPCTL_CAPEN5_Msk (0x1ul << EPWM_CAPCTL_CAPEN5_Pos) /*!< EPWM_T::CAPCTL: CAPEN5 Mask */ + +#define EPWM_CAPCTL_CAPINV0_Pos (8) /*!< EPWM_T::CAPCTL: CAPINV0 Position */ +#define EPWM_CAPCTL_CAPINV0_Msk (0x1ul << EPWM_CAPCTL_CAPINV0_Pos) /*!< EPWM_T::CAPCTL: CAPINV0 Mask */ + +#define EPWM_CAPCTL_CAPINV1_Pos (9) /*!< EPWM_T::CAPCTL: CAPINV1 Position */ +#define EPWM_CAPCTL_CAPINV1_Msk (0x1ul << EPWM_CAPCTL_CAPINV1_Pos) /*!< EPWM_T::CAPCTL: CAPINV1 Mask */ + +#define EPWM_CAPCTL_CAPINV2_Pos (10) /*!< EPWM_T::CAPCTL: CAPINV2 Position */ +#define EPWM_CAPCTL_CAPINV2_Msk (0x1ul << EPWM_CAPCTL_CAPINV2_Pos) /*!< EPWM_T::CAPCTL: CAPINV2 Mask */ + +#define EPWM_CAPCTL_CAPINV3_Pos (11) /*!< EPWM_T::CAPCTL: CAPINV3 Position */ +#define EPWM_CAPCTL_CAPINV3_Msk (0x1ul << EPWM_CAPCTL_CAPINV3_Pos) /*!< EPWM_T::CAPCTL: CAPINV3 Mask */ + +#define EPWM_CAPCTL_CAPINV4_Pos (12) /*!< EPWM_T::CAPCTL: CAPINV4 Position */ +#define EPWM_CAPCTL_CAPINV4_Msk (0x1ul << EPWM_CAPCTL_CAPINV4_Pos) /*!< EPWM_T::CAPCTL: CAPINV4 Mask */ + +#define EPWM_CAPCTL_CAPINV5_Pos (13) /*!< EPWM_T::CAPCTL: CAPINV5 Position */ +#define EPWM_CAPCTL_CAPINV5_Msk (0x1ul << EPWM_CAPCTL_CAPINV5_Pos) /*!< EPWM_T::CAPCTL: CAPINV5 Mask */ + +#define EPWM_CAPCTL_RCRLDEN0_Pos (16) /*!< EPWM_T::CAPCTL: RCRLDEN0 Position */ +#define EPWM_CAPCTL_RCRLDEN0_Msk (0x1ul << EPWM_CAPCTL_RCRLDEN0_Pos) /*!< EPWM_T::CAPCTL: RCRLDEN0 Mask */ + +#define EPWM_CAPCTL_RCRLDEN1_Pos (17) /*!< EPWM_T::CAPCTL: RCRLDEN1 Position */ +#define EPWM_CAPCTL_RCRLDEN1_Msk (0x1ul << EPWM_CAPCTL_RCRLDEN1_Pos) /*!< EPWM_T::CAPCTL: RCRLDEN1 Mask */ + +#define EPWM_CAPCTL_RCRLDEN2_Pos (18) /*!< EPWM_T::CAPCTL: RCRLDEN2 Position */ +#define EPWM_CAPCTL_RCRLDEN2_Msk (0x1ul << EPWM_CAPCTL_RCRLDEN2_Pos) /*!< EPWM_T::CAPCTL: RCRLDEN2 Mask */ + +#define EPWM_CAPCTL_RCRLDEN3_Pos (19) /*!< EPWM_T::CAPCTL: RCRLDEN3 Position */ +#define EPWM_CAPCTL_RCRLDEN3_Msk (0x1ul << EPWM_CAPCTL_RCRLDEN3_Pos) /*!< EPWM_T::CAPCTL: RCRLDEN3 Mask */ + +#define EPWM_CAPCTL_RCRLDEN4_Pos (20) /*!< EPWM_T::CAPCTL: RCRLDEN4 Position */ +#define EPWM_CAPCTL_RCRLDEN4_Msk (0x1ul << EPWM_CAPCTL_RCRLDEN4_Pos) /*!< EPWM_T::CAPCTL: RCRLDEN4 Mask */ + +#define EPWM_CAPCTL_RCRLDEN5_Pos (21) /*!< EPWM_T::CAPCTL: RCRLDEN5 Position */ +#define EPWM_CAPCTL_RCRLDEN5_Msk (0x1ul << EPWM_CAPCTL_RCRLDEN5_Pos) /*!< EPWM_T::CAPCTL: RCRLDEN5 Mask */ + +#define EPWM_CAPCTL_FCRLDEN0_Pos (24) /*!< EPWM_T::CAPCTL: FCRLDEN0 Position */ +#define EPWM_CAPCTL_FCRLDEN0_Msk (0x1ul << EPWM_CAPCTL_FCRLDEN0_Pos) /*!< EPWM_T::CAPCTL: FCRLDEN0 Mask */ + +#define EPWM_CAPCTL_FCRLDEN1_Pos (25) /*!< EPWM_T::CAPCTL: FCRLDEN1 Position */ +#define EPWM_CAPCTL_FCRLDEN1_Msk (0x1ul << EPWM_CAPCTL_FCRLDEN1_Pos) /*!< EPWM_T::CAPCTL: FCRLDEN1 Mask */ + +#define EPWM_CAPCTL_FCRLDEN2_Pos (26) /*!< EPWM_T::CAPCTL: FCRLDEN2 Position */ +#define EPWM_CAPCTL_FCRLDEN2_Msk (0x1ul << EPWM_CAPCTL_FCRLDEN2_Pos) /*!< EPWM_T::CAPCTL: FCRLDEN2 Mask */ + +#define EPWM_CAPCTL_FCRLDEN3_Pos (27) /*!< EPWM_T::CAPCTL: FCRLDEN3 Position */ +#define EPWM_CAPCTL_FCRLDEN3_Msk (0x1ul << EPWM_CAPCTL_FCRLDEN3_Pos) /*!< EPWM_T::CAPCTL: FCRLDEN3 Mask */ + +#define EPWM_CAPCTL_FCRLDEN4_Pos (28) /*!< EPWM_T::CAPCTL: FCRLDEN4 Position */ +#define EPWM_CAPCTL_FCRLDEN4_Msk (0x1ul << EPWM_CAPCTL_FCRLDEN4_Pos) /*!< EPWM_T::CAPCTL: FCRLDEN4 Mask */ + +#define EPWM_CAPCTL_FCRLDEN5_Pos (29) /*!< EPWM_T::CAPCTL: FCRLDEN5 Position */ +#define EPWM_CAPCTL_FCRLDEN5_Msk (0x1ul << EPWM_CAPCTL_FCRLDEN5_Pos) /*!< EPWM_T::CAPCTL: FCRLDEN5 Mask */ + +#define EPWM_CAPSTS_CRLIFOV0_Pos (0) /*!< EPWM_T::CAPSTS: CRLIFOV0 Position */ +#define EPWM_CAPSTS_CRLIFOV0_Msk (0x1ul << EPWM_CAPSTS_CRLIFOV0_Pos) /*!< EPWM_T::CAPSTS: CRLIFOV0 Mask */ + +#define EPWM_CAPSTS_CRLIFOV1_Pos (1) /*!< EPWM_T::CAPSTS: CRLIFOV1 Position */ +#define EPWM_CAPSTS_CRLIFOV1_Msk (0x1ul << EPWM_CAPSTS_CRLIFOV1_Pos) /*!< EPWM_T::CAPSTS: CRLIFOV1 Mask */ + +#define EPWM_CAPSTS_CRLIFOV2_Pos (2) /*!< EPWM_T::CAPSTS: CRLIFOV2 Position */ +#define EPWM_CAPSTS_CRLIFOV2_Msk (0x1ul << EPWM_CAPSTS_CRLIFOV2_Pos) /*!< EPWM_T::CAPSTS: CRLIFOV2 Mask */ + +#define EPWM_CAPSTS_CRLIFOV3_Pos (3) /*!< EPWM_T::CAPSTS: CRLIFOV3 Position */ +#define EPWM_CAPSTS_CRLIFOV3_Msk (0x1ul << EPWM_CAPSTS_CRLIFOV3_Pos) /*!< EPWM_T::CAPSTS: CRLIFOV3 Mask */ + +#define EPWM_CAPSTS_CRLIFOV4_Pos (4) /*!< EPWM_T::CAPSTS: CRLIFOV4 Position */ +#define EPWM_CAPSTS_CRLIFOV4_Msk (0x1ul << EPWM_CAPSTS_CRLIFOV4_Pos) /*!< EPWM_T::CAPSTS: CRLIFOV4 Mask */ + +#define EPWM_CAPSTS_CRLIFOV5_Pos (5) /*!< EPWM_T::CAPSTS: CRLIFOV5 Position */ +#define EPWM_CAPSTS_CRLIFOV5_Msk (0x1ul << EPWM_CAPSTS_CRLIFOV5_Pos) /*!< EPWM_T::CAPSTS: CRLIFOV5 Mask */ + +#define EPWM_CAPSTS_CFLIFOV0_Pos (8) /*!< EPWM_T::CAPSTS: CFLIFOV0 Position */ +#define EPWM_CAPSTS_CFLIFOV0_Msk (0x1ul << EPWM_CAPSTS_CFLIFOV0_Pos) /*!< EPWM_T::CAPSTS: CFLIFOV0 Mask */ + +#define EPWM_CAPSTS_CFLIFOV1_Pos (9) /*!< EPWM_T::CAPSTS: CFLIFOV1 Position */ +#define EPWM_CAPSTS_CFLIFOV1_Msk (0x1ul << EPWM_CAPSTS_CFLIFOV1_Pos) /*!< EPWM_T::CAPSTS: CFLIFOV1 Mask */ + +#define EPWM_CAPSTS_CFLIFOV2_Pos (10) /*!< EPWM_T::CAPSTS: CFLIFOV2 Position */ +#define EPWM_CAPSTS_CFLIFOV2_Msk (0x1ul << EPWM_CAPSTS_CFLIFOV2_Pos) /*!< EPWM_T::CAPSTS: CFLIFOV2 Mask */ + +#define EPWM_CAPSTS_CFLIFOV3_Pos (11) /*!< EPWM_T::CAPSTS: CFLIFOV3 Position */ +#define EPWM_CAPSTS_CFLIFOV3_Msk (0x1ul << EPWM_CAPSTS_CFLIFOV3_Pos) /*!< EPWM_T::CAPSTS: CFLIFOV3 Mask */ + +#define EPWM_CAPSTS_CFLIFOV4_Pos (12) /*!< EPWM_T::CAPSTS: CFLIFOV4 Position */ +#define EPWM_CAPSTS_CFLIFOV4_Msk (0x1ul << EPWM_CAPSTS_CFLIFOV4_Pos) /*!< EPWM_T::CAPSTS: CFLIFOV4 Mask */ + +#define EPWM_CAPSTS_CFLIFOV5_Pos (13) /*!< EPWM_T::CAPSTS: CFLIFOV5 Position */ +#define EPWM_CAPSTS_CFLIFOV5_Msk (0x1ul << EPWM_CAPSTS_CFLIFOV5_Pos) /*!< EPWM_T::CAPSTS: CFLIFOV5 Mask */ + +#define EPWM_RCAPDAT0_RCAPDAT_Pos (0) /*!< EPWM_T::RCAPDAT0: RCAPDAT Position */ +#define EPWM_RCAPDAT0_RCAPDAT_Msk (0xfffful << EPWM_RCAPDAT0_RCAPDAT_Pos) /*!< EPWM_T::RCAPDAT0: RCAPDAT Mask */ + +#define EPWM_FCAPDAT0_FCAPDAT_Pos (0) /*!< EPWM_T::FCAPDAT0: FCAPDAT Position */ +#define EPWM_FCAPDAT0_FCAPDAT_Msk (0xfffful << EPWM_FCAPDAT0_FCAPDAT_Pos) /*!< EPWM_T::FCAPDAT0: FCAPDAT Mask */ + +#define EPWM_RCAPDAT1_RCAPDAT_Pos (0) /*!< EPWM_T::RCAPDAT1: RCAPDAT Position */ +#define EPWM_RCAPDAT1_RCAPDAT_Msk (0xfffful << EPWM_RCAPDAT1_RCAPDAT_Pos) /*!< EPWM_T::RCAPDAT1: RCAPDAT Mask */ + +#define EPWM_FCAPDAT1_FCAPDAT_Pos (0) /*!< EPWM_T::FCAPDAT1: FCAPDAT Position */ +#define EPWM_FCAPDAT1_FCAPDAT_Msk (0xfffful << EPWM_FCAPDAT1_FCAPDAT_Pos) /*!< EPWM_T::FCAPDAT1: FCAPDAT Mask */ + +#define EPWM_RCAPDAT2_RCAPDAT_Pos (0) /*!< EPWM_T::RCAPDAT2: RCAPDAT Position */ +#define EPWM_RCAPDAT2_RCAPDAT_Msk (0xfffful << EPWM_RCAPDAT2_RCAPDAT_Pos) /*!< EPWM_T::RCAPDAT2: RCAPDAT Mask */ + +#define EPWM_FCAPDAT2_FCAPDAT_Pos (0) /*!< EPWM_T::FCAPDAT2: FCAPDAT Position */ +#define EPWM_FCAPDAT2_FCAPDAT_Msk (0xfffful << EPWM_FCAPDAT2_FCAPDAT_Pos) /*!< EPWM_T::FCAPDAT2: FCAPDAT Mask */ + +#define EPWM_RCAPDAT3_RCAPDAT_Pos (0) /*!< EPWM_T::RCAPDAT3: RCAPDAT Position */ +#define EPWM_RCAPDAT3_RCAPDAT_Msk (0xfffful << EPWM_RCAPDAT3_RCAPDAT_Pos) /*!< EPWM_T::RCAPDAT3: RCAPDAT Mask */ + +#define EPWM_FCAPDAT3_FCAPDAT_Pos (0) /*!< EPWM_T::FCAPDAT3: FCAPDAT Position */ +#define EPWM_FCAPDAT3_FCAPDAT_Msk (0xfffful << EPWM_FCAPDAT3_FCAPDAT_Pos) /*!< EPWM_T::FCAPDAT3: FCAPDAT Mask */ + +#define EPWM_RCAPDAT4_RCAPDAT_Pos (0) /*!< EPWM_T::RCAPDAT4: RCAPDAT Position */ +#define EPWM_RCAPDAT4_RCAPDAT_Msk (0xfffful << EPWM_RCAPDAT4_RCAPDAT_Pos) /*!< EPWM_T::RCAPDAT4: RCAPDAT Mask */ + +#define EPWM_FCAPDAT4_FCAPDAT_Pos (0) /*!< EPWM_T::FCAPDAT4: FCAPDAT Position */ +#define EPWM_FCAPDAT4_FCAPDAT_Msk (0xfffful << EPWM_FCAPDAT4_FCAPDAT_Pos) /*!< EPWM_T::FCAPDAT4: FCAPDAT Mask */ + +#define EPWM_RCAPDAT5_RCAPDAT_Pos (0) /*!< EPWM_T::RCAPDAT5: RCAPDAT Position */ +#define EPWM_RCAPDAT5_RCAPDAT_Msk (0xfffful << EPWM_RCAPDAT5_RCAPDAT_Pos) /*!< EPWM_T::RCAPDAT5: RCAPDAT Mask */ + +#define EPWM_FCAPDAT5_FCAPDAT_Pos (0) /*!< EPWM_T::FCAPDAT5: FCAPDAT Position */ +#define EPWM_FCAPDAT5_FCAPDAT_Msk (0xfffful << EPWM_FCAPDAT5_FCAPDAT_Pos) /*!< EPWM_T::FCAPDAT5: FCAPDAT Mask */ + +#define EPWM_PDMACTL_CHEN0_1_Pos (0) /*!< EPWM_T::PDMACTL: CHEN0_1 Position */ +#define EPWM_PDMACTL_CHEN0_1_Msk (0x1ul << EPWM_PDMACTL_CHEN0_1_Pos) /*!< EPWM_T::PDMACTL: CHEN0_1 Mask */ + +#define EPWM_PDMACTL_CAPMOD0_1_Pos (1) /*!< EPWM_T::PDMACTL: CAPMOD0_1 Position */ +#define EPWM_PDMACTL_CAPMOD0_1_Msk (0x3ul << EPWM_PDMACTL_CAPMOD0_1_Pos) /*!< EPWM_T::PDMACTL: CAPMOD0_1 Mask */ + +#define EPWM_PDMACTL_CAPORD0_1_Pos (3) /*!< EPWM_T::PDMACTL: CAPORD0_1 Position */ +#define EPWM_PDMACTL_CAPORD0_1_Msk (0x1ul << EPWM_PDMACTL_CAPORD0_1_Pos) /*!< EPWM_T::PDMACTL: CAPORD0_1 Mask */ + +#define EPWM_PDMACTL_CHSEL0_1_Pos (4) /*!< EPWM_T::PDMACTL: CHSEL0_1 Position */ +#define EPWM_PDMACTL_CHSEL0_1_Msk (0x1ul << EPWM_PDMACTL_CHSEL0_1_Pos) /*!< EPWM_T::PDMACTL: CHSEL0_1 Mask */ + +#define EPWM_PDMACTL_CHEN2_3_Pos (8) /*!< EPWM_T::PDMACTL: CHEN2_3 Position */ +#define EPWM_PDMACTL_CHEN2_3_Msk (0x1ul << EPWM_PDMACTL_CHEN2_3_Pos) /*!< EPWM_T::PDMACTL: CHEN2_3 Mask */ + +#define EPWM_PDMACTL_CAPMOD2_3_Pos (9) /*!< EPWM_T::PDMACTL: CAPMOD2_3 Position */ +#define EPWM_PDMACTL_CAPMOD2_3_Msk (0x3ul << EPWM_PDMACTL_CAPMOD2_3_Pos) /*!< EPWM_T::PDMACTL: CAPMOD2_3 Mask */ + +#define EPWM_PDMACTL_CAPORD2_3_Pos (11) /*!< EPWM_T::PDMACTL: CAPORD2_3 Position */ +#define EPWM_PDMACTL_CAPORD2_3_Msk (0x1ul << EPWM_PDMACTL_CAPORD2_3_Pos) /*!< EPWM_T::PDMACTL: CAPORD2_3 Mask */ + +#define EPWM_PDMACTL_CHSEL2_3_Pos (12) /*!< EPWM_T::PDMACTL: CHSEL2_3 Position */ +#define EPWM_PDMACTL_CHSEL2_3_Msk (0x1ul << EPWM_PDMACTL_CHSEL2_3_Pos) /*!< EPWM_T::PDMACTL: CHSEL2_3 Mask */ + +#define EPWM_PDMACTL_CHEN4_5_Pos (16) /*!< EPWM_T::PDMACTL: CHEN4_5 Position */ +#define EPWM_PDMACTL_CHEN4_5_Msk (0x1ul << EPWM_PDMACTL_CHEN4_5_Pos) /*!< EPWM_T::PDMACTL: CHEN4_5 Mask */ + +#define EPWM_PDMACTL_CAPMOD4_5_Pos (17) /*!< EPWM_T::PDMACTL: CAPMOD4_5 Position */ +#define EPWM_PDMACTL_CAPMOD4_5_Msk (0x3ul << EPWM_PDMACTL_CAPMOD4_5_Pos) /*!< EPWM_T::PDMACTL: CAPMOD4_5 Mask */ + +#define EPWM_PDMACTL_CAPORD4_5_Pos (19) /*!< EPWM_T::PDMACTL: CAPORD4_5 Position */ +#define EPWM_PDMACTL_CAPORD4_5_Msk (0x1ul << EPWM_PDMACTL_CAPORD4_5_Pos) /*!< EPWM_T::PDMACTL: CAPORD4_5 Mask */ + +#define EPWM_PDMACTL_CHSEL4_5_Pos (20) /*!< EPWM_T::PDMACTL: CHSEL4_5 Position */ +#define EPWM_PDMACTL_CHSEL4_5_Msk (0x1ul << EPWM_PDMACTL_CHSEL4_5_Pos) /*!< EPWM_T::PDMACTL: CHSEL4_5 Mask */ + +#define EPWM_PDMACAP0_1_CAPBUF_Pos (0) /*!< EPWM_T::PDMACAP0_1: CAPBUF Position */ +#define EPWM_PDMACAP0_1_CAPBUF_Msk (0xfffful << EPWM_PDMACAP0_1_CAPBUF_Pos) /*!< EPWM_T::PDMACAP0_1: CAPBUF Mask */ + +#define EPWM_PDMACAP2_3_CAPBUF_Pos (0) /*!< EPWM_T::PDMACAP2_3: CAPBUF Position */ +#define EPWM_PDMACAP2_3_CAPBUF_Msk (0xfffful << EPWM_PDMACAP2_3_CAPBUF_Pos) /*!< EPWM_T::PDMACAP2_3: CAPBUF Mask */ + +#define EPWM_PDMACAP4_5_CAPBUF_Pos (0) /*!< EPWM_T::PDMACAP4_5: CAPBUF Position */ +#define EPWM_PDMACAP4_5_CAPBUF_Msk (0xfffful << EPWM_PDMACAP4_5_CAPBUF_Pos) /*!< EPWM_T::PDMACAP4_5: CAPBUF Mask */ + +#define EPWM_CAPIEN_CAPRIEN0_Pos (0) /*!< EPWM_T::CAPIEN: CAPRIEN0 Position */ +#define EPWM_CAPIEN_CAPRIEN0_Msk (0x1ul << EPWM_CAPIEN_CAPRIEN0_Pos) /*!< EPWM_T::CAPIEN: CAPRIEN0 Mask */ + +#define EPWM_CAPIEN_CAPRIEN1_Pos (1) /*!< EPWM_T::CAPIEN: CAPRIEN1 Position */ +#define EPWM_CAPIEN_CAPRIEN1_Msk (0x1ul << EPWM_CAPIEN_CAPRIEN1_Pos) /*!< EPWM_T::CAPIEN: CAPRIEN1 Mask */ + +#define EPWM_CAPIEN_CAPRIEN2_Pos (2) /*!< EPWM_T::CAPIEN: CAPRIEN2 Position */ +#define EPWM_CAPIEN_CAPRIEN2_Msk (0x1ul << EPWM_CAPIEN_CAPRIEN2_Pos) /*!< EPWM_T::CAPIEN: CAPRIEN2 Mask */ + +#define EPWM_CAPIEN_CAPRIEN3_Pos (3) /*!< EPWM_T::CAPIEN: CAPRIEN3 Position */ +#define EPWM_CAPIEN_CAPRIEN3_Msk (0x1ul << EPWM_CAPIEN_CAPRIEN3_Pos) /*!< EPWM_T::CAPIEN: CAPRIEN3 Mask */ + +#define EPWM_CAPIEN_CAPRIEN4_Pos (4) /*!< EPWM_T::CAPIEN: CAPRIEN4 Position */ +#define EPWM_CAPIEN_CAPRIEN4_Msk (0x1ul << EPWM_CAPIEN_CAPRIEN4_Pos) /*!< EPWM_T::CAPIEN: CAPRIEN4 Mask */ + +#define EPWM_CAPIEN_CAPRIEN5_Pos (5) /*!< EPWM_T::CAPIEN: CAPRIEN5 Position */ +#define EPWM_CAPIEN_CAPRIEN5_Msk (0x1ul << EPWM_CAPIEN_CAPRIEN5_Pos) /*!< EPWM_T::CAPIEN: CAPRIEN5 Mask */ + +#define EPWM_CAPIEN_CAPFIEN0_Pos (8) /*!< EPWM_T::CAPIEN: CAPFIEN0 Position */ +#define EPWM_CAPIEN_CAPFIEN0_Msk (0x1ul << EPWM_CAPIEN_CAPFIEN0_Pos) /*!< EPWM_T::CAPIEN: CAPFIEN0 Mask */ + +#define EPWM_CAPIEN_CAPFIEN1_Pos (9) /*!< EPWM_T::CAPIEN: CAPFIEN1 Position */ +#define EPWM_CAPIEN_CAPFIEN1_Msk (0x1ul << EPWM_CAPIEN_CAPFIEN1_Pos) /*!< EPWM_T::CAPIEN: CAPFIEN1 Mask */ + +#define EPWM_CAPIEN_CAPFIEN2_Pos (10) /*!< EPWM_T::CAPIEN: CAPFIEN2 Position */ +#define EPWM_CAPIEN_CAPFIEN2_Msk (0x1ul << EPWM_CAPIEN_CAPFIEN2_Pos) /*!< EPWM_T::CAPIEN: CAPFIEN2 Mask */ + +#define EPWM_CAPIEN_CAPFIEN3_Pos (11) /*!< EPWM_T::CAPIEN: CAPFIEN3 Position */ +#define EPWM_CAPIEN_CAPFIEN3_Msk (0x1ul << EPWM_CAPIEN_CAPFIEN3_Pos) /*!< EPWM_T::CAPIEN: CAPFIEN3 Mask */ + +#define EPWM_CAPIEN_CAPFIEN4_Pos (12) /*!< EPWM_T::CAPIEN: CAPFIEN4 Position */ +#define EPWM_CAPIEN_CAPFIEN4_Msk (0x1ul << EPWM_CAPIEN_CAPFIEN4_Pos) /*!< EPWM_T::CAPIEN: CAPFIEN4 Mask */ + +#define EPWM_CAPIEN_CAPFIEN5_Pos (13) /*!< EPWM_T::CAPIEN: CAPFIEN5 Position */ +#define EPWM_CAPIEN_CAPFIEN5_Msk (0x1ul << EPWM_CAPIEN_CAPFIEN5_Pos) /*!< EPWM_T::CAPIEN: CAPFIEN5 Mask */ + +#define EPWM_CAPIF_CRLIF0_Pos (0) /*!< EPWM_T::CAPIF: CRLIF0 Position */ +#define EPWM_CAPIF_CRLIF0_Msk (0x1ul << EPWM_CAPIF_CRLIF0_Pos) /*!< EPWM_T::CAPIF: CRLIF0 Mask */ + +#define EPWM_CAPIF_CRLIF1_Pos (1) /*!< EPWM_T::CAPIF: CRLIF1 Position */ +#define EPWM_CAPIF_CRLIF1_Msk (0x1ul << EPWM_CAPIF_CRLIF1_Pos) /*!< EPWM_T::CAPIF: CRLIF1 Mask */ + +#define EPWM_CAPIF_CRLIF2_Pos (2) /*!< EPWM_T::CAPIF: CRLIF2 Position */ +#define EPWM_CAPIF_CRLIF2_Msk (0x1ul << EPWM_CAPIF_CRLIF2_Pos) /*!< EPWM_T::CAPIF: CRLIF2 Mask */ + +#define EPWM_CAPIF_CRLIF3_Pos (3) /*!< EPWM_T::CAPIF: CRLIF3 Position */ +#define EPWM_CAPIF_CRLIF3_Msk (0x1ul << EPWM_CAPIF_CRLIF3_Pos) /*!< EPWM_T::CAPIF: CRLIF3 Mask */ + +#define EPWM_CAPIF_CRLIF4_Pos (4) /*!< EPWM_T::CAPIF: CRLIF4 Position */ +#define EPWM_CAPIF_CRLIF4_Msk (0x1ul << EPWM_CAPIF_CRLIF4_Pos) /*!< EPWM_T::CAPIF: CRLIF4 Mask */ + +#define EPWM_CAPIF_CRLIF5_Pos (5) /*!< EPWM_T::CAPIF: CRLIF5 Position */ +#define EPWM_CAPIF_CRLIF5_Msk (0x1ul << EPWM_CAPIF_CRLIF5_Pos) /*!< EPWM_T::CAPIF: CRLIF5 Mask */ + +#define EPWM_CAPIF_CFLIF0_Pos (8) /*!< EPWM_T::CAPIF: CFLIF0 Position */ +#define EPWM_CAPIF_CFLIF0_Msk (0x1ul << EPWM_CAPIF_CFLIF0_Pos) /*!< EPWM_T::CAPIF: CFLIF0 Mask */ + +#define EPWM_CAPIF_CFLIF1_Pos (9) /*!< EPWM_T::CAPIF: CFLIF1 Position */ +#define EPWM_CAPIF_CFLIF1_Msk (0x1ul << EPWM_CAPIF_CFLIF1_Pos) /*!< EPWM_T::CAPIF: CFLIF1 Mask */ + +#define EPWM_CAPIF_CFLIF2_Pos (10) /*!< EPWM_T::CAPIF: CFLIF2 Position */ +#define EPWM_CAPIF_CFLIF2_Msk (0x1ul << EPWM_CAPIF_CFLIF2_Pos) /*!< EPWM_T::CAPIF: CFLIF2 Mask */ + +#define EPWM_CAPIF_CFLIF3_Pos (11) /*!< EPWM_T::CAPIF: CFLIF3 Position */ +#define EPWM_CAPIF_CFLIF3_Msk (0x1ul << EPWM_CAPIF_CFLIF3_Pos) /*!< EPWM_T::CAPIF: CFLIF3 Mask */ + +#define EPWM_CAPIF_CFLIF4_Pos (12) /*!< EPWM_T::CAPIF: CFLIF4 Position */ +#define EPWM_CAPIF_CFLIF4_Msk (0x1ul << EPWM_CAPIF_CFLIF4_Pos) /*!< EPWM_T::CAPIF: CFLIF4 Mask */ + +#define EPWM_CAPIF_CFLIF5_Pos (13) /*!< EPWM_T::CAPIF: CFLIF5 Position */ +#define EPWM_CAPIF_CFLIF5_Msk (0x1ul << EPWM_CAPIF_CFLIF5_Pos) /*!< EPWM_T::CAPIF: CFLIF5 Mask */ + +#define EPWM_PBUF0_PBUF_Pos (0) /*!< EPWM_T::PBUF0: PBUF Position */ +#define EPWM_PBUF0_PBUF_Msk (0xfffful << EPWM_PBUF0_PBUF_Pos) /*!< EPWM_T::PBUF0: PBUF Mask */ + +#define EPWM_PBUF1_PBUF_Pos (0) /*!< EPWM_T::PBUF1: PBUF Position */ +#define EPWM_PBUF1_PBUF_Msk (0xfffful << EPWM_PBUF1_PBUF_Pos) /*!< EPWM_T::PBUF1: PBUF Mask */ + +#define EPWM_PBUF2_PBUF_Pos (0) /*!< EPWM_T::PBUF2: PBUF Position */ +#define EPWM_PBUF2_PBUF_Msk (0xfffful << EPWM_PBUF2_PBUF_Pos) /*!< EPWM_T::PBUF2: PBUF Mask */ + +#define EPWM_PBUF3_PBUF_Pos (0) /*!< EPWM_T::PBUF3: PBUF Position */ +#define EPWM_PBUF3_PBUF_Msk (0xfffful << EPWM_PBUF3_PBUF_Pos) /*!< EPWM_T::PBUF3: PBUF Mask */ + +#define EPWM_PBUF4_PBUF_Pos (0) /*!< EPWM_T::PBUF4: PBUF Position */ +#define EPWM_PBUF4_PBUF_Msk (0xfffful << EPWM_PBUF4_PBUF_Pos) /*!< EPWM_T::PBUF4: PBUF Mask */ + +#define EPWM_PBUF5_PBUF_Pos (0) /*!< EPWM_T::PBUF5: PBUF Position */ +#define EPWM_PBUF5_PBUF_Msk (0xfffful << EPWM_PBUF5_PBUF_Pos) /*!< EPWM_T::PBUF5: PBUF Mask */ + +#define EPWM_CMPBUF0_CMPBUF_Pos (0) /*!< EPWM_T::CMPBUF0: CMPBUF Position */ +#define EPWM_CMPBUF0_CMPBUF_Msk (0xfffful << EPWM_CMPBUF0_CMPBUF_Pos) /*!< EPWM_T::CMPBUF0: CMPBUF Mask */ + +#define EPWM_CMPBUF1_CMPBUF_Pos (0) /*!< EPWM_T::CMPBUF1: CMPBUF Position */ +#define EPWM_CMPBUF1_CMPBUF_Msk (0xfffful << EPWM_CMPBUF1_CMPBUF_Pos) /*!< EPWM_T::CMPBUF1: CMPBUF Mask */ + +#define EPWM_CMPBUF2_CMPBUF_Pos (0) /*!< EPWM_T::CMPBUF2: CMPBUF Position */ +#define EPWM_CMPBUF2_CMPBUF_Msk (0xfffful << EPWM_CMPBUF2_CMPBUF_Pos) /*!< EPWM_T::CMPBUF2: CMPBUF Mask */ + +#define EPWM_CMPBUF3_CMPBUF_Pos (0) /*!< EPWM_T::CMPBUF3: CMPBUF Position */ +#define EPWM_CMPBUF3_CMPBUF_Msk (0xfffful << EPWM_CMPBUF3_CMPBUF_Pos) /*!< EPWM_T::CMPBUF3: CMPBUF Mask */ + +#define EPWM_CMPBUF4_CMPBUF_Pos (0) /*!< EPWM_T::CMPBUF4: CMPBUF Position */ +#define EPWM_CMPBUF4_CMPBUF_Msk (0xfffful << EPWM_CMPBUF4_CMPBUF_Pos) /*!< EPWM_T::CMPBUF4: CMPBUF Mask */ + +#define EPWM_CMPBUF5_CMPBUF_Pos (0) /*!< EPWM_T::CMPBUF5: CMPBUF Position */ +#define EPWM_CMPBUF5_CMPBUF_Msk (0xfffful << EPWM_CMPBUF5_CMPBUF_Pos) /*!< EPWM_T::CMPBUF5: CMPBUF Mask */ + +#define EPWM_CPSCBUF0_1_CPSCBUF_Pos (0) /*!< EPWM_T::CPSCBUF0_1: CPSCBUF Position */ +#define EPWM_CPSCBUF0_1_CPSCBUF_Msk (0xffful << EPWM_CPSCBUF0_1_CPSCBUF_Pos) /*!< EPWM_T::CPSCBUF0_1: CPSCBUF Mask */ + +#define EPWM_CPSCBUF2_3_CPSCBUF_Pos (0) /*!< EPWM_T::CPSCBUF2_3: CPSCBUF Position */ +#define EPWM_CPSCBUF2_3_CPSCBUF_Msk (0xffful << EPWM_CPSCBUF2_3_CPSCBUF_Pos) /*!< EPWM_T::CPSCBUF2_3: CPSCBUF Mask */ + +#define EPWM_CPSCBUF4_5_CPSCBUF_Pos (0) /*!< EPWM_T::CPSCBUF4_5: CPSCBUF Position */ +#define EPWM_CPSCBUF4_5_CPSCBUF_Msk (0xffful << EPWM_CPSCBUF4_5_CPSCBUF_Pos) /*!< EPWM_T::CPSCBUF4_5: CPSCBUF Mask */ + +#define EPWM_FTCBUF0_1_FTCMPBUF_Pos (0) /*!< EPWM_T::FTCBUF0_1: FTCMPBUF Position */ +#define EPWM_FTCBUF0_1_FTCMPBUF_Msk (0xfffful << EPWM_FTCBUF0_1_FTCMPBUF_Pos) /*!< EPWM_T::FTCBUF0_1: FTCMPBUF Mask */ + +#define EPWM_FTCBUF2_3_FTCMPBUF_Pos (0) /*!< EPWM_T::FTCBUF2_3: FTCMPBUF Position */ +#define EPWM_FTCBUF2_3_FTCMPBUF_Msk (0xfffful << EPWM_FTCBUF2_3_FTCMPBUF_Pos) /*!< EPWM_T::FTCBUF2_3: FTCMPBUF Mask */ + +#define EPWM_FTCBUF4_5_FTCMPBUF_Pos (0) /*!< EPWM_T::FTCBUF4_5: FTCMPBUF Position */ +#define EPWM_FTCBUF4_5_FTCMPBUF_Msk (0xfffful << EPWM_FTCBUF4_5_FTCMPBUF_Pos) /*!< EPWM_T::FTCBUF4_5: FTCMPBUF Mask */ + +#define EPWM_FTCI_FTCMU0_Pos (0) /*!< EPWM_T::FTCI: FTCMU0 Position */ +#define EPWM_FTCI_FTCMU0_Msk (0x1ul << EPWM_FTCI_FTCMU0_Pos) /*!< EPWM_T::FTCI: FTCMU0 Mask */ + +#define EPWM_FTCI_FTCMU2_Pos (1) /*!< EPWM_T::FTCI: FTCMU2 Position */ +#define EPWM_FTCI_FTCMU2_Msk (0x1ul << EPWM_FTCI_FTCMU2_Pos) /*!< EPWM_T::FTCI: FTCMU2 Mask */ + +#define EPWM_FTCI_FTCMU4_Pos (2) /*!< EPWM_T::FTCI: FTCMU4 Position */ +#define EPWM_FTCI_FTCMU4_Msk (0x1ul << EPWM_FTCI_FTCMU4_Pos) /*!< EPWM_T::FTCI: FTCMU4 Mask */ + +#define EPWM_FTCI_FTCMD0_Pos (8) /*!< EPWM_T::FTCI: FTCMD0 Position */ +#define EPWM_FTCI_FTCMD0_Msk (0x1ul << EPWM_FTCI_FTCMD0_Pos) /*!< EPWM_T::FTCI: FTCMD0 Mask */ + +#define EPWM_FTCI_FTCMD2_Pos (9) /*!< EPWM_T::FTCI: FTCMD2 Position */ +#define EPWM_FTCI_FTCMD2_Msk (0x1ul << EPWM_FTCI_FTCMD2_Pos) /*!< EPWM_T::FTCI: FTCMD2 Mask */ + +#define EPWM_FTCI_FTCMD4_Pos (10) /*!< EPWM_T::FTCI: FTCMD4 Position */ +#define EPWM_FTCI_FTCMD4_Msk (0x1ul << EPWM_FTCI_FTCMD4_Pos) /*!< EPWM_T::FTCI: FTCMD4 Mask */ + +/**@}*/ /* EPWM_CONST */ +/**@}*/ /* end of EPWM register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __EPWM_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/gfx_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/gfx_reg.h new file mode 100644 index 0000000000..f042e3524b --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/gfx_reg.h @@ -0,0 +1,382 @@ +/**************************************************************************//** + * @file gfx_reg.h + * @brief GFX register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __GFX_REG_H__ +#define __GFX_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup GFX 2D Graphic Engine (GFX) + Memory Mapped Structure for GFX Controller +@{ */ + +typedef struct +{ + + + /** + * @var GFX_T::AQHiClockControl + * Offset: 0x00 Clock control register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CLK3D_DIS |Disable 3D clock + * | | |Software core clock disable signal for core (clk1x) clock. + * | | |When set to 1, the clock is frozen. + * |[1] |CLK2D_DIS |Disable 2D clock + * | | |Software clock disable signal. + * | | |For this core both bits CLK3D_DIS and CLK2D_DIS should be controlled by software. + * | | |The AXI interface clock is the only block not stalled at that point. + * |[8:2] |FSCALE_VAL|Core clock frequency scale value + * | | |If this value is set to 1, the core clock will be 1/64 of clk1x, otherwise clock is fully frequency + * |[9] |FSCALE_CMD_LOAD|Core clock frequency scale value + * | | |When writing a 1 to this bit, it updates the frequency scale factor with the value FSCALE_VAL. + * | | |The bit must be set back to 0 after that. + * | | |If this bit is set and FSCALE_VAL=0 (an invalid combination), the HREADYOUT output signal will get stuck to 0. + * |[10] |DISABLE_RAM_CLOCK_GATING|Disables clock gating for rams. + * |[12] |SOFT_RESET|Soft resets the GFX. + * |[17] |IDLE2_D |2D pipe is idle. + * |[19] |ISOLATE_GPU|Isolate GPU bit + * | | |Used for power on/off sequence. + * @var GFX_T::AQHiIdle + * Offset: 0x04 Idle status register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |IDLE_FE |FE is idle. + * |[1] |IDLE_DE |DE is idle. + * |[2] |IDLE_PE |PE is idle. + * |[31] |AXI_LP |AXI is in low power mode. + * @var GFX_T::AQAxiConfig + * Offset: 0x08 AXI configuration register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:8] |AWCACHE |Set AWCACHE[3:0] value + * |[15:12] |ARCACHE |Set ARCACHE[3:0] value + * |[17:16] |AXDOMAIN_SHARED|Configure AxDOMAIN value for shareable request. + * |[19:18] |AXDOMAIN_NON_SHARED|Configure AxDOMAIN value for non-shareable request. + * |[23:20] |AXCACHE_OVERRIDE_SHARED|Configure AxCACHE value for shareable request. + * @var GFX_T::AQAxiStatus + * Offset: 0x0C AXI status register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |WR_ERR_ID |Write error ID + * |[7:4] |RD_ERR_ID |Read error ID + * |[8] |DET_WR_ERR|1 = Detect write error + * |[9] |DET_RD_ERR|1 = Detect read error + * @var GFX_T::AQIntrAcknowledge + * Offset: 0x10 Interrupt acknowledge register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |INTR_VEC |Interrupt Vector + * | | |Each bit represents a corresponding event being triggered. + * | | |Reading from this register clears the outstanding interrupt. + * | | |For each interrupt event, 0=Clear, 1=Interrupt Active. + * | | |INTR_VEC[31] is AXI_BUS_ERROR, 0 = No Error. + * @var GFX_T::AQIntrEnbl + * Offset: 0x14 Interrupt enable register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |INTR_ENBL_VEC|Interrupt enable + * | | |Each bit enables a corresponding event. + * @var GFX_T::GCChipRev + * Offset: 0x24 Revision register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |REV |Revision + * @var GFX_T::GCChipDate + * Offset: 0x28 Release date register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATE |Date (YYYY/MM/DD) + * @var GFX_T::gcTotalCycles + * Offset: 0x78 Total cycles register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CYCLES |Total cycles + * | | |This register is a free running counter. + * | | |It can be reset by writing 0 to it. + * @var GFX_T::gcregHIChipPatchRev + * Offset: 0x98 Patch revision level register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |PATCH_REV |Patch revision level for the chip. + * @var GFX_T::gcProductId + * Offset: 0xA8 Product ID register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |GRADE_LEVEL|Grade Level + * | | |0 = None-no extra letter on the product name;. + * | | |2 = L-Lite. + * | | |3 = UL-Ultra Lite. + * |[23:4] |NUM |Product Number + * | | |520 for this core. + * |[27:24] |TYPE |Core Type + * | | |0 = GC (2D or 3D Graphics Cores). + * @var GFX_T::gcModulePowerControls + * Offset: 0x100 Control register for module level power + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ENABLE_MODULE_CLOCK_GATING|Enables module level clock gating. + * |[1] |DISABLE_STALL_MODULE_CLOCK_GATING|Disables module level clock gating for stall condition. + * |[2] |DISABLE_STARVE_MODULE_CLOCK_GATING|Disables module level clock gating for starve/idle condition. + * @var GFX_T::gcregMMUControl + * Offset: 0x18C MMU Control register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ENABLE |Enable the MMU + * | | |For security reasons, once the MMU is enabled it cannot be disabled anymore. + * | | |1 = enable. + * @var GFX_T::AQMemoryDebug + * Offset: 0x414 Memory debug register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |MAX_OUTSTANDING_READS|Limits the total number of outstanding read requests. + * @var GFX_T::AQRegisterTImingControl + * Offset: 0x42C SRAM timing control register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |FOR_RF1P |For 1 port RAM + * |[15:8] |FOR_RF2P |For 2 port RAM + * |[17:16] |FAST_RTC |RTC for fast RAMs + * |[19:18] |FAST_WTC |WTC for fast RAMs + * |[20] |POWER_DOW |Power down + * |[21] |DEEP_SLEEP|Deep sleep + * |[22] |LIGHT_SLEEP|Light sleep + * @var GFX_T::AQCmdBufferAddr + * Offset: 0x654 Command buffer base address register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ADDRESS |Base address for the command buffer + * | | |The address must be 64-bit alignment and it is always physical. + * | | |To check the value of the current fetch address use AQFEDebugCurCmdAdr register. + * | | |Since this is a write only register is has no reset value. + * @var GFX_T::AQCmdBufferCtrl + * Offset: 0x658 Command buffer control register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PREFETCH |Prefetch (write only) + * | | |Number of 64-bit words to fetch from the command buffer. + * |[16] |ENABLE |Enable + * | | |Enable the command parser. + * @var GFX_T::AQFEDebugCurCmdAdr + * Offset: 0x664 Command decoder address register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:4] |CUR_CMD_ADR|This is the command decoder address + * | | |The address is always physical so the MSB should always be 0. + * | | |Note that with the current MMU all 32 bits are valid. + * | | |It has no reset value. + */ + __IO uint32_t AQHiClockControl; /*!< [0x0000] Clock control register */ + __I uint32_t AQHiIdle; /*!< [0x0004] Idle status register */ + __IO uint32_t AQAxiConfig; /*!< [0x0008] AXI configuration register */ + __I uint32_t AQAxiStatus; /*!< [0x000c] AXI status register */ + __I uint32_t AQIntrAcknowledge; /*!< [0x0010] Interrupt acknowledge register */ + __IO uint32_t AQIntrEnbl; /*!< [0x0014] Interrupt enable register */ + __I uint32_t RESERVE0[3]; + __I uint32_t GCChipRev; /*!< [0x0024] Revision register */ + __I uint32_t GCChipDate; /*!< [0x0028] Release date register */ + __I uint32_t RESERVE1[19]; + __IO uint32_t gcTotalCycles; /*!< [0x0078] Total cycles register */ + __I uint32_t RESERVE2[7]; + __I uint32_t gcregHIChipPatchRev; /*!< [0x0098] Patch revision level register */ + __I uint32_t RESERVE3[3]; + __I uint32_t gcProductId; /*!< [0x00a8] Product ID register */ + __I uint32_t RESERVE4[21]; + __IO uint32_t gcModulePowerControls; /*!< [0x0100] Control register for module level power */ + __I uint32_t RESERVE5[34]; + __O uint32_t gcregMMUControl; /*!< [0x018c] MMU Control register */ + __I uint32_t RESERVE6[161]; + __IO uint32_t AQMemoryDebug; /*!< [0x0414] Memory debug register */ + __I uint32_t RESERVE7[5]; + __IO uint32_t AQRegisterTImingControl; /*!< [0x042c] SRAM timing control register */ + __I uint32_t RESERVE8[137]; + __O uint32_t AQCmdBufferAddr; /*!< [0x0654] Command buffer base address register */ + __IO uint32_t AQCmdBufferCtrl; /*!< [0x0658] Command buffer control register */ + __I uint32_t RESERVE9[2]; + __I uint32_t AQFEDebugCurCmdAdr; /*!< [0x0664] Command decoder address register */ + +} GFX_T; + +/** + @addtogroup GFX_CONST GFX Bit Field Definition + Constant Definitions for GFX Controller +@{ */ + +#define GFX_AQHiClockControl_CLK3D_DIS_Pos (0) /*!< GFX_T::AQHiClockControl: CLK3D_DIS Position*/ +#define GFX_AQHiClockControl_CLK3D_DIS_Msk (0x1ul << GFX_AQHiClockControl_CLK3D_DIS_Pos) /*!< GFX_T::AQHiClockControl: CLK3D_DIS Mask*/ + +#define GFX_AQHiClockControl_CLK2D_DIS_Pos (1) /*!< GFX_T::AQHiClockControl: CLK2D_DIS Position*/ +#define GFX_AQHiClockControl_CLK2D_DIS_Msk (0x1ul << GFX_AQHiClockControl_CLK2D_DIS_Pos) /*!< GFX_T::AQHiClockControl: CLK2D_DIS Mask*/ + +#define GFX_AQHiClockControl_FSCALE_VAL_Pos (2) /*!< GFX_T::AQHiClockControl: FSCALE_VAL Position*/ +#define GFX_AQHiClockControl_FSCALE_VAL_Msk (0x7ful << GFX_AQHiClockControl_FSCALE_VAL_Pos) /*!< GFX_T::AQHiClockControl: FSCALE_VAL Mask*/ + +#define GFX_AQHiClockControl_FSCALE_CMD_LOAD_Pos (9) /*!< GFX_T::AQHiClockControl: FSCALE_CMD_LOAD Position*/ +#define GFX_AQHiClockControl_FSCALE_CMD_LOAD_Msk (0x1ul << GFX_AQHiClockControl_FSCALE_CMD_LOAD_Pos) /*!< GFX_T::AQHiClockControl: FSCALE_CMD_LOAD Mask*/ + +#define GFX_AQHiClockControl_DISABLE_RAM_CLOCK_GATING_Pos (10) /*!< GFX_T::AQHiClockControl: DISABLE_RAM_CLOCK_GATING Position*/ +#define GFX_AQHiClockControl_DISABLE_RAM_CLOCK_GATING_Msk (0x1ul << GFX_AQHiClockControl_DISABLE_RAM_CLOCK_GATING_Pos) /*!< GFX_T::AQHiClockControl: DISABLE_RAM_CLOCK_GATING Mask*/ + +#define GFX_AQHiClockControl_SOFT_RESET_Pos (12) /*!< GFX_T::AQHiClockControl: SOFT_RESET Position*/ +#define GFX_AQHiClockControl_SOFT_RESET_Msk (0x1ul << GFX_AQHiClockControl_SOFT_RESET_Pos) /*!< GFX_T::AQHiClockControl: SOFT_RESET Mask*/ + +#define GFX_AQHiClockControl_IDLE2_D_Pos (17) /*!< GFX_T::AQHiClockControl: IDLE2_D Position*/ +#define GFX_AQHiClockControl_IDLE2_D_Msk (0x1ul << GFX_AQHiClockControl_IDLE2_D_Pos) /*!< GFX_T::AQHiClockControl: IDLE2_D Mask */ + +#define GFX_AQHiClockControl_ISOLATE_GPU_Pos (19) /*!< GFX_T::AQHiClockControl: ISOLATE_GPU Position*/ +#define GFX_AQHiClockControl_ISOLATE_GPU_Msk (0x1ul << GFX_AQHiClockControl_ISOLATE_GPU_Pos) /*!< GFX_T::AQHiClockControl: ISOLATE_GPU Mask*/ + +#define GFX_AQHiIdle_IDLE_FE_Pos (0) /*!< GFX_T::AQHiIdle: IDLE_FE Position */ +#define GFX_AQHiIdle_IDLE_FE_Msk (0x1ul << GFX_AQHiIdle_IDLE_FE_Pos) /*!< GFX_T::AQHiIdle: IDLE_FE Mask */ + +#define GFX_AQHiIdle_IDLE_DE_Pos (1) /*!< GFX_T::AQHiIdle: IDLE_DE Position */ +#define GFX_AQHiIdle_IDLE_DE_Msk (0x1ul << GFX_AQHiIdle_IDLE_DE_Pos) /*!< GFX_T::AQHiIdle: IDLE_DE Mask */ + +#define GFX_AQHiIdle_IDLE_PE_Pos (2) /*!< GFX_T::AQHiIdle: IDLE_PE Position */ +#define GFX_AQHiIdle_IDLE_PE_Msk (0x1ul << GFX_AQHiIdle_IDLE_PE_Pos) /*!< GFX_T::AQHiIdle: IDLE_PE Mask */ + +#define GFX_AQHiIdle_AXI_LP_Pos (31) /*!< GFX_T::AQHiIdle: AXI_LP Position */ +#define GFX_AQHiIdle_AXI_LP_Msk (0x1ul << GFX_AQHiIdle_AXI_LP_Pos) /*!< GFX_T::AQHiIdle: AXI_LP Mask */ + +#define GFX_AQAxiConfig_AWCACHE_Pos (8) /*!< GFX_T::AQAxiConfig: AWCACHE Position */ +#define GFX_AQAxiConfig_AWCACHE_Msk (0xful << GFX_AQAxiConfig_AWCACHE_Pos) /*!< GFX_T::AQAxiConfig: AWCACHE Mask */ + +#define GFX_AQAxiConfig_ARCACHE_Pos (12) /*!< GFX_T::AQAxiConfig: ARCACHE Position */ +#define GFX_AQAxiConfig_ARCACHE_Msk (0xful << GFX_AQAxiConfig_ARCACHE_Pos) /*!< GFX_T::AQAxiConfig: ARCACHE Mask */ + +#define GFX_AQAxiConfig_AXDOMAIN_SHARED_Pos (16) /*!< GFX_T::AQAxiConfig: AXDOMAIN_SHARED Position*/ +#define GFX_AQAxiConfig_AXDOMAIN_SHARED_Msk (0x3ul << GFX_AQAxiConfig_AXDOMAIN_SHARED_Pos) /*!< GFX_T::AQAxiConfig: AXDOMAIN_SHARED Mask*/ + +#define GFX_AQAxiConfig_AXDOMAIN_NON_SHARED_Pos (18) /*!< GFX_T::AQAxiConfig: AXDOMAIN_NON_SHARED Position*/ +#define GFX_AQAxiConfig_AXDOMAIN_NON_SHARED_Msk (0x3ul << GFX_AQAxiConfig_AXDOMAIN_NON_SHARED_Pos) /*!< GFX_T::AQAxiConfig: AXDOMAIN_NON_SHARED Mask*/ + +#define GFX_AQAxiConfig_AXCACHE_OVERRIDE_SHARED_Pos (20) /*!< GFX_T::AQAxiConfig: AXCACHE_OVERRIDE_SHARED Position*/ +#define GFX_AQAxiConfig_AXCACHE_OVERRIDE_SHARED_Msk (0xful << GFX_AQAxiConfig_AXCACHE_OVERRIDE_SHARED_Pos) /*!< GFX_T::AQAxiConfig: AXCACHE_OVERRIDE_SHARED Mask*/ + +#define GFX_AQAxiStatus_WR_ERR_ID_Pos (0) /*!< GFX_T::AQAxiStatus: WR_ERR_ID Position */ +#define GFX_AQAxiStatus_WR_ERR_ID_Msk (0xful << GFX_AQAxiStatus_WR_ERR_ID_Pos) /*!< GFX_T::AQAxiStatus: WR_ERR_ID Mask */ + +#define GFX_AQAxiStatus_RD_ERR_ID_Pos (4) /*!< GFX_T::AQAxiStatus: RD_ERR_ID Position */ +#define GFX_AQAxiStatus_RD_ERR_ID_Msk (0xful << GFX_AQAxiStatus_RD_ERR_ID_Pos) /*!< GFX_T::AQAxiStatus: RD_ERR_ID Mask */ + +#define GFX_AQAxiStatus_DET_WR_ERR_Pos (8) /*!< GFX_T::AQAxiStatus: DET_WR_ERR Position*/ +#define GFX_AQAxiStatus_DET_WR_ERR_Msk (0x1ul << GFX_AQAxiStatus_DET_WR_ERR_Pos) /*!< GFX_T::AQAxiStatus: DET_WR_ERR Mask */ + +#define GFX_AQAxiStatus_DET_RD_ERR_Pos (9) /*!< GFX_T::AQAxiStatus: DET_RD_ERR Position*/ +#define GFX_AQAxiStatus_DET_RD_ERR_Msk (0x1ul << GFX_AQAxiStatus_DET_RD_ERR_Pos) /*!< GFX_T::AQAxiStatus: DET_RD_ERR Mask */ + +#define GFX_AQIntrAcknowledge_INTR_VEC_Pos (0) /*!< GFX_T::AQIntrAcknowledge: INTR_VEC Position*/ +#define GFX_AQIntrAcknowledge_INTR_VEC_Msk (0xfffffffful << GFX_AQIntrAcknowledge_INTR_VEC_Pos) /*!< GFX_T::AQIntrAcknowledge: INTR_VEC Mask*/ + +#define GFX_AQIntrEnbl_INTR_ENBL_VEC_Pos (0) /*!< GFX_T::AQIntrEnbl: INTR_ENBL_VEC Position*/ +#define GFX_AQIntrEnbl_INTR_ENBL_VEC_Msk (0xfffffffful << GFX_AQIntrEnbl_INTR_ENBL_VEC_Pos) /*!< GFX_T::AQIntrEnbl: INTR_ENBL_VEC Mask */ + +#define GFX_GCChipRev_REV_Pos (0) /*!< GFX_T::GCChipRev: REV Position */ +#define GFX_GCChipRev_REV_Msk (0xfffffffful << GFX_GCChipRev_REV_Pos) /*!< GFX_T::GCChipRev: REV Mask */ + +#define GFX_GCChipDate_DATE_Pos (0) /*!< GFX_T::GCChipDate: DATE Position */ +#define GFX_GCChipDate_DATE_Msk (0xfffffffful << GFX_GCChipDate_DATE_Pos) /*!< GFX_T::GCChipDate: DATE Mask */ + +#define GFX_gcTotalCycles_CYCLES_Pos (0) /*!< GFX_T::gcTotalCycles: CYCLES Position */ +#define GFX_gcTotalCycles_CYCLES_Msk (0xfffffffful << GFX_gcTotalCycles_CYCLES_Pos) /*!< GFX_T::gcTotalCycles: CYCLES Mask */ + +#define GFX_gcregHIChipPatchRev_PATCH_REV_Pos (0) /*!< GFX_T::gcregHIChipPatchRev: PATCH_REV Position*/ +#define GFX_gcregHIChipPatchRev_PATCH_REV_Msk (0xfful << GFX_gcregHIChipPatchRev_PATCH_REV_Pos) /*!< GFX_T::gcregHIChipPatchRev: PATCH_REV Mask*/ + +#define GFX_gcProductId_GRADE_LEVEL_Pos (0) /*!< GFX_T::gcProductId: GRADE_LEVEL Position*/ +#define GFX_gcProductId_GRADE_LEVEL_Msk (0xful << GFX_gcProductId_GRADE_LEVEL_Pos) /*!< GFX_T::gcProductId: GRADE_LEVEL Mask */ + +#define GFX_gcProductId_NUM_Pos (4) /*!< GFX_T::gcProductId: NUM Position */ +#define GFX_gcProductId_NUM_Msk (0xffffful << GFX_gcProductId_NUM_Pos) /*!< GFX_T::gcProductId: NUM Mask */ + +#define GFX_gcProductId_TYPE_Pos (24) /*!< GFX_T::gcProductId: TYPE Position */ +#define GFX_gcProductId_TYPE_Msk (0xful << GFX_gcProductId_TYPE_Pos) /*!< GFX_T::gcProductId: TYPE Mask */ + +#define GFX_gcModulePowerControls_ENABLE_MODULE_CLOCK_GATING_Pos (0) /*!< GFX_T::gcModulePowerControls: ENABLE_MODULE_CLOCK_GATING Position*/ +#define GFX_gcModulePowerControls_ENABLE_MODULE_CLOCK_GATING_Msk (0x1ul << GFX_gcModulePowerControls_ENABLE_MODULE_CLOCK_GATING_Pos) /*!< GFX_T::gcModulePowerControls: ENABLE_MODULE_CLOCK_GATING Mask*/ + +#define GFX_gcModulePowerControls_DISABLE_STALL_MODULE_CLOCK_GATING_Pos (1) /*!< GFX_T::gcModulePowerControls: DISABLE_STALL_MODULE_CLOCK_GATING Position*/ +#define GFX_gcModulePowerControls_DISABLE_STALL_MODULE_CLOCK_GATING_Msk (0x1ul << GFX_gcModulePowerControls_DISABLE_STALL_MODULE_CLOCK_GATING_Pos) /*!< GFX_T::gcModulePowerControls: DISABLE_STALL_MODULE_CLOCK_GATING Mask*/ + +#define GFX_gcModulePowerControls_DISABLE_STARVE_MODULE_CLOCK_GATING_Pos (2) /*!< GFX_T::gcModulePowerControls: DISABLE_STARVE_MODULE_CLOCK_GATING Position*/ +#define GFX_gcModulePowerControls_DISABLE_STARVE_MODULE_CLOCK_GATING_Msk (0x1ul << GFX_gcModulePowerControls_DISABLE_STARVE_MODULE_CLOCK_GATING_Pos) /*!< GFX_T::gcModulePowerControls: DISABLE_STARVE_MODULE_CLOCK_GATING Mask*/ + +#define GFX_gcregMMUControl_ENABLE_Pos (0) /*!< GFX_T::gcregMMUControl: ENABLE Position*/ +#define GFX_gcregMMUControl_ENABLE_Msk (0x1ul << GFX_gcregMMUControl_ENABLE_Pos) /*!< GFX_T::gcregMMUControl: ENABLE Mask */ + +#define GFX_AQMemoryDebug_MAX_OUTSTANDING_READS_Pos (0) /*!< GFX_T::AQMemoryDebug: MAX_OUTSTANDING_READS Position*/ +#define GFX_AQMemoryDebug_MAX_OUTSTANDING_READS_Msk (0xfful << GFX_AQMemoryDebug_MAX_OUTSTANDING_READS_Pos) /*!< GFX_T::AQMemoryDebug: MAX_OUTSTANDING_READS Mask*/ + +#define GFX_AQRegisterTImingControl_FOR_RF1P_Pos (0) /*!< GFX_T::AQRegisterTImingControl: FOR_RF1P Position*/ +#define GFX_AQRegisterTImingControl_FOR_RF1P_Msk (0xfful << GFX_AQRegisterTImingControl_FOR_RF1P_Pos) /*!< GFX_T::AQRegisterTImingControl: FOR_RF1P Mask*/ + +#define GFX_AQRegisterTImingControl_FOR_RF2P_Pos (8) /*!< GFX_T::AQRegisterTImingControl: FOR_RF2P Position*/ +#define GFX_AQRegisterTImingControl_FOR_RF2P_Msk (0xfful << GFX_AQRegisterTImingControl_FOR_RF2P_Pos) /*!< GFX_T::AQRegisterTImingControl: FOR_RF2P Mask*/ + +#define GFX_AQRegisterTImingControl_FAST_RTC_Pos (16) /*!< GFX_T::AQRegisterTImingControl: FAST_RTC Position*/ +#define GFX_AQRegisterTImingControl_FAST_RTC_Msk (0x3ul << GFX_AQRegisterTImingControl_FAST_RTC_Pos) /*!< GFX_T::AQRegisterTImingControl: FAST_RTC Mask*/ + +#define GFX_AQRegisterTImingControl_FAST_WTC_Pos (18) /*!< GFX_T::AQRegisterTImingControl: FAST_WTC Position*/ +#define GFX_AQRegisterTImingControl_FAST_WTC_Msk (0x3ul << GFX_AQRegisterTImingControl_FAST_WTC_Pos) /*!< GFX_T::AQRegisterTImingControl: FAST_WTC Mask*/ + +#define GFX_AQRegisterTImingControl_POWER_DOW_Pos (20) /*!< GFX_T::AQRegisterTImingControl: POWER_DOW Position*/ +#define GFX_AQRegisterTImingControl_POWER_DOW_Msk (0x1ul << GFX_AQRegisterTImingControl_POWER_DOW_Pos) /*!< GFX_T::AQRegisterTImingControl: POWER_DOW Mask*/ + +#define GFX_AQRegisterTImingControl_DEEP_SLEEP_Pos (21) /*!< GFX_T::AQRegisterTImingControl: DEEP_SLEEP Position*/ +#define GFX_AQRegisterTImingControl_DEEP_SLEEP_Msk (0x1ul << GFX_AQRegisterTImingControl_DEEP_SLEEP_Pos) /*!< GFX_T::AQRegisterTImingControl: DEEP_SLEEP Mask*/ + +#define GFX_AQRegisterTImingControl_LIGHT_SLEEP_Pos (22) /*!< GFX_T::AQRegisterTImingControl: LIGHT_SLEEP Position*/ +#define GFX_AQRegisterTImingControl_LIGHT_SLEEP_Msk (0x1ul << GFX_AQRegisterTImingControl_LIGHT_SLEEP_Pos) /*!< GFX_T::AQRegisterTImingControl: LIGHT_SLEEP Mask*/ + +#define GFX_AQCmdBufferAddr_ADDRESS_Pos (0) /*!< GFX_T::AQCmdBufferAddr: ADDRESS Position*/ +#define GFX_AQCmdBufferAddr_ADDRESS_Msk (0xfffffffful << GFX_AQCmdBufferAddr_ADDRESS_Pos) /*!< GFX_T::AQCmdBufferAddr: ADDRESS Mask */ + +#define GFX_AQCmdBufferCtrl_PREFETCH_Pos (0) /*!< GFX_T::AQCmdBufferCtrl: PREFETCH Position*/ +#define GFX_AQCmdBufferCtrl_PREFETCH_Msk (0xfffful << GFX_AQCmdBufferCtrl_PREFETCH_Pos) /*!< GFX_T::AQCmdBufferCtrl: PREFETCH Mask */ + +#define GFX_AQCmdBufferCtrl_ENABLE_Pos (16) /*!< GFX_T::AQCmdBufferCtrl: ENABLE Position*/ +#define GFX_AQCmdBufferCtrl_ENABLE_Msk (0x1ul << GFX_AQCmdBufferCtrl_ENABLE_Pos) /*!< GFX_T::AQCmdBufferCtrl: ENABLE Mask */ + +#define GFX_AQFEDebugCurCmdAdr_CUR_CMD_ADR_Pos (4) /*!< GFX_T::AQFEDebugCurCmdAdr: CUR_CMD_ADR Position*/ +#define GFX_AQFEDebugCurCmdAdr_CUR_CMD_ADR_Msk (0xffffffful << GFX_AQFEDebugCurCmdAdr_CUR_CMD_ADR_Pos) /*!< GFX_T::AQFEDebugCurCmdAdr: CUR_CMD_ADR Mask*/ + +/**@}*/ /* GFX_CONST */ +/**@}*/ /* end of GFX register group */ + +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __GFX_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/gmac_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/gmac_reg.h new file mode 100644 index 0000000000..c307da4635 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/gmac_reg.h @@ -0,0 +1,2606 @@ +/**************************************************************************//** + * @file gmac_reg.h + * @brief GMAC register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __GAMAC_REG_H__ +#define __GMAC_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ +/** + @addtogroup GMAC Gigabit Ethernet MAC (GMAC) + Memory Mapped Structure for GMAC Controller +@{ */ + +typedef struct +{ + + /** + * @var GMAC_T::MACCFG + * Offset: 0x00 Register 0 (MAC Configuration Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PRELEN |Preamble Length for Transmit Frames + * | | |These bits control the number of preamble bytes that are added to the beginning of every Transmit frame + * | | |The preamble reduction occurs only when the MAC is operating in the full-duplex mode. + * | | |2'b00: 7 bytes of preamble + * | | |2'b01: 5 byte of preamble + * | | |2'b10: 3 bytes of preamble + * | | |2'b11: reserved + * |[2] |RE |Receiver Enable + * | | |When this bit is set, the receiver state machine of the MAC is enabled for receiving frames from the GMII or MII + * | | |When this bit is reset, the MAC receive state machine is disabled after the completion of the reception of the current frame, and does not receive any further frames from the GMII or MII. + * |[3] |TE |Transmitter Enable + * | | |When this bit is set, the transmit state machine of the MAC is enabled for transmission on the GMII or MII + * | | |When this bit is reset, the MAC transmit state machine is disabled after the completion of the transmission of the current frame, and does not transmit any further frames. + * |[4] |DC |Deferral Check + * | | |When this bit is set, the deferral check function is enabled in the MAC + * | | |The MAC issues a Frame Abort status, along with the excessive deferral error bit set in the transmit frame status, when the transmit state machine is deferred for more than 24,288 bit times in the 10 or 100 Mbps mode. + * | | |If the MAC is configured for 1000 Mbps operation or if the Jumbo frame mode is enabled in the 10 or 100 Mbps mode, the threshold for deferral is 155,680 bits times + * | | |Deferral begins when the transmitter is ready to transmit, but it is prevented because of an active carrier sense signal (CRS) on GMII or MII. + * | | |The defer time is not cumulative + * | | |For example, if the transmitter defers for 10,000 bit times because the CRS signal is active and then the CRS signal becomes inactive, the transmitter transmits and collision happens + * | | |Because of collision, the transmitter needs to back off and then defer again after back off completion + * | | |In such a scenario, the deferral timer is reset to 0 and it is restarted + * | | |When this bit is reset, the deferral check function is disabled and the MAC defers until the CRS signal goes inactive + * | | |This bit is applicable only in the half-duplex mode. + * |[6:5] |BL |Back-Off Limit + * | | |The Back-Off limit determines the random integer number (r) of slot time delays (4,096 bit times for 1000 Mbps and 512 bit times for 10/100 Mbps) for which the MAC waits before rescheduling a transmission attempt during retries after a collision + * | | |This bit is applicable only in the half-duplex mode. + * | | |00: k = min (n, 10) + * | | |01: k = min (n, 8) + * | | |10: k = min (n, 4) + * | | |11: k = min (n, 1) + * | | |where n = retransmission attempt + * | | |The random integer r takes the value in the range 0 <= r < kth power of 2 + * |[7] |ACS |Automatic Pad or CRC Stripping + * | | |When this bit is set, the MAC strips the Pad or FCS field on the incoming frames only if the value of the length field is less than 1,536 bytes + * | | |All received frames with length field greater than or equal to 1,536 bytes are passed to the application without stripping the Pad or FCS field. + * | | |When this bit is reset, the MAC passes all incoming frames, without modifying them, to the Host. + * |[8] |LUD |Link Up or Down + * | | |This bit indicates whether the link is up or down during the transmission of configuration in the RGMII interface: + * | | |0: Link Down + * | | |1: Link Up + * |[9] |DR |Disable Retry + * | | |When this bit is set, the MAC attempts only one transmission + * | | |When a collision occurs on the GMII or MII interface, the MAC ignores the current frame transmission and reports a Frame Abort with excessive collision error in the transmit frame status. + * | | |When this bit is reset, the MAC attempts retries based on the settings of the BL field (Bits [6:5]) + * | | |This bit is applicable only in the half-duplex mode. + * |[10] |IPC |Checksum Offload + * | | |When this bit is set, the MAC calculates the 16-bit one's complement of the one's complement sum of all received Ethernet frame payloads + * | | |It also checks whether the IPv4 Header checksum (assumed to be bytes 2526 or 2930 (VLAN-tagged) of the received Ethernet frame) is correct for the received frame and gives the status in the receive status word + * | | |The MAC also appends the 16-bit checksum calculated for the IP header datagram payload (bytes after the IPv4 header) and appends it to the Ethernet frame transferred to the application (when Type 2 COE is deselected). + * | | |When this bit is reset, this function is disabled. + * | | |When Type 2 COE is selected, this bit, when set, enables the IPv4 header checksum checking and IPv4 or IPv6 TCP, UDP, or ICMP payload checksum checking + * | | |When this bit is reset, the COE function in the receiver is disabled and the corresponding PCE and IP HCE status bits are always cleared. + * |[11] |DM |Duplex Mode + * | | |When this bit is set, the MAC operates in the full-duplex mode where it can transmit and receive simultaneously + * |[12] |LM |Loopback Mode + * | | |When this bit is set, the MAC operates in the loopback mode at GMII or MII + * | | |The (G)MII Receive clock input (clk_rx_i) is required for the loopback to work properly, because the Transmit clock is not looped-back internally. + * |[13] |DO |Disable Receive Own + * | | |When this bit is set, the MAC disables the reception of frames when the phy_txen_o is asserted in the half-duplex mode + * | | |When this bit is reset, the MAC receives all packets that are given by the PHY while transmitting + * | | |This bit is not applicable if the MAC is operating in the full-duplex mode + * |[14] |FES |Speed + * | | |This bit selects the speed in the RMII or RGMII interface + * | | |0: 10 Mbps + * | | |1: 100 Mbps + * |[15] |PS |Port Select + * | | |This bit selects the Ethernet line speed: + * | | |0: For 1000 Mbps operations + * | | |1: For 10 or 100 Mbps operations + * | | |In 10 or 100 Mbps operations, this bit, along with FES bit, selects the exact line speed + * | | |The mac_portselect_o signal reflects the value of this bit. + * |[16] |DCRS |Disable Carrier Sense During Transmission + * | | |When set high, this bit makes the MAC transmitter ignore the (G)MII CRS signal during frame transmission in the half-duplex mode + * | | |This request results in no errors generated because of Loss of Carrier or No Carrier during such transmission + * | | |When this bit is low, the MAC transmitter generates such errors because of Carrier Sense and can even abort the transmissions + * |[19:17] |IFG |Inter-Frame Gap + * | | |These bits control the minimum IFG between frames during transmission. + * | | |000: 96 bit times + * | | |001: 88 bit times + * | | |010: 80 bit times + * | | |... + * | | |111: 40 bit times + * | | |In the half-duplex mode, the minimum IFG can be configured only for 64 bit times (IFG = 100) + * | | |Lower values are not considered + * | | |In the 1000-Mbps mode, the minimum IFG supported is 80 bit times (and above). + * |[20] |JE |Jumbo Frame Enable + * | | |When this bit is set, the MAC allows Jumbo frames of 9,018 bytes (9,022 bytes for VLAN tagged frames) without reporting a giant frame error in the receive frame status. + * |[21] |BE |Frame Burst Enable + * | | |When this bit is set, the MAC allows frame bursting during transmission in the GMII half-duplex mode. + * |[22] |JD |Jabber Disable + * | | |When this bit is set, the MAC disables the jabber timer on the transmitter + * | | |The MAC can transfer frames of up to 16,384 bytes + * | | |When this bit is reset, the MAC cuts off the transmitter if the application sends out more than 2,048 bytes of data (10,240 if JE is set high) during transmission. + * |[23] |WD |Watchdog Disable + * | | |When this bit is set, the MAC disables the watchdog timer on the receiver + * | | |The MAC can receive frames of up to 16,384 bytes + * | | |When this bit is reset, the MAC does not allow a receive frame which more than 2,048 bytes (10,240 if JE is set high) or the value programmed in Register 55 (Watchdog Timeout Register). + * | | |The MAC cuts off any bytes received after the watchdog limit number of bytes. + * |[24] |TC |Transmit Configuration in RGMII + * | | |When set, this bit enables the transmission of duplex mode, link speed, and link up or down information to the PHY in the RGMII port + * | | |When this bit is reset, no such information is driven to the PHY + * |[25] |CST |CRC Stripping for Type Frames + * | | |When this bit is set, the last 4 bytes (FCS) of all frames of Ether type (Length/Type field greater than or equal to 1,536) are stripped and dropped before forwarding the frame to the application + * | | |This function is not valid when the IP Checksum Engine (Type 1) is enabled in the MAC receiver + * | | |This function is valid when Type 2 Checksum Offload Engine is enabled. + * |[27] |TWOKPE |IEEE 802.3as Support for 2K Packets + * | | |When set, the MAC considers all frames, with up to 2,000 bytes length, as normal packets + * | | |When Bit 20 (JE) is not set, the MAC considers all received frames of size more than 2 Kbytes as Giant frames + * | | |When this bit is reset and Bit 20 (JE) is not set, the MAC considers all received frames of size more than 1,518 bytes (1,522 bytes for tagged) as Giant frames + * | | |When Bit 20 is set, setting this bit has no effect on Giant Frame status. + * |[30:28] |SARC |Source Address Insertion or Replacement Control + * | | |This field controls the source address insertion or replacement for all transmitted frames + * | | |Bit 30 specifies which MAC Address register (0 or 1) is used for source address insertion or replacement based on the values of Bits [29:28]: + * | | |* 2'b0x: The input signals mti_sa_ctrl_i and ati_sa_ctrl_i control the SA field generation. * 2'b10: + * | | |If Bit 30 is set to 0, the MAC inserts the content of the MAC Address 0 registers (registers 16 and 17) in the SA field of all transmitted frames. + * | | |If Bit 30 is set to 1, the MAC inserts the content of the MAC Address 1 registers (registers 18 and 19) in the SA field of all transmitted frames. + * | | |* 2'b11: + * | | |If Bit 30 is set to 0, the MAC replaces the content of the MAC Address 0 registers (registers 16 and 17) in the SA field of all transmitted frames. + * | | |If Bit 30 is set to 1, the MAC replaces the content of the MAC Address 1 registers (registers 18 and 19) in the SA field of all transmitted frames. + * | | |Note: + * | | |Changes to this field take effect only on the start of a frame + * | | |If you write this register field when a frame is being transmitted, only the subsequent frame can use the updated value, that is, the current frame does not use the updated value + * @var GMAC_T::MACFRMFLTR + * Offset: 0x04 Register 1 (MAC Frame Filter) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PR |Promiscuous Mode + * | | |When this bit is set, the Address Filter module passes all incoming frames regardless of its destination or source address + * | | |The SA or DA Filter Fails status bits of the Receive Status Word are always cleared when PR is set. + * |[3] |DAIF |DA Inverse Filtering + * | | |When this bit is set, the Address Check block operates in inverse filtering mode for the DA address comparison for both unicast and multicast frames. + * | | |When reset, normal filtering of frames is performed. + * |[4] |PM |Pass All Multicast + * | | |When set, this bit indicates that all received frames with a multicast destination address (first bit in the destination address field is '1') are passed. + * | | |When reset, filtering of multicast frame depends on HMC bit. + * |[5] |DBF |Disable Broadcast Frames + * | | |When this bit is set, the AFM module filters all incoming broadcast frames + * | | |In addition, it overrides all other filter settings. + * | | |When this bit is reset, the AFM module passes all received broadcast frames. + * |[7:6] |PCF |Pass Control Frames + * | | |These bits control the forwarding of all control frames (including unicast and multicast PAUSE frames). + * | | |00: MAC filters all control frames from reaching the application. + * | | |01: MAC forwards all control frames except PAUSE control frames to application even if they fail the Address filter. + * | | |10: MAC forwards all control frames to application even if they fail the Address Filter. + * | | |11: MAC forwards control frames that pass the Address Filter. + * | | |The following conditions should be true for the PAUSE control frames processing: + * | | |Condition 1: The MAC is in the full-duplex mode and flow control is enabled by setting Bit 2 (RFE) of Register 6 (Flow Control Register) to 1. + * | | |Condition 2: The destination address (DA) of the received frame matches the special multicast address or the MAC Address 0 when Bit 3 (UP) of the Register 6 (Flow Control Register) is set. + * | | |Condition 3: The Type field of the received frame is 0x8808 and the OPCODE field is 0x0001. + * | | |Note: + * | | |This field should be set to 01 only when the Condition 1 is true, that is, the MAC is programmed to operate in the full-duplex mode and the RFE bit is enabled + * | | |Otherwise, the PAUSE frame filtering may be inconsistent + * | | |When Condition 1 is false, the PAUSE frames are considered as generic control frames + * | | |Therefore, to pass all control frames (including PAUSE control frames) when the full-duplex mode and flow control is not enabled, you should set the PCF field to 10 or 11 (as required by the application). + * |[8] |SAIF |SA Inverse Filtering + * | | |When this bit is set, the Address Check block operates in inverse filtering mode for the SA address comparison + * | | |The frames whose SA matches the SA registers are marked as failing the SA Address filter. + * | | |When this bit is reset, frames whose SA does not match the SA registers are marked as failing the SA Address filter. + * |[9] |SAF |Source Address Filter Enable + * | | |When this bit is set, the MAC compares the SA field of the received frames with the values programmed in the enabled SA registers + * | | |If the comparison fails, the MAC drops the frame + * | | |When this bit is reset, the MAC forwards the received frame to the application with updated SAF bit of the Rx Status depending on the SA address comparison. + * | | |Note: According to the IEEE specification, Bit 47 of the SA is reserved and set to 0 + * | | |However, in GMAC, the MAC compares all 48 bits + * | | |The software driver should take this into consideration while programming the MAC address registers for SA. + * |[16] |VTFE |VLAN Tag Filter Enable + * | | |When set, this bit enables the MAC to drop VLAN tagged frames that do not match the VLAN Tag comparison. + * | | |When reset, the MAC forwards all frames irrespective of the match status of the VLAN Tag. + * |[31] |RA |Receive All + * | | |When this bit is set, the MAC Receiver module passes all received frames, irrespective of whether they pass the address filter or not, to the Application + * | | |The result of the SA or DA filtering is updated (pass or fail) in the corresponding bits in the Receive Status Word. + * | | |When this bit is reset, the Receiver module passes only those frames to the Application that pass the SA or DA address filter. + * @var GMAC_T::GMIIADDR + * Offset: 0x10 Register 4 (GMII Address Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GB |GMII Busy + * | | |This bit should read logic 0 before writing to Register 4 and Register 5 + * | | |During a PHY register access, the software sets this bit to 1'b1 to indicate that a Read or Write access is in progress. + * | | |Register 5 is invalid until this bit is cleared by the MAC + * | | |Therefore, Register 5 (GMII Data) should be kept valid until the MAC clears this bit during a PHY Write operation + * | | |Similarly for a read operation, the contents of Register 5 are not valid until this bit is cleared. + * | | |The subsequent read or write operation should happen only after the previous operation is complete + * | | |Because there is no acknowledgment from the PHY to MAC after a read or write operation is completed, there is no change in the functionality of this bit even when the PHY is not present. + * |[1] |GW |GMII Write + * | | |When set, this bit indicates to the PHY that this is a Write operation using the GMII Data register + * | | |If this bit is not set, it indicates that this is a Read operation, that is, placing the data in the GMII Data register. + * |[5:2] |CR |CSR Clock Range + * | | |The CSR Clock Range selection determines the frequency of the MDC clock according to the CSR clock frequency used in your design + * | | |The suggested range of CSR clock frequency applicable for each value (when Bit[5] = 0) ensures that the MDC clock is approximately between the frequency range 1.0 MHz - 2.5 MHz. + * | | |0000: The frequency of the CSR clock is 60-100 MHz and the MDC clock is CSR clock/42. + * | | |0001: The frequency of the CSR clock is 100-150 MHz and the MDC clock is CSR clock/62. + * | | |0010: The frequency of the CSR clock is 20-35 MHz and the MDC clock is CSR clock/16. + * | | |0011: The frequency of the CSR clock is 35-60 MHz and the MDC clock is CSR clock/26. + * | | |0100: The frequency of the CSR clock is 150-250 MHz and the MDC clock is CSR clock/102. + * | | |0100: The frequency of the CSR clock is 250-300 MHz and the MDC clock is CSR clock/124. + * | | |0110 and 0111: Reserved + * | | |When Bit 5 is set, you can achieve MDC clock of frequency higher than the IEEE 802.3 specified frequency limit of 2.5 MHz and program a clock divider of lower value + * | | |For example, when CSR clock is of 100 MHz frequency and you program these bits as 1010, then the resultant MDC clock is of 12.5 MHz which is outside the limit of IEEE 802.3 specified range. + * | | |Program the following values only if the interfacing chips support faster MDC clocks: + * | | |1000: CSR clock/4 + * | | |1001: CSR clock/6 + * | | |1010: CSR clock/8 + * | | |1011: CSR clock/10 + * | | |1100: CSR clock/12 + * | | |1101: CSR clock/14 + * | | |1110: CSR clock/16 + * | | |1111: CSR clock/18 + * |[10:6] |GR |GMII Register + * | | |These bits select the desired GMII register in the selected PHY device. + * |[15:11] |PA |Physical Layer Address + * | | |This field indicates which of the 32 possible PHY devices are being accessed. + * @var GMAC_T::GMIIDATA + * Offset: 0x14 Register 5 (GMII Data Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |GD |GMII Data + * | | |This field contains the 16-bit data value read from the PHY after a Management Read operation or the 16-bit data value to be written to the PHY before a Management Write operation. + * @var GMAC_T::FLOWCTL + * Offset: 0x18 Register 6 (Flow Control Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |FCA_BPA |Flow Control Busy or Backpressure Activate + * | | |This bit initiates a Pause Control frame in the full-duplex mode and activates the backpressure function in the half-duplex mode if the TFE bit is set. + * | | |In the full-duplex mode, this bit should be read as 1'b0 before writing to the Flow Control register + * | | |To initiate a Pause control frame, the Application must set this bit to 1'b1 + * | | |During a transfer of the Control Frame, this bit continues to be set to signify that a frame transmission is in progress + * | | |After the completion of Pause control frame transmission, the MAC resets this bit to 1'b0 + * | | |The Flow Control register should not be written to until this bit is cleared. + * | | |In the half-duplex mode, when this bit is set (and TFE is set), then backpressure is asserted by the MAC + * | | |During backpressure, when the MAC receives a new frame, the transmitter starts sending a JAM pattern resulting in a collision + * | | |This control register bit is logically ORed with the mti_flowctrl_i input signal for the backpressure function + * | | |When the MAC is configured for the full-duplex mode, the BPA is automatically disabled. + * |[1] |TFE |Transmit Flow Control Enable + * | | |In the full-duplex mode, when this bit is set, the MAC enables the flow control operation to transmit Pause frames + * | | |When this bit is reset, the flow control operation in the MAC is disabled, and the MAC does not transmit any Pause frames. + * | | |In half-duplex mode, when this bit is set, the MAC enables the back-pressure operation + * | | |When this bit is reset, the back-pressure feature is disabled. + * |[2] |RFE |Receive Flow Control Enable + * | | |When this bit is set, the MAC decodes the received Pause frame and disables its transmitter for a specified (Pause) time + * | | |When this bit is reset, the decode function of the Pause frame is disabled. + * |[3] |UP |Unicast Pause Frame Detect + * | | |A pause frame is processed when it has the unique multicast address specified in the IEEE Std 802.3 + * | | |When this bit is set, the MAC can also detect Pause frames with unicast address of the station + * | | |This unicast address should be as specified in the MAC Address0 High Register and MAC Address0 Low Register. + * | | |When this bit is reset, the MAC only detects Pause frames with unique multicast address. + * | | |Note: The MAC does not process a Pause frame if the multicast address of received frame is different from the unique multicast address. + * |[5:4] |PLT |Pause Low Threshold + * | | |This field configures the threshold of the PAUSE timer at which the input flow control signal mti_flowctrl_i (or sbd_flowctrl_i) is checked for automatic retransmission of PAUSE Frame. + * | | |The threshold values should be always less than the Pause Time configured in Bits[31:16] + * | | |For example, if PT = 100H (256 slot-times), and PLT = 01, then a second PAUSE frame is automatically transmitted if the mti_flowctrl_i signal is asserted at 228 (256 - 28) slot times after the first PAUSE frame is transmitted. + * | | |The following list provides the threshold values for different values: + * | | |00: The threshold is Pause time minus 4 slot times (PT - 4 slot times). + * | | |01: The threshold is Pause time minus 28 slot times (PT - 28 slot times). + * | | |10: The threshold is Pause time minus 144 slot times (PT - 144 slot times). + * | | |11: The threshold is Pause time minus 256 slot times (PT - 256 slot times). + * | | |The slot time is defined as the time taken to transmit 512 bits (64 bytes) on the GMII or MII interface. + * |[7] |DZPQ |Disable Zero-Quanta Pause + * | | |When this bit is set, it disables the automatic generation of the Zero-Quanta Pause Control frames on the de-assertion of the flow-control signal from the FIFO layer (MTL or external sideband flow control signal sbd_flowctrl_i/mti_flowctrl_i) + * | | |When this bit is reset, normal operation with automatic Zero-Quanta Pause Control frame generation is enabled. + * |[31:16] |PT |Pause Time + * | | |This field holds the value to be used in the Pause Time field in the transmit control frame + * | | |Consecutive writes to this register should be performed only after at least four clock cycles in the destination clock domain. + * @var GMAC_T::VLANTAG + * Offset: 0x1C Register 7 (VLAN Tag Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |VL |VLAN Tag Identifier for Receive Frames + * | | |This field contains the 802.1Q VLAN tag to identify the VLAN frames and is compared to the 15th and 16th bytes of the frames being received for VLAN frames + * | | |The following list describes the bits of this field: + * | | |Bits [15:13]: User Priority + * | | |Bit 12: Canonical Format Indicator (CFI) or Drop Eligible Indicator (DEI) + * | | |Bits[11:0]: VLAN tag's VLAN Identifier (VID) field + * | | |When the ETV bit is set, only the VID (Bits[11:0]) is used for comparison + * | | |If VL (VL[11:0] if ETV is set) is all zeros, the MAC does not check the fifteenth and 16th bytes for VLAN tag comparison, and declares all frames with a Type field value of 0x8100 or 0x88a8 as VLAN frames. + * |[16] |ETV |Enable 12-Bit VLAN Tag Comparison + * | | |When this bit is set, a 12-bit VLAN identifier is used for comparing and filtering instead of the complete 16-bit VLAN tag + * | | |Bits [11:0] of VLAN tag are compared with the corresponding field in the received VLAN-tagged frame + * | | |Similarly, when enabled, only 12 bits of the VLAN tag in the received frame are used for hash-based VLAN filtering. + * | | |When this bit is reset, all 16 bits of the 15th and 16th bytes of the received VLAN frame are used for comparison and VLAN hash filtering. + * |[17] |VTIM |VLAN Tag Inverse Match Enable + * | | |When set, this bit enables the VLAN Tag inverse matching + * | | |The frames that do not have matching VLAN Tag are marked as matched. + * | | |When reset, this bit enables the VLAN Tag perfect matching + * | | |The frames with matched VLAN Tag are marked as matched. + * |[18] |ESVL |Enable S-VLAN + * | | |When this bit is set, the MAC transmitter and receiver also consider the S-VLAN (Type = 0x88A8) frames as valid VLAN tagged frames. + * @var GMAC_T::VERSION + * Offset: 0x20 Register 8 (Version Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var GMAC_T::REGDEBUG + * Offset: 0x24 Register 9 (Debug Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RPESTS |MAC GMII or MII Receive Protocol Engine Status + * | | |When high, this bit indicates that the MAC GMII or MII receive protocol engine is actively receiving data and not in IDLE state. + * |[2:1] |RFCFCSTS |MAC Receive Frame Controller FIFO Status + * | | |When high, this field indicates the active state of the small FIFO Read and Write controllers of the MAC Receive Frame Controller Module. + * |[4] |RWCSTS |MTL Rx FIFO Write Controller Active Status + * | | |When high, this bit indicates that the MTL Rx FIFO Write Controller is active and is transferring a received frame to the FIFO. + * |[6:5] |RRCSTS |MTL Rx FIFO Read Controller State + * | | |This field gives the state of the Rx FIFO read Controller: + * | | |00: IDLE state + * | | |01: Reading frame data + * | | |10: Reading frame status (or timestamp) + * | | |11: Flushing the frame data and status + * |[9:8] |RXFSTS |MTL Rx FIFO Fill-level Status + * | | |This field gives the status of the fill-level of the Rx FIFO: + * | | |00: Rx FIFO Empty + * | | |01: Rx FIFO fill level is below the flow-control deactivate threshold + * | | |10: Rx FIFO fill level is above the flow-control activate threshold + * | | |11: Rx FIFO Full + * |[16] |TPESTS |MAC GMII or MII Transmit Protocol Engine Status + * | | |When high, this bit indicates that the MAC GMII or MII transmit protocol engine is actively transmitting data and is not in the IDLE state. + * |[18:17] |TFCSTS |MAC Transmit Frame Controller Status + * | | |This field indicates the state of the MAC Transmit Frame Controller module: + * | | |00: IDLE state + * | | |01: Waiting for Status of previous frame or IFG or back off period to be over + * | | |10: Generating and transmitting a PAUSE control frame (in the full-duplex mode) + * | | |11: Transferring input frame for transmission + * |[19] |TXPAUSED |MAC transmitter in PAUSE + * | | |When high, this bit indicates that the MAC transmitter is in the PAUSE condition (in the full-duplex only mode) and hence does not schedule any frame for transmission. + * |[21:20] |TRCSTS |MTL Tx FIFO Read Controller Status + * | | |This field indicates the state of the Tx FIFO Read Controller: + * | | |00: IDLE state + * | | |01: READ state (transferring data to MAC transmitter) + * | | |10: Waiting for TxStatus from MAC transmitter + * | | |11: Writing the received TxStatus or flushing the Tx FIFO + * |[22] |TWCSTS |MTL Tx FIFO Write Controller Active Status + * | | |When high, this bit indicates that the MTL Tx FIFO Write Controller is active and transferring data to the Tx FIFO. + * |[24] |TXFSTS |MTL Tx FIFO Not Empty Status + * | | |When high, this bit indicates that the MTL Tx FIFO is not empty and some data is left for transmission. + * |[25] |TXSTSFSTS |MTL TxStatus FIFO Full Status + * | | |When high, this bit indicates that the MTL TxStatus FIFO is full + * | | |Therefore, the MTL cannot accept any more frames for transmission. + * @var GMAC_T::PMTCTLSTS + * Offset: 0x2C Register 11 (PMT Control and Status Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PWRDWN |Power Down + * | | |When set, the MAC receiver drops all received frames until it receives the expected magic packet or wake-up frame + * | | |This bit is then self-cleared and the power-down mode is disabled + * | | |The Software can also clear this bit before the expected magic packet or wake-up frame is received + * | | |The frames, received by the MAC after this bit is cleared, are forwarded to the application + * | | |This bit must only be set when the Magic Packet Enable, Global Unicast, or Wake-Up Frame Enable bit is set high. + * | | |Note: You can gate-off the CSR clock during the power-down mode + * | | |However, when the CSR clock is gated-off, you cannot perform any read or write operations on this register + * | | |Therefore, the Software cannot clear this bit. + * |[1] |MGKPKTEN |Magic Packet Enable + * | | |When set, enables generation of a power management event because of magic packet reception. + * |[5] |MGKPRCVD |Magic Packet Received (read only) + * | | |When set, this bit indicates that the power management event is generated because of the reception of a magic packet + * | | |This bit is cleared by a Read into this register. + * @var GMAC_T::LPICTLSTS + * Offset: 0x30 Register 12 (LPI Control and Status Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TLPIEN |Transmit LPI Entry (read only) + * | | |When set, this bit indicates that the MAC Transmitter has entered the LPI state because of the setting of the LPIEN bit + * | | |This bit is cleared by a read into this register. + * |[1] |TLPIEX |Transmit LPI Exit (read only) + * | | |When set, this bit indicates that the MAC transmitter has exited the LPI state after the user has cleared the LPIEN bit and the LPI TW Timer has expired + * | | |This bit is cleared by a read into this register. + * |[2] |RLPIEN |Receive LPI Entry (read only) + * | | |When set, this bit indicates that the MAC Receiver has received an LPI pattern and entered the LPI state + * | | |This bit is cleared by a read into this register. + * | | |Note: This bit may not get set if the MAC stops receiving the LPI pattern for a very short duration, such as, less than 3 clock cycles of CSR clock. + * |[3] |RLPIEX |Receive LPI Exit (read only) + * | | |When set, this bit indicates that the MAC Receiver has stopped receiving the LPI pattern on the GMII or MII interface, exited the LPI state, and resumed the normal reception + * | | |This bit is cleared by a read into this register. + * | | |Note: This bit may not get set if the MAC stops receiving the LPI pattern for a very short duration, such as, less than 3 clock cycles of CSR clock. + * |[8] |TLPIST |Transmit LPI State (read only) + * | | |When set, this bit indicates that the MAC is transmitting the LPI pattern on the GMII or MII interface. + * |[9] |RLPIST |Receive LPI State (read only) + * | | |When set, this bit indicates that the MAC is receiving the LPI pattern on the GMII or MII interface. + * |[16] |LPIEN |LPI Enable + * | | |When set, this bit instructs the MAC Transmitter to enter the LPI state + * | | |When reset, this bit instructs the MAC to exit the LPI state and resume normal transmission. + * | | |This bit is cleared when the LPITXA bit is set and the MAC exits the LPI state because of the arrival of a new packet for transmission. + * |[17] |PLS |PHY Link Status + * | | |This bit indicates the link status of the PHY + * | | |The MAC Transmitter asserts the LPI pattern only when the link status is up (okay) at least for the time indicated by the LPI LS TIMER + * | | |When set, the link is considered to be okay (up) and when reset, the link is considered to be down. + * |[18] |PLSEN |PHY Link Status Enable + * | | |This bit enables the link status received on the RGMII receive paths to be used for activating the LPI LS TIMER. + * | | |When set, the MAC uses the link-status bits of Register 54 (RGMII Status Register) and Bit 17 (PLS) for the LPI LS Timer trigger + * | | |When cleared, the MAC ignores the link-status bits of Register 54 and takes only the PLS bit. + * | | |This bit is RO and reserved if you have not selected the RGMII PHY interface. + * |[19] |LPITXA |LPI TX Automate + * | | |This bit controls the behavior of the MAC when it is entering or coming out of the LPI mode on the transmit side + * | | |If the LPITXA and LPIEN bits are set to 1, the MAC enters the LPI mode only after all outstanding frames (in the core) and pending frames (in the application interface) have been transmitted + * | | |The MAC comes out of the LPI mode when the application sends any frame for transmission or the application issues a TX FIFO Flush command + * | | |In addition, the MAC automatically clears the LPIEN bit when it exits the LPI state + * | | |If TX FIFO Flush is set, in Bit 20 of Register 1006 (Operation Mode Register), when the MAC is in the LPI mode, the MAC exits the LPI mode. + * | | |When this bit is 0, the LPIEN bit directly controls behavior of the MAC when it is entering or coming out of the LPI mode. + * @var GMAC_T::LPITMRCTL + * Offset: 0x34 Register 13 (LPI Timers Control Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |TWT |LPI TW Timer + * | | |This field specifies the minimum time (in microseconds) for which the MAC waits after it stops transmitting the LPI pattern to the PHY and before it resumes the normal transmission + * | | |The TLPIEX status bit is set after the expiry of this timer. + * |[25:16] |LST |LPI LS Timer + * | | |This field specifies the minimum time (in milliseconds) for which the link status from the PHY should be up (OKAY) before the LPI pattern can be transmitted to the PHY + * | | |The MAC does not transmit the LPI pattern even when the LPIEN bit is set unless the LPI LS Timer reaches the programmed terminal count + * | | |The default value of the LPI LS Timer is 1000 (1 sec) as defined in the IEEE standard. + * @var GMAC_T::INTSTS + * Offset: 0x38 Register 14 (Interrupt Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RGSMIIIS |RGMII Interrupt Status + * | | |This bit is set because of any change in value of the Link Status of RGMII interface (Bit 3 in Register 54 (RGMII Status Register)) + * | | |This bit is cleared when you perform a read operation on the RGMII Status Register. + * |[3] |PMTIS |PMT Interrupt Status + * | | |This bit is set when a Magic packet or Wake-on-LAN frame is received in the power-down mode (see Bits 5 and 6 in the PMT Control and Status Register) + * | | |This bit is cleared when both Bits[6:5] are cleared because of a read operation to the PMT Control and Status register. + * |[9] |TSIS |Timestamp Interrupt Status + * | | |When the Advanced Timestamp feature is enabled, this bit is set when any of the following conditions is true: + * | | |The system time value equals or exceeds the value specified in the Target Time High and Low registers. + * | | |There is an overflow in the seconds register. + * | | |The Auxiliary snapshot trigger is asserted. + * | | |This bit is cleared on reading Bit 0 of the Register 458 (Timestamp Status Register). + * | | |If default Timestamping is enabled, when set, this bit indicates that the system time value is equal to or exceeds the value specified in the Target Time registers + * | | |In this mode, this bit is cleared after the completion of the read of this bit + * | | |In all other modes, this bit is reserved. + * |[10] |LPIIS |LPI Interrupt Status + * | | |When the Energy Efficient Ethernet feature is enabled, this bit is set for any LPI state entry or exit in the MAC Transmitter or Receiver + * | | |This bit is cleared on reading Bit 0 of Register 12 (LPI Control and Status Register) + * | | |In all other modes, this bit is reserved. + * @var GMAC_T::INTMSK + * Offset: 0x3C Register 15 (Interrupt Mask Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RGSMIIIM |RGMII or SMII Interrupt Mask + * | | |When set, this bit disables the assertion of the interrupt signal because of the setting of the RGMII or SMII Interrupt Status bit in Register 14 (Interrupt Status Register). + * |[1] |PCSLCHGIM |PCS Link Status Interrupt Mask (read only) + * | | |When set, this bit disables the assertion of the interrupt signal because of the setting of the PCS Link-status changed bit in Register 14 (Interrupt Status Register). + * |[2] |PCSANCIM |PCS AN Completion Interrupt Mask (read only) + * | | |When set, this bit disables the assertion of the interrupt signal because of the setting of PCS Auto-negotiation complete bit in Register 14 (Interrupt Status Register) + * |[3] |PMTIM |PMT Interrupt Mask + * | | |When set, this bit disables the assertion of the interrupt signal because of the setting of PMT Interrupt Status bit in Register 14 (Interrupt Status Register). + * |[9] |TSIM |Timestamp Interrupt Mask + * | | |When set, this bit disables the assertion of the interrupt signal because of the setting of Timestamp Interrupt Status bit in Register 14 (Interrupt Status Register) + * | | |This bit is valid only when IEEE1588 timestamping is enabled + * | | |In all other modes, this bit is reserved. + * |[10] |LPIIM |LPI Interrupt Mask + * | | |When set, this bit disables the assertion of the interrupt signal because of the setting of the LPI Interrupt Status bit in Register 14 (Interrupt Status Register) + * @var GMAC_T::MACADDR0H + * Offset: 0x40 Register 16 (MAC Address0 High Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |ADDRHI |MAC Address0 [47:32] + * | | |This field contains the upper 16 bits (47:32) of the first 6-byte MAC address + * | | |The MAC uses this field for filtering the received frames and inserting the MAC address in the Transmit Flow Control (PAUSE) Frames. + * |[31] |AE |Address Enable (read only) + * | | |This bit is always set to 1. + * @var GMAC_T::MACADDR0L + * Offset: 0x44 Register 17 (MAC Address0 Low Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ADDRLO |MAC Address0 [31:0] + * | | |This field contains the lower 32 bits of the first 6-byte MAC address + * | | |This is used by the MAC for filtering the received frames and inserting the MAC address in the Transmit Flow Control (PAUSE) Frames. + * @var GMAC_T::MACADDR1H + * Offset: 0x48 Register 18 (MAC Address1 High Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |ADDRHI |MAC Address1 [47:32] + * | | |This field contains the upper 16 bits (47:32) of the second 6-byte MAC address. + * |[29:24] |MBC |Mask Byte Control + * | | |These bits are mask control bits for comparison of each of the MAC Address bytes + * | | |When set high, the MAC does not compare the corresponding byte of received DA or SA with the contents of MAC Address1 registers + * | | |Each bit controls the masking of the bytes as follows: + * | | |Bit 29: Register 18[15:8] + * | | |Bit 28: Register 18[7:0] + * | | |Bit 27: Register 19[31:24] + * | | |... + * | | |Bit 24: Register 19[7:0] + * | | |You can filter a group of addresses (known as group address filtering) by masking one or more bytes of the address. + * |[30] |SA |Source Address + * | | |When this bit is set, the MAC Address1[47:0] is used to compare with the SA fields of the received frame. + * | | |When this bit is reset, the MAC Address1[47:0] is used to compare with the DA fields of the received frame. + * |[31] |AE |Address Enable + * | | |When this bit is set, the address filter module uses the second MAC address for perfect filtering + * | | |When this bit is reset, the address filter module ignores the address for filtering. + * @var GMAC_T::MACADDR1L + * Offset: 0x4C Register 19 (MAC Address1 Low Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ADDRLO |MAC Address1 [31:0] + * | | |This field contains the lower 32 bits of the second 6-byte MAC address + * | | |The content of this field is undefined until loaded by the Application after the initialization process. + * @var GMAC_T::MACADDR2H + * Offset: 0x50 Register 20 (MAC Address2 High Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |ADDRHI |MAC Address2 [47:32] + * | | |This field contains the upper 16 bits (47:32) of the third 6-byte MAC address. + * |[29:24] |MBC |Mask Byte Control + * | | |These bits are mask control bits for comparison of each of the MAC Address bytes + * | | |When set high, the MAC does not compare the corresponding byte of received DA or SA with the contents of MAC Address2 registers + * | | |Each bit controls the masking of the bytes as follows: + * | | |Bit 29: Register 18[15:8] + * | | |Bit 28: Register 18[7:0] + * | | |Bit 27: Register 19[31:24] + * | | |... + * | | |Bit 24: Register 19[7:0] + * |[30] |SA |Source Address + * | | |When this bit is set, the MAC Address2[47:0] is used to compare with the SA fields of the received frame. + * | | |When this bit is reset, the MAC Address2[47:0] is used to compare with the DA fields of the received frame. + * |[31] |AE |Address Enable + * | | |When this bit is set, the address filter module uses the third MAC address for perfect filtering + * | | |When this bit is reset, the address filter module ignores the address for filtering. + * @var GMAC_T::MACADDR2L + * Offset: 0x54 Register 21 (MAC Address2 Low Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ADDRLO |MAC Address2 [31:0] + * | | |This field contains the lower 32 bits of the third 6-byte MAC address + * | | |The content of this field is undefined until loaded by the Application after the initialization process. + * @var GMAC_T::MACADDR3H + * Offset: 0x58 Register 22 (MAC Address3 High Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |ADDRHI |MAC Address3 [47:32] + * | | |This field contains the upper 16 bits (47:32) of the fourth 6-byte MAC address. + * |[29:24] |MBC |Mask Byte Control + * | | |These bits are mask control bits for comparison of each of the MAC Address bytes + * | | |When set high, the MAC does not compare the corresponding byte of received DA or SA with the contents of MAC Address3 registers + * | | |Each bit controls the masking of the bytes as follows: + * | | |Bit 29: Register 18[15:8] + * | | |Bit 28: Register 18[7:0] + * | | |Bit 27: Register 19[31:24] + * | | |... + * | | |Bit 24: Register 19[7:0] + * |[30] |SA |Source Address + * | | |When this bit is set, the MAC Address3[47:0] is used to compare with the SA fields of the received frame. + * | | |When this bit is reset, the MAC Address3[47:0] is used to compare with the DA fields of the received frame. + * |[31] |AE |Address Enable + * | | |When this bit is set, the address filter module uses the fourth MAC address for perfect filtering + * | | |When this bit is reset, the address filter module ignores the address for filtering. + * @var GMAC_T::MACADDR3L + * Offset: 0x5C Register 23 (MAC Address3 Low Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ADDRLO |MAC Address3 [31:0] + * | | |This field contains the lower 32 bits of the fourth 6-byte MAC address + * | | |The content of this field is undefined until loaded by the Application after the initialization process. + * @var GMAC_T::MACADDR4H + * Offset: 0x60 Register 24 (MAC Address4 High Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |ADDRHI |MAC Address4 [47:32] + * | | |This field contains the upper 16 bits (47:32) of the fifth 6-byte MAC address. + * |[29:24] |MBC |Mask Byte Control + * | | |These bits are mask control bits for comparison of each of the MAC Address bytes + * | | |When set high, the MAC does not compare the corresponding byte of received DA or SA with the contents of MAC Address4 registers + * | | |Each bit controls the masking of the bytes as follows: + * | | |Bit 29: Register 18[15:8] + * | | |Bit 28: Register 18[7:0] + * | | |Bit 27: Register 19[31:24] + * | | |... + * | | |Bit 24: Register 19[7:0] + * |[30] |SA |Source Address + * | | |When this bit is set, the MAC Address4[47:0] is used to compare with the SA fields of the received frame. + * | | |When this bit is reset, the MAC Address4[47:0] is used to compare with the DA fields of the received frame. + * |[31] |AE |Address Enable + * | | |When this bit is set, the address filter module uses the fifth MAC address for perfect filtering + * | | |When this bit is reset, the address filter module ignores the address for filtering. + * @var GMAC_T::MACADDR4L + * Offset: 0x64 Register 25 (MAC Address4 Low Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ADDRLO |MAC Address4 [31:0] + * | | |This field contains the lower 32 bits of the fifth 6-byte MAC address + * | | |The content of this field is undefined until loaded by the Application after the initialization process. + * @var GMAC_T::MACADDR5H + * Offset: 0x68 Register 26 (MAC Address5 High Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |ADDRHI |MAC Address5 [47:32] + * | | |This field contains the upper 16 bits (47:32) of the sixth 6-byte MAC address. + * |[29:24] |MBC |Mask Byte Control + * | | |These bits are mask control bits for comparison of each of the MAC Address bytes + * | | |When set high, the MAC does not compare the corresponding byte of received DA or SA with the contents of MAC Address5 registers + * | | |Each bit controls the masking of the bytes as follows: + * | | |Bit 29: Register 18[15:8] + * | | |Bit 28: Register 18[7:0] + * | | |Bit 27: Register 19[31:24] + * | | |... + * | | |Bit 24: Register 19[7:0] + * |[30] |SA |Source Address + * | | |When this bit is set, the MAC Address5[47:0] is used to compare with the SA fields of the received frame + * | | |When this bit is reset, the MAC Address5[47:0] is used to compare with the DA fields of the received frame. + * |[31] |AE |Address Enable + * | | |When this bit is set, the address filter module uses the sixth MAC address for perfect filtering + * | | |When this bit is reset, the address filter module ignores the address for filtering. + * @var GMAC_T::MACADDR5L + * Offset: 0x6C Register 27 (MAC Address5 Low Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ADDRLO |MAC Address5 [31:0] + * | | |This field contains the lower 32 bits of the sixth 6-byte MAC address + * | | |The content of this field is undefined until loaded by the Application after the initialization process. + * @var GMAC_T::MACADDR6H + * Offset: 0x70 Register 28 (MAC Address6 High Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |ADDRHI |MAC Address6 [47:32] + * | | |This field contains the upper 16 bits (47:32) of the seventh 6-byte MAC address. + * |[29:24] |MBC |Mask Byte Control + * | | |These bits are mask control bits for comparison of each of the MAC Address bytes + * | | |When set high, the MAC does not compare the corresponding byte of received DA or SA with the contents of MAC Address6 registers + * | | |Each bit controls the masking of the bytes as follows: + * | | |Bit 29: Register 18[15:8] + * | | |Bit 28: Register 18[7:0] + * | | |Bit 27: Register 19[31:24] + * | | |... + * | | |Bit 24: Register 19[7:0] + * |[30] |SA |Source Address + * | | |When this bit is set, the MAC Address6[47:0] is used to compare with the SA fields of the received frame + * | | |When this bit is reset, the MAC Address6[47:0] is used to compare with the DA fields of the received frame. + * |[31] |AE |Address Enable + * | | |When this bit is set, the address filter module uses the seventh MAC address for perfect filtering + * | | |When this bit is reset, the address filter module ignores the address for filtering. + * @var GMAC_T::MACADDR6L + * Offset: 0x74 Register 29 (MAC Address6 Low Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ADDRLO |MAC Address6 [31:0] + * | | |This field contains the lower 32 bits of the seventh 6-byte MAC address + * | | |The content of this field is undefined until loaded by the Application after the initialization process. + * @var GMAC_T::MACADDR7H + * Offset: 0x78 Register 30 (MAC Address7 High Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |ADDRHI |MAC Address7 [47:32] + * | | |This field contains the upper 16 bits (47:32) of the eighth 6-byte MAC address. + * |[29:24] |MBC |Mask Byte Control + * | | |These bits are mask control bits for comparison of each of the MAC Address bytes + * | | |When set high, the MAC does not compare the corresponding byte of received DA or SA with the contents of MAC Address6 registers + * | | |Each bit controls the masking of the bytes as follows: + * | | |Bit 29: Register 18[15:8] + * | | |Bit 28: Register 18[7:0] + * | | |Bit 27: Register 19[31:24] + * | | |... + * | | |Bit 24: Register 19[7:0] + * |[30] |SA |Source Address + * | | |When this bit is set, the MAC Address7[47:0] is used to compare with the SA fields of the received frame + * | | |When this bit is reset, the MAC Address7[47:0] is used to compare with the DA fields of the received frame. + * |[31] |AE |Address Enable + * | | |When this bit is set, the address filter module uses the eighth MAC address for perfect filtering + * | | |When this bit is reset, the address filter module ignores the address for filtering. + * @var GMAC_T::MACADDR7L + * Offset: 0x7C Register 31 (MAC Address7 Low Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ADDRLO |MAC Address7 [31:0] + * | | |This field contains the lower 32 bits of the eighth 6-byte MAC address + * | | |The content of this field is undefined until loaded by the Application after the initialization process. + * @var GMAC_T::MACADDR8H + * Offset: 0x80 Register 32 (MAC Address8 High Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |ADDRHI |MAC Address8 [47:32] + * | | |This field contains the upper 16 bits (47:32) of the ninth 6-byte MAC address. + * |[29:24] |MBC |Mask Byte Control + * | | |These bits are mask control bits for comparison of each of the MAC Address bytes + * | | |When set high, the MAC does not compare the corresponding byte of received DA or SA with the contents of MAC Address8 registers + * | | |Each bit controls the masking of the bytes as follows: + * | | |Bit 29: Register 18[15:8] + * | | |Bit 28: Register 18[7:0] + * | | |Bit 27: Register 19[31:24] + * | | |... + * | | |Bit 24: Register 19[7:0] + * |[30] |SA |Source Address + * | | |When this bit is set, the MAC Address8[47:0] is used to compare with the SA fields of the received frame + * | | |When this bit is reset, the MAC Address8[47:0] is used to compare with the DA fields of the received frame. + * |[31] |AE |Address Enable + * | | |When this bit is set, the address filter module uses the ninth MAC address for perfect filtering + * | | |When this bit is reset, the address filter module ignores the address for filtering. + * @var GMAC_T::MACADDR8L + * Offset: 0x84 Register 33 (MAC Address8 Low Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ADDRLO |MAC Address8 [31:0] + * | | |This field contains the lower 32 bits of the ninth 6-byte MAC address + * | | |The content of this field is undefined until loaded by the Application after the initialization process. + * @var GMAC_T::RGMIICTLSTS + * Offset: 0xD8 Register 54 (RGMII Status Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |LNKMOD |Link Mode + * | | |This bit indicates the current mode of operation of the link: + * | | |1'b0: Half-duplex mode + * | | |1'b1: Full-duplex mode + * |[2:1] |LNKSPEED |Link Speed + * | | |This bit indicates the current speed of the link: + * | | |00: 2.5 MHz + * | | |01: 25 MHz + * | | |10: 125 MHz + * |[3] |LNKSTS |Link Status + * | | |When set, this bit indicates that the link is up between the local PHY and the remote PHY + * | | |When cleared, this bit indicates that the link is down between the local PHY and the remote PHY. + * @var GMAC_T::WDTOUT + * Offset: 0xDC Register 55 (Watchdog Timeout Register) This register controls the watchdog timeout for received frames + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[13:0] |WTO |Watchdog Timeout + * | | |When Bit 16 (PWE) is set and Bit 23 (WD) of Register 0 (MAC Configuration Register) is reset, this field is used as watchdog timeout for a received frame + * | | |If the length of a received frame exceeds the value of this field, such frame is terminated and declared as an error frame. + * | | |Note: When Bit 16 (PWE) is set, the value in this field should be more than 1,522 (0x05F2) + * | | |Otherwise, the IEEE Std 802.3-specified valid tagged frames are declared as error frames and are dropped. + * |[16] |PWE |Programmable Watchdog Enable + * | | |When this bit is set and Bit 23 (WD) of Register 0 (MAC Configuration Register) is reset, the WTO field (Bits[13:0]) is used as watchdog timeout for a received frame + * | | |When this bit is cleared, the watchdog timeout for a received frame is controlled by the setting of Bit 23 (WD) and Bit 20 (JE) in Register 0 (MAC Configuration Register). + * @var GMAC_T::VLANINCL + * Offset: 0x584 Register 353 (VLAN Tag Inclusion or Replacement Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |VLT |VLAN Tag for Transmit Frames + * | | |This field contains the value of the VLAN tag to be inserted or replaced + * | | |The value must only be changed when the transmit lines are inactive or during the initialization phase + * | | |Bits[15:13] are the User Priority, Bit 12 is the CFI/DEI, and Bits[11:0] are the VLAN tag's VID field. + * |[17:16] |VLC |VLAN Tag Control in Transmit Frames + * | | |2'b00: No VLAN tag deletion, insertion, or replacement + * | | |2'b01: VLAN tag deletion + * | | |The MAC removes the VLAN type (bytes 13 and 14) and VLAN tag (bytes 15 and 16) of all transmitted frames with VLAN tags. + * | | |2'b10: VLAN tag insertion + * | | |The MAC inserts VLT in bytes 15 and 16 of the frame after inserting the Type value (0x8100/0x88a8) in bytes 13 and 14 + * | | |This operation is performed on all transmitted frames, irrespective of whether they already have a VLAN tag. + * | | |2'b11: VLAN tag replacement + * | | |The MAC replaces VLT in bytes 15 and 16 of all VLAN-type transmitted frames (Bytes 13 and 14 are 0x8100/0x88a8). + * | | |Note: Changes to this field take effect only on the start of a frame + * | | |If you write this register field when a frame is being transmitted, only the subsequent frame can use the updated value, that is, the current frame does not use the updated value + * |[18] |VLP |VLAN Priority Control + * | | |When this bit is set, the control Bits [17:16] are used for VLAN deletion, insertion, or replacement + * | | |When this bit is reset, the mti_vlan_ctrl_i control input is used, and Bits [17:16] are ignored. + * |[19] |CSVL |C-VLAN or S-VLAN + * | | |When this bit is set, S-VLAN type (0x88A8) is inserted or replaced in the 13th and 14th bytes of transmitted frames + * | | |When this bit is reset, C-VLAN type (0x8100) is inserted or replaced in the transmitted frames. + * @var GMAC_T::TSCTL + * Offset: 0x700 Register 448 (Timestamp Control Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TSENA |Timestamp Enable + * | | |When set, the timestamp is added for the transmit and receive frames + * | | |When disabled, timestamp is not added for the transmit and receive frames and the Timestamp Generator is also suspended + * | | |You need to initialize the Timestamp (system time) after enabling this mode + * | | |On the receive side, the MAC processes the 1588 frames only if this bit is set. + * |[1] |TSCFUPDT |Timestamp Fine or Coarse Update + * | | |When set, this bit indicates that the system times update should be done using the fine update method + * | | |When reset, it indicates the system timestamp update should be done using the Coarse method. + * |[2] |TSINIT |Timestamp Initialize + * | | |When set, the system time is initialized (overwritten) with the value specified in the Register 452 (System Time - Seconds Update Register) and Register 453 (System Time - Nanoseconds Update Register). + * | | |This bit should be read zero before updating it + * | | |This bit is reset when the initialization is complete + * | | |The Timestamp Higher Word register can only be initialized. + * |[3] |TSUPDT |Timestamp Update + * | | |When set, the system time is updated (added or subtracted) with the value specified in Register 452 (System Time - Seconds Update Register) and Register 453 (System Time - Nanoseconds Update Register). + * | | |This bit should be read zero before updating it + * | | |This bit is reset when the update is completed in hardware + * | | |The Timestamp Higher Word register is not updated. + * |[4] |TSTRIG |Timestamp Interrupt Trigger Enable + * | | |When set, the timestamp interrupt is generated when the System Time becomes greater than the value written in the Target Time register + * | | |This bit is reset after the generation of the Timestamp Trigger Interrupt. + * |[5] |TSADDREG |Addend Reg Update + * | | |When set, the content of the Timestamp Addend register is updated in the PTP block for fine correction + * | | |This is cleared when the update is completed + * | | |This register bit should be zero before setting it. + * |[8] |TSENALL |Enable Timestamp for All Frames + * | | |When set, the timestamp snapshot is enabled for all frames received by the MAC. + * |[9] |TSCTRLSSR |Timestamp Digital or Binary Rollover Control + * | | |When set, the Timestamp Low register rolls over after 0x3B9A_C9FF value (that is, 1 nanosecond accuracy) and increments the timestamp (High) seconds + * | | |When reset, the rollover value of sub-second register is 0x7FFF_FFFF + * | | |The sub-second increment has to be programmed correctly depending on the PTP reference clock frequency and the value of this bit. + * |[10] |TSVER2ENA |Enable PTP packet Processing for Version 2 Format + * | | |When set, the PTP packets are processed using the 1588 version 2 format + * | | |Otherwise, the PTP packets are processed using the version 1 format. + * |[11] |TSIPENA |Enable Processing of PTP over Ethernet Frames + * | | |When set, the MAC receiver processes the PTP packets encapsulated directly in the Ethernet frames + * | | |When this bit is clear, the MAC ignores the PTP over Ethernet packets. + * |[12] |TSIPV6ENA |Enable Processing of PTP Frames Sent Over IPv6-UDP + * | | |When set, the MAC receiver processes PTP packets encapsulated in UDP over IPv6 packets + * | | |When this bit is clear, the MAC ignores the PTP transported over UDP-IPv6 packets. + * |[13] |TSIPV4ENA |Enable Processing of PTP Frames Sent over IPv4-UDP + * | | |When set, the MAC receiver processes the PTP packets encapsulated in UDP over IPv4 packets + * | | |When this bit is clear, the MAC ignores the PTP transported over UDP-IPv4 packets + * | | |This bit is set by default. + * |[14] |TSEVNTENA |Enable Timestamp Snapshot for Event Messages + * | | |When set, the timestamp snapshot is taken only for event messages (SYNC, Delay_Req, Pdelay_Req, or Pdelay_Resp) + * | | |When reset, the snapshot is taken for all messages except Announce, Management, and Signaling. + * |[15] |TSMSTRENA |Enable Snapshot for Messages Relevant to Master + * | | |When set, the snapshot is taken only for the messages relevant to the master node + * | | |Otherwise, the snapshot is taken for the messages relevant to the slave node. + * |[17:16] |SNAPTYPSEL|Select PTP packets for Taking Snapshots + * | | |These bits along with Bits 15 and 14 decide the set of PTP packet types for which snapshot needs to be taken. + * |[18] |TSENMACADDR|Enable MAC address for PTP Frame Filtering + * | | |When set, the DA MAC address (that matches any MAC Address register) is used to filter the PTP frames when PTP is directly sent over Ethernet. + * @var GMAC_T::SSECINC + * Offset: 0x704 Register 449 (Sub-Second Increment Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |SSINC |Sub-second Increment Value + * | | |The value programmed in this field is accumulated every clock cycle (of clk_ptp_i) with the contents of the sub-second register + * | | |For example, when PTP clock is 50 MHz (period is 20 ns), you should program 20 (0x14) when the System Time-Nanoseconds register has an accuracy of 1 ns (TSCTRLSSR bit is set) + * | | |When TSCTRLSSR is clear, the Nanoseconds register has a resolution of ~0.465ns + * | | |In this case, you should program a value of 43 (0x2B) that is derived by 20ns/0.465. + * @var GMAC_T::STSEC + * Offset: 0x708 Register 450 (System Time - Seconds Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |TSS |Timestamp Second + * | | |The value in this field indicates the current value in seconds of the System Time maintained by the MAC. + * @var GMAC_T::STNSEC + * Offset: 0x70C Register 451 (System Time - Nanoseconds Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[30:0] |TSSS |Timestamp Sub Seconds + * | | |The value in this field has the sub second representation of time, with an accuracy of 0.46 ns + * | | |When bit 9 (TSCTRLSSR) is set in Register 448 (Timestamp Control Register), each bit represents 1 ns and the maximum value is 0x3B9A_C9FF, after which it rolls-over to zero. + * @var GMAC_T::STSECU + * Offset: 0x710 Register 452 (System Time - Seconds Update Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |TSS |Timestamp Second + * | | |The value in this field indicates the time in seconds to be initialized or added to the system time. + * @var GMAC_T::STNSECU + * Offset: 0x714 Register 453 (System Time - Nanoseconds Update Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[30:0] |TSSS |Timestamp Sub Second + * | | |The value in this field has the sub second representation of time, with an accuracy of 0.46 ns + * | | |When bit 9 (TSCTRLSSR) is set in Register 448 (Timestamp Control Register), each bit represents 1 ns and the programmed value should not exceed 0x3B9A_C9FF. + * |[31] |ADDSUB |Add or subtract time + * | | |When this bit is set, the time value is subtracted with the contents of the update register + * | | |When this bit is reset, the time value is added with the contents of the update register. + * @var GMAC_T::TSADDEND + * Offset: 0x718 Register 454 (Timestamp Addend Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |TSAR |Timestamp Addend Register + * | | |This field indicates the 32-bit time value to be added to the Accumulator register to achieve time synchronization. + * @var GMAC_T::TGTSEC + * Offset: 0x71C Register 455 (Target Time Seconds Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |TSTR |Target Time Seconds Register + * | | |This register stores the time in seconds + * | | |When the timestamp value matches or exceeds both Target Timestamp registers, then based on Bits [6:5] of Register 459 (PPS Control Register), the MAC starts or stops the PPS signal output and generates an interrupt (if enabled). + * @var GMAC_T::TGTNSEC + * Offset: 0x720 Register 456 (Target Time Nanoseconds Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[30:0] |TTSLO |Target Timestamp Low Register + * | | |This register stores the time in (signed) nanoseconds + * | | |When the value of the timestamp matches the both Target Timestamp registers, then based on the TRGTMODSEL0 field (Bits [6:5]) in Register 459 (PPS Control Register), the MAC starts or stops the PPS signal output and generates an interrupt (if enabled). + * | | |This value should not exceed 0x3B9A_C9FF when TSCTRLSSR is set in the Timestamp control register + * | | |The actual start or stop time of the PPS signal output may have an error margin up to one unit of sub-second increment value. + * |[31] |TRGTBUSY |Target Time Register Busy (read only) + * | | |The MAC sets this bit when the PPSCMD field (Bits[3:0]) in Register 459 (PPS Control Register) is programmed to 010 or 011 + * | | |Programming the PPSCMD field to 010 or 011, instructs the MAC to synchronize the Target Time Registers to the PTP clock domain. + * | | |The MAC clears this bit after synchronizing the Target Time Registers to the PTP clock domain The application must not update the Target Time Registers when this bit is read as 1 + * | | |Otherwise, the synchronization of the previous programmed time gets corrupted + * | | |This bit is reserved when the Enable Flexible Pulse-Per-Second Output feature is not selected. + * @var GMAC_T::STHSEC + * Offset: 0x724 Register 457 (System Time - Higher Word Seconds Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |TSHWR |Timestamp Higher Word Register + * | | |This field contains the most significant 16-bits of the timestamp seconds value + * | | |The register is directly written to initialize the value + * | | |This register is incremented when there is an overflow from the 32-bits of the System Time - Seconds register. + * @var GMAC_T::TSSTS + * Offset: 0x728 Register 458 (Timestamp Status Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TSSOVF |Timestamp Seconds Overflow + * | | |When set, this bit indicates that the seconds value of the timestamp (when supporting version 2 format) has overflowed beyond 32'hFFFF_FFFF. + * |[1] |TSTARGT |Timestamp Target Time Reached + * | | |When set, this bit indicates that the value of system time is greater or equal to the value specified in the Register 455 (Target Time Seconds Register) and Register 456 (Target Time Nanoseconds Register). + * |[2] |AUXTSTRIG |Auxiliary Timestamp Trigger Snapshot + * | | |This bit is set high when the auxiliary snapshot is written to the FIFO + * | | |This bit is valid only if the Enable IEEE 1588 Auxiliary Snapshot feature is selected. + * |[3] |TSTRGTERR |Timestamp Target Time Error + * | | |This bit is set when the target time, being programmed in Target Time Registers, is already elapsed + * | | |This bit is cleared when read by the application. + * |[19:16] |ATSSTN |Auxiliary Timestamp Snapshot Trigger Identifier + * | | |These bits identify the Auxiliary trigger inputs for which the timestamp available in the Auxiliary Snapshot Register is applicable + * | | |When more than one bit is set at the same time, it means that corresponding auxiliary triggers were sampled at the same clock + * | | |These bits are applicable only if the number of Auxiliary snapshots is more than one + * | | |One bit is assigned for each trigger as shown in the following list: + * | | |Bit 16: Auxiliary trigger 0 + * | | |Bit 17: Auxiliary trigger 1 + * | | |Bit 18: Auxiliary trigger 2 + * | | |Bit 19: Auxiliary trigger 3 + * | | |The software can read this register to find the triggers that are set when the timestamp is taken. + * @var GMAC_T::PPSCTL + * Offset: 0x72C Register 459 (PPS Control Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PPSCTL_PPSCMD|PPSCTL0 or PPSCMD0 + * | | |PPSCTL0: PPS0 Output Frequency Control + * | | |This field controls the frequency of the PPS0 output (ptp_pps_o[0]) signal + * | | |The default value of PPSCTL is 0000, and the PPS output is 1 pulse (of width clk_ptp_i) every second + * | | |For other values of PPSCTL, the PPS output becomes a generated clock of following frequencies: + * | | |-0001: The binary rollover is 2 Hz, and the digital rollover is 1 Hz + * | | |-0010: The binary rollover is 4 Hz, and the digital rollover is 2 Hz + * | | |-0011: The binary rollover is 8 Hz, and the digital rollover is 4 Hz + * | | |-0100: The binary rollover is 16 Hz, and the digital rollover is 8 Hz + * | | |-.. + * | | |-1111: The binary rollover is 32.768 kHz, and the digital rollover is 16.384 kHz + * | | |Note: + * | | |In the binary rollover mode, the PPS output (ptp_pps_o) has a duty cycle of 50 percent with these frequencies. + * | | |In the digital rollover mode, the PPS output frequency is an average number + * | | |The actual clock is of different frequency that gets synchronized every second + * | | |For example: + * | | |* When PPSCTL = 0001, the PPS (1 Hz) has a low period of 537 ms and a high period of 463 ms * When PPSCTL = 0010, the PPS (2 Hz) is a sequence of: + * | | |One clock of 50 percent duty cycle and 537 ms period + * | | |Second clock of 463 ms period (268 ms low and 195 ms high) + * | | |* When PPSCTL = 0011, the PPS (4 Hz) is a sequence of: + * | | |Three clocks of 50 percent duty cycle and 268 ms period + * | | |Fourth clock of 195 ms period (134 ms low and 61 ms high) + * | | |This behavior is because of the non-linear toggling of bits in the digital rollover mode in Register 451 (System Time - Nanoseconds Register). + * | | |Flexible PPS0 Output (ptp_pps_o[0]) Control Programming these bits with a non-zero value instructs the MAC to initiate an event + * | | |Once the command is transferred or synchronized to the PTP clock domain, these bits get cleared automatically + * | | |The Software should ensure that these bits are programmed only when they are all-zero + * | | |The following list describes the values of PPSCMD0: + * | | |* 0000: No Command * 0001: START Single Pulse This command generates single pulse rising at the start point defined in Target Time Registers (register 455 and 456) and of a duration defined in the PPS0 PPSWDTH Register + * | | |* 0010: START Pulse Train This command generates the train of pulses rising at the start point defined in the Target Time Registers and of a duration defined in the PPSWDTH Register and repeated at interval defined in the PPS Interval Register + * | | |By default, the PPS pulse train is free-running unless stopped by 'STOP Pulse train at time' or 'STOP Pulse Train immediately' commands + * | | |* 0011: Cancel START + * | | |This command cancels the START Single Pulse and START Pulse Train commands if the system time has not crossed the programmed start time + * | | |* 0100: STOP Pulse train at time This command stops the train of pulses initiated by the START Pulse Train command (PPSCMD = 0010) after the time programmed in the Target Time registers elapses + * | | |* 0101: STOP Pulse Train immediately This command immediately stops the train of pulses initiated by the START Pulse Train command (PPSCMD = 0010) + * | | |* 0110: Cancel STOP Pulse train This command cancels the STOP pulse train at time command if the programmed stop time has not elapsed + * | | |The PPS pulse train becomes free-running on the successful execution of this command + * | | |* 0111-1111: Reserved + * |[4] |PPSEN0 |Flexible PPS Output Mode Enable + * | | |When set low, Bits[3:0] function as PPSCTL (backward compatible) + * | | |When set high, Bits[3:0] function as PPSCMD. + * |[6:5] |TRGTMODSEL0|Target Time Register Mode for PPS0 Output + * | | |This field indicates the Target Time registers (register 455 and 456) mode for PPS0 output signal: + * | | |00: Indicates that the Target Time registers are programmed only for generating the interrupt event. + * | | |01: Reserved + * | | |10: Indicates that the Target Time registers are programmed for generating the interrupt event and starting or stopping the generation of the PPS0 output signal. + * | | |11: Indicates that the Target Time registers are programmed only for starting or stopping the generation of the PPS0 output signal + * | | |No interrupt is asserted. + * @var GMAC_T::PPSINTVL + * Offset: 0x760 Register 472 (PPS0 Interval Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |PPSINT |PPS0 Output Signal Interval + * | | |These bits store the interval between the rising edges of PPS0 signal output in terms of units of sub-second increment value + * | | |You need to program one value less than the required interval + * | | |For example, if the PTP reference clock is 50 MHz (period of 20ns), and desired interval between rising edges of PPS0 signal output is 100ns (that is, five units of sub-second increment value), then you should program value 4 (5 -1) in this register. + * @var GMAC_T::PPSWDTH + * Offset: 0x764 Register 473 (PPS0 PPSWDTH Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |PPSWIDTH |PPS0 Output Signal PPSWDTH + * | | |These bits store the width between the rising edge and corresponding falling edge of the PPS0 signal output in terms of units of sub-second increment value. + * | | |You need to program one value less than the required interval + * | | |For example, if PTP reference clock is 50 MHz (period of 20ns), and desired width between the rising and corresponding falling edges of PPS0 signal output is 80ns (that is, four units of sub-second increment value), then you should program value 3 (4-1) in this register. + * | | |Note: The value programmed in this register must be lesser than the value programmed in Register 472 (PPS0 Interval Register). + */ + + __IO uint32_t MACCFG; /*!< [0x0000] Register 0 (MAC Configuration Register) */ + __IO uint32_t MACFRMFLTR; /*!< [0x0004] Register 1 (MAC Frame Filter) */ + __I uint32_t RESERVE0[2]; + __IO uint32_t GMIIADDR; /*!< [0x0010] Register 4 (GMII Address Register) */ + __IO uint32_t GMIIDATA; /*!< [0x0014] Register 5 (GMII Data Register) */ + __IO uint32_t FLOWCTL; /*!< [0x0018] Register 6 (Flow Control Register) */ + __IO uint32_t VLANTAG; /*!< [0x001c] Register 7 (VLAN Tag Register) */ + __IO uint32_t VERSION; /*!< [0x0020] Register 8 (Version Register) */ + __I uint32_t REGREGDEBUG; /*!< [0x0024] Register 9 (Debug Register) */ + __I uint32_t RESERVE1[1]; + __IO uint32_t PMTCTLSTS; /*!< [0x002c] Register 11 (PMT Control and Status Register) */ + __IO uint32_t LPICTLSTS; /*!< [0x0030] Register 12 (LPI Control and Status Register) */ + __IO uint32_t LPITMRCTL; /*!< [0x0034] Register 13 (LPI Timers Control Register) */ + __I uint32_t INTSTS; /*!< [0x0038] Register 14 (Interrupt Status Register) */ + __IO uint32_t INTMSK; /*!< [0x003c] Register 15 (Interrupt Mask Register) */ + __IO uint32_t MACADDR0H; /*!< [0x0040] Register 16 (MAC Address0 High Register) */ + __IO uint32_t MACADDR0L; /*!< [0x0044] Register 17 (MAC Address0 Low Register) */ + __IO uint32_t MACADDR1H; /*!< [0x0048] Register 18 (MAC Address1 High Register) */ + __IO uint32_t MACADDR1L; /*!< [0x004c] Register 19 (MAC Address1 Low Register) */ + __IO uint32_t MACADDR2H; /*!< [0x0050] Register 20 (MAC Address2 High Register) */ + __IO uint32_t MACADDR2L; /*!< [0x0054] Register 21 (MAC Address2 Low Register) */ + __IO uint32_t MACADDR3H; /*!< [0x0058] Register 22 (MAC Address3 High Register) */ + __IO uint32_t MACADDR3L; /*!< [0x005c] Register 23 (MAC Address3 Low Register) */ + __IO uint32_t MACADDR4H; /*!< [0x0060] Register 24 (MAC Address4 High Register) */ + __IO uint32_t MACADDR4L; /*!< [0x0064] Register 25 (MAC Address4 Low Register) */ + __IO uint32_t MACADDR5H; /*!< [0x0068] Register 26 (MAC Address5 High Register) */ + __IO uint32_t MACADDR5L; /*!< [0x006c] Register 27 (MAC Address5 Low Register) */ + __IO uint32_t MACADDR6H; /*!< [0x0070] Register 28 (MAC Address6 High Register) */ + __IO uint32_t MACADDR6L; /*!< [0x0074] Register 29 (MAC Address6 Low Register) */ + __IO uint32_t MACADDR7H; /*!< [0x0078] Register 30 (MAC Address7 High Register) */ + __IO uint32_t MACADDR7L; /*!< [0x007c] Register 31 (MAC Address7 Low Register) */ + __IO uint32_t MACADDR8H; /*!< [0x0080] Register 32 (MAC Address8 High Register) */ + __IO uint32_t MACADDR8L; /*!< [0x0084] Register 33 (MAC Address8 Low Register) */ + __I uint32_t RESERVE2[20]; + __I uint32_t RGMIICTLSTS; /*!< [0x00d8] Register 54 (RGMII Status Register) */ + __IO uint32_t WDTOUT; /*!< [0x00dc] Register 55 (Watchdog Timeout Register) */ + __I uint32_t RESERVE3[297]; + __IO uint32_t VLANINCL; /*!< [0x0584] Register 353 (VLAN Tag Inclusion or Replacement Register) */ + __I uint32_t RESERVE4[94]; + __IO uint32_t TSCTL; /*!< [0x0700] Register 448 (Timestamp Control Register) */ + __IO uint32_t SSECINC; /*!< [0x0704] Register 449 (Sub-Second Increment Register) */ + __I uint32_t STSEC; /*!< [0x0708] Register 450 (System Time - Seconds Register) */ + __I uint32_t STNSEC; /*!< [0x070c] Register 451 (System Time - Nanoseconds Register) */ + __IO uint32_t STSECU; /*!< [0x0710] Register 452 (System Time - Seconds Update Register) */ + __IO uint32_t STNSECU; /*!< [0x0714] Register 453 (System Time - Nanoseconds Update Register) */ + __IO uint32_t TSADDEND; /*!< [0x0718] Register 454 (Timestamp Addend Register) */ + __IO uint32_t TGTSEC; /*!< [0x071c] Register 455 (Target Time Seconds Register) */ + __IO uint32_t TGTNSEC; /*!< [0x0720] Register 456 (Target Time Nanoseconds Register) */ + __IO uint32_t STHSEC; /*!< [0x0724] Register 457 (System Time - Higher Word Seconds Register) */ + __I uint32_t TSSTS; /*!< [0x0728] Register 458 (Timestamp Status Register) */ + __IO uint32_t PPSCTL; /*!< [0x072c] Register 459 (PPS Control Register) */ + __I uint32_t RESERVE5[12]; + __IO uint32_t PPSINTVL; /*!< [0x0760] Register 472 (PPS0 Interval Register) */ + __IO uint32_t PPSWDTH; /*!< [0x0764] Register 473 (PPS0 Width Register) */ + +} GMAC_T; + + +/** + @addtogroup GMAC_CONST GMAC Bit Field Definition + Constant Definitions for GMAC Controller +@{ */ + +#define GMAC_MACCFG_PRELEN_Pos (0) /*!< GMAC_T::MACCFG: PRELEN Position */ +#define GMAC_MACCFG_PRELEN_Msk (0x3ul << GMAC_MACCFG_PRELEN_Pos) /*!< GMAC_T::MACCFG: PRELEN Mask */ + +#define GMAC_MACCFG_RE_Pos (2) /*!< GMAC_T::MACCFG: RE Position */ +#define GMAC_MACCFG_RE_Msk (0x1ul << GMAC_MACCFG_RE_Pos) /*!< GMAC_T::MACCFG: RE Mask */ + +#define GMAC_MACCFG_TE_Pos (3) /*!< GMAC_T::MACCFG: TE Position */ +#define GMAC_MACCFG_TE_Msk (0x1ul << GMAC_MACCFG_TE_Pos) /*!< GMAC_T::MACCFG: TE Mask */ + +#define GMAC_MACCFG_DC_Pos (4) /*!< GMAC_T::MACCFG: DC Position */ +#define GMAC_MACCFG_DC_Msk (0x1ul << GMAC_MACCFG_DC_Pos) /*!< GMAC_T::MACCFG: DC Mask */ + +#define GMAC_MACCFG_BL_Pos (5) /*!< GMAC_T::MACCFG: BL Position */ +#define GMAC_MACCFG_BL_Msk (0x3ul << GMAC_MACCFG_BL_Pos) /*!< GMAC_T::MACCFG: BL Mask */ + +#define GMAC_MACCFG_ACS_Pos (7) /*!< GMAC_T::MACCFG: ACS Position */ +#define GMAC_MACCFG_ACS_Msk (0x1ul << GMAC_MACCFG_ACS_Pos) /*!< GMAC_T::MACCFG: ACS Mask */ + +#define GMAC_MACCFG_LUD_Pos (8) /*!< GMAC_T::MACCFG: LUD Position */ +#define GMAC_MACCFG_LUD_Msk (0x1ul << GMAC_MACCFG_LUD_Pos) /*!< GMAC_T::MACCFG: LUD Mask */ + +#define GMAC_MACCFG_DR_Pos (9) /*!< GMAC_T::MACCFG: DR Position */ +#define GMAC_MACCFG_DR_Msk (0x1ul << GMAC_MACCFG_DR_Pos) /*!< GMAC_T::MACCFG: DR Mask */ + +#define GMAC_MACCFG_IPC_Pos (10) /*!< GMAC_T::MACCFG: IPC Position */ +#define GMAC_MACCFG_IPC_Msk (0x1ul << GMAC_MACCFG_IPC_Pos) /*!< GMAC_T::MACCFG: IPC Mask */ + +#define GMAC_MACCFG_DM_Pos (11) /*!< GMAC_T::MACCFG: DM Position */ +#define GMAC_MACCFG_DM_Msk (0x1ul << GMAC_MACCFG_DM_Pos) /*!< GMAC_T::MACCFG: DM Mask */ + +#define GMAC_MACCFG_LM_Pos (12) /*!< GMAC_T::MACCFG: LM Position */ +#define GMAC_MACCFG_LM_Msk (0x1ul << GMAC_MACCFG_LM_Pos) /*!< GMAC_T::MACCFG: LM Mask */ + +#define GMAC_MACCFG_DO_Pos (13) /*!< GMAC_T::MACCFG: DO Position */ +#define GMAC_MACCFG_DO_Msk (0x1ul << GMAC_MACCFG_DO_Pos) /*!< GMAC_T::MACCFG: DO Mask */ + +#define GMAC_MACCFG_FES_Pos (14) /*!< GMAC_T::MACCFG: FES Position */ +#define GMAC_MACCFG_FES_Msk (0x1ul << GMAC_MACCFG_FES_Pos) /*!< GMAC_T::MACCFG: FES Mask */ + +#define GMAC_MACCFG_PS_Pos (15) /*!< GMAC_T::MACCFG: PS Position */ +#define GMAC_MACCFG_PS_Msk (0x1ul << GMAC_MACCFG_PS_Pos) /*!< GMAC_T::MACCFG: PS Mask */ + +#define GMAC_MACCFG_DCRS_Pos (16) /*!< GMAC_T::MACCFG: DCRS Position */ +#define GMAC_MACCFG_DCRS_Msk (0x1ul << GMAC_MACCFG_DCRS_Pos) /*!< GMAC_T::MACCFG: DCRS Mask */ + +#define GMAC_MACCFG_IFG_Pos (17) /*!< GMAC_T::MACCFG: IFG Position */ +#define GMAC_MACCFG_IFG_Msk (0x7ul << GMAC_MACCFG_IFG_Pos) /*!< GMAC_T::MACCFG: IFG Mask */ + +#define GMAC_MACCFG_JE_Pos (20) /*!< GMAC_T::MACCFG: JE Position */ +#define GMAC_MACCFG_JE_Msk (0x1ul << GMAC_MACCFG_JE_Pos) /*!< GMAC_T::MACCFG: JE Mask */ + +#define GMAC_MACCFG_BE_Pos (21) /*!< GMAC_T::MACCFG: BE Position */ +#define GMAC_MACCFG_BE_Msk (0x1ul << GMAC_MACCFG_BE_Pos) /*!< GMAC_T::MACCFG: BE Mask */ + +#define GMAC_MACCFG_JD_Pos (22) /*!< GMAC_T::MACCFG: JD Position */ +#define GMAC_MACCFG_JD_Msk (0x1ul << GMAC_MACCFG_JD_Pos) /*!< GMAC_T::MACCFG: JD Mask */ + +#define GMAC_MACCFG_WD_Pos (23) /*!< GMAC_T::MACCFG: WD Position */ +#define GMAC_MACCFG_WD_Msk (0x1ul << GMAC_MACCFG_WD_Pos) /*!< GMAC_T::MACCFG: WD Mask */ + +#define GMAC_MACCFG_TC_Pos (24) /*!< GMAC_T::MACCFG: TC Position */ +#define GMAC_MACCFG_TC_Msk (0x1ul << GMAC_MACCFG_TC_Pos) /*!< GMAC_T::MACCFG: TC Mask */ + +#define GMAC_MACCFG_CST_Pos (25) /*!< GMAC_T::MACCFG: CST Position */ +#define GMAC_MACCFG_CST_Msk (0x1ul << GMAC_MACCFG_CST_Pos) /*!< GMAC_T::MACCFG: CST Mask */ + +#define GMAC_MACCFG_TWOKPE_Pos (27) /*!< GMAC_T::MACCFG: TWOKPE Position */ +#define GMAC_MACCFG_TWOKPE_Msk (0x1ul << GMAC_MACCFG_TWOKPE_Pos) /*!< GMAC_T::MACCFG: TWOKPE Mask */ + +#define GMAC_MACCFG_SARC_Pos (28) /*!< GMAC_T::MACCFG: SARC Position */ +#define GMAC_MACCFG_SARC_Msk (0x7ul << GMAC_MACCFG_SARC_Pos) /*!< GMAC_T::MACCFG: SARC Mask */ + +#define GMAC_MACFRMFLTR_PR_Pos (0) /*!< GMAC_T::MACFRMFLTR: PR Position */ +#define GMAC_MACFRMFLTR_PR_Msk (0x1ul << GMAC_MACFRMFLTR_PR_Pos) /*!< GMAC_T::MACFRMFLTR: PR Mask */ + +#define GMAC_MACFRMFLTR_DAIF_Pos (3) /*!< GMAC_T::MACFRMFLTR: DAIF Position */ +#define GMAC_MACFRMFLTR_DAIF_Msk (0x1ul << GMAC_MACFRMFLTR_DAIF_Pos) /*!< GMAC_T::MACFRMFLTR: DAIF Mask */ + +#define GMAC_MACFRMFLTR_PM_Pos (4) /*!< GMAC_T::MACFRMFLTR: PM Position */ +#define GMAC_MACFRMFLTR_PM_Msk (0x1ul << GMAC_MACFRMFLTR_PM_Pos) /*!< GMAC_T::MACFRMFLTR: PM Mask */ + +#define GMAC_MACFRMFLTR_DBF_Pos (5) /*!< GMAC_T::MACFRMFLTR: DBF Position */ +#define GMAC_MACFRMFLTR_DBF_Msk (0x1ul << GMAC_MACFRMFLTR_DBF_Pos) /*!< GMAC_T::MACFRMFLTR: DBF Mask */ + +#define GMAC_MACFRMFLTR_PCF_Pos (6) /*!< GMAC_T::MACFRMFLTR: PCF Position */ +#define GMAC_MACFRMFLTR_PCF_Msk (0x3ul << GMAC_MACFRMFLTR_PCF_Pos) /*!< GMAC_T::MACFRMFLTR: PCF Mask */ + +#define GMAC_MACFRMFLTR_SAIF_Pos (8) /*!< GMAC_T::MACFRMFLTR: SAIF Position */ +#define GMAC_MACFRMFLTR_SAIF_Msk (0x1ul << GMAC_MACFRMFLTR_SAIF_Pos) /*!< GMAC_T::MACFRMFLTR: SAIF Mask */ + +#define GMAC_MACFRMFLTR_SAF_Pos (9) /*!< GMAC_T::MACFRMFLTR: SAF Position */ +#define GMAC_MACFRMFLTR_SAF_Msk (0x1ul << GMAC_MACFRMFLTR_SAF_Pos) /*!< GMAC_T::MACFRMFLTR: SAF Mask */ + +#define GMAC_MACFRMFLTR_VTFE_Pos (16) /*!< GMAC_T::MACFRMFLTR: VTFE Position */ +#define GMAC_MACFRMFLTR_VTFE_Msk (0x1ul << GMAC_MACFRMFLTR_VTFE_Pos) /*!< GMAC_T::MACFRMFLTR: VTFE Mask */ + +#define GMAC_MACFRMFLTR_RA_Pos (31) /*!< GMAC_T::MACFRMFLTR: RA Position */ +#define GMAC_MACFRMFLTR_RA_Msk (0x1ul << GMAC_MACFRMFLTR_RA_Pos) /*!< GMAC_T::MACFRMFLTR: RA Mask */ + +#define GMAC_GMIIADDR_GB_Pos (0) /*!< GMAC_T::GMIIADDR: GB Position */ +#define GMAC_GMIIADDR_GB_Msk (0x1ul << GMAC_GMIIADDR_GB_Pos) /*!< GMAC_T::GMIIADDR: GB Mask */ + +#define GMAC_GMIIADDR_GW_Pos (1) /*!< GMAC_T::GMIIADDR: GW Position */ +#define GMAC_GMIIADDR_GW_Msk (0x1ul << GMAC_GMIIADDR_GW_Pos) /*!< GMAC_T::GMIIADDR: GW Mask */ + +#define GMAC_GMIIADDR_CR_Pos (2) /*!< GMAC_T::GMIIADDR: CR Position */ +#define GMAC_GMIIADDR_CR_Msk (0xful << GMAC_GMIIADDR_CR_Pos) /*!< GMAC_T::GMIIADDR: CR Mask */ + +#define GMAC_GMIIADDR_GR_Pos (6) /*!< GMAC_T::GMIIADDR: GR Position */ +#define GMAC_GMIIADDR_GR_Msk (0x1ful << GMAC_GMIIADDR_GR_Pos) /*!< GMAC_T::GMIIADDR: GR Mask */ + +#define GMAC_GMIIADDR_PA_Pos (11) /*!< GMAC_T::GMIIADDR: PA Position */ +#define GMAC_GMIIADDR_PA_Msk (0x1ful << GMAC_GMIIADDR_PA_Pos) /*!< GMAC_T::GMIIADDR: PA Mask */ + +#define GMAC_GMII_Date_GD_Pos (0) /*!< GMAC_T::GMII_Date: GD Position */ +#define GMAC_GMII_Date_GD_Msk (0xfffful << GMAC_GMII_Date_GD_Pos) /*!< GMAC_T::GMII_Date: GD Mask */ + +#define GMAC_FLOWCTL_FCA_BPA_Pos (0) /*!< GMAC_T::FLOWCTL: FCA_BPA Position */ +#define GMAC_FLOWCTL_FCA_BPA_Msk (0x1ul << GMAC_FLOWCTL_FCA_BPA_Pos) /*!< GMAC_T::FLOWCTL: FCA_BPA Mask */ + +#define GMAC_FLOWCTL_TFE_Pos (1) /*!< GMAC_T::FLOWCTL: TFE Position */ +#define GMAC_FLOWCTL_TFE_Msk (0x1ul << GMAC_FLOWCTL_TFE_Pos) /*!< GMAC_T::FLOWCTL: TFE Mask */ + +#define GMAC_FLOWCTL_RFE_Pos (2) /*!< GMAC_T::FLOWCTL: RFE Position */ +#define GMAC_FLOWCTL_RFE_Msk (0x1ul << GMAC_FLOWCTL_RFE_Pos) /*!< GMAC_T::FLOWCTL: RFE Mask */ + +#define GMAC_FLOWCTL_UP_Pos (3) /*!< GMAC_T::FLOWCTL: UP Position */ +#define GMAC_FLOWCTL_UP_Msk (0x1ul << GMAC_FLOWCTL_UP_Pos) /*!< GMAC_T::FLOWCTL: UP Mask */ + +#define GMAC_FLOWCTL_PLT_Pos (4) /*!< GMAC_T::FLOWCTL: PLT Position */ +#define GMAC_FLOWCTL_PLT_Msk (0x3ul << GMAC_FLOWCTL_PLT_Pos) /*!< GMAC_T::FLOWCTL: PLT Mask */ + +#define GMAC_FLOWCTL_DZPQ_Pos (7) /*!< GMAC_T::FLOWCTL: DZPQ Position */ +#define GMAC_FLOWCTL_DZPQ_Msk (0x1ul << GMAC_FLOWCTL_DZPQ_Pos) /*!< GMAC_T::FLOWCTL: DZPQ Mask */ + +#define GMAC_FLOWCTL_PT_Pos (16) /*!< GMAC_T::FLOWCTL: PT Position */ +#define GMAC_FLOWCTL_PT_Msk (0xfffful << GMAC_FLOWCTL_PT_Pos) /*!< GMAC_T::FLOWCTL: PT Mask */ + +#define GMAC_VLANTAG_VL_Pos (0) /*!< GMAC_T::VLANTAG: VL Position */ +#define GMAC_VLANTAG_VL_Msk (0xfffful << GMAC_VLANTAG_VL_Pos) /*!< GMAC_T::VLANTAG: VL Mask */ + +#define GMAC_VLANTAG_ETV_Pos (16) /*!< GMAC_T::VLANTAG: ETV Position */ +#define GMAC_VLANTAG_ETV_Msk (0x1ul << GMAC_VLANTAG_ETV_Pos) /*!< GMAC_T::VLANTAG: ETV Mask */ + +#define GMAC_VLANTAG_VTIM_Pos (17) /*!< GMAC_T::VLANTAG: VTIM Position */ +#define GMAC_VLANTAG_VTIM_Msk (0x1ul << GMAC_VLANTAG_VTIM_Pos) /*!< GMAC_T::VLANTAG: VTIM Mask */ + +#define GMAC_VLANTAG_ESVL_Pos (18) /*!< GMAC_T::VLANTAG: ESVL Position */ +#define GMAC_VLANTAG_ESVL_Msk (0x1ul << GMAC_VLANTAG_ESVL_Pos) /*!< GMAC_T::VLANTAG: ESVL Mask */ + +#define GMAC_REGREGDEBUG_RPESTS_Pos (0) /*!< GMAC_T::REGDEBUG: RPESTS Position */ +#define GMAC_REGDEBUG_RPESTS_Msk (0x1ul << GMAC_REGDEBUG_RPESTS_Pos) /*!< GMAC_T::REGDEBUG: RPESTS Mask */ + +#define GMAC_REGDEBUG_RFCFCSTS_Pos (1) /*!< GMAC_T::REGDEBUG: RFCFCSTS Position */ +#define GMAC_REGDEBUG_RFCFCSTS_Msk (0x3ul << GMAC_REGDEBUG_RFCFCSTS_Pos) /*!< GMAC_T::REGDEBUG: RFCFCSTS Mask */ + +#define GMAC_REGDEBUG_RWCSTS_Pos (4) /*!< GMAC_T::REGDEBUG: RWCSTS Position */ +#define GMAC_REGDEBUG_RWCSTS_Msk (0x1ul << GMAC_REGDEBUG_RWCSTS_Pos) /*!< GMAC_T::REGDEBUG: RWCSTS Mask */ + +#define GMAC_REGDEBUG_RRCSTS_Pos (5) /*!< GMAC_T::REGDEBUG: RRCSTS Position */ +#define GMAC_REGDEBUG_RRCSTS_Msk (0x3ul << GMAC_REGDEBUG_RRCSTS_Pos) /*!< GMAC_T::REGDEBUG: RRCSTS Mask */ + +#define GMAC_REGDEBUG_RXFSTS_Pos (8) /*!< GMAC_T::REGDEBUG: RXFSTS Position */ +#define GMAC_REGDEBUG_RXFSTS_Msk (0x3ul << GMAC_REGDEBUG_RXFSTS_Pos) /*!< GMAC_T::REGDEBUG: RXFSTS Mask */ + +#define GMAC_REGDEBUG_TPESTS_Pos (16) /*!< GMAC_T::REGDEBUG: TPESTS Position */ +#define GMAC_REGDEBUG_TPESTS_Msk (0x1ul << GMAC_REGDEBUG_TPESTS_Pos) /*!< GMAC_T::REGDEBUG: TPESTS Mask */ + +#define GMAC_REGDEBUG_TFCSTS_Pos (17) /*!< GMAC_T::REGDEBUG: TFCSTS Position */ +#define GMAC_REGDEBUG_TFCSTS_Msk (0x3ul << GMAC_REGDEBUG_TFCSTS_Pos) /*!< GMAC_T::REGDEBUG: TFCSTS Mask */ + +#define GMAC_REGDEBUG_TXPAUSED_Pos (19) /*!< GMAC_T::REGDEBUG: TXPAUSED Position */ +#define GMAC_REGDEBUG_TXPAUSED_Msk (0x1ul << GMAC_REGDEBUG_TXPAUSED_Pos) /*!< GMAC_T::REGDEBUG: TXPAUSED Mask */ + +#define GMAC_REGDEBUG_TRCSTS_Pos (20) /*!< GMAC_T::REGDEBUG: TRCSTS Position */ +#define GMAC_REGDEBUG_TRCSTS_Msk (0x3ul << GMAC_REGDEBUG_TRCSTS_Pos) /*!< GMAC_T::REGDEBUG: TRCSTS Mask */ + +#define GMAC_REGDEBUG_TWCSTS_Pos (22) /*!< GMAC_T::REGDEBUG: TWCSTS Position */ +#define GMAC_REGDEBUG_TWCSTS_Msk (0x1ul << GMAC_REGDEBUG_TWCSTS_Pos) /*!< GMAC_T::REGDEBUG: TWCSTS Mask */ + +#define GMAC_REGDEBUG_TXFSTS_Pos (24) /*!< GMAC_T::REGDEBUG: TXFSTS Position */ +#define GMAC_REGDEBUG_TXFSTS_Msk (0x1ul << GMAC_REGDEBUG_TXFSTS_Pos) /*!< GMAC_T::REGDEBUG: TXFSTS Mask */ + +#define GMAC_REGDEBUG_TXSTSFSTS_Pos (25) /*!< GMAC_T::REGDEBUG: TXSTSFSTS Position */ +#define GMAC_REGDEBUG_TXSTSFSTS_Msk (0x1ul << GMAC_REGDEBUG_TXSTSFSTS_Pos) /*!< GMAC_T::REGDEBUG: TXSTSFSTS Mask */ + +#define GMAC_PMTCTLSTS_PWRDWN_Pos (0) /*!< GMAC_T::PMTCTLSTS: PWRDWN Position*/ +#define GMAC_PMTCTLSTS_PWRDWN_Msk (0x1ul << GMAC_PMTCTLSTS_PWRDWN_Pos) /*!< GMAC_T::PMTCTLSTS: PWRDWN Mask */ + +#define GMAC_PMTCTLSTS_MGKPKTEN_Pos (1) /*!< GMAC_T::PMTCTLSTS: MGKPKTEN Position*/ +#define GMAC_PMTCTLSTS_MGKPKTEN_Msk (0x1ul << GMAC_PMTCTLSTS_MGKPKTEN_Pos) /*!< GMAC_T::PMTCTLSTS: MGKPKTEN Mask */ + +#define GMAC_PMTCTLSTS_MGKPRCVD_Pos (5) /*!< GMAC_T::PMTCTLSTS: MGKPRCVD Position*/ +#define GMAC_PMTCTLSTS_MGKPRCVD_Msk (0x1ul << GMAC_PMTCTLSTS_MGKPRCVD_Pos) /*!< GMAC_T::PMTCTLSTS: MGKPRCVD Mask */ + +#define GMAC_LPICTLSTS_TLPIEN_Pos (0) /*!< GMAC_T::LPICTLSTS: TLPIEN Position*/ +#define GMAC_LPICTLSTS_TLPIEN_Msk (0x1ul << GMAC_LPICTLSTS_TLPIEN_Pos) /*!< GMAC_T::LPICTLSTS: TLPIEN Mask */ + +#define GMAC_LPICTLSTS_TLPIEX_Pos (1) /*!< GMAC_T::LPICTLSTS: TLPIEX Position*/ +#define GMAC_LPICTLSTS_TLPIEX_Msk (0x1ul << GMAC_LPICTLSTS_TLPIEX_Pos) /*!< GMAC_T::LPICTLSTS: TLPIEX Mask */ + +#define GMAC_LPICTLSTS_RLPIEN_Pos (2) /*!< GMAC_T::LPICTLSTS: RLPIEN Position*/ +#define GMAC_LPICTLSTS_RLPIEN_Msk (0x1ul << GMAC_LPICTLSTS_RLPIEN_Pos) /*!< GMAC_T::LPICTLSTS: RLPIEN Mask */ + +#define GMAC_LPICTLSTS_RLPIEX_Pos (3) /*!< GMAC_T::LPICTLSTS: RLPIEX Position*/ +#define GMAC_LPICTLSTS_RLPIEX_Msk (0x1ul << GMAC_LPICTLSTS_RLPIEX_Pos) /*!< GMAC_T::LPICTLSTS: RLPIEX Mask */ + +#define GMAC_LPICTLSTS_TLPIST_Pos (8) /*!< GMAC_T::LPICTLSTS: TLPIST Position*/ +#define GMAC_LPICTLSTS_TLPIST_Msk (0x1ul << GMAC_LPICTLSTS_TLPIST_Pos) /*!< GMAC_T::LPICTLSTS: TLPIST Mask */ + +#define GMAC_LPICTLSTS_RLPIST_Pos (9) /*!< GMAC_T::LPICTLSTS: RLPIST Position*/ +#define GMAC_LPICTLSTS_RLPIST_Msk (0x1ul << GMAC_LPICTLSTS_RLPIST_Pos) /*!< GMAC_T::LPICTLSTS: RLPIST Mask */ + +#define GMAC_LPICTLSTS_LPIEN_Pos (16) /*!< GMAC_T::LPICTLSTS: LPIEN Position */ +#define GMAC_LPICTLSTS_LPIEN_Msk (0x1ul << GMAC_LPICTLSTS_LPIEN_Pos) /*!< GMAC_T::LPICTLSTS: LPIEN Mask */ + +#define GMAC_LPICTLSTS_PLS_Pos (17) /*!< GMAC_T::LPICTLSTS: PLS Position */ +#define GMAC_LPICTLSTS_PLS_Msk (0x1ul << GMAC_LPICTLSTS_PLS_Pos) /*!< GMAC_T::LPICTLSTS: PLS Mask */ + +#define GMAC_LPICTLSTS_PLSEN_Pos (18) /*!< GMAC_T::LPICTLSTS: PLSEN Position */ +#define GMAC_LPICTLSTS_PLSEN_Msk (0x1ul << GMAC_LPICTLSTS_PLSEN_Pos) /*!< GMAC_T::LPICTLSTS: PLSEN Mask */ + +#define GMAC_LPICTLSTS_LPITXA_Pos (19) /*!< GMAC_T::LPICTLSTS: LPITXA Position*/ +#define GMAC_LPICTLSTS_LPITXA_Msk (0x1ul << GMAC_LPICTLSTS_LPITXA_Pos) /*!< GMAC_T::LPICTLSTS: LPITXA Mask */ + +#define GMAC_LPITMRCTL_TWT_Pos (0) /*!< GMAC_T::LPITMRCTL: TWT Position */ +#define GMAC_LPITMRCTL_TWT_Msk (0xfffful << GMAC_LPITMRCTL_TWT_Pos) /*!< GMAC_T::LPITMRCTL: TWT Mask */ + +#define GMAC_LPITMRCTL_LST_Pos (16) /*!< GMAC_T::LPITMRCTL: LST Position */ +#define GMAC_LPITMRCTL_LST_Msk (0x3fful << GMAC_LPITMRCTL_LST_Pos) /*!< GMAC_T::LPITMRCTL: LST Mask */ + +#define GMAC_INTSTS_RGSMIIIS_Pos (0) /*!< GMAC_T::INTSTS: RGSMIIIS Position */ +#define GMAC_INTSTS_RGSMIIIS_Msk (0x1ul << GMAC_INTSTS_RGSMIIIS_Pos) /*!< GMAC_T::INTSTS: RGSMIIIS Mask */ + +#define GMAC_INTSTS_PMTIS_Pos (3) /*!< GMAC_T::INTSTS: PMTIS Position */ +#define GMAC_INTSTS_PMTIS_Msk (0x1ul << GMAC_INTSTS_PMTIS_Pos) /*!< GMAC_T::INTSTS: PMTIS Mask */ + +#define GMAC_INTSTS_TSIS_Pos (9) /*!< GMAC_T::INTSTS: TSIS Position */ +#define GMAC_INTSTS_TSIS_Msk (0x1ul << GMAC_INTSTS_TSIS_Pos) /*!< GMAC_T::INTSTS: TSIS Mask */ + +#define GMAC_INTSTS_LPIIS_Pos (10) /*!< GMAC_T::INTSTS: LPIIS Position */ +#define GMAC_INTSTS_LPIIS_Msk (0x1ul << GMAC_INTSTS_LPIIS_Pos) /*!< GMAC_T::INTSTS: LPIIS Mask */ + +#define GMAC_INTMSK_RGSMIIIM_Pos (0) /*!< GMAC_T::INTMSK: RGSMIIIM Position */ +#define GMAC_INTMSK_RGSMIIIM_Msk (0x1ul << GMAC_INTMSK_RGSMIIIM_Pos) /*!< GMAC_T::INTMSK: RGSMIIIM INTMSK */ + +#define GMAC_INTMSK_PCSLCHGIM_Pos (1) /*!< GMAC_T::INTMSK: PCSLCHGIM Position */ +#define GMAC_INTMSK_PCSLCHGIM_Msk (0x1ul << GMAC_INTMSK_PCSLCHGIM_Pos) /*!< GMAC_T::INTMSK: PCSLCHGIM INTMSK */ + +#define GMAC_INTMSK_PCSANCIM_Pos (2) /*!< GMAC_T::INTMSK: PCSANCIM Position */ +#define GMAC_INTMSK_PCSANCIM_Msk (0x1ul << GMAC_INTMSK_PCSANCIM_Pos) /*!< GMAC_T::INTMSK: PCSANCIM INTMSK */ + +#define GMAC_INTMSK_PMTIM_Pos (3) /*!< GMAC_T::INTMSK: PMTIM Position */ +#define GMAC_INTMSK_PMTIM_Msk (0x1ul << GMAC_INTMSK_PMTIM_Pos) /*!< GMAC_T::INTMSK: PMTIM INTMSK */ + +#define GMAC_INTMSK_TSIM_Pos (9) /*!< GMAC_T::INTMSK: TSIM Position */ +#define GMAC_INTMSK_TSIM_Msk (0x1ul << GMAC_INTMSK_TSIM_Pos) /*!< GMAC_T::INTMSK: TSIM INTMSK */ + +#define GMAC_INTMSK_LPIIM_Pos (10) /*!< GMAC_T::INTMSK: LPIIM Position */ +#define GMAC_INTMSK_LPIIM_Msk (0x1ul << GMAC_INTMSK_LPIIM_Pos) /*!< GMAC_T::INTMSK: LPIIM INTMSK */ + +#define GMAC_MACADDR0H_ADDRHI_Pos (0) /*!< GMAC_T::MACADDR0H: ADDRHI Position */ +#define GMAC_MACADDR0H_ADDRHI_Msk (0xfffful << GMAC_MACADDR0H_ADDRHI_Pos) /*!< GMAC_T::MACADDR0H: ADDRHI Mask */ + +#define GMAC_MACADDR0H_AE_Pos (31) /*!< GMAC_T::MACADDR0H: AE Position */ +#define GMAC_MACADDR0H_AE_Msk (0x1ul << GMAC_MACADDR0H_AE_Pos) /*!< GMAC_T::MACADDR0H: AE Mask */ + +#define GMAC_MACADDR0L_ADDRLO_Pos (0) /*!< GMAC_T::MACADDR0L: ADDRLO Position */ +#define GMAC_MACADDR0L_ADDRLO_Msk (0xfffffffful << GMAC_MACADDR0L_ADDRLO_Pos) /*!< GMAC_T::MACADDR0L: ADDRLO Mask */ + +#define GMAC_MACADDR1H_ADDRHI_Pos (0) /*!< GMAC_T::MACADDR1H: ADDRHI Position */ +#define GMAC_MACADDR1H_ADDRHI_Msk (0xfffful << GMAC_MACADDR1H_ADDRHI_Pos) /*!< GMAC_T::MACADDR1H: ADDRHI Mask */ + +#define GMAC_MACADDR1H_MBC_Pos (24) /*!< GMAC_T::MACADDR1H: MBC Position */ +#define GMAC_MACADDR1H_MBC_Msk (0x3ful << GMAC_MACADDR1H_MBC_Pos) /*!< GMAC_T::MACADDR1H: MBC Mask */ + +#define GMAC_MACADDR1H_SA_Pos (30) /*!< GMAC_T::MACADDR1H: SA Position */ +#define GMAC_MACADDR1H_SA_Msk (0x1ul << GMAC_MACADDR1H_SA_Pos) /*!< GMAC_T::MACADDR1H: SA Mask */ + +#define GMAC_MACADDR1H_AE_Pos (31) /*!< GMAC_T::MACADDR1H: AE Position */ +#define GMAC_MACADDR1H_AE_Msk (0x1ul << GMAC_MACADDR1H_AE_Pos) /*!< GMAC_T::MACADDR1H: AE Mask */ + +#define GMAC_MACADDR1L_ADDRLO_Pos (0) /*!< GMAC_T::MACADDR1L: ADDRLO Position */ +#define GMAC_MACADDR1L_ADDRLO_Msk (0xfffffffful << GMAC_MACADDR1L_ADDRLO_Pos) /*!< GMAC_T::MACADDR1L: ADDRLO Mask */ + +#define GMAC_MACADDR2H_ADDRHI_Pos (0) /*!< GMAC_T::MACADDR2H: ADDRHI Position */ +#define GMAC_MACADDR2H_ADDRHI_Msk (0xfffful << GMAC_MACADDR2H_ADDRHI_Pos) /*!< GMAC_T::MACADDR2H: ADDRHI Mask */ + +#define GMAC_MACADDR2H_MBC_Pos (24) /*!< GMAC_T::MACADDR2H: MBC Position */ +#define GMAC_MACADDR2H_MBC_Msk (0x3ful << GMAC_MACADDR2H_MBC_Pos) /*!< GMAC_T::MACADDR2H: MBC Mask */ + +#define GMAC_MACADDR2H_SA_Pos (30) /*!< GMAC_T::MACADDR2H: SA Position */ +#define GMAC_MACADDR2H_SA_Msk (0x1ul << GMAC_MACADDR2H_SA_Pos) /*!< GMAC_T::MACADDR2H: SA Mask */ + +#define GMAC_MACADDR2H_AE_Pos (31) /*!< GMAC_T::MACADDR2H: AE Position */ +#define GMAC_MACADDR2H_AE_Msk (0x1ul << GMAC_MACADDR2H_AE_Pos) /*!< GMAC_T::MACADDR2H: AE Mask */ + +#define GMAC_MACADDR2L_ADDRLO_Pos (0) /*!< GMAC_T::MACADDR2L: ADDRLO Position */ +#define GMAC_MACADDR2L_ADDRLO_Msk (0xfffffffful << GMAC_MACADDR2L_ADDRLO_Pos) /*!< GMAC_T::MACADDR2L: ADDRLO Mask */ + +#define GMAC_MACADDR3H_ADDRHI_Pos (0) /*!< GMAC_T::MACADDR3H: ADDRHI Position */ +#define GMAC_MACADDR3H_ADDRHI_Msk (0xfffful << GMAC_MACADDR3H_ADDRHI_Pos) /*!< GMAC_T::MACADDR3H: ADDRHI Mask */ + +#define GMAC_MACADDR3H_MBC_Pos (24) /*!< GMAC_T::MACADDR3H: MBC Position */ +#define GMAC_MACADDR3H_MBC_Msk (0x3ful << GMAC_MACADDR3H_MBC_Pos) /*!< GMAC_T::MACADDR3H: MBC Mask */ + +#define GMAC_MACADDR3H_SA_Pos (30) /*!< GMAC_T::MACADDR3H: SA Position */ +#define GMAC_MACADDR3H_SA_Msk (0x1ul << GMAC_MACADDR3H_SA_Pos) /*!< GMAC_T::MACADDR3H: SA Mask */ + +#define GMAC_MACADDR3H_AE_Pos (31) /*!< GMAC_T::MACADDR3H: AE Position */ +#define GMAC_MACADDR3H_AE_Msk (0x1ul << GMAC_MACADDR3H_AE_Pos) /*!< GMAC_T::MACADDR3H: AE Mask */ + +#define GMAC_MACADDR3L_ADDRLO_Pos (0) /*!< GMAC_T::MACADDR3L: ADDRLO Position */ +#define GMAC_MACADDR3L_ADDRLO_Msk (0xfffffffful << GMAC_MACADDR3L_ADDRLO_Pos) /*!< GMAC_T::MACADDR3L: ADDRLO Mask */ + +#define GMAC_MACADDR4H_ADDRHI_Pos (0) /*!< GMAC_T::MACADDR4H: ADDRHI Position */ +#define GMAC_MACADDR4H_ADDRHI_Msk (0xfffful << GMAC_MACADDR4H_ADDRHI_Pos) /*!< GMAC_T::MACADDR4H: ADDRHI Mask */ + +#define GMAC_MACADDR4H_MBC_Pos (24) /*!< GMAC_T::MACADDR4H: MBC Position */ +#define GMAC_MACADDR4H_MBC_Msk (0x3ful << GMAC_MACADDR4H_MBC_Pos) /*!< GMAC_T::MACADDR4H: MBC Mask */ + +#define GMAC_MACADDR4H_SA_Pos (30) /*!< GMAC_T::MACADDR4H: SA Position */ +#define GMAC_MACADDR4H_SA_Msk (0x1ul << GMAC_MACADDR4H_SA_Pos) /*!< GMAC_T::MACADDR4H: SA Mask */ + +#define GMAC_MACADDR4H_AE_Pos (31) /*!< GMAC_T::MACADDR4H: AE Position */ +#define GMAC_MACADDR4H_AE_Msk (0x1ul << GMAC_MACADDR4H_AE_Pos) /*!< GMAC_T::MACADDR4H: AE Mask */ + +#define GMAC_MACADDR4L_ADDRLO_Pos (0) /*!< GMAC_T::MACADDR4L: ADDRLO Position */ +#define GMAC_MACADDR4L_ADDRLO_Msk (0xfffffffful << GMAC_MACADDR4L_ADDRLO_Pos) /*!< GMAC_T::MACADDR4L: ADDRLO Mask */ + +#define GMAC_MACADDR5H_ADDRHI_Pos (0) /*!< GMAC_T::MACADDR5H: ADDRHI Position */ +#define GMAC_MACADDR5H_ADDRHI_Msk (0xfffful << GMAC_MACADDR5H_ADDRHI_Pos) /*!< GMAC_T::MACADDR5H: ADDRHI Mask */ + +#define GMAC_MACADDR5H_MBC_Pos (24) /*!< GMAC_T::MACADDR5H: MBC Position */ +#define GMAC_MACADDR5H_MBC_Msk (0x3ful << GMAC_MACADDR5H_MBC_Pos) /*!< GMAC_T::MACADDR5H: MBC Mask */ + +#define GMAC_MACADDR5H_SA_Pos (30) /*!< GMAC_T::MACADDR5H: SA Position */ +#define GMAC_MACADDR5H_SA_Msk (0x1ul << GMAC_MACADDR5H_SA_Pos) /*!< GMAC_T::MACADDR5H: SA Mask */ + +#define GMAC_MACADDR5H_AE_Pos (31) /*!< GMAC_T::MACADDR5H: AE Position */ +#define GMAC_MACADDR5H_AE_Msk (0x1ul << GMAC_MACADDR5H_AE_Pos) /*!< GMAC_T::MACADDR5H: AE Mask */ + +#define GMAC_MACADDR5L_ADDRLO_Pos (0) /*!< GMAC_T::MACADDR5L: ADDRLO Position */ +#define GMAC_MACADDR5L_ADDRLO_Msk (0xfffffffful << GMAC_MACADDR5L_ADDRLO_Pos) /*!< GMAC_T::MACADDR5L: ADDRLO Mask */ + +#define GMAC_MACADDR6H_ADDRHI_Pos (0) /*!< GMAC_T::MACADDR6H: ADDRHI Position */ +#define GMAC_MACADDR6H_ADDRHI_Msk (0xfffful << GMAC_MACADDR6H_ADDRHI_Pos) /*!< GMAC_T::MACADDR6H: ADDRHI Mask */ + +#define GMAC_MACADDR6H_MBC_Pos (24) /*!< GMAC_T::MACADDR6H: MBC Position */ +#define GMAC_MACADDR6H_MBC_Msk (0x3ful << GMAC_MACADDR6H_MBC_Pos) /*!< GMAC_T::MACADDR6H: MBC Mask */ + +#define GMAC_MACADDR6H_SA_Pos (30) /*!< GMAC_T::MACADDR6H: SA Position */ +#define GMAC_MACADDR6H_SA_Msk (0x1ul << GMAC_MACADDR6H_SA_Pos) /*!< GMAC_T::MACADDR6H: SA Mask */ + +#define GMAC_MACADDR6H_AE_Pos (31) /*!< GMAC_T::MACADDR6H: AE Position */ +#define GMAC_MACADDR6H_AE_Msk (0x1ul << GMAC_MACADDR6H_AE_Pos) /*!< GMAC_T::MACADDR6H: AE Mask */ + +#define GMAC_MACADDR6L_ADDRLO_Pos (0) /*!< GMAC_T::MACADDR6L: ADDRLO Position */ +#define GMAC_MACADDR6L_ADDRLO_Msk (0xfffffffful << GMAC_MACADDR6L_ADDRLO_Pos) /*!< GMAC_T::MACADDR6L: ADDRLO Mask */ + +#define GMAC_MACADDR7H_ADDRHI_Pos (0) /*!< GMAC_T::MACADDR7H: ADDRHI Position */ +#define GMAC_MACADDR7H_ADDRHI_Msk (0xfffful << GMAC_MACADDR7H_ADDRHI_Pos) /*!< GMAC_T::MACADDR7H: ADDRHI Mask */ + +#define GMAC_MACADDR7H_MBC_Pos (24) /*!< GMAC_T::MACADDR7H: MBC Position */ +#define GMAC_MACADDR7H_MBC_Msk (0x3ful << GMAC_MACADDR7H_MBC_Pos) /*!< GMAC_T::MACADDR7H: MBC Mask */ + +#define GMAC_MACADDR7H_SA_Pos (30) /*!< GMAC_T::MACADDR7H: SA Position */ +#define GMAC_MACADDR7H_SA_Msk (0x1ul << GMAC_MACADDR7H_SA_Pos) /*!< GMAC_T::MACADDR7H: SA Mask */ + +#define GMAC_MACADDR7H_AE_Pos (31) /*!< GMAC_T::MACADDR7H: AE Position */ +#define GMAC_MACADDR7H_AE_Msk (0x1ul << GMAC_MACADDR7H_AE_Pos) /*!< GMAC_T::MACADDR7H: AE Mask */ + +#define GMAC_MACADDR7L_ADDRLO_Pos (0) /*!< GMAC_T::MACADDR7L: ADDRLO Position */ +#define GMAC_MACADDR7L_ADDRLO_Msk (0xfffffffful << GMAC_MACADDR7L_ADDRLO_Pos) /*!< GMAC_T::MACADDR7L: ADDRLO Mask */ + +#define GMAC_MACADDR8H_ADDRHI_Pos (0) /*!< GMAC_T::MACADDR8H: ADDRHI Position */ +#define GMAC_MACADDR8H_ADDRHI_Msk (0xfffful << GMAC_MACADDR8H_ADDRHI_Pos) /*!< GMAC_T::MACADDR8H: ADDRHI Mask */ + +#define GMAC_MACADDR8H_MBC_Pos (24) /*!< GMAC_T::MACADDR8H: MBC Position */ +#define GMAC_MACADDR8H_MBC_Msk (0x3ful << GMAC_MACADDR8H_MBC_Pos) /*!< GMAC_T::MACADDR8H: MBC Mask */ + +#define GMAC_MACADDR8H_SA_Pos (30) /*!< GMAC_T::MACADDR8H: SA Position */ +#define GMAC_MACADDR8H_SA_Msk (0x1ul << GMAC_MACADDR8H_SA_Pos) /*!< GMAC_T::MACADDR8H: SA Mask */ + +#define GMAC_MACADDR8H_AE_Pos (31) /*!< GMAC_T::MACADDR8H: AE Position */ +#define GMAC_MACADDR8H_AE_Msk (0x1ul << GMAC_MACADDR8H_AE_Pos) /*!< GMAC_T::MACADDR8H: AE Mask */ + +#define GMAC_MACADDR8L_ADDRLO_Pos (0) /*!< GMAC_T::MACADDR8L: ADDRLO Position */ +#define GMAC_MACADDR8L_ADDRLO_Msk (0xfffffffful << GMAC_MACADDR8L_ADDRLO_Pos) /*!< GMAC_T::MACADDR8L: ADDRLO Mask */ + +#define GMAC_RGMIICTLSTS_LNKMOD_Pos (0) /*!< GMAC_T::RGMIICTLSTS: LNKMOD Position*/ +#define GMAC_RGMIICTLSTS_LNKMOD_Msk (0x1ul << GMAC_RGMIICTLSTS_LNKMOD_Pos) /*!< GMAC_T::RGMIICTLSTS: LNKMOD Mask */ + +#define GMAC_RGMIICTLSTS_LNKSPEED_Pos (1) /*!< GMAC_T::RGMIICTLSTS: LNKSPEED Position*/ +#define GMAC_RGMIICTLSTS_LNKSPEED_Msk (0x3ul << GMAC_RGMIICTLSTS_LNKSPEED_Pos) /*!< GMAC_T::RGMIICTLSTS: LNKSPEED Mask */ + +#define GMAC_RGMIICTLSTS_LNKSTS_Pos (3) /*!< GMAC_T::RGMIICTLSTS: LNKSTS Position*/ +#define GMAC_RGMIICTLSTS_LNKSTS_Msk (0x1ul << GMAC_RGMIICTLSTS_LNKSTS_Pos) /*!< GMAC_T::RGMIICTLSTS: LNKSTS Mask */ + +#define GMAC_WDTOUT_WTO_Pos (0) /*!< GMAC_T::WDTOUT: WTO Position */ +#define GMAC_WDTOUT_WTO_Msk (0x3ffful << GMAC_WDTOUT_WTO_Pos) /*!< GMAC_T::WDTOUT: WTO Mask */ + +#define GMAC_WDTOUT_PWE_Pos (16) /*!< GMAC_T::WDTOUT: PWE Position */ +#define GMAC_WDTOUT_PWE_Msk (0x1ul << GMAC_WDTOUT_PWE_Pos) /*!< GMAC_T::WDTOUT: PWE Mask */ + +#define GMAC_VLANINCL_VLT_Pos (0) /*!< GMAC_T::VLANINCL: VLT Position */ +#define GMAC_VLANINCL_VLT_Msk (0xfffful << GMAC_VLANINCL_VLT_Pos) /*!< GMAC_T::VLANINCL: VLT Mask */ + +#define GMAC_VLANINCL_VLC_Pos (16) /*!< GMAC_T::VLANINCL: VLC Position */ +#define GMAC_VLANINCL_VLC_Msk (0x3ul << GMAC_VLANINCL_VLC_Pos) /*!< GMAC_T::VLANINCL: VLC Mask */ + +#define GMAC_VLANINCL_VLP_Pos (18) /*!< GMAC_T::VLANINCL: VLP Position */ +#define GMAC_VLANINCL_VLP_Msk (0x1ul << GMAC_VLANINCL_VLP_Pos) /*!< GMAC_T::VLANINCL: VLP Mask */ + +#define GMAC_VLANINCL_CSVL_Pos (19) /*!< GMAC_T::VLANINCL: CSVL Position */ +#define GMAC_VLANINCL_CSVL_Msk (0x1ul << GMAC_VLANINCL_CSVL_Pos) /*!< GMAC_T::VLANINCL: CSVL Mask */ + +#define GMAC_TSCTL_TSENA_Pos (0) /*!< GMAC_T::TSCTL: TSENA Position */ +#define GMAC_TSCTL_TSENA_Msk (0x1ul << GMAC_TSCTL_TSENA_Pos) /*!< GMAC_T::TSCTL: TSENA Mask */ + +#define GMAC_TSCTL_TSCFUPDT_Pos (1) /*!< GMAC_T::TSCTL: TSCFUPDT Position */ +#define GMAC_TSCTL_TSCFUPDT_Msk (0x1ul << GMAC_TSCTL_TSCFUPDT_Pos) /*!< GMAC_T::TSCTL: TSCFUPDT Mask */ + +#define GMAC_TSCTL_TSINIT_Pos (2) /*!< GMAC_T::TSCTL: TSINIT Position */ +#define GMAC_TSCTL_TSINIT_Msk (0x1ul << GMAC_TSCTL_TSINIT_Pos) /*!< GMAC_T::TSCTL: TSINIT Mask */ + +#define GMAC_TSCTL_TSUPDT_Pos (3) /*!< GMAC_T::TSCTL: TSUPDT Position */ +#define GMAC_TSCTL_TSUPDT_Msk (0x1ul << GMAC_TSCTL_TSUPDT_Pos) /*!< GMAC_T::TSCTL: TSUPDT Mask */ + +#define GMAC_TSCTL_TSTRIG_Pos (4) /*!< GMAC_T::TSCTL: TSTRIG Position */ +#define GMAC_TSCTL_TSTRIG_Msk (0x1ul << GMAC_TSCTL_TSTRIG_Pos) /*!< GMAC_T::TSCTL: TSTRIG Mask */ + +#define GMAC_TSCTL_TSADDREG_Pos (5) /*!< GMAC_T::TSCTL: TSADDREG Position */ +#define GMAC_TSCTL_TSADDREG_Msk (0x1ul << GMAC_TSCTL_TSADDREG_Pos) /*!< GMAC_T::TSCTL: TSADDREG Mask */ + +#define GMAC_TSCTL_TSENALL_Pos (8) /*!< GMAC_T::TSCTL: TSENALL Position */ +#define GMAC_TSCTL_TSENALL_Msk (0x1ul << GMAC_TSCTL_TSENALL_Pos) /*!< GMAC_T::TSCTL: TSENALL Mask */ + +#define GMAC_TSCTL_TSCTRLSSR_Pos (9) /*!< GMAC_T::TSCTL: TSCTRLSSR Position */ +#define GMAC_TSCTL_TSCTRLSSR_Msk (0x1ul << GMAC_TSCTL_TSCTRLSSR_Pos) /*!< GMAC_T::TSCTL: TSCTRLSSR Mask */ + +#define GMAC_TSCTL_TSVER2ENA_Pos (10) /*!< GMAC_T::TSCTL: TSVER2ENA Position */ +#define GMAC_TSCTL_TSVER2ENA_Msk (0x1ul << GMAC_TSCTL_TSVER2ENA_Pos) /*!< GMAC_T::TSCTL: TSVER2ENA Mask */ + +#define GMAC_TSCTL_TSIPENA_Pos (11) /*!< GMAC_T::TSCTL: TSIPENA Position */ +#define GMAC_TSCTL_TSIPENA_Msk (0x1ul << GMAC_TSCTL_TSIPENA_Pos) /*!< GMAC_T::TSCTL: TSIPENA Mask */ + +#define GMAC_TSCTL_TSIPV6ENA_Pos (12) /*!< GMAC_T::TSCTL: TSIPV6ENA Position */ +#define GMAC_TSCTL_TSIPV6ENA_Msk (0x1ul << GMAC_TSCTL_TSIPV6ENA_Pos) /*!< GMAC_T::TSCTL: TSIPV6ENA Mask */ + +#define GMAC_TSCTL_TSIPV4ENA_Pos (13) /*!< GMAC_T::TSCTL: TSIPV4ENA Position */ +#define GMAC_TSCTL_TSIPV4ENA_Msk (0x1ul << GMAC_TSCTL_TSIPV4ENA_Pos) /*!< GMAC_T::TSCTL: TSIPV4ENA Mask */ + +#define GMAC_TSCTL_TSEVNTENA_Pos (14) /*!< GMAC_T::TSCTL: TSEVNTENA Position */ +#define GMAC_TSCTL_TSEVNTENA_Msk (0x1ul << GMAC_TSCTL_TSEVNTENA_Pos) /*!< GMAC_T::TSCTL: TSEVNTENA Mask */ + +#define GMAC_TSCTL_TSMSTRENA_Pos (15) /*!< GMAC_T::TSCTL: TSMSTRENA Position */ +#define GMAC_TSCTL_TSMSTRENA_Msk (0x1ul << GMAC_TSCTL_TSMSTRENA_Pos) /*!< GMAC_T::TSCTL: TSMSTRENA Mask */ + +#define GMAC_TSCTL_SNAPTYPSEL_Pos (16) /*!< GMAC_T::TSCTL: SNAPTYPSEL Position */ +#define GMAC_TSCTL_SNAPTYPSEL_Msk (0x3ul << GMAC_TSCTL_SNAPTYPSEL_Pos) /*!< GMAC_T::TSCTL: SNAPTYPSEL Mask */ + +#define GMAC_TSCTL_TSENMACADDR_Pos (18) /*!< GMAC_T::TSCTL: TSENMACADDR Position */ +#define GMAC_TSCTL_TSENMACADDR_Msk (0x1ul << GMAC_TSCTL_TSENMACADDR_Pos) /*!< GMAC_T::TSCTL: TSENMACADDR Mask */ + +#define GMAC_SSECINC_SSINC_Pos (0) /*!< GMAC_T::SSECINC: SSINC Position */ +#define GMAC_SSECINC_SSINC_Msk (0xfful << GMAC_SSECINC_SSINC_Pos) /*!< GMAC_T::SSECINC: SSINC Mask */ + +#define GMAC_STSEC_TSS_Pos (0) /*!< GMAC_T::STSEC: TSS Position */ +#define GMAC_STSEC_TSS_Msk (0xfffffffful << GMAC_STSEC_TSS_Pos) /*!< GMAC_T::STSEC: TSS Mask */ + +#define GMAC_STNSEC_TSSS_Pos (0) /*!< GMAC_T::STNSEC: TSSS Position */ +#define GMAC_STNSEC_TSSS_Msk (0x7ffffffful << GMAC_STNSEC_TSSS_Pos) /*!< GMAC_T::STNSEC: TSSS Mask */ + +#define GMAC_STSECU_TSS_Pos (0) /*!< GMAC_T::STSECU: TSS Position */ +#define GMAC_STSECU_TSS_Msk (0xfffffffful << GMAC_STSECU_TSS_Pos) /*!< GMAC_T::STSECU: TSS Mask */ + +#define GMAC_STNSECU_TSSS_Pos (0) /*!< GMAC_T::STNSECU: TSSS Position */ +#define GMAC_STNSECU_TSSS_Msk (0x7ffffffful << GMAC_STNSECU_TSSS_Pos) /*!< GMAC_T::STNSECU: TSSS Mask */ + +#define GMAC_STNSECU_ADDSUB_Pos (31) /*!< GMAC_T::STNSECU: ADDSUB Position */ +#define GMAC_STNSECU_ADDSUB_Msk (0x1ul << GMAC_STNSECU_ADDSUB_Pos) /*!< GMAC_T::STNSECU: ADDSUB Mask */ + +#define GMAC_TSADDEND_TSAR_Pos (0) /*!< GMAC_T::TSADDEND: TSAR Position */ +#define GMAC_TSADDEND_TSAR_Msk (0xfffffffful << GMAC_TSADDEND_TSAR_Pos) /*!< GMAC_T::TSADDEND: TSAR Mask */ + +#define GMAC_TGTSEC_TSTR_Pos (0) /*!< GMAC_T::TGTSEC: TSTR Position */ +#define GMAC_TGTSEC_TSTR_Msk (0xfffffffful << GMAC_TGTSEC_TSTR_Pos) /*!< GMAC_T::TGTSEC: TSTR Mask */ + +#define GMAC_TGTNSEC_TTSLO_Pos (0) /*!< GMAC_T::TGTNSEC: TTSLO Position */ +#define GMAC_TGTNSEC_TTSLO_Msk (0x7ffffffful << GMAC_TGTNSEC_TTSLO_Pos) /*!< GMAC_T::TGTNSEC: TTSLO Mask */ + +#define GMAC_TGTNSEC_TRGTBUSY_Pos (31) /*!< GMAC_T::TGTNSEC: TRGTBUSY Position */ +#define GMAC_TGTNSEC_TRGTBUSY_Msk (0x1ul << GMAC_TGTNSEC_TRGTBUSY_Pos) /*!< GMAC_T::TGTNSEC: TRGTBUSY Mask */ + +#define GMAC_STHSEC_TSHWR_Pos (0) /*!< GMAC_T::STHSEC: TSHWR Position */ +#define GMAC_STHSEC_TSHWR_Msk (0xfffful << GMAC_STHSEC_TSHWR_Pos) /*!< GMAC_T::STHSEC: TSHWR Mask */ + +#define GMAC_TSSTS_TSSOVF_Pos (0) /*!< GMAC_T::TSSTS: TSSOVF Position */ +#define GMAC_TSSTS_TSSOVF_Msk (0x1ul << GMAC_TSSTS_TSSOVF_Pos) /*!< GMAC_T::TSSTS: TSSOVF Mask */ + +#define GMAC_TSSTS_TSTARGT_Pos (1) /*!< GMAC_T::TSSTS: TSTARGT Position */ +#define GMAC_TSSTS_TSTARGT_Msk (0x1ul << GMAC_TSSTS_TSTARGT_Pos) /*!< GMAC_T::TSSTS: TSTARGT Mask */ + +#define GMAC_TSSTS_AUXTSTRIG_Pos (2) /*!< GMAC_T::TSSTS: AUXTSTRIG Position */ +#define GMAC_TSSTS_AUXTSTRIG_Msk (0x1ul << GMAC_TSSTS_AUXTSTRIG_Pos) /*!< GMAC_T::TSSTS: AUXTSTRIG Mask */ + +#define GMAC_TSSTS_TSTRGTERR_Pos (3) /*!< GMAC_T::TSSTS: TSTRGTERR Position */ +#define GMAC_TSSTS_TSTRGTERR_Msk (0x1ul << GMAC_TSSTS_TSTRGTERR_Pos) /*!< GMAC_T::TSSTS: TSTRGTERR Mask */ + +#define GMAC_TSSTS_ATSSTN_Pos (16) /*!< GMAC_T::TSSTS: ATSSTN Position */ +#define GMAC_TSSTS_ATSSTN_Msk (0xful << GMAC_TSSTS_ATSSTN_Pos) /*!< GMAC_T::TSSTS: ATSSTN Mask */ + +#define GMAC_PPSCTL_PPSCTL_PPSCMD_Pos (0) /*!< GMAC_T::PPSCTL: PPSCTL_PPSCMD Position*/ +#define GMAC_PPSCTL_PPSCTL_PPSCMD_Msk (0xful << GMAC_PPSCTL_PPSCTL_PPSCMD_Pos) /*!< GMAC_T::PPSCTL: PPSCTL_PPSCMD Mask */ + +#define GMAC_PPSCTL_PPSEN0_Pos (4) /*!< GMAC_T::PPSCTL: PPSEN0 Position */ +#define GMAC_PPSCTL_PPSEN0_Msk (0x1ul << GMAC_PPSCTL_PPSEN0_Pos) /*!< GMAC_T::PPSCTL: PPSEN0 Mask */ + +#define GMAC_PPSCTL_TRGTMODSEL0_Pos (5) /*!< GMAC_T::PPSCTL: TRGTMODSEL0 Position */ +#define GMAC_PPSCTL_TRGTMODSEL0_Msk (0x3ul << GMAC_PPSCTL_TRGTMODSEL0_Pos) /*!< GMAC_T::PPSCTL: TRGTMODSEL0 Mask */ + +#define GMAC_PPSINTVL_PPSINT_Pos (0) /*!< GMAC_T::PPSINTVL: PPSINT Position */ +#define GMAC_PPSINTVL_PPSINT_Msk (0xfffffffful << GMAC_PPSINTVL_PPSINT_Pos) /*!< GMAC_T::PPSINTVL: PPSINT Mask */ + +#define GMAC_PPSWDTH_PPSWIDTH_Pos (0) /*!< GMAC_T::PPSWDTH: PPSWIDTH Position */ +#define GMAC_PPSWDTH_PPSWIDTH_Msk (0xfffffffful << GMAC_PPSWDTH_PPSWIDTH_Pos) /*!< GMAC_T::PPSWDTH: PPSWIDTH Mask */ + +/**@}*/ /* GMAC_CONST */ +/**@}*/ /* end of GMAC register group */ + +/** + @addtogroup GMAC Gigabit Ethernet MAC DMA(GMACDMA) + Memory Mapped Structure for GMAC DMA +@{ */ + +typedef struct +{ + + /** + * @var GMACDMA_T::BUSMODE + * Offset: 0x0000 Register 1000 (Bus Mode Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SWR |Software Reset + * | | |When this bit is set, the MAC DMA Controller resets the logic and all internal registers of the MAC + * | | |It is cleared automatically after the reset operation has completed in all of the GMAC clock domains + * | | |Before reprogramming any register of the GMAC, you should read a zero (0) value in this bit . + * | | |Note: + * | | |The Software reset function is driven only by this bit. + * | | |The reset operation is completed only when all resets in all active clock domains are de-asserted + * | | |Therefore, it is essential that all the PHY inputs clocks (applicable for the selected PHY interface) are present for the software reset completion. + * |[6:2] |DSL |Descriptor Skip Length + * | | |This bit specifies the number of Word, Dword, or Lword (depending on the 32-bit, 64-bit, or 128-bit bus) to skip between two unchained descriptors + * | | |The address skipping starts from the end of current descriptor to the start of next descriptor + * | | |When the DSL value is equal to zero, the descriptor table is taken as contiguous by the DMA in Ring mode. + * |[7] |ATDS |Alternate Descriptor Size + * | | |When set, the size of the alternate descriptor increases to 32 bytes (8 DWORDS) + * | | |This is required when the Advanced Timestamp feature or the IPC Full Offload Engine (Type 2) is enabled in the receiver + * | | |The enhanced descriptor is not required if the Advanced Timestamp and IPC Full Checksum Offload (Type 2) features are not enabled + * | | |In such cases, you can use the 16 bytes descriptor to save 4 bytes of memory. + * | | |When reset, the descriptor size reverts back to 4 DWORDs (16 bytes) + * | | |This bit preserves the backward compatibility for the descriptor size + * | | |In versions prior to 3.50a, the descriptor size is 16 bytes for both normal and enhanced descriptor + * | | |In version 3.50a, descriptor size is increased to 32 bytes because of the Advanced Timestamp and IPC Full Checksum Offload Engine (Type 2) features. + * |[13:8] |PBL |Programmable Burst Length + * | | |These bits indicate the maximum number of beats to be transferred in one DMA transaction + * | | |This is the maximum value that is used in a single block Read or Write + * | | |The DMA always attempts to burst as specified in PBL each time it starts a Burst transfer on the host bus + * | | |PBL can be programmed with permissible values of 1, 2, 4, 8, 16, and 32 + * | | |Any other value results in undefined behavior + * | | |When USP is set high, this PBL value is applicable only for Tx DMA transactions + * | | |If the number of beats to be transferred is more than 32, then perform the following steps: + * | | |1. Set the PBLx8 mode. + * | | |2. Set the PBL. + * | | |For example, if the maximum number of beats to be transferred is 64, then first set PBLx8 to 1 and then set PBL to 8 + * | | |The PBL values have the following limitation: The maximum number of possible beats (PBL) is limited by the size of the Tx FIFO and Rx FIFO in the MTL layer and the data bus width on the DMA + * | | |The FIFO has a constraint that the maximum beat supported is half the depth of the FIFO, except when specified. + * | | |For different data bus widths and FIFO sizes, the valid PBL range (including x8 mode) is provided in the following list + * | | |If the PBL is common for both transmit and receive DMA, the minimum Rx FIFO and Tx FIFO depths must be considered. + * | | |Note: In the half-duplex mode, the valid PBL range specified in the following list is applicable only for Tx FIFO. + * | | |* 32-Bit Data Bus PPSWDTH + * | | |128 Bytes FIFO Depth: In the full-duplex mode, the valid PBL range is 16 or less + * | | |In the half-duplex mode, the valid PBL range is 8 or less for the 10 or 100 Mbps mode. + * | | |256 Bytes FIFO Depth: In the full-duplex mode and the half-duplex (10 or 100 Mbps) modes, the valid PBL range is 32 or less. + * | | |512 Bytes FIFO Depth: In the full-duplex mode and the half-duplex (10 or 100 Mbps) modes, the valid PBL range is 64 or less. + * | | |1 KB FIFO Depth: In the full-duplex mode, the valid PBL range is 128 or less + * | | |In the half-duplex mode, the valid PBL range is 128 or less in the 10 or 100 Mbps mode and 64 or less in the 1000 Mbps mode. + * | | |2 KB and Higher FIFO Depth: All PBL values are supported in the full-duplex mode and half-duplex modes. + * | | |* 64-Bit Data Bus PPSWDTH + * | | |128 Bytes FIFO Depth: In the full-duplex mode, the valid PBL range is 8 or less + * | | |In the half-duplex mode, the valid PBL range is 4 or less for the 10 or 100 Mbps mode. + * | | |256 Bytes FIFO Depth: In the full-duplex mode and the half-duplex (10 or 100 Mbps) modes, the valid PBL range is 16 or less. + * | | |512 Bytes FIFO Depth: In the full-duplex mode and the half-duplex (10 or 100 Mbps) modes, the valid PBL range is 32 or less. + * | | |1 KB FIFO Depth: In the full-duplex mode, the valid PBL range is 64 or less + * | | |In the half-duplex mode, the valid PBL range is 64 or less in the 10 or 100 Mbps mode and 32 or less in the 1000-Mbps mode. + * | | |2 KB FIFO Depth: In the full-duplex mode and the half-duplex (10 or 100 Mbps) modes, the valid PBL range is 128 or less. + * | | |4 KB and Higher FIFO Depth: All PBL values are supported in the full-duplex and half-duplex modes. + * | | |* 128-Bit Data Bus PPSWDTH + * | | |128 Bytes FIFO Depth: In the full-duplex mode, the valid PBL range is 4 or less + * | | |In the half-duplex mode, the valid PBL range is 2 or less for the 10 or 100 Mbps mode. + * | | |256 Bytes FIFO Depth: In the full-duplex mode and the half-duplex (10 or 100 Mbps) modes, the valid PBL range is 8 or less. + * | | |512 Bytes FIFO Depth: In the full-duplex mode and the half-duplex (10 or 100 Mbps) modes, the valid PBL range is 16 or less. + * | | |1 KB FIFO Depth: In the full-duplex mode, the valid PBL range is 32 or less + * | | |In the half-duplex mode, the valid PBL range is 32 or less in the 10 or 100 Mbps mode and 16 or less in the 1000-Mbps mode. + * | | |2 KB FIFO Depth: In the full-duplex mode and the half-duplex (10 or 100 Mbps) modes, the valid PBL range is 64 or less. + * | | |4 KB FIFO Depth: In the full-duplex mode and the half-duplex (10 or 100 Mbps) modes, the valid PBL range is 128 or less. + * | | |8 KB and Higher FIFO Depth: All PBL values are supported in the full-duplex and half-duplex modes. + * |[16] |FB |Fixed Burst + * | | |This bit controls whether the AHB or AXI Master interface performs fixed burst transfers or not + * | | |When set, the AHB interface uses only SINGLE, INCR4, INCR8, or INCR16 during start of the normal burst transfers + * | | |When reset, the AHB or AXI interface uses SINGLE and INCR burst transfer operations. + * | | |For more information, see Bit 0 (UNDEF) of the AXI Bus Mode register. + * |[22:17] |RPBL |Rx DMA PBL + * | | |This field indicates the maximum number of beats to be transferred in one Rx DMA transaction + * | | |This is the maximum value that is used in a single block Read or Write. + * | | |The Rx DMA always attempts to burst as specified in the RPBL bit each time it starts a Burst transfer on the host bus + * | | |You can program RPBL with values of 1, 2, 4, 8, 16, and 32 + * | | |Any other value results in undefined behavior + * | | |This field is valid and applicable only when USP is set high. + * |[23] |USP |Use Separate PBL + * | | |When set high, this bit configures the Rx DMA to use the value configured in Bits[22:17] as PBL + * | | |The PBL value in Bits[13:8] is applicable only to the Tx DMA operations. + * | | |When reset to low, the PBL value in Bits[13:8] is applicable for both DMA engines. + * |[24] |PBLx8 |PBLx8 Mode + * | | |When set high, this bit multiplies the programmed PBL value (Bits[22:17] and Bits[13:8]) eight times + * | | |Therefore, the DMA transfers the data in 8, 16, 32, 64, 128, and 256 beats depending on the PBL value + * |[25] |AAL |Address Aligned Beats + * | | |When this bit is set high and the FB bit is equal to 1, the AHB or AXI interface generates all bursts aligned to the start address LS bits + * | | |If the FB bit is equal to 0, the first burst (accessing the data buffer's start address) is not aligned, but subsequent bursts are aligned to the address. + * @var GMACDMA_T::TXDEM + * Offset: 0x0004 Register 1001 (Transmit Poll Demand Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |TPD |Transmit Poll Demand + * | | |When these bits are written with any value, the DMA reads the current descriptor pointed to by Register 1018 (Current Host Transmit Descriptor Register) + * | | |If that descriptor is not available (owned by the Host), the transmission returns to the Suspend state and the Bit 2 (TU) of Register 1005 (Status Register) is asserted + * | | |If the descriptor is available, the transmission resumes. + * @var GMACDMA_T::RXDEM + * Offset: 0x0008 Register 1002 (Receive Poll Demand Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |RPD |Receive Poll Demand + * | | |When these bits are written with any value, the DMA reads the current descriptor pointed to by Register 1019 (Current Host Receive Descriptor Register) + * | | |If that descriptor is not available (owned by the Host), the reception returns to the Suspended state and the Bit 7 (RU) of Register 1005 (Status Register) is not asserted + * | | |If the descriptor is available, the Rx DMA returns to the active state. + * @var GMACDMA_T::RXDADDR + * Offset: 0x000C Register 1003 (Receive Descriptor List Address Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:3] |RDESLA_64_bit|Start of Receive List + * | | |This field contains the base address of the first descriptor in the Receive Descriptor list + * | | |The LSB bits (2:0) for 64-bit bus width are ignored and are internally taken as all-zero by the DMA + * | | |Therefore, these LSB bits are read-only (RO). + * @var GMACDMA_T::TXDADDR + * Offset: 0x0010 Register 1004 (Transmit Descriptor List Address Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:3] |TDESLA_64_bit|Start of Transmit List + * | | |This field contains the base address of the first descriptor in the Transmit Descriptor list + * | | |The LSB bits (2:0) for 64-bit bus width are ignored and are internally taken as all-zero by the DMA + * | | |Therefore, these LSB bits are read-only (RO). + * @var GMACDMA_T::Status + * Offset: 0x0014 Register 1005 (Status Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TI |Transmit Interrupt + * | | |This bit indicates that the frame transmission is complete + * | | |When transmission is complete, Bit 31 (OWN) of TDES0 is reset, and the specific frame status information is updated in the descriptor. + * |[1] |TPS |Transmit Process Stopped + * | | |This bit is set when the transmission is stopped. + * |[2] |TU |Transmit Buffer Unavailable + * | | |This bit indicates that the host owns the Next Descriptor in the Transmit List and the DMA cannot acquire it + * | | |Transmission is suspended + * | | |Bits[22:20] explain the Transmit Process state transitions. + * | | |To resume processing Transmit descriptors, the host should change the ownership of the descriptor by setting TDES0[31] and then issue a Transmit Poll Demand command. + * |[3] |TJT |Transmit Jabber Timeout + * | | |This bit indicates that the Transmit Jabber Timer expired, which happens when the frame size exceeds 2,048 (10,240 bytes when the Jumbo frame is enabled) + * | | |When the Jabber Timeout occurs, the transmission process is aborted and placed in the Stopped state + * | | |This causes the Transmit Jabber Timeout TDES0[14] flag to assert. + * |[4] |OVF |Receive Overflow + * | | |This bit indicates that the Receive Buffer had an Overflow during frame reception + * | | |If the partial frame is transferred to the application, the overflow status is set in RDES0[11]. + * |[5] |UNF |Transmit Underflow + * | | |This bit indicates that the Transmit Buffer had an Underflow during frame transmission + * | | |Transmission is suspended and an Underflow Error TDES0[1] is set. + * |[6] |RI |Receive Interrupt + * | | |This bit indicates that the frame reception is complete + * | | |When reception is complete, the Bit 31 of RDES1 (Disable Interrupt on Completion) is reset in the last Descriptor, and the specific frame status information is updated in the descriptor + * | | |The reception remains in the Running state. + * |[7] |RU |Receive Buffer Unavailable + * | | |This bit indicates that the host owns the Next Descriptor in the Receive List and the DMA cannot acquire it + * | | |The Receive Process is suspended + * | | |To resume processing Receive descriptors, the host should change the ownership of the descriptor and issue a Receive Poll Demand command + * | | |If no Receive Poll Demand is issued, the Receive Process resumes when the next recognized incoming frame is received + * | | |This bit is set only when the previous Receive Descriptor is owned by the DMA. + * |[8] |RPS |Receive Process Stopped + * | | |This bit is asserted when the Receive Process enters the Stopped state. + * |[9] |RWT |Receive Watchdog Timeout + * | | |When set, this bit indicates that the Receive Watchdog Timer expired while receiving the current frame and the current frame is truncated after the watchdog timeout. + * |[10] |ETI |Early Transmit Interrupt + * | | |This bit indicates that the frame to be transmitted is fully transferred to the MTL Transmit FIFO. + * |[13] |FBI |Fatal Bus Error Interrupt + * | | |This bit indicates that a bus error occurred, as described in Bits[25:23] + * | | |When this bit is set, the corresponding DMA engine disables all of its bus accesses. + * |[14] |ERI |Early Receive Interrupt + * | | |This bit indicates that the DMA filled the first data buffer of the packet + * | | |This bit is cleared when the software writes 1 to this bit or Bit 6 (RI) of this register is set (whichever occurs earlier). + * |[15] |AIS |Abnormal Interrupt Summary + * | | |Abnormal Interrupt Summary bit value is the logical OR of the following when the corresponding interrupt bits are enabled in Register 1007 (Interrupt Enable Register): + * | | |Register 1005[1]: Transmit Process Stopped + * | | |Register 1005[3]: Transmit Jabber Timeout + * | | |Register 1005[4]: Receive FIFO Overflow + * | | |Register 1005[5]: Transmit Underflow + * | | |Register 1005[7]: Receive Buffer Unavailable + * | | |Register 1005[8]: Receive Process Stopped + * | | |Register 1005[9]: Receive Watchdog Timeout + * | | |Register 1005[10]: Early Transmit Interrupt + * | | |Register 1005[13]: Fatal Bus Error + * | | |Only unmasked bits affect the Abnormal Interrupt Summary bit. + * | | |This is a sticky bit and must be cleared each time a corresponding bit, which causes AIS to be set, is cleared. + * |[16] |NIS |Normal Interrupt Summary + * | | |Normal Interrupt Summary bit value is the logical OR of the following when the corresponding interrupt bits are enabled in Register 1007 (Interrupt Enable Register): + * | | |Register 1005[0]: Transmit Interrupt + * | | |Register 1005[2]: Transmit Buffer Unavailable + * | | |Register 1005[6]: Receive Interrupt + * | | |Register 1005[14]: Early Receive Interrupt + * | | |Only unmasked bits (interrupts for which interrupt enable is set in Register 1007) affect the Normal Interrupt Summary bit. + * | | |This is a sticky bit and must be cleared (by writing 1 to this bit) each time a corresponding bit, which causes NIS to be set, is cleared. + * |[19:17] |RS |Received Process State (read only) + * | | |This field indicates the Receive DMA FSM state. This field does not generate an interrupt. + * | | |3'b000: Stopped: Reset or Stop Receive Command issued + * | | |3'b001: Running: Fetching Receive Transfer Descriptor + * | | |3'b010: Reserved for future use + * | | |3'b011: Running: Waiting for receive packet + * | | |3'b100: Suspended: Receive Descriptor Unavailable + * | | |3'b101: Running: Closing Receive Descriptor + * | | |3'b110: TIME_STAMP write state + * | | |3'b111: Running: Transferring the receive packet data from receive buffer to host memory + * |[22:20] |TS |Transmit Process State (read only) + * | | |This field indicates the Transmit DMA FSM state. This field does not generate an interrupt. + * | | |3'b000: Stopped; Reset or Stop Transmit Command issued + * | | |3'b001: Running; Fetching Transmit Transfer Descriptor + * | | |3'b010: Running; Waiting for status + * | | |3'b011: Running; Reading Data from host memory buffer and queuing it to transmit buffer (Tx FIFO) + * | | |3'b100: TIME_STAMP write state + * | | |3'b101: Reserved for future use + * | | |3'b110: Suspended; Transmit Descriptor Unavailable or Transmit Buffer Underflow + * | | |3'b111: Running; Closing Transmit Descriptor + * |[25:23] |EB |Error Bits (read only) + * | | |This field indicates the type of error that caused a Bus Error, for example, error response on the AHB or AXI interface + * | | |This field is valid only when Bit 13 (FBI) is set + * | | |This field does not generate an interrupt. + * | | |0 0 0: Error during Rx DMA Write Data Transfer + * | | |0 1 1: Error during Tx DMA Read Data Transfer + * | | |1 0 0: Error during Rx DMA Descriptor Write Access + * | | |1 0 1: Error during Tx DMA Descriptor Write Access + * | | |1 1 0: Error during Rx DMA Descriptor Read Access + * | | |1 1 1: Error during Tx DMA Descriptor Read Access + * | | |Note: 001 and 010 are reserved. + * |[26] |GLI |GMAC Line interface Interrupt (read only) + * | | |When set, this bit reflects any of the following interrupt events in the GMAC interfaces: + * | | |RGMII: Link change event + * | | |To identify the exact cause of the interrupt, the software must first read Bit 11 and Bits[2:0] of Register 14 (Interrupt Status Register) and then to clear the source of interrupt (which also clears the GLI interrupt), read any of the following corresponding registers: + * | | |RGMII: Register 54 (RGMII Status Register) + * | | |The interrupt signal from the GMAC subsystem (sbd_intr_o) is high when this bit is high. + * |[28] |GPI |GMAC PMT Interrupt (read only) + * | | |This bit indicates an interrupt event in the PMT module of the GMAC + * | | |The software must read the PMT Control and Status Register in the MAC to get the exact cause of interrupt and clear its source to reset this bit to 1'b0 + * | | |The interrupt signal from the GMAC subsystem (sbd_intr_o) is high when this bit is high. + * | | |This bit is applicable only when the Power Management feature is enabled + * | | |Otherwise, this bit is reserved. + * | | |Note: The GPI and pmt_intr_o interrupts are generated in different clock domains. + * |[29] |TTI |Timestamp Trigger Interrupt (read only) + * | | |This bit indicates an interrupt event in the Timestamp Generator block of GMAC + * | | |The software must read the corresponding registers in the GMAC to get the exact cause of interrupt and clear its source to reset this bit to 1'b0 + * | | |When this bit is high, the interrupt signal from the GMAC subsystem (sbd_intr_o) is high. + * | | |This bit is applicable only when the IEEE 1588 Timestamp feature is enabled + * | | |Otherwise, this bit is reserved. + * |[30] |GLPII |GMAC LPI Interrupt (for Channel 0) (read only) + * | | |This bit indicates an interrupt event in the LPI logic of the GMAC + * | | |To reset this bit to 1'b0, the software must read the corresponding registers in the GMAC to get the exact cause of the interrupt and clear its source. + * | | |Note: GLPII status is given only in Channel 0 DMA register and is applicable only when the Energy Efficient Ethernet feature is enabled + * | | |Otherwise, this bit is reserved + * | | |When this bit is high, the interrupt signal from the MAC (sbd_intr_o) is high. + * @var GMACDMA_T::OPMODE + * Offset: 0x0018 Register 1006 (Operation Mode Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |SR |Start or Stop Receive + * | | |When this bit is set, the Receive process is placed in the Running state + * | | |The DMA attempts to acquire the descriptor from the Receive list and processes the incoming frames + * | | |The descriptor acquisition is attempted from the current position in the list, which is the address set by Register 1003 (Receive Descriptor List Address Register) or the position retained when the Receive process was previously stopped + * | | |If the DMA does not own the descriptor, reception is suspended and Bit 7 (Receive Buffer Unavailable) of Register 1005 (Status Register) is set + * | | |The Start Receive command is effective only when the reception has stopped + * | | |If the command is issued before setting Register 1003 (Receive Descriptor List Address Register), the DMA behavior is unpredictable. + * | | |When this bit is cleared, the Rx DMA operation is stopped after the transfer of the current frame + * | | |The next descriptor position in the Receive list is saved and becomes the current position after the Receive process is restarted + * | | |The Stop Receive command is effective only when the Receive process is in either the Running (waiting for receive packet) or in the Suspended state. + * |[2] |OSF |Operate on Second Frame + * | | |When this bit is set, it instructs the DMA to process the second frame of the Transmit data even before the status for the first frame is obtained. + * |[4:3] |RTC |Receive Threshold Control + * | | |These two bits control the threshold level of the MTL Receive FIFO + * | | |Transfer (request) to DMA starts when the frame size within the MTL Receive FIFO is larger than the threshold + * | | |In addition, full frames with length less than the threshold are transferred automatically. + * | | |These bits are valid only when the RSF bit is zero, and are ignored when the RSF bit is set to 1. + * | | |00: 64 + * | | |01: 32 + * | | |10: 96 + * | | |11: 128 + * |[5] |DGF |Drop Giant Frames + * | | |When set, the MAC drops the received giant frames in the Rx FIFO, that is, frames that are larger than the computed giant frame limit + * | | |When reset, the MAC does not drop the giant frames in the Rx FIFO. + * |[6] |FUF |Forward Undersized Good Frames + * | | |When set, the Rx FIFO forwards Undersized frames (frames with no Error and length less than 64 bytes) including pad-bytes and CRC. + * | | |When reset, the Rx FIFO drops all frames of less than 64 bytes, unless a frame is already transferred because of the lower value of Receive Threshold, for example, RTC = 01. + * |[7] |FEF |Forward Error Frames + * | | |When this bit is reset, the Rx FIFO drops frames with error status (CRC error, collision error, GMII_ER, giant frame, watchdog timeout, or overflow) + * | | |However, if the start byte (write) pointer of a frame is already transferred to the read controller side (in Threshold mode), then the frame is not dropped + * | | |When the FEF bit is set, all frames except runt error frames are forwarded to the DMA + * | | |If the Bit 25 (RSF) is set and the Rx FIFO overflows when a partial frame is written, then the frame is dropped irrespective of the FEF bit setting + * | | |However, if the Bit 25 (RSF) is reset and the Rx FIFO overflows when a partial frame is written, then a partial frame may be forwarded to the DMA. + * |[8] |EFC |Enable HW Flow Control + * | | |When this bit is set, the flow control signal operation based on the fill-level of Rx FIFO is enabled + * | | |When reset, the flow control operation is disabled + * | | |This bit is not used (reserved and always reset) when the Rx FIFO is less than 4 KB. + * |[10:9] |RFA |Threshold for Activating Flow Control (in half-duplex and full-duplex) + * | | |These bits control the threshold (Fill level of Rx FIFO) at which the flow control is activated. + * | | |00: Full minus 1 KB, that is, FULL - 1KB + * | | |01: Full minus 2 KB, that is, FULL - 2KB + * | | |10: Full minus 3 KB, that is, FULL - 3KB + * | | |11: Full minus 4 KB, that is, FULL - 4KB + * | | |These values are applicable only to Rx FIFOs of 4 KB or more and when Bit 8 (EFC) is set high + * | | |If the Rx FIFO is 8 KB or more, an additional Bit (RFA_2) is used for more threshold levels as described in Bit 23 + * | | |These bits are reserved and read-only when the depth of Rx FIFO is less than 4 KB. + * | | |Note: When FIFO size is exactly 4 KB, although the GMAC allows you to program the value of these bits to 11, the software should not program these bits to 2'b11 + * | | |The value 2'b11 means flow control on FIFO empty condition. + * |[12:11] |RFD |Threshold for Deactivating Flow Control (in half-duplex and full-duplex) + * | | |These bits control the threshold (Fill-level of Rx FIFO) at which the flow control is de-asserted after activation. + * | | |00: Full minus 1 KB, that is, FULL - 1KB + * | | |01: Full minus 2 KB, that is, FULL - 2KB + * | | |10: Full minus 3 KB, that is, FULL - 3KB + * | | |11: Full minus 4 KB, that is, FULL - 4KB + * | | |The de-assertion is effective only after flow control is asserted + * | | |If the Rx FIFO is 8 KB or more, an additional bit (RFD_2) is used for more threshold levels as described in Bit 22 + * | | |These bits are reserved and read-only when the Rx FIFO depth is less than 4 KB + * | | |Note: For proper flow control, the value programmed in the "RFD_2, RFD" fields should be equal to or more than the value programmed in the "RFA_2, RFA" fields. + * |[13] |ST |Start or Stop Transmission Command + * | | |When this bit is set, transmission is placed in the Running state, and the DMA checks the Transmit List at the current position for a frame to be transmitted + * | | |Descriptor acquisition is attempted either from the current position in the list, which is the Transmit List Base Address set by Register 1004 (Transmit Descriptor List Address Register), or from the position retained when transmission was stopped previously + * | | |If the DMA does not own the current descriptor, transmission enters the Suspended state and Bit 2 (Transmit Buffer Unavailable) of Register 1005 (Status Register) is set + * | | |The Start Transmission command is effective only when transmission is stopped + * | | |If the command is issued before setting Register 1004 (Transmit Descriptor List Address Register), then the DMA behavior is unpredictable. + * | | |When this bit is reset, the transmission process is placed in the Stopped state after completing the transmission of the current frame + * | | |The Next Descriptor position in the Transmit List is saved, and it becomes the current position when transmission is restarted + * | | |To change the list address, you need to program Register 1004 (Transmit Descriptor List Address Register) with a new value when this bit is reset + * | | |The new value is considered when this bit is set again + * | | |The stop transmission command is effective only when the transmission of the current frame is complete or the transmission is in the Suspended state. + * |[16:14] |TTC |Transmit Threshold Control + * | | |These bits control the threshold level of the MTL Transmit FIFO + * | | |Transmission starts when the frame size within the MTL Transmit FIFO is larger than the threshold + * | | |In addition, full frames with a length less than the threshold are also transmitted + * | | |These bits are used only when Bit 21 (TSF) is reset. + * | | |000: 64 + * | | |001: 128 + * | | |010: 192 + * | | |011: 256 + * | | |100: 40 + * | | |101: 32 + * | | |110: 24 + * | | |111: 16 + * |[20] |FTF |Flush Transmit FIFO + * | | |When this bit is set, the transmit FIFO controller logic is reset to its default values and thus all data in the Tx FIFO is lost or flushed + * | | |This bit is cleared internally when the flushing operation is completed + * | | |The Operation Mode register should not be written to until this bit is cleared + * | | |The data which is already accepted by the MAC transmitter is not flushed + * | | |It is scheduled for transmission and results in underflow and runt frame transmission. + * | | |Note: The flush operation is complete only when the Tx FIFO is emptied of its contents and all the pending Transmit Status of the transmitted frames are accepted by the host + * | | |To complete this flush operation, the PHY transmit clock (clk_tx_i) is required to be active. + * |[21] |TSF |Transmit Store and Forward + * | | |When this bit is set, transmission starts when a full frame resides in the MTL Transmit FIFO + * | | |When this bit is set, the TTC values specified in Bits[16:14] are ignored + * | | |This bit should be changed only when the transmission is stopped. + * |[24] |DFF |Disable Flushing of Received Frames + * | | |When this bit is set, the Rx DMA does not flush any frames because of the unavailability of receive descriptors or buffers as it does normally when this bit is reset + * |[25] |RSF |Receive Store and Forward + * | | |When this bit is set, the MTL reads a frame from the Rx FIFO only after the complete frame has been written to it, ignoring the RTC bits + * | | |When this bit is reset, the Rx FIFO operates in the cut-through mode, subject to the threshold specified by the RTC bits + * |[26] |DT |Disable Dropping of TCP/IP Checksum Error Frames + * | | |When this bit is set, the MAC does not drop the frames which only have errors detected by the Receive Checksum Offload engine + * | | |Such frames do not have any errors (including FCS error) in the Ethernet frame received by the MAC but have errors only in the encapsulated payload + * | | |When this bit is reset, all error frames are dropped if the FEF bit is reset. + * | | |If the IPC Full Checksum Offload Engine (Type 2) is disabled, this bit is reserved (RO with value 1'b0). + * @var GMACDMA_T::INTEN + * Offset: 0x001C Register 1007 (Interrupt Enable Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TIE |Transmit Interrupt Enable + * | | |When this bit is set with Normal Interrupt Summary Enable (Bit 16), the Transmit Interrupt is enabled + * | | |When this bit is reset, the Transmit Interrupt is disabled. + * |[1] |TSE |Transmit Stopped Enable + * | | |When this bit is set with Abnormal Interrupt Summary Enable (Bit 15), the Transmission Stopped Interrupt is enabled + * | | |When this bit is reset, the Transmission Stopped Interrupt is disabled. + * |[2] |TUE |Transmit Buffer Unavailable Enable + * | | |When this bit is set with Normal Interrupt Summary Enable (Bit 16), the Transmit Buffer Unavailable Interrupt is enabled + * | | |When this bit is reset, the Transmit Buffer Unavailable Interrupt is disabled. + * |[3] |TJE |Transmit Jabber Timeout Enable + * | | |When this bit is set with Abnormal Interrupt Summary Enable (Bit 15), the Transmit Jabber Timeout Interrupt is enabled + * | | |When this bit is reset, the Transmit Jabber Timeout Interrupt is disabled. + * |[4] |OVE |Overflow Interrupt Enable + * | | |When this bit is set with Abnormal Interrupt Summary Enable (Bit 15), the Receive Overflow Interrupt is enabled + * | | |When this bit is reset, the Overflow Interrupt is disabled. + * |[5] |UNE |Underflow Interrupt Enable + * | | |When this bit is set with Abnormal Interrupt Summary Enable (Bit 15), the Transmit Underflow Interrupt is enabled + * | | |When this bit is reset, the Underflow Interrupt is disabled. + * |[6] |RIE |Receive Interrupt Enable + * | | |When this bit is set with Normal Interrupt Summary Enable (Bit 16), the Receive Interrupt is enabled + * | | |When this bit is reset, the Receive Interrupt is disabled. + * |[7] |RUE |Receive Buffer Unavailable Enable + * | | |When this bit is set with Abnormal Interrupt Summary Enable (Bit 15), the Receive Buffer Unavailable Interrupt is enabled + * | | |When this bit is reset, the Receive Buffer Unavailable Interrupt is disabled. + * |[8] |RSE |Receive Stopped Enable + * | | |When this bit is set with Abnormal Interrupt Summary Enable (Bit 15), the Receive Stopped Interrupt is enabled + * | | |When this bit is reset, the Receive Stopped Interrupt is disabled. + * |[9] |RWE |Receive Watchdog Timeout Enable + * | | |When this bit is set with Abnormal Interrupt Summary Enable (Bit 15), the Receive Watchdog Timeout Interrupt is enabled + * | | |When this bit is reset, the Receive Watchdog Timeout Interrupt is disabled. + * |[10] |ETE |Early Transmit Interrupt Enable + * | | |When this bit is set with an Abnormal Interrupt Summary Enable (Bit 15), the Early Transmit Interrupt is enabled + * | | |When this bit is reset, the Early Transmit Interrupt is disabled. + * |[13] |FBE |Fatal Bus Error Enable + * | | |When this bit is set with Abnormal Interrupt Summary Enable (Bit 15), the Fatal Bus Error Interrupt is enabled + * | | |When this bit is reset, the Fatal Bus Error Enable Interrupt is disabled. + * |[14] |ERE |Early Receive Interrupt Enable + * | | |When this bit is set with Normal Interrupt Summary Enable (Bit 16), the Early Receive Interrupt is enabled + * | | |When this bit is reset, the Early Receive Interrupt is disabled. + * |[15] |AIE |Abnormal Interrupt Summary Enable + * | | |When this bit is set, abnormal interrupt summary is enabled + * | | |When this bit is reset, the abnormal interrupt summary is disabled + * | | |This bit enables the following interrupts in Register 1005 (Status Register): + * | | |Register 1005[1]: Transmit Process Stopped + * | | |Register 1005[3]: Transmit Jabber Timeout + * | | |Register 1005[4]: Receive Overflow + * | | |Register 1005[5]: Transmit Underflow + * | | |Register 1005[7]: Receive Buffer Unavailable + * | | |Register 1005[8]: Receive Process Stopped + * | | |Register 1005[9]: Receive Watchdog Timeout + * | | |Register 1005[10]: Early Transmit Interrupt + * | | |Register 1005[13]: Fatal Bus Error + * |[16] |NIE |Normal Interrupt Summary Enable + * | | |When this bit is set, normal interrupt summary is enabled + * | | |When this bit is reset, normal interrupt summary is disabled + * | | |This bit enables the following interrupts in Register 1005 (Status Register): + * | | |Register 1005[0]: Transmit Interrupt + * | | |Register 1005[2]: Transmit Buffer Unavailable + * | | |Register 1005[6]: Receive Interrupt + * | | |Register 1005[14]: Early Receive Interrupt + * @var GMACDMA_T::MFOVCNTR + * Offset: 0x0020 Register 1008 (Missed Frame and Buffer Overflow Counter Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |MISFRMCNT |Missed Frame Counter + * | | |This field indicates the number of frames missed by the controller because of the Host Receive Buffer being unavailable + * | | |This counter is incremented each time the DMA discards an incoming frame + * | | |The counter is cleared when this register is read with mci_be_i[0] at 1'b1. + * |[16] |MISCNTOVF |Overflow Bit for Missed Frame Counter + * | | |This bit is set every time Missed Frame Counter (Bits[15:0]) overflows, that is, the DMA discards an incoming frame because of the Host Receive Buffer being unavailable with the missed frame counter at maximum value + * | | |In such a scenario, the Missed frame counter is reset to all-zeros and this bit indicates that the rollover happened. + * |[27:17] |OVFFRMCNT |Overflow Frame Counter + * | | |This field indicates the number of frames missed by the application + * | | |This counter is incremented each time the MTL FIFO overflows + * | | |The counter is cleared when this register is read with mci_be_i[2] at 1'b1. + * |[28] |OVFCNTOVF |Overflow Bit for FIFO Overflow Counter + * | | |This bit is set every time the Overflow Frame Counter (Bits[27:17]) overflows, that is, the Rx FIFO overflows with the overflow frame counter at maximum value + * | | |In such a scenario, the overflow frame counter is reset to all-zeros and this bit indicates that the rollover happened. + * @var GMACDMA_T::RXINTWDT + * Offset: 0x0024 Register 1009 (Receive Interrupt Watchdog Timer Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |RIWT |RI Watchdog Timer Count + * | | |This bit indicates the number of system clock cycles multiplied by 256 for which the watchdog timer is set + * | | |The watchdog timer gets triggered with the programmed value after the Rx DMA completes the transfer of a frame for which the RI status bit is not set because of the setting in the corresponding descriptor RDES1[31] + * | | |When the watchdog timer runs out, the RI bit is set and the timer is stopped + * | | |The watchdog timer is reset when the RI bit is set high because of automatic setting of RI as per RDES1[31] of any received frame. + * @var GMACDMA_T::AXIMODE + * Offset: 0x0028 Register 1010 (AXI Bus Mode Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |UNDEF |AXI Undefined Burst Length (read only) + * | | |This bit is read-only bit and indicates the complement (invert) value of Bit 16 (FB) in Register 1000 (Bus Mode Register[16]). + * | | |When this bit is set to 1, the GMAC-AXI is allowed to perform any burst length equal to or below the maximum allowed burst length programmed in Bits[7:1]. + * | | |When this bit is set to 0, the GMAC-AXI is allowed to perform only fixed burst lengths as indicated by BLEN256, BLEN128, BLEN64, BLEN32, BLEN16, BLEN8, or BLEN4, or a burst length of 1 + * |[1] |BLEN4 |AXI Burst Length 4 + * | | |When this bit is set to 1, the GMAC-AXI is allowed to select a burst length of 4 on the AXI Master interface. + * | | |Setting this bit has no effect when UNDEF is set to 1. + * |[2] |BLEN8 |AXI Burst Length 8 + * | | |When this bit is set to 1, the GMAC-AXI is allowed to select a burst length of 8 on the AXI Master interface. + * | | |Setting this bit has no effect when UNDEF is set to 1. + * |[3] |BLEN16 |AXI Burst Length 16 + * | | |When this bit is set to 1 or UNDEF is set to 1, the GMAC-AXI is allowed to select a burst length of 16 on the AXI Master interface. + * |[12] |AXI_AAL |Address-Aligned Beats (read only) + * | | |This bit is read-only bit and reflects the Bit 25 (AAL) of Register 1000 (Bus Mode Register). + * | | |When this bit is set to 1, the GMAC-AXI performs address-aligned burst transfers on both read and write channels. + * |[13] |ONEKBBE |1 KB Boundary Crossing Enable for the GMAC-AXI Master When set, the GMAC-AXI Master performs burst transfers that do not cross 1 KB boundary. When reset, the GMAC-AXI Master performs burst transfers that do not cross 4 KB boundary. + * |[17:16] |RD_OSR_LMT|AXI Maximum Read OutStanding Request Limit + * | | |This value limits the maximum outstanding request on the AXI read interface + * | | |Maximum outstanding requests = RD_OSR_LMT+1 + * | | |Note: The Bit 18 is reserved if AXI_GM_MAX_RD_REQUESTS = 4 + * | | |The Bit 19 is reserved if AXI_GM_MAX_RD_REQUESTS != 16. + * |[18] |RD_OSR_LMT_GT4|Reserved. + * |[19] |RD_OSR_LMT_GT8|Reserved. + * |[21:20] |WR_OSR_LMT|AXI Maximum Write OutStanding Request Limit + * |[22] |WR_OSR_LMT_GT4|Reserved. + * |[23] |WR_OSR_LMT_GT8|Reserved. + * |[30] |LPI_XIT_FRM|Unlock on Magic Packet or Remote Wake Up + * | | |When set to 1, this bit enables the GMAC-AXI to come out of the LPI mode only when the Magic Packet or Remote Wake Up Packet is received + * | | |When set to 0, this bit enables the GMAC-AXI to come out of LPI mode when any frame is received. + * |[31] |EN_LPI |Enable Low Power Interface (LPI) + * | | |When set to 1, this bit enables the LPI mode and accepts the LPI request from the AXI System Clock controller. + * | | |When set to 0, this bit disables the LPI mode and always denies the LPI request from the AXI System Clock controller. + * @var GMACDMA_T::BUSSTS + * Offset: 0x002C Register 1011 (AHB or AXI Status Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |AXWHSTS |AXI Master Write Channel or AHB Master Status + * | | |When high, it indicates that AXI Master's write channel is active and transferring data. + * |[1] |AXIRDSTS |AXI Master Read Channel Status + * | | |When high, it indicates that AXI Master's read channel is active and transferring data. + * @var GMACDMA_T::CTXDESC + * Offset: 0x0048 Register 1018 (Current Host Transmit Descriptor Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURTDESAPTR|Host Transmit Descriptor Address Pointer + * | | |Cleared on Reset. Pointer updated by the DMA during operation. + * @var GMACDMA_T::CRXDESC + * Offset: 0x004C Register 1019 (Current Host Receive Descriptor Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURRDESAPTR|Host Receive Descriptor Address Pointer + * | | |Cleared on Reset. Pointer updated by the DMA during operation. + * @var GMACDMA_T::CTXBUF + * Offset: 0x0050 Register 1020 (Current Host Transmit Buffer Address Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURTBUFAPTR|Host Transmit Buffer Address Pointer + * | | |Cleared on Reset. Pointer updated by the DMA during operation. + * @var GMACDMA_T::CRXBUF + * Offset: 0x0054 Register 1021 (Current Host Receive Buffer Address Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |CURRBUFAPTR|Host Receive Buffer Address Pointer + * | | |Cleared on Reset. Pointer updated by the DMA during operation. + * @var GMACDMA_T::HWFEAT + * Offset: 0x0058 Register 1022 (HW Feature Register) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |MIISEL |10 or 100 Mbps support + * |[1] |GMIISEL |1000 Mbps support + * |[2] |HDSEL |Half-Duplex support + * |[3] |EXTHASHEN |Expanded DA Hash Filter + * |[4] |HASHSEL |HASH Filter + * |[5] |ADDMACADRSEL|Multiple MAC Address Registers + * |[6] |PCSSEL |PCS registers (TBI, SGMII, or RTBI PHY interface) + * |[7] |L3L4FLTREN|Layer 3 and Layer 4 Filter Feature + * |[8] |SMASEL |SMA (MDIO) Interface + * |[9] |RWKSEL |PMT Remote Wakeup + * |[10] |MGKSEL |PMT Magic Packet + * |[11] |MMCSEL |RMON Module + * |[12] |TSVER1SEL |Only IEEE 1588-2002 Timestamp + * |[13] |TSVER2SEL |IEEE 1588-2008 Advanced Timestamp + * |[14] |EEESEL |Energy Efficient Ethernet + * |[15] |AVSEL |AV Feature + * |[16] |TXCOESEL |Checksum Offload in Tx + * |[17] |RXTYP1COE |Type 1 IP Checksum Offload (Type 1) in Rx + * | | |Note: If IPCHKSUM_EN = Enabled and IPC_FULL_OFFLOAD = Enabled, then RXTYP1COE = 0 and RXTYP2COE =1. + * |[18] |RXTYP2COE |Type 2 IP Checksum Offload (Type 2) in Rx + * |[19] |RXFIFOSIZE|Rx FIFO > 2,048 Bytes + * |[21:20] |RXCHCNT |Number of additional Rx channels + * |[23:22] |TXCHCNT |Number of additional Tx channels + * |[24] |ENHDESSEL |Alternate (Enhanced Descriptor) + * |[25] |INTTSEN |Timestamping with Internal System Time + * |[26] |FLEXIPPSEN|Flexible Pulse-Per-Second Output + * |[27] |SAVLANINS |Source Address or VLAN Insertion + * |[30:28] |ACTPHYIF |Active or Selected PHY interface + * | | |When you have multiple PHY interfaces in your configuration, this field indicates the sampled value of phy_intf_sel_i during reset de-assertion + * | | |0001: RGMII + * | | |0100: RMII + * | | |All Others: Reserved + */ + __IO uint32_t BUSMODE; /*!< [0x0000] Register 1000 (Bus Mode Register) */ + __IO uint32_t TXDEM; /*!< [0x0004] Register 1001 (Transmit Poll Demand Register) */ + __IO uint32_t RXDEM; /*!< [0x0008] Register 1002 (Receive Poll Demand Register) */ + __IO uint32_t RXDADDR; /*!< [0x000c] Register 1003 (Receive Descriptor List Address Register) */ + __IO uint32_t TXDADDR; /*!< [0x0010] Register 1004 (Transmit Descriptor List Address Register) */ + __IO uint32_t STS; /*!< [0x0014] Register 1005 (Status Register) */ + __IO uint32_t OPMODE; /*!< [0x0018] Register 1006 (Operation Mode Register) */ + __IO uint32_t INTEN; /*!< [0x001c] Register 1007 (Interrupt Enable Register) */ + __I uint32_t MFOVCNTR; /*!< [0x0020] Register 1008 (Missed Frame and Buffer Overflow Counter Register)*/ + __IO uint32_t RXINTWDT; /*!< [0x0024] Register 1009 (Receive Interrupt Watchdog Timer Register) */ + __IO uint32_t AXIMODE; /*!< [0x0028] Register 1010 (AXI Bus Mode Register) */ + __I uint32_t BUSSTS; /*!< [0x002c] Register 1011 (AHB or AXI Status Register) */ + __I uint32_t RESERVE0[6]; + __I uint32_t CTXDESC; /*!< [0x0048] Register 1018 (Current Host Transmit Descriptor Register) */ + __I uint32_t CRXDESC; /*!< [0x004c] Register 1019 (Current Host Receive Descriptor Register) */ + __I uint32_t CTXBUF; /*!< [0x0050] Register 1020 (Current Host Transmit Buffer Address Register) */ + __I uint32_t CRXBUF; /*!< [0x0054] Register 1021 (Current Host Receive Buffer Address Register) */ + __I uint32_t HWFEAT; /*!< [0x0058] Register 1022 (HW Feature Register) */ + +} GMACDMA_T; + + +/** + @addtogroup GMACDMA_CONST GMACDMA Bit Field Definition + Constant Definitions for GMACDMA +@{ */ +#define GMACDMA_BUSMODE_SWR_Pos (0) /*!< GMACDMA_T::BUSMODE: SWR Position */ +#define GMACDMA_BUSMODE_SWR_Msk (0x1ul << GMACDMA_BUSMODE_SWR_Pos) /*!< GMACDMA_T::BUSMODE: SWR Mask */ + +#define GMACDMA_BUSMODE_DSL_Pos (2) /*!< GMACDMA_T::BUSMODE: DSL Position */ +#define GMACDMA_BUSMODE_DSL_Msk (0x1ful << GMACDMA_BUSMODE_DSL_Pos) /*!< GMACDMA_T::BUSMODE: DSL Mask */ + +#define GMACDMA_BUSMODE_ATDS_Pos (7) /*!< GMACDMA_T::BUSMODE: ATDS Position */ +#define GMACDMA_BUSMODE_ATDS_Msk (0x1ul << GMACDMA_BUSMODE_ATDS_Pos) /*!< GMACDMA_T::BUSMODE: ATDS Mask */ + +#define GMACDMA_BUSMODE_PBL_Pos (8) /*!< GMACDMA_T::BUSMODE: PBL Position */ +#define GMACDMA_BUSMODE_PBL_Msk (0x3ful << GMACDMA_BUSMODE_PBL_Pos) /*!< GMACDMA_T::BUSMODE: PBL Mask */ + +#define GMACDMA_BUSMODE_FB_Pos (16) /*!< GMACDMA_T::BUSMODE: FB Position */ +#define GMACDMA_BUSMODE_FB_Msk (0x1ul << GMACDMA_BUSMODE_FB_Pos) /*!< GMACDMA_T::BUSMODE: FB Mask */ + +#define GMACDMA_BUSMODE_RPBL_Pos (17) /*!< GMACDMA_T::BUSMODE: RPBL Position */ +#define GMACDMA_BUSMODE_RPBL_Msk (0x3ful << GMACDMA_BUSMODE_RPBL_Pos) /*!< GMACDMA_T::BUSMODE: RPBL Mask */ + +#define GMACDMA_BUSMODE_USP_Pos (23) /*!< GMACDMA_T::BUSMODE: USP Position */ +#define GMACDMA_BUSMODE_USP_Msk (0x1ul << GMACDMA_BUSMODE_USP_Pos) /*!< GMACDMA_T::BUSMODE: USP Mask */ + +#define GMACDMA_BUSMODE_PBLx8_Pos (24) /*!< GMACDMA_T::BUSMODE: PBLx8 Position */ +#define GMACDMA_BUSMODE_PBLx8_Msk (0x1ul << GMACDMA_BUSMODE_PBLx8_Pos) /*!< GMACDMA_T::BUSMODE: PBLx8 Mask */ + +#define GMACDMA_BUSMODE_AAL_Pos (25) /*!< GMACDMA_T::BUSMODE: AAL Position */ +#define GMACDMA_BUSMODE_AAL_Msk (0x1ul << GMACDMA_BUSMODE_AAL_Pos) /*!< GMACDMA_T::BUSMODE: AAL Mask */ + +#define GMACDMA_TXDEM_TPD_Pos (0) /*!< GMACDMA_T::TXDEM: TPD Position */ +#define GMACDMA_TXDEM_TPD_Msk (0xfffffffful << GMACDMA_TXDEM_TPD_Pos) /*!< GMACDMA_T::TXDEM: TPD Mask */ + +#define GMACDMA_RXDEM_RPD_Pos (0) /*!< GMACDMA_T::RXDEM: RPD Position */ +#define GMACDMA_RXDEM_RPD_Msk (0xfffffffful << GMACDMA_RXDEM_RPD_Pos) /*!< GMACDMA_T::RXDEM: RPD Mask */ + +#define GMACDMA_RXDADDR_RDESLA_64_bit_Pos (3) /*!< GMACDMA_T::RXDADDR: RDESLA_64_bit Position */ +#define GMACDMA_RXDADDR_RDESLA_64_bit_Msk (0x1ffffffful << GMACDMA_RXDADDR_RDESLA_64_bit_Pos) /*!< GMACDMA_T::RXDADDR: RDESLA_64_bit Mask */ + +#define GMACDMA_TXDADDR_TDESLA_64_bit_Pos (3) /*!< GMACDMA_T::TXDADDR: TDESLA_64_bit Position */ +#define GMACDMA_TXDADDR_TDESLA_64_bit_Msk (0x1ffffffful << GMACDMA_TXDADDR_TDESLA_64_bit_Pos) /*!< GMACDMA_T::TXDADDR: TDESLA_64_bit Mask */ + +#define GMACDMA_STS_TI_Pos (0) /*!< GMACDMA_T::STS: TI Position */ +#define GMACDMA_STS_TI_Msk (0x1ul << GMACDMA_STS_TI_Pos) /*!< GMACDMA_T::STS: TI Mask */ + +#define GMACDMA_STS_TPS_Pos (1) /*!< GMACDMA_T::STS: TPS Position */ +#define GMACDMA_STS_TPS_Msk (0x1ul << GMACDMA_STS_TPS_Pos) /*!< GMACDMA_T::STS: TPS Mask */ + +#define GMACDMA_STS_TU_Pos (2) /*!< GMACDMA_T::STS: TU Position */ +#define GMACDMA_STS_TU_Msk (0x1ul << GMACDMA_STS_TU_Pos) /*!< GMACDMA_T::STS: TU Mask */ + +#define GMACDMA_STS_TJT_Pos (3) /*!< GMACDMA_T::STS: TJT Position */ +#define GMACDMA_STS_TJT_Msk (0x1ul << GMACDMA_STS_TJT_Pos) /*!< GMACDMA_T::STS: TJT Mask */ + +#define GMACDMA_STS_OVF_Pos (4) /*!< GMACDMA_T::STS: OVF Position */ +#define GMACDMA_STS_OVF_Msk (0x1ul << GMACDMA_STS_OVF_Pos) /*!< GMACDMA_T::STS: OVF Mask */ + +#define GMACDMA_STS_UNF_Pos (5) /*!< GMACDMA_T::STS: UNF Position */ +#define GMACDMA_STS_UNF_Msk (0x1ul << GMACDMA_STS_UNF_Pos) /*!< GMACDMA_T::STS: UNF Mask */ + +#define GMACDMA_STS_RI_Pos (6) /*!< GMACDMA_T::STS: RI Position */ +#define GMACDMA_STS_RI_Msk (0x1ul << GMACDMA_STS_RI_Pos) /*!< GMACDMA_T::STS: RI Mask */ + +#define GMACDMA_STS_RU_Pos (7) /*!< GMACDMA_T::STS: RU Position */ +#define GMACDMA_STS_RU_Msk (0x1ul << GMACDMA_STS_RU_Pos) /*!< GMACDMA_T::STS: RU Mask */ + +#define GMACDMA_STS_RPS_Pos (8) /*!< GMACDMA_T::STS: RPS Position */ +#define GMACDMA_STS_RPS_Msk (0x1ul << GMACDMA_STS_RPS_Pos) /*!< GMACDMA_T::STS: RPS Mask */ + +#define GMACDMA_STS_RWT_Pos (9) /*!< GMACDMA_T::STS: RWT Position */ +#define GMACDMA_STS_RWT_Msk (0x1ul << GMACDMA_STS_RWT_Pos) /*!< GMACDMA_T::STS: RWT Mask */ + +#define GMACDMA_STS_ETI_Pos (10) /*!< GMACDMA_T::STS: ETI Position */ +#define GMACDMA_STS_ETI_Msk (0x1ul << GMACDMA_STS_ETI_Pos) /*!< GMACDMA_T::STS: ETI Mask */ + +#define GMACDMA_STS_FBI_Pos (13) /*!< GMACDMA_T::STS: FBI Position */ +#define GMACDMA_STS_FBI_Msk (0x1ul << GMACDMA_STS_FBI_Pos) /*!< GMACDMA_T::STS: FBI Mask */ + +#define GMACDMA_STS_ERI_Pos (14) /*!< GMACDMA_T::STS: ERI Position */ +#define GMACDMA_STS_ERI_Msk (0x1ul << GMACDMA_STS_ERI_Pos) /*!< GMACDMA_T::STS: ERI Mask */ + +#define GMACDMA_STS_AIS_Pos (15) /*!< GMACDMA_T::STS: AIS Position */ +#define GMACDMA_STS_AIS_Msk (0x1ul << GMACDMA_STS_AIS_Pos) /*!< GMACDMA_T::STS: AIS Mask */ + +#define GMACDMA_STS_NIS_Pos (16) /*!< GMACDMA_T::STS: NIS Position */ +#define GMACDMA_STS_NIS_Msk (0x1ul << GMACDMA_STS_NIS_Pos) /*!< GMACDMA_T::STS: NIS Mask */ + +#define GMACDMA_STS_RS_Pos (17) /*!< GMACDMA_T::STS: RS Position */ +#define GMACDMA_STS_RS_Msk (0x7ul << GMACDMA_STS_RS_Pos) /*!< GMACDMA_T::STS: RS Mask */ + +#define GMACDMA_STS_TS_Pos (20) /*!< GMACDMA_T::STS: TS Position */ +#define GMACDMA_STS_TS_Msk (0x7ul << GMACDMA_STS_TS_Pos) /*!< GMACDMA_T::STS: TS Mask */ + +#define GMACDMA_STS_EB_Pos (23) /*!< GMACDMA_T::STS: EB Position */ +#define GMACDMA_STS_EB_Msk (0x7ul << GMACDMA_STS_EB_Pos) /*!< GMACDMA_T::STS: EB Mask */ + +#define GMACDMA_STS_GLI_Pos (26) /*!< GMACDMA_T::STS: GLI Position */ +#define GMACDMA_STS_GLI_Msk (0x1ul << GMACDMA_STS_GLI_Pos) /*!< GMACDMA_T::STS: GLI Mask */ + +#define GMACDMA_STS_GPI_Pos (28) /*!< GMACDMA_T::STS: GPI Position */ +#define GMACDMA_STS_GPI_Msk (0x1ul << GMACDMA_STS_GPI_Pos) /*!< GMACDMA_T::STS: GPI Mask */ + +#define GMACDMA_STS_TTI_Pos (29) /*!< GMACDMA_T::STS: TTI Position */ +#define GMACDMA_STS_TTI_Msk (0x1ul << GMACDMA_STS_TTI_Pos) /*!< GMACDMA_T::STS: TTI Mask */ + +#define GMACDMA_STS_GLPII_Pos (30) /*!< GMACDMA_T::STS: GLPII Position */ +#define GMACDMA_STS_GLPII_Msk (0x1ul << GMACDMA_STS_GLPII_Pos) /*!< GMACDMA_T::STS: GLPII Mask */ + +#define GMACDMA_OPMODE_SR_Pos (1) /*!< GMACDMA_T::OPMODE: SR Position */ +#define GMACDMA_OPMODE_SR_Msk (0x1ul << GMACDMA_OPMODE_SR_Pos) /*!< GMACDMA_T::OPMODE: SR Mask */ + +#define GMACDMA_OPMODE_OSF_Pos (2) /*!< GMACDMA_T::OPMODE: OSF Position */ +#define GMACDMA_OPMODE_OSF_Msk (0x1ul << GMACDMA_OPMODE_OSF_Pos) /*!< GMACDMA_T::OPMODE: OSF Mask */ + +#define GMACDMA_OPMODE_RTC_Pos (3) /*!< GMACDMA_T::OPMODE: RTC Position */ +#define GMACDMA_OPMODE_RTC_Msk (0x3ul << GMACDMA_OPMODE_RTC_Pos) /*!< GMACDMA_T::OPMODE: RTC Mask */ + +#define GMACDMA_OPMODE_DGF_Pos (5) /*!< GMACDMA_T::OPMODE: DGF Position */ +#define GMACDMA_OPMODE_DGF_Msk (0x1ul << GMACDMA_OPMODE_DGF_Pos) /*!< GMACDMA_T::OPMODE: DGF Mask */ + +#define GMACDMA_OPMODE_FUF_Pos (6) /*!< GMACDMA_T::OPMODE: FUF Position */ +#define GMACDMA_OPMODE_FUF_Msk (0x1ul << GMACDMA_OPMODE_FUF_Pos) /*!< GMACDMA_T::OPMODE: FUF Mask */ + +#define GMACDMA_OPMODE_FEF_Pos (7) /*!< GMACDMA_T::OPMODE: FEF Position */ +#define GMACDMA_OPMODE_FEF_Msk (0x1ul << GMACDMA_OPMODE_FEF_Pos) /*!< GMACDMA_T::OPMODE: FEF Mask */ + +#define GMACDMA_OPMODE_EFC_Pos (8) /*!< GMACDMA_T::OPMODE: EFC Position */ +#define GMACDMA_OPMODE_EFC_Msk (0x1ul << GMACDMA_OPMODE_EFC_Pos) /*!< GMACDMA_T::OPMODE: EFC Mask */ + +#define GMACDMA_OPMODE_RFA_Pos (9) /*!< GMACDMA_T::OPMODE: RFA Position */ +#define GMACDMA_OPMODE_RFA_Msk (0x3ul << GMACDMA_OPMODE_RFA_Pos) /*!< GMACDMA_T::OPMODE: RFA Mask */ + +#define GMACDMA_OPMODE_RFD_Pos (11) /*!< GMACDMA_T::OPMODE: RFD Position */ +#define GMACDMA_OPMODE_RFD_Msk (0x3ul << GMACDMA_OPMODE_RFD_Pos) /*!< GMACDMA_T::OPMODE: RFD Mask */ + +#define GMACDMA_OPMODE_ST_Pos (13) /*!< GMACDMA_T::OPMODE: ST Position */ +#define GMACDMA_OPMODE_ST_Msk (0x1ul << GMACDMA_OPMODE_ST_Pos) /*!< GMACDMA_T::OPMODE: ST Mask */ + +#define GMACDMA_OPMODE_TTC_Pos (14) /*!< GMACDMA_T::OPMODE: TTC Position */ +#define GMACDMA_OPMODE_TTC_Msk (0x7ul << GMACDMA_OPMODE_TTC_Pos) /*!< GMACDMA_T::OPMODE: TTC Mask */ + +#define GMACDMA_OPMODE_FTF_Pos (20) /*!< GMACDMA_T::OPMODE: FTF Position */ +#define GMACDMA_OPMODE_FTF_Msk (0x1ul << GMACDMA_OPMODE_FTF_Pos) /*!< GMACDMA_T::OPMODE: FTF Mask */ + +#define GMACDMA_OPMODE_TSF_Pos (21) /*!< GMACDMA_T::OPMODE: TSF Position */ +#define GMACDMA_OPMODE_TSF_Msk (0x1ul << GMACDMA_OPMODE_TSF_Pos) /*!< GMACDMA_T::OPMODE: TSF Mask */ + +#define GMACDMA_OPMODE_DFF_Pos (24) /*!< GMACDMA_T::OPMODE: DFF Position */ +#define GMACDMA_OPMODE_DFF_Msk (0x1ul << GMACDMA_OPMODE_DFF_Pos) /*!< GMACDMA_T::OPMODE: DFF Mask */ + +#define GMACDMA_OPMODE_RSF_Pos (25) /*!< GMACDMA_T::OPMODE: RSF Position */ +#define GMACDMA_OPMODE_RSF_Msk (0x1ul << GMACDMA_OPMODE_RSF_Pos) /*!< GMACDMA_T::OPMODE: RSF Mask */ + +#define GMACDMA_OPMODE_DT_Pos (26) /*!< GMACDMA_T::OPMODE: DT Position */ +#define GMACDMA_OPMODE_DT_Msk (0x1ul << GMACDMA_OPMODE_DT_Pos) /*!< GMACDMA_T::OPMODE: DT Mask */ + +#define GMACDMA_INTEN_TIE_Pos (0) /*!< GMACDMA_T::INTEN: TIE Position */ +#define GMACDMA_INTEN_TIE_Msk (0x1ul << GMACDMA_INTEN_TIE_Pos) /*!< GMACDMA_T::INTEN: TIE Mask */ + +#define GMACDMA_INTEN_TSE_Pos (1) /*!< GMACDMA_T::INTEN: TSE Position */ +#define GMACDMA_INTEN_TSE_Msk (0x1ul << GMACDMA_INTEN_TSE_Pos) /*!< GMACDMA_T::INTEN: TSE Mask */ + +#define GMACDMA_INTEN_TUE_Pos (2) /*!< GMACDMA_T::INTEN: TUE Position */ +#define GMACDMA_INTEN_TUE_Msk (0x1ul << GMACDMA_INTEN_TUE_Pos) /*!< GMACDMA_T::INTEN: TUE Mask */ + +#define GMACDMA_INTEN_TJE_Pos (3) /*!< GMACDMA_T::INTEN: TJE Position */ +#define GMACDMA_INTEN_TJE_Msk (0x1ul << GMACDMA_INTEN_TJE_Pos) /*!< GMACDMA_T::INTEN: TJE Mask */ + +#define GMACDMA_INTEN_OVE_Pos (4) /*!< GMACDMA_T::INTEN: OVE Position */ +#define GMACDMA_INTEN_OVE_Msk (0x1ul << GMACDMA_INTEN_OVE_Pos) /*!< GMACDMA_T::INTEN: OVE Mask */ + +#define GMACDMA_INTEN_UNE_Pos (5) /*!< GMACDMA_T::INTEN: UNE Position */ +#define GMACDMA_INTEN_UNE_Msk (0x1ul << GMACDMA_INTEN_UNE_Pos) /*!< GMACDMA_T::INTEN: UNE Mask */ + +#define GMACDMA_INTEN_RIE_Pos (6) /*!< GMACDMA_T::INTEN: RIE Position */ +#define GMACDMA_INTEN_RIE_Msk (0x1ul << GMACDMA_INTEN_RIE_Pos) /*!< GMACDMA_T::INTEN: RIE Mask */ + +#define GMACDMA_INTEN_RUE_Pos (7) /*!< GMACDMA_T::INTEN: RUE Position */ +#define GMACDMA_INTEN_RUE_Msk (0x1ul << GMACDMA_INTEN_RUE_Pos) /*!< GMACDMA_T::INTEN: RUE Mask */ + +#define GMACDMA_INTEN_RSE_Pos (8) /*!< GMACDMA_T::INTEN: RSE Position */ +#define GMACDMA_INTEN_RSE_Msk (0x1ul << GMACDMA_INTEN_RSE_Pos) /*!< GMACDMA_T::INTEN: RSE Mask */ + +#define GMACDMA_INTEN_RWE_Pos (9) /*!< GMACDMA_T::INTEN: RWE Position */ +#define GMACDMA_INTEN_RWE_Msk (0x1ul << GMACDMA_INTEN_RWE_Pos) /*!< GMACDMA_T::INTEN: RWE Mask */ + +#define GMACDMA_INTEN_ETE_Pos (10) /*!< GMACDMA_T::INTEN: ETE Position */ +#define GMACDMA_INTEN_ETE_Msk (0x1ul << GMACDMA_INTEN_ETE_Pos) /*!< GMACDMA_T::INTEN: ETE Mask */ + +#define GMACDMA_INTEN_FBE_Pos (13) /*!< GMACDMA_T::INTEN: FBE Position */ +#define GMACDMA_INTEN_FBE_Msk (0x1ul << GMACDMA_INTEN_FBE_Pos) /*!< GMACDMA_T::INTEN: FBE Mask */ + +#define GMACDMA_INTEN_ERE_Pos (14) /*!< GMACDMA_T::INTEN: ERE Position */ +#define GMACDMA_INTEN_ERE_Msk (0x1ul << GMACDMA_INTEN_ERE_Pos) /*!< GMACDMA_T::INTEN: ERE Mask */ + +#define GMACDMA_INTEN_AIE_Pos (15) /*!< GMACDMA_T::INTEN: AIE Position */ +#define GMACDMA_INTEN_AIE_Msk (0x1ul << GMACDMA_INTEN_AIE_Pos) /*!< GMACDMA_T::INTEN: AIE Mask */ + +#define GMACDMA_INTEN_NIE_Pos (16) /*!< GMACDMA_T::INTEN: NIE Position */ +#define GMACDMA_INTEN_NIE_Msk (0x1ul << GMACDMA_INTEN_NIE_Pos) /*!< GMACDMA_T::INTEN: NIE Mask */ + +#define GMACDMA_MFOVCNTR_MISFRMCNT_Pos (0) /*!< GMACDMA_T::MFOVCNTR: MISFRMCNT Position*/ +#define GMACDMA_MFOVCNTR_MISFRMCNT_Msk (0xfffful << GMACDMA_MFOVCNTR_MISFRMCNT_Pos) /*!< GMACDMA_T::MFOVCNTR: MISFRMCNT Mask*/ + +#define GMACDMA_MFOVCNTR_MISCNTOVF_Pos (16) /*!< GMACDMA_T::MFOVCNTR: MISCNTOVF Position*/ +#define GMACDMA_MFOVCNTR_MISCNTOVF_Msk (0x1ul << GMACDMA_MFOVCNTR_MISCNTOVF_Pos) /*!< GMACDMA_T::MFOVCNTR: MISCNTOVF Mask*/ + +#define GMACDMA_MFOVCNTR_OVFFRMCNT_Pos (17) /*!< GMACDMA_T::MFOVCNTR: OVFFRMCNT Position*/ +#define GMACDMA_MFOVCNTR_OVFFRMCNT_Msk (0x7fful << GMACDMA_MFOVCNTR_OVFFRMCNT_Pos) /*!< GMACDMA_T::MFOVCNTR: OVFFRMCNT Mask*/ + +#define GMACDMA_MFOVCNTR_OVFCNTOVF_Pos (28) /*!< GMACDMA_T::MFOVCNTR: OVFCNTOVF Position*/ +#define GMACDMA_MFOVCNTR_OVFCNTOVF_Msk (0x1ul << GMACDMA_MFOVCNTR_OVFCNTOVF_Pos) /*!< GMACDMA_T::MFOVCNTR: OVFCNTOVF Mask*/ + +#define GMACDMA_RXINTWDT_RIWT_Pos (0) /*!< GMACDMA_T::RXINTWDT: RIWT Position*/ +#define GMACDMA_RXINTWDT_RIWT_Msk (0xfful << GMACDMA_RXINTWDT_RIWT_Pos) /*!< GMACDMA_T::RXINTWDT: RIWT Mask*/ + +#define GMACDMA_AXIMODE_UNDEF_Pos (0) /*!< GMACDMA_T::AXIMODE: UNDEF Position */ +#define GMACDMA_AXIMODE_UNDEF_Msk (0x1ul << GMACDMA_AXIMODE_UNDEF_Pos) /*!< GMACDMA_T::AXIMODE: UNDEF Mask */ + +#define GMACDMA_AXIMODE_BLEN4_Pos (1) /*!< GMACDMA_T::AXIMODE: BLEN4 Position */ +#define GMACDMA_AXIMODE_BLEN4_Msk (0x1ul << GMACDMA_AXIMODE_BLEN4_Pos) /*!< GMACDMA_T::AXIMODE: BLEN4 Mask */ + +#define GMACDMA_AXIMODE_BLEN8_Pos (2) /*!< GMACDMA_T::AXIMODE: BLEN8 Position */ +#define GMACDMA_AXIMODE_BLEN8_Msk (0x1ul << GMACDMA_AXIMODE_BLEN8_Pos) /*!< GMACDMA_T::AXIMODE: BLEN8 Mask */ + +#define GMACDMA_AXIMODE_BLEN16_Pos (3) /*!< GMACDMA_T::AXIMODE: BLEN16 Position */ +#define GMACDMA_AXIMODE_BLEN16_Msk (0x1ul << GMACDMA_AXIMODE_BLEN16_Pos) /*!< GMACDMA_T::AXIMODE: BLEN16 Mask */ + +#define GMACDMA_AXIMODE_AXI_AAL_Pos (12) /*!< GMACDMA_T::AXIMODE: AXI_AAL Position */ +#define GMACDMA_AXIMODE_AXI_AAL_Msk (0x1ul << GMACDMA_AXIMODE_AXI_AAL_Pos) /*!< GMACDMA_T::AXIMODE: AXI_AAL Mask */ + +#define GMACDMA_AXIMODE_ONEKBBE_Pos (13) /*!< GMACDMA_T::AXIMODE: ONEKBBE Position */ +#define GMACDMA_AXIMODE_ONEKBBE_Msk (0x1ul << GMACDMA_AXIMODE_ONEKBBE_Pos) /*!< GMACDMA_T::AXIMODE: ONEKBBE Mask */ + +#define GMACDMA_AXIMODE_RD_OSR_LMT_Pos (16) /*!< GMACDMA_T::AXIMODE: RD_OSR_LMT Position */ +#define GMACDMA_AXIMODE_RD_OSR_LMT_Msk (0x3ul << GMACDMA_AXIMODE_RD_OSR_LMT_Pos) /*!< GMACDMA_T::AXIMODE: RD_OSR_LMT Mask */ + +#define GMACDMA_AXIMODE_RD_OSR_LMT_GT4_Pos (18) /*!< GMACDMA_T::AXIMODE: RD_OSR_LMT_GT4 Position*/ +#define GMACDMA_AXIMODE_RD_OSR_LMT_GT4_Msk (0x1ul << GMACDMA_AXIMODE_RD_OSR_LMT_GT4_Pos) /*!< GMACDMA_T::AXIMODE: RD_OSR_LMT_GT4 Mask */ + +#define GMACDMA_AXIMODE_RD_OSR_LMT_GT8_Pos (19) /*!< GMACDMA_T::AXIMODE: RD_OSR_LMT_GT8 Position*/ +#define GMACDMA_AXIMODE_RD_OSR_LMT_GT8_Msk (0x1ul << GMACDMA_AXIMODE_RD_OSR_LMT_GT8_Pos) /*!< GMACDMA_T::AXIMODE: RD_OSR_LMT_GT8 Mask */ + +#define GMACDMA_AXIMODE_WR_OSR_LMT_Pos (20) /*!< GMACDMA_T::AXIMODE: WR_OSR_LMT Position */ +#define GMACDMA_AXIMODE_WR_OSR_LMT_Msk (0x3ul << GMACDMA_AXIMODE_WR_OSR_LMT_Pos) /*!< GMACDMA_T::AXIMODE: WR_OSR_LMT Mask */ + +#define GMACDMA_AXIMODE_WR_OSR_LMT_GT4_Pos (22) /*!< GMACDMA_T::AXIMODE: WR_OSR_LMT_GT4 Position*/ +#define GMACDMA_AXIMODE_WR_OSR_LMT_GT4_Msk (0x1ul << GMACDMA_AXIMODE_WR_OSR_LMT_GT4_Pos) /*!< GMACDMA_T::AXIMODE: WR_OSR_LMT_GT4 Mask */ + +#define GMACDMA_AXIMODE_WR_OSR_LMT_GT8_Pos (23) /*!< GMACDMA_T::AXIMODE: WR_OSR_LMT_GT8 Position*/ +#define GMACDMA_AXIMODE_WR_OSR_LMT_GT8_Msk (0x1ul << GMACDMA_AXIMODE_WR_OSR_LMT_GT8_Pos) /*!< GMACDMA_T::AXIMODE: WR_OSR_LMT_GT8 Mask */ + +#define GMACDMA_AXIMODE_LPI_XIT_FRM_Pos (30) /*!< GMACDMA_T::AXIMODE: LPI_XIT_FRM Position */ +#define GMACDMA_AXIMODE_LPI_XIT_FRM_Msk (0x1ul << GMACDMA_AXIMODE_LPI_XIT_FRM_Pos) /*!< GMACDMA_T::AXIMODE: LPI_XIT_FRM Mask */ + +#define GMACDMA_AXIMODE_EN_LPI_Pos (31) /*!< GMACDMA_T::AXIMODE: EN_LPI Position */ +#define GMACDMA_AXIMODE_EN_LPI_Msk (0x1ul << GMACDMA_AXIMODE_EN_LPI_Pos) /*!< GMACDMA_T::AXIMODE: EN_LPI Mask */ + +#define GMACDMA_BUSSTS_AXWHSTS_Pos (0) /*!< GMACDMA_T::BUSSTS: AXWHSTS Position*/ +#define GMACDMA_BUSSTS_AXWHSTS_Msk (0x1ul << GMACDMA_BUSSTS_AXWHSTS_Pos) /*!< GMACDMA_T::BUSSTS: AXWHSTS Mask */ + +#define GMACDMA_BUSSTS_AXIRDSTS_Pos (1) /*!< GMACDMA_T::BUSSTS: AXIRDSTS Position*/ +#define GMACDMA_BUSSTS_AXIRDSTS_Msk (0x1ul << GMACDMA_BUSSTS_AXIRDSTS_Pos) /*!< GMACDMA_T::BUSSTS: AXIRDSTS Mask */ + +#define GMACDMA_CTXDESC_CURTDESAPTR_Pos (0) /*!< GMACDMA_T::CTXDESC: CURTDESAPTR Position*/ +#define GMACDMA_CTXDESC_CURTDESAPTR_Msk (0xfffffffful << GMACDMA_CTXDESC_CURTDESAPTR_Pos) /*!< GMACDMA_T::CTXDESC: CURTDESAPTR Mask*/ + +#define GMACDMA_CRXDESC_CURRDESAPTR_Pos (0) /*!< GMACDMA_T::CRXDESC: CURRDESAPTR Position*/ +#define GMACDMA_CRXDESC_CURRDESAPTR_Msk (0xfffffffful << GMACDMA_CRXDESC_CURRDESAPTR_Pos) /*!< GMACDMA_T::CRXDESC: CURRDESAPTR Mask*/ + +#define GMACDMA_CTXBUF_CURTBUFAPTR_Pos (0) /*!< GMACDMA_T::CTXBUF: CURTBUFAPTR Position*/ +#define GMACDMA_CTXBUF_CURTBUFAPTR_Msk (0xfffffffful << GMACDMA_CTXBUF_CURTBUFAPTR_Pos) /*!< GMACDMA_T::CTXBUF: CURTBUFAPTR Mask*/ + +#define GMACDMA_CRXBUF_CURRBUFAPTR_Pos (0) /*!< GMACDMA_T::CRXBUF: CURRBUFAPTR Position*/ +#define GMACDMA_CRXBUF_CURRBUFAPTR_Msk (0xfffffffful << GMACDMA_CRXBUF_CURRBUFAPTR_Pos) /*!< GMACDMA_T::CRXBUF: CURRBUFAPTR Mask*/ + +#define GMACDMA_HWFEAT_MIISEL_Pos (0) /*!< GMACDMA_T::HWFEAT: MIISEL Position */ +#define GMACDMA_HWFEAT_MIISEL_Msk (0x1ul << GMACDMA_HWFEAT_MIISEL_Pos) /*!< GMACDMA_T::HWFEAT: MIISEL Mask */ + +#define GMACDMA_HWFEAT_GMIISEL_Pos (1) /*!< GMACDMA_T::HWFEAT: GMIISEL Position */ +#define GMACDMA_HWFEAT_GMIISEL_Msk (0x1ul << GMACDMA_HWFEAT_GMIISEL_Pos) /*!< GMACDMA_T::HWFEAT: GMIISEL Mask */ + +#define GMACDMA_HWFEAT_HDSEL_Pos (2) /*!< GMACDMA_T::HWFEAT: HDSEL Position */ +#define GMACDMA_HWFEAT_HDSEL_Msk (0x1ul << GMACDMA_HWFEAT_HDSEL_Pos) /*!< GMACDMA_T::HWFEAT: HDSEL Mask */ + +#define GMACDMA_HWFEAT_EXTHASHEN_Pos (3) /*!< GMACDMA_T::HWFEAT: EXTHASHEN Position */ +#define GMACDMA_HWFEAT_EXTHASHEN_Msk (0x1ul << GMACDMA_HWFEAT_EXTHASHEN_Pos) /*!< GMACDMA_T::HWFEAT: EXTHASHEN Mask */ + +#define GMACDMA_HWFEAT_HASHSEL_Pos (4) /*!< GMACDMA_T::HWFEAT: HASHSEL Position */ +#define GMACDMA_HWFEAT_HASHSEL_Msk (0x1ul << GMACDMA_HWFEAT_HASHSEL_Pos) /*!< GMACDMA_T::HWFEAT: HASHSEL Mask */ + +#define GMACDMA_HWFEAT_ADDMACADRSEL_Pos (5) /*!< GMACDMA_T::HWFEAT: ADDMACADRSEL Position */ +#define GMACDMA_HWFEAT_ADDMACADRSEL_Msk (0x1ul << GMACDMA_HWFEAT_ADDMACADRSEL_Pos) /*!< GMACDMA_T::HWFEAT: ADDMACADRSEL Mask */ + +#define GMACDMA_HWFEAT_PCSSEL_Pos (6) /*!< GMACDMA_T::HWFEAT: PCSSEL Position */ +#define GMACDMA_HWFEAT_PCSSEL_Msk (0x1ul << GMACDMA_HWFEAT_PCSSEL_Pos) /*!< GMACDMA_T::HWFEAT: PCSSEL Mask */ + +#define GMACDMA_HWFEAT_L3L4FLTREN_Pos (7) /*!< GMACDMA_T::HWFEAT: L3L4FLTREN Position */ +#define GMACDMA_HWFEAT_L3L4FLTREN_Msk (0x1ul << GMACDMA_HWFEAT_L3L4FLTREN_Pos) /*!< GMACDMA_T::HWFEAT: L3L4FLTREN Mask */ + +#define GMACDMA_HWFEAT_SMASEL_Pos (8) /*!< GMACDMA_T::HWFEAT: SMASEL Position */ +#define GMACDMA_HWFEAT_SMASEL_Msk (0x1ul << GMACDMA_HWFEAT_SMASEL_Pos) /*!< GMACDMA_T::HWFEAT: SMASEL Mask */ + +#define GMACDMA_HWFEAT_RWKSEL_Pos (9) /*!< GMACDMA_T::HWFEAT: RWKSEL Position */ +#define GMACDMA_HWFEAT_RWKSEL_Msk (0x1ul << GMACDMA_HWFEAT_RWKSEL_Pos) /*!< GMACDMA_T::HWFEAT: RWKSEL Mask */ + +#define GMACDMA_HWFEAT_MGKSEL_Pos (10) /*!< GMACDMA_T::HWFEAT: MGKSEL Position */ +#define GMACDMA_HWFEAT_MGKSEL_Msk (0x1ul << GMACDMA_HWFEAT_MGKSEL_Pos) /*!< GMACDMA_T::HWFEAT: MGKSEL Mask */ + +#define GMACDMA_HWFEAT_MMCSEL_Pos (11) /*!< GMACDMA_T::HWFEAT: MMCSEL Position */ +#define GMACDMA_HWFEAT_MMCSEL_Msk (0x1ul << GMACDMA_HWFEAT_MMCSEL_Pos) /*!< GMACDMA_T::HWFEAT: MMCSEL Mask */ + +#define GMACDMA_HWFEAT_TSVER1SEL_Pos (12) /*!< GMACDMA_T::HWFEAT: TSVER1SEL Position */ +#define GMACDMA_HWFEAT_TSVER1SEL_Msk (0x1ul << GMACDMA_HWFEAT_TSVER1SEL_Pos) /*!< GMACDMA_T::HWFEAT: TSVER1SEL Mask */ + +#define GMACDMA_HWFEAT_TSVER2SEL_Pos (13) /*!< GMACDMA_T::HWFEAT: TSVER2SEL Position */ +#define GMACDMA_HWFEAT_TSVER2SEL_Msk (0x1ul << GMACDMA_HWFEAT_TSVER2SEL_Pos) /*!< GMACDMA_T::HWFEAT: TSVER2SEL Mask */ + +#define GMACDMA_HWFEAT_EEESEL_Pos (14) /*!< GMACDMA_T::HWFEAT: EEESEL Position */ +#define GMACDMA_HWFEAT_EEESEL_Msk (0x1ul << GMACDMA_HWFEAT_EEESEL_Pos) /*!< GMACDMA_T::HWFEAT: EEESEL Mask */ + +#define GMACDMA_HWFEAT_AVSEL_Pos (15) /*!< GMACDMA_T::HWFEAT: AVSEL Position */ +#define GMACDMA_HWFEAT_AVSEL_Msk (0x1ul << GMACDMA_HWFEAT_AVSEL_Pos) /*!< GMACDMA_T::HWFEAT: AVSEL Mask */ + +#define GMACDMA_HWFEAT_TXCOESEL_Pos (16) /*!< GMACDMA_T::HWFEAT: TXCOESEL Position */ +#define GMACDMA_HWFEAT_TXCOESEL_Msk (0x1ul << GMACDMA_HWFEAT_TXCOESEL_Pos) /*!< GMACDMA_T::HWFEAT: TXCOESEL Mask */ + +#define GMACDMA_HWFEAT_RXTYP1COE_Pos (17) /*!< GMACDMA_T::HWFEAT: RXTYP1COE Position */ +#define GMACDMA_HWFEAT_RXTYP1COE_Msk (0x1ul << GMACDMA_HWFEAT_RXTYP1COE_Pos) /*!< GMACDMA_T::HWFEAT: RXTYP1COE Mask */ + +#define GMACDMA_HWFEAT_RXTYP2COE_Pos (18) /*!< GMACDMA_T::HWFEAT: RXTYP2COE Position */ +#define GMACDMA_HWFEAT_RXTYP2COE_Msk (0x1ul << GMACDMA_HWFEAT_RXTYP2COE_Pos) /*!< GMACDMA_T::HWFEAT: RXTYP2COE Mask */ + +#define GMACDMA_HWFEAT_RXFIFOSIZE_Pos (19) /*!< GMACDMA_T::HWFEAT: RXFIFOSIZE Position */ +#define GMACDMA_HWFEAT_RXFIFOSIZE_Msk (0x1ul << GMACDMA_HWFEAT_RXFIFOSIZE_Pos) /*!< GMACDMA_T::HWFEAT: RXFIFOSIZE Mask */ + +#define GMACDMA_HWFEAT_RXCHCNT_Pos (20) /*!< GMACDMA_T::HWFEAT: RXCHCNT Position */ +#define GMACDMA_HWFEAT_RXCHCNT_Msk (0x3ul << GMACDMA_HWFEAT_RXCHCNT_Pos) /*!< GMACDMA_T::HWFEAT: RXCHCNT Mask */ + +#define GMACDMA_HWFEAT_TXCHCNT_Pos (22) /*!< GMACDMA_T::HWFEAT: TXCHCNT Position */ +#define GMACDMA_HWFEAT_TXCHCNT_Msk (0x3ul << GMACDMA_HWFEAT_TXCHCNT_Pos) /*!< GMACDMA_T::HWFEAT: TXCHCNT Mask */ + +#define GMACDMA_HWFEAT_ENHDESSEL_Pos (24) /*!< GMACDMA_T::HWFEAT: ENHDESSEL Position */ +#define GMACDMA_HWFEAT_ENHDESSEL_Msk (0x1ul << GMACDMA_HWFEAT_ENHDESSEL_Pos) /*!< GMACDMA_T::HWFEAT: ENHDESSEL Mask */ + +#define GMACDMA_HWFEAT_INTTSEN_Pos (25) /*!< GMACDMA_T::HWFEAT: INTTSEN Position */ +#define GMACDMA_HWFEAT_INTTSEN_Msk (0x1ul << GMACDMA_HWFEAT_INTTSEN_Pos) /*!< GMACDMA_T::HWFEAT: INTTSEN Mask */ + +#define GMACDMA_HWFEAT_FLEXIPPSEN_Pos (26) /*!< GMACDMA_T::HWFEAT: FLEXIPPSEN Position */ +#define GMACDMA_HWFEAT_FLEXIPPSEN_Msk (0x1ul << GMACDMA_HWFEAT_FLEXIPPSEN_Pos) /*!< GMACDMA_T::HWFEAT: FLEXIPPSEN Mask */ + +#define GMACDMA_HWFEAT_SAVLANINS_Pos (27) /*!< GMACDMA_T::HWFEAT: SAVLANINS Position */ +#define GMACDMA_HWFEAT_SAVLANINS_Msk (0x1ul << GMACDMA_HWFEAT_SAVLANINS_Pos) /*!< GMACDMA_T::HWFEAT: SAVLANINS Mask */ + +#define GMACDMA_HWFEAT_ACTPHYIF_Pos (28) /*!< GMACDMA_T::HWFEAT: ACTPHYIF Position */ +#define GMACDMA_HWFEAT_ACTPHYIF_Msk (0x7ul << GMACDMA_HWFEAT_ACTPHYIF_Pos) /*!< GMACDMA_T::HWFEAT: ACTPHYIF Mask */ + +/**@}*/ /* GMACDMA_CONST */ +/**@}*/ /* end of GMACDMA register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __GMAC_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/gpio_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/gpio_reg.h new file mode 100644 index 0000000000..c969d76b76 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/gpio_reg.h @@ -0,0 +1,1221 @@ +/**************************************************************************//** + * @file gpio_reg.h + * @brief GPIO register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __GPIO_REG_H__ +#define __GPIO_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup GPIO General Purpose Input/Output Controller(GPIO) + Memory Mapped Structure for GPIO Controller +@{ */ + + +typedef struct +{ + + /** + * @var GPIO_T::MODE + * Offset: 0x00/0x40/0x80/0xC0/0x100/0x140/0x180/0x1C0/0x200/0x240/0x280/0x2C0/0x300/0x340 Port A-N I/O Mode Control + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2n+1:2n]|MODEn |Port A-N I/O Pin[n] Mode Control + * | | |Determine each I/O mode of Px.n pins. + * | | |00 = Px.n is in Input mode. + * | | |01 = Px.n is in Push-pull Output mode. + * | | |10 = Px.n is in Open-drain Output mode. + * | | |11 = Reserved. + * | | |Note 1: The default value is 0x0000_0000 and all pins will be input mode after chip powered on. + * | | |Note 2: If MFOS is enabled then GPIO mode setting is ignored. + * @var GPIO_T::DINOFF + * Offset: 0x04/0x44/0x84/0xC4/0x104/0x144/0x184/0x1C4/0x204/0x244/0x284/0x2C4/0x304/0x344 Port A-N Digital Input Path Disable Control + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n+16] |DINOFFn |Port A-N Pin[n] Digital Input Path Disable Bit + * | | |Each of these bits is used to control if the digital input path of corresponding Px.n pin is disabled. + * | | |If input is analog signal, users can disable Px.n digital input path to avoid input current leakage. + * | | |0 = Px.n digital input path Enabled. + * | | |1 = Px.n digital input path Disabled (digital input tied to low). + * @var GPIO_T::DOUT + * Offset: 0x08/0x48/0x88/0xC8/0x108/0x148/0x188/0x1C8/0x208/0x248/0x288/0x2C8/0x308/0x348 Port A-N Data Output Value + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |DOUTn |Port A-N Pin[n] Output Value + * | | |Each of these bits controls the status of a Px.n pin when the Px.n is configured as Push-pull output, Open-drain output or Quasi-bidirectional mode. + * | | |0 = Px.n will drive Low if the Px.n pin is configured as Push-pull output, Open-drain output or Quasi-bidirectional mode. + * | | |1 = Px.n will drive High if the Px.n pin is configured as Push-pull output or Quasi-bidirectional mode. + * @var GPIO_T::DATMSK + * Offset: 0x0C/0x4C/0x8C/0xCC/0x10C/0x14C/0x18C/0x1CC/0x20C/0x24C/0x28C/0x2CC/0x30C/0x34C Port A-N Data Output Write Mask + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |DATMSKn |Port A-N Pin[n] Data Output Write Mask + * | | |These bits are used to protect the corresponding DOUT (Px_DOUT[n]) bit + * | | |When the DATMSK (Px_DATMSK[n]) bit is set to 1, the corresponding DOUT (Px_DOUT[n]) bit is protected. + * | | |If the write signal is masked, writing data to the protect bit is ignored. + * | | |0 = Corresponding DOUT (Px_DOUT[n]) bit can be updated. + * | | |1 = Corresponding DOUT (Px_DOUT[n]) bit protected. + * | | |Note: This function only protects the corresponding DOUT (Px_DOUT[n]) bit, and will not protect the corresponding PDIO (Pxn_PDIO[0]) bit. + * @var GPIO_T::PIN + * Offset: 0x10/0x50/0x90/0xD0/0x110/0x150/0x190/0x1D0/0x210/0x250/0x290/0x2D0/0x310/0x350 Port A-N Pin Value + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |PINn |Port A-N Pin[n] Pin Value + * | | |Each bit of the register reflects the actual status of the respective Px.n pin. + * | | |If the bit is 1, it indicates the corresponding pin status is high; else the pin status is low. + * @var GPIO_T::DBEN + * Offset: 0x14/0x54/0x94/0xD4/0x114/0x154/0x194/0x1D4/0x214/0x254/0x294/0x2D4/0x314/0x354 Port A-N De-Bounce Enable Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |DBENn |Port A-N Pin[n] Input Signal De-Bounce Enable Bit + * | | |The DBEN[n] bit is used to enable the de-bounce function for each corresponding bit. + * | | |If the input signal pulse width cannot be sampled by continuous two de-bounce sample cycle, the input signal transition is seen as the signal bounce and will not trigger the interrupt. + * | | |The de-bounce clock source is controlled by DBCLKSRC (GPIO_DBCTL [4]), one de-bounce sample cycle period is controlled by DBCLKSEL (GPIO_DBCTL [3:0]). + * | | |0 = Px.n de-bounce function Disabled. + * | | |1 = Px.n de-bounce function Enabled. + * | | |The de-bounce function is valid only for edge triggered interrupt. + * | | |If the interrupt mode is level triggered, the de-bounce enable bit is ignored. + * @var GPIO_T::INTTYPE + * Offset: 0x18/0x58/0x98/0xD8/0x118/0x158/0x198/0x1D8/0x218/0x258/0x298/0x2D8/0x318/0x358 Port A-N Interrupt Trigger Type Control + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |TYPEn |Port A-N Pin[n] Edge or Level Detection Interrupt Trigger Type Control + * | | |TYPE (Px_INTTYPE[n]) bit is used to control the triggered interrupt is by level trigger or by edge trigger. + * | | |If the interrupt is by edge trigger, the trigger source can be controlled by de-bounce. + * | | |If the interrupt is by level trigger, the input source is sampled by one HCLK clock and generates the interrupt. + * | | |0 = Edge trigger interrupt. + * | | |1 = Level trigger interrupt. + * | | |If the pin is set as the level trigger interrupt, only one level can be set on the registers RHIEN (Px_INTEN[n+16])/FLIEN (Px_INTEN[n]). + * | | |If both levels to trigger interrupt are set, the setting is ignored and no interrupt will occur. + * | | |The de-bounce function is valid only for edge triggered interrupt. + * | | |If the interrupt mode is level triggered, the de-bounce enable bit is ignored. + * @var GPIO_T::INTEN + * Offset: 0x1C/0x5C/0x9C/0xDC/0x11C/0x15C/0x19C/0x1DC/0x21C/0x25C/0x29C/0x2DC/0x31C/0x35C Port A-N Interrupt Enable Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |FLIENn |Port A-N Pin[n] Falling Edge or Low Level Interrupt Trigger Type Enable Bit + * | | |The FLIEN (Px_INTEN[n]) bit is used to enable the interrupt for each of the corresponding input Px.n pin. + * | | |Set bit to 1 also enable the pin wake-up function. + * | | |When setting the FLIEN (Px_INTEN[n]) bit to 1 : + * | | |If the interrupt is level trigger (TYPE (Px_INTTYPE[n]) bit is set to 1), the input Px.n pin will generate the interrupt while this pin state is at low level. + * | | |If the interrupt is edge trigger(TYPE (Px_INTTYPE[n]) bit is set to 0), the input Px.n pin will generate the interrupt while this pin state changed from high to low. + * | | |0 = Px.n level low or high to low interrupt Disabled. + * | | |1 = Px.n level low or high to low interrupt Enabled. + * |[n+16] |RHIENn |Port A-N Pin[n] Rising Edge or High Level Interrupt Trigger Type Enable Bit + * | | |The RHIEN (Px_INTEN[n+16]) bit is used to enable the interrupt for each of the corresponding input Px.n pin + * | | |Set bit to 1 also enable the pin wake-up function. + * | | |When setting the RHIEN (Px_INTEN[n+16]) bit to 1 : + * | | |If the interrupt is level trigger (TYPE (Px_INTTYPE[n]) bit is set to 1), the input Px.n pin will generate the interrupt while this pin state is at high level. + * | | |If the interrupt is edge trigger (TYPE (Px_INTTYPE[n]) bit is set to 0), the input Px.n pin will generate the interrupt while this pin state changed from low to high. + * | | |0 = Px.n level high or low to high interrupt Disabled. + * | | |1 = Px.n level high or low to high interrupt Enabled. + * @var GPIO_T::INTSRC + * Offset: 0x20/0x60/0xA0/0xE0/0x120/0x160/0x1A0/0x1E0/0x220/0x260/0x2A0/0x2E0/0x320/0x360 Port A-N Interrupt Source Flag + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |INTSRCn |Port A-N Pin[n] Interrupt Source Flag + * | | |Write Operation : + * | | |0 = No action. + * | | |1 = Clear the corresponding pending interrupt. + * | | |Read Operation : + * | | |0 = No interrupt at Px.n. + * | | |1 = Px.n generates an interrupt. + * @var GPIO_T::SMTEN + * Offset: 0x24/0x64/0xA4/0xE4/0x124/0x164/0x1A4/0x1E4/0x224/0x264/0x2A4/0x2E4/0x324/0x364 Port A-N Input Schmitt Trigger Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[n] |SMTENn |Port A-N Pin[n] Input Schmitt Trigger Enable Bit + * | | |0 = Px.n input Schmitt trigger function Disabled. + * | | |1 = Px.n input Schmitt trigger function Enabled. + * @var GPIO_T::SLEWCTL + * Offset: 0x28/0x68/0xA8/0xE8/0x128/0x168/0x1A8/0x1E8/0x228/0x268/0x2A8/0x2E8/0x328/0x368 Port A-N High Slew Rate Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2n+1:2n]|HSRENn |Port A-N Pin[n] High Slew Rate Control + * | | |00 = Px.n output with normal slew rate mode. + * | | |01 = Px.n output with high slew rate mode . + * | | |10 = Reserved. + * | | |11 = Reserved. + * @var GPIO_T::PUSEL + * Offset: 0x30/0x70/0xB0/0xF0/0x130/0x170/0x1B0/0x1F0/0x230/0x270/0x2B0/0x2F0/0x330/0x370 Port A-N Pull-up and Pull-down Selection Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2n+1:2n]|PUSELn |Port A-N Pin[n] Pull-up and Pull-down Enable Register + * | | |Determine each I/O Pull-up/pull-down of Px.n pins. + * | | |00 = Px.n pull-up and pull-down disable. + * | | |01 = Px.n pull-up enable. + * | | |10 = Px.n pull-down enable. + * | | |11 = Px.n pull-up and pull-down disable. + * | | |Note: Basically, the pull-up control and pull-down control has following behavior limitation. + * | | |The independent pull-up control register only valid when MODEn is set as input and open-drain mode even if I/O function is switched to multi-function pin, e.g + * | | |UARTx_RXD. + * | | |The independent pull-down control register is only valid when MODEn set as tri-state mode. + * | | |When both pull-up pull-down is set as 1 at "tri-state" mode, keep I/O in tri-state mode. + * @var GPIO_T::DBCTL + * Offset: 0x34/0x74/0xB4/0xF4/0x134/0x174/0x1B4/0x1F4/0x234/0x274/0x2B4/0x2F4/0x334/0x374 Port A-N Interrupt De-bounce Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |DBCLKSEL |De-bounce Sampling Cycle Selection + * | | |0000 = Sample interrupt input once per 1 clocks. + * | | |0001 = Sample interrupt input once per 2 clocks. + * | | |0010 = Sample interrupt input once per 4 clocks. + * | | |0011 = Sample interrupt input once per 8 clocks. + * | | |0100 = Sample interrupt input once per 16 clocks. + * | | |0101 = Sample interrupt input once per 32 clocks. + * | | |0110 = Sample interrupt input once per 64 clocks. + * | | |0111 = Sample interrupt input once per 128 clocks. + * | | |1000 = Sample interrupt input once per 256 clocks. + * | | |1001 = Sample interrupt input once per 2*256 clocks. + * | | |1010 = Sample interrupt input once per 4*256 clocks. + * | | |1011 = Sample interrupt input once per 8*256 clocks. + * | | |1100 = Sample interrupt input once per 16*256 clocks. + * | | |1101 = Sample interrupt input once per 32*256 clocks. + * | | |1110 = Sample interrupt input once per 64*256 clocks. + * | | |1111 = Sample interrupt input once per 128*256 clocks. + * |[4] |DBCLKSRC |De-bounce Counter Clock Source Selection + * | | |0 = De-bounce counter clock source is the HXT. + * | | |1 = De-bounce counter clock source is the LIRC. + * | | |Note: This bit is reserved if the chip package without LIRC + * | | |The de-bounce counter clock source is only from HXT + * | | |And setting this bit does not guarantee what will occur. + * |[5] |ICLKON |Interrupt Clock on Mode + * | | |0 = Edge detection circuit is active only if I/O pin corresponding RHIEN (Px_INTEN[n+16])/FLIEN (Px_INTEN[n]) bit is set to 1. + * | | |1 = All I/O pins edge detection circuit is always active after reset. + * | | |Note: It is recommended to disable this bit to save system power if no special application concern. + * @var GPIO_T::DS + * Offset: 0x38 0x38/0x78/0xB8/0xF8/0x138/0x178/0x1B8/0x1F8/0x238/0x278/0x2B8/0x2F8/0x338/0x378 Port A-N Driver Strength Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DS10_DS00 |Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[1] |DS11_DS01 |Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[2] |DS12_DS02 |Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[3] |DS13_DS03 |Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[4] |DS14_DS04 |Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[5] |DS15_DS05 |Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[6] |DS16_DS06 |Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[7] |DS17_DS07 |Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[8] |DS18_DS08 |Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[9] |DS19_DS09 |Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[10] |DS110_DS010|Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[11] |DS111_DS011|Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[12] |DS112_DS012|Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[13] |DS113_DS013|Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[14] |DS114_DS014|Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * |[15] |DS115_DS015|Port A-N Pin[n] Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |00 = [ DS1n, DS0n] is minimum diver strength. + * | | |11 = [ DS1n, DS0n] is maximum diver strength. + * | | |Note: PH_DS bit20~bit23 are reserved. + * | | |The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is minimum. + * @var GPIO_T::PA_UDS + * Offset: 0x3C/0x7C/0xBC/0xFC/0x13C/0x17C/0x1BC/0x1FC/0x23C/0x27C/0x2BC/0x2FC/0x33C/0x37C Port A-N Ultra Driver Strength Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |UDS0 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[1] |UDS1 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[2] |UDS2 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[3] |UDS3 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[4] |UDS4 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[5] |UDS5 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[6] |UDS6 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[7] |UDS7 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[8] |UDS8 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[9] |UDS9 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[10] |UDS10 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[11] |UDS11 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[12] |UDS12 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[13] |UDS13 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[14] |UDS14 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + * |[15] |UDS15 |Port A-N Pin[n] Ultra Driver Strength Control Register + * | | |Determine each driver strength of Px.n pins. + * | | |0 = Px.n is minimum deiver strength. + * | | |1 = Px.n is maximum deiver strength. + * | | |Note: The UDS and DS bits are Px.n driver strength control bits. + * | | |When [ UDS, DS1, DS0 ] are "111", the driver strength is the maximum. + * | | |When [ UDS, DS1, DS0 ] are "000", the driver strength is the minimum. + */ + + __IO uint32_t MODE; /* Offset: 0x00/0x40/0x80/0xC0/0x100/0x140/0x180/0x1C0/0x200/0x240/0x280/0x2C0/0x300/0x340 Port A-N I/O Mode Control */ + __IO uint32_t DINOFF; /* Offset: 0x04/0x44/0x84/0xC4/0x104/0x144/0x184/0x1C4/0x204/0x244/0x284/0x2C4/0x304/0x344 Port A-N Digital Input Path Disable Control */ + __IO uint32_t DOUT; /* Offset: 0x08/0x48/0x88/0xC8/0x108/0x148/0x188/0x1C8/0x208/0x248/0x288/0x2C8/0x308/0x348 Port A-N Data Output Value */ + __IO uint32_t DATMSK; /* Offset: 0x0C/0x4C/0x8C/0xCC/0x10C/0x14C/0x18C/0x1CC/0x20C/0x24C/0x28C/0x2CC/0x30C/0x34C Port A-N Data Output Write Mask */ + __I uint32_t PIN; /* Offset: 0x10/0x50/0x90/0xD0/0x110/0x150/0x190/0x1D0/0x210/0x250/0x290/0x2D0/0x310/0x350 Port A-N Pin Value */ + __IO uint32_t DBEN; /* Offset: 0x14/0x54/0x94/0xD4/0x114/0x154/0x194/0x1D4/0x214/0x254/0x294/0x2D4/0x314/0x354 Port A-N De-Bounce Enable Control Register */ + __IO uint32_t INTTYPE; /* Offset: 0x18/0x58/0x98/0xD8/0x118/0x158/0x198/0x1D8/0x218/0x258/0x298/0x2D8/0x318/0x358 Port A-N Interrupt Trigger Type Control */ + __IO uint32_t INTEN; /* Offset: 0x1C/0x5C/0x9C/0xDC/0x11C/0x15C/0x19C/0x1DC/0x21C/0x25C/0x29C/0x2DC/0x31C/0x35C Port A-N Interrupt Enable Control Register */ + __IO uint32_t INTSRC; /* Offset: 0x20/0x60/0xA0/0xE0/0x120/0x160/0x1A0/0x1E0/0x220/0x260/0x2A0/0x2E0/0x320/0x360 Port A-N Interrupt Source Flag */ + __IO uint32_t SMTEN; /* Offset: 0x24/0x64/0xA4/0xE4/0x124/0x164/0x1A4/0x1E4/0x224/0x264/0x2A4/0x2E4/0x324/0x364 Port A-N Input Schmitt Trigger Enable Register */ + __IO uint32_t SLEWCTL; /* Offset: 0x28/0x68/0xA8/0xE8/0x128/0x168/0x1A8/0x1E8/0x228/0x268/0x2A8/0x2E8/0x328/0x368 Port A-N High Slew Rate Control Register */ + __IO uint32_t SPW; /* Offset: 0x06C/0xAC/0xEC/0x12C/0x16C/0x1AC/0x26C/0x2AC/0x36C */ + __IO uint32_t PUSEL; /* Offset: 0x30/0x70/0xB0/0xF0/0x130/0x170/0x1B0/0x1F0/0x230/0x270/0x2B0/0x2F0/0x330/0x370 Port A-N Pull-up and Pull-down Enable Register */ + __IO uint32_t DBCTL; /* Offset: 0x34/0x74/0xB4/0xF4/0x134/0x174/0x1B4/0x1F4/0x234/0x274/0x2B4/0x2F4/0x334/0x374 Port A-N Interrupt De-bounce Control Register */ + __IO uint32_t DSL; /* Offset: 0x38/0x78/0xB8/0xF8/0x138/0x178/0x1B8/0x1F8/0x238/0x278/0x2B8/0x2F8/0x338/0x378 Port A-N Low-byte Driver Strength Control Register */ + __IO uint32_t DSH; /* Offset: 0x3c/0x7C/0xBC/0xFC/0x13C/0x17C/0x1BC/0x1FC/0x23C/0x27C/0x2BC/0x2FC/0x33C/0x37C Port A-N High-byte Driver Strength Control Register */ +} GPIO_T; + +/** + @addtogroup GPIO_CONST GPIO Bit Field Definition + Constant Definitions for GPIO Controller +@{ */ + +#define GPIO_MODE_MODE0_Pos (0) /*!< GPIO_T::MODE: MODE0 Position */ +#define GPIO_MODE_MODE0_Msk (0x3ul << GPIO_MODE_MODE0_Pos) /*!< GPIO_T::MODE: MODE0 Mask */ + +#define GPIO_MODE_MODE1_Pos (2) /*!< GPIO_T::MODE: MODE1 Position */ +#define GPIO_MODE_MODE1_Msk (0x3ul << GPIO_MODE_MODE1_Pos) /*!< GPIO_T::MODE: MODE1 Mask */ + +#define GPIO_MODE_MODE2_Pos (4) /*!< GPIO_T::MODE: MODE2 Position */ +#define GPIO_MODE_MODE2_Msk (0x3ul << GPIO_MODE_MODE2_Pos) /*!< GPIO_T::MODE: MODE2 Mask */ + +#define GPIO_MODE_MODE3_Pos (6) /*!< GPIO_T::MODE: MODE3 Position */ +#define GPIO_MODE_MODE3_Msk (0x3ul << GPIO_MODE_MODE3_Pos) /*!< GPIO_T::MODE: MODE3 Mask */ + +#define GPIO_MODE_MODE4_Pos (8) /*!< GPIO_T::MODE: MODE4 Position */ +#define GPIO_MODE_MODE4_Msk (0x3ul << GPIO_MODE_MODE4_Pos) /*!< GPIO_T::MODE: MODE4 Mask */ + +#define GPIO_MODE_MODE5_Pos (10) /*!< GPIO_T::MODE: MODE5 Position */ +#define GPIO_MODE_MODE5_Msk (0x3ul << GPIO_MODE_MODE5_Pos) /*!< GPIO_T::MODE: MODE5 Mask */ + +#define GPIO_MODE_MODE6_Pos (12) /*!< GPIO_T::MODE: MODE6 Position */ +#define GPIO_MODE_MODE6_Msk (0x3ul << GPIO_MODE_MODE6_Pos) /*!< GPIO_T::MODE: MODE6 Mask */ + +#define GPIO_MODE_MODE7_Pos (14) /*!< GPIO_T::MODE: MODE7 Position */ +#define GPIO_MODE_MODE7_Msk (0x3ul << GPIO_MODE_MODE7_Pos) /*!< GPIO_T::MODE: MODE7 Mask */ + +#define GPIO_MODE_MODE8_Pos (16) /*!< GPIO_T::MODE: MODE8 Position */ +#define GPIO_MODE_MODE8_Msk (0x3ul << GPIO_MODE_MODE8_Pos) /*!< GPIO_T::MODE: MODE8 Mask */ + +#define GPIO_MODE_MODE9_Pos (18) /*!< GPIO_T::MODE: MODE9 Position */ +#define GPIO_MODE_MODE9_Msk (0x3ul << GPIO_MODE_MODE9_Pos) /*!< GPIO_T::MODE: MODE9 Mask */ + +#define GPIO_MODE_MODE10_Pos (20) /*!< GPIO_T::MODE: MODE10 Position */ +#define GPIO_MODE_MODE10_Msk (0x3ul << GPIO_MODE_MODE10_Pos) /*!< GPIO_T::MODE: MODE10 Mask */ + +#define GPIO_MODE_MODE11_Pos (22) /*!< GPIO_T::MODE: MODE11 Position */ +#define GPIO_MODE_MODE11_Msk (0x3ul << GPIO_MODE_MODE11_Pos) /*!< GPIO_T::MODE: MODE11 Mask */ + +#define GPIO_MODE_MODE12_Pos (24) /*!< GPIO_T::MODE: MODE12 Position */ +#define GPIO_MODE_MODE12_Msk (0x3ul << GPIO_MODE_MODE12_Pos) /*!< GPIO_T::MODE: MODE12 Mask */ + +#define GPIO_MODE_MODE13_Pos (26) /*!< GPIO_T::MODE: MODE13 Position */ +#define GPIO_MODE_MODE13_Msk (0x3ul << GPIO_MODE_MODE13_Pos) /*!< GPIO_T::MODE: MODE13 Mask */ + +#define GPIO_MODE_MODE14_Pos (28) /*!< GPIO_T::MODE: MODE14 Position */ +#define GPIO_MODE_MODE14_Msk (0x3ul << GPIO_MODE_MODE14_Pos) /*!< GPIO_T::MODE: MODE14 Mask */ + +#define GPIO_MODE_MODE15_Pos (30) /*!< GPIO_T::MODE: MODE15 Position */ +#define GPIO_MODE_MODE15_Msk (0x3ul << GPIO_MODE_MODE15_Pos) /*!< GPIO_T::MODE: MODE15 Mask */ + +#define GPIO_DINOFF_DINOFF0_Pos (16) /*!< GPIO_T::DINOFF: DINOFF0 Position */ +#define GPIO_DINOFF_DINOFF0_Msk (0x1ul << GPIO_DINOFF_DINOFF0_Pos) /*!< GPIO_T::DINOFF: DINOFF0 Mask */ + +#define GPIO_DINOFF_DINOFF1_Pos (17) /*!< GPIO_T::DINOFF: DINOFF1 Position */ +#define GPIO_DINOFF_DINOFF1_Msk (0x1ul << GPIO_DINOFF_DINOFF1_Pos) /*!< GPIO_T::DINOFF: DINOFF1 Mask */ + +#define GPIO_DINOFF_DINOFF2_Pos (18) /*!< GPIO_T::DINOFF: DINOFF2 Position */ +#define GPIO_DINOFF_DINOFF2_Msk (0x1ul << GPIO_DINOFF_DINOFF2_Pos) /*!< GPIO_T::DINOFF: DINOFF2 Mask */ + +#define GPIO_DINOFF_DINOFF3_Pos (19) /*!< GPIO_T::DINOFF: DINOFF3 Position */ +#define GPIO_DINOFF_DINOFF3_Msk (0x1ul << GPIO_DINOFF_DINOFF3_Pos) /*!< GPIO_T::DINOFF: DINOFF3 Mask */ + +#define GPIO_DINOFF_DINOFF4_Pos (20) /*!< GPIO_T::DINOFF: DINOFF4 Position */ +#define GPIO_DINOFF_DINOFF4_Msk (0x1ul << GPIO_DINOFF_DINOFF4_Pos) /*!< GPIO_T::DINOFF: DINOFF4 Mask */ + +#define GPIO_DINOFF_DINOFF5_Pos (21) /*!< GPIO_T::DINOFF: DINOFF5 Position */ +#define GPIO_DINOFF_DINOFF5_Msk (0x1ul << GPIO_DINOFF_DINOFF5_Pos) /*!< GPIO_T::DINOFF: DINOFF5 Mask */ + +#define GPIO_DINOFF_DINOFF6_Pos (22) /*!< GPIO_T::DINOFF: DINOFF6 Position */ +#define GPIO_DINOFF_DINOFF6_Msk (0x1ul << GPIO_DINOFF_DINOFF6_Pos) /*!< GPIO_T::DINOFF: DINOFF6 Mask */ + +#define GPIO_DINOFF_DINOFF7_Pos (23) /*!< GPIO_T::DINOFF: DINOFF7 Position */ +#define GPIO_DINOFF_DINOFF7_Msk (0x1ul << GPIO_DINOFF_DINOFF7_Pos) /*!< GPIO_T::DINOFF: DINOFF7 Mask */ + +#define GPIO_DINOFF_DINOFF8_Pos (24) /*!< GPIO_T::DINOFF: DINOFF8 Position */ +#define GPIO_DINOFF_DINOFF8_Msk (0x1ul << GPIO_DINOFF_DINOFF8_Pos) /*!< GPIO_T::DINOFF: DINOFF8 Mask */ + +#define GPIO_DINOFF_DINOFF9_Pos (25) /*!< GPIO_T::DINOFF: DINOFF9 Position */ +#define GPIO_DINOFF_DINOFF9_Msk (0x1ul << GPIO_DINOFF_DINOFF9_Pos) /*!< GPIO_T::DINOFF: DINOFF9 Mask */ + +#define GPIO_DINOFF_DINOFF10_Pos (26) /*!< GPIO_T::DINOFF: DINOFF10 Position */ +#define GPIO_DINOFF_DINOFF10_Msk (0x1ul << GPIO_DINOFF_DINOFF10_Pos) /*!< GPIO_T::DINOFF: DINOFF10 Mask */ + +#define GPIO_DINOFF_DINOFF11_Pos (27) /*!< GPIO_T::DINOFF: DINOFF11 Position */ +#define GPIO_DINOFF_DINOFF11_Msk (0x1ul << GPIO_DINOFF_DINOFF11_Pos) /*!< GPIO_T::DINOFF: DINOFF11 Mask */ + +#define GPIO_DINOFF_DINOFF12_Pos (28) /*!< GPIO_T::DINOFF: DINOFF12 Position */ +#define GPIO_DINOFF_DINOFF12_Msk (0x1ul << GPIO_DINOFF_DINOFF12_Pos) /*!< GPIO_T::DINOFF: DINOFF12 Mask */ + +#define GPIO_DINOFF_DINOFF13_Pos (29) /*!< GPIO_T::DINOFF: DINOFF13 Position */ +#define GPIO_DINOFF_DINOFF13_Msk (0x1ul << GPIO_DINOFF_DINOFF13_Pos) /*!< GPIO_T::DINOFF: DINOFF13 Mask */ + +#define GPIO_DINOFF_DINOFF14_Pos (30) /*!< GPIO_T::DINOFF: DINOFF14 Position */ +#define GPIO_DINOFF_DINOFF14_Msk (0x1ul << GPIO_DINOFF_DINOFF14_Pos) /*!< GPIO_T::DINOFF: DINOFF14 Mask */ + +#define GPIO_DINOFF_DINOFF15_Pos (31) /*!< GPIO_T::DINOFF: DINOFF15 Position */ +#define GPIO_DINOFF_DINOFF15_Msk (0x1ul << GPIO_DINOFF_DINOFF15_Pos) /*!< GPIO_T::DINOFF: DINOFF15 Mask */ + +#define GPIO_DOUT_DOUT0_Pos (0) /*!< GPIO_T::DOUT: DOUT0 Position */ +#define GPIO_DOUT_DOUT0_Msk (0x1ul << GPIO_DOUT_DOUT0_Pos) /*!< GPIO_T::DOUT: DOUT0 Mask */ + +#define GPIO_DOUT_DOUT1_Pos (1) /*!< GPIO_T::DOUT: DOUT1 Position */ +#define GPIO_DOUT_DOUT1_Msk (0x1ul << GPIO_DOUT_DOUT1_Pos) /*!< GPIO_T::DOUT: DOUT1 Mask */ + +#define GPIO_DOUT_DOUT2_Pos (2) /*!< GPIO_T::DOUT: DOUT2 Position */ +#define GPIO_DOUT_DOUT2_Msk (0x1ul << GPIO_DOUT_DOUT2_Pos) /*!< GPIO_T::DOUT: DOUT2 Mask */ + +#define GPIO_DOUT_DOUT3_Pos (3) /*!< GPIO_T::DOUT: DOUT3 Position */ +#define GPIO_DOUT_DOUT3_Msk (0x1ul << GPIO_DOUT_DOUT3_Pos) /*!< GPIO_T::DOUT: DOUT3 Mask */ + +#define GPIO_DOUT_DOUT4_Pos (4) /*!< GPIO_T::DOUT: DOUT4 Position */ +#define GPIO_DOUT_DOUT4_Msk (0x1ul << GPIO_DOUT_DOUT4_Pos) /*!< GPIO_T::DOUT: DOUT4 Mask */ + +#define GPIO_DOUT_DOUT5_Pos (5) /*!< GPIO_T::DOUT: DOUT5 Position */ +#define GPIO_DOUT_DOUT5_Msk (0x1ul << GPIO_DOUT_DOUT5_Pos) /*!< GPIO_T::DOUT: DOUT5 Mask */ + +#define GPIO_DOUT_DOUT6_Pos (6) /*!< GPIO_T::DOUT: DOUT6 Position */ +#define GPIO_DOUT_DOUT6_Msk (0x1ul << GPIO_DOUT_DOUT6_Pos) /*!< GPIO_T::DOUT: DOUT6 Mask */ + +#define GPIO_DOUT_DOUT7_Pos (7) /*!< GPIO_T::DOUT: DOUT7 Position */ +#define GPIO_DOUT_DOUT7_Msk (0x1ul << GPIO_DOUT_DOUT7_Pos) /*!< GPIO_T::DOUT: DOUT7 Mask */ + +#define GPIO_DOUT_DOUT8_Pos (8) /*!< GPIO_T::DOUT: DOUT8 Position */ +#define GPIO_DOUT_DOUT8_Msk (0x1ul << GPIO_DOUT_DOUT8_Pos) /*!< GPIO_T::DOUT: DOUT8 Mask */ + +#define GPIO_DOUT_DOUT9_Pos (9) /*!< GPIO_T::DOUT: DOUT9 Position */ +#define GPIO_DOUT_DOUT9_Msk (0x1ul << GPIO_DOUT_DOUT9_Pos) /*!< GPIO_T::DOUT: DOUT9 Mask */ + +#define GPIO_DOUT_DOUT10_Pos (10) /*!< GPIO_T::DOUT: DOUT10 Position */ +#define GPIO_DOUT_DOUT10_Msk (0x1ul << GPIO_DOUT_DOUT10_Pos) /*!< GPIO_T::DOUT: DOUT10 Mask */ + +#define GPIO_DOUT_DOUT11_Pos (11) /*!< GPIO_T::DOUT: DOUT11 Position */ +#define GPIO_DOUT_DOUT11_Msk (0x1ul << GPIO_DOUT_DOUT11_Pos) /*!< GPIO_T::DOUT: DOUT11 Mask */ + +#define GPIO_DOUT_DOUT12_Pos (12) /*!< GPIO_T::DOUT: DOUT12 Position */ +#define GPIO_DOUT_DOUT12_Msk (0x1ul << GPIO_DOUT_DOUT12_Pos) /*!< GPIO_T::DOUT: DOUT12 Mask */ + +#define GPIO_DOUT_DOUT13_Pos (13) /*!< GPIO_T::DOUT: DOUT13 Position */ +#define GPIO_DOUT_DOUT13_Msk (0x1ul << GPIO_DOUT_DOUT13_Pos) /*!< GPIO_T::DOUT: DOUT13 Mask */ + +#define GPIO_DOUT_DOUT14_Pos (14) /*!< GPIO_T::DOUT: DOUT14 Position */ +#define GPIO_DOUT_DOUT14_Msk (0x1ul << GPIO_DOUT_DOUT14_Pos) /*!< GPIO_T::DOUT: DOUT14 Mask */ + +#define GPIO_DOUT_DOUT15_Pos (15) /*!< GPIO_T::DOUT: DOUT15 Position */ +#define GPIO_DOUT_DOUT15_Msk (0x1ul << GPIO_DOUT_DOUT15_Pos) /*!< GPIO_T::DOUT: DOUT15 Mask */ + +#define GPIO_DATMSK_DATMSK0_Pos (0) /*!< GPIO_T::DATMSK: DATMSK0 Position */ +#define GPIO_DATMSK_DATMSK0_Msk (0x1ul << GPIO_DATMSK_DATMSK0_Pos) /*!< GPIO_T::DATMSK: DATMSK0 Mask */ + +#define GPIO_DATMSK_DATMSK1_Pos (1) /*!< GPIO_T::DATMSK: DATMSK1 Position */ +#define GPIO_DATMSK_DATMSK1_Msk (0x1ul << GPIO_DATMSK_DATMSK1_Pos) /*!< GPIO_T::DATMSK: DATMSK1 Mask */ + +#define GPIO_DATMSK_DATMSK2_Pos (2) /*!< GPIO_T::DATMSK: DATMSK2 Position */ +#define GPIO_DATMSK_DATMSK2_Msk (0x1ul << GPIO_DATMSK_DATMSK2_Pos) /*!< GPIO_T::DATMSK: DATMSK2 Mask */ + +#define GPIO_DATMSK_DATMSK3_Pos (3) /*!< GPIO_T::DATMSK: DATMSK3 Position */ +#define GPIO_DATMSK_DATMSK3_Msk (0x1ul << GPIO_DATMSK_DATMSK3_Pos) /*!< GPIO_T::DATMSK: DATMSK3 Mask */ + +#define GPIO_DATMSK_DATMSK4_Pos (4) /*!< GPIO_T::DATMSK: DATMSK4 Position */ +#define GPIO_DATMSK_DATMSK4_Msk (0x1ul << GPIO_DATMSK_DATMSK4_Pos) /*!< GPIO_T::DATMSK: DATMSK4 Mask */ + +#define GPIO_DATMSK_DATMSK5_Pos (5) /*!< GPIO_T::DATMSK: DATMSK5 Position */ +#define GPIO_DATMSK_DATMSK5_Msk (0x1ul << GPIO_DATMSK_DATMSK5_Pos) /*!< GPIO_T::DATMSK: DATMSK5 Mask */ + +#define GPIO_DATMSK_DATMSK6_Pos (6) /*!< GPIO_T::DATMSK: DATMSK6 Position */ +#define GPIO_DATMSK_DATMSK6_Msk (0x1ul << GPIO_DATMSK_DATMSK6_Pos) /*!< GPIO_T::DATMSK: DATMSK6 Mask */ + +#define GPIO_DATMSK_DATMSK7_Pos (7) /*!< GPIO_T::DATMSK: DATMSK7 Position */ +#define GPIO_DATMSK_DATMSK7_Msk (0x1ul << GPIO_DATMSK_DATMSK7_Pos) /*!< GPIO_T::DATMSK: DATMSK7 Mask */ + +#define GPIO_DATMSK_DATMSK8_Pos (8) /*!< GPIO_T::DATMSK: DATMSK8 Position */ +#define GPIO_DATMSK_DATMSK8_Msk (0x1ul << GPIO_DATMSK_DATMSK8_Pos) /*!< GPIO_T::DATMSK: DATMSK8 Mask */ + +#define GPIO_DATMSK_DATMSK9_Pos (9) /*!< GPIO_T::DATMSK: DATMSK9 Position */ +#define GPIO_DATMSK_DATMSK9_Msk (0x1ul << GPIO_DATMSK_DATMSK9_Pos) /*!< GPIO_T::DATMSK: DATMSK9 Mask */ + +#define GPIO_DATMSK_DATMSK10_Pos (10) /*!< GPIO_T::DATMSK: DATMSK10 Position */ +#define GPIO_DATMSK_DATMSK10_Msk (0x1ul << GPIO_DATMSK_DATMSK10_Pos) /*!< GPIO_T::DATMSK: DATMSK10 Mask */ + +#define GPIO_DATMSK_DATMSK11_Pos (11) /*!< GPIO_T::DATMSK: DATMSK11 Position */ +#define GPIO_DATMSK_DATMSK11_Msk (0x1ul << GPIO_DATMSK_DATMSK11_Pos) /*!< GPIO_T::DATMSK: DATMSK11 Mask */ + +#define GPIO_DATMSK_DATMSK12_Pos (12) /*!< GPIO_T::DATMSK: DATMSK12 Position */ +#define GPIO_DATMSK_DATMSK12_Msk (0x1ul << GPIO_DATMSK_DATMSK12_Pos) /*!< GPIO_T::DATMSK: DATMSK12 Mask */ + +#define GPIO_DATMSK_DATMSK13_Pos (13) /*!< GPIO_T::DATMSK: DATMSK13 Position */ +#define GPIO_DATMSK_DATMSK13_Msk (0x1ul << GPIO_DATMSK_DATMSK13_Pos) /*!< GPIO_T::DATMSK: DATMSK13 Mask */ + +#define GPIO_DATMSK_DATMSK14_Pos (14) /*!< GPIO_T::DATMSK: DATMSK14 Position */ +#define GPIO_DATMSK_DATMSK14_Msk (0x1ul << GPIO_DATMSK_DATMSK14_Pos) /*!< GPIO_T::DATMSK: DATMSK14 Mask */ + +#define GPIO_DATMSK_DATMSK15_Pos (15) /*!< GPIO_T::DATMSK: DATMSK15 Position */ +#define GPIO_DATMSK_DATMSK15_Msk (0x1ul << GPIO_DATMSK_DATMSK15_Pos) /*!< GPIO_T::DATMSK: DATMSK15 Mask */ + +#define GPIO_PIN_PIN0_Pos (0) /*!< GPIO_T::PIN: PIN0 Position */ +#define GPIO_PIN_PIN0_Msk (0x1ul << GPIO_PIN_PIN0_Pos) /*!< GPIO_T::PIN: PIN0 Mask */ + +#define GPIO_PIN_PIN1_Pos (1) /*!< GPIO_T::PIN: PIN1 Position */ +#define GPIO_PIN_PIN1_Msk (0x1ul << GPIO_PIN_PIN1_Pos) /*!< GPIO_T::PIN: PIN1 Mask */ + +#define GPIO_PIN_PIN2_Pos (2) /*!< GPIO_T::PIN: PIN2 Position */ +#define GPIO_PIN_PIN2_Msk (0x1ul << GPIO_PIN_PIN2_Pos) /*!< GPIO_T::PIN: PIN2 Mask */ + +#define GPIO_PIN_PIN3_Pos (3) /*!< GPIO_T::PIN: PIN3 Position */ +#define GPIO_PIN_PIN3_Msk (0x1ul << GPIO_PIN_PIN3_Pos) /*!< GPIO_T::PIN: PIN3 Mask */ + +#define GPIO_PIN_PIN4_Pos (4) /*!< GPIO_T::PIN: PIN4 Position */ +#define GPIO_PIN_PIN4_Msk (0x1ul << GPIO_PIN_PIN4_Pos) /*!< GPIO_T::PIN: PIN4 Mask */ + +#define GPIO_PIN_PIN5_Pos (5) /*!< GPIO_T::PIN: PIN5 Position */ +#define GPIO_PIN_PIN5_Msk (0x1ul << GPIO_PIN_PIN5_Pos) /*!< GPIO_T::PIN: PIN5 Mask */ + +#define GPIO_PIN_PIN6_Pos (6) /*!< GPIO_T::PIN: PIN6 Position */ +#define GPIO_PIN_PIN6_Msk (0x1ul << GPIO_PIN_PIN6_Pos) /*!< GPIO_T::PIN: PIN6 Mask */ + +#define GPIO_PIN_PIN7_Pos (7) /*!< GPIO_T::PIN: PIN7 Position */ +#define GPIO_PIN_PIN7_Msk (0x1ul << GPIO_PIN_PIN7_Pos) /*!< GPIO_T::PIN: PIN7 Mask */ + +#define GPIO_PIN_PIN8_Pos (8) /*!< GPIO_T::PIN: PIN8 Position */ +#define GPIO_PIN_PIN8_Msk (0x1ul << GPIO_PIN_PIN8_Pos) /*!< GPIO_T::PIN: PIN8 Mask */ + +#define GPIO_PIN_PIN9_Pos (9) /*!< GPIO_T::PIN: PIN9 Position */ +#define GPIO_PIN_PIN9_Msk (0x1ul << GPIO_PIN_PIN9_Pos) /*!< GPIO_T::PIN: PIN9 Mask */ + +#define GPIO_PIN_PIN10_Pos (10) /*!< GPIO_T::PIN: PIN10 Position */ +#define GPIO_PIN_PIN10_Msk (0x1ul << GPIO_PIN_PIN10_Pos) /*!< GPIO_T::PIN: PIN10 Mask */ + +#define GPIO_PIN_PIN11_Pos (11) /*!< GPIO_T::PIN: PIN11 Position */ +#define GPIO_PIN_PIN11_Msk (0x1ul << GPIO_PIN_PIN11_Pos) /*!< GPIO_T::PIN: PIN11 Mask */ + +#define GPIO_PIN_PIN12_Pos (12) /*!< GPIO_T::PIN: PIN12 Position */ +#define GPIO_PIN_PIN12_Msk (0x1ul << GPIO_PIN_PIN12_Pos) /*!< GPIO_T::PIN: PIN12 Mask */ + +#define GPIO_PIN_PIN13_Pos (13) /*!< GPIO_T::PIN: PIN13 Position */ +#define GPIO_PIN_PIN13_Msk (0x1ul << GPIO_PIN_PIN13_Pos) /*!< GPIO_T::PIN: PIN13 Mask */ + +#define GPIO_PIN_PIN14_Pos (14) /*!< GPIO_T::PIN: PIN14 Position */ +#define GPIO_PIN_PIN14_Msk (0x1ul << GPIO_PIN_PIN14_Pos) /*!< GPIO_T::PIN: PIN14 Mask */ + +#define GPIO_PIN_PIN15_Pos (15) /*!< GPIO_T::PIN: PIN15 Position */ +#define GPIO_PIN_PIN15_Msk (0x1ul << GPIO_PIN_PIN15_Pos) /*!< GPIO_T::PIN: PIN15 Mask */ + +#define GPIO_DBEN_DBEN0_Pos (0) /*!< GPIO_T::DBEN: DBEN0 Position */ +#define GPIO_DBEN_DBEN0_Msk (0x1ul << GPIO_DBEN_DBEN0_Pos) /*!< GPIO_T::DBEN: DBEN0 Mask */ + +#define GPIO_DBEN_DBEN1_Pos (1) /*!< GPIO_T::DBEN: DBEN1 Position */ +#define GPIO_DBEN_DBEN1_Msk (0x1ul << GPIO_DBEN_DBEN1_Pos) /*!< GPIO_T::DBEN: DBEN1 Mask */ + +#define GPIO_DBEN_DBEN2_Pos (2) /*!< GPIO_T::DBEN: DBEN2 Position */ +#define GPIO_DBEN_DBEN2_Msk (0x1ul << GPIO_DBEN_DBEN2_Pos) /*!< GPIO_T::DBEN: DBEN2 Mask */ + +#define GPIO_DBEN_DBEN3_Pos (3) /*!< GPIO_T::DBEN: DBEN3 Position */ +#define GPIO_DBEN_DBEN3_Msk (0x1ul << GPIO_DBEN_DBEN3_Pos) /*!< GPIO_T::DBEN: DBEN3 Mask */ + +#define GPIO_DBEN_DBEN4_Pos (4) /*!< GPIO_T::DBEN: DBEN4 Position */ +#define GPIO_DBEN_DBEN4_Msk (0x1ul << GPIO_DBEN_DBEN4_Pos) /*!< GPIO_T::DBEN: DBEN4 Mask */ + +#define GPIO_DBEN_DBEN5_Pos (5) /*!< GPIO_T::DBEN: DBEN5 Position */ +#define GPIO_DBEN_DBEN5_Msk (0x1ul << GPIO_DBEN_DBEN5_Pos) /*!< GPIO_T::DBEN: DBEN5 Mask */ + +#define GPIO_DBEN_DBEN6_Pos (6) /*!< GPIO_T::DBEN: DBEN6 Position */ +#define GPIO_DBEN_DBEN6_Msk (0x1ul << GPIO_DBEN_DBEN6_Pos) /*!< GPIO_T::DBEN: DBEN6 Mask */ + +#define GPIO_DBEN_DBEN7_Pos (7) /*!< GPIO_T::DBEN: DBEN7 Position */ +#define GPIO_DBEN_DBEN7_Msk (0x1ul << GPIO_DBEN_DBEN7_Pos) /*!< GPIO_T::DBEN: DBEN7 Mask */ + +#define GPIO_DBEN_DBEN8_Pos (8) /*!< GPIO_T::DBEN: DBEN8 Position */ +#define GPIO_DBEN_DBEN8_Msk (0x1ul << GPIO_DBEN_DBEN8_Pos) /*!< GPIO_T::DBEN: DBEN8 Mask */ + +#define GPIO_DBEN_DBEN9_Pos (9) /*!< GPIO_T::DBEN: DBEN9 Position */ +#define GPIO_DBEN_DBEN9_Msk (0x1ul << GPIO_DBEN_DBEN9_Pos) /*!< GPIO_T::DBEN: DBEN9 Mask */ + +#define GPIO_DBEN_DBEN10_Pos (10) /*!< GPIO_T::DBEN: DBEN10 Position */ +#define GPIO_DBEN_DBEN10_Msk (0x1ul << GPIO_DBEN_DBEN10_Pos) /*!< GPIO_T::DBEN: DBEN10 Mask */ + +#define GPIO_DBEN_DBEN11_Pos (11) /*!< GPIO_T::DBEN: DBEN11 Position */ +#define GPIO_DBEN_DBEN11_Msk (0x1ul << GPIO_DBEN_DBEN11_Pos) /*!< GPIO_T::DBEN: DBEN11 Mask */ + +#define GPIO_DBEN_DBEN12_Pos (12) /*!< GPIO_T::DBEN: DBEN12 Position */ +#define GPIO_DBEN_DBEN12_Msk (0x1ul << GPIO_DBEN_DBEN12_Pos) /*!< GPIO_T::DBEN: DBEN12 Mask */ + +#define GPIO_DBEN_DBEN13_Pos (13) /*!< GPIO_T::DBEN: DBEN13 Position */ +#define GPIO_DBEN_DBEN13_Msk (0x1ul << GPIO_DBEN_DBEN13_Pos) /*!< GPIO_T::DBEN: DBEN13 Mask */ + +#define GPIO_DBEN_DBEN14_Pos (14) /*!< GPIO_T::DBEN: DBEN14 Position */ +#define GPIO_DBEN_DBEN14_Msk (0x1ul << GPIO_DBEN_DBEN14_Pos) /*!< GPIO_T::DBEN: DBEN14 Mask */ + +#define GPIO_DBEN_DBEN15_Pos (15) /*!< GPIO_T::DBEN: DBEN15 Position */ +#define GPIO_DBEN_DBEN15_Msk (0x1ul << GPIO_DBEN_DBEN15_Pos) /*!< GPIO_T::DBEN: DBEN15 Mask */ + +#define GPIO_INTTYPE_TYPE0_Pos (0) /*!< GPIO_T::INTTYPE: TYPE0 Position */ +#define GPIO_INTTYPE_TYPE0_Msk (0x1ul << GPIO_INTTYPE_TYPE0_Pos) /*!< GPIO_T::INTTYPE: TYPE0 Mask */ + +#define GPIO_INTTYPE_TYPE1_Pos (1) /*!< GPIO_T::INTTYPE: TYPE1 Position */ +#define GPIO_INTTYPE_TYPE1_Msk (0x1ul << GPIO_INTTYPE_TYPE1_Pos) /*!< GPIO_T::INTTYPE: TYPE1 Mask */ + +#define GPIO_INTTYPE_TYPE2_Pos (2) /*!< GPIO_T::INTTYPE: TYPE2 Position */ +#define GPIO_INTTYPE_TYPE2_Msk (0x1ul << GPIO_INTTYPE_TYPE2_Pos) /*!< GPIO_T::INTTYPE: TYPE2 Mask */ + +#define GPIO_INTTYPE_TYPE3_Pos (3) /*!< GPIO_T::INTTYPE: TYPE3 Position */ +#define GPIO_INTTYPE_TYPE3_Msk (0x1ul << GPIO_INTTYPE_TYPE3_Pos) /*!< GPIO_T::INTTYPE: TYPE3 Mask */ + +#define GPIO_INTTYPE_TYPE4_Pos (4) /*!< GPIO_T::INTTYPE: TYPE4 Position */ +#define GPIO_INTTYPE_TYPE4_Msk (0x1ul << GPIO_INTTYPE_TYPE4_Pos) /*!< GPIO_T::INTTYPE: TYPE4 Mask */ + +#define GPIO_INTTYPE_TYPE5_Pos (5) /*!< GPIO_T::INTTYPE: TYPE5 Position */ +#define GPIO_INTTYPE_TYPE5_Msk (0x1ul << GPIO_INTTYPE_TYPE5_Pos) /*!< GPIO_T::INTTYPE: TYPE5 Mask */ + +#define GPIO_INTTYPE_TYPE6_Pos (6) /*!< GPIO_T::INTTYPE: TYPE6 Position */ +#define GPIO_INTTYPE_TYPE6_Msk (0x1ul << GPIO_INTTYPE_TYPE6_Pos) /*!< GPIO_T::INTTYPE: TYPE6 Mask */ + +#define GPIO_INTTYPE_TYPE7_Pos (7) /*!< GPIO_T::INTTYPE: TYPE7 Position */ +#define GPIO_INTTYPE_TYPE7_Msk (0x1ul << GPIO_INTTYPE_TYPE7_Pos) /*!< GPIO_T::INTTYPE: TYPE7 Mask */ + +#define GPIO_INTTYPE_TYPE8_Pos (8) /*!< GPIO_T::INTTYPE: TYPE8 Position */ +#define GPIO_INTTYPE_TYPE8_Msk (0x1ul << GPIO_INTTYPE_TYPE8_Pos) /*!< GPIO_T::INTTYPE: TYPE8 Mask */ + +#define GPIO_INTTYPE_TYPE9_Pos (9) /*!< GPIO_T::INTTYPE: TYPE9 Position */ +#define GPIO_INTTYPE_TYPE9_Msk (0x1ul << GPIO_INTTYPE_TYPE9_Pos) /*!< GPIO_T::INTTYPE: TYPE9 Mask */ + +#define GPIO_INTTYPE_TYPE10_Pos (10) /*!< GPIO_T::INTTYPE: TYPE10 Position */ +#define GPIO_INTTYPE_TYPE10_Msk (0x1ul << GPIO_INTTYPE_TYPE10_Pos) /*!< GPIO_T::INTTYPE: TYPE10 Mask */ + +#define GPIO_INTTYPE_TYPE11_Pos (11) /*!< GPIO_T::INTTYPE: TYPE11 Position */ +#define GPIO_INTTYPE_TYPE11_Msk (0x1ul << GPIO_INTTYPE_TYPE11_Pos) /*!< GPIO_T::INTTYPE: TYPE11 Mask */ + +#define GPIO_INTTYPE_TYPE12_Pos (12) /*!< GPIO_T::INTTYPE: TYPE12 Position */ +#define GPIO_INTTYPE_TYPE12_Msk (0x1ul << GPIO_INTTYPE_TYPE12_Pos) /*!< GPIO_T::INTTYPE: TYPE12 Mask */ + +#define GPIO_INTTYPE_TYPE13_Pos (13) /*!< GPIO_T::INTTYPE: TYPE13 Position */ +#define GPIO_INTTYPE_TYPE13_Msk (0x1ul << GPIO_INTTYPE_TYPE13_Pos) /*!< GPIO_T::INTTYPE: TYPE13 Mask */ + +#define GPIO_INTTYPE_TYPE14_Pos (14) /*!< GPIO_T::INTTYPE: TYPE14 Position */ +#define GPIO_INTTYPE_TYPE14_Msk (0x1ul << GPIO_INTTYPE_TYPE14_Pos) /*!< GPIO_T::INTTYPE: TYPE14 Mask */ + +#define GPIO_INTTYPE_TYPE15_Pos (15) /*!< GPIO_T::INTTYPE: TYPE15 Position */ +#define GPIO_INTTYPE_TYPE15_Msk (0x1ul << GPIO_INTTYPE_TYPE15_Pos) /*!< GPIO_T::INTTYPE: TYPE15 Mask */ + +#define GPIO_INTEN_FLIEN0_Pos (0) /*!< GPIO_T::INTEN: FLIEN0 Position */ +#define GPIO_INTEN_FLIEN0_Msk (0x1ul << GPIO_INTEN_FLIEN0_Pos) /*!< GPIO_T::INTEN: FLIEN0 Mask */ + +#define GPIO_INTEN_FLIEN1_Pos (1) /*!< GPIO_T::INTEN: FLIEN1 Position */ +#define GPIO_INTEN_FLIEN1_Msk (0x1ul << GPIO_INTEN_FLIEN1_Pos) /*!< GPIO_T::INTEN: FLIEN1 Mask */ + +#define GPIO_INTEN_FLIEN2_Pos (2) /*!< GPIO_T::INTEN: FLIEN2 Position */ +#define GPIO_INTEN_FLIEN2_Msk (0x1ul << GPIO_INTEN_FLIEN2_Pos) /*!< GPIO_T::INTEN: FLIEN2 Mask */ + +#define GPIO_INTEN_FLIEN3_Pos (3) /*!< GPIO_T::INTEN: FLIEN3 Position */ +#define GPIO_INTEN_FLIEN3_Msk (0x1ul << GPIO_INTEN_FLIEN3_Pos) /*!< GPIO_T::INTEN: FLIEN3 Mask */ + +#define GPIO_INTEN_FLIEN4_Pos (4) /*!< GPIO_T::INTEN: FLIEN4 Position */ +#define GPIO_INTEN_FLIEN4_Msk (0x1ul << GPIO_INTEN_FLIEN4_Pos) /*!< GPIO_T::INTEN: FLIEN4 Mask */ + +#define GPIO_INTEN_FLIEN5_Pos (5) /*!< GPIO_T::INTEN: FLIEN5 Position */ +#define GPIO_INTEN_FLIEN5_Msk (0x1ul << GPIO_INTEN_FLIEN5_Pos) /*!< GPIO_T::INTEN: FLIEN5 Mask */ + +#define GPIO_INTEN_FLIEN6_Pos (6) /*!< GPIO_T::INTEN: FLIEN6 Position */ +#define GPIO_INTEN_FLIEN6_Msk (0x1ul << GPIO_INTEN_FLIEN6_Pos) /*!< GPIO_T::INTEN: FLIEN6 Mask */ + +#define GPIO_INTEN_FLIEN7_Pos (7) /*!< GPIO_T::INTEN: FLIEN7 Position */ +#define GPIO_INTEN_FLIEN7_Msk (0x1ul << GPIO_INTEN_FLIEN7_Pos) /*!< GPIO_T::INTEN: FLIEN7 Mask */ + +#define GPIO_INTEN_FLIEN8_Pos (8) /*!< GPIO_T::INTEN: FLIEN8 Position */ +#define GPIO_INTEN_FLIEN8_Msk (0x1ul << GPIO_INTEN_FLIEN8_Pos) /*!< GPIO_T::INTEN: FLIEN8 Mask */ + +#define GPIO_INTEN_FLIEN9_Pos (9) /*!< GPIO_T::INTEN: FLIEN9 Position */ +#define GPIO_INTEN_FLIEN9_Msk (0x1ul << GPIO_INTEN_FLIEN9_Pos) /*!< GPIO_T::INTEN: FLIEN9 Mask */ + +#define GPIO_INTEN_FLIEN10_Pos (10) /*!< GPIO_T::INTEN: FLIEN10 Position */ +#define GPIO_INTEN_FLIEN10_Msk (0x1ul << GPIO_INTEN_FLIEN10_Pos) /*!< GPIO_T::INTEN: FLIEN10 Mask */ + +#define GPIO_INTEN_FLIEN11_Pos (11) /*!< GPIO_T::INTEN: FLIEN11 Position */ +#define GPIO_INTEN_FLIEN11_Msk (0x1ul << GPIO_INTEN_FLIEN11_Pos) /*!< GPIO_T::INTEN: FLIEN11 Mask */ + +#define GPIO_INTEN_FLIEN12_Pos (12) /*!< GPIO_T::INTEN: FLIEN12 Position */ +#define GPIO_INTEN_FLIEN12_Msk (0x1ul << GPIO_INTEN_FLIEN12_Pos) /*!< GPIO_T::INTEN: FLIEN12 Mask */ + +#define GPIO_INTEN_FLIEN13_Pos (13) /*!< GPIO_T::INTEN: FLIEN13 Position */ +#define GPIO_INTEN_FLIEN13_Msk (0x1ul << GPIO_INTEN_FLIEN13_Pos) /*!< GPIO_T::INTEN: FLIEN13 Mask */ + +#define GPIO_INTEN_FLIEN14_Pos (14) /*!< GPIO_T::INTEN: FLIEN14 Position */ +#define GPIO_INTEN_FLIEN14_Msk (0x1ul << GPIO_INTEN_FLIEN14_Pos) /*!< GPIO_T::INTEN: FLIEN14 Mask */ + +#define GPIO_INTEN_FLIEN15_Pos (15) /*!< GPIO_T::INTEN: FLIEN15 Position */ +#define GPIO_INTEN_FLIEN15_Msk (0x1ul << GPIO_INTEN_FLIEN15_Pos) /*!< GPIO_T::INTEN: FLIEN15 Mask */ + +#define GPIO_INTEN_RHIEN0_Pos (16) /*!< GPIO_T::INTEN: RHIEN0 Position */ +#define GPIO_INTEN_RHIEN0_Msk (0x1ul << GPIO_INTEN_RHIEN0_Pos) /*!< GPIO_T::INTEN: RHIEN0 Mask */ + +#define GPIO_INTEN_RHIEN1_Pos (17) /*!< GPIO_T::INTEN: RHIEN1 Position */ +#define GPIO_INTEN_RHIEN1_Msk (0x1ul << GPIO_INTEN_RHIEN1_Pos) /*!< GPIO_T::INTEN: RHIEN1 Mask */ + +#define GPIO_INTEN_RHIEN2_Pos (18) /*!< GPIO_T::INTEN: RHIEN2 Position */ +#define GPIO_INTEN_RHIEN2_Msk (0x1ul << GPIO_INTEN_RHIEN2_Pos) /*!< GPIO_T::INTEN: RHIEN2 Mask */ + +#define GPIO_INTEN_RHIEN3_Pos (19) /*!< GPIO_T::INTEN: RHIEN3 Position */ +#define GPIO_INTEN_RHIEN3_Msk (0x1ul << GPIO_INTEN_RHIEN3_Pos) /*!< GPIO_T::INTEN: RHIEN3 Mask */ + +#define GPIO_INTEN_RHIEN4_Pos (20) /*!< GPIO_T::INTEN: RHIEN4 Position */ +#define GPIO_INTEN_RHIEN4_Msk (0x1ul << GPIO_INTEN_RHIEN4_Pos) /*!< GPIO_T::INTEN: RHIEN4 Mask */ + +#define GPIO_INTEN_RHIEN5_Pos (21) /*!< GPIO_T::INTEN: RHIEN5 Position */ +#define GPIO_INTEN_RHIEN5_Msk (0x1ul << GPIO_INTEN_RHIEN5_Pos) /*!< GPIO_T::INTEN: RHIEN5 Mask */ + +#define GPIO_INTEN_RHIEN6_Pos (22) /*!< GPIO_T::INTEN: RHIEN6 Position */ +#define GPIO_INTEN_RHIEN6_Msk (0x1ul << GPIO_INTEN_RHIEN6_Pos) /*!< GPIO_T::INTEN: RHIEN6 Mask */ + +#define GPIO_INTEN_RHIEN7_Pos (23) /*!< GPIO_T::INTEN: RHIEN7 Position */ +#define GPIO_INTEN_RHIEN7_Msk (0x1ul << GPIO_INTEN_RHIEN7_Pos) /*!< GPIO_T::INTEN: RHIEN7 Mask */ + +#define GPIO_INTEN_RHIEN8_Pos (24) /*!< GPIO_T::INTEN: RHIEN8 Position */ +#define GPIO_INTEN_RHIEN8_Msk (0x1ul << GPIO_INTEN_RHIEN8_Pos) /*!< GPIO_T::INTEN: RHIEN8 Mask */ + +#define GPIO_INTEN_RHIEN9_Pos (25) /*!< GPIO_T::INTEN: RHIEN9 Position */ +#define GPIO_INTEN_RHIEN9_Msk (0x1ul << GPIO_INTEN_RHIEN9_Pos) /*!< GPIO_T::INTEN: RHIEN9 Mask */ + +#define GPIO_INTEN_RHIEN10_Pos (26) /*!< GPIO_T::INTEN: RHIEN10 Position */ +#define GPIO_INTEN_RHIEN10_Msk (0x1ul << GPIO_INTEN_RHIEN10_Pos) /*!< GPIO_T::INTEN: RHIEN10 Mask */ + +#define GPIO_INTEN_RHIEN11_Pos (27) /*!< GPIO_T::INTEN: RHIEN11 Position */ +#define GPIO_INTEN_RHIEN11_Msk (0x1ul << GPIO_INTEN_RHIEN11_Pos) /*!< GPIO_T::INTEN: RHIEN11 Mask */ + +#define GPIO_INTEN_RHIEN12_Pos (28) /*!< GPIO_T::INTEN: RHIEN12 Position */ +#define GPIO_INTEN_RHIEN12_Msk (0x1ul << GPIO_INTEN_RHIEN12_Pos) /*!< GPIO_T::INTEN: RHIEN12 Mask */ + +#define GPIO_INTEN_RHIEN13_Pos (29) /*!< GPIO_T::INTEN: RHIEN13 Position */ +#define GPIO_INTEN_RHIEN13_Msk (0x1ul << GPIO_INTEN_RHIEN13_Pos) /*!< GPIO_T::INTEN: RHIEN13 Mask */ + +#define GPIO_INTEN_RHIEN14_Pos (30) /*!< GPIO_T::INTEN: RHIEN14 Position */ +#define GPIO_INTEN_RHIEN14_Msk (0x1ul << GPIO_INTEN_RHIEN14_Pos) /*!< GPIO_T::INTEN: RHIEN14 Mask */ + +#define GPIO_INTEN_RHIEN15_Pos (31) /*!< GPIO_T::INTEN: RHIEN15 Position */ +#define GPIO_INTEN_RHIEN15_Msk (0x1ul << GPIO_INTEN_RHIEN15_Pos) /*!< GPIO_T::INTEN: RHIEN15 Mask */ + +#define GPIO_INTSRC_INTSRC0_Pos (0) /*!< GPIO_T::INTSRC: INTSRC0 Position */ +#define GPIO_INTSRC_INTSRC0_Msk (0x1ul << GPIO_INTSRC_INTSRC0_Pos) /*!< GPIO_T::INTSRC: INTSRC0 Mask */ + +#define GPIO_INTSRC_INTSRC1_Pos (1) /*!< GPIO_T::INTSRC: INTSRC1 Position */ +#define GPIO_INTSRC_INTSRC1_Msk (0x1ul << GPIO_INTSRC_INTSRC1_Pos) /*!< GPIO_T::INTSRC: INTSRC1 Mask */ + +#define GPIO_INTSRC_INTSRC2_Pos (2) /*!< GPIO_T::INTSRC: INTSRC2 Position */ +#define GPIO_INTSRC_INTSRC2_Msk (0x1ul << GPIO_INTSRC_INTSRC2_Pos) /*!< GPIO_T::INTSRC: INTSRC2 Mask */ + +#define GPIO_INTSRC_INTSRC3_Pos (3) /*!< GPIO_T::INTSRC: INTSRC3 Position */ +#define GPIO_INTSRC_INTSRC3_Msk (0x1ul << GPIO_INTSRC_INTSRC3_Pos) /*!< GPIO_T::INTSRC: INTSRC3 Mask */ + +#define GPIO_INTSRC_INTSRC4_Pos (4) /*!< GPIO_T::INTSRC: INTSRC4 Position */ +#define GPIO_INTSRC_INTSRC4_Msk (0x1ul << GPIO_INTSRC_INTSRC4_Pos) /*!< GPIO_T::INTSRC: INTSRC4 Mask */ + +#define GPIO_INTSRC_INTSRC5_Pos (5) /*!< GPIO_T::INTSRC: INTSRC5 Position */ +#define GPIO_INTSRC_INTSRC5_Msk (0x1ul << GPIO_INTSRC_INTSRC5_Pos) /*!< GPIO_T::INTSRC: INTSRC5 Mask */ + +#define GPIO_INTSRC_INTSRC6_Pos (6) /*!< GPIO_T::INTSRC: INTSRC6 Position */ +#define GPIO_INTSRC_INTSRC6_Msk (0x1ul << GPIO_INTSRC_INTSRC6_Pos) /*!< GPIO_T::INTSRC: INTSRC6 Mask */ + +#define GPIO_INTSRC_INTSRC7_Pos (7) /*!< GPIO_T::INTSRC: INTSRC7 Position */ +#define GPIO_INTSRC_INTSRC7_Msk (0x1ul << GPIO_INTSRC_INTSRC7_Pos) /*!< GPIO_T::INTSRC: INTSRC7 Mask */ + +#define GPIO_INTSRC_INTSRC8_Pos (8) /*!< GPIO_T::INTSRC: INTSRC8 Position */ +#define GPIO_INTSRC_INTSRC8_Msk (0x1ul << GPIO_INTSRC_INTSRC8_Pos) /*!< GPIO_T::INTSRC: INTSRC8 Mask */ + +#define GPIO_INTSRC_INTSRC9_Pos (9) /*!< GPIO_T::INTSRC: INTSRC9 Position */ +#define GPIO_INTSRC_INTSRC9_Msk (0x1ul << GPIO_INTSRC_INTSRC9_Pos) /*!< GPIO_T::INTSRC: INTSRC9 Mask */ + +#define GPIO_INTSRC_INTSRC10_Pos (10) /*!< GPIO_T::INTSRC: INTSRC10 Position */ +#define GPIO_INTSRC_INTSRC10_Msk (0x1ul << GPIO_INTSRC_INTSRC10_Pos) /*!< GPIO_T::INTSRC: INTSRC10 Mask */ + +#define GPIO_INTSRC_INTSRC11_Pos (11) /*!< GPIO_T::INTSRC: INTSRC11 Position */ +#define GPIO_INTSRC_INTSRC11_Msk (0x1ul << GPIO_INTSRC_INTSRC11_Pos) /*!< GPIO_T::INTSRC: INTSRC11 Mask */ + +#define GPIO_INTSRC_INTSRC12_Pos (12) /*!< GPIO_T::INTSRC: INTSRC12 Position */ +#define GPIO_INTSRC_INTSRC12_Msk (0x1ul << GPIO_INTSRC_INTSRC12_Pos) /*!< GPIO_T::INTSRC: INTSRC12 Mask */ + +#define GPIO_INTSRC_INTSRC13_Pos (13) /*!< GPIO_T::INTSRC: INTSRC13 Position */ +#define GPIO_INTSRC_INTSRC13_Msk (0x1ul << GPIO_INTSRC_INTSRC13_Pos) /*!< GPIO_T::INTSRC: INTSRC13 Mask */ + +#define GPIO_INTSRC_INTSRC14_Pos (14) /*!< GPIO_T::INTSRC: INTSRC14 Position */ +#define GPIO_INTSRC_INTSRC14_Msk (0x1ul << GPIO_INTSRC_INTSRC14_Pos) /*!< GPIO_T::INTSRC: INTSRC14 Mask */ + +#define GPIO_INTSRC_INTSRC15_Pos (15) /*!< GPIO_T::INTSRC: INTSRC15 Position */ +#define GPIO_INTSRC_INTSRC15_Msk (0x1ul << GPIO_INTSRC_INTSRC15_Pos) /*!< GPIO_T::INTSRC: INTSRC15 Mask */ + +#define GPIO_SMTEN_SMTEN0_Pos (0) /*!< GPIO_T::SMTEN: SMTEN0 Position */ +#define GPIO_SMTEN_SMTEN0_Msk (0x1ul << GPIO_SMTEN_SMTEN0_Pos) /*!< GPIO_T::SMTEN: SMTEN0 Mask */ + +#define GPIO_SMTEN_SMTEN1_Pos (1) /*!< GPIO_T::SMTEN: SMTEN1 Position */ +#define GPIO_SMTEN_SMTEN1_Msk (0x1ul << GPIO_SMTEN_SMTEN1_Pos) /*!< GPIO_T::SMTEN: SMTEN1 Mask */ + +#define GPIO_SMTEN_SMTEN2_Pos (2) /*!< GPIO_T::SMTEN: SMTEN2 Position */ +#define GPIO_SMTEN_SMTEN2_Msk (0x1ul << GPIO_SMTEN_SMTEN2_Pos) /*!< GPIO_T::SMTEN: SMTEN2 Mask */ + +#define GPIO_SMTEN_SMTEN3_Pos (3) /*!< GPIO_T::SMTEN: SMTEN3 Position */ +#define GPIO_SMTEN_SMTEN3_Msk (0x1ul << GPIO_SMTEN_SMTEN3_Pos) /*!< GPIO_T::SMTEN: SMTEN3 Mask */ + +#define GPIO_SMTEN_SMTEN4_Pos (4) /*!< GPIO_T::SMTEN: SMTEN4 Position */ +#define GPIO_SMTEN_SMTEN4_Msk (0x1ul << GPIO_SMTEN_SMTEN4_Pos) /*!< GPIO_T::SMTEN: SMTEN4 Mask */ + +#define GPIO_SMTEN_SMTEN5_Pos (5) /*!< GPIO_T::SMTEN: SMTEN5 Position */ +#define GPIO_SMTEN_SMTEN5_Msk (0x1ul << GPIO_SMTEN_SMTEN5_Pos) /*!< GPIO_T::SMTEN: SMTEN5 Mask */ + +#define GPIO_SMTEN_SMTEN6_Pos (6) /*!< GPIO_T::SMTEN: SMTEN6 Position */ +#define GPIO_SMTEN_SMTEN6_Msk (0x1ul << GPIO_SMTEN_SMTEN6_Pos) /*!< GPIO_T::SMTEN: SMTEN6 Mask */ + +#define GPIO_SMTEN_SMTEN7_Pos (7) /*!< GPIO_T::SMTEN: SMTEN7 Position */ +#define GPIO_SMTEN_SMTEN7_Msk (0x1ul << GPIO_SMTEN_SMTEN7_Pos) /*!< GPIO_T::SMTEN: SMTEN7 Mask */ + +#define GPIO_SMTEN_SMTEN8_Pos (8) /*!< GPIO_T::SMTEN: SMTEN8 Position */ +#define GPIO_SMTEN_SMTEN8_Msk (0x1ul << GPIO_SMTEN_SMTEN8_Pos) /*!< GPIO_T::SMTEN: SMTEN8 Mask */ + +#define GPIO_SMTEN_SMTEN9_Pos (9) /*!< GPIO_T::SMTEN: SMTEN9 Position */ +#define GPIO_SMTEN_SMTEN9_Msk (0x1ul << GPIO_SMTEN_SMTEN9_Pos) /*!< GPIO_T::SMTEN: SMTEN9 Mask */ + +#define GPIO_SMTEN_SMTEN10_Pos (10) /*!< GPIO_T::SMTEN: SMTEN10 Position */ +#define GPIO_SMTEN_SMTEN10_Msk (0x1ul << GPIO_SMTEN_SMTEN10_Pos) /*!< GPIO_T::SMTEN: SMTEN10 Mask */ + +#define GPIO_SMTEN_SMTEN11_Pos (11) /*!< GPIO_T::SMTEN: SMTEN11 Position */ +#define GPIO_SMTEN_SMTEN11_Msk (0x1ul << GPIO_SMTEN_SMTEN11_Pos) /*!< GPIO_T::SMTEN: SMTEN11 Mask */ + +#define GPIO_SMTEN_SMTEN12_Pos (12) /*!< GPIO_T::SMTEN: SMTEN12 Position */ +#define GPIO_SMTEN_SMTEN12_Msk (0x1ul << GPIO_SMTEN_SMTEN12_Pos) /*!< GPIO_T::SMTEN: SMTEN12 Mask */ + +#define GPIO_SMTEN_SMTEN13_Pos (13) /*!< GPIO_T::SMTEN: SMTEN13 Position */ +#define GPIO_SMTEN_SMTEN13_Msk (0x1ul << GPIO_SMTEN_SMTEN13_Pos) /*!< GPIO_T::SMTEN: SMTEN13 Mask */ + +#define GPIO_SMTEN_SMTEN14_Pos (14) /*!< GPIO_T::SMTEN: SMTEN14 Position */ +#define GPIO_SMTEN_SMTEN14_Msk (0x1ul << GPIO_SMTEN_SMTEN14_Pos) /*!< GPIO_T::SMTEN: SMTEN14 Mask */ + +#define GPIO_SMTEN_SMTEN15_Pos (15) /*!< GPIO_T::SMTEN: SMTEN15 Position */ +#define GPIO_SMTEN_SMTEN15_Msk (0x1ul << GPIO_SMTEN_SMTEN15_Pos) /*!< GPIO_T::SMTEN: SMTEN15 Mask */ + +#define GPIO_SLEWCTL_HSREN0_Pos (0) /*!< GPIO_T::SLEWCTL: HSREN0 Position */ +#define GPIO_SLEWCTL_HSREN0_Msk (0x3ul << GPIO_SLEWCTL_HSREN0_Pos) /*!< GPIO_T::SLEWCTL: HSREN0 Mask */ + +#define GPIO_SLEWCTL_HSREN1_Pos (2) /*!< GPIO_T::SLEWCTL: HSREN1 Position */ +#define GPIO_SLEWCTL_HSREN1_Msk (0x3ul << GPIO_SLEWCTL_HSREN1_Pos) /*!< GPIO_T::SLEWCTL: HSREN1 Mask */ + +#define GPIO_SLEWCTL_HSREN2_Pos (4) /*!< GPIO_T::SLEWCTL: HSREN2 Position */ +#define GPIO_SLEWCTL_HSREN2_Msk (0x3ul << GPIO_SLEWCTL_HSREN2_Pos) /*!< GPIO_T::SLEWCTL: HSREN2 Mask */ + +#define GPIO_SLEWCTL_HSREN3_Pos (6) /*!< GPIO_T::SLEWCTL: HSREN3 Position */ +#define GPIO_SLEWCTL_HSREN3_Msk (0x3ul << GPIO_SLEWCTL_HSREN3_Pos) /*!< GPIO_T::SLEWCTL: HSREN3 Mask */ + +#define GPIO_SLEWCTL_HSREN4_Pos (8) /*!< GPIO_T::SLEWCTL: HSREN4 Position */ +#define GPIO_SLEWCTL_HSREN4_Msk (0x3ul << GPIO_SLEWCTL_HSREN4_Pos) /*!< GPIO_T::SLEWCTL: HSREN4 Mask */ + +#define GPIO_SLEWCTL_HSREN5_Pos (10) /*!< GPIO_T::SLEWCTL: HSREN5 Position */ +#define GPIO_SLEWCTL_HSREN5_Msk (0x3ul << GPIO_SLEWCTL_HSREN5_Pos) /*!< GPIO_T::SLEWCTL: HSREN5 Mask */ + +#define GPIO_SLEWCTL_HSREN6_Pos (12) /*!< GPIO_T::SLEWCTL: HSREN6 Position */ +#define GPIO_SLEWCTL_HSREN6_Msk (0x3ul << GPIO_SLEWCTL_HSREN6_Pos) /*!< GPIO_T::SLEWCTL: HSREN6 Mask */ + +#define GPIO_SLEWCTL_HSREN7_Pos (14) /*!< GPIO_T::SLEWCTL: HSREN7 Position */ +#define GPIO_SLEWCTL_HSREN7_Msk (0x3ul << GPIO_SLEWCTL_HSREN7_Pos) /*!< GPIO_T::SLEWCTL: HSREN7 Mask */ + +#define GPIO_SLEWCTL_HSREN8_Pos (16) /*!< GPIO_T::SLEWCTL: HSREN8 Position */ +#define GPIO_SLEWCTL_HSREN8_Msk (0x3ul << GPIO_SLEWCTL_HSREN8_Pos) /*!< GPIO_T::SLEWCTL: HSREN8 Mask */ + +#define GPIO_SLEWCTL_HSREN9_Pos (18) /*!< GPIO_T::SLEWCTL: HSREN9 Position */ +#define GPIO_SLEWCTL_HSREN9_Msk (0x3ul << GPIO_SLEWCTL_HSREN9_Pos) /*!< GPIO_T::SLEWCTL: HSREN9 Mask */ + +#define GPIO_SLEWCTL_HSREN10_Pos (20) /*!< GPIO_T::SLEWCTL: HSREN10 Position */ +#define GPIO_SLEWCTL_HSREN10_Msk (0x3ul << GPIO_SLEWCTL_HSREN10_Pos) /*!< GPIO_T::SLEWCTL: HSREN10 Mask */ + +#define GPIO_SLEWCTL_HSREN11_Pos (22) /*!< GPIO_T::SLEWCTL: HSREN11 Position */ +#define GPIO_SLEWCTL_HSREN11_Msk (0x3ul << GPIO_SLEWCTL_HSREN11_Pos) /*!< GPIO_T::SLEWCTL: HSREN11 Mask */ + +#define GPIO_SLEWCTL_HSREN12_Pos (24) /*!< GPIO_T::SLEWCTL: HSREN12 Position */ +#define GPIO_SLEWCTL_HSREN12_Msk (0x3ul << GPIO_SLEWCTL_HSREN12_Pos) /*!< GPIO_T::SLEWCTL: HSREN12 Mask */ + +#define GPIO_SLEWCTL_HSREN13_Pos (26) /*!< GPIO_T::SLEWCTL: HSREN13 Position */ +#define GPIO_SLEWCTL_HSREN13_Msk (0x3ul << GPIO_SLEWCTL_HSREN13_Pos) /*!< GPIO_T::SLEWCTL: HSREN13 Mask */ + +#define GPIO_SLEWCTL_HSREN14_Pos (28) /*!< GPIO_T::SLEWCTL: HSREN14 Position */ +#define GPIO_SLEWCTL_HSREN14_Msk (0x3ul << GPIO_SLEWCTL_HSREN14_Pos) /*!< GPIO_T::SLEWCTL: HSREN14 Mask */ + +#define GPIO_SLEWCTL_HSREN15_Pos (30) /*!< GPIO_T::SLEWCTL: HSREN15 Position */ +#define GPIO_SLEWCTL_HSREN15_Msk (0x3ul << GPIO_SLEWCTL_HSREN15_Pos) /*!< GPIO_T::SLEWCTL: HSREN15 Mask */ + +#define GPIO_PUSEL_PUSEL0_Pos (0) /*!< GPIO_T::PUSEL: PUSEL0 Position */ +#define GPIO_PUSEL_PUSEL0_Msk (0x3ul << GPIO_PUSEL_PUSEL0_Pos) /*!< GPIO_T::PUSEL: PUSEL0 Mask */ + +#define GPIO_PUSEL_PUSEL1_Pos (2) /*!< GPIO_T::PUSEL: PUSEL1 Position */ +#define GPIO_PUSEL_PUSEL1_Msk (0x3ul << GPIO_PUSEL_PUSEL1_Pos) /*!< GPIO_T::PUSEL: PUSEL1 Mask */ + +#define GPIO_PUSEL_PUSEL2_Pos (4) /*!< GPIO_T::PUSEL: PUSEL2 Position */ +#define GPIO_PUSEL_PUSEL2_Msk (0x3ul << GPIO_PUSEL_PUSEL2_Pos) /*!< GPIO_T::PUSEL: PUSEL2 Mask */ + +#define GPIO_PUSEL_PUSEL3_Pos (6) /*!< GPIO_T::PUSEL: PUSEL3 Position */ +#define GPIO_PUSEL_PUSEL3_Msk (0x3ul << GPIO_PUSEL_PUSEL3_Pos) /*!< GPIO_T::PUSEL: PUSEL3 Mask */ + +#define GPIO_PUSEL_PUSEL4_Pos (8) /*!< GPIO_T::PUSEL: PUSEL4 Position */ +#define GPIO_PUSEL_PUSEL4_Msk (0x3ul << GPIO_PUSEL_PUSEL4_Pos) /*!< GPIO_T::PUSEL: PUSEL4 Mask */ + +#define GPIO_PUSEL_PUSEL5_Pos (10) /*!< GPIO_T::PUSEL: PUSEL5 Position */ +#define GPIO_PUSEL_PUSEL5_Msk (0x3ul << GPIO_PUSEL_PUSEL5_Pos) /*!< GPIO_T::PUSEL: PUSEL5 Mask */ + +#define GPIO_PUSEL_PUSEL6_Pos (12) /*!< GPIO_T::PUSEL: PUSEL6 Position */ +#define GPIO_PUSEL_PUSEL6_Msk (0x3ul << GPIO_PUSEL_PUSEL6_Pos) /*!< GPIO_T::PUSEL: PUSEL6 Mask */ + +#define GPIO_PUSEL_PUSEL7_Pos (14) /*!< GPIO_T::PUSEL: PUSEL7 Position */ +#define GPIO_PUSEL_PUSEL7_Msk (0x3ul << GPIO_PUSEL_PUSEL7_Pos) /*!< GPIO_T::PUSEL: PUSEL7 Mask */ + +#define GPIO_PUSEL_PUSEL8_Pos (16) /*!< GPIO_T::PUSEL: PUSEL8 Position */ +#define GPIO_PUSEL_PUSEL8_Msk (0x3ul << GPIO_PUSEL_PUSEL8_Pos) /*!< GPIO_T::PUSEL: PUSEL8 Mask */ + +#define GPIO_PUSEL_PUSEL9_Pos (18) /*!< GPIO_T::PUSEL: PUSEL9 Position */ +#define GPIO_PUSEL_PUSEL9_Msk (0x3ul << GPIO_PUSEL_PUSEL9_Pos) /*!< GPIO_T::PUSEL: PUSEL9 Mask */ + +#define GPIO_PUSEL_PUSEL10_Pos (20) /*!< GPIO_T::PUSEL: PUSEL10 Position */ +#define GPIO_PUSEL_PUSEL10_Msk (0x3ul << GPIO_PUSEL_PUSEL10_Pos) /*!< GPIO_T::PUSEL: PUSEL10 Mask */ + +#define GPIO_PUSEL_PUSEL11_Pos (22) /*!< GPIO_T::PUSEL: PUSEL11 Position */ +#define GPIO_PUSEL_PUSEL11_Msk (0x3ul << GPIO_PUSEL_PUSEL11_Pos) /*!< GPIO_T::PUSEL: PUSEL11 Mask */ + +#define GPIO_PUSEL_PUSEL12_Pos (24) /*!< GPIO_T::PUSEL: PUSEL12 Position */ +#define GPIO_PUSEL_PUSEL12_Msk (0x3ul << GPIO_PUSEL_PUSEL12_Pos) /*!< GPIO_T::PUSEL: PUSEL12 Mask */ + +#define GPIO_PUSEL_PUSEL13_Pos (26) /*!< GPIO_T::PUSEL: PUSEL13 Position */ +#define GPIO_PUSEL_PUSEL13_Msk (0x3ul << GPIO_PUSEL_PUSEL13_Pos) /*!< GPIO_T::PUSEL: PUSEL13 Mask */ + +#define GPIO_PUSEL_PUSEL14_Pos (28) /*!< GPIO_T::PUSEL: PUSEL14 Position */ +#define GPIO_PUSEL_PUSEL14_Msk (0x3ul << GPIO_PUSEL_PUSEL14_Pos) /*!< GPIO_T::PUSEL: PUSEL14 Mask */ + +#define GPIO_PUSEL_PUSEL15_Pos (30) /*!< GPIO_T::PUSEL: PUSEL15 Position */ +#define GPIO_PUSEL_PUSEL15_Msk (0x3ul << GPIO_PUSEL_PUSEL15_Pos) /*!< GPIO_T::PUSEL: PUSEL15 Mask */ + +#define GPIO_DBCTL_DBCLKSEL_Pos (0) /*!< GPIO_T::DBCTL: DBCLKSEL Position */ +#define GPIO_DBCTL_DBCLKSEL_Msk (0xful << GPIO_DBCTL_DBCLKSEL_Pos) /*!< GPIO_T::DBCTL: DBCLKSEL Mask */ + +#define GPIO_DBCTL_DBCLKSRC_Pos (4) /*!< GPIO_T::DBCTL: DBCLKSRC Position */ +#define GPIO_DBCTL_DBCLKSRC_Msk (0x1ul << GPIO_DBCTL_DBCLKSRC_Pos) /*!< GPIO_T::DBCTL: DBCLKSRC Mask */ + +#define GPIO_DBCTL_ICLKON_Pos (5) /*!< GPIO_T::DBCTL: ICLKON Position */ +#define GPIO_DBCTL_ICLKON_Msk (0x1ul << GPIO_DBCTL_ICLKON_Pos) /*!< GPIO_T::DBCTL: ICLKON Mask */ + + +#define GPIO_DS_DS10_DS00_Pos (0) /*!< GPIO_T::DS: DS10_DS00 Position */ +#define GPIO_DS_DS10_DS00_Msk (0x1ul << GPIO_DS_DS10_DS00_Pos) /*!< GPIO_T::DS: DS10_DS00 Mask */ + +#define GPIO_DS_DS11_DS01_Pos (1) /*!< GPIO_T::DS: DS11_DS01 Position */ +#define GPIO_DS_DS11_DS01_Msk (0x1ul << GPIO_DS_DS11_DS01_Pos) /*!< GPIO_T::DS: DS11_DS01 Mask */ + +#define GPIO_DS_DS12_DS02_Pos (2) /*!< GPIO_T::DS: DS12_DS02 Position */ +#define GPIO_DS_DS12_DS02_Msk (0x1ul << GPIO_DS_DS12_DS02_Pos) /*!< GPIO_T::DS: DS12_DS02 Mask */ + +#define GPIO_DS_DS13_DS03_Pos (3) /*!< GPIO_T::DS: DS13_DS03 Position */ +#define GPIO_DS_DS13_DS03_Msk (0x1ul << GPIO_DS_DS13_DS03_Pos) /*!< GPIO_T::DS: DS13_DS03 Mask */ + +#define GPIO_DS_DS14_DS04_Pos (4) /*!< GPIO_T::DS: DS14_DS04 Position */ +#define GPIO_DS_DS14_DS04_Msk (0x1ul << GPIO_DS_DS14_DS04_Pos) /*!< GPIO_T::DS: DS14_DS04 Mask */ + +#define GPIO_DS_DS15_DS05_Pos (5) /*!< GPIO_T::DS: DS15_DS05 Position */ +#define GPIO_DS_DS15_DS05_Msk (0x1ul << GPIO_DS_DS15_DS05_Pos) /*!< GPIO_T::DS: DS15_DS05 Mask */ + +#define GPIO_DS_DS16_DS06_Pos (6) /*!< GPIO_T::DS: DS16_DS06 Position */ +#define GPIO_DS_DS16_DS06_Msk (0x1ul << GPIO_DS_DS16_DS06_Pos) /*!< GPIO_T::DS: DS16_DS06 Mask */ + +#define GPIO_DS_DS17_DS07_Pos (7) /*!< GPIO_T::DS: DS17_DS07 Position */ +#define GPIO_DS_DS17_DS07_Msk (0x1ul << GPIO_DS_DS17_DS07_Pos) /*!< GPIO_T::DS: DS17_DS07 Mask */ + +#define GPIO_DS_DS18_DS08_Pos (8) /*!< GPIO_T::DS: DS18_DS08 Position */ +#define GPIO_DS_DS18_DS08_Msk (0x1ul << GPIO_DS_DS18_DS08_Pos) /*!< GPIO_T::DS: DS18_DS08 Mask */ + +#define GPIO_DS_DS19_DS09_Pos (9) /*!< GPIO_T::DS: DS19_DS09 Position */ +#define GPIO_DS_DS19_DS09_Msk (0x1ul << GPIO_DS_DS19_DS09_Pos) /*!< GPIO_T::DS: DS19_DS09 Mask */ + +#define GPIO_DS_DS110_DS010_Pos (10) /*!< GPIO_T::DS: DS110_DS010 Position */ +#define GPIO_DS_DS110_DS010_Msk (0x1ul << GPIO_DS_DS110_DS010_Pos) /*!< GPIO_T::DS: DS110_DS010 Mask */ + +#define GPIO_DS_DS111_DS011_Pos (11) /*!< GPIO_T::DS: DS111_DS011 Position */ +#define GPIO_DS_DS111_DS011_Msk (0x1ul << GPIO_DS_DS111_DS011_Pos) /*!< GPIO_T::DS: DS111_DS011 Mask */ + +#define GPIO_DS_DS112_DS012_Pos (12) /*!< GPIO_T::DS: DS112_DS012 Position */ +#define GPIO_DS_DS112_DS012_Msk (0x1ul << GPIO_DS_DS112_DS012_Pos) /*!< GPIO_T::DS: DS112_DS012 Mask */ + +#define GPIO_DS_DS113_DS013_Pos (13) /*!< GPIO_T::DS: DS113_DS013 Position */ +#define GPIO_DS_DS113_DS013_Msk (0x1ul << GPIO_DS_DS113_DS013_Pos) /*!< GPIO_T::DS: DS113_DS013 Mask */ + +#define GPIO_DS_DS114_DS014_Pos (14) /*!< GPIO_T::DS: DS114_DS014 Position */ +#define GPIO_DS_DS114_DS014_Msk (0x1ul << GPIO_DS_DS114_DS014_Pos) /*!< GPIO_T::DS: DS114_DS014 Mask */ + +#define GPIO_DS_DS115_DS015_Pos (15) /*!< GPIO_T::DS: DS115_DS015 Position */ +#define GPIO_DS_DS115_DS015_Msk (0x1ul << GPIO_DS_DS115_DS015_Pos) /*!< GPIO_T::DS: DS115_DS015 Mask */ + +#define GPIO_UDS_UDS0_Pos (0) /*!< GPIO_T::UDS: UDS0 Position */ +#define GPIO_UDS_UDS0_Msk (0x1ul << GPIO_UDS_UDS0_Pos) /*!< GPIO_T::UDS: UDS0 Mask */ + +#define GPIO_UDS_UDS1_Pos (1) /*!< GPIO_T::UDS: UDS1 Position */ +#define GPIO_UDS_UDS1_Msk (0x1ul << GPIO_UDS_UDS1_Pos) /*!< GPIO_T::UDS: UDS1 Mask */ + +#define GPIO_UDS_UDS2_Pos (2) /*!< GPIO_T::UDS: UDS2 Position */ +#define GPIO_UDS_UDS2_Msk (0x1ul << GPIO_UDS_UDS2_Pos) /*!< GPIO_T::UDS: UDS2 Mask */ + +#define GPIO_UDS_UDS3_Pos (3) /*!< GPIO_T::UDS: UDS3 Position */ +#define GPIO_UDS_UDS3_Msk (0x1ul << GPIO_UDS_UDS3_Pos) /*!< GPIO_T::UDS: UDS3 Mask */ + +#define GPIO_UDS_UDS4_Pos (4) /*!< GPIO_T::UDS: UDS4 Position */ +#define GPIO_UDS_UDS4_Msk (0x1ul << GPIO_UDS_UDS4_Pos) /*!< GPIO_T::UDS: UDS4 Mask */ + +#define GPIO_UDS_UDS5_Pos (5) /*!< GPIO_T::UDS: UDS5 Position */ +#define GPIO_UDS_UDS5_Msk (0x1ul << GPIO_UDS_UDS5_Pos) /*!< GPIO_T::UDS: UDS5 Mask */ + +#define GPIO_UDS_UDS6_Pos (6) /*!< GPIO_T::UDS: UDS6 Position */ +#define GPIO_UDS_UDS6_Msk (0x1ul << GPIO_UDS_UDS6_Pos) /*!< GPIO_T::UDS: UDS6 Mask */ + +#define GPIO_UDS_UDS7_Pos (7) /*!< GPIO_T::UDS: UDS7 Position */ +#define GPIO_UDS_UDS7_Msk (0x1ul << GPIO_UDS_UDS7_Pos) /*!< GPIO_T::UDS: UDS7 Mask */ + +#define GPIO_UDS_UDS8_Pos (8) /*!< GPIO_T::UDS: UDS8 Position */ +#define GPIO_UDS_UDS8_Msk (0x1ul << GPIO_UDS_UDS8_Pos) /*!< GPIO_T::UDS: UDS8 Mask */ + +#define GPIO_UDS_UDS9_Pos (9) /*!< GPIO_T::UDS: UDS9 Position */ +#define GPIO_UDS_UDS9_Msk (0x1ul << GPIO_UDS_UDS9_Pos) /*!< GPIO_T::UDS: UDS9 Mask */ + +#define GPIO_UDS_UDS10_Pos (10) /*!< GPIO_T::UDS: UDS10 Position */ +#define GPIO_UDS_UDS10_Msk (0x1ul << GPIO_UDS_UDS10_Pos) /*!< GPIO_T::UDS: UDS10 Mask */ + +#define GPIO_UDS_UDS11_Pos (11) /*!< GPIO_T::UDS: UDS11 Position */ +#define GPIO_UDS_UDS11_Msk (0x1ul << GPIO_UDS_UDS11_Pos) /*!< GPIO_T::UDS: UDS11 Mask */ + +#define GPIO_UDS_UDS12_Pos (12) /*!< GPIO_T::UDS: UDS12 Position */ +#define GPIO_UDS_UDS12_Msk (0x1ul << GPIO_UDS_UDS12_Pos) /*!< GPIO_T::UDS: UDS12 Mask */ + +#define GPIO_UDS_UDS13_Pos (13) /*!< GPIO_T::UDS: UDS13 Position */ +#define GPIO_UDS_UDS13_Msk (0x1ul << GPIO_UDS_UDS13_Pos) /*!< GPIO_T::UDS: UDS13 Mask */ + +#define GPIO_UDS_UDS14_Pos (14) /*!< GPIO_T::UDS: UDS14 Position */ +#define GPIO_UDS_UDS14_Msk (0x1ul << GPIO_UDS_UDS14_Pos) /*!< GPIO_T::UDS: UDS14 Mask */ + +#define GPIO_UDS_UDS15_Pos (15) /*!< GPIO_T::UDS: UDS15 Position */ +#define GPIO_UDS_UDS15_Msk (0x1ul << GPIO_UDS_UDS15_Pos) /*!< GPIO_T::UDS: UDS15 Mask */ +/**@}*/ /* GPIO_CONST */ +/**@}*/ /* end of GPIO register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __GPIO_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/hsusbd_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/hsusbd_reg.h new file mode 100644 index 0000000000..ae1d67027a --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/hsusbd_reg.h @@ -0,0 +1,3108 @@ +/**************************************************************************//** + * @file hsusbd_reg.h + * @brief HSUSBD register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __HSUSBD_REG_H__ +#define __HSUSBD_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + + +/******************************************************************************/ +/* Device Specific Peripheral registers structures */ +/******************************************************************************/ + +/** @addtogroup REGISTER Control Register + + @{ + +*/ + + +/*---------------------- High Speed USB 2.0 Device Controller -------------------------*/ +/** + @addtogroup HSUSBD High Speed USB 2.0 Device Controller(HSUSBD) + Memory Mapped Structure for HSUSBD Controller +@{ */ + +/*----- IN Endpoint 1~8 -----*/ +typedef struct +{ + + /** + * @var HSUSBD_T::DIEPCTLn + * Offset: 0x00 Device Control IN Endpoint n Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |MPS |Maximum Packet Size (MPS) + * | | |The application must program this field with the maximum packet size for the current logical endpoint + * | | |This value is in bytes. + * |[15] |USBActEP |USB Active Endpoint (USBActEP) + * | | |Indicates whether this endpoint is active in the current configuration and interface + * | | |The core clears this bit for all endpoints (other than EP 0) after detecting a USB reset + * | | |After receiving the SetConfiguration and SetInterface commands, the application must program endpoint registers accordingly and set this bit. + * | | |Values: + * | | |0x0 (DISABLED): Not Active + * | | |0x1 (ENABLED): USB Active Endpoint + * |[16] |DPID |Endpoint Data PID (DPID) (Read only) + * | | |Applies to interrupt/bulk IN and OUT endpoints only. + * | | |Contains the PID of the packet to be received or transmitted on this endpoint + * | | |The application must program the PID of the first packet to be received or transmitted on this endpoint, after the endpoint is activated + * | | |The applications use the SetD1PID and SetD0PID fields of this register to program either DATA0 or DATA1 PID. + * | | |1'b0: DATA0 + * | | |1'b1: DATA1 + * | | |Values: + * | | |0x0 (DATA0EVENFRM): DATA0 or Even Frame + * | | |0x1 (DATA1ODDFRM): DATA1 or Odd Frame + * |[17] |NAKSts |NAK Status (NAKSts) (Read only) + * | | |Indicates the following: + * | | |1'b0: The core is transmitting non-NAK handshakes based on the FIFO status. + * | | |1'b1: The core is transmitting NAK handshakes on this endpoint. + * | | |When either the application or the core sets this bit: + * | | |The core stops receiving any data on an OUT endpoint, even if there is space in the RxFIFO to accommodate the incoming packet. + * | | |For non-isochronous IN endpoints: The core stops transmitting any data on an IN endpoint, even if there data is available in the TxFIFO. + * | | |For isochronous IN endpoints: The core sends out a zero-length data packet, even if there data is available in the TxFIFO. + * | | |Irrespective of this bit's setting, the core always responds to SETUP data packets with an ACK handshake. + * | | |Values: + * | | |0x0 (NONNAK): + * | | |The core is transmitting non-NAK handshakes based on the FIFO status + * | | |0x1 (NAK): + * | | |The core is transmitting NAK handshakes on this endpoint + * |[19:18] |EPType |Endpoint Type (EPType) + * | | |This is the transfer type supported by this logical endpoint + * | | |2'b00: Control + * | | |2'b01: Isochronous + * | | |2'b10: Bulk + * | | |2'b11: Interrupt + * | | |Values: + * | | |0x0 (CONTROL): Control + * | | |0x1 (ISOCHRONOUS): Isochronous + * | | |0x2 (BULK): Bulk + * | | |0x3 (INTERRUP): Interrupt + * |[21] |Stall |STALL Handshake (Stall) + * | | |Applies to non-control, non-isochronous IN and OUT endpoints only. + * | | |The application sets this bit to stall all tokens from the USB host to this endpoint + * | | |If a NAK bit, Global Non-periodic IN NAK, or Global OUT NAK is set along with this bit, the STALL bit takes priority + * | | |Only the application can clear this bit, never the core. + * | | |Applies to control endpoints only. + * | | |The application can only set this bit, and the core clears it, when a SETUP token is received for this endpoint + * | | |If a NAK bit, Global Non-periodic IN NAK, or Global OUT NAK is set along with this bit, the STALL bit takes priority + * | | |Irrespective of this bit's setting, the core always responds to SETUP data packets with an ACK handshake. + * | | |Values: + * | | |0x0 (INACTIVE): STALL All non-active tokens + * | | |0x1 (ACTIVE): STALL All Active Tokens + * |[25:22] |TxFNum |TxFIFO Number (TxFNum) + * | | |Dedicated FIFO Operation: These bits specify the FIFO number associated with this endpoint + * | | |Each active IN endpoint must be programmed to a separate FIFO number + * | | |This field is valid only for IN endpoints. + * | | |Values: + * | | |0x0 (TXFIFO0): Tx FIFO 0 + * | | |0x1 (TXFIFO1): Tx FIFO 1 + * | | |0x2 (TXFIFO2): Tx FIFO 2 + * | | |0x3 (TXFIFO3): Tx FIFO 3 + * | | |0x4 (TXFIFO4): Tx FIFO 4 + * | | |0x5 (TXFIFO5): Tx FIFO 5 + * | | |0x6 (TXFIFO6): Tx FIFO 6 + * | | |0x7 (TXFIFO7): Tx FIFO 7 + * | | |0x8 (TXFIFO8): Tx FIFO 8 + * |[26] |CNAK |Clear NAK (CNAK) + * | | |A write to this bit clears the NAK bit for the endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No Clear NAK + * | | |0x1 (ACTIVE): Clear NAK + * |[27] |SNAK |Set NAK (SNAK) + * | | |A write to this bit sets the NAK bit for the endpoint. + * | | |Using this bit, the application can control the transmission of NAK handshakes on an endpoint + * | | |The core can also Set this bit for an endpoint after a SETUP packet is received on that endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No Set NAK + * | | |0x1 (ACTIVE): Set NAK + * |[30] |EPDis |Endpoint Disable (EPDis) + * | | |Applies to IN and OUT endpoints. + * | | |The application sets this bit to stop transmitting/receiving data on an endpoint, even before the transfer for that endpoint is complete + * | | |The application must wait for the Endpoint Disabled interrupt before treating the endpoint as disabled + * | | |The core clears this bit before setting the Endpoint Disabled interrupt + * | | |The application must set this bit only if Endpoint Enable is already set for this endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No Action + * | | |0x1 (ACTIVE): Disable Endpoint + * |[31] |EPEna |Endpoint Enable (EPEna) + * | | |Applies to IN and OUT endpoints. + * | | |When Scatter/Gather DMA mode is enabled, + * | | |For IN endpoints this bit indicates that the descriptor structure and data buffer with data ready to transmit is setup. + * | | |For OUT endpoint it indicates that the descriptor structure and data buffer to receive data is setup. + * | | |The core clears this bit before setting any of the following interrupts on this endpoint: + * | | |SETUP Phase Done + * | | |Endpoint Disabled + * | | |Transfer Completed + * | | |Note: For control endpoints in DMA mode, this bit must be set to be able to transfer SETUP data packets in memory. + * | | |Values: + * | | |0x0 (INACTIVE): No Action + * | | |0x1 (ACTIVE): Enable Endpoint + * @var HSUSBD_T::DIEPINTn + * Offset: 0x08 Device IN Endpoint n Interrupt Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |XferCompl |Transfer Completed Interrupt (XferCompl) + * | | |Applies to IN and OUT endpoints. + * | | |When Scatter/Gather DMA mode is enabled + * | | |For IN endpoint this field indicates that the requested data from the descriptor is moved from external system memory to internal FIFO. + * | | |For OUT endpoint this field indicates that the requested data from the internal FIFO is moved to external system memory + * | | |This interrupt is generated only when the corresponding endpoint descriptor is closed, and the IOC bit for the corresponding descriptor is set. + * | | |Values: + * | | |0x0 (INACTIVE): No Transfer Complete Interrupt + * | | |0x1 (ACTIVE): Transfer Complete Interrupt + * |[1] |EPDisbld |Endpoint Disabled Interrupt (EPDisbld) + * | | |Applies to IN and OUT endpoints. + * | | |This bit indicates that the endpoint is disabled per the application's request. + * | | |Values: + * | | |0x0 (INACTIVE): No Endpoint Disabled Interrupt + * | | |0x1 (ACTIVE): Endpoint Disabled Interrupt + * |[2] |AHBErr |AHB Error (AHBErr) + * | | |Applies to IN and OUT endpoints. + * | | |When there is an AHB error during an AHB read/write + * | | |The application can read the corresponding endpoint DMA address register to get the error address. + * | | |Values: + * | | |0x0 (INACTIVE): No AHB Error Interrupt + * | | |0x1 (ACTIVE): AHB Error interrupt + * |[4] |INTknTXFEmp|IN Token Received When TxFIFO is Empty (INTknTXFEmp) + * | | |Applies to non-periodic IN endpoints only. + * | | |Indicates that an IN token was received when the associated TxFIFO (periodic/non-periodic) was empty + * | | |This interrupt is asserted on the endpoint for which the IN token was received. + * | | |Values: + * | | |0x0 (INACTIVE): No IN Token Received interrupt + * | | |0x1 (ACTIVE): IN Token Received Interrupt + * |[5] |INTknEPMis|IN Token Received with EP Mismatch (INTknEPMis) + * | | |Applies to non-periodic IN endpoints only. + * | | |Indicates that the data in the top of the non-periodic TxFIFO belongs to an endpoint other than the one for which the IN token was received + * | | |This interrupt is asserted on the endpoint for which the IN token was received. + * | | |Values: + * | | |0x0 (INACTIVE): No IN Token Received with EP Mismatch interrupt + * | | |0x1 (ACTIVE): IN Token Received with EP Mismatch interrupt + * |[6] |INEPNakEff|IN Endpoint NAK Effective (INEPNakEff) + * | | |Applies to periodic IN endpoints only. + * | | |This bit can be cleared when the application clears the IN endpoint NAK by writing to DIEPCTLn.CNAK. + * | | |This interrupt indicates that the core has sampled the NAK bit + * | | |Set (either by the application or by the core) + * | | |The interrupt indicates that the IN endpoint NAK bit Set by the application has taken effect in the core. + * | | |This interrupt does not guarantee that a NAK handshake is sent on the USB + * | | |A STALL bit takes priority over a NAK bit. + * | | |Values: + * | | |0x0 (INACTIVE): No Endpoint NAK Effective interrupt + * | | |0x1 (ACTIVE): IN Endpoint NAK Effective interrupt + * |[7] |TxFEmp |Transmit FIFO Empty (TxFEmp) (Read only) + * | | |This bit is valid only for IN endpoints + * | | |This interrupt is asserted when the TxFIFO for this endpoint is either half or completely empty + * | | |The half or completely empty status is determined by the TxFIFO Empty Level bit in the Core AHB Configuration register (GAHBCFG.NPTxFEmpLvl)). + * | | |Values: + * | | |0x0 (INACTIVE): No Transmit FIFO Empty interrupt + * | | |0x1 (ACTIVE): Transmit FIFO Empty interrupt + * |[8] |TxfifoUndrn|Fifo Underrun (TxfifoUndrn) + * | | |Applies to IN endpoints Only + * | | |This bit is valid only If thresholding is enabled + * | | |The core generates this interrupt when it detects a transmit FIFO underrun condition for this endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No Tx FIFO Underrun interrupt + * | | |0x1 (ACTIVE): TxFIFO Underrun interrupt + * |[9] |BNAIntr |BNA (Buffer Not Available) Interrupt (BNAIntr) + * | | |The core generates this interrupt when the descriptor accessed is not ready for the Core to process, such as Host busy or DMA done. + * | | |Values: + * | | |0x0 (INACTIVE): No BNA interrupt + * | | |0x1 (ACTIVE): BNA interrupt + * |[12] |BbleErr |NAK Interrupt (BbleErr) + * | | |The core generates this interrupt when babble is received for the endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No interrupt + * | | |0x1 (ACTIVE): BbleErr interrupt + * |[13] |NAKIntrpt |NAK Interrupt (NAKInterrupt) + * | | |The core generates this interrupt when a NAK is transmitted or received by the device + * | | |In case of isochronous IN endpoints the interrupt gets generated when a zero length packet is transmitted due to un-availability of data in the TXFifo. + * | | |Values: + * | | |0x0 (INACTIVE): No NAK interrupt + * | | |0x1 (ACTIVE): NAK Interrupt + * |[14] |NYETIntrpt|NYET Interrupt (NYETIntrpt) + * | | |The core generates this interrupt when a NYET response is transmitted for a non isochronous OUT endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No NYET interrupt + * | | |0x1 (ACTIVE): NYET Interrupt + * @var HSUSBD_T::DIEPDMAn + * Offset: 0x14 Device IN Endpoint n DMA Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DMAAddr |Holds the start address of the external memory for storing or fetching endpoint data + * | | |Note: For control endpoints, this field stores control OUT data packets as well as SETUP transaction data packets + * | | |When more than three SETUP packets are received back-to-back, the SETUP data packet in the memory is overwritten. + * | | |This register is incremented on every AHB transaction + * | | |The application can give only a DWORD-aligned address. + * | | |This field indicates the base pointer for the descriptor list. + * @var HSUSBD_T::DTXFSTSn + * Offset: 0x18 Device IN Endpoint Transmit FIFO Status Register n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |INEPTxFSpcAvail|IN Endpoint TxFIFO Space Avail (INEPTxFSpcAvail) + * | | |Indicates the amount of free space available in the Endpoint TxFIFO. + * | | |Values are in terms of 32-bit words. + * | | |16'h0: Endpoint TxFIFO is full + * | | |16'h1: 1 word available + * | | |16'h2: 2 words available + * | | |16'hn: n words available (where 0 n 32,768) + * | | |16'h8000: 32,768 words available + * | | |Others: Reserved + * @var HSUSBD_T::DIEPDMABn + * Offset: 0x1C Device IN Endpoint n Buffer Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DMABufferAddr|Holds the current buffer address This register is updated as and when the data transfer for the corresponding end point is in progress + */ + + + __IO uint32_t DIEPCTL; /*!< [0x000] Device Control IN Endpoint n Control Register */ + __I uint32_t RESERVE1[1]; + __IO uint32_t DIEPINT; /*!< [0x008] Device IN Endpoint n Interrupt Register */ + __I uint32_t RESERVE2[2]; + __IO uint32_t DIEPDMA; /*!< [0x014] Device IN Endpoint n DMA Address Register */ + __I uint32_t DTXFSTS; /*!< [0x018] Device IN Endpoint Transmit FIFO Status Register n */ + __I uint32_t DIEPDMAB; /*!< [0x01c] Device IN Endpoint n Buffer Address Register */ + +} HSUSBD_IEP_T; + + + +/*----- OUT Endpoint 1~8 -----*/ +typedef struct +{ + + /** + + * @var HSUSBD_T::DOEPCTLn + * Offset: 0x00 Device Control OUT Endpoint n Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |MPS |Maximum Packet Size (MPS)Maximum Packet Size + * | | |The application must program this field with the maximum packet size for the current logical endpoint + * | | |This value is in bytes. + * |[15] |USBActEP |USB Active Endpoint (USBActEP)USB Active Endpoint + * | | |Indicates whether this endpoint is active in the current configuration and interface + * | | |The core clears this bit for all endpoints (other than EP 0) after detecting a USB reset + * | | |After receiving the SetConfiguration and SetInterface commands, the application must program endpoint registers accordingly and set this bit. + * | | |Values: + * | | |0x0 (DISABLED): Not Active + * | | |0x1 (ENABLED): USB Active Endpoint + * |[16] |DPID |Endpoint Data PID (DPID) (Read only)Endpoint Data PID (Read only) + * | | |Applies to interrupt/bulk IN and OUT endpoints only. + * | | |Contains the PID of the packet to be received or transmitted on this endpoint + * | | |The application must program the PID of the first packet to be received or transmitted on this endpoint, after the endpoint is activated + * | | |The applications use the SetD1PID and SetD0PID fields of this register to program either DATA0 or DATA1 PID. + * | | |1'b0: DATA0 + * | | |1'b1: DATA1 + * | | |Values: + * | | |0x0 (INACTIVE): Endpoint Data PID not active + * | | |0x1 (ACTIVE): Endpoint Data PID active + * |[17] |NAKSts |NAK Status (NAKSts) (Read only)NAK Status (Read only) + * | | |Indicates the following: + * | | |1'b0: The core is transmitting non-NAK handshakes based on the FIFO status. + * | | |1'b1: The core is transmitting NAK handshakes on this endpoint. + * | | |When either the application or the core sets this bit: + * | | |The core stops receiving any data on an OUT endpoint, even if there is space in the RxFIFO to accommodate the incoming packet. + * | | |For non-isochronous IN endpoints: The core stops transmitting any data on an IN endpoint, even if there data is available in the TxFIFO. + * | | |For isochronous IN endpoints: The core sends out a zero-length data packet, even if there data is available in the TxFIFO. + * | | |Irrespective of this bit's setting, the core always responds to SETUP data packets with an ACK handshake. + * | | |Values: + * | | |0x0 (NONNAK): + * | | |The core is transmitting non-NAK handshakes based on the FIFO status + * | | |0x1 (NAK): + * | | |The core is transmitting NAK handshakes on this endpoint + * |[19:18] |EPType |Endpoint Type (EPType)Endpoint Type + * | | |This is the transfer type supported by this logical endpoint. + * | | |2'b00: Control + * | | |2'b01: Isochronous + * | | |2'b10: Bulk + * | | |2'b11: Interrupt + * | | |Values: + * | | |0x0 (CONTROL): Control + * | | |0x1 (ISOCHRONOUS): Isochronous + * | | |0x2 (BULK): Bulk + * | | |0x3 (INTERRUPT): Interrupt + * |[20] |Snp |Reserved. + * |[21] |Stall |STALL Handshake (Stall)STALL Handshake + * | | |Applies to non-control, non-isochronous IN and OUT endpoints only. + * | | |The application sets this bit to stall all tokens from the USB host to this endpoint + * | | |If a NAK bit, Global Non-periodic IN NAK, or Global OUT NAK is set along with this bit, the STALL bit takes priority + * | | |Only the application can clear this bit, never the core. + * | | |Applies to control endpoints only. + * | | |The application can only set this bit, and the core clears it, when a SETUP token is received for this endpoint + * | | |If a NAK bit, Global Non-periodic IN NAK, or Global OUT NAK is set along with this bit, the STALL bit takes priority + * | | |Irrespective of this bit's setting, the core always responds to SETUP data packets with an ACK handshake. + * | | |Values: + * | | |0x0 (INACTIVE): STALL All non-active tokens + * | | |0x1 (ACTIVE): STALL All Active Tokens + * |[26] |CNAK |Clear NAK (CNAK)Clear NAK A write to this bit clears the NAK bit for the endpoint + * | | |Values: + * | | |0x0 (INACTIVE): No Clear NAK + * | | |0x1 (ACTIVE): Clear NAK + * |[27] |SNAK |Set NAK (SNAK)Set NAK + * | | |A write to this bit sets the NAK bit for the endpoint. + * | | |Using this bit, the application can control the transmission of NAK handshakes on an endpoint + * | | |The core can also set this bit for an endpoint after a SETUP packet is received on that endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No Set NAK + * | | |0x1 (ACTIVE): Set NAK + * |[28] |SetD0PID |Set DATA0 PID (SetD0PID)Set DATA0 PID + * | | |Applies to interrupt/bulk IN and OUT endpoints only. + * | | |Writing to this field sets the Endpoint Data PID (DPID) field in this register to DATA0. + * | | |Values: + * | | |0x0 (DISABLED): Disables Set DATA0 PID or Do not force Even Frame + * | | |0x1 (ENABLED): Set Endpoint Data PID to DATA0 or Sets EO_FrNum field to odd (micro)Frame + * |[29] |SetD1PID |Set DATA1 PID (SetD1PID)Set DATA1 PID + * | | |Applies to interrupt and bulk IN and OUT endpoints only. + * | | |Writing to this field sets the Endpoint Data PID (DPID) field in this register to DATA1. + * | | |Values: + * | | |0x0 (DISABLED): Disables Set DATA1 PID or Do not force Odd Frame + * | | |0x1 (ENABLED): Set Endpoint Data PID to DATA1 or Sets EO_FrNum field to odd (micro)Frame + * |[30] |EPDis |Endpoint Disable (EPDis)Endpoint Disable + * | | |Applies to IN and OUT endpoints. + * | | |The application sets this bit to stop transmitting/receiving data on an endpoint, even before the transfer for that endpoint is complete + * | | |The application must wait for the Endpoint Disabled interrupt before treating the endpoint as disabled + * | | |The core clears this bit before setting the Endpoint Disabled interrupt + * | | |The application must set this bit only if Endpoint Enable is already set for this endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No Action + * | | |0x1 (ACTIVE): Disable Endpoint + * |[31] |EPEna |Endpoint Enable (EPEna)Endpoint Enable + * | | |Applies to IN and OUT endpoints. + * | | |For IN endpoints this bit indicates that the descriptor structure and data buffer with data ready to transmit is setup. + * | | |For OUT endpoint it indicates that the descriptor structure and data buffer to receive data is setup. + * | | |The core clears this bit before setting any of the following interrupts on this endpoint: + * | | |SETUP Phase Done + * | | |Endpoint Disabled + * | | |Transfer Completed + * | | |Note: For control endpoints in DMA mode, this bit must be set for the controller to transfer SETUP data packets to the memory + * | | |This bit will not be cleared on Transfer Completed interrupt of the SETUP packet. + * | | |Values: + * | | |0x0 (INACTIVE): No Action + * | | |0x1 (ACTIVE): Enable Endpoint + * @var HSUSBD_T::DOEPINTn + * Offset: 0x08 Device OUT Endpoint n Interrupt Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |XferCompl |Transfer Completed Interrupt (XferCompl) Transfer Completed Interrupt + * | | |Applies to IN and OUT endpoints. + * | | |When Scatter/Gather DMA mode is enabled + * | | |For IN endpoint this field indicates that the requested data from the descriptor is moved from external system memory to internal FIFO. + * | | |For OUT endpoint this field indicates that the requested data from the internal FIFO is moved to external system memory + * | | |This interrupt is generated only when the corresponding endpoint descriptor is closed, and the IOC bit for the corresponding descriptor is Set. + * | | |Values: + * | | |0x0 (INACTIVE): No Transfer Complete Interrupt + * | | |0x1 (ACTIVE): Transfer Complete Interrupt + * |[1] |EPDisbld |Endpoint Disabled Interrupt (EPDisbld)Endpoint Disabled Interrupt + * | | |Applies to IN and OUT endpoints. + * | | |This bit indicates that the endpoint is disabled per the application's request. + * | | |Values: + * | | |0x0 (INACTIVE): No Endpoint Disabled Interrupt + * | | |0x1 (ACTIVE): Endpoint Disabled Interrupt + * |[2] |AHBErr |AHB Error (AHBErr)AHB Error + * | | |Applies to IN and OUT endpoints. + * | | |When there is an AHB error during an AHB read/write + * | | |The application can read the corresponding endpoint DMA address register to get the error address. + * | | |Values: + * | | |0x0 (INACTIVE): No AHB Error Interrupt + * | | |0x1 (ACTIVE): AHB Error interrupt + * |[3] |SetUp |SETUP Phase Done (SetUp)SETUP Phase Done + * | | |Applies to control OUT endpoints only. + * | | |Indicates that the SETUP phase for the control endpoint is complete and no more back-to-back SETUP packets were received for the current control transfer + * | | |On this interrupt, the application can decode the received SETUP data packet. + * | | |Values: + * | | |0x0 (INACTIVE): No SETUP Phase Done + * | | |0x1 (ACTIVE): SETUP Phase Done + * |[4] |OUTTknEPdis|OUT Token Received When Endpoint Disabled (OUTTknEPdis)OUT Token Received When Endpoint Disabled + * | | |Applies only to control OUT endpoints. + * | | |Indicates that an OUT token was received when the endpoint was not yet enabled + * | | |This interrupt is asserted on the endpoint for which the OUT token was received. + * | | |Values: + * | | |0x0 (INACTIVE): No OUT Token Received When Endpoint Disabled + * | | |0x1 (ACTIVE): OUT Token Received When Endpoint Disabled + * |[5] |StsPhseRcvd|Status Phase Received for Control Write (StsPhseRcvd)Status Phase Received for Control Write + * | | |This interrupt is valid only for Control OUT endpoints. + * | | |This interrupt is generated only after the core has transferred all the data that the host has sent during the data phase of a control write transfer, to the system memory buffer. + * | | |The interrupt indicates to the application that the host has switched from data phase to the status phase of a Control Write transfer + * | | |The application can use this interrupt to ACK or STALL the Status phase, after it has decoded the data phase + * | | |This is applicable only in Case of Scatter Gather DMA mode. + * | | |Values: + * | | |0x0 (INACTIVE): No Status Phase Received for Control Write + * | | |0x1 (ACTIVE): Status Phase Received for Control Write + * |[6] |Back2BackSETup|Back-to-Back SETUP Packets Received (Back2BackSETup)Back-to-Back SETUP Packets Received + * | | |Applies to Control OUT endpoints only. + * | | |This bit indicates that the core has received more than three back-to-back SETUP packets for this particular endpoint + * | | |For information about handling this interrupt, + * | | |Values: + * | | |0x0 (INACTIVE): No Back-to-Back SETUP Packets Received + * | | |0x1 (ACTIVE): Back-to-Back SETUP Packets Received + * |[8] |OutPktErr |OUT Packet Error (OutPktErr)OUT Packet Error + * | | |Applies to OUT endpoints Only + * | | |This interrupt is valid only when thresholding is enabled + * | | |This interrupt is asserted when the core detects an overflow or a CRC error for non-Isochronous OUT packet. + * | | |Values: + * | | |0x0 (INACTIVE): No OUT Packet Error + * | | |0x1 (ACTIVE): OUT Packet Error + * |[9] |BNAIntr |BNA (Buffer Not Available) Interrupt (BNAIntr)Buffer Not Available Interrupt + * | | |The core generates this interrupt when the descriptor accessed is not ready for the Core to process, such as Host busy or DMA done + * | | |Values: + * | | |0x0 (INACTIVE): No BNA interrupt + * | | |0x1 (ACTIVE): BNA interrupt + * |[12] |BbleErr |NAK Interrupt (BbleErr)NAK Interrupt + * | | |The core generates this interrupt when babble is received for the endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No BbleErr interrupt + * | | |0x1 (ACTIVE): BbleErr interrupt + * |[13] |NAKIntrpt |NAK Interrupt (NAKInterrupt)NAK Interrupt + * | | |The core generates this interrupt when a NAK is transmitted or received by the device. + * | | |In case of isochronous IN endpoints the interrupt gets generated when a zero length packet is transmitted due to un-availability of data in the TXFifo. + * | | |Values: + * | | |0x0 (INACTIVE): No NAK interrupt + * | | |0x1 (ACTIVE): NAK Interrupt + * |[14] |NYETIntrpt|NYET Interrupt (NYETIntrpt)NYET Interrupt + * | | |The core generates this interrupt when a NYET response is transmitted for a non isochronous OUT endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No NYET interrupt + * | | |0x1 (ACTIVE): NYET Interrupt + * @var HSUSBD_T::DOEPDMAn + * Offset: 0x14 Device OUT Endpoint n DMA Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DMAAddr |Holds the start address of the external memory for storing or fetching endpoint data + * | | |Note: For control endpoints, this field stores control OUT data packets as well as SETUP transaction data packets + * | | |When more than three SETUP packets are received back-to-back, the SETUP data packet in the memory is overwritten. + * | | |This register is incremented on every AHB transaction + * | | |The application can give only a DWORD-aligned address + * @var HSUSBD_T::DOEPDMABn + * Offset: 0x1C Device OUT Endpoint n Buffer Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DMABufferAddr|Holds the current buffer address This register is updated as and when the data transfer for the corresponding end point is in progress. + */ + + __IO uint32_t DOEPCTL; /*!< [0x000] Device Control OUT Endpoint n Control Register */ + __I uint32_t RESERVE1[1]; + __IO uint32_t DOEPINT; /*!< [0x008] Device OUT Endpoint n Interrupt Register */ + __I uint32_t RESERVE2[2]; + __IO uint32_t DOEPDMA; /*!< [0x014] Device OUT Endpoint n DMA Address Register */ + __I uint32_t RESERVE3[1]; + __I uint32_t DOEPDMAB; /*!< [0x01c] Device OUT Endpoint n Buffer Address Register */ + +} HSUSBD_OEP_T; + + +typedef struct +{ + + + /** + * @var HSUSBD_T::GOTGCTL + * Offset: 0x00 Control and Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[27] |ChirpEn |Mode: Device Only + * | | |This bit when programmed to 1'b1 results in the core asserting chirp_on before sending an actual Chirp "K" signal on USB. + * | | |0x0 (CHIRP_DISABLE): The controller does not assert chirp_on before sending an actual Chirp "K" signal on USB. + * | | |0x1 (CHIRP_ENABLE): The controller asserts chirp_on before sending an actual Chirp "K" signal on USB. + * |[31] |Testmode_corr_eUSB2|UTMI IF correction for eUSB2 PHY during Test mode + * | | |This bit is used to modify the behavior of UTMI 8-bit interface signals during test J and test K sequences when eUSB2 PHY is used. + * | | |When this bit is set to 1'b1, the controller asserts utmi_txvalid and utmi_opmode in the same cycle during test J or test K sequence execution. + * | | |Note: This bit is applicable only if eUSB2 PHY is used with 8-bit UTMI interface. + * | | |0x0 (eUSB2_corr_disable): The controller asserts utmi_txvalid one cycle later than utmi_opmode. + * | | |0x1 (eUSB2_corr_enable): The controller asserts utmi_txvalid and utmi_opmode in the same cycle. + * @var HSUSBD_T::GAHBCFG + * Offset: 0x08 AHB Configuration Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GlblIntrMsk|Global Interrupt Mask (GlblIntrMsk) + * | | |The application uses this bit to mask or unmask the interrupt line assertion to itself + * | | |Irrespective of this bit's setting, the interrupt status registers are updated by the controller. + * | | |1'b0: Mask the interrupt assertion to the application. + * | | |1'b1: Unmask the interrupt assertion to the application. + * | | |Values: + * | | |0x0 (MASK): Mask the interrupt assertion to the application + * | | |0x1 (NOMASK): Unmask the interrupt assertion to the application. + * |[4:1] |HBstLen |Burst Length/Type (HBstLen) + * | | |Internal DMA Mode AHB Master burst type: + * | | |4'b0000 Single + * | | |4'b0001 INCR + * | | |4'b0011 INCR4 + * | | |4'b0101 INCR8 + * | | |4'b0111 INCR16 + * | | |Others: Reserved + * | | |Values: + * | | |0x0 (WORD1ORSINGLE): 1 word or single + * | | |0x1 (WORD4ORINCR): 4 words or INCR + * | | |0x3 (WORD16ORINCR4): 16 words or INCR4 + * | | |0x5 (WORD64ORINCR8): 64 words or INCR8 + * | | |0x7 (WORD256ORINCR16): 256 words or INCR16 + * |[5] |DMAEn |DMA Enable (DMAEn) + * | | |Reset: 1'b0 + * | | |Values: + * | | |0x1 (DMAMODE): Core operates in a DMA mode + * |[23] |AHBSingle |AHB Single Support (AHBSingle) + * | | |This bit when programmed supports Single transfers for the remaining data in a transfer when the core is operating in DMA mode. + * | | |1'b0: The remaining data in the transfer is sent using INCR burst size. + * | | |1'b1: The remaining data in the transfer is sent using Single burst size. + * | | |Note: If this feature is enabled, the AHB RETRY and SPLIT transfers still have INCR burst type + * | | |Enable this feature when the AHB Slave connected to the core does not support INCR burst (and when Split, and Retry transactions are not being used in the bus). + * | | |Values: + * | | |0x0 (INCRBURST): The remaining data in the transfer is sent using INCR burst size + * | | |0x1 (SINGLEBURST): The remaining data in the transfer is sent using Single burst size + * |[24] |InvDescEndianess|Invert Descriptor Endianess (InvDescEndianess) + * | | |1'b0: Descriptor Endianness is same as AHB Master Endianness. + * | | |1'b1: + * | | |If the AHB Master endianness is Big Endian, the Descriptor Endianness is Little Endian. + * | | |If the AHB Master endianness is Little Endian, the Descriptor Endianness is Big Endian. + * | | |Values: + * | | |0x0 (DISABLE): Descriptor Endianness is same as AHB Master Endianness + * | | |0x1 (ENABLE): Descriptor Endianness is opposite to AHB Master Endianness + * @var HSUSBD_T::GUSBCFG + * Offset: 0x0C USB Configuration Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |TOutCal |HS/FS Timeout Calibration (TOutCal) + * | | |The number of PHY clocks that the application programs in this field is added to the high-speed/full-speed interpacket timeout duration in the core to account for any additional delays introduced by the PHY + * | | |This can be required, because the delay introduced by the PHY in generating the linestate condition can vary from one PHY to another. + * | | |The USB standard timeout value for high-speed operation is 736 to 816 (inclusive) bit times + * | | |The USB standard timeout value for full-speed operation is 16 to 18 (inclusive) bit times + * | | |The application must program this field based on the speed of enumeration + * | | |The number of bit times added per PHY clock are as follows: + * | | |High-speed operation: + * | | |One 60- MHz PHY clock = 8 bit times. + * | | |Full-speed operation: + * | | |One 60- MHz PHY clock = 0.2 bit times. + * |[13:10] |USBTrdTim |USB Turnaround Time (USBTrdTim) + * | | |Sets the turnaround time in PHY clocks + * | | |Specifies the response time for a MAC request to the Packet FIFO Controller (PFC) to fetch data from the DFIFO (Interanl Storage) + * | | |This must be programmed to + * | | |4'h9: When the MAC interface is 8-bit UTMI+ . + * | | |Values: + * | | |0x9 (TURNTIME8BIT): MAC interface is 8-bit UTMI+. + * |[28] |TxEndDelay|Tx End Delay (TxEndDelay) + * | | |Writing 1'b1 to this bit enables the controller to follow the TxEndDelay timings as per UTMI+ specification 1.05 section 4.1.5 for opmode signal during remote wakeup. + * | | |1'b0 : Normal Mode. + * | | |1'b1 : Tx End delay. + * | | |Values: + * | | |0x0 (DISABLED): Normal Mode + * | | |0x1 (ENABLED): Tx End delay + * @var HSUSBD_T::GRSTCTL + * Offset: 0x10 Reset Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CSftRst |Core Soft Reset (CSftRst) + * | | |Resets the hclk and phy_clock domains as follows: + * | | |Clears the interrupts and all the CSR registers except the following register bits: + * | | |GUSBCFG.TxEndDelay + * | | |DCFG.DevSpd + * | | |DCTL.SftDiscon + * | | |All module state machines + * | | |All module state machines (except the AHB Slave Unit) are reset to the IDLE state, and all the transmit FIFOs and the receive FIFO are flushed. + * | | |Any transactions on the AHB Master are terminated as soon as possible, after gracefully completing the last data phase of an AHB transfer + * | | |Any transactions on the USB are terminated immediately. + * | | |The application can write to this bit any time it wants to reset the core + * | | |This is a self-clearing bit and the core clears this bit after all the necessary logic is reset in the core, which can take several clocks, depending on the current state of the core + * | | |Once this bit is cleared software must wait at least 3 PHY clocks before doing any access to the PHY domain (synchronization delay) + * | | |Software must also must check that bit 31 of this register is 1 (AHB Master is IDLE) before starting any operation. + * | | |Typically software reset is used during software development and also when you dynamically change the PHY selection bits in the USB configuration registers listed above + * | | |When you change the PHY, the corresponding clock for the PHY is selected and used in the PHY domain + * | | |Once a new clock is selected, the PHY domain has to be reset for proper operation. + * | | |Values: + * | | |0x0 (NOTACTIVE): No reset + * | | |0x1 (ACTIVE): Resets hclk and phy_clock domains + * |[1] |PIUFSSftRst|PIU FS Dedicated Controller Soft Reset (PIUFSSftRst) + * | | |Resets the PIU FS Dedicated Controller + * | | |All module state machines in FS Dedicated Controller of PIU are reset to the IDLE state + * | | |Used to reset the FS Dedicated controller in PIU in case of any PHY Errors like Loss of activity or Babble Error resulting in the PHY remaining in RX state for more than one frame boundary. + * | | |This is a self clearing bit and core clears this bit after all the necessary logic is reset in the core. + * | | |Values: + * | | |0x0 (RESET_INACTIVE): No Reset + * | | |0x1 (RESET_ACTIVE): PIU FS Dedicated Controller Soft Reset + * |[4] |RxFFlsh |RxFIFO Flush (RxFFlsh) + * | | |The application can flush the entire RxFIFO using this bit, but must first ensure that the core is not in the middle of a transaction. + * | | |The application must only write to this bit after checking that the controller is neither reading from the RxFIFO nor writing to the RxFIFO. + * | | |The application must wait until the bit is cleared before performing any other operations + * | | |This bit requires eight clocks (slowest of PHY or AHB clock) to clear. + * | | |Values: + * | | |0x0 (INACTIVE): Does not flush the entire RxFIFO + * | | |0x1 (ACTIVE): Flushes the entire RxFIFO + * |[5] |TxFFlsh |TxFIFO Flush (TxFFlsh) + * | | |This bit selectively flushes a single or all transmit FIFOs, but cannot do so If the core is in the midst of a transaction. + * | | |The application must write this bit only after checking that the core is neither writing to the TxFIFO nor reading from the TxFIFO. + * | | |Verify using these registers: + * | | |ReadNAK Effective Interrupt ensures the core is not reading from the FIFO + * | | |WriteGRSTCTL.AHBIdle ensures the core is not writing anything to the FIFO. + * | | |Flushing is normally recommended when FIFOs are reconfigured + * | | |FIFO flushing is also recommended during device endpoint disable + * | | |The application must wait until the core clears this bit before performing any operations + * | | |This bit takes eight clocks to clear, using the slower clock of phy_clk or hclk. + * | | |Values: + * | | |0x0 (INACTIVE): No Flush + * | | |0x1 (ACTIVE): Selectively flushes a single or all transmit FIFOs + * |[10:6] |TxFNum |TxFIFO Number (TxFNum) + * | | |This is the FIFO number that must be flushed using the TxFIFO Flush bit + * | | |This field must not be changed until the core clears the TxFIFO Flush bit. + * | | |5'h0: + * | | |Tx FIFO 0 flush in device mode when in dedicated FIFO mode + * | | |5'h1: + * | | |TXFIFO 1 flush in device mode when in dedicated FIFO mode + * | | |5'h2: + * | | |TXFIFO 2 flush in device mode when in dedicated FIFO mode + * | | |... + * | | |5'h8 + * | | |TXFIFO 8 flush in device mode when in dedicated FIFO mode + * | | |5'h10: Flush all the transmit FIFOs + * | | |Values: + * | | |0x0 (TXF0): TXFIFO 0 flush in device mode when in dedicated FIFO mode + * | | |0x1 (TXF1): TXFIFO 1 flush in device mode when in dedicated FIFO mode + * | | |0x2 (TXF2): TXFIFO 2 flush in device mode when in dedicated FIFO mode + * | | |0x3 (TXF3): TXFIFO 3 flush in device mode when in dedicated FIFO mode + * | | |0x4 (TXF4): TXFIFO 4 flush in device mode when in dedicated FIFO mode + * | | |0x5 (TXF5): TXFIFO 5 flush in device mode when in dedicated FIFO mode + * | | |0x6 (TXF6): TXFIFO 6 flush in device mode when in dedicated FIFO mode + * | | |0x7 (TXF7): TXFIFO 7 flush in device mode when in dedicated FIFO mode + * | | |0x8 (TXF8): TXFIFO 8 flush in device mode when in dedicated FIFO mode + * | | |0x10 (TXF16): Flush all the transmit FIFOs + * |[31] |AHBIdle |AHB Master Idle (AHBIdle)(Read only) + * | | |Indicates that the AHB Master State Machine is in the IDLE condition. + * | | |Values: + * | | |0x0 (INACTIVE): Not Idle + * | | |0x1 (ACTIVE): AHB Master Idle + * @var HSUSBD_T::GINTSTS + * Offset: 0x14 Interrupt Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3] |Sof |Start of (micro)Frame (Sof) + * | | |In Device mode, the controller sets this bit to indicate that an SOF token has been received on the USB + * | | |The application can read the Device Status register to get the current (micro)Frame number + * | | |This interrupt is seen only when the core is operating at either HS or FS + * | | |This bit can be set only by the core and the application must write 1 to clear it. + * | | |Note: This register may return 1'b1 if read immediately after power-on reset + * | | |If the register bit reads 1'b1 immediately after power-on reset, it does not indicate that an SOF has been received + * | | |The read value of this interrupt is valid only after a valid connection between host and device is established + * | | |If the bit is set after power on reset the application can clear the bit. + * | | |Values: + * | | |0x0 (INTACTIVE): No Start of Frame + * | | |0x1 (ACTIVE): Start of Frame + * |[4] |RxFLvl |RxFIFO Non-Empty (RxFLvl)(Read only) + * | | |Indicates that there is at least one packet pending to be read from the RxFIFO. + * | | |Values: + * | | |0x0 (INACTIVE): Rx Fifo is empty + * | | |0x1 (ACTIVE): Rx Fifo is not empty + * |[6] |GINNakEff |Global IN Non-periodic NAK Effective (GINNakEff)(Read only) + * | | |Indicates that the Set Global Non-periodic IN NAK bit in the Device Control register (DCTL.SGNPInNak) set by the application, has taken effect in the core + * | | |That is, the core has sampled the Global IN NAK bit Set by the application + * | | |This bit can be cleared by clearing the Clear Global Non-periodic IN NAK bit in the Device Control register (DCTL.CGNPInNak) + * | | |This interrupt does not necessarily mean that a NAK handshake is sent out on the USB + * | | |The STALL bit takes precedence over the NAK bit. + * | | |Values: + * | | |0x0 (INACTIVE): Global Non-periodic IN NAK not active + * | | |0x1 (ACTIVE): Set Global Non-periodic IN NAK bit + * |[7] |GOUTNakEff|Global OUT NAK Effective (GOUTNakEff)(Read only) + * | | |Indicates that the Set Global OUT NAK bit in the Device Control register (DCTL.SGOUTNak), Set by the application, has taken effect in the core + * | | |This bit can be cleared by writing the Clear Global OUT NAK bit in the Device Control register (DCTL.CGOUTNak). + * | | |Values: + * | | |0x0 (INACTIVE): Not Active + * | | |0x1 (ACTIVE): Global OUT NAK Effective + * |[10] |ErlySusp |Early Suspend (ErlySusp) + * | | |The controller sets this bit to indicate that an Idle state has been detected on the USB for 3 ms. + * | | |Values: + * | | |0x0 (INACTIVE): No Idle state detected + * | | |0x1 (ACTIVE): 3ms of Idle state detected + * |[11] |USBSusp |USB Suspend (USBSusp) + * | | |The controller sets this bit to indicate that a suspend was detected on the USB + * | | |The controller enters the Suspended state when there is no activity on the linestate signal for an extended period of time. + * | | |Values: + * | | |0x0 (INACTIVE): Not Active + * | | |0x1 (ACTIVE): USB Suspend + * |[12] |USBRst |USB Reset (USBRst) + * | | |The controller sets this bit to indicate that a reset is detected on the USB. + * | | |Values: + * | | |0x0 (INACTIVE): Not active + * | | |0x1 (ACTIVE): USB Reset + * |[13] |EnumDone |Enumeration Done (EnumDone) + * | | |The core sets this bit to indicate that speed enumeration is complete + * | | |The application must read the Device Status (DSTS) register to obtain the enumerated speed. + * | | |Values: + * | | |0x0 (INACTIVE): Not active + * | | |0x1 (ACTIVE): Enumeration Done + * |[14] |ISOOutDrop|Isochronous OUT Packet Dropped Interrupt (ISOOutDrop) + * | | |The controller sets this bit when it fails to write an isochronous OUT packet into the RxFIFO because the RxFIFO does not have enough space to accommodate a maximum packet size packet for the isochronous OUT endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): Not active + * | | |0x1 (ACTIVE): Isochronous OUT Packet Dropped Interrupt + * |[15] |EOPF |End of Periodic Frame Interrupt (EOPF) + * | | |Indicates that the period specified in the Periodic Frame Interval field of the Device Configuration register (DCFG.PerFrInt) has been reached in the current microframe + * | | |In case of Non-Ignore Frame Number Scatter/Gather (Descriptor DMA) mode, the controller internally handles the following scenarios based on EOPF: + * | | |Read Flush: At the EOPF, the controller checks if there are any pending packets in the FIFO corresponding to the current (micro)Frame. + * | | |If there are any pending packets, then the controller initiates read flush, due to which the read pointer is updated to the starting location of the next micro-frame packet. + * | | |If there are no pending packets corresponding to the current (micro)Frame, the controller does not take any action. + * | | |Write Flush: At the EOPF, if the controller is still fetching the current micro-frame data, then the controller stops pushing data into the TXFIFO but keeps fetching the complete packet from the System Memory + * | | |After completing the scheduled packet size fetch, the controller updates the Status Quadlet Fields (Transmit Status to BUFFLUSH) and closes the Descriptor + * | | |During the descriptor close, the controller initiates write flush, due to which the write pointer is updated to the starting location of the next micro-frame packet + * | | |Because the controller stops pushing the packet to the TxFIFO after EOPF, to bring the write pointer to the starting location of the next micro-frame, write flush is done. + * | | |Values: + * | | |0x0 (INACTIVE): Not active + * | | |0x1 (ACTIVE): End of Periodic Frame Interrupt + * |[18] |IEPInt |IN Endpoints Interrupt (IEPInt)(Read only) + * | | |The core sets this bit to indicate that an interrupt is pending on one of the IN endpoints of the core + * | | |The application must read the Device All Endpoints Interrupt (DAINT) register to determine the exact number of the IN endpoint on Device IN Endpoint-n Interrupt (DIEPINTn) register to determine the exact cause of the interrupt + * | | |The application must clear the appropriate status bit in the corresponding DIEPINTn register to clear this bit. + * | | |Values: + * | | |0x0 (INACTIVE): Not active + * | | |0x1 (ACTIVE): IN Endpoints Interrupt + * |[19] |OEPInt |OUT Endpoints Interrupt (OEPInt)(Read only) + * | | |The controller sets this bit to indicate that an interrupt is pending on one of the OUT endpoints of the core + * | | |The application must read the Device All Endpoints Interrupt (DAINT) register to determine the exact number of the OUT endpoint on which the interrupt occurred, and then read the corresponding Device OUT Endpoint-n Interrupt (DOEPINTn) register to determine the exact cause of the interrupt + * | | |The application must clear the appropriate status bit in the corresponding DOEPINTn register to clear this bit. + * | | |Values: + * | | |0x0 (INACTIVE): Not active + * | | |0x1 (ACTIVE): OUT Endpoints Interrupt + * |[22] |FetSusp |Data Fetch Suspended (FetSusp) + * | | |This interrupt indicates that the core has stopped fetching data + * | | |For IN endpoints due to the unavailability of TxFIFO space or Request Queue space + * | | |This interrupt is used by the application for an endpoint mismatch algorithm. + * | | |For example, after detecting an endpoint mismatch, the application: + * | | |Sets a Global non-periodic IN NAK handshake + * | | |Disables IN endpoints + * | | |Flushes the FIFO + * | | |Determines the token sequence from the IN Token Sequence Learning Queue + * | | |Re-enables the endpoints + * | | |Clears the Global non-periodic IN NAK handshake + * | | |If the Global non-periodic IN NAK is cleared, the core has not yet fetched data for the IN endpoint, and the IN token is received + * | | |The core generates an 'IN token received when FIFO empty' interrupt + * | | |It then sends the host a NAK response + * | | |To avoid this scenario, the application can check the GINTSTS.FetSusp interrupt, which ensures that the FIFO is full before clearing a Global NAK handshake. + * | | |Alternatively, the application can mask the IN token received when FIFO empty interrupt when clearing a Global IN NAK handshake. + * | | |Values: + * | | |0x0 (INACTIVE): Not active + * | | |0x1 (ACTIVE): Data Fetch Suspended + * |[23] |ResetDet |Reset detected Interrupt (ResetDet) + * | | |In Device mode, this interrupt is asserted when a reset is detected on the USB in partial power-down mode when the device is in Suspend. + * | | |Values: + * | | |0x0 (INACTIVE): Not active + * | | |0x1 (ACTIVE): Reset detected Interrupt + * |[27] |LPM_Int |LPM Transaction Received Interrupt + * | | |(LPM_Int) This interrupt is asserted when the device receives an LPM transaction and responds with a non-ERRORed response has completed LPM transactions for the programmed number of times (GLPMCFG.RetryCnt) + * | | |Values: + * | | |0x0 (INACTIVE): Not Active + * | | |0x1 (ACTIVE): LPM Transaction Received Interrupt + * |[31] |WkUpInt |Resume/Remote Wakeup Detected Interrupt (WkUpInt) + * | | |Wakeup Interrupt during Suspend(L2) or LPM(L1) state. + * | | |During Suspend(L2): + * | | |This interrupt is asserted only when Host Initiated Resume is detected on USB. + * | | |During LPM(L1): + * | | |This interrupt is asserted for either Host Initiated Resume or Device Initiated Remote Wakeup on USB. + * | | |Values: + * | | |0x0 (INACTIVE): Not active + * | | |0x1 (ACTIVE): Resume or Remote Wakeup Detected Interrupt + * @var HSUSBD_T::GINTMSK + * Offset: 0x18 Interrupt Mask Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2] |OTGIntMsk |OTG Interrupt Mask (OTGIntMsk) + * | | |Values: + * | | |0x0 (MASK): OTG Interrupt Mask + * | | |0x1 (NOMASK): No OTG Interrupt Mask + * |[3] |SofMsk |Start of (micro) Frame Mask (SofMsk) + * | | |Values: + * | | |0x0 (MASK): Start of Frame Mask + * | | |0x1 (NOMASK): No Start of Frame Mask + * |[4] |RxFLvlMsk |Receive FIFO Non-Empty Mask (RxFLvlMsk) + * | | |Values: + * | | |0x0 (MASK): Receive FIFO Non-Empty Mask + * | | |0x1 (NOMASK): No Receive FIFO Non-Empty Mask + * |[6] |GINNakEffMsk|Global Non-periodic IN NAK Effective Mask (GINNakEffMsk) + * | | |Values: + * | | |0x0 (MASK): Global Non-periodic IN NAK Effective Mask + * | | |0x1 (NOMASK): No Global Non-periodic IN NAK Effective Mask + * |[7] |GOUTNakEffMsk|Global OUT NAK Effective Mask (GOUTNakEffMsk) + * | | |Values: + * | | |0x0 (MASK): Global OUT NAK Effective Mask + * | | |0x1 (NOMASK): No Global OUT NAK Effective Mask + * |[10] |ErlySuspMsk|Early Suspend Mask (ErlySuspMsk) + * | | |Values: + * | | |0x0 (MASK): Early Suspend Mask + * | | |0x1 (NOMASK): No Early Suspend Mask + * |[11] |USBSuspMsk|USB Suspend Mask (USBSuspMsk) + * | | |Values: + * | | |0x0 (MASK): USB Suspend Mask + * | | |0x1 (NOMASK): No USB Suspend Mask + * |[12] |USBRstMsk |USB Reset Mask (USBRstMsk) + * | | |Values: + * | | |0x0 (MASK): USB Reset Mask + * | | |0x1 (NOMASK): No USB Reset Mask + * |[13] |EnumDoneMsk|Enumeration Done Mask (EnumDoneMsk) + * | | |Values: + * | | |0x0 (MASK): Enumeration Done Mask + * | | |0x1 (NOMASK): No Enumeration Done Mask + * |[14] |ISOOutDropMsk|Isochronous OUT Packet Dropped Interrupt Mask (ISOOutDropMsk) + * | | |Values: + * | | |0x0 (MASK): Isochronous OUT Packet Dropped Interrupt Mask + * | | |0x1 (NOMASK): No Isochronous OUT Packet Dropped Interrupt Mask + * |[15] |EOPFMsk |End of Periodic Frame Interrupt Mask (EOPFMsk) + * | | |Values: + * | | |0x0 (MASK): End of Periodic Frame Interrupt Mask + * | | |0x1 (NOMASK): No End of Periodic Frame Interrupt Mask + * |[17] |EPMisMsk |Endpoint Mismatch Interrupt Mask (EPMisMsk) + * | | |Values: + * | | |0x0 (MASK): Endpoint Mismatch Interrupt Mask + * | | |0x1 (NOMASK): No Endpoint Mismatch Interrupt Mask + * |[18] |IEPIntMsk |IN Endpoints Interrupt Mask (IEPIntMsk) + * | | |Values: + * | | |0x0 (MASK): IN Endpoints Interrupt Mask + * | | |0x1 (NOMASK): No IN Endpoints Interrupt Mask + * |[19] |OEPIntMsk |OUT Endpoints Interrupt Mask (OEPIntMsk) + * | | |Values: + * | | |0x0 (MASK): OUT Endpoints Interrupt Mask + * | | |0x1 (NOMASK): No OUT Endpoints Interrupt Mask + * |[22] |FetSuspMsk|Data Fetch Suspended Mask (FetSuspMsk) + * | | |Values: + * | | |0x0 (MASK): Data Fetch Suspended Mask + * | | |0x1 (NOMASK): No Data Fetch Suspended Mask + * |[23] |ResetDetMsk|Reset detected Interrupt Mask (ResetDetMsk) + * | | |Values: + * | | |0x0 (MASK): Reset detected Interrupt Mask + * | | |0x1 (NOMASK): No Reset detected Interrupt Mask + * |[27] |LPM_IntMsk|LPM Transaction Received Interrupt (LPM_Int) + * | | |LPM Transaction received interrupt Mask + * | | |Values: + * | | |0x0 (MASK): LPM Transaction received interrupt Mask + * | | |0x1 (NOMASK): No LPM Transaction received interrupt Mask + * |[31] |WkUpIntMsk|Resume/Remote Wakeup Detected Interrupt Mask (WkUpIntMsk) + * | | |The WakeUp bit is used for LPM state wake up in a way similar to that of wake up in suspend state. + * | | |Values: + * | | |0x0 (MASK): Resume or Remote Wakeup Detected Interrupt Mask + * | | |0x1 (NOMASK): Unmask Resume Remote Wakeup Detected Interrupt + * @var HSUSBD_T::GRXSTSR + * Offset: 0x1C Receive Status Debug Read Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |EPNum |Endpoint Number (EPNum) + * | | |Indicates the endpoint number to which the current received packet belongs. + * |[14:4] |BCnt |Byte Count (BCnt) + * | | |indicates the byte count of the received data packet. + * |[16:15] |DPID |Data PID + * | | |I (DPID) indicates the Data PID of the received OUT data packet + * | | |2'b00: DATA0 + * | | |2'b10: DATA1 + * | | |2'b01: DATA2 + * | | |2'b11: MDATA + * | | |Reset: 2'h0 + * | | |Values: + * | | |0x0 (DATA0): DATA0 + * | | |0x2 (DATA1): DATA1 + * | | |0x1 (DATA2): DATA2 + * | | |0x3 (MDATA): MDATA + * |[20:17] |PktSts |Packet Status + * | | |I(PktSts) indicates the status of the received packet + * | | |4'b0001: Global OUT NAK (triggers an interrupt) + * | | |4'b0010: OUT data packet received + * | | |4'b0011: OUT transfer completed (triggers an interrupt) + * | | |4'b0100: SETUP transaction completed (triggers an interrupt) + * | | |4'b0110: SETUP data packet received + * | | |Others: Reserved + * | | |Reset:4'h0 + * | | |Values: + * | | |0x1 (OUTNAK): Global OUT NAK (triggers an interrupt) + * | | |0x2 (INOUTDPRX): OUT data packet received + * | | |0x3 (INOUTTRCOM): IN or OUT transfer completed (triggers an interrupt) + * | | |0x4 (DSETUPCOM): SETUP transaction completed (triggers an interrupt) + * | | |0x6 (DSETUPRX): SETUP data packet received + * |[24:21] |FN |Frame Number + * | | |(FN) + * | | |This is the least significant 4 bits of the (micro)Frame number in which the packet is received on the USB + * | | |This field is supported only when isochronous OUT endpoints are supported. + * @var HSUSBD_T::GRXSTSP + * Offset: 0x20 Receive Status Read/Pop Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |EPNum |Endpoint Number (EPNum) + * | | |Indicates the endpoint number to which the current received packet belongs. + * | | |Values: + * | | |0x0 (CHEP0): Channel or EndPoint 0 + * | | |0x1 (CHEP1): Channel or EndPoint 1 + * | | |0x2 (CHEP2): Channel or EndPoint 2 + * | | |0x3 (CHEP3): Channel or EndPoint 3 + * | | |0x4 (CHEP4): Channel or EndPoint 4 + * | | |0x5 (CHEP5): Channel or EndPoint 5 + * | | |0x6 (CHEP6): Channel or EndPoint 6 + * | | |0x7 (CHEP7): Channel or EndPoint 7 + * | | |0x8 (CHEP8): Channel or EndPoint 8 + * |[14:4] |BCnt |Byte Count + * | | |(BCnt) + * | | |indicates the byte count of the received data packet. + * |[16:15] |DPID |Data PID (DPID) + * | | |iIndicates the Data PID of the received OUT data packet + * | | |2'b00: DATA0 + * | | |2'b10: DATA1 + * | | |2'b01: DATA2 + * | | |2'b11: MDATA + * | | |Reset: 2'h0 + * | | |Values: + * | | |0x0 (DATA0): DATA0 + * | | |0x2 (DATA1): DATA1 + * | | |0x1 (DATA2): DATA2 + * | | |0x3 (MDATA): MDATA + * |[20:17] |PktSts |Packet Status (PktSts) + * | | |iIndicates the status of the received packet + * | | |4'b0001: Global OUT NAK (triggers an interrupt) + * | | |4'b0010: OUT data packet received + * | | |4'b0011: OUT transfer completed (triggers an interrupt) + * | | |4'b0100: SETUP transaction completed (triggers an interrupt) + * | | |4'b0110: SETUP data packet received + * | | |Others: Reserved + * | | |Reset:4'h0 + * | | |Values: + * | | |0x1 (OUTNAK): Global OUT NAK (triggers an interrupt) + * | | |0x2 (INOUTDPRX): OUT data packet received + * | | |0x3 (INOUTTRCOM): IN or OUT transfer completed (triggers an interrupt) + * | | |0x4 (DSETUPCOM): SETUP transaction completed (triggers an interrupt) + * |[24:21] |FN |Frame Number (FN) + * | | |This is the least significant 4 bits of the (micro)Frame number in which the packet is received on the USB + * | | |This field is supported only when isochronous OUT endpoints are supported. + * @var HSUSBD_T::GRXFSIZ + * Offset: 0x24 Receive FIFO Size Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |RxFDep |RxFIFO Depth (RxFDep) + * | | |This value is in terms of 32-bit words. + * | | |Minimum value is 16 + * | | |Maximum value is 32,768 + * | | |The power-on reset value of this register is specified as the Largest Rx Data FIFO Depth. + * | | |You can write a new value in this field. Programmed values must not exceed the power-on value. + * @var HSUSBD_T::GNPTXFSIZ + * Offset: 0x28 Non-periodic Transmit FIFO Size Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |INEPTxF0StAddr|IN Endpoint FIFO0 Transmit RAM Start Address(INEPTxF0StAddr) + * | | |This field contains the memory start address for IN Endpoint Transmit FIFO# 0. + * | | |Programmed values must not exceed the power-on value. + * |[21:16] |INEPTxF0Dep|IN Endpoint TxFIFO 0 Depth (INEPTxF0Dep) + * | | |This value is in terms of 32-bit words. + * | | |Minimum value is 16 + * | | |Maximum value is 32,768 + * | | |The application can write a new value in this field + * | | |The power-on reset value of this field is specified as Largest IN Endpoint FIFO 0 Depth. + * @var HSUSBD_T::GLPMCFG + * Offset: 0x54 LPM Config Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |LPMCap |LPM-Capable (LPMCap) + * | | |The application uses this bit to control the controller LPM capabilities + * | | |If the core operates as a non-LPM-capable device, it cannot respond to any LPM transactions + * | | |If GLPMCFG.LPMCap is 1'b0, the software must not set any of the remaining fields in the GLPMCFG register and these fields should hold their Reset values. + * | | |1'b0: LPM capability is not enabled. + * | | |1'b1: LPM capability is enabled. + * | | |Values: + * | | |0x0 (DISABLED): LPM capability is not enabled + * | | |0x1 (ENABLED): LPM capability is enabled + * |[1] |AppL1Res |LPM response programmed by application (AppL1Res) + * | | |Handshake response to LPM token pre-programmed by device application software + * | | |The response depends on GLPMCFG.LPMCap + * | | |If GLPMCFG.LPMCap is 1'b0, the core operates as a non-LPM-capable Device and does not respond to any LPM transactions + * | | |If GLPMCFG.LPMCap is 1'b1, the core responds as follows: + * | | |1: ACK + * | | |Even though an ACK is pre-programmed, the core responds with an ACK only on a successful LPM transaction + * | | |The LPM transaction is successful if: + * | | |There are no PID/CRC5 errors in both the EXT token and the LPM token (else ERROR) + * | | |A valid bLinkState = 0001B (L1) is received in the LPM transaction (else STALL). + * | | |No data is pending in the Transmit queue (else NYET) + * | | |0: NYET + * | | |The pre-programmed software bit is overridden for response to LPM token when: + * | | |The received bLinkState is not L1 (STALL response) + * | | |An error is detected in either of the LPM token packets due to corruption (ERROR response). + * | | |Values: + * | | |0x0 (NYET_RESP): The core responds with a NYET when an error is detected in either of the LPM token packets due to corruption + * | | |0x1 (ACK_RESP): The core responds with an ACK only on a successful LPM transaction + * |[5:2] |HIRD |Host-Initiated Resume Duration (HIRD) (Read only) + * | | |EnBESL = 1'b0. + * | | |Host Initiated Resume Duration + * | | |This field is read only and is updated with the Received LPM Token HIRD bmAttribute when an ACK/NYET/STALL response is sent to an LPM transaction + * | | |If HIRD[3:0], + * | | |4'b0000, THIRD(us) = 50. + * | | |4'b0001, THIRD(us) = 125. + * | | |4'b0010, THIRD(us) = 200. + * | | |4'b0011, THIRD(us) = 275. + * | | |4'b0100, THIRD(us) = 350. + * | | |4'b0101, THIRD(us) = 425. + * | | |4'b0110, THIRD(us) = 500. + * | | |4'b0111, THIRD(us) = 575. + * | | |4'b1000, THIRD(us) = 650. + * | | |4'b1001, THIRD(us) = 725. + * | | |4'b1010, THIRD(us) = 800. + * | | |4'b1011, THIRD(us) = 875. + * | | |4'b1100, THIRD(us) = 950. + * | | |4'b1101, THIRD(us) = 1025. + * | | |4'b1110, THIRD(us) = 1100. + * | | |4'b1111, THIRD(us) = 1175. + * | | |EnBESL = 1'b1. + * | | |Best Effort Service Latency (BESL) + * | | |This field is updated with the Received LPM Token BESL bmAttribute when an ACK/NYET/STALL response is sent to an LPM transaction + * | | |If BESL[3:0], + * | | |4'b0000, TBESL(us) = 125. + * | | |4'b0001, TBESL(us) = 150. + * | | |4'b0010, TBESL(us) = 200. + * | | |4'b0011, TBESL(us) = 300. + * | | |4'b0100, TBESL(us) = 400. + * | | |4'b0101, TBESL(us) = 500. + * | | |4'b0110, TBESL(us) = 1000. + * | | |4'b0111, TBESL(us) = 2000. + * | | |4'b1000, TBESL(us) = 3000. + * | | |4'b1001, TBESL(us) = 4000. + * | | |4'b1010, TBESL(us) = 5000. + * | | |4'b1011, TBESL(us) = 6000. + * | | |4'b1100, TBESL(us) = 7000. + * | | |4'b1101, TBESL(us) = 8000. + * | | |4'b1110, TBESL(us) = 9000. + * | | |4'b1111, TBESL(us) = 10000. + * |[6] |bRemoteWake|RemoteWakeEnable (bRemoteWake)(Read only) + * | | |This field is read only + * | | |It is updated with the Received LPM Token bRemoteWake bmAttribute when an ACK/NYET/STALL response is sent to an LPM transaction. + * | | |Values: + * | | |0x0 (DISABLED): Remote Wakeup is disabled + * | | |0x1 (ENABLED): In device mode, this field takes the value of remote wake up + * |[7] |EnblSlpM |Enable utmi_sleep_n (EnblSlpM) + * | | |The application uses this bit to control utmi_sleep_n assertion to the PHY in the L1 state. + * | | |1'b0: utmi_sleep_n assertion from the core is not transferred to the external PHY. + * | | |1'b1: utmi_sleep_n assertion from the core is transferred to the external PHY when utmi_l1_suspend_n cannot be asserted. + * | | |Values: + * | | |0x0 (DISABLED): utmi_sleep_n assertion from the core is not transferred to the external PHY + * | | |0x1 (ENABLED): utmi_sleep_n assertion from the core is transferred to the external PHY when utmi_l1_suspend_n cannot be asserted + * |[12:8] |HIRD_Thres|BESL/HIRD Threshold (HIRD_Thres) + * | | |EnBESL = 1'b0: The core puts the PHY into deep low power mode in L1 (by core asserting L1SuspendM) when HIRD value is greater than or equal to the value defined in this field HIRD_Thres[3:0] and HIRD_Thres[4] is set to 1b1. + * | | |EnBESL = 1'b1: The core puts the PHY into deep low power mode in L1 (by core asserting L1SuspendM) when BESL value is greater than or equal to the value defined in this field BESL_Thres[3:0] and BESL_Thres [4] is set to 1'b1. + * | | |DCTL.DeepSleepBESLReject = 1'b1: In device initiated resume, the core expects the Host to resume service to the device within the BESL value corresponding to L1 exit time specified in HIRD_Thres[3:0] + * | | |The Device sends a NYET response when the received HIRD in LPM token is greater than HIRD threshold + * |[14:13] |CoreL1Res |LPM Response (CoreL1Res) (Read only) + * | | |The response of the core to LPM transaction received is reflected in these two bits. + * | | |Values: + * | | |0x0 (LPMRESP1): ERROR : No handshake response + * | | |0x1 (LPMRESP2): STALL response + * | | |0x2 (LPMRESP3): NYET response + * | | |0x3 (LPMRESP4): ACK response + * |[15] |SlpSts |Port Sleep Status (SlpSts) (Read only) + * | | |This bit is set as long as a Sleep condition is present on the USB bus. + * | | |The core enters the Sleep state when an ACK response is sent to an LPM transaction and the TL1TokenRetry timer has expired + * | | |To stop the PHY clock, the application must set the Port Clock Stop bit, which asserts the PHY Suspend input signal + * | | |The application must rely on SlpSts and not ACK in CoreL1Res to confirm transition into sleep. + * | | |The core comes out of sleep: + * | | |When there is any activity on the USB line_state + * | | |When the application writes to the Remote Wakeup Signaling bit in the Device Control register (DCTL.RmtWkUpSig) or when the application resets or soft-disconnects the device. + * | | |Values: + * | | |0x0 (CORE_NOT_IN_L1): In Device mode, this bit indicates core is not in L1 + * | | |0x1 (CORE_IN_L1): In Device mode, the core enters the Sleep state when an ACK response is sent to an LPM transaction + * |[16] |L1ResumeOK|Sleep State Resume OK (L1ResumeOK)(Read only) + * | | |Indicates that the application or host can start resume from Sleep state + * | | |This bit is valid in LPM sleep (L1) state + * | | |It is set in sleep mode after a delay of 50 micro sec (TL1Residency) + * | | |The bit is reset when SlpSts is 0. + * | | |1'b0: The application/core cannot start resume from Sleep state. + * | | |1'b1: The application/core can start resume from Sleep state. + * | | |Values: + * | | |0x0 (NOTOK): The application/core cannot start Resume from Sleep state + * | | |0x1 (OK): The application/core can start Resume from Sleep state + * |[23:20] |LPM_Accept_Ctrl|Device Mode: LPM Accept Control (LPM_Accept_Ctrl) + * | | |LPM_Accept_Ctrl[0]: The application can use this bit to accept an LPM token even if data is present in the Interrupt endpoint TxFIFO. + * | | |1'b0: Reject (NYET) LPM token when data is present in the TxFIFO for Interrupt endpoints. + * | | |1'b1: Accept(ACK) LPM token when data is present in the TxFIFO for Interrupt endpoints. + * | | |Note: This bit is applicable only for Dedicated TxFIFO configurations (OTG_EN_DED_TX_FIFO=1). + * | | |LPM_Accept_Ctrl[1]: The application can use this bit to reject an LPM token (NYET) between multiple stages of a single control transfer. + * | | |1'b0: Accept(ACK) LPM token during Setup, Data, and Status stage of a control transfer. + * | | |1'b1: Reject(NYET) LPM token during Setup, Data, and Status stage of a control transfer. + * | | |LPM_Accept_Ctrl[2]: The application can use this bit to accept an LPM token even if data is present in the ISOC endpoint TxFIFO. + * | | |1'b0: Reject (NYET) LPM token when data is present in the TxFIFO for ISOC endpoints. + * | | |1'b1: Accept(ACK) LPM token when data is present in the TxFIFO for ISOC endpoints. + * | | |Note: This bit is applicable only for Dedicated TxFIFO configurations (OTG_EN_DED_TX_FIFO=1). + * | | |LPM_Accept_Ctrl[3]: The application can use this bit to accept an LPM token even if data is present in the BULK endpoint TxFIFO. + * | | |1'b0: Reject (NYET) LPM token, when data is present in the TxFIFO for Bulk endpoints. + * | | |1'b1: Accept(ACK) LPM token, when data is present in the TxFIFO for Bulk endpoints. + * | | |Note: This bit is applicable only for Dedicated TxFIFO configurations (OTG_EN_DED_TX_FIFO=1). + * |[28] |LPM_EnBESL|LPM Enable BESL (LPM_EnBESL) + * | | |This bit enables the BESL feature as defined in LPM Errata + * | | |1'b0: The core works as per USB 2.0 Link Power Management Addendum Engineering Change Notice to the USB 2.0 specification as of July 16, 2007 + * | | |1'b1: The core works as per the LPM Errata + * | | |Values: + * | | |0x0 (DISABLED): BESL is disabled + * | | |0x1 (ENABLED): BESL is enabled as defined in LPM Errata + * @var HSUSBD_T::GDFIFOCFG + * Offset: 0x5C Global DFIFO Configuration Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |GDFIFOCfg |GDFIFOCfg + * | | |This field is for dynamic programming of the DFIFO Size + * | | |This value takes effect only when the application programs a non zero value to this register + * | | |The value programmed must conform to the guidelines described in 'FIFO RAM Allocation' + * | | |The core does not have any corrective logic if the FIFO sizes are programmed incorrectly. + * | | |Value After Reset: 0xc00 + * |[31:16] |EPInfoBaseAddr|EPInfoBaseAddr + * | | |This field provides the start address of the EP info controller. + * | | |Value After Reset: 0xbb8 + * @var HSUSBD_T::GREFCLK + * Offset: 0x64 ref_clk Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |SOF_CNT_WKUP_ALERT|This bit indicates the number of SOF's after which the controller should generate an interrupt if the device had been in L1 state until that period + * | | |The interrupt is used by software to initiate remote wakeup in the controller in order to sync to the uF number in the host + * |[14] |RefclkMode|This bit is used to enable or disable ref_clk mode of operation + * | | |Note: + * | | |The default value of this field is 'd0. + * | | |When this field is disabled, DCTL.ServInt cannot be set to 1. + * | | |Values: + * | | |0x1 (ENABLE): Controller uses ref_clk to run internal micro-frame timers + * | | |0x0 (DISABLE): Controller uses phy_clk to run internal micro-frame timers + * |[31:15] |REFCLKPER |This bit indicates the period of ref_clk in terms of pico seconds + * | | |Note: + * | | |The default value of this field is 'd0. + * | | |The period of ref_clk should be an integer multiple of 125us. + * | | |The minimum frequency supported is 12 MHz. + * | | |Other supported frequencies are 16, 17, 19.2, 20, 24, 30, and 40 MHz. + * @var HSUSBD_T::GINTMSK2 + * Offset: 0x68 Interrupt Mask Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WkUpAlertIntMsk|Mode: Device + * | | |Remote WakeUp Alert Interrupt Mask + * | | |This interrupt is used to alert the application to initiate Remote WakeUp sequence. + * | | |Values: + * | | |0x0 (MASK): Mask Remote WakeUp Alert Interrupt + * | | |0x1 (NOMASK): Unmask Remote WakeUp Alert Interrupt + * @var HSUSBD_T::GINTSTS2 + * Offset: 0x6C Interrupt Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WkUpAlertInt|Mode: Device + * | | |Remote WakeUp Alert Interrupt Mask + * | | |This interrupt is used to alert the application to initiate Remote WakeUp sequence. + * | | |Values: + * | | |• 0x0 (INACTIVE): Not Active + * | | |• 0x1 (ACTIVE): Remote WakeUp Alert Interrupt detected + * @var HSUSBD_T::DIEPTXF1 + * Offset: 0x104 Device IN Endpoint Transmit FIFO Size Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |INEPnTxFStAddr|IN Endpoint FIFOn Transmit RAM Start Address (INEPnTxFStAddr) + * | | |This field contains the memory start address for IN endpoint Transmit FIFO + * | | |The power-on reset value of this register is specified as the Largest Rx Data FIFO Depth + * |[24:16] |INEPnTxFDep|IN Endpoint TxFIFO Depth (INEPnTxFDep) + * | | |This value is in terms of 32-bit words. + * | | |Minimum value is 16 + * | | |Maximum value is 32,768 + * | | |The power-on reset value of this register is specified as the Largest IN Endpoint FIFO number Depth. + * | | |Programmed values must not exceed the power-on value. + * @var HSUSBD_T::DIEPTXF2 + * Offset: 0x108 Device IN Endpoint Transmit FIFO Size Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |INEPnTxFStAddr|IN Endpoint FIFOn Transmit RAM Start Address (INEPnTxFStAddr) + * | | |This field contains the memory start address for IN endpoint Transmit FIFO + * | | |The power-on reset value of this register is specified as the Largest Rx Data FIFO Depth + * |[24:16] |INEPnTxFDep|IN Endpoint TxFIFO Depth (INEPnTxFDep) + * | | |This value is in terms of 32-bit words. + * | | |Minimum value is 16 + * | | |Maximum value is 32,768 + * | | |The power-on reset value of this register is specified as the Largest IN Endpoint FIFO number Depth. + * | | |Programmed values must not exceed the power-on value. + * @var HSUSBD_T::DIEPTXF3 + * Offset: 0x10C Device IN Endpoint Transmit FIFO Size Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |INEPnTxFStAddr|IN Endpoint FIFOn Transmit RAM Start Address (INEPnTxFStAddr) + * | | |This field contains the memory start address for IN endpoint Transmit FIFO + * | | |The power-on reset value of this register is specified as the Largest Rx Data FIFO Depth. + * | | |Value After Reset: 0x320 + * |[15:10] |_ |Reserved. + * |[24:16] |INEPnTxFDep|IN Endpoint TxFIFO Depth (INEPnTxFDep) + * | | |This value is in terms of 32-bit words. + * | | |Minimum value is 16 + * | | |Maximum value is 32,768 + * | | |The power-on reset value of this register is specified as the Largest IN Endpoint FIFO number Depth. + * | | |Programmed values must not exceed the power-on value. + * @var HSUSBD_T::DIEPTXF4 + * Offset: 0x110 Device IN Endpoint Transmit FIFO Size Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |INEPnTxFStAddr|IN Endpoint FIFOn Transmit RAM Start Address (INEPnTxFStAddr) + * | | |This field contains the memory start address for IN endpoint Transmit FIFO + * | | |The power-on reset value of this register is specified as the Largest Rx Data FIFO Depth + * |[24:16] |INEPnTxFDep|IN Endpoint TxFIFO Depth (INEPnTxFDep) + * | | |This value is in terms of 32-bit words. + * | | |Minimum value is 16 + * | | |Maximum value is 32,768 + * | | |The power-on reset value of this register is specified as the Largest IN Endpoint FIFO number Depth. + * | | |Programmed values must not exceed the power-on value + * @var HSUSBD_T::DIEPTXF5 + * Offset: 0x114 Device IN Endpoint Transmit FIFO Size Register 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |INEPnTxFStAddr|IN Endpoint FIFOn Transmit RAM Start Address (INEPnTxFStAddr) + * | | |This field contains the memory start address for IN endpoint Transmit FIFO + * | | |The power-on reset value of this register is specified as the Largest Rx Data FIFO Depth + * |[24:16] |INEPnTxFDep|IN Endpoint TxFIFO Depth (INEPnTxFDep) + * | | |This value is in terms of 32-bit words. + * | | |Minimum value is 16 + * | | |Maximum value is 32,768 + * | | |The power-on reset value of this register is specified as the Largest IN Endpoint FIFO number Depth. + * | | |Programmed values must not exceed the power-on value. + * @var HSUSBD_T::DIEPTXF6 + * Offset: 0x118 Device IN Endpoint Transmit FIFO Size Register 6 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |INEPnTxFStAddr|IN Endpoint FIFOn Transmit RAM Start Address (INEPnTxFStAddr) + * | | |This field contains the memory start address for IN endpoint Transmit FIFO + * | | |The power-on reset value of this register is specified as the Largest Rx Data FIFO Depth + * |[24:16] |INEPnTxFDep|IN Endpoint TxFIFO Depth (INEPnTxFDep) + * | | |This value is in terms of 32-bit words. + * | | |Minimum value is 16 + * | | |Maximum value is 32,768 + * | | |The power-on reset value of this register is specified as the Largest IN Endpoint FIFO number Depth. + * | | |Programmed values must not exceed the power-on value. + * @var HSUSBD_T::DIEPTXF7 + * Offset: 0x11C Device IN Endpoint Transmit FIFO Size Register 7 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |INEPnTxFStAddr|IN Endpoint FIFOn Transmit RAM Start Address (INEPnTxFStAddr) + * | | |This field contains the memory start address for IN endpoint Transmit FIFO + * | | |The power-on reset value of this register is specified as the Largest Rx Data FIFO Depth + * |[24:16] |INEPnTxFDep|IN Endpoint TxFIFO Depth (INEPnTxFDep) + * | | |This value is in terms of 32-bit words. + * | | |Minimum value is 16 + * | | |Maximum value is 32,768 + * | | |The power-on reset value of this register is specified as the Largest IN Endpoint FIFO number Depth. + * | | |Programmed values must not exceed the power-on value. + * @var HSUSBD_T::DIEPTXF8 + * Offset: 0x120 Device IN Endpoint Transmit FIFO Size Register 8 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |INEPnTxFStAddr|IN Endpoint FIFOn Transmit RAM Start Address (INEPnTxFStAddr) + * | | |This field contains the memory start address for IN endpoint Transmit FIFO + * | | |The power-on reset value of this register is specified as the Largest Rx Data FIFO Depth + * |[24:16] |INEPnTxFDep|IN Endpoint TxFIFO Depth (INEPnTxFDep) + * | | |This value is in terms of 32-bit words. + * | | |Minimum value is 16 + * | | |Maximum value is 32,768 + * | | |The power-on reset value of this register is specified as the Largest IN Endpoint FIFO number Depth. + * | | |Programmed values must not exceed the power-on value. + * @var HSUSBD_T::DCFG + * Offset: 0x800 Device Configuration Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |DevSpd |Device Speed (DevSpd) + * | | |Indicates the speed at which the application requires the core to enumerate, or the maximum speed the application can support + * | | |However, the actual bus speed is determined only after the connect sequence is completed, and is based on the speed of the USB host to which the core is connected. + * | | |Values: + * | | |0x0 (USBHS20): High speed USB 2.0 + * | | |0x1 (USBFS20): Full speed USB 2.0 + * | | |0x2 (Reserved0): Reserved + * | | |0x3 (Reserved1): Reserved + * |[2] |NZStsOUTHShk|Non-Zero-Length Status OUT Handshake (NZStsOUTHShk) + * | | |The application can use this field to select the handshake the core sends on receiving a nonzero-length data packet during the OUT transaction of a control transfer's Status stage. + * | | |1'b1: Send a STALL handshake on a nonzero-length status OUT transaction and do not send the received OUT packet to the application. + * | | |1'b0: Send the received OUT packet to the application (zerolength or nonzero-length) and send a handshake based on the NAK and STALL bits for the endpoint in the Device Endpoint Control register. + * | | |Values: + * | | |0x0 (SENDOUT): + * | | |Send the received OUT packet to the application (zero-length or non-zero length) and send a handshake based on NAK and STALL bits for the endpoint in the Devce Endpoint Control Register + * | | |0x1 (SENDSTALL): + * | | |Send a STALL handshake on a nonzero-length status OUT transaction and do not send the received OUT packet to the application + * |[10:4] |DevAddr |Device Address (DevAddr) + * | | |The application must program this field after every SetAddress control command. + * |[12:11] |PerFrInt |Periodic Frame Interval (PerFrInt) + * | | |Indicates the time within a (micro)Frame at which the application must be notified using the End Of Periodic Frame Interrupt + * | | |This can be used to determine If all the isochronous traffic for that (micro)Frame is complete. + * | | |2'b00: 80% of the (micro)Frame interval + * | | |2'b01: 85% of the (micro)Frame interval + * | | |2'b10: 90% of the (micro)Frame interval + * | | |2'b11: 95% of the (micro)Frame interval + * | | |Values: + * | | |0x0 (EOPF80): 80% of the (micro)Frame interval + * | | |0x1 (EOPF85): 85% of the (micro)Frame interval + * | | |0x2 (EOPF90): 90% of the (micro)Frame interval + * | | |0x3 (EOPF95): 95% of the (micro)Frame interval + * |[13] |EnDevOutNak|Enable Device OUT NAK (EnDevOutNak) + * | | |This bit enables setting NAK for Bulk OUT endpoints after the transfer is completed for Device mode Descriptor DMA + * | | |1'b0 : The core does not set NAK after Bulk OUT transfer complete + * | | |1'b1 : The core sets NAK after Bulk OUT transfer complete + * | | |This bit is one time programmable after reset like any other DCFG register bits. + * | | |Values: + * | | |0x0 (DISABLED): + * | | |The core does not set NAK after Bulk OUT transfer complete + * | | |0x1 (ENABLED): The core sets NAK after Bulk OUT transfer complete + * |[14] |XCVRDLY |XCVRDLY + * | | |Enables or disables delay between xcvr_sel and txvalid during device chirp + * | | |Values: + * | | |0x0 (DISABLE): No delay between xcvr_sel and txvalid during Device chirp + * | | |0x1 (ENABLE): Enable delay between xcvr_sel and txvalid during Device chirp + * |[15] |ErraticIntMsk|Erratic Error Interrupt Mask + * | | |Values: + * | | |0x0 (NOMASK): Early suspend interrupt is generated on erratic error + * | | |0x1 (MASK): Mask early suspend interrupt on erratic error + * |[17] |ipgisocSupt|Worst-Case Inter-Packet Gap ISOC OUT Support (ipgisocSupt) + * | | |This bit indicates that the controller supports the worst-case scenario of Rx followed by Rx Inter Packet Gap (IPG) (32 bit times) as per the UTMI Specification for any token following an ISOC OUT token + * | | |Without this support, when any token follows an ISOC OUT token with the worst-case IPG, the controller will not detect the followed token + * | | |The worst-case IPG of the controller without this support depends on the AHB and PHY Clock frequency. + * | | |Values: + * | | |0x0 (DISABLED): Worst-Case Inter-Packet Gap ISOC OUT Support is disabled + * | | |0x1 (ENABLED): Worst-Case Inter-Packet Gap ISOC OUT Support is enabled + * |[23] |DescDMA |Enable Scatter/gather DMA in device mode (DescDMA) + * | | |The application can Set this bit during initialization to enable the Scatter/Gather DMA operation. + * | | |Note: This bit must be modified only once after a reset + * | | |The following combinations are available for programming: + * | | |GAHBCFG.DMAEn=0,DCFG.DescDMA=0 => Invalid. + * | | |GAHBCFG.DMAEn=0,DCFG.DescDMA=1 => Invalid. + * | | |GAHBCFG.DMAEn=1,DCFG.DescDMA=0 => Invalid. + * | | |GAHBCFG.DMAEn=1,DCFG.DescDMA=1 => Scatter/Gather DMA mode. + * | | |Values: + * | | |0x0 (DISABLED): Disable Scatter/Gather DMA + * | | |0x1 (ENABLED): Enable Scatter/Gather DMA + * |[25:24] |PerSchIntvl|Periodic Scheduling Interval (PerSchIntvl) + * | | |PerSchIntvl must be programmed for Scatter/Gather DMA mode. + * | | |This field specifies the amount of time the Internal DMA engine must allocate for fetching periodic IN endpoint data + * | | |Based on the number of periodic endpoints, this value must be specified as 25,50 or 75% of (micro)Frame. + * | | |When any periodic endpoints are active, the internal DMA engine allocates the specified amount of time in fetching periodic IN endpoint data . + * | | |When no periodic endpoints are active, Then the internal DMA engine services non-periodic endpoints, ignoring this field. + * | | |After the specified time within a (micro)Frame, the DMA switches to fetching for non-periodic endpoints. + * | | |2'b00: 25% of (micro)Frame. + * | | |2'b01: 50% of (micro)Frame. + * | | |2'b10: 75% of (micro)Frame. + * | | |2'b11: Reserved. + * | | |Reset: 2'b00 + * | | |Values: + * | | |0x0 (MF25): 25% of (micro)Frame + * | | |0x1 (MF50): 50% of (micro)Frame + * | | |0x2 (MF75): 75% of (micro)Frame + * | | |0x3 (RESERVED): Reserved + * |[31:26] |ResValid |Resume Validation Period (ResValid) + * | | |This field is effective only when DCFG.Ena32 kHzSusp is set + * | | |It controls the resume period when the core resumes from suspend + * | | |The core counts for ResValid number of clock cycles to detect a valid resume when this bit is set + * @var HSUSBD_T::DCTL + * Offset: 0x804 Device Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RmtWkUpSig|Remote Wakeup Signaling (RmtWkUpSig) + * | | |When the application sets this bit, the core initiates remote signaling to wake up the USB host + * | | |The application must Set this bit to instruct the core to exit the Suspend state + * | | |As specified in the USB 2.0 specification, the application must clear this bit 1-15 ms after setting it. + * | | |If LPM is enabled and the core is in the L1 (Sleep) state, when the application sets this bit, the core initiates L1 remote signaling to wake up the USB host + * | | |The application must set this bit to instruct the core to exit the Sleep state + * | | |As specified in the LPM specification, the hardware automatically clears this bit 50 microseconds (TL1DevDrvResume) after being set by the application + * | | |The application must not set this bit when GLPMCFG bRemoteWake from the previous LPM transaction is zero. + * | | |Values: + * | | |0x0 (DISABLEDRMWKUP): Core does not send Remote Wakeup Signaling + * | | |0x1 (ENABLERMWKUP): Core sends Remote Wakeup Signaling + * |[1] |SftDiscon |Soft Disconnect (SftDiscon) + * | | |The application uses this bit to signal the controller to do a soft disconnect + * | | |As long as this bit is set, the host does not see that the device is connected, and the device does not receive signals on the USB + * | | |The core stays in the disconnected state until the application clears this bit. + * | | |1'b0: Normal operation + * | | |When this bit is cleared after a soft disconnect, the core drives the phy_opmode_o signal on the UTMI+ to 2'b00, which generates a device connect event to the USB host + * | | |When the device is reconnected, the USB host restarts device enumeration. + * | | |1'b1: The core drives the phy_opmode_o signal on the UTMI+ to 2'b01, which generates a device disconnect event to the USB host. + * | | |Note: + * | | |This bit can be also used for ULPI/FS Serial interfaces. + * | | |This bit is not impacted by a soft reset. + * | | |Values: + * | | |0x0 (NODISCONNECT): The core drives the phy_opmode_o signal on the UTMI+ to 2'b00, which generates a device connect event to the USB host + * | | |0x1 (DISCONNECT): The core drives the phy_opmode_o signal on the UTMI+ to 2'b01, which generates a device disconnect event to the USB host + * |[2] |GNPINNakSts|Global Non-periodic IN NAK Status (GNPINNakSts) (Read only) + * | | |1'b0: A handshake is sent out based on the data availability in the transmit FIFO. + * | | |1'b1: A NAK handshake is sent out on all non-periodic IN endpoints, irrespective of the data availability in the transmit FIFO. + * | | |Values: + * | | |0x0 (INACTIVE): A handshake is sent out based on the data availability in the transmit FIFO + * | | |0x1 (ACTIVE): A NAK handshake is sent out on all non-periodic IN endpoints, irrespective of the data availability in the transmit FIFO + * |[3] |GOUTNakSts|Global OUT NAK Status (GOUTNakSts) (Read only) + * | | |1'b0: A handshake is sent based on the FIFO Status and the NAK and STALL bit settings. + * | | |1'b1: No data is written to the RxFIFO, irrespective of space availability + * | | |Sends a NAK handshake on all packets, except on SETUP transactions + * | | |All isochronous OUT packets are dropped. + * | | |Values: + * | | |0x0 (INACTIVE): A handshake is sent based on the FIFO Status and the NAK and STALL bit settings. + * | | |0x1 (ACTIVE): No data is written to the RxFIFO, irrespective of space availability + * | | |Sends a NAK handshake on all packets, except on SETUP transactions + * | | |All isochronous OUT packets are dropped + * |[6:4] |TstCtl |Test Control (TstCtl) + * | | |3'b000: Test mode disabled + * | | |3'b001: Test_J mode + * | | |3'b010: Test_K mode + * | | |3'b011: Test_SE0_NAK mode + * | | |3'b100: Test_Packet mode + * | | |3'b101: Test_Force_Enable + * | | |Others: Reserved + * | | |Values: + * | | |0x0 (DISABLED): Test mode disabled + * | | |0x1 (TESTJ): Test_J mode + * | | |0x2 (TESTK): Test_K mode + * | | |0x3 (TESTSN): Test_SE0_NAK mode + * | | |0x4 (TESTPM): Test_Packet mode + * | | |0x5 (TESTFE): Test_force_Enable + * |[7] |SGNPInNak |Set Global Non-periodic IN NAK (SGNPInNak) + * | | |A write to this field sets the Global Non-periodic IN NAK.The application uses this bit to send a NAK handshake on all non-periodic IN endpoints + * | | |The application must Set this bit only after making sure that the Global IN NAK Effective bit in the Core Interrupt Register (GINTSTS.GINNakEff) is cleared + * | | |Values: + * | | |0x0 (DISABLE): Disable Global Non-periodic IN NAK + * | | |0x1 (ENABLE): Set Global Non-periodic IN NAK + * |[8] |CGNPInNak |Clear Global Non-periodic IN NAK (CGNPInNak) + * | | |A write to this field clears the Global Non-periodic IN NAK. + * | | |Values: + * | | |0x0 (DISABLE): Disable Global Non-periodic IN NAK + * | | |0x1 (ENABLE): Clear Global Non-periodic IN NAK + * |[9] |SGOUTNak |Set Global OUT NAK (SGOUTNak) + * | | |A write to this field sets the Global OUT NAK + * | | |The application uses this bit to send a NAK handshake on all OUT endpoints + * | | |The application must set the this bit only after making sure that the Global OUT NAK Effective bit in the Core Interrupt Register (GINTSTS.GOUTNakEff) is cleared. + * | | |Values: + * | | |0x0 (DISABLED): Disable Global OUT NAK + * | | |0x1 (ENABLED): Set Global OUT NAK + * |[10] |CGOUTNak |Clear Global OUT NAK (CGOUTNak) + * | | |A write to this field clears the Global OUT NAK. + * | | |Values: + * | | |0x0 (DISABLED): Disable Clear Global OUT NAK + * | | |0x1 (ENABLED): Clear Global OUT NAK + * |[11] |PWROnPrgDone|Power-On Programming Done (PWROnPrgDone) + * | | |The application uses this bit to indicate that register programming is completed after a wake-up from Power-down mode. + * | | |Values: + * | | |0x0 (NOTDONE): Power-On Programming not done + * | | |0x1 (DONE): Power-On Programming Done + * |[14:13] |GMC |Global Multi Count (GMC) + * | | |GMC must be programmed only once after initialization + * | | |Applicable only for Scatter/Gather DMA mode + * | | |This indicates the number of packets to be serviced for that end point before moving to the next end point + * | | |It is only for non-periodic endpoints. + * | | |2'b00: Invalid. + * | | |2'b01: 1 packet. + * | | |2'b10: 2 packets. + * | | |2'b11: 3 packets. + * | | |Values: + * | | |0x0 (NOTVALID): Invalid + * | | |0x1 (ONEPACKET): 1 packet + * | | |0x2 (TWOPACKET): 2 packets + * | | |0x3 (THREEPACKET): 3 packets + * |[15] |IgnrFrmNum|Ignore Frame Number Feature for Isochronous Endpoints (IgnrFrmNum) + * | | |Note: Do not program IgnrFrmNum bit to 1'b1 when the core is operating in threshold mode. + * | | |Note: When Scatter/Gather DMA mode is enabled this feature is not applicable to High Speed, High bandwidth transfers. + * | | |When this bit is enabled, there must be only one packet per descriptor. + * | | |0: The core transmits the packets only in the frame number in which they are intended to be transmitted. + * | | |1: The core ignores the frame number, sending packets immediately as the packets are ready. + * | | |In Scatter/Gather DMA mode, if this bit is enabled, the packets are not flushed when a ISOC IN token is received for an elapsed frame. + * | | |Values: + * | | |0x0 (DISABLED): The core transmits the packets only in the frame number in which they are intended to be transmitted. + * | | |0x1 (ENABLED): The core ignores the frame number, sending packets immediately as the packets are ready + * |[16] |NakOnBble |NAK on Babble Error (NakOnBble) + * | | |Set NAK automatically on babble (NakOnBble) + * | | |The core sets NAK automatically for the endpoint on which babble is received. + * | | |Values: + * | | |0x0 (DISABLED): Disable NAK on Babble Error + * | | |0x1 (ENABLED): NAK on Babble Error + * |[17] |EnContOnBNA|Enable Continue on BNA (EnContOnBNA) + * | | |This bit enables the core to continue on BNA for Bulk OUT endpoints + * | | |With this feature enabled, when a Bulk OUT or INTR OUT endpoint receives a BNA interrupt the core starts processing the descriptor that caused the BNA interrupt after the endpoint re-enables the endpoint. + * | | |1'b0: After receiving BNA interrupt,the core disables the endpoint + * | | |When the endpoint is re-enabled by the application, the core starts processing from the DOEPDMA descriptor. + * | | |1'b1: After receiving BNA interrupt, the core disables the endpoint + * | | |When the endpoint is re-enabled by the application, the core starts processing from the descriptor that received the BNA interrupt. + * | | |It is a one-time programmable after reset bit like any other DCTL register bits. + * | | |Values: + * | | |0x0 (DISABLED): Core disables the endpoint after receiving BNA interrupt + * | | |When application re-enables the endpoint, core starts processing from the DOEPDMA descriptor + * | | |0x1 (ENABLED): Core disables the endpoint after receiving BNA interrupt + * | | |When application re-enables the endpoint, core starts processing from the descriptor that received the BNA interrupt + * |[18] |DeepSleepBESLReject|DeepSleepBESLReject + * | | |1: Deep Sleep BESL Reject feature is enabled + * | | |0: Deep Sleep BESL Reject feature is disabled + * | | |Core rejects LPM request with HIRD value greater than HIRD threshold programmed + * | | |NYET response is sent for LPM tokens with HIRD value greater than HIRD threshold + * | | |By default, the Deep Sleep BESL Reject feature is disabled. + * | | |Values: + * | | |0x0 (DISABLED): Deep Sleep BESL Reject feature is disabled + * | | |0x1 (ENABLED): Deep Sleep BESL Reject feature is enabled + * |[19] |ServInt |Service Interval based scheduling for Isochronous IN Endpoints + * | | |Note: This bit is applicable only in device mode and when Scatter/Gather DMA mode is used + * | | |This feature should not be enabled along with DCTL.IgnrFrmNum. + * | | |When this bit is enabled, the frame number field in the ISOC IN descriptor structure is interpreted as the last frame of the service interval + * | | |In Scatter/Gather DMA mode, if this bit is enabled, the pending packets are flushed by the controller at the last frame of the service interval. + * | | |Values: + * | | |0x0 (DISABLED): The controller behavior depends on DCTL.IgnrFrmNum field. + * | | |0x1 (ENABLED): The controller can transmit the packets in any frame of the service interval. + * @var HSUSBD_T::DSTS + * Offset: 0x808 Device Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SuspSts |Suspend Status (SuspSts) + * | | |In Device mode, this bit is set as long as a Suspend condition is detected on the USB + * | | |The core enters the Suspend state when there is no activity on the phy_line_state_i signal for an extended period of time + * | | |The core comes out of the suspend under the following conditions : + * | | |If there is any activity on the phy_line_state_i signal, or + * | | |If the application writes to the Remote Wakeup Signaling bit in the Device Control register (DCTL.RmtWkUpSig). + * | | |When the core comes out of the suspend, this bit is set to 1'b0. + * | | |Values: + * | | |0x0 (INACTIVE): No suspend state + * | | |0x1 (ACTIVE): Suspend state + * |[2:1] |EnumSpd |Enumerated Speed (EnumSpd) + * | | |Indicates the speed at which the controller has come up after speed detection through a connect or reset sequence. + * | | |2'b00: High speed + * | | |2'b01: Full speed + * | | |Values: + * | | |0x0 (HS3060): High speed + * | | |0x1 (FS3060): Full speed + * | | |0x2 (Reserved0): Reserved + * | | |0x3 (Reserved1): Reserved + * |[3] |ErrticErr |Erratic Error (ErrticErr) + * | | |The core sets this bit to report any erratic errors (phy_rxvalid_i/phy_rxvldh_i or phy_rxactive_i is asserted for at least 2 ms, due to PHY error) + * | | |Due to erratic errors, the core goes into Suspended state and an interrupt is generated to the application with Early Suspend bit of the Core Interrupt register (GINTSTS.ErlySusp) + * | | |If the early suspend is asserted due to an erratic error, the application can only perform a soft disconnect recover. + * | | |Values: + * | | |0x0 (INACTIVE): No Erratic Error + * | | |0x1 (ACTIVE): Erratic Error + * |[21:8] |SOFFN |Frame or Microframe Number of the Received SOF (SOFFN) + * | | |When the core is operating at high speed, this field contains a microframe number + * | | |When the core is operating at full or low speed, this field contains a Frame number. + * | | |Note: This register may return a non-zero value if read immediately after power-on reset + * | | |In case the register bit reads non-zero immediately after power-on reset, it does not indicate that SOF has been received from the host + * | | |The read value of this interrupt is valid only after a valid connection between host and device is established. + * |[23:22] |DevLnSts |Device Line Status (DevLnSts) + * | | |Indicates the current logic level USB data lines + * | | |DevLnSts[1]: Logic level of D+ + * | | |DevLnSts[0]: Logic level of D- + * @var HSUSBD_T::DIEPMSK + * Offset: 0x810 Device IN Endpoint Common Interrupt Mask Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |XferComplMsk|Transfer Completed Interrupt Mask (XferComplMsk) + * | | |Values: + * | | |0x0 (MASK): Mask Transfer Completed Interrupt + * | | |0x1 (NOMASK): No Transfer Completed Interrupt Mask + * |[1] |EPDisbldMsk|Endpoint Disabled Interrupt Mask (EPDisbldMsk) + * | | |Values: + * | | |0x0 (MASK): Mask Endpoint Disabled Interrupt + * | | |0x1 (NOMASK): No Endpoint Disabled Interrupt Mask + * |[2] |AHBErrMsk |AHB Error Mask (AHBErrMsk) + * | | |Values: + * | | |0x0 (MASK): Mask AHB Error Interrupt + * | | |0x1 (NOMASK): No AHB Error Interrupt Mask + * |[3] |TimeOUTMsk|Timeout Condition Mask (TimeOUTMsk) (Non-isochronous endpoints) + * | | |Values: + * | | |0x0 (MASK): Mask Timeout Condition Interrupt + * | | |0x1 (NOMASK): No Timeout Condition Interrupt Mask + * |[4] |INTknTXFEmpMsk|IN Token Received When TxFIFO Empty Mask (INTknTXFEmpMsk) + * | | |Values: + * | | |0x0 (MASK): Mask IN Token Received When TxFIFO Empty Interrupt + * | | |0x1 (NOMASK): + * | | |No IN Token Received When TxFIFO Empty Interrupt + * |[5] |INTknEPMisMsk|IN Token received with EP Mismatch Mask (INTknEPMisMsk) + * | | |Values: + * | | |0x0 (MASK): Mask IN Token received with EP Mismatch Interrupt + * | | |0x1 (NOMASK): + * | | |No Mask IN Token received with EP Mismatch Interrupt + * |[6] |INEPNakEffMsk|IN Endpoint NAK Effective Mask (INEPNakEffMsk) + * | | |Values: + * | | |0x0 (MASK): Mask IN Endpoint NAK Effective Interrupt + * | | |0x1 (NOMASK): No IN Endpoint NAK Effective Interrupt Mask + * |[8] |TxfifoUndrnMsk|Fifo Underrun Mask (TxfifoUndrnMsk) + * | | |Values: + * | | |0x0 (MASK): Mask Fifo Underrun Interrupt + * | | |0x1 (NOMASK): No Fifo Underrun Interrupt Mask + * |[9] |BNAInIntrMsk|BNA interrupt Mask (BNAInIntrMsk) + * | | |Values: + * | | |0x0 (MASK): Mask BNA Interrupt + * | | |0x1 (NOMASK): No BNA Interrupt Mask + * |[13] |NAKMsk |NAK interrupt Mask (NAKMsk) + * | | |Values: + * | | |0x0 (MASK): Mask NAK Interrupt + * | | |0x1 (NOMASK): No Mask NAK Interrupt + * @var HSUSBD_T::DOEPMSK + * Offset: 0x814 Device OUT Endpoint Common Interrupt Mask Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |XferComplMsk|Transfer Completed Interrupt Mask (XferComplMsk) + * | | |Values: + * | | |0x0 (MASK): Mask Transfer Completed Interrupt + * | | |0x1 (NOMASK): No Transfer Completed Interrupt Mask + * |[1] |EPDisbldMsk|Endpoint Disabled Interrupt Mask (EPDisbldMsk) + * | | |Values: + * | | |0x0 (MASK): Mask Endpoint Disabled Interrupt + * | | |0x1 (NOMASK): No Endpoint Disabled Interrupt Mask + * |[2] |AHBErrMsk |AHB Error (AHBErrMsk) + * | | |Values: + * | | |0x0 (MASK): Mask AHB Error Interrupt + * | | |0x1 (NOMASK): No AHB Error Interrupt Mask + * |[3] |SetUPMsk |SETUP Phase Done Mask (SetUPMsk) + * | | |Applies to control endpoints only. + * | | |Values: + * | | |0x0 (MASK): Mask SETUP Phase Done Interrupt + * | | |0x1 (NOMASK): No SETUP Phase Done Interrupt Mask + * |[4] |OUTTknEPdisMsk|OUT Token Received when Endpoint Disabled Mask (OUTTknEPdisMsk) + * | | |Applies to control OUT endpoints only. + * | | |Values: + * | | |0x0 (MASK): + * | | |Mask OUT Token Received when Endpoint Disabled Interrupt + * | | |0x1 (NOMASK): + * | | |No OUT Token Received when Endpoint Disabled Interrupt Mask + * |[5] |StsPhseRcvdMsk|Status Phase Received Mask (StsPhseRcvdMsk) + * | | |Applies to control OUT endpoints only. + * | | |Values: + * | | |0x0 (MASK): Status Phase Received Mask + * | | |0x1 (NOMASK): No Status Phase Received Mask + * |[6] |Back2BackSETup|Back-to-Back SETUP Packets Received Mask (Back2BackSETup) + * | | |Applies to control OUT endpoints only. + * | | |Values: + * | | |0x0 (MASK): Mask Back-to-Back SETUP Packets Received Interrupt + * | | |0x1 (NOMASK): + * | | |No Back-to-Back SETUP Packets Received Interrupt Mask + * |[8] |OutPktErrMsk|OUT Packet Error Mask (OutPktErrMsk) + * | | |Values: + * | | |0x0 (MASK): Mask OUT Packet Error Interrupt + * | | |0x1 (NOMASK): No OUT Packet Error Interrupt Mask + * |[9] |BnaOutIntrMsk|BNA interrupt Mask (BnaOutIntrMsk) + * | | |Values: + * | | |0x0 (MASK): Mask BNA Interrupt + * | | |0x1 (NOMASK): No BNA Interrupt Mask + * |[12] |BbleErrMsk|Babble Error interrupt Mask (BbleErrMsk) + * | | |Values: + * | | |0x0 (MASK): Mask Babble Error Interrupt + * | | |0x1 (NOMASK): No Babble Error Interrupt Mask + * |[13] |NAKMsk |NAK interrupt Mask (NAKMsk) + * | | |Values: + * | | |0x0 (MASK): Mask NAK Interrupt + * | | |0x1 (NOMASK): No NAK Interrupt Mask + * |[14] |NYETMsk |NYET interrupt Mask (NYETMsk) + * | | |Values: + * | | |0x0 (MASK): Mask NYET Interrupt + * | | |0x1 (NOMASK): No NYET Interrupt Mask + * @var HSUSBD_T::DAINT + * Offset: 0x818 Device All Endpoints Interrupt Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |InEpInt0 |IN Endpoint 0 Interrupt Bit + * | | |Values: + * | | |0x0 (INACTIVE): No Interrupt + * | | |0x1 (ACTIVE): IN Endpoint 0 Interrupt + * |[1] |InEpInt1 |IN Endpoint 1 Interrupt Bit + * |[2] |InEpInt2 |IN Endpoint 2 Interrupt Bit + * |[3] |InEpInt3 |IN Endpoint 3 Interrupt Bit + * |[4] |InEpInt4 |IN Endpoint 4 Interrupt Bit + * |[5] |InEpInt5 |IN Endpoint 5 Interrupt Bit + * |[6] |InEpInt6 |IN Endpoint 6 Interrupt Bit + * |[7] |InEpInt7 |IN Endpoint 7 Interrupt Bit + * |[8] |InEpInt8 |IN Endpoint 8 Interrupt Bit + * |[16] |OutEPInt0 |OUT Endpoint 0 Interrupt Bit + * | | |Values: + * | | |0x0 (INACTIVE): No Interrupt + * | | |0x1 (ACTIVE): OUT Endpoint 0 Interrupt + * |[17] |OutEPInt1 |OUT Endpoint 1 Interrupt Bit + * |[18] |OutEPInt2 |OUT Endpoint 2 Interrupt Bit + * |[19] |OutEPInt3 |OUT Endpoint 3 Interrupt Bit + * |[20] |OutEPInt4 |OUT Endpoint 4 Interrupt Bit + * |[21] |OutEPInt5 |OUT Endpoint 5 Interrupt Bit + * |[22] |OutEPInt6 |OUT Endpoint 6 Interrupt Bit + * |[23] |OutEPInt7 |OUT Endpoint 7 Interrupt Bit + * |[24] |OutEPInt8 |OUT Endpoint 8 Interrupt Bit + * @var HSUSBD_T::DAINTMSK + * Offset: 0x81C Device All Endpoints Interrupt Mask Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |InEpMsk0 |IN Endpoint 0 Interrupt mask Bit + * | | |Values: + * | | |0x0 (MASK): IN Endpoint 0 Interrupt mask + * | | |0x1 (NOMASK): No Interrupt mask + * |[1] |InEpMsk1 |IN Endpoint 1 Interrupt mask Bit + * |[2] |InEpMsk2 |IN Endpoint 2 Interrupt mask Bit + * |[3] |InEpMsk3 |IN Endpoint 3 Interrupt mask Bit + * |[4] |InEpMsk4 |IN Endpoint 4 Interrupt mask Bit + * |[5] |InEpMsk5 |IN Endpoint 5 Interrupt mask Bit + * |[6] |InEpMsk6 |IN Endpoint 6 Interrupt mask Bit + * |[7] |InEpMsk7 |IN Endpoint 7 Interrupt mask Bit + * |[8] |InEpMsk8 |IN Endpoint 8 Interrupt mask Bit + * |[16] |OutEPMsk0 |OUT Endpoint 0 Interrupt mask Bit + * | | |Values: + * | | |0x0 (MASK): OUT Endpoint 0 Interrupt mask + * | | |0x1 (NOMASK): No Interrupt mask + * |[17] |OutEPMsk1 |OUT Endpoint 1 Interrupt mask Bit + * |[18] |OutEPMsk2 |OUT Endpoint 2 Interrupt mask Bit + * |[19] |OutEPMsk3 |OUT Endpoint 3 Interrupt mask Bit + * |[20] |OutEPMsk4 |OUT Endpoint 4 Interrupt mask Bit + * |[21] |OutEPMsk5 |OUT Endpoint 5 Interrupt mask Bit + * |[22] |OutEPMsk6 |OUT Endpoint 6 Interrupt mask Bit + * |[23] |OutEPMsk7 |OUT Endpoint 7 Interrupt mask Bit + * |[24] |OutEPMsk8 |OUT Endpoint 8 Interrupt mask Bit + * @var HSUSBD_T::DTHRCTL + * Offset: 0x830 Device Threshold Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |NonISOThrEn|Non-ISO IN Endpoints Threshold Enable (NonISOThrEn) + * | | |When this bit is Set, the core enables thresholding for Non Isochronous IN endpoints. + * | | |Values: + * | | |0x0 (DISABLED): No thresholding + * | | |0x1 (ENABLED): Enable thresholding for non-isochronous IN endpoints + * |[1] |ISOThrEn |ISO IN Endpoints Threshold Enable (ISOThrEn) + * | | |When this bit is Set, the core enables thresholding for isochronous IN endpoints. + * | | |Values: + * | | |0x0 (DISABLED): No thresholding + * | | |0x1 (ENABLED): Enables thresholding for isochronous IN endpoints + * |[10:2] |TxThrLen |Transmit Threshold Length (TxThrLen) + * | | |This field specifies Transmit thresholding size in DWORDS + * | | |This also forms the MAC threshold and specifies the amount of data in bytes to be in the corresponding endpoint transmit FIFO, before the core can start transmit on the USB + * | | |The threshold length has to be at least eight DWORDS when the value of AHBThrRatio is 2'h00 + * | | |In case the AHBThrRatio is non zero the application needs to ensure that the AHB Threshold value does not go below the recommended eight DWORD + * | | |This field controls both isochronous and non-isochronous IN endpoint thresholds + * | | |The recommended value for ThrLen is to be the same as the programmed AHB Burst Length (GAHBCFG.HBstLen). + * | | |Note: + * | | |When OTG_ARCHITECTURE=2, the reset value of this register field is 8. + * |[12:11] |AHBThrRatio|AHB Threshold Ratio (AHBThrRatio) + * | | |These bits define the ratio between the AHB threshold and the MAC threshold for the transmit path only + * | | |The AHB threshold always remains less than or equal to the USB threshold, because this does not increase overhead + * | | |Both the AHB and the MAC threshold must be DWORD-aligned + * | | |The application needs to program TxThrLen and the AHBThrRatio to make the AHB Threshold value DWORD aligned + * | | |If the AHB threshold value is not DWORD aligned, the core might not behave correctly + * | | |When programming the TxThrLen and AHBThrRatio, the application must ensure that the minimum AHB threshold value does not go below 8 DWORDS to meet the USB turnaround time requirements. + * | | |2'b00: AHB threshold = MAC threshold. + * | | |2'b01: AHB threshold = MAC threshold / 2. + * | | |2'b10: AHB threshold = MAC threshold / 4. + * | | |2'b11: AHB threshold = MAC threshold / 8. + * | | |Values: + * | | |0x0 (THRESZERO): AHB threshold = MAC threshold. + * | | |0x1 (THRESONE): AHB threshold = MAC threshold /2. + * | | |0x2 (THRESTWO): AHB threshold = MAC threshold /4. + * | | |0x3 (THRESTHREE): AHB threshold = MAC threshold /8. + * |[16] |RxThrEn |Receive Threshold Enable (RxThrEn) + * | | |When this bit is set, the core enables thresholding in the receive direction. + * | | |Note: We recommends that you do not enable RxThrEn, because it may cause issues in the RxFIFO especially during error conditions such as RxError and Babble. + * | | |Values: + * | | |0x0 (DISABLED): Disable thresholding + * | | |0x1 (ENABLED): Enable thresholding in the receive direction + * |[25:17] |RxThrLen |Receive Threshold Length (RxThrLen) + * | | |This field specifies Receive thresholding size in DWORDS + * | | |This field also specifies the amount of data received on the USB before the core can start transmitting on the AHB + * | | |The threshold length has to be at least eight DWORDS + * | | |The recommended value for ThrLen is to be the same as the programmed AHB Burst Length (GAHBCFG.HBstLen). + * |[27] |ArbPrkEn |Arbiter Parking Enable (ArbPrkEn) + * | | |This bit controls internal DMA arbiter parking for IN endpoints + * | | |If thresholding is enabled and this bit is set to one, then the arbiter parks on the IN endpoint for which there is a token received on the USB + * | | |This is done to avoid getting into underrun conditions + * | | |By default, arbiter parking is enabled. + * | | |Values: + * | | |0x0 (DISABLED): Disable DMA arbiter parking + * | | |0x1 (ENABLED): Enable DMA arbiter parking for IN endpoints + * @var HSUSBD_T::DIEPEMPMSK + * Offset: 0x834 Device IN Endpoint FIFO Empty Interrupt Mask Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |InEpTxfEmpMsk|IN EP Tx FIFO Empty Interrupt Mask Bits (InEpTxfEmpMsk) + * | | |These bits acts as mask bits for DIEPINTn.TxFEmp interrupt, one bit per IN Endpoint: + * | | |Bit 0 for IN EP 0, bit 8 for IN EP 8 + * | | |Values: + * | | |0x1 (EP0_MASK): Mask IN EP0 Tx FIFO Empty Interrupt + * | | |0x2 (EP1_MASK): Mask IN EP1 Tx FIFO Empty Interrupt + * | | |0x4 (EP2_MASK): Mask IN EP2 Tx FIFO Empty Interrupt + * | | |0x8 (EP3_MASK): Mask IN EP3 Tx FIFO Empty Interrupt + * | | |0x10 (EP4_MASK): Mask IN EP4 Tx FIFO Empty Interrupt + * | | |0x20 (EP5_MASK): Mask IN EP5 Tx FIFO Empty Interrupt + * | | |0x40 (EP6_MASK): Mask IN EP6 Tx FIFO Empty Interrupt + * | | |0x80 (EP7_MASK): Mask IN EP7 Tx FIFO Empty Interrupt + * | | |0x100 (EP8_MASK): Mask IN EP8 Tx FIFO Empty Interrupt + * @var HSUSBD_T::DIEPCTL0 + * Offset: 0x900 Device Control IN Endpoint 0 Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |MPS |Maximum Packet Size (MPS) + * | | |Applies to IN and OUT endpoints. + * | | |The application must program this field with the maximum packet size for the current logical endpoint. + * | | |2'b00: 64 bytes + * | | |2'b01: 32 bytes + * | | |2'b10: 16 bytes + * | | |2'b11: 8 bytes + * | | |Values: + * | | |0x0 (BYTES64): 64 bytes + * | | |0x1 (BYTES32): 32 bytes + * | | |0x2 (BYTES16): 16 bytes + * | | |0x3 (BYTES8): 8 bytes + * |[15] |USBActEP |USB Active Endpoint (USBActEP) (Read only) + * | | |This bit is always SET to 1, indicating that control endpoint 0 is always active in all configurations and interfaces. + * | | |Values: + * | | |0x1 (ACTIVE0): Control endpoint is always active + * |[17] |NAKSts |NAK Status (NAKSts) (Read only) + * | | |Indicates the following: + * | | |1'b0: The core is transmitting non-NAK handshakes based on the FIFO status + * | | |1'b1: The core is transmitting NAK handshakes on this endpoint. + * | | |When this bit is set, either by the application or core, the core stops transmitting data, even If there is data available in the TxFIFO + * | | |Irrespective of this bit's setting, the core always responds to SETUP data packets with an ACK handshake. + * | | |Values: + * | | |0x0 (INACTIVE): + * | | |The core is transmitting non-NAK handshakes based on the FIFO status + * | | |0x1 (ACTIVE): + * | | |The core is transmitting NAK handshakes on this endpoint + * |[19:18] |EPType |Endpoint Type (EPType) (Read only) + * | | |Hardcoded to 00 for control. + * | | |Values: + * | | |0x0 (ACTIVE): Endpoint Control 0 + * |[21] |Stall |STALL Handshake (Stall) + * | | |The application can only set this bit, and the core clears it, when a SETUP token is received for this endpoint + * | | |If a NAK bit, Global Nonperiodic IN NAK, or Global OUT NAK is set along with this bit, the STALL bit takes priority. + * | | |Values: + * | | |0x0 (INACTIVE): No Stall + * | | |0x1 (ACTIVE): Stall Handshake + * |[25:22] |TxFNum |TxFIFO Number (TxFNum) + * | | |For Dedicated FIFO operation, this value is set to the FIFO number that is assigned to IN Endpoint. + * | | |Values: + * | | |0x0 (TXFIFO0): Tx FIFO 0 + * | | |0x1 (TXFIFO1): Tx FIFO 1 + * | | |0x2 (TXFIFO2): Tx FIFO 2 + * | | |0x3 (TXFIFO3): Tx FIFO 3 + * | | |0x4 (TXFIFO4): Tx FIFO 4 + * | | |0x5 (TXFIFO5): Tx FIFO 5 + * | | |0x6 (TXFIFO6): Tx FIFO 6 + * | | |0x7 (TXFIFO7): Tx FIFO 7 + * | | |0x8 (TXFIFO8): Tx FIFO 8 + * |[26] |CNAK |Clear NAK (CNAK) + * | | |A write to this bit clears the NAK bit for the endpoint + * | | |Values: + * | | |0x0 (NOCLEAR): No action + * | | |0x1 (CLEAR): Clear NAK + * |[27] |SNAK |Set NAK (SNAK + * | | |) A write to this bit sets the NAK bit for the endpoint Using this bit, the application can control the transmission of NAK handshakes on an endpoint The core can also set this bit for an endpoint after a SETUP packet is received on that endpoint + * | | |Values: + * | | |0x0 (NOSET): No action + * | | |0x1 (SET): Set NAK + * |[30] |EPDis |Endpoint Disable (EPDis) + * | | |The application sets this bit to stop transmitting data on an endpoint, even before the transfer for that endpoint is complete + * | | |The application must wait for the Endpoint Disabled interrupt before treating the endpoint as disabled + * | | |The core clears this bit before setting the Endpoint Disabled Interrupt + * | | |The application must Set this bit only if Endpoint Enable is already set for this endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No action + * | | |0x1 (ACTIVE): Disabled Endpoint + * |[31] |EPEna |Endpoint Enable (EPEna) + * | | |When Scatter/Gather DMA mode is enabled for IN endpoints, this bit indicates that the descriptor structure and data buffer with data ready to transmit is setup. + * | | |Values: + * | | |0x0 (INACTIVE): No action + * | | |0x1 (ACTIVE): Enable Endpoint + * @var HSUSBD_T::DIEPINT0 + * Offset: 0x908 Device IN Endpoint 0 Interrupt Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |XferCompl |Transfer Completed Interrupt (XferCompl) + * | | |Applies to IN and OUT endpoints. + * | | |When Scatter/Gather DMA mode is enabled + * | | |For IN endpoint this field indicates that the requested data from the descriptor is moved from external system memory to internal FIFO. + * | | |For OUT endpoint this field indicates that the requested data from the internal FIFO is moved to external system memory + * | | |This interrupt is generated only when the corresponding endpoint descriptor is closed, and the IOC bit for the corresponding descriptor is set. + * | | |Values: + * | | |0x0 (INACTIVE): No Transfer Complete Interrupt + * | | |0x1 (ACTIVE): Transfer Completed Interrupt + * |[1] |EPDisbld |Endpoint Disabled Interrupt (EPDisbld) + * | | |Applies to IN and OUT endpoints. + * | | |This bit indicates that the endpoint is disabled per the application's request. + * | | |Values: + * | | |0x0 (INACTIVE): No Endpoint Disabled Interrupt + * | | |0x1 (ACTIVE): Endpoint Disabled Interrupt + * |[2] |AHBErr |AHB Error (AHBErr) + * | | |Applies to IN and OUT endpoints. + * | | |When there is an AHB error during an AHB read/write + * | | |The application can read the corresponding endpoint DMA address register to get the error address. + * | | |Values: + * | | |0x0 (INACTIVE): No AHB Error Interrupt + * | | |0x1 (ACTIVE): AHB Error interrupt + * |[4] |INTknTXFEmp|IN Token Received When TxFIFO is Empty (INTknTXFEmp) + * | | |Applies to non-periodic IN endpoints only. + * | | |Indicates that an IN token was received when the associated TxFIFO (periodic/non-periodic) was empty + * | | |This interrupt is asserted on the endpoint for which the IN token was received. + * | | |Values: + * | | |0x0 (INACTIVE): No IN Token Received when TxFIFO Empty interrupt + * | | |0x1 (ACTIVE): IN Token Received when TxFIFO Empty Interrupt + * |[5] |INTknEPMis|IN Token Received with EP Mismatch (INTknEPMis) + * | | |Applies to non-periodic IN endpoints only. + * | | |Indicates that the data in the top of the non-periodic TxFIFO belongs to an endpoint other than the one for which the IN token was received + * | | |This interrupt is asserted on the endpoint for which the IN token was received. + * | | |Values: + * | | |0x0 (INACTIVE): No IN Token Received with EP Mismatch interrupt + * | | |0x1 (ACTIVE): IN Token Received with EP Mismatch interrupt + * |[6] |INEPNakEff|IN Endpoint NAK Effective (INEPNakEff) + * | | |Applies to periodic IN endpoints only. + * | | |This bit can be cleared when the application clears the IN endpoint NAK by writing to DIEPCTLn.CNAK. + * | | |This interrupt indicates that the core has sampled the NAK bit + * | | |Set (either by the application or by the core). + * | | |The interrupt indicates that the IN endpoint NAK bit Set by the application has taken effect in the core. + * | | |This interrupt does not guarantee that a NAK handshake is sent on the USB + * | | |A STALL bit takes priority over a NAK bit. + * | | |Values: + * | | |0x0 (INACTIVE): No IN Endpoint NAK Effective interrupt + * | | |0x1 (ACTIVE): IN Endpoint NAK Effective interrupt + * |[7] |TxFEmp |Transmit FIFO Empty (TxFEmp) (Read only) + * | | |This bit is valid only for IN Endpoints + * | | |This interrupt is asserted when the TxFIFO for this endpoint is either half or completely empty + * | | |The half or completely empty status is determined by the TxFIFO Empty Level bit in the Core AHB Configuration register (GAHBCFG.NPTxFEmpLvl)). + * | | |Values: + * | | |0x0 (INACTIVE): No Transmit FIFO Empty interrupt + * | | |0x1 (ACTIVE): Transmit FIFO Empty interrupt + * |[8] |TxfifoUndrn|Fifo Underrun (TxfifoUndrn) + * | | |Applies to IN endpoints only. + * | | |The core generates this interrupt when it detects a transmit FIFO underrun condition in threshold mode for this endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No Fifo Underrun interrupt + * | | |0x1 (ACTIVE): Fifo Underrun interrupt + * |[9] |BNAIntr |BNA (Buffer Not Available) Interrupt (BNAIntr) + * | | |The core generates this interrupt when the descriptor accessed is not ready for the Core to process, such as DMA done. + * | | |Values: + * | | |0x0 (INACTIVE): No BNA interrupt + * | | |0x1 (ACTIVE): BNA interrupt + * |[12] |BbleErr |NAK Interrupt (BbleErr) + * | | |The core generates this interrupt when babble is received for the endpoint. + * | | |Values: + * | | |0x0 (INACTIVE): No interrupt + * | | |0x1 (ACTIVE): BbleErr interrupt + * |[13] |NAKIntrpt |NAK Interrupt (NAKInterrupt) + * | | |The core generates this interrupt when a NAK is transmitted or received by the device + * | | |= 1). + * | | |F_MCLK = F_I2SCLK (When MCLKDIV is set to 0). + * | | |Note: F_MCLK is the frequency of MCLK, and F_I2SCLK is the frequency of the I2S_CLK + * |[17:8] |BCLKDIV |Bit Clock Divider + * | | |The I2S controller will generate bit clock in Master mode + * | | |Software can program these bit fields to generate sampling rate clock frequency. + * | | |F_BCLK= F_I2SCLK / (2*(BCLKDIV + 1)). + * | | |Note: F_BCLK is the frequency of BCLK and F_I2SCLK is the frequency of I2S_CLK + * @var I2S_T::IEN + * Offset: 0x08 I2S Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RXUDFIEN |Receive FIFO Underflow Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note: If software reads receive FIFO when it is empty then RXUDIF (I2S_STATUS0[8]) flag is set to 1 + * | | |If RXUDFIEN bit is enabled, interrupt occurs. + * |[1] |RXOVFIEN |Receive FIFO Overflow Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note: Interrupt occurs if this bit is set to 1 and RXOVIF (I2S_STATUS0[9]) flag is set to 1 + * |[2] |RXTHIEN |Receive FIFO Threshold Level Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note: Interrupt occurs if this bit is set to 1 and data words in receive FIFO is larger than RXTH (I2S_CTL1[19:16]). + * |[8] |TXUDFIEN |Transmit FIFO Underflow Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note: Interrupt occur if this bit is set to 1 and TXUDIF (I2S_STATUS0[16]) flag is set to 1. + * |[9] |TXOVFIEN |Transmit FIFO Overflow Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note: Interrupt occurs if this bit is set to 1 and TXOVIF (I2S_STATUS0[17]) flag is set to 1 + * |[10] |TXTHIEN |Transmit FIFO Threshold Level Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note: Interrupt occurs if this bit is set to 1 and data words in transmit FIFO is less than or equal to TXTH (I2S_CTL1[11:8]). + * |[16] |CH0ZCIEN |Channel0 Zero-cross Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note 1: Interrupt occurs if this bit is set to 1 and channel0 zero-cross + * | | |Note 2: Channel0 also means left audio channel while I2S (FORMAT[2]=0) or 2-channel PCM mode. + * |[17] |CH1ZCIEN |Channel1 Zero-cross Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note 1: Interrupt occurs if this bit is set to 1 and channel1 zero-cross + * | | |Note 2: Channel1 also means right audio channel while I2S (FORMAT[2]=0) or 2-channel PCM mode. + * |[18] |CH2ZCIEN |Channel2 Zero-cross Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note 1: Interrupt occurs if this bit is set to 1 and channel2 zero-cross + * | | |Note 2: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x1, 0x2, 0x3. + * |[19] |CH3ZCIEN |Channel3 Zero-cross Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note 1: Interrupt occurs if this bit is set to 1 and channel3 zero-cross + * | | |Note 2: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x1, 0x2, 0x3. + * |[20] |CH4ZCIEN |Channel4 Zero-cross Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note 1: Interrupt occurs if this bit is set to 1 and channel4 zero-cross + * | | |Note 2: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x2, 0x3. + * |[21] |CH5ZCIEN |Channel5 Zero-cross Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note 1: Interrupt occurs if this bit is set to 1 and channel5 zero-cross + * | | |Note 2: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x2, 0x3. + * |[22] |CH6ZCIEN |Channel6 Zero-cross Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note 1: Interrupt occurs if this bit is set to 1 and channel6 zero-cross + * | | |Note 2: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x3. + * |[23] |CH7ZCIEN |Channel7 Zero-cross Interrupt Enable Bit + * | | |0 = Interrupt Disabled. + * | | |1 = Interrupt Enabled. + * | | |Note 1: Interrupt occurs if this bit is set to 1 and channel7 zero-cross + * | | |Note 2: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x3. + * @var I2S_T::STATUS0 + * Offset: 0x0C I2S Status Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |I2SINT |I2S Interrupt Flag (Read Only) + * | | |0 = No I2S interrupt. + * | | |1 = I2S interrupt. + * | | |Note: It is wire-OR of I2STXINT and I2SRXINT bits. + * |[1] |I2SRXINT |I2S Receive Interrupt (Read Only) + * | | |0 = No receive interrupt. + * | | |1 = Receive interrupt. + * |[2] |I2STXINT |I2S Transmit Interrupt (Read Only) + * | | |0 = No transmit interrupt. + * | | |1 = Transmit interrupt. + * |[5:3] |DATACH |Transmission Data Channel (Read Only) + * | | |This bit fields are used to indicate which audio channel is current transmit data belong. + * | | |000 = channel0 (means left channel while 2-channel I2S/PCM mode). + * | | |001 = channel1 (means right channel while 2-channel I2S/PCM mode). + * | | |010 = channel2 (available while 4-channel TDM PCM mode). + * | | |011 = channel3 (available while 4-channel TDM PCM mode). + * | | |100 = channel4 (available while 6-channel TDM PCM mode). + * | | |101 = channel5 (available while 6-channel TDM PCM mode). + * | | |110 = channel6 (available while 8-channel TDM PCM mode). + * | | |111 = channel7 (available while 8-channel TDM PCM mode). + * |[8] |RXUDIF |Receive FIFO Underflow Interrupt Flag + * | | |0 = No underflow occur. + * | | |1 = Underflow occur. + * | | |Note 1: When receive FIFO is empty, and software reads the receive FIFO again + * | | |This bit will be set to 1, and it indicates underflow situation occurs. + * | | |Note 2: Write 1 to clear this bit to 0 + * |[9] |RXOVIF |Receive FIFO Overflow Interrupt Flag + * | | |0 = No overflow occur. + * | | |1 = Overflow occur. + * | | |Note 1: When receive FIFO is full and receive hardware attempt to write data into receive FIFO then this bit is set to 1, data in 1st buffer is overwritten. + * | | |Note 2: Write 1 to clear this bit to 0. + * |[10] |RXTHIF |Receive FIFO Threshold Interrupt Flag (Read Only) + * | | |0 = Data word(s) in FIFO is less than or equal to threshold level. + * | | |1 = Data word(s) in FIFO is larger than threshold level. + * | | |Note: When data word(s) in receive FIFO is larger than threshold value set in RXTH (I2S_CTL1[19:16]) the RXTHIF bit becomes to 1 + * | | |It keeps at 1 till RXCNT (I2S_STATUS1[20:16]) is less than or equal to RXTH (I2S_CTL1[19:16]) after software read RXFIFO register. + * |[11] |RXFULL |Receive FIFO Full (Read Only) + * | | |0 = Not full. + * | | |1 = Full. + * | | |Note: This bit reflects data words number in receive FIFO is 16. + * |[12] |RXEMPTY |Receive FIFO Empty (Read Only) + * | | |0 = Not empty. + * | | |1 = Empty. + * | | |Note: This bit reflects data words number in receive FIFO is 0. + * |[16] |TXUDIF |Transmit FIFO Underflow Interrupt Flag + * | | |0 = No underflow. + * | | |1 = Underflow. + * | | |Note 1: This bit will be set to 1 when shift logic hardware read data from transmitting FIFO and the filling data level in transmitting FIFO is not enough for one audio frame. + * | | |Note 2: Write 1 to clear this bit to 0. + * |[17] |TXOVIF |Transmit FIFO Overflow Interrupt Flag + * | | |0 = No overflow. + * | | |1 = Overflow. + * | | |Note 1: Write data to transmit FIFO when it is full and this bit set to 1 + * | | |Note 2: Write 1 to clear this bit to 0. + * |[18] |TXTHIF |Transmit FIFO Threshold Interrupt Flag (Read Only) + * | | |0 = Data word(s) in FIFO is larger than threshold level. + * | | |1 = Data word(s) in FIFO is less than or equal to threshold level. + * | | |Note: When data word(s) in transmit FIFO is less than or equal to threshold value set in TXTH (I2S_CTL1[11:8]) the TXTHIF bit becomes to 1 + * | | |It keeps at 1 till TXCNT (I2S_STATUS1[12:8]) is larger than TXTH (I2S_CTL1[11:8]) after software write TXFIFO register. + * |[19] |TXFULL |Transmit FIFO Full (Read Only) + * | | |This bit reflect data word number in transmit FIFO is 16 + * | | |0 = Not full. + * | | |1 = Full. + * |[20] |TXEMPTY |Transmit FIFO Empty (Read Only) + * | | |This bit reflect data word number in transmit FIFO is 0 + * | | |0 = Not empty. + * | | |1 = Empty. + * |[21] |TXBUSY |Transmit Busy (Read Only) + * | | |0 = Transmit shift buffer is empty. + * | | |1 = Transmit shift buffer is busy. + * | | |Note: This bit is cleared to 0 when all data in transmit FIFO and shift buffer is shifted out + * | | |And set to 1 when 1st data is load to shift buffer + * @var I2S_T::TXFIFO + * Offset: 0x10 I2S Transmit FIFO Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |TXFIFO |Transmit FIFO Bits + * | | |The I2S contains 16 words (16x32 bits) data buffer for data transmit + * | | |Write data to this register to prepare data for transmit + * | | |The remaining word number is indicated by TXCNT (I2S_STATUS1[12:8]). + * @var I2S_T::RXFIFO + * Offset: 0x14 I2S Receive FIFO Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |RXFIFO |Receive FIFO Bits + * | | |I2S contains 16 words (16x32 bits) data buffer for data receive + * | | |Read this register to get data in FIFO + * | | |The remaining data word number is indicated by RXCNT (I2S_STATUS1[20:16]). + * @var I2S_T::CTL1 + * Offset: 0x20 I2S Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CH0ZCEN |Channel0 Zero-cross Detection Enable Bit + * | | |0 = channel0 zero-cross detect Disabled. + * | | |1 = channel0 zero-cross detect Enabled. + * | | |Note 1: Channel0 also means left audio channel while I2S (FORMAT[2]=0) or 2-channel PCM mode. + * | | |Note 2: If this bit is set to 1, when channel0 data sign bit change or next shift data bits are all 0 then CH0ZCIF(I2S_STATUS1[0]) flag is set to 1. + * | | |Note 3: If CH0ZCIF flag is set to 1, the channel0 will be mute. + * |[1] |CH1ZCEN |Channel1 Zero-cross Detect Enable Bit + * | | |0 = channel1 zero-cross detect Disabled. + * | | |1 = channel1 zero-cross detect Enabled. + * | | |Note 1: Channel1 also means right audio channel while I2S (FORMAT[2]=0) or 2-channel PCM mode. + * | | |Note 2: If this bit is set to 1, when channel1 data sign bit change or next shift data bits are all 0 then CH1ZCIF(I2S_STATUS1[1]) flag is set to 1. + * | | |Note 3: If CH1ZCIF flag is set to 1, the channel1 will be mute. + * |[2] |CH2ZCEN |Channel2 Zero-cross Detect Enable Bit + * | | |0 = channel2 zero-cross detect Disabled. + * | | |1 = channel2 zero-cross detect Enabled. + * | | |Note 1: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x1, 0x2, 0x3. + * | | |Note 2: If this bit is set to 1, when channel2 data sign bit change or next shift data bits are all 0 then CH2ZCIF(I2S_STATUS1[2]) flag is set to 1. + * | | |Note 3: If CH2ZCIF flag is set to 1, the channel2 will be mute. + * |[3] |CH3ZCEN |Channel3 Zero-cross Detect Enable Bit + * | | |0 = channel3 zero-cross detect Disabled. + * | | |1 = channel3 zero-cross detect Enabled. + * | | |Note 1: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x1, 0x2, 0x3. + * | | |Note 2: If this bit is set to 1, when channel3 data sign bit change or next shift data bits are all 0 then CH3ZCIF(I2S_STATUS1[3]) flag is set to 1. + * | | |Note 3: If CH3ZCIF flag is set to 1, the channel3 will be mute. + * |[4] |CH4ZCEN |Channel4 Zero-cross Detect Enable Bit + * | | |0 = channel4 zero-cross detect Disabled. + * | | |1 = channel4 zero-cross detect Enabled. + * | | |Note 1: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x2, 0x3. + * | | |Note 2: If this bit is set to 1, when channel4 data sign bit change or next shift data bits are all 0 then CH4ZCIF(I2S_STATUS1[4]) flag is set to 1. + * | | |Note 3: If CH4ZCIF flag is set to 1, the channel4 will be mute. + * |[5] |CH5ZCEN |Channel5 Zero-cross Detect Enable Bit + * | | |0 = channel5 zero-cross detect Disabled. + * | | |1 = channel5 zero-cross detect Enabled. + * | | |Note 1: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x2, 0x3. + * | | |Note 2: If this bit is set to 1, when channel5 data sign bit change or next shift data bits are all 0 then CH5ZCIF(I2S_STATUS1[5]) flag is set to 1. + * | | |Note 3: If CH5ZCIF flag is set to 1, the channel5 will be mute. + * |[6] |CH6ZCEN |Channel6 Zero-cross Detect Enable Bit + * | | |0 = channel6 zero-cross detect Disabled. + * | | |1 = channel6 zero-cross detect Enabled. + * | | |Note 1: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x3. + * | | |Note 2: If this bit is set to 1, when channel6 data sign bit change or next shift data bits are all 0 then CH6ZCIF(I2S_STATUS1[6]) flag is set to 1. + * | | |Note 3: If CH6ZCIF flag is set to 1, the channel6 will be mute. + * |[7] |CH7ZCEN |Channel7 Zero-cross Detect Enable Bit + * | | |0 = channel7 zero-cross detect Disabled. + * | | |1 = channel7 zero-cross detect Enabled. + * | | |Note 1: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x3. + * | | |Note 2: If this bit is set to 1, when channel7 data sign bit change or next shift data bits are all 0 then CH7ZCIF (I2S_STATUS1[7]) flag is set to 1. + * | | |Note 3: If CH7ZCIF flag is set to 1, the channel7 will be mute. + * |[11:8] |TXTH |Transmit FIFO Threshold Level + * | | |0000 = 0 data word in transmit FIFO. + * | | |0001 = 1 data word in transmit FIFO. + * | | |0010 = 2 data words in transmit FIFO. + * | | |.... + * | | |1110 = 14 data words in transmit FIFO. + * | | |1111 = 15 data words in transmit FIFO. + * | | |Note: If remain data word number in transmit FIFO is less than or equal to threshold level then TXTHIF (I2S_STATUS0[18]) flag is set. + * |[19:16] |RXTH |Receive FIFO Threshold Level + * | | |0000 = 1 data word in receive FIFO. + * | | |0001 = 2 data words in receive FIFO. + * | | |0010 = 3 data words in receive FIFO. + * | | |.... + * | | |1110 = 15 data words in receive FIFO. + * | | |1111 = 16 data words in receive FIFO. + * | | |Note: When received data word number in receive buffer is larger than threshold level then RXTHIF (I2S_STATUS0[10]) flag is set. + * |[24] |PBWIDTH |Peripheral Bus Data Width Selection + * | | |This bit is used to choice the available data width of APB bus + * | | |It must be set to 1 while PDMA function is enable and it is set to 16-bit transmission mode + * | | |0 = 32 bits data width. + * | | |1 = 16 bits data width. + * | | |Note 1: If PBWIDTH=1, the low 16 bits of 32-bit data bus are available. + * | | |Note 2: If PBWIDTH=1, the transmitting FIFO level will be increased after two FIFO write operations. + * | | |Note 3: If PBWIDTH=1, the receiving FIFO level will be decreased after two FIFO read operations. + * |[25] |PB16ORD |FIFO Read/Write Order in 16-bit Width of Peripheral Bus + * | | |When PBWIDTH = 1, the data FIFO will be increased or decreased by two peripheral bus access + * | | |This bit is used to select the order of FIFO access operations to meet the 32-bit transmitting/receiving FIFO entries. + * | | |0 = Low 16-bit read/write access first. + * | | |1 = High 16-bit read/write access first. + * | | |Note: This bit is available while PBWIDTH = 1. + * @var I2S_T::STATUS1 + * Offset: 0x24 I2S Status Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CH0ZCIF |Channel0 Zero-cross Interrupt Flag + * | | |It indicates channel0 next sample data sign bit is changed or all data bits are 0. + * | | |0 = No zero-cross in channel0. + * | | |1 = Channel0 zero-cross is detected. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: Channel0 also means left audio channel while I2S (FORMAT[2]=0) or 2-channel PCM mode. + * |[1] |CH1ZCIF |Channel1 Zero-cross Interrupt Flag + * | | |It indicates channel1 next sample data sign bit is changed or all data bits are 0. + * | | |0 = No zero-cross in channel1. + * | | |1 = Channel1 zero-cross is detected. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: Channel1 also means right audio channel while I2S (FORMAT[2]=0) or 2-channel PCM mode. + * |[2] |CH2ZCIF |Channel2 Zero-cross Interrupt Flag + * | | |It indicates channel2 next sample data sign bit is changed or all data bits are 0. + * | | |0 = No zero-cross in channel2. + * | | |1 = Channel2 zero-cross is detected. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x1, 0x2, 0x3. + * |[3] |CH3ZCIF |Channel3 Zero-cross Interrupt Flag + * | | |It indicates channel3 next sample data sign bit is changed or all data bits are 0. + * | | |0 = No zero-cross in channel3. + * | | |1 = Channel3 zero-cross is detected. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x1, 0x2, 0x3. + * |[4] |CH4ZCIF |Channel4 Zero-cross Interrupt Flag + * | | |It indicates channel4 next sample data sign bit is changed or all data bits are 0. + * | | |0 = No zero-cross in channel4. + * | | |1 = Channel4 zero-cross is detected. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x2, 0x3. + * |[5] |CH5ZCIF |Channel5 Zero-cross Interrupt Flag + * | | |It indicates channel5 next sample data sign bit is changed or all data bits are 0. + * | | |0 = No zero-cross in channel5. + * | | |1 = Channel5 zero-cross is detected. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x2, 0x3. + * |[6] |CH6ZCIF |Channel6 Zero-cross Interrupt Flag + * | | |It indicates channel6 next sample data sign bit is changed or all data bits are 0. + * | | |0 = No zero-cross in channel6. + * | | |1 = Channel6 zero-cross is detected. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x3. + * |[7] |CH7ZCIF |Channel7 Zero-cross Interrupt Flag + * | | |It indicates channel7 next sample data sign bit is changed or all data bits are 0. + * | | |0 = No zero-cross in channel7. + * | | |1 = Channel7 zero-cross is detected. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: This bit is available while multi-channel PCM mode and TDMCHNUM (I2S_CTL0[31:30]) = 0x3. + * |[12:8] |TXCNT |Transmit FIFO Level (Read Only) + * | | |These bits indicate the number of available entries in transmit FIFO + * | | |00000 = No data. + * | | |00001 = 1 word in transmit FIFO. + * | | |00010 = 2 words in transmit FIFO. + * | | |.... + * | | |01110 = 14 words in transmit FIFO. + * | | |01111 = 15 words in transmit FIFO. + * | | |10000 = 16 words in transmit FIFO. + * | | |Others are reserved. + * |[20:16] |RXCNT |Receive FIFO Level (Read Only) + * | | |These bits indicate the number of available entries in receive FIFO + * | | |00000 = No data. + * | | |00001 = 1 word in receive FIFO. + * | | |00010 = 2 words in receive FIFO. + * | | |.... + * | | |01110 = 14 words in receive FIFO. + * | | |01111 = 15 words in receive FIFO. + * | | |10000 = 16 words in receive FIFO. + * | | |Others are reserved. + */ + __IO uint32_t CTL0; /*!< [0x0000] I2S Control Register 0 */ + __IO uint32_t CLKDIV; /*!< [0x0004] I2S Clock Divider Register */ + __IO uint32_t IEN; /*!< [0x0008] I2S Interrupt Enable Register */ + __IO uint32_t STATUS0; /*!< [0x000c] I2S Status Register 0 */ + __O uint32_t TXFIFO; /*!< [0x0010] I2S Transmit FIFO Register */ + __I uint32_t RXFIFO; /*!< [0x0014] I2S Receive FIFO Register */ + __I uint32_t RESERVE0[2]; + __IO uint32_t CTL1; /*!< [0x0020] I2S Control Register 1 */ + __IO uint32_t STATUS1; /*!< [0x0024] I2S Status Register 1 */ + +} I2S_T; + +/** + @addtogroup I2S_CONST I2S Bit Field Definition + Constant Definitions for I2S Controller +@{ */ + +#define I2S_CTL0_I2SEN_Pos (0) /*!< I2S_T::CTL0: I2SEN Position */ +#define I2S_CTL0_I2SEN_Msk (0x1ul << I2S_CTL0_I2SEN_Pos) /*!< I2S_T::CTL0: I2SEN Mask */ + +#define I2S_CTL0_TXEN_Pos (1) /*!< I2S_T::CTL0: TXEN Position */ +#define I2S_CTL0_TXEN_Msk (0x1ul << I2S_CTL0_TXEN_Pos) /*!< I2S_T::CTL0: TXEN Mask */ + +#define I2S_CTL0_RXEN_Pos (2) /*!< I2S_T::CTL0: RXEN Position */ +#define I2S_CTL0_RXEN_Msk (0x1ul << I2S_CTL0_RXEN_Pos) /*!< I2S_T::CTL0: RXEN Mask */ + +#define I2S_CTL0_MUTE_Pos (3) /*!< I2S_T::CTL0: MUTE Position */ +#define I2S_CTL0_MUTE_Msk (0x1ul << I2S_CTL0_MUTE_Pos) /*!< I2S_T::CTL0: MUTE Mask */ + +#define I2S_CTL0_DATWIDTH_Pos (4) /*!< I2S_T::CTL0: DATWIDTH Position */ +#define I2S_CTL0_DATWIDTH_Msk (0x3ul << I2S_CTL0_DATWIDTH_Pos) /*!< I2S_T::CTL0: DATWIDTH Mask */ + +#define I2S_CTL0_MONO_Pos (6) /*!< I2S_T::CTL0: MONO Position */ +#define I2S_CTL0_MONO_Msk (0x1ul << I2S_CTL0_MONO_Pos) /*!< I2S_T::CTL0: MONO Mask */ + +#define I2S_CTL0_ORDER_Pos (7) /*!< I2S_T::CTL0: ORDER Position */ +#define I2S_CTL0_ORDER_Msk (0x1ul << I2S_CTL0_ORDER_Pos) /*!< I2S_T::CTL0: ORDER Mask */ + +#define I2S_CTL0_SLAVE_Pos (8) /*!< I2S_T::CTL0: SLAVE Position */ +#define I2S_CTL0_SLAVE_Msk (0x1ul << I2S_CTL0_SLAVE_Pos) /*!< I2S_T::CTL0: SLAVE Mask */ + +#define I2S_CTL0_MCLKEN_Pos (15) /*!< I2S_T::CTL0: MCLKEN Position */ +#define I2S_CTL0_MCLKEN_Msk (0x1ul << I2S_CTL0_MCLKEN_Pos) /*!< I2S_T::CTL0: MCLKEN Mask */ + +#define I2S_CTL0_TXFBCLR_Pos (18) /*!< I2S_T::CTL0: TXFBCLR Position */ +#define I2S_CTL0_TXFBCLR_Msk (0x1ul << I2S_CTL0_TXFBCLR_Pos) /*!< I2S_T::CTL0: TXFBCLR Mask */ + +#define I2S_CTL0_RXFBCLR_Pos (19) /*!< I2S_T::CTL0: RXFBCLR Position */ +#define I2S_CTL0_RXFBCLR_Msk (0x1ul << I2S_CTL0_RXFBCLR_Pos) /*!< I2S_T::CTL0: RXFBCLR Mask */ + +#define I2S_CTL0_TXPDMAEN_Pos (20) /*!< I2S_T::CTL0: TXPDMAEN Position */ +#define I2S_CTL0_TXPDMAEN_Msk (0x1ul << I2S_CTL0_TXPDMAEN_Pos) /*!< I2S_T::CTL0: TXPDMAEN Mask */ + +#define I2S_CTL0_RXPDMAEN_Pos (21) /*!< I2S_T::CTL0: RXPDMAEN Position */ +#define I2S_CTL0_RXPDMAEN_Msk (0x1ul << I2S_CTL0_RXPDMAEN_Pos) /*!< I2S_T::CTL0: RXPDMAEN Mask */ + +#define I2S_CTL0_RXLCH_Pos (23) /*!< I2S_T::CTL0: RXLCH Position */ +#define I2S_CTL0_RXLCH_Msk (0x1ul << I2S_CTL0_RXLCH_Pos) /*!< I2S_T::CTL0: RXLCH Mask */ + +#define I2S_CTL0_FORMAT_Pos (24) /*!< I2S_T::CTL0: FORMAT Position */ +#define I2S_CTL0_FORMAT_Msk (0x7ul << I2S_CTL0_FORMAT_Pos) /*!< I2S_T::CTL0: FORMAT Mask */ + +#define I2S_CTL0_PCMSYNC_Pos (27) /*!< I2S_T::CTL0: PCMSYNC Position */ +#define I2S_CTL0_PCMSYNC_Msk (0x1ul << I2S_CTL0_PCMSYNC_Pos) /*!< I2S_T::CTL0: PCMSYNC Mask */ + +#define I2S_CTL0_CHWIDTH_Pos (28) /*!< I2S_T::CTL0: CHWIDTH Position */ +#define I2S_CTL0_CHWIDTH_Msk (0x3ul << I2S_CTL0_CHWIDTH_Pos) /*!< I2S_T::CTL0: CHWIDTH Mask */ + +#define I2S_CTL0_TDMCHNUM_Pos (30) /*!< I2S_T::CTL0: TDMCHNUM Position */ +#define I2S_CTL0_TDMCHNUM_Msk (0x3ul << I2S_CTL0_TDMCHNUM_Pos) /*!< I2S_T::CTL0: TDMCHNUM Mask */ + +#define I2S_CLKDIV_MCLKDIV_Pos (0) /*!< I2S_T::CLKDIV: MCLKDIV Position */ +#define I2S_CLKDIV_MCLKDIV_Msk (0x7ful << I2S_CLKDIV_MCLKDIV_Pos) /*!< I2S_T::CLKDIV: MCLKDIV Mask */ + +#define I2S_CLKDIV_BCLKDIV_Pos (8) /*!< I2S_T::CLKDIV: BCLKDIV Position */ +#define I2S_CLKDIV_BCLKDIV_Msk (0x3fful << I2S_CLKDIV_BCLKDIV_Pos) /*!< I2S_T::CLKDIV: BCLKDIV Mask */ + +#define I2S_IEN_RXUDFIEN_Pos (0) /*!< I2S_T::IEN: RXUDFIEN Position */ +#define I2S_IEN_RXUDFIEN_Msk (0x1ul << I2S_IEN_RXUDFIEN_Pos) /*!< I2S_T::IEN: RXUDFIEN Mask */ + +#define I2S_IEN_RXOVFIEN_Pos (1) /*!< I2S_T::IEN: RXOVFIEN Position */ +#define I2S_IEN_RXOVFIEN_Msk (0x1ul << I2S_IEN_RXOVFIEN_Pos) /*!< I2S_T::IEN: RXOVFIEN Mask */ + +#define I2S_IEN_RXTHIEN_Pos (2) /*!< I2S_T::IEN: RXTHIEN Position */ +#define I2S_IEN_RXTHIEN_Msk (0x1ul << I2S_IEN_RXTHIEN_Pos) /*!< I2S_T::IEN: RXTHIEN Mask */ + +#define I2S_IEN_TXUDFIEN_Pos (8) /*!< I2S_T::IEN: TXUDFIEN Position */ +#define I2S_IEN_TXUDFIEN_Msk (0x1ul << I2S_IEN_TXUDFIEN_Pos) /*!< I2S_T::IEN: TXUDFIEN Mask */ + +#define I2S_IEN_TXOVFIEN_Pos (9) /*!< I2S_T::IEN: TXOVFIEN Position */ +#define I2S_IEN_TXOVFIEN_Msk (0x1ul << I2S_IEN_TXOVFIEN_Pos) /*!< I2S_T::IEN: TXOVFIEN Mask */ + +#define I2S_IEN_TXTHIEN_Pos (10) /*!< I2S_T::IEN: TXTHIEN Position */ +#define I2S_IEN_TXTHIEN_Msk (0x1ul << I2S_IEN_TXTHIEN_Pos) /*!< I2S_T::IEN: TXTHIEN Mask */ + +#define I2S_IEN_CH0ZCIEN_Pos (16) /*!< I2S_T::IEN: CH0ZCIEN Position */ +#define I2S_IEN_CH0ZCIEN_Msk (0x1ul << I2S_IEN_CH0ZCIEN_Pos) /*!< I2S_T::IEN: CH0ZCIEN Mask */ + +#define I2S_IEN_CH1ZCIEN_Pos (17) /*!< I2S_T::IEN: CH1ZCIEN Position */ +#define I2S_IEN_CH1ZCIEN_Msk (0x1ul << I2S_IEN_CH1ZCIEN_Pos) /*!< I2S_T::IEN: CH1ZCIEN Mask */ + +#define I2S_IEN_CH2ZCIEN_Pos (18) /*!< I2S_T::IEN: CH2ZCIEN Position */ +#define I2S_IEN_CH2ZCIEN_Msk (0x1ul << I2S_IEN_CH2ZCIEN_Pos) /*!< I2S_T::IEN: CH2ZCIEN Mask */ + +#define I2S_IEN_CH3ZCIEN_Pos (19) /*!< I2S_T::IEN: CH3ZCIEN Position */ +#define I2S_IEN_CH3ZCIEN_Msk (0x1ul << I2S_IEN_CH3ZCIEN_Pos) /*!< I2S_T::IEN: CH3ZCIEN Mask */ + +#define I2S_IEN_CH4ZCIEN_Pos (20) /*!< I2S_T::IEN: CH4ZCIEN Position */ +#define I2S_IEN_CH4ZCIEN_Msk (0x1ul << I2S_IEN_CH4ZCIEN_Pos) /*!< I2S_T::IEN: CH4ZCIEN Mask */ + +#define I2S_IEN_CH5ZCIEN_Pos (21) /*!< I2S_T::IEN: CH5ZCIEN Position */ +#define I2S_IEN_CH5ZCIEN_Msk (0x1ul << I2S_IEN_CH5ZCIEN_Pos) /*!< I2S_T::IEN: CH5ZCIEN Mask */ + +#define I2S_IEN_CH6ZCIEN_Pos (22) /*!< I2S_T::IEN: CH6ZCIEN Position */ +#define I2S_IEN_CH6ZCIEN_Msk (0x1ul << I2S_IEN_CH6ZCIEN_Pos) /*!< I2S_T::IEN: CH6ZCIEN Mask */ + +#define I2S_IEN_CH7ZCIEN_Pos (23) /*!< I2S_T::IEN: CH7ZCIEN Position */ +#define I2S_IEN_CH7ZCIEN_Msk (0x1ul << I2S_IEN_CH7ZCIEN_Pos) /*!< I2S_T::IEN: CH7ZCIEN Mask */ + +#define I2S_STATUS0_I2SINT_Pos (0) /*!< I2S_T::STATUS0: I2SINT Position */ +#define I2S_STATUS0_I2SINT_Msk (0x1ul << I2S_STATUS0_I2SINT_Pos) /*!< I2S_T::STATUS0: I2SINT Mask */ + +#define I2S_STATUS0_I2SRXINT_Pos (1) /*!< I2S_T::STATUS0: I2SRXINT Position */ +#define I2S_STATUS0_I2SRXINT_Msk (0x1ul << I2S_STATUS0_I2SRXINT_Pos) /*!< I2S_T::STATUS0: I2SRXINT Mask */ + +#define I2S_STATUS0_I2STXINT_Pos (2) /*!< I2S_T::STATUS0: I2STXINT Position */ +#define I2S_STATUS0_I2STXINT_Msk (0x1ul << I2S_STATUS0_I2STXINT_Pos) /*!< I2S_T::STATUS0: I2STXINT Mask */ + +#define I2S_STATUS0_DATACH_Pos (3) /*!< I2S_T::STATUS0: DATACH Position */ +#define I2S_STATUS0_DATACH_Msk (0x7ul << I2S_STATUS0_DATACH_Pos) /*!< I2S_T::STATUS0: DATACH Mask */ + +#define I2S_STATUS0_RXUDIF_Pos (8) /*!< I2S_T::STATUS0: RXUDIF Position */ +#define I2S_STATUS0_RXUDIF_Msk (0x1ul << I2S_STATUS0_RXUDIF_Pos) /*!< I2S_T::STATUS0: RXUDIF Mask */ + +#define I2S_STATUS0_RXOVIF_Pos (9) /*!< I2S_T::STATUS0: RXOVIF Position */ +#define I2S_STATUS0_RXOVIF_Msk (0x1ul << I2S_STATUS0_RXOVIF_Pos) /*!< I2S_T::STATUS0: RXOVIF Mask */ + +#define I2S_STATUS0_RXTHIF_Pos (10) /*!< I2S_T::STATUS0: RXTHIF Position */ +#define I2S_STATUS0_RXTHIF_Msk (0x1ul << I2S_STATUS0_RXTHIF_Pos) /*!< I2S_T::STATUS0: RXTHIF Mask */ + +#define I2S_STATUS0_RXFULL_Pos (11) /*!< I2S_T::STATUS0: RXFULL Position */ +#define I2S_STATUS0_RXFULL_Msk (0x1ul << I2S_STATUS0_RXFULL_Pos) /*!< I2S_T::STATUS0: RXFULL Mask */ + +#define I2S_STATUS0_RXEMPTY_Pos (12) /*!< I2S_T::STATUS0: RXEMPTY Position */ +#define I2S_STATUS0_RXEMPTY_Msk (0x1ul << I2S_STATUS0_RXEMPTY_Pos) /*!< I2S_T::STATUS0: RXEMPTY Mask */ + +#define I2S_STATUS0_TXUDIF_Pos (16) /*!< I2S_T::STATUS0: TXUDIF Position */ +#define I2S_STATUS0_TXUDIF_Msk (0x1ul << I2S_STATUS0_TXUDIF_Pos) /*!< I2S_T::STATUS0: TXUDIF Mask */ + +#define I2S_STATUS0_TXOVIF_Pos (17) /*!< I2S_T::STATUS0: TXOVIF Position */ +#define I2S_STATUS0_TXOVIF_Msk (0x1ul << I2S_STATUS0_TXOVIF_Pos) /*!< I2S_T::STATUS0: TXOVIF Mask */ + +#define I2S_STATUS0_TXTHIF_Pos (18) /*!< I2S_T::STATUS0: TXTHIF Position */ +#define I2S_STATUS0_TXTHIF_Msk (0x1ul << I2S_STATUS0_TXTHIF_Pos) /*!< I2S_T::STATUS0: TXTHIF Mask */ + +#define I2S_STATUS0_TXFULL_Pos (19) /*!< I2S_T::STATUS0: TXFULL Position */ +#define I2S_STATUS0_TXFULL_Msk (0x1ul << I2S_STATUS0_TXFULL_Pos) /*!< I2S_T::STATUS0: TXFULL Mask */ + +#define I2S_STATUS0_TXEMPTY_Pos (20) /*!< I2S_T::STATUS0: TXEMPTY Position */ +#define I2S_STATUS0_TXEMPTY_Msk (0x1ul << I2S_STATUS0_TXEMPTY_Pos) /*!< I2S_T::STATUS0: TXEMPTY Mask */ + +#define I2S_STATUS0_TXBUSY_Pos (21) /*!< I2S_T::STATUS0: TXBUSY Position */ +#define I2S_STATUS0_TXBUSY_Msk (0x1ul << I2S_STATUS0_TXBUSY_Pos) /*!< I2S_T::STATUS0: TXBUSY Mask */ + +#define I2S_TXFIFO_TXFIFO_Pos (0) /*!< I2S_T::TXFIFO: TXFIFO Position */ +#define I2S_TXFIFO_TXFIFO_Msk (0xfffffffful << I2S_TXFIFO_TXFIFO_Pos) /*!< I2S_T::TXFIFO: TXFIFO Mask */ + +#define I2S_RXFIFO_RXFIFO_Pos (0) /*!< I2S_T::RXFIFO: RXFIFO Position */ +#define I2S_RXFIFO_RXFIFO_Msk (0xfffffffful << I2S_RXFIFO_RXFIFO_Pos) /*!< I2S_T::RXFIFO: RXFIFO Mask */ + +#define I2S_CTL1_CH0ZCEN_Pos (0) /*!< I2S_T::CTL1: CH0ZCEN Position */ +#define I2S_CTL1_CH0ZCEN_Msk (0x1ul << I2S_CTL1_CH0ZCEN_Pos) /*!< I2S_T::CTL1: CH0ZCEN Mask */ + +#define I2S_CTL1_CH1ZCEN_Pos (1) /*!< I2S_T::CTL1: CH1ZCEN Position */ +#define I2S_CTL1_CH1ZCEN_Msk (0x1ul << I2S_CTL1_CH1ZCEN_Pos) /*!< I2S_T::CTL1: CH1ZCEN Mask */ + +#define I2S_CTL1_CH2ZCEN_Pos (2) /*!< I2S_T::CTL1: CH2ZCEN Position */ +#define I2S_CTL1_CH2ZCEN_Msk (0x1ul << I2S_CTL1_CH2ZCEN_Pos) /*!< I2S_T::CTL1: CH2ZCEN Mask */ + +#define I2S_CTL1_CH3ZCEN_Pos (3) /*!< I2S_T::CTL1: CH3ZCEN Position */ +#define I2S_CTL1_CH3ZCEN_Msk (0x1ul << I2S_CTL1_CH3ZCEN_Pos) /*!< I2S_T::CTL1: CH3ZCEN Mask */ + +#define I2S_CTL1_CH4ZCEN_Pos (4) /*!< I2S_T::CTL1: CH4ZCEN Position */ +#define I2S_CTL1_CH4ZCEN_Msk (0x1ul << I2S_CTL1_CH4ZCEN_Pos) /*!< I2S_T::CTL1: CH4ZCEN Mask */ + +#define I2S_CTL1_CH5ZCEN_Pos (5) /*!< I2S_T::CTL1: CH5ZCEN Position */ +#define I2S_CTL1_CH5ZCEN_Msk (0x1ul << I2S_CTL1_CH5ZCEN_Pos) /*!< I2S_T::CTL1: CH5ZCEN Mask */ + +#define I2S_CTL1_CH6ZCEN_Pos (6) /*!< I2S_T::CTL1: CH6ZCEN Position */ +#define I2S_CTL1_CH6ZCEN_Msk (0x1ul << I2S_CTL1_CH6ZCEN_Pos) /*!< I2S_T::CTL1: CH6ZCEN Mask */ + +#define I2S_CTL1_CH7ZCEN_Pos (7) /*!< I2S_T::CTL1: CH7ZCEN Position */ +#define I2S_CTL1_CH7ZCEN_Msk (0x1ul << I2S_CTL1_CH7ZCEN_Pos) /*!< I2S_T::CTL1: CH7ZCEN Mask */ + +#define I2S_CTL1_TXTH_Pos (8) /*!< I2S_T::CTL1: TXTH Position */ +#define I2S_CTL1_TXTH_Msk (0xful << I2S_CTL1_TXTH_Pos) /*!< I2S_T::CTL1: TXTH Mask */ + +#define I2S_CTL1_RXTH_Pos (16) /*!< I2S_T::CTL1: RXTH Position */ +#define I2S_CTL1_RXTH_Msk (0xful << I2S_CTL1_RXTH_Pos) /*!< I2S_T::CTL1: RXTH Mask */ + +#define I2S_CTL1_PBWIDTH_Pos (24) /*!< I2S_T::CTL1: PBWIDTH Position */ +#define I2S_CTL1_PBWIDTH_Msk (0x1ul << I2S_CTL1_PBWIDTH_Pos) /*!< I2S_T::CTL1: PBWIDTH Mask */ + +#define I2S_CTL1_PB16ORD_Pos (25) /*!< I2S_T::CTL1: PB16ORD Position */ +#define I2S_CTL1_PB16ORD_Msk (0x1ul << I2S_CTL1_PB16ORD_Pos) /*!< I2S_T::CTL1: PB16ORD Mask */ + +#define I2S_STATUS1_CH0ZCIF_Pos (0) /*!< I2S_T::STATUS1: CH0ZCIF Position */ +#define I2S_STATUS1_CH0ZCIF_Msk (0x1ul << I2S_STATUS1_CH0ZCIF_Pos) /*!< I2S_T::STATUS1: CH0ZCIF Mask */ + +#define I2S_STATUS1_CH1ZCIF_Pos (1) /*!< I2S_T::STATUS1: CH1ZCIF Position */ +#define I2S_STATUS1_CH1ZCIF_Msk (0x1ul << I2S_STATUS1_CH1ZCIF_Pos) /*!< I2S_T::STATUS1: CH1ZCIF Mask */ + +#define I2S_STATUS1_CH2ZCIF_Pos (2) /*!< I2S_T::STATUS1: CH2ZCIF Position */ +#define I2S_STATUS1_CH2ZCIF_Msk (0x1ul << I2S_STATUS1_CH2ZCIF_Pos) /*!< I2S_T::STATUS1: CH2ZCIF Mask */ + +#define I2S_STATUS1_CH3ZCIF_Pos (3) /*!< I2S_T::STATUS1: CH3ZCIF Position */ +#define I2S_STATUS1_CH3ZCIF_Msk (0x1ul << I2S_STATUS1_CH3ZCIF_Pos) /*!< I2S_T::STATUS1: CH3ZCIF Mask */ + +#define I2S_STATUS1_CH4ZCIF_Pos (4) /*!< I2S_T::STATUS1: CH4ZCIF Position */ +#define I2S_STATUS1_CH4ZCIF_Msk (0x1ul << I2S_STATUS1_CH4ZCIF_Pos) /*!< I2S_T::STATUS1: CH4ZCIF Mask */ + +#define I2S_STATUS1_CH5ZCIF_Pos (5) /*!< I2S_T::STATUS1: CH5ZCIF Position */ +#define I2S_STATUS1_CH5ZCIF_Msk (0x1ul << I2S_STATUS1_CH5ZCIF_Pos) /*!< I2S_T::STATUS1: CH5ZCIF Mask */ + +#define I2S_STATUS1_CH6ZCIF_Pos (6) /*!< I2S_T::STATUS1: CH6ZCIF Position */ +#define I2S_STATUS1_CH6ZCIF_Msk (0x1ul << I2S_STATUS1_CH6ZCIF_Pos) /*!< I2S_T::STATUS1: CH6ZCIF Mask */ + +#define I2S_STATUS1_CH7ZCIF_Pos (7) /*!< I2S_T::STATUS1: CH7ZCIF Position */ +#define I2S_STATUS1_CH7ZCIF_Msk (0x1ul << I2S_STATUS1_CH7ZCIF_Pos) /*!< I2S_T::STATUS1: CH7ZCIF Mask */ + +#define I2S_STATUS1_TXCNT_Pos (8) /*!< I2S_T::STATUS1: TXCNT Position */ +#define I2S_STATUS1_TXCNT_Msk (0x1ful << I2S_STATUS1_TXCNT_Pos) /*!< I2S_T::STATUS1: TXCNT Mask */ + +#define I2S_STATUS1_RXCNT_Pos (16) /*!< I2S_T::STATUS1: RXCNT Position */ +#define I2S_STATUS1_RXCNT_Msk (0x1ful << I2S_STATUS1_RXCNT_Pos) /*!< I2S_T::STATUS1: RXCNT Mask */ + +/**@}*/ /* I2S_CONST */ +/**@}*/ /* end of I2S register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __I2S_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/kpi_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/kpi_reg.h new file mode 100644 index 0000000000..74cc94dd85 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/kpi_reg.h @@ -0,0 +1,409 @@ +/**************************************************************************//** + * @file kpi_reg.h + * @version V1.00 + * @brief KPI register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 20 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __KPI_REG_H__ +#define __KPI_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup Keypad Interface (KPI) + Memory Mapped Structure for KPI Controller +@{ */ + +typedef struct +{ + + + /** + * @var KPI_T::KPICONF + * Offset: 0x00 Keypad Configuration Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ENKP |Keypad Scan Enable Bit + * | | |Setting this bit high enables the key scan function. + * | | |0 = Keypad scan Disabled. + * | | |1 = Keypad scan Enabled. + * |[1] |PKINTEN |Press Key Interrupt Enable Bit + * | | |The keypad controller will generate an interrupt when the controller detects any effective key press. + * | | |0 = Keypad press interrupt Disabled. + * | | |1 = Keypad press interrupt Enabled. + * | | |Note: The bit will be reset when KPI reset occurs. + * |[2] |RKINTEN |Release Key Interrupt Enable Bit + * | | |The keypad controller will generate an interrupt when the controller detects keypad status changes from press to release. + * | | |0 = Keypad release interrupt Disabled. + * | | |1 = Keypad release interrupt Enabled. + * | | |Note: The bit will be reset when KPI reset occurs. + * |[3] |INTEN |Key Interrupt Enable Bit + * | | |0 = Keypad interrupt Disabled. + * | | |1 = Keypad interrupt Enabled. + * | | |Note: The bit will be reset when KPI reset occurs. + * |[5] |WAKEUP |Lower Power Wakeup Enable Bit + * | | |Setting this bit enables low power wakeup. + * | | |0 = Wakeup Disabled. + * | | |1 = Wakeup Enabled. + * | | |Note: Setting the bit will force all KPI scan out to low. + * |[15:8] |PRESCALE |Row Scan Cycle Pre-scale Value + * | | |This value is used to pre-scale row scan cycle. + * | | |The pre-scale counter is clocked by the divided crystal clock, xCLOCK. + * | | |The divided number is from 1 to 256. + * | | |E.g.If the crystal clock is 1Mhz then the xCLOCK period is 1us. + * | | |If the keypad matric is 3x3 then + * | | |Each row scan time = xCLOCK x PRESCALE x PrescaleDivider. + * | | |Key array scan time = Each row scan time x ROWS. + * | | |Example scan time for PRESCALE = 0x40, and PrescaleDivider = 0x1F. + * | | |Each row scan time = 1us x 65 x 32 = 2.08ms. + * | | |Scan time = 2.08 x 3 = 6.24ms. + * | | |Note: + * | | |When PRESCALE is determined, De-bounce sampling cycle should not exceed the half of (PRESCALE x PrescaleDivider), + * | | |in the above example, and if scan row delay cycle is 4 xclock + * | | |The maximum DBCLKSEL should be 4*256 xCLOCK, bouncing time is 1ms. + * |[19:16] |DBCLKSEL |Scan in De-bounce Sampling Cycle Selection + * | | |0000 = Reserved. + * | | |0001 = Reserved. + * | | |0010 = Reserved. + * | | |0011 = Sample interrupt input once per 8 clocks. + * | | |0100 = Sample interrupt input once per 16 clocks. + * | | |0101 = Sample interrupt input once per 32 clocks. + * | | |0110 = Sample interrupt input once per 64 clocks. + * | | |0111 = Sample interrupt input once per 128 clocks. + * | | |1000 = Sample interrupt input once per 256 clocks. + * | | |1001 = Sample interrupt input once per 512 clocks. + * | | |1010 = Sample interrupt input once per 1024 clocks. + * | | |1011 = Sample interrupt input once per 2048 clocks. + * | | |1100 = Sample interrupt input once per 4096 clocks. + * | | |1101 = Sample interrupt input once per 8192 clocks. + * | | |1110 = reserved. + * | | |1111 = reserved. + * | | |Note: + * | | |scan row delay cycle < debounce sampling cycle. + * | | |row scan time > scan row delay cycle + (2 * debounce sampling cycle). + * | | |row scan time = prescale * 32 (xclock). + * | | |xclock = 1 MHz ~32 kHz. + * | | |bouncing time last for 1ms + * | | |For example, if xclock = 1 MHz,. + * | | |debounce sampling cycle choose 1024 xclock, + * | | |and scan row delay cycle choose 8 xclock, + * | | |row scan time should choose larger than (8+2048) xclock, + * | | |suppose PrescaleDivider = 0x1F, then prescale = 65 (2056/32 = 64.25). + * |[23:22] |SCANROWD |Scan Row Delay + * | | |Setting delay cycle when row change. + * | | |00 = 4 KPI engine clock cycle. + * | | |01 = 8 KPI engine clock cycle. + * | | |10 = 16 KPI engine clock cycle. + * | | |11 = 32 KPI engine clock cycle. + * | | |Note: + * | | |scan row delay cycle < debounce sampling cycle. + * | | |row scan time > scan row delay cycle + (2 * debounce sampling cycle). + * |[26:24] |KCOL |Keypad Matrix COL Number + * | | |The keypad matrix is set by ROW x COL. The COL number can be set 1 to 8. + * | | |000 = 1. + * | | |001 = 2. + * | | |010 = 3. + * | | |011 = 4. + * | | |100 = 5. + * | | |101 = 6. + * | | |110 = 7. + * | | |111 = 8. + * |[30:28] |KROW |Keypad Matrix ROW Number + * | | |The keypad matrix is set by ROW x COL. The ROW number can be set 2 to 6. + * | | |000 = reserved. + * | | |001 = 2. + * | | |010 = 3. + * | | |011 = 4. + * | | |100 = 5. + * | | |101 = 6. + * | | |110 = Reserved. + * | | |111 = Reserved. + * @var KPI_T::KPI3KCONF + * Offset: 0x04 Keypad 3-keys Configuration Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |K30C |The #0 Key Column Address + * |[5:3] |K30R |The #0 Key Row Address + * | | |The #0 means the row address and the column address is the lowest of the specified 3-keys + * |[10:8] |K31C |The #1 Key Column Address + * |[13:11] |K31R |The #1 Key Row Address + * | | |The #1 means the row address and the column address is the 2nd of the specified 3-keys + * |[18:16] |K32C |The #2 Key Column Address + * |[21:19] |K32R |The #2 Key Row Address + * | | |The #2 means the row address and the column address is the highest of the specified 3-keys + * |[24] |EN3KYRST |Enable Three-key Reset + * | | |Setting this bit enables hardware reset when three-key is detected + * | | |0 = Three-key function Disabled. + * | | |1 = Three-key function Enabled. + * | | |Note: The bit will be reset when KPI reset occurs. + * @var KPI_T::KPISTATUS + * Offset: 0x08 Keypad Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PDWAKE |Power Down Wakeup Flag + * | | |This flag indicates the chip is woken up from power down by keypad. + * | | |When READ: + * | | |0 = No wakeup. + * | | |1 = Wake-up by keypad. + * | | |When WRITE: + * | | |0 = No operation. + * | | |1 = Clear interrupt flag. + * |[1] |RST3KEY |3-keys Reset Flag + * | | |This bit will be set after 3-keys reset occurs. + * | | |When READ: + * | | |0 = No reset. + * | | |1 = 3 keys reset interrupt occurred. + * | | |When WRITE: + * | | |0 = No operation. + * | | |1 = Clear interrupt flag. + * |[2] |KEYINT |Key Interrupt + * | | |This bit indicates the key scan interrupt is active when any key press or release or three key reset or wake up. + * | | |When READ: + * | | |0 = No reset. + * | | |1 = Key press/release/3-key reset/wakeup interrupt occurred. + * |[3] |RKEYINT |Release Key Interrupt + * | | |This bit indicates that some keys (one or multiple key) have been released. + * | | |When READ: + * | | |0 = No key release. + * | | |1 = At least one key release. + * | | |Note: To clear RKEYINT, software must clear each releasing event that are shown on u201Ckey releasing eventu201D. + * | | |C code example: + * | | |DWORD RKE0, RKE1 + * | | |PKE0 = reg_read(KPIKRE0); PKE1 = reg_read(KPIKRE1);. + * | | |Reg_write(KPIKRE0, RKE0); Reg_write(KPIKRE1, RKE1) + * |[4] |PKEYINT |Press Key Interrupt + * | | |This bit indicates that some keys (one or multiple key) have been pressed. + * | | |When READ: + * | | |0 = No key press. + * | | |1 = At least one key press. + * | | |Note: To clear PKEYINT, software must clear each pressing event that are shown on u201CKPIKPE1, KPIKPE0u201D. + * | | |C code example: + * | | |DWORD PKE0, PKE1 + * | | |PKE0 = reg_read(KPIKPE0); PKE1 = reg_read(KPIKPE1);. + * | | |Reg_write(KPIKPE0, PKE0); Reg_write(KPIKPE1, PKE1) + * @var KPI_T::KPIRSTC + * Offset: 0x0C Keypad Reset Period Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |RSTC |3-key Reset Period Count + * | | |The keypad controller generates a reset signal when it detects 3-key match condition, if the EN3KYRST (KPI3KCONF[24]) is set + * | | |The RSTC is used to control the reset period. + * | | |Reset period = 64 * RSTC XCLOCK. + * @var KPI_T::KPIKEST0 + * Offset: 0x10 Keypad State Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KESTmn |Key State + * | | |KESTm,n: m is row number, n is column number + * | | |0 = Key m,n is pressing. + * | | |1 = Key m,n is releasing. + * @var KPI_T::KPIKEST1 + * Offset: 0x14 Keypad State Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |KESTmn |Key State + * | | |KESTm,n: m is row number, n is column number + * | | |0 = Key m,n is pressing. + * | | |1 = Key m,n is releasing. + * @var KPI_T::KPIKPE0 + * Offset: 0x18 Lower 32 Key Press Event Indicator + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KPEmn |Lower 32 Key Press Event Change Indicator + * | | |KPE mn[X] = 1, m=row, n=column:. + * | | |0 = No key event. + * | | |1 = Corresponding key has a high to low event change. + * | | |Note: + * | | |Hardware will set this bit, and software should clear this bit by writing 1. + * | | |Software can clear PKEYINT (KPISTATUS[4]) by writing 1 bit by bit to this register. + * @var KPI_T::KPIKPE1 + * Offset: 0x1C Upper 32 Key Press Event Indicator + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |KPEmn |Upper 32 Key Press Event Change Indicator + * | | |KPE mn[X] = 1, m=row, n=column:. + * | | |0 = No key event. + * | | |1 = Corresponding key has a high to low event change. + * | | |Note: + * | | |Hardware will set this bit, and software should clear this bit by writing 1. + * | | |Software can clear PKEYINT (KPISTATUS[4]) by writing 1 bit by bit to this register. + * @var KPI_T::KPIKRE0 + * Offset: 0x20 Lower 32 Key Release Event Indicator + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KREmn |Lower 32 Key Release Event Change Indicator + * | | |KRE mn[X] = 1, m=row, n=column:. + * | | |0 = No key event. + * | | |1 = Corresponding key has a low to high event change. + * | | |Note: + * | | |Hardware will set this bit, and software should clear this bit by writing 1. + * | | |Software can clear RKEYINT (KPISTATUS[3]) by writing 1 bit by bit to this register. + * @var KPI_T::KPIKRE1 + * Offset: 0x24 Upper 32 Key Release Event Indicator + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |KREmn |Upper 32 Key Release Event Change Indicator + * | | |KRE mn[X] = 1, m=row, n=column:. + * | | |0 = No key event. + * | | |1 = Corresponding key has a low to high event change. + * | | |Note: + * | | |Hardware will set this bit, and software should clear this bit by writing 1. + * | | |Software can clear RKEYINT (KPISTATUS[3]) by writing 1 bit by bit to this register. + * @var KPI_T::KPIPRESCALDIV + * Offset: 0x28 Pre-scale Divider + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |PRESCALDIV|Pre-scale Divider + * | | |This value is used to divide RESCALE that is set in KPICONF[15:8] + * | | |The prescale divider counter is clocked by the divided crystal clock, xCLOCK + * | | |The number is from 1 to 256. + * | | |E.g. If the crystal clock is 1Mhz then the xCLOCK period is 1us. If the keypad matrix is 3x3. Then, + * | | |each row scan time = xCLOCK x PRESCALE x PrescaleDivider. + * | | |key array scan time = each row scan time x ROWS. + * | | |example scan time for PRESCALE = 0x40, and PrescaleDivider = 0x1F. + * | | |each row scan time = 1us x 65 x 32 = 2.08ms. + * | | |scan time = 2.08 x 3 = 6.24ms. + * | | |Note: + * | | |When PRESCALE (KPICONF[15:8]) is determined, De-bounce sampling cycle should not exceed the half of (PRESCALE x PrescaleDivider), + * | | |in the above example, and if scan row delay cycle is 4 xclock + * | | |The maximum DBCLKSEL(KPICONF[19:16]) should be 1024 x clock, bouncing time is 1ms. + */ + __IO uint32_t KPICONF; /*!< [0x0000] Keypad Configuration Register */ + __IO uint32_t KPI3KCONF; /*!< [0x0004] Keypad 3-keys Configuration Register */ + __IO uint32_t KPISTATUS; /*!< [0x0008] Keypad Status Register */ + __IO uint32_t KPIRSTC; /*!< [0x000c] Keypad Reset Period Control Register */ + __I uint32_t KPIKEST0; /*!< [0x0010] Keypad State Register 0 */ + __I uint32_t KPIKEST1; /*!< [0x0014] Keypad State Register 1 */ + __IO uint32_t KPIKPE0; /*!< [0x0018] Lower 32 Key Press Event Indicator */ + __IO uint32_t KPIKPE1; /*!< [0x001c] Upper 32 Key Press Event Indicator */ + __IO uint32_t KPIKRE0; /*!< [0x0020] Lower 32 Key Release Event Indicator */ + __IO uint32_t KPIKRE1; /*!< [0x0024] Upper 32 Key Release Event Indicator */ + __IO uint32_t KPIPRESCALDIV; /*!< [0x0028] Pre-scale Divider */ + +} KPI_T; + +/** + @addtogroup KPI_CONST KPI Bit Field Definition + Constant Definitions for KPI Controller +@{ */ + +#define KPI_KPICONF_ENKP_Pos (0) /*!< KPI_T::KPICONF: ENKP Position */ +#define KPI_KPICONF_ENKP_Msk (0x1ul << KPI_KPICONF_ENKP_Pos) /*!< KPI_T::KPICONF: ENKP Mask */ + +#define KPI_KPICONF_PKINTEN_Pos (1) /*!< KPI_T::KPICONF: PKINTEN Position */ +#define KPI_KPICONF_PKINTEN_Msk (0x1ul << KPI_KPICONF_PKINTEN_Pos) /*!< KPI_T::KPICONF: PKINTEN Mask */ + +#define KPI_KPICONF_RKINTEN_Pos (2) /*!< KPI_T::KPICONF: RKINTEN Position */ +#define KPI_KPICONF_RKINTEN_Msk (0x1ul << KPI_KPICONF_RKINTEN_Pos) /*!< KPI_T::KPICONF: RKINTEN Mask */ + +#define KPI_KPICONF_INTEN_Pos (3) /*!< KPI_T::KPICONF: INTEN Position */ +#define KPI_KPICONF_INTEN_Msk (0x1ul << KPI_KPICONF_INTEN_Pos) /*!< KPI_T::KPICONF: INTEN Mask */ + +#define KPI_KPICONF_WAKEUP_Pos (5) /*!< KPI_T::KPICONF: WAKEUP Position */ +#define KPI_KPICONF_WAKEUP_Msk (0x1ul << KPI_KPICONF_WAKEUP_Pos) /*!< KPI_T::KPICONF: WAKEUP Mask */ + +#define KPI_KPICONF_PRESCALE_Pos (8) /*!< KPI_T::KPICONF: PRESCALE Position */ +#define KPI_KPICONF_PRESCALE_Msk (0xfful << KPI_KPICONF_PRESCALE_Pos) /*!< KPI_T::KPICONF: PRESCALE Mask */ + +#define KPI_KPICONF_DBCLKSEL_Pos (16) /*!< KPI_T::KPICONF: DBCLKSEL Position */ +#define KPI_KPICONF_DBCLKSEL_Msk (0xful << KPI_KPICONF_DBCLKSEL_Pos) /*!< KPI_T::KPICONF: DBCLKSEL Mask */ + +#define KPI_KPICONF_SCANROWD_Pos (22) /*!< KPI_T::KPICONF: SCANROWD Position */ +#define KPI_KPICONF_SCANROWD_Msk (0x3ul << KPI_KPICONF_SCANROWD_Pos) /*!< KPI_T::KPICONF: SCANROWD Mask */ + +#define KPI_KPICONF_KCOL_Pos (24) /*!< KPI_T::KPICONF: KCOL Position */ +#define KPI_KPICONF_KCOL_Msk (0x7ul << KPI_KPICONF_KCOL_Pos) /*!< KPI_T::KPICONF: KCOL Mask */ + +#define KPI_KPICONF_KROW_Pos (28) /*!< KPI_T::KPICONF: KROW Position */ +#define KPI_KPICONF_KROW_Msk (0x7ul << KPI_KPICONF_KROW_Pos) /*!< KPI_T::KPICONF: KROW Mask */ + +#define KPI_KPI3KCONF_K30C_Pos (0) /*!< KPI_T::KPI3KCONF: K30C Position */ +#define KPI_KPI3KCONF_K30C_Msk (0x7ul << KPI_KPI3KCONF_K30C_Pos) /*!< KPI_T::KPI3KCONF: K30C Mask */ + +#define KPI_KPI3KCONF_K30R_Pos (3) /*!< KPI_T::KPI3KCONF: K30R Position */ +#define KPI_KPI3KCONF_K30R_Msk (0x7ul << KPI_KPI3KCONF_K30R_Pos) /*!< KPI_T::KPI3KCONF: K30R Mask */ + +#define KPI_KPI3KCONF_K31C_Pos (8) /*!< KPI_T::KPI3KCONF: K31C Position */ +#define KPI_KPI3KCONF_K31C_Msk (0x7ul << KPI_KPI3KCONF_K31C_Pos) /*!< KPI_T::KPI3KCONF: K31C Mask */ + +#define KPI_KPI3KCONF_K31R_Pos (11) /*!< KPI_T::KPI3KCONF: K31R Position */ +#define KPI_KPI3KCONF_K31R_Msk (0x7ul << KPI_KPI3KCONF_K31R_Pos) /*!< KPI_T::KPI3KCONF: K31R Mask */ + +#define KPI_KPI3KCONF_K32C_Pos (16) /*!< KPI_T::KPI3KCONF: K32C Position */ +#define KPI_KPI3KCONF_K32C_Msk (0x7ul << KPI_KPI3KCONF_K32C_Pos) /*!< KPI_T::KPI3KCONF: K32C Mask */ + +#define KPI_KPI3KCONF_K32R_Pos (19) /*!< KPI_T::KPI3KCONF: K32R Position */ +#define KPI_KPI3KCONF_K32R_Msk (0x7ul << KPI_KPI3KCONF_K32R_Pos) /*!< KPI_T::KPI3KCONF: K32R Mask */ + +#define KPI_KPI3KCONF_EN3KYRST_Pos (24) /*!< KPI_T::KPI3KCONF: EN3KYRST Position */ +#define KPI_KPI3KCONF_EN3KYRST_Msk (0x1ul << KPI_KPI3KCONF_EN3KYRST_Pos) /*!< KPI_T::KPI3KCONF: EN3KYRST Mask */ + +#define KPI_KPISTATUS_PDWAKE_Pos (0) /*!< KPI_T::KPISTATUS: PDWAKE Position */ +#define KPI_KPISTATUS_PDWAKE_Msk (0x1ul << KPI_KPISTATUS_PDWAKE_Pos) /*!< KPI_T::KPISTATUS: PDWAKE Mask */ + +#define KPI_KPISTATUS_RST3KEY_Pos (1) /*!< KPI_T::KPISTATUS: RST3KEY Position */ +#define KPI_KPISTATUS_RST3KEY_Msk (0x1ul << KPI_KPISTATUS_RST3KEY_Pos) /*!< KPI_T::KPISTATUS: RST3KEY Mask */ + +#define KPI_KPISTATUS_KEYINT_Pos (2) /*!< KPI_T::KPISTATUS: KEYINT Position */ +#define KPI_KPISTATUS_KEYINT_Msk (0x1ul << KPI_KPISTATUS_KEYINT_Pos) /*!< KPI_T::KPISTATUS: KEYINT Mask */ + +#define KPI_KPISTATUS_RKEYINT_Pos (3) /*!< KPI_T::KPISTATUS: RKEYINT Position */ +#define KPI_KPISTATUS_RKEYINT_Msk (0x1ul << KPI_KPISTATUS_RKEYINT_Pos) /*!< KPI_T::KPISTATUS: RKEYINT Mask */ + +#define KPI_KPISTATUS_PKEYINT_Pos (4) /*!< KPI_T::KPISTATUS: PKEYINT Position */ +#define KPI_KPISTATUS_PKEYINT_Msk (0x1ul << KPI_KPISTATUS_PKEYINT_Pos) /*!< KPI_T::KPISTATUS: PKEYINT Mask */ + +#define KPI_KPIRSTC_RSTC_Pos (0) /*!< KPI_T::KPIRSTC: RSTC Position */ +#define KPI_KPIRSTC_RSTC_Msk (0xfful << KPI_KPIRSTC_RSTC_Pos) /*!< KPI_T::KPIRSTC: RSTC Mask */ + +#define KPI_KPIKEST0_KESTmn_Pos (0) /*!< KPI_T::KPIKEST0: KESTmn Position */ +#define KPI_KPIKEST0_KESTmn_Msk (0xfffffffful << KPI_KPIKEST0_KESTmn_Pos) /*!< KPI_T::KPIKEST0: KESTmn Mask */ + +#define KPI_KPIKEST1_KESTmn_Pos (0) /*!< KPI_T::KPIKEST1: KESTmn Position */ +#define KPI_KPIKEST1_KESTmn_Msk (0xfffful << KPI_KPIKEST1_KESTmn_Pos) /*!< KPI_T::KPIKEST1: KESTmn Mask */ + +#define KPI_KPIKPE0_KPEmn_Pos (0) /*!< KPI_T::KPIKPE0: KPEmn Position */ +#define KPI_KPIKPE0_KPEmn_Msk (0xfffffffful << KPI_KPIKPE0_KPEmn_Pos) /*!< KPI_T::KPIKPE0: KPEmn Mask */ + +#define KPI_KPIKPE1_KPEmn_Pos (0) /*!< KPI_T::KPIKPE1: KPEmn Position */ +#define KPI_KPIKPE1_KPEmn_Msk (0xfffful << KPI_KPIKPE1_KPEmn_Pos) /*!< KPI_T::KPIKPE1: KPEmn Mask */ + +#define KPI_KPIKRE0_KREmn_Pos (0) /*!< KPI_T::KPIKRE0: KREmn Position */ +#define KPI_KPIKRE0_KREmn_Msk (0xfffffffful << KPI_KPIKRE0_KREmn_Pos) /*!< KPI_T::KPIKRE0: KREmn Mask */ + +#define KPI_KPIKRE1_KREmn_Pos (0) /*!< KPI_T::KPIKRE1: KREmn Position */ +#define KPI_KPIKRE1_KREmn_Msk (0xfffful << KPI_KPIKRE1_KREmn_Pos) /*!< KPI_T::KPIKRE1: KREmn Mask */ + +#define KPI_KPIPRESCALDIV_PRESCALDIV_Pos (0) /*!< KPI_T::KPIPRESCALDIV: PRESCALDIV Position*/ +#define KPI_KPIPRESCALDIV_PRESCALDIV_Msk (0xfful << KPI_KPIPRESCALDIV_PRESCALDIV_Pos) /*!< KPI_T::KPIPRESCALDIV: PRESCALDIV Mask */ + +/**@}*/ /* KPI_CONST */ +/**@}*/ /* end of KPI register group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __KPI_REG_H__ */ + + diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ks_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ks_reg.h new file mode 100644 index 0000000000..a3aac30c73 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ks_reg.h @@ -0,0 +1,473 @@ +/**************************************************************************//** + * @file ks_reg.h + * @brief Key Store register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __KS_REG_H__ +#define __KS_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/*---------------------- Key Store -------------------------*/ +/** + @addtogroup KS Key Store(KS) + Memory Mapped Structure for KS Controller +@{ */ + +typedef struct +{ + + + /** + * @var KS_T::CTL + * Offset: 0x00 Key Store Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |START |Key Store Start Control Bit + * | | |0 = No operation. + * | | |1 = Start the operation. + * |[3:1] |OPMODE |Key Store Operation Mode + * | | |000 = Read operation. + * | | |001 = Create operation. + * | | |010 = Erase one key operation. + * | | |011 = Erase all keys operation (only for SRAM). + * | | |100 = Revoke key operation. + * | | |101 = Data Remanence prevention operation (only for SRAM). + * | | |Others = reserved. + * |[7] |CONT |Read/Write Key Continue Bit + * | | |0 = Read/Write key operation is not continuous to previous operation. + * | | |1 = Read/Write key operation is continuous to previous operation. + * |[8] |INIT |Key Store Initialization + * | | |User should check BUSY(KS_STS[2]) is 0, and then write 1 to this bit and START(KS_CTL[0[), Key Store will start initialization. + * | | |After the Key Store is initialized, INIT will be cleared. + * |[10] |SILENT |Silent Access Enable Bit + * | | |0 = Silent access Disabled. + * | | |1 = Silent access Enabled. + * |[11] |SCMB |Data Scramble Enable Bit + * | | |0 = Data scramble Disabled. + * | | |1 = Data scramble Enabled. + * |[14] |TCLR |Tamper Event Clear Control Bit + * | | |0 = Key Store does not clear all keys at SRAM and revoke all OTP keys when tamper event occurs. + * | | |1 = Key Store clears all keys at SRAM and revoke all OTP keys when tamper event occurs. + * |[15] |IEN |Key Store Interrupt Enable Bit + * | | |0 = Key Store interrupt Disabled. + * | | |1 = Key Store interrupt Enabled. + * @var KS_T::METADATA + * Offset: 0x04 Key Store Metadata Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SEC |Secure Key Selection Bit + * | | |0 = Set key as the non-secure key. + * | | |1 = Set key as the secure key. + * |[2] |READABLE |Key Readable Control Bit + * | | |0 = key is un-readable. + * | | |1 = key is readable. + * |[3] |RVK |Key Revoke Control Bit + * | | |0 = Key current selected will not be changed. + * | | |1 = key current selected will be change to revoked state. + * |[4] |BS |Booting State Selection Bit + * | | |0 = Set key used at all state. + * | | |1 = Set key used at boot loader state 1 (BL1 state). + * |[12:8] |SIZE |Key Size Selection Bits + * | | |00000 = 128 bits. + * | | |00001 = 163 bits. + * | | |00010 = 192 bits. + * | | |00011 = 224 bits. + * | | |00100 = 233 bits. + * | | |00101 = 255 bits. + * | | |00110 = 256 bits. + * | | |00111 = 283 bits. + * | | |01000 = 384 bits. + * | | |01001 = 409 bits. + * | | |01010 = 512 bits. + * | | |01011 = 521 bits. + * | | |01100 = 571 bits. + * | | |10000 = 1024 bits. + * | | |10001 = 1536 bits. + * | | |10010 = 2048 bits. + * | | |10011 = 3072 bits. + * | | |10100 = 4096 bits. + * | | |Others = reserved. + * |[18:16] |OWNER |Key Owner Selection Bits + * | | |000 = AES. + * | | |001 = HMAC. + * | | |010 = RSA exponent blind key for SCAP(CRYPTO_RSA_CTL[8]) = 1 and CRT(CRYPTO_RSA_CTL[2]) = 0 . + * | | |011 = RSA middle data, p, q and private key. + * | | |100 = ECC. + * | | |101 = CPU. + * | | |Others = reserved. + * |[25:20] |NUMBER |Key Number + * | | |Before read or erase one key operation is started, user should write the key number to be operated + * | | |When create operation is finished, user can read these bits to get its key number. + * |[31:30] |DST |Key Location Selection Bits + * | | |00 = Key is in SRAM. + * | | |10 = Key is in OTP. + * | | |Others = reserved. + * @var KS_T::STS + * Offset: 0x08 Key Store Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |IF |Key Store Finish Interrupt Flag (Write 1 to Clear) + * | | |This bit is cleared by writing 1 and it has no effect by writing 0. + * | | |0 = No Key Store interrupt. + * | | |1 = Key Store operation done interrupt. + * |[1] |EIF |Key Store Error Flag (Write 1 to Clear) + * | | |This bit is cleared by writing 1 and it has no effect by writing 0. + * | | |0 = No Key Store error. + * | | |1 = Key Store error interrupt. + * |[2] |BUSY |Key Store Busy Flag (Read Only) + * | | |0 = Key Store is idle or finished. + * | | |1 = Key Store is busy. + * |[3] |SRAMFULL |Key Storage at SRAM Full Status Bit (Read Only) + * | | |0 = Key Storage at SRAM is not full. + * | | |1 = Key Storage at SRAM is full. + * |[7] |INITDONE |Key Store Initialization Done Status (Read Only) + * | | |0 = Key Store is un-initialized. + * | | |1 = Key Store is initialized. + * |[8] |RAMINV |Key Store SRAM Invert Status (Read Only) + * | | |0 = Key Store key in SRAM is normal. + * | | |1 = Key Store key in SRAM is inverted. + * @var KS_T::REMAIN + * Offset: 0x0C Key Store Remaining Space Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[12:0] |RRMNG |Key Store SRAM Remaining Space + * | | |The RRMNG shows the remaining byte count space of SRAM + * @var KS_T::SCMBKEY0 + * Offset: 0x10 Key Store Scramble Key Word 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCMBKEY |Key Store Scramble Key + * | | |When SCMB(KS_CTL[]) is set to 1, user should write the scramble key in this register before new key stores in Key Store + * | | |If user does not write the scramble key in this register, the Key Store will use previous scramble key to execute data scramble function. + * @var KS_T::SCMBKEY1 + * Offset: 0x14 Key Store Scramble Key Word 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCMBKEY |Key Store Scramble Key + * | | |When SCMB(KS_CTL[]) is set to 1, user should write the scramble key in this register before new key stores in Key Store + * | | |If user does not write the scramble key in this register, the Key Store will use previous scramble key to execute data scramble function. + * @var KS_T::SCMBKEY2 + * Offset: 0x18 Key Store Scramble Key Word 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCMBKEY |Key Store Scramble Key + * | | |When SCMB(KS_CTL[]) is set to 1, user should write the scramble key in this register before new key stores in Key Store + * | | |If user does not write the scramble key in this register, the Key Store will use previous scramble key to execute data scramble function. + * @var KS_T::SCMBKEY3 + * Offset: 0x1C Key Store Scramble Key Word 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SCMBKEY |Key Store Scramble Key + * | | |When SCMB(KS_CTL[]) is set to 1, user should write the scramble key in this register before new key stores in Key Store + * | | |If user does not write the scramble key in this register, the Key Store will use previous scramble key to execute data scramble function. + * @var KS_T::KEY0 + * Offset: 0x20 Key Store Entry Key Word 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Key Data (Read/Write, Read to Clear) + * | | |These registers will be cleared if Key Store executes the write operation or CPU completes the reading key. + * @var KS_T::KEY1 + * Offset: 0x24 Key Store Entry Key Word 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Key Data (Read/Write, Read to Clear) + * | | |These registers will be cleared if Key Store executes the write operation or CPU completes the reading key. + * @var KS_T::KEY2 + * Offset: 0x28 Key Store Entry Key Word 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Key Data (Read/Write, Read to Clear) + * | | |These registers will be cleared if Key Store executes the write operation or CPU completes the reading key. + * @var KS_T::KEY3 + * Offset: 0x2C Key Store Entry Key Word 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Key Data (Read/Write, Read to Clear) + * | | |These registers will be cleared if Key Store executes the write operation or CPU completes the reading key. + * @var KS_T::KEY4 + * Offset: 0x30 Key Store Entry Key Word 4 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Key Data (Read/Write, Read to Clear) + * | | |These registers will be cleared if Key Store executes the write operation or CPU completes the reading key. + * @var KS_T::KEY5 + * Offset: 0x34 Key Store Entry Key Word 5 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Key Data (Read/Write, Read to Clear) + * | | |These registers will be cleared if Key Store executes the write operation or CPU completes the reading key. + * @var KS_T::KEY6 + * Offset: 0x38 Key Store Entry Key Word 6 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Key Data (Read/Write, Read to Clear) + * | | |These registers will be cleared if Key Store executes the write operation or CPU completes the reading key. + * @var KS_T::KEY7 + * Offset: 0x3C Key Store Entry Key Word 7 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |KEY |Key Data (Read/Write, Read to Clear) + * | | |These registers will be cleared if Key Store executes the write operation or CPU completes the reading key. + * @var KS_T::OTPSTS + * Offset: 0x40 Key Store OTP Keys Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |KEY0 |OTP Key 0 Used Status + * | | |0 = OTP key 0 is unused. + * | | |1 = OTP key 0 is used. + * | | |Note: When chip is in RMA stage, this bit will be set to 1 and key is revoked after initialization if key is existed. + * |[1] |KEY1 |OTP Key 1 Used Status + * | | |0 = OTP key 1 is unused. + * | | |1 = OTP key 1 is used. + * | | |Note: When chip is in RMA stage, this bit will be set to 1 and key is revoked after initialization if key is existed. + * |[2] |KEY2 |OTP Key 2 Used Status + * | | |0 = OTP key 2 is unused. + * | | |1 = OTP key 2 is used. + * | | |Note: When chip is in RMA stage, this bit will be set to 1 and key is revoked after initialization if key is existed. + * |[3] |KEY3 |OTP Key 3 Used Status + * | | |0 = OTP key 3 is unused. + * | | |1 = OTP key 3 is used. + * | | |Note: When chip is in RMA stage, this bit will be set to 1 and key is revoked after initialization if key is existed. + * |[4] |KEY4 |OTP Key 4 Used Status + * | | |0 = OTP key 4 is unused. + * | | |1 = OTP key 4 is used. + * | | |Note: When chip is in RMA stage, this bit will be set to 1 and key is revoked after initialization if key is existed. + * |[5] |KEY5 |OTP Key 5 Used Status + * | | |0 = OTP key 5 is unused. + * | | |1 = OTP key 5 is used. + * | | |Note: When chip is in RMA stage, this bit will be set to 1 and key is revoked after initialization if key is existed. + * |[6] |KEY6 |OTP Key 6 Used Status + * | | |0 = OTP key 6 is unused. + * | | |1 = OTP key 6 is used. + * | | |Note: When chip is in RMA stage, this bit will be set to 1 and key is revoked after initialization if key is existed. + * |[7] |KEY7 |OTP Key 7 Used Status + * | | |0 = OTP key 7 is unused. + * | | |1 = OTP key 7 is used. + * | | |Note: When chip is in RMA stage, this bit will be set to 1 and key is revoked after initialization if key is existed. + * |[8] |KEY8 |OTP Key 8 Used Status + * | | |0 = OTP key 8 is unused. + * | | |1 = OTP key 8 is used. + * | | |Note: When chip is in RMA stage, this bit will be set to 1 and key is revoked after initialization if key is existed. + * @var KS_T::REMKCNT + * Offset: 0x44 Key Store Remaining Key Count Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |RRMKCNT |Key Store SRAM Remaining Key Count + * | | |The RRMKCNT shows the remaining key count for SRAM. + */ + __IO uint32_t CTL; /*!< [0x0000] Key Store Control Register */ + __IO uint32_t METADATA; /*!< [0x0004] Key Store Metadata Register */ + __IO uint32_t STS; /*!< [0x0008] Key Store Status Register */ + __I uint32_t REMAIN; /*!< [0x000c] Key Store Remaining Space Register */ + __IO uint32_t SCMBKEY0; /*!< [0x0010] Key Store Scramble Key Word 0 Register */ + __IO uint32_t SCMBKEY1; /*!< [0x0014] Key Store Scramble Key Word 1 Register */ + __IO uint32_t SCMBKEY2; /*!< [0x0018] Key Store Scramble Key Word 2 Register */ + __IO uint32_t SCMBKEY3; /*!< [0x001c] Key Store Scramble Key Word 3 Register */ + __IO uint32_t KEY0; /*!< [0x0020] Key Store Entry Key Word 0 Register */ + __IO uint32_t KEY1; /*!< [0x0024] Key Store Entry Key Word 1 Register */ + __IO uint32_t KEY2; /*!< [0x0028] Key Store Entry Key Word 2 Register */ + __IO uint32_t KEY3; /*!< [0x002c] Key Store Entry Key Word 3 Register */ + __IO uint32_t KEY4; /*!< [0x0030] Key Store Entry Key Word 4 Register */ + __IO uint32_t KEY5; /*!< [0x0034] Key Store Entry Key Word 5 Register */ + __IO uint32_t KEY6; /*!< [0x0038] Key Store Entry Key Word 6 Register */ + __IO uint32_t KEY7; /*!< [0x003c] Key Store Entry Key Word 7 Register */ + __I uint32_t OTPSTS; /*!< [0x0040] Key Store OTP Keys Status Register */ + __I uint32_t REMKCNT; /*!< [0x0044] Key Store Remaining Key Count Register */ +} KS_T; + +typedef struct +{ + __IO uint32_t CTL; /*!< [0x0000] Key Store Control Register */ + __IO uint32_t METADATA; /*!< [0x0004] Key Store Metadata Register */ + __IO uint32_t STS; /*!< [0x0008] Key Store Status Register */ + __I uint32_t REMAIN; /*!< [0x000c] Key Store Remaining Space Register */ + __I uint32_t RESERVE0[4]; + __IO uint32_t KEY0; /*!< [0x0020] Key Store Entry Key Word 0 Register */ + __IO uint32_t KEY1; /*!< [0x0024] Key Store Entry Key Word 1 Register */ + __IO uint32_t KEY2; /*!< [0x0028] Key Store Entry Key Word 2 Register */ + __IO uint32_t KEY3; /*!< [0x002c] Key Store Entry Key Word 3 Register */ + __IO uint32_t KEY4; /*!< [0x0030] Key Store Entry Key Word 4 Register */ + __IO uint32_t KEY5; /*!< [0x0034] Key Store Entry Key Word 5 Register */ + __IO uint32_t KEY6; /*!< [0x0038] Key Store Entry Key Word 6 Register */ + __IO uint32_t KEY7; /*!< [0x003c] Key Store Entry Key Word 7 Register */ + __I uint32_t OTPSTS; /*!< [0x0040] Key Store OTP Keys Status Register */ + __I uint32_t REMKCNT; /*!< [0x0044] Key Store Remaining Key Count Register */ +} NS_KS_T; + +/** + @addtogroup KS_CONST KS Bit Field Definition + Constant Definitions for KS Controller +@{ */ + +#define KS_CTL_START_Pos (0) /*!< KS_T::CTL: START Position */ +#define KS_CTL_START_Msk (0x1ul << KS_CTL_START_Pos) /*!< KS_T::CTL: START Mask */ + +#define KS_CTL_OPMODE_Pos (1) /*!< KS_T::CTL: OPMODE Position */ +#define KS_CTL_OPMODE_Msk (0x7ul << KS_CTL_OPMODE_Pos) /*!< KS_T::CTL: OPMODE Mask */ + +#define KS_CTL_CONT_Pos (7) /*!< KS_T::CTL: CONT Position */ +#define KS_CTL_CONT_Msk (0x1ul << KS_CTL_CONT_Pos) /*!< KS_T::CTL: CONT Mask */ + +#define KS_CTL_INIT_Pos (8) /*!< KS_T::CTL: INIT Position */ +#define KS_CTL_INIT_Msk (0x1ul << KS_CTL_INIT_Pos) /*!< KS_T::CTL: INIT Mask */ + +#define KS_CTL_SILENT_Pos (10) /*!< KS_T::CTL: SILENT Position */ +#define KS_CTL_SILENT_Msk (0x1ul << KS_CTL_SILENT_Pos) /*!< KS_T::CTL: SILENT Mask */ + +#define KS_CTL_SCMB_Pos (11) /*!< KS_T::CTL: SCMB Position */ +#define KS_CTL_SCMB_Msk (0x1ul << KS_CTL_SCMB_Pos) /*!< KS_T::CTL: SCMB Mask */ + +#define KS_CTL_TCLR_Pos (14) /*!< KS_T::CTL: TCLR Position */ +#define KS_CTL_TCLR_Msk (0x1ul << KS_CTL_TCLR_Pos) /*!< KS_T::CTL: TCLR Mask */ + +#define KS_CTL_IEN_Pos (15) /*!< KS_T::CTL: IEN Position */ +#define KS_CTL_IEN_Msk (0x1ul << KS_CTL_IEN_Pos) /*!< KS_T::CTL: IEN Mask */ + +#define KS_METADATA_SEC_Pos (0) /*!< KS_T::METADATA: SEC Position */ +#define KS_METADATA_SEC_Msk (0x1ul << KS_METADATA_SEC_Pos) /*!< KS_T::METADATA: SEC Mask */ + +#define KS_METADATA_READABLE_Pos (2) /*!< KS_T::METADATA: READABLE Position */ +#define KS_METADATA_READABLE_Msk (0x1ul << KS_METADATA_READABLE_Pos) /*!< KS_T::METADATA: READABLE Mask */ + +#define KS_METADATA_RVK_Pos (3) /*!< KS_T::METADATA: RVK Position */ +#define KS_METADATA_RVK_Msk (0x1ul << KS_METADATA_RVK_Pos) /*!< KS_T::METADATA: RVK Mask */ + +#define KS_METADATA_BS_Pos (4) /*!< KS_T::METADATA: BS Position */ +#define KS_METADATA_BS_Msk (0x1ul << KS_METADATA_BS_Pos) /*!< KS_T::METADATA: BS Mask */ + +#define KS_METADATA_SIZE_Pos (8) /*!< KS_T::METADATA: SIZE Position */ +#define KS_METADATA_SIZE_Msk (0x1ful << KS_METADATA_SIZE_Pos) /*!< KS_T::METADATA: SIZE Mask */ + +#define KS_METADATA_OWNER_Pos (16) /*!< KS_T::METADATA: OWNER Position */ +#define KS_METADATA_OWNER_Msk (0x7ul << KS_METADATA_OWNER_Pos) /*!< KS_T::METADATA: OWNER Mask */ + +#define KS_METADATA_NUMBER_Pos (20) /*!< KS_T::METADATA: NUMBER Position */ +#define KS_METADATA_NUMBER_Msk (0x3ful << KS_METADATA_NUMBER_Pos) /*!< KS_T::METADATA: NUMBER Mask */ + +#define KS_METADATA_DST_Pos (30) /*!< KS_T::METADATA: DST Position */ +#define KS_METADATA_DST_Msk (0x3ul << KS_METADATA_DST_Pos) /*!< KS_T::METADATA: DST Mask */ + +#define KS_STS_IF_Pos (0) /*!< KS_T::STS: IF Position */ +#define KS_STS_IF_Msk (0x1ul << KS_STS_IF_Pos) /*!< KS_T::STS: IF Mask */ + +#define KS_STS_EIF_Pos (1) /*!< KS_T::STS: EIF Position */ +#define KS_STS_EIF_Msk (0x1ul << KS_STS_EIF_Pos) /*!< KS_T::STS: EIF Mask */ + +#define KS_STS_BUSY_Pos (2) /*!< KS_T::STS: BUSY Position */ +#define KS_STS_BUSY_Msk (0x1ul << KS_STS_BUSY_Pos) /*!< KS_T::STS: BUSY Mask */ + +#define KS_STS_SRAMFULL_Pos (3) /*!< KS_T::STS: SRAMFULL Position */ +#define KS_STS_SRAMFULL_Msk (0x1ul << KS_STS_SRAMFULL_Pos) /*!< KS_T::STS: SRAMFULL Mask */ + +#define KS_STS_INITDONE_Pos (7) /*!< KS_T::STS: INITDONE Position */ +#define KS_STS_INITDONE_Msk (0x1ul << KS_STS_INITDONE_Pos) /*!< KS_T::STS: INITDONE Mask */ + +#define KS_STS_RAMINV_Pos (8) /*!< KS_T::STS: RAMINV Position */ +#define KS_STS_RAMINV_Msk (0x1ul << KS_STS_RAMINV_Pos) /*!< KS_T::STS: RAMINV Mask */ + +#define KS_REMAIN_RRMNG_Pos (0) /*!< KS_T::REMAIN: RRMNG Position */ +#define KS_REMAIN_RRMNG_Msk (0x1ffful << KS_REMAIN_RRMNG_Pos) /*!< KS_T::REMAIN: RRMNG Mask */ + +#define KS_SCMBKEY0_SCMBKEY_Pos (0) /*!< KS_T::SCMBKEY0: SCMBKEY Position */ +#define KS_SCMBKEY0_SCMBKEY_Msk (0xfffffffful << KS_SCMBKEY0_SCMBKEY_Pos) /*!< KS_T::SCMBKEY0: SCMBKEY Mask */ + +#define KS_SCMBKEY1_SCMBKEY_Pos (0) /*!< KS_T::SCMBKEY1: SCMBKEY Position */ +#define KS_SCMBKEY1_SCMBKEY_Msk (0xfffffffful << KS_SCMBKEY1_SCMBKEY_Pos) /*!< KS_T::SCMBKEY1: SCMBKEY Mask */ + +#define KS_SCMBKEY2_SCMBKEY_Pos (0) /*!< KS_T::SCMBKEY2: SCMBKEY Position */ +#define KS_SCMBKEY2_SCMBKEY_Msk (0xfffffffful << KS_SCMBKEY2_SCMBKEY_Pos) /*!< KS_T::SCMBKEY2: SCMBKEY Mask */ + +#define KS_SCMBKEY3_SCMBKEY_Pos (0) /*!< KS_T::SCMBKEY3: SCMBKEY Position */ +#define KS_SCMBKEY3_SCMBKEY_Msk (0xfffffffful << KS_SCMBKEY3_SCMBKEY_Pos) /*!< KS_T::SCMBKEY3: SCMBKEY Mask */ + +#define KS_KEY0_KEY_Pos (0) /*!< KS_T::KEY0: KEY Position */ +#define KS_KEY0_KEY_Msk (0xfffffffful << KS_KEY0_KEY_Pos) /*!< KS_T::KEY0: KEY Mask */ + +#define KS_KEY1_KEY_Pos (0) /*!< KS_T::KEY1: KEY Position */ +#define KS_KEY1_KEY_Msk (0xfffffffful << KS_KEY1_KEY_Pos) /*!< KS_T::KEY1: KEY Mask */ + +#define KS_KEY2_KEY_Pos (0) /*!< KS_T::KEY2: KEY Position */ +#define KS_KEY2_KEY_Msk (0xfffffffful << KS_KEY2_KEY_Pos) /*!< KS_T::KEY2: KEY Mask */ + +#define KS_KEY3_KEY_Pos (0) /*!< KS_T::KEY3: KEY Position */ +#define KS_KEY3_KEY_Msk (0xfffffffful << KS_KEY3_KEY_Pos) /*!< KS_T::KEY3: KEY Mask */ + +#define KS_KEY4_KEY_Pos (0) /*!< KS_T::KEY4: KEY Position */ +#define KS_KEY4_KEY_Msk (0xfffffffful << KS_KEY4_KEY_Pos) /*!< KS_T::KEY4: KEY Mask */ + +#define KS_KEY5_KEY_Pos (0) /*!< KS_T::KEY5: KEY Position */ +#define KS_KEY5_KEY_Msk (0xfffffffful << KS_KEY5_KEY_Pos) /*!< KS_T::KEY5: KEY Mask */ + +#define KS_KEY6_KEY_Pos (0) /*!< KS_T::KEY6: KEY Position */ +#define KS_KEY6_KEY_Msk (0xfffffffful << KS_KEY6_KEY_Pos) /*!< KS_T::KEY6: KEY Mask */ + +#define KS_KEY7_KEY_Pos (0) /*!< KS_T::KEY7: KEY Position */ +#define KS_KEY7_KEY_Msk (0xfffffffful << KS_KEY7_KEY_Pos) /*!< KS_T::KEY7: KEY Mask */ + +#define KS_OTPSTS_KEY0_Pos (0) /*!< KS_T::OTPSTS: KEY0 Position */ +#define KS_OTPSTS_KEY0_Msk (0x1ul << KS_OTPSTS_KEY0_Pos) /*!< KS_T::OTPSTS: KEY0 Mask */ + +#define KS_OTPSTS_KEY1_Pos (1) /*!< KS_T::OTPSTS: KEY1 Position */ +#define KS_OTPSTS_KEY1_Msk (0x1ul << KS_OTPSTS_KEY1_Pos) /*!< KS_T::OTPSTS: KEY1 Mask */ + +#define KS_OTPSTS_KEY2_Pos (2) /*!< KS_T::OTPSTS: KEY2 Position */ +#define KS_OTPSTS_KEY2_Msk (0x1ul << KS_OTPSTS_KEY2_Pos) /*!< KS_T::OTPSTS: KEY2 Mask */ + +#define KS_OTPSTS_KEY3_Pos (3) /*!< KS_T::OTPSTS: KEY3 Position */ +#define KS_OTPSTS_KEY3_Msk (0x1ul << KS_OTPSTS_KEY3_Pos) /*!< KS_T::OTPSTS: KEY3 Mask */ + +#define KS_OTPSTS_KEY4_Pos (4) /*!< KS_T::OTPSTS: KEY4 Position */ +#define KS_OTPSTS_KEY4_Msk (0x1ul << KS_OTPSTS_KEY4_Pos) /*!< KS_T::OTPSTS: KEY4 Mask */ + +#define KS_OTPSTS_KEY5_Pos (5) /*!< KS_T::OTPSTS: KEY5 Position */ +#define KS_OTPSTS_KEY5_Msk (0x1ul << KS_OTPSTS_KEY5_Pos) /*!< KS_T::OTPSTS: KEY5 Mask */ + +#define KS_OTPSTS_KEY6_Pos (6) /*!< KS_T::OTPSTS: KEY6 Position */ +#define KS_OTPSTS_KEY6_Msk (0x1ul << KS_OTPSTS_KEY6_Pos) /*!< KS_T::OTPSTS: KEY6 Mask */ + +#define KS_OTPSTS_KEY7_Pos (7) /*!< KS_T::OTPSTS: KEY7 Position */ +#define KS_OTPSTS_KEY7_Msk (0x1ul << KS_OTPSTS_KEY7_Pos) /*!< KS_T::OTPSTS: KEY7 Mask */ + +#define KS_OTPSTS_KEY8_Pos (8) /*!< KS_T::OTPSTS: KEY8 Position */ +#define KS_OTPSTS_KEY8_Msk (0x1ul << KS_OTPSTS_KEY8_Pos) /*!< KS_T::OTPSTS: KEY8 Mask */ + +#define KS_REMKCNT_RRMKCNT_Pos (0) /*!< KS_T::REMKCNT: RRMKCNT Position */ +#define KS_REMKCNT_RRMKCNT_Msk (0x3ful << KS_REMKCNT_RRMKCNT_Pos) /*!< KS_T::REMKCNT: RRMKCNT Mask */ + +/**@}*/ /* KS_CONST */ +/**@}*/ /* end of KS register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __KS_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ma35d1.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ma35d1.h new file mode 100644 index 0000000000..0481d1ee39 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ma35d1.h @@ -0,0 +1,1050 @@ +/**************************************************************************//** + * @file ma35d1.h + * @brief Peripheral access layer header file. + * This file contains all the peripheral register's definitions + * and bits definitions and memory mapping. + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +/** + \mainpage NuMicro MA35D1 Driver Reference Guide + * + * Introduction + * + * This user manual describes the usage of MA35D1 device driver + * + * Disclaimer + * + * The Software is furnished "AS IS", without warranty as to performance or results, and + * the entire risk as to performance or results is assumed by YOU. Nuvoton disclaims all + * warranties, express, implied or otherwise, with regard to the Software, its use, or + * operation, including without limitation any and all warranties of merchantability, fitness + * for a particular purpose, and non-infringement of intellectual property rights. + * + * Important Notice + * + * Nuvoton Products are neither intended nor warranted for usage in systems or equipment, + * any malfunction or failure of which may cause loss of human life, bodily injury or severe + * property damage. Such applications are deemed, "Insecure Usage". + * + * Insecure usage includes, but is not limited to: equipment for surgical implementation, + * atomic energy control instruments, airplane or spaceship instruments, the control or + * operation of dynamic, brake or safety systems designed for vehicular use, traffic signal + * instruments, all types of safety devices, and other applications intended to support or + * sustain life. + * + * All Insecure Usage shall be made at customer's risk, and in the event that third parties + * lay claims to Nuvoton as a result of customer's Insecure Usage, customer shall indemnify + * the damages and liabilities thus incurred by Nuvoton. + * + * Please note that all data and specifications are subject to change without notice. All the + * trademarks of products and companies mentioned in this datasheet belong to their respective + * owners. + * + * Copyright Notice + * + * Copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + */ +#ifndef __MA35D1_H__ +#define __MA35D1_H__ + +#include "rtconfig.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************/ +/* Processor and Core Peripherals */ +/******************************************************************************/ +/** @addtogroup CMSIS_Device Device CMSIS Definitions + Configuration of the Cortex-M4 Processor and Core Peripherals + @{ +*/ + +/** + * @details Interrupt Number Definition. + */ +#if defined(USE_MA35D1_SUBM) +typedef enum IRQn +{ + /****** Cortex-M4 Processor Exceptions Numbers *************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 System Tick Interrupt */ + + /****** ma35d_rtp Specific Interrupt Numbers **************************************************/ + + LVD_IRQn = 0, + PWRWU_IRQn = 2, + HWSEM0_IRQn = 3, + CKFAIL_IRQn = 4, + WHC0_IRQn = 5, + RTC_IRQn = 6, + TAMPER_IRQn = 7, + WDT2_IRQn = 8, + WWDT2_IRQn = 9, + EINT0_IRQn = 10, + EINT1_IRQn = 11, + EINT2_IRQn = 12, + EINT3_IRQn = 13, + GPA_IRQn = 16, + GPB_IRQn = 17, + GPC_IRQn = 18, + GPD_IRQn = 19, + TMR2_IRQn = 22, + TMR3_IRQn = 23, + BRAKE0_IRQn = 24, + EPWM0P0_IRQn = 25, + EPWM0P1_IRQn = 26, + EPWM0P2_IRQn = 27, + QEI0_IRQn = 28, + ECAP0_IRQn = 29, + QSPI1_IRQn = 31, + UART1_IRQn = 35, + UART2_IRQn = 36, + UART3_IRQn = 37, + UART4_IRQn = 38, + UART5_IRQn = 39, + EADC00_IRQn = 40, + EADC01_IRQn = 41, + EADC02_IRQn = 42, + EADC03_IRQn = 43, + I2C1_IRQn = 45, + I2S0_IRQn = 46, + CANFD00_IRQn = 47, + SC0_IRQn = 48, + GPE_IRQn = 49, + GPF_IRQn = 50, + GPG_IRQn = 51, + GPH_IRQn = 52, + GPI_IRQn = 53, + GPJ_IRQn = 54, + TMR4_IRQn = 55, + TMR5_IRQn = 56, + TMR6_IRQn = 57, + TMR7_IRQn = 58, + BRAKE1_IRQn = 59, + EPWM1P0_IRQn = 60, + EPWM1P1_IRQn = 61, + EPWM1P2_IRQn = 62, + QEI1_IRQn = 63, + ECAP1_IRQn = 64, + SPI0_IRQn = 65, + SPI1_IRQn = 66, + PDMA2_IRQn = 67, + PDMA3_IRQn = 68, + UART6_IRQn = 69, + UART7_IRQn = 70, + UART8_IRQn = 71, + UART9_IRQn = 72, + UART10_IRQn = 73, + UART11_IRQn = 74, + I2C2_IRQn = 75, + I2C3_IRQn = 76, + I2S1_IRQn = 77, + CANFD10_IRQn = 78, + SC1_IRQn = 79, + GPK_IRQn = 80, + GPL_IRQn = 81, + GPM_IRQn = 82, + GPN_IRQn = 83, + TMR8_IRQn = 84, + TMR9_IRQn = 85, + TMR10_IRQn = 86, + TMR11_IRQn = 87, + BRAKE2_IRQn = 88, + EPWM2P0_IRQn = 89, + EPWM2P1_IRQn = 90, + EPWM2P2_IRQn = 91, + QEI2_IRQn = 92, + ECAP2_IRQn = 93, + SPI2_IRQn = 94, + SPI3_IRQn = 95, + UART12_IRQn = 96, + UART13_IRQn = 97, + UART14_IRQn = 98, + UART15_IRQn = 99, + UART16_IRQn = 100, + I2C4_IRQn = 101, + I2C5_IRQn = 102, + CANFD20_IRQn = 103, + CANFD30_IRQn = 104, + KPI_IRQn = 105, + CANFD01_IRQn = 106, + CANFD11_IRQn = 107, + CANFD21_IRQn = 108, + CANFD31_IRQn = 109, + ADC0_IRQn = 110, + IRQn_Max = 128, +} +IRQn_Type; + +/* Configuration of the Cortex-M4 Processor and Core Peripherals */ +#define __CM4_REV 0x0201U /*!< Core Revision r2p1 */ +#define __NVIC_PRIO_BITS 4U /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ +#define __MPU_PRESENT 1U /*!< MPU present or not */ +#ifdef __FPU_PRESENT +#undef __FPU_PRESENT +#define __FPU_PRESENT 1U /*!< FPU present or not */ +#else +#define __FPU_PRESENT 1U /*!< FPU present or not */ +#endif + +/*@}*/ /* end of group CMSIS_Device */ + + +#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ +#include "system_ma35d1.h" /* System include file */ +#include + +#else + +typedef enum IRQn +{ + /****** SGI Interrupts Numbers ************************************************/ + SGI0_IRQn = 0, /*!< Software Generated Interrupt 0 */ + SGI1_IRQn = 1, /*!< Software Generated Interrupt 1 */ + SGI2_IRQn = 2, /*!< Software Generated Interrupt 2 */ + SGI3_IRQn = 3, /*!< Software Generated Interrupt 3 */ + SGI4_IRQn = 4, /*!< Software Generated Interrupt 4 */ + SGI5_IRQn = 5, /*!< Software Generated Interrupt 5 */ + SGI6_IRQn = 6, /*!< Software Generated Interrupt 6 */ + SGI7_IRQn = 7, /*!< Software Generated Interrupt 7 */ + SGI8_IRQn = 8, /*!< Software Generated Interrupt 8 */ + SGI9_IRQn = 9, /*!< Software Generated Interrupt 9 */ + SGI10_IRQn = 10, /*!< Software Generated Interrupt 10 */ + SGI11_IRQn = 11, /*!< Software Generated Interrupt 11 */ + SGI12_IRQn = 12, /*!< Software Generated Interrupt 12 */ + SGI13_IRQn = 13, /*!< Software Generated Interrupt 13 */ + SGI14_IRQn = 14, /*!< Software Generated Interrupt 14 */ + SGI15_IRQn = 15, /*!< Software Generated Interrupt 15 */ + + /****** Cortex-35 Processor Exceptions Numbers ****************************************/ + VirtualMachine_IRQn = 25, + HypervisorTimer_IRQn = 26, + VirtualTimer_IRQn = 27, + LegacyFIQ_IRQn = 28, + SecPhysicalTimer_IRQn = 29, + NonSecPhysicalTimer_IRQn = 30, + LegacyIRQ_IRQn = 31, + + /****** Platform Exceptions Numbers ***************************************************/ + LVD_IRQn = 32, /*!< Low Voltage detection Interrupt */ + A35PMU_IRQn = 33, /*!< A35 PMU Interrupt */ + HSEM_IRQn = 34, /*!< Hardware Semaphore Interrupt */ + CKFAIL_IRQn = 35, /*!< Clock failed Interrupt */ + WRHO_IRQn = 36, /*!< Wormhole Interrupt */ + RTC_IRQn = 37, /*!< Real Time Clock Interrupt */ + TAMPER_IRQn = 38, /*!< Tamper detection Interrupt */ + WDT0_IRQn = 39, /*!< Watchdog timer 0 Interrupt */ + WWDT0_IRQn = 40, /*!< Window Watchdog timer 0 Interrupt */ + EINT0_IRQn = 41, /*!< External Input 0 Interrupt */ + EINT1_IRQn = 42, /*!< External Input 1 Interrupt */ + EINT2_IRQn = 43, /*!< External Input 2 Interrupt */ + EINT3_IRQn = 44, /*!< External Input 3 Interrupt */ + I2C0_IRQn = 45, /*!< I2C 0 Interrupt */ + GPA_IRQn = 46, /*!< GPIO Port A Interrupt */ + GPB_IRQn = 47, /*!< GPIO Port B Interrupt */ + GPC_IRQn = 48, /*!< GPIO Port C Interrupt */ + GPD_IRQn = 49, /*!< GPIO Port D Interrupt */ + PDMA0_IRQn = 50, /*!< Peripheral DMA 0 Interrupt */ + PDMA1_IRQn = 51, /*!< Peripheral DMA 1 Interrupt */ + DISP_IRQn = 52, /*!< Display Controller (DCUltra) Interrupt */ + CCAP0_IRQn = 53, /*!< CCAP 0 Interrupt */ + CCAP1_IRQn = 54, /*!< CCAP 1 Interrupt */ + GMAC0RX_IRQn = 55, /*!< GMAC0 RX Interrupt */ + GMAC1RX_IRQn = 56, /*!< GMAC1 RX Interrupt */ + SSMCC_IRQn = 57, /*!< SSMCC Interrupt */ + SSPCC_IRQn = 58, /*!< SSPCC Interrupt */ + GFX_IRQn = 59, /*!< GFX GC520L Interrupt (Graphic Engine) */ + VDE_IRQn = 60, /*!< Video Decoder (VC8000) Interrupt */ + WRHO1_IRQn = 61, /*!< WRHO 1 Interrupt */ + SDH0_IRQn = 62, /*!< SDH 0 Interrupt */ + SDH1_IRQn = 63, /*!< SDH 1 Interrupt */ + HSUSBD_IRQn = 64, /*!< USB 2.0 High-Speed Device Interrupt */ + HSUSBH0_IRQn = 65, /*!< USB 2.0 High-Speed Host 0(EHCI) Interrupt */ + HSUSBH1_IRQn = 66, /*!< USB 2.0 High-Speed Host 1(EHCI) Interrupt */ + USBH0_IRQn = 67, /*!< USB 1.1 Host (OHCI) 0 Interrupt (Synopsys) */ + USBH1_IRQn = 68, /*!< USB 1.1 Host (OHCI) 0 Interrupt (Hydra) */ + USBH2_IRQn = 69, /*!< USB 1.1 Host (OHCI) 0 Interrupt (Hydra) */ + NAND_IRQn = 70, /*!< NAND Controller Interrupt */ + CRPT_IRQn = 71, /*!< Crypto Interrupt */ + TRNG_IRQn = 72, /*!< TRNG Interrupt */ + KS_IRQn = 73, /*!< KeyStore Interrupt */ + OTPC_IRQn = 74, /*!< OTP Controller Interrupt */ + WDT1_IRQn = 75, /*!< Watchdog timer 1 Interrupt */ + WWDT1_IRQn = 76, /*!< Window Watchdog timer 1 Interrupt */ + PDMA2_IRQn = 77, /*!< Peripheral DMA 2 Interrupt */ + PDMA3_IRQn = 78, /*!< Peripheral DMA 3 Interrupt */ + TMR0_IRQn = 79, /*!< Timer 0 Interrupt */ + TMR1_IRQn = 80, /*!< Timer 1 Interrupt */ + TMR2_IRQn = 81, /*!< Timer 2 Interrupt */ + TMR3_IRQn = 82, /*!< Timer 3 Interrupt */ + BRAKE0_IRQn = 83, /*!< BRAKE0 Interrupt */ + EPWM0P0_IRQn = 84, /*!< EPWM0P0 Interrupt */ + EPWM0P1_IRQn = 85, /*!< EPWM0P1 Interrupt */ + EPWM0P2_IRQn = 86, /*!< EPWM0P2 Interrupt */ + QEI0_IRQn = 87, /*!< QEI0 Interrupt */ + ECAP0_IRQn = 88, /*!< ECAP0 Interrupt */ + QSPI0_IRQn = 89, /*!< QSPI0 Interrupt */ + QSPI1_IRQn = 90, /*!< QSPI1 Interrupt */ + UART0_IRQn = 91, /*!< UART 0 Interrupt */ + UART1_IRQn = 92, /*!< UART 1 Interrupt */ + UART2_IRQn = 93, /*!< UART 2 Interrupt */ + UART3_IRQn = 94, /*!< UART 3 Interrupt */ + UART4_IRQn = 95, /*!< UART 4 Interrupt */ + UART5_IRQn = 96, /*!< UART 5 Interrupt */ + EADC00_IRQn = 97, /*!< EADC00 Interrupt */ + EADC01_IRQn = 98, /*!< EADC01 Interrupt */ + EADC02_IRQn = 99, /*!< EADC02 Interrupt */ + EADC03_IRQn = 100, /*!< EADC03 Interrupt */ + I2C1_IRQn = 101, /*!< I2C 1 Interrupt */ + I2S0_IRQn = 102, /*!< I2S 0 Interrupt */ + CANFD00_IRQn = 103, /*!< CAN-FD 00 Interrupt */ + SC0_IRQn = 104, /*!< Smart Card 0 Interrupt */ + GPE_IRQn = 105, /*!< GPIO Port E Interrupt */ + GPF_IRQn = 106, /*!< GPIO Port F Interrupt */ + GPG_IRQn = 107, /*!< GPIO Port G Interrupt */ + GPH_IRQn = 108, /*!< GPIO Port H Interrupt */ + GPI_IRQn = 109, /*!< GPIO Port I Interrupt */ + GPJ_IRQn = 110, /*!< GPIO Port J Interrupt */ + KPI_IRQn = 111, /*!< KPI Interrupt */ + ADC0_IRQn = 112, /*!< ADC 0 (Touch Panel ADC) Interrupt */ + TMR4_IRQn = 113, /*!< Timer 4 Interrupt */ + TMR5_IRQn = 114, /*!< Timer 5 Interrupt */ + BRAKE1_IRQn = 115, /*!< BRAKE1 Interrupt */ + EPWM1P0_IRQn = 116, /*!< EPWM1P0 Interrupt */ + EPWM1P1_IRQn = 117, /*!< EPWM1P1 Interrupt */ + EPWM1P2_IRQn = 118, /*!< EPWM1P2 Interrupt */ + QEI1_IRQn = 119, /*!< QEI1 Interrupt */ + ECAP1_IRQn = 120, /*!< ECAP1 Interrupt */ + SPI0_IRQn = 121, /*!< SPI0 Interrupt */ + SPI1_IRQn = 122, /*!< SPI1 Interrupt */ + UART6_IRQn = 123, /*!< UART 6 Interrupt */ + UART7_IRQn = 124, /*!< UART 7 Interrupt */ + UART8_IRQn = 125, /*!< UART 8 Interrupt */ + UART9_IRQn = 126, /*!< UART 9 Interrupt */ + UART10_IRQn = 127, /*!< UART 10 Interrupt */ + UART11_IRQn = 128, /*!< UART 11 Interrupt */ + I2C2_IRQn = 129, /*!< I2C 2 Interrupt */ + I2C3_IRQn = 130, /*!< I2C 3 Interrupt */ + I2S1_IRQn = 131, /*!< I2S 1 Interrupt */ + CANFD10_IRQn = 132, /*!< CAN-FD 10 Interrupt */ + SC1_IRQn = 133, /*!< Smart Card 1 Interrupt */ + GPK_IRQn = 134, /*!< GPIO Port K Interrupt */ + GPL_IRQn = 135, /*!< GPIO Port L Interrupt */ + GPM_IRQn = 136, /*!< GPIO Port M Interrupt */ + GPN_IRQn = 137, /*!< GPIO Port N Interrupt */ + TMR6_IRQn = 138, /*!< Timer 6 Interrupt */ + TMR7_IRQn = 139, /*!< Timer 7 Interrupt */ + TMR8_IRQn = 140, /*!< Timer 8 Interrupt */ + TMR9_IRQn = 141, /*!< Timer 9 Interrupt */ + BRAKE2_IRQn = 142, /*!< BRAKE2 Interrupt */ + EPWM2P0_IRQn = 143, /*!< EPWM2P0 Interrupt */ + EPWM2P1_IRQn = 144, /*!< EPWM2P1 Interrupt */ + EPWM2P2_IRQn = 145, /*!< EPWM2P2 Interrupt */ + QEI2_IRQn = 146, /*!< QEI2 Interrupt */ + ECAP2_IRQn = 147, /*!< ECAP2 Interrupt */ + SPI2_IRQn = 148, /*!< SPI2 Interrupt */ + SPI3_IRQn = 149, /*!< SPI3 Interrupt */ + UART12_IRQn = 150, /*!< UART 12 Interrupt */ + UART13_IRQn = 151, /*!< UART 13 Interrupt */ + UART14_IRQn = 152, /*!< UART 14 Interrupt */ + UART15_IRQn = 153, /*!< UART 15 Interrupt */ + UART16_IRQn = 154, /*!< UART 16 Interrupt */ + I2C4_IRQn = 155, /*!< I2C 4 Interrupt */ + I2C5_IRQn = 156, /*!< I2C 5 Interrupt */ + CANFD20_IRQn = 157, /*!< CAN-FD 20 Interrupt */ + CANFD30_IRQn = 158, /*!< CAN-FD 30 Interrupt */ + TMR10_IRQn = 159, /*!< Timer 10 Interrupt */ + TMR11_IRQn = 160, /*!< Timer 11 Interrupt */ + EMACAXIDLK_IRQn = 161, /*!< EMAC Fabric deadlock Interrupt */ + A35AXIDLK_IRQn = 162, /*!< A35 Fabric deadlock Interrupt */ + CANFD01_IRQn = 163, /*!< CAN-FD 01 Interrupt */ + CANFD11_IRQn = 164, /*!< CAN-FD 11 Interrupt */ + CANFD21_IRQn = 165, /*!< CAN-FD 21 Interrupt */ + CANFD31_IRQn = 166, /*!< CAN-FD 31 Interrupt */ + PWRWU_IRQn = 167, /*!< Power Down Wake Up Interrupt */ + DDRPOISION_IRQn = 168, /*!< DDR Out of range Interrupt */ + NS_KS_IRQn = 169, /*!< KeyStore Interrupt */ + IRQn_Max = 192, +} IRQn_Type; + + +/* + * ========================================================================== + * ----------- Processor and Core Peripheral Section ------------------------ + * ========================================================================== + */ + +/* -------- Configuration of the Cortex-A35 Processor and Core Peripherals ------- */ +#define __CA_REV 0x0000U /*!< Core revision r0p0 */ +#define __CORTEX_A 35U /*!< Cortex-A35 Core */ +#define __FPU_PRESENT 1U /* FPU present */ +#define __GIC_PRESENT 1U /* GIC present */ +#define __TIM_PRESENT 1U /* TIM present */ +#define __L2C_PRESENT 0U /* L2C present */ + +#define IS_ALIGNED(x,a) (((x) & ((typeof(x))(a)-1U)) == 0) + +#include +#include "system_ma35d1.h" + +#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 */ + +#define __STATIC_INLINE static __inline + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() asm("nop") + +#endif /* if defined(USE_MA35D1_SUBM) */ + +#ifndef __CLZ +#if defined(__CC_ARM) +#define __CLZ __clz +#else +#define __CLZ __builtin_clz +#endif +#endif + +#if defined ( __CC_ARM ) +#pragma anon_unions +#endif + +/******************************************************************************/ +/* Register definitions */ +/******************************************************************************/ +#include "sys_reg.h" +#include "clk_reg.h" + +#include "uart_reg.h" +#include "whc_reg.h" +#include "hwsem_reg.h" +#include "wdt_reg.h" +#include "wwdt_reg.h" +#include "adc_reg.h" +#include "eadc_reg.h" +#include "sc_reg.h" +#include "gpio_reg.h" +#include "ecap_reg.h" +#include "qei_reg.h" +#include "i2c_reg.h" +#include "i2s_reg.h" +#include "pdma_reg.h" +#include "qspi_reg.h" +#include "spi_reg.h" +#include "rtc_reg.h" +#include "timer_reg.h" +#include "ebi_reg.h" +#include "epwm_reg.h" +#include "kpi_reg.h" +#include "canfd_reg.h" + +#include "sspcc_reg.h" +#include "ssmcc_reg.h" +#include "umctl2_reg.h" +#include "disp_reg.h" +#include "gmac_reg.h" + +#include "hsusbh_reg.h" +#include "usbh_reg.h" + +#include "sdh_reg.h" +#include "ccap_reg.h" + +/** @addtogroup PERIPHERAL_MEM_MAP Peripheral Memory Base + Memory Mapped Structure for Peripherals + @{ + */ +/* SRAM, SDRAM, External Memory and IBR (Internal Boot ROM) Space */ +#define SRAM0_BASE (0x00000000U) /* SRAM 0 Memory Space (256 KB) */ +#define SDRAM4M_BASE (0x00040000U) /* SDRAM Offset 0x0 Alias Memory Space (4 MB-256 KB) */ +#define SRAM0A_BASE (0x24000000U) /* SRAM 0 Alias Memory Space (256 KB) */ +#define SRAM1_BASE (0x28000000U) /* SRAM 1 Memory Space (256 KB) */ +#define IBR_BASE (0x5FFC0000U) /* Internal Boot ROM Space (128 KB) */ +#define EXTMEM_BASE (0x68000000U) /* External Memory Space (128 MB) */ +#define SDRAM_BASE (0x80000000U) /* SDRAM Memory Space (2GB) */ + + +/* AXI/AHB Peripheral Register Space */ +#define GPIO_BASE (0x40040000U) +#define GPIOA_BASE GPIO_BASE +#define GPIOB_BASE (0x40040040U) +#define GPIOC_BASE (0x40040080U) +#define GPIOD_BASE (0x400400C0U) +#define GPIOE_BASE (0x40040100U) +#define GPIOF_BASE (0x40040140U) +#define GPIOG_BASE (0x40040180U) +#define GPIOH_BASE (0x400401C0U) +#define GPIOI_BASE (0x40040200U) +#define GPIOJ_BASE (0x40040240U) +#define GPIOK_BASE (0x40040280U) +#define GPIOL_BASE (0x400402C0U) +#define GPIOM_BASE (0x40040300U) +#define GPION_BASE (0x40040340U) +#define GPIO_DBCTL_BASE (0x40044440U) +#define GPIO_PIN_DATA_BASE (0x40040800U) + +#define PDMA0_BASE (0x40080000U) +#define PDMA1_BASE (0x40090000U) +#define PDMA2_BASE (0x400A0000U) +#define PDMA3_BASE (0x400B0000U) + +#define EBI_BASE (0x40100000U) + +#define GMAC0_BASE (0x40120000U) +#define GMAC1_BASE (0x40130000U) + +#define HSUSBH0_BASE (0x40140000U) +#define USBH0_BASE (0x40150000U) +#define USBD_BASE (0x40160000U) +#define USBH2_BASE (0x40170000U) + +#define SDH0_BASE (0x40180000U) +#define SDH1_BASE (0x40190000U) + +#define NAND_BASE (0x401A0000U) + +#define HSUSBH1_BASE (0x401C0000U) +#define USBH1_BASE (0x401D0000U) + +#define HSUSBD_BASE (0x40200000U) + +#define CCAP0_BASE (0x40240000U) +#define CCAP1_BASE (0x40250000U) + +#define DISP_BASE (0x40260000U) +#define DISP_MPU_BASE (0x40261C40U) + +#define GFX_BASE (0x40280000U) +#define VDEC_BASE (0x40290000U) + +#define CRYPTO_BASE (0x40300000U) +#define KS_BASE (0x40340000U) +#define OPTC_BASE (0x40350000U) +#define NS_OTPC_BASE (0x40350800U) + +#define CRYPTOSYS_BASE (0x40360000U) +#define CRYPTOCLK_BASE (0x40360200U) + +#define HWSEM_BASE (0x40380000U) +#define WHC0_BASE (0x403A0000U) + +#define MCAN0_BASE (0x403C0000U) +#define MCAN1_BASE (0x403D0000U) +#define MCAN2_BASE (0x403E0000U) +#define MCAN3_BASE (0x403F0000U) +#define CANFD0_BASE MCAN0_BASE +#define CANFD1_BASE MCAN1_BASE +#define CANFD2_BASE MCAN2_BASE +#define CANFD3_BASE MCAN3_BASE + +#define WHC1_BASE (0x503B0000U) + +#define GIC_DISTRIBUTOR_BASE (0x50801000U) +#define GIC_INTERFACE_BASE (0x50802000U) + + +/* APB Peripheral Register Space */ + +#define WDT0_BASE (0x40400000U) +#define RTC_BASE (0x40410000U) +#define ADC0_BASE (0x40420000U) +#define EADC_BASE (0x40430000U) +#define EADC0_BASE EADC_BASE +#define WDT1_BASE (0x40440000U) +#define SYS_BASE (0x40460000U) +#define CLK_BASE (0x40460200U) + +#define NMI_BASE (0x40460300U) +#define I2S0_BASE (0x40480000U) +#define I2S1_BASE (0x40490000U) +#define KPI_BASE (0x404A0000U) + +#define DDRPHY_BASE (0x404C0000U) +#define UMCTL2_BASE (0x404D0000U) + +#define SSMCC_BASE (0x404E0000U) +#define TZC0_BASE (0x404E1000U) +#define TZC1_BASE (0x404E2000U) +#define TZC2_BASE (0x404E3000U) + +#define SSPCC_BASE (0x404F0000U) + +#define TIMER0_BASE (0x40500000U) +#define TIMER1_BASE (0x40500100U) +#define TIMER2_BASE (0x40510000U) +#define TIMER3_BASE (0x40510100U) +#define TIMER4_BASE (0x40520000U) +#define TIMER5_BASE (0x40520100U) +#define TIMER6_BASE (0x40530000U) +#define TIMER7_BASE (0x40530100U) +#define TIMER8_BASE (0x40540000U) +#define TIMER9_BASE (0x40540100U) +#define TIMER10_BASE (0x40550000U) +#define TIMER11_BASE (0x40550100U) + +#define EPWM0_BASE (0x40580000U) +#define EPWM1_BASE (0x40590000U) +#define EPWM2_BASE (0x405A0000U) + +#define SPI0_BASE (0x40600000U) +#define SPI1_BASE (0x40610000U) +#define SPI2_BASE (0x40620000U) +#define SPI3_BASE (0x40630000U) + +#define QSPI0_BASE (0x40680000U) +#define QSPI1_BASE (0x40690000U) + +#define UART0_BASE (0x40700000U) +#define UART1_BASE (0x40710000U) +#define UART2_BASE (0x40720000U) +#define UART3_BASE (0x40730000U) +#define UART4_BASE (0x40740000U) +#define UART5_BASE (0x40750000U) +#define UART6_BASE (0x40760000U) +#define UART7_BASE (0x40770000U) +#define UART8_BASE (0x40780000U) +#define UART9_BASE (0x40790000U) +#define UART10_BASE (0x407A0000U) +#define UART11_BASE (0x407B0000U) +#define UART12_BASE (0x407C0000U) +#define UART13_BASE (0x407D0000U) +#define UART14_BASE (0x407E0000U) +#define UART15_BASE (0x407F0000U) + +#define I2C0_BASE (0x40800000U) +#define I2C1_BASE (0x40810000U) +#define I2C2_BASE (0x40820000U) +#define I2C3_BASE (0x40830000U) +#define I2C4_BASE (0x40840000U) +#define I2C5_BASE (0x40850000U) + +#define UART16_BASE (0x40880000U) + +#define SC0_BASE (0x40900000U) +#define SC1_BASE (0x40910000U) + +#define WDT2_BASE (0x40980000U) + +#define QEI0_BASE (0x40B00000U) +#define QEI1_BASE (0x40B10000U) +#define QEI2_BASE (0x40B20000U) + +#define ECAP0_BASE (0x40B40000U) +#define ECAP1_BASE (0x40B50000U) +#define ECAP2_BASE (0x40B60000U) + + +#define WWDT0_BASE (0x40400100U) +#define WWDT1_BASE (0x40440100U) +#define WWDT2_BASE (0x40980100U) + + + +/*@}*/ /* end of group PERIPHERAL_MEM_MAP */ + + +/** @addtogroup PERIPHERAL_DECLARATION Peripheral Pointer + The Declaration of Peripherals + @{ + */ + +#define SYS ((SYS_T *) SYS_BASE) +#define CLK ((CLK_T *) CLK_BASE) +#define PA ((GPIO_T *) GPIOA_BASE) +#define PB ((GPIO_T *) GPIOB_BASE) +#define PC ((GPIO_T *) GPIOC_BASE) +#define PD ((GPIO_T *) GPIOD_BASE) +#define PE ((GPIO_T *) GPIOE_BASE) +#define PF ((GPIO_T *) GPIOF_BASE) +#define PG ((GPIO_T *) GPIOG_BASE) +#define PH ((GPIO_T *) GPIOH_BASE) +#define PI ((GPIO_T *) GPIOI_BASE) +#define PJ ((GPIO_T *) GPIOJ_BASE) +#define PK ((GPIO_T *) GPIOK_BASE) +#define PL ((GPIO_T *) GPIOL_BASE) +#define PM ((GPIO_T *) GPIOM_BASE) +#define PN ((GPIO_T *) GPION_BASE) +#define PDMA0 ((PDMA_T *) PDMA0_BASE) +#define PDMA1 ((PDMA_T *) PDMA1_BASE) +#define PDMA2 ((PDMA_T *) PDMA2_BASE) +#define PDMA3 ((PDMA_T *) PDMA3_BASE) +#define EBI ((EBI_T *) EBI_BASE) +#define HWSEM0 ((HWSEM_T *) HWSEM_BASE) +#define WHC0 ((WHC_T *) WHC0_BASE) +#define MCAN0 ((MCAN_T *) MCAN0_BASE) +#define MCAN1 ((MCAN_T *) MCAN1_BASE) +#define MCAN2 ((MCAN_T *) MCAN2_BASE) +#define MCAN3 ((MCAN_T *) MCAN3_BASE) +#define RTC ((RTC_T *) RTC_BASE) +#define ADC0 ((ADC_T *) ADC0_BASE) +#define EADC ((EADC_T *) EADC_BASE) +#define EADC0 EADC +#define I2S0 ((I2S_T *) I2S0_BASE) +#define I2S1 ((I2S_T *) I2S1_BASE) +#define KPI ((KPI_T *) KPI_BASE) +#define TIMER0 ((TIMER_T *) TIMER0_BASE) +#define TIMER1 ((TIMER_T *) TIMER1_BASE) +#define TIMER2 ((TIMER_T *) TIMER2_BASE) +#define TIMER3 ((TIMER_T *) TIMER3_BASE) +#define TIMER4 ((TIMER_T *) TIMER4_BASE) +#define TIMER5 ((TIMER_T *) TIMER5_BASE) +#define TIMER6 ((TIMER_T *) TIMER6_BASE) +#define TIMER7 ((TIMER_T *) TIMER7_BASE) +#define TIMER8 ((TIMER_T *) TIMER8_BASE) +#define TIMER9 ((TIMER_T *) TIMER9_BASE) +#define TIMER10 ((TIMER_T *) TIMER10_BASE) +#define TIMER11 ((TIMER_T *) TIMER11_BASE) +#define EPWM0 ((EPWM_T *) EPWM0_BASE) +#define EPWM1 ((EPWM_T *) EPWM1_BASE) +#define EPWM2 ((EPWM_T *) EPWM2_BASE) +#define SPI0 ((SPI_T *) SPI0_BASE) +#define SPI1 ((SPI_T *) SPI1_BASE) +#define SPI2 ((SPI_T *) SPI2_BASE) +#define SPI3 ((SPI_T *) SPI3_BASE) + +#define QSPI0 ((QSPI_T *) QSPI0_BASE) +#define QSPI1 ((QSPI_T *) QSPI1_BASE) + +#define UART0 ((UART_T *) UART0_BASE) +#define UART1 ((UART_T *) UART1_BASE) +#define UART2 ((UART_T *) UART2_BASE) +#define UART3 ((UART_T *) UART3_BASE) +#define UART4 ((UART_T *) UART4_BASE) +#define UART5 ((UART_T *) UART5_BASE) +#define UART6 ((UART_T *) UART6_BASE) +#define UART7 ((UART_T *) UART7_BASE) +#define UART8 ((UART_T *) UART8_BASE) +#define UART9 ((UART_T *) UART9_BASE) +#define UART10 ((UART_T *) UART10_BASE) +#define UART11 ((UART_T *) UART11_BASE) +#define UART12 ((UART_T *) UART12_BASE) +#define UART13 ((UART_T *) UART13_BASE) +#define UART14 ((UART_T *) UART14_BASE) +#define UART15 ((UART_T *) UART15_BASE) +#define UART16 ((UART_T *) UART16_BASE) + +#define I2C0 ((I2C_T *) I2C0_BASE) +#define I2C1 ((I2C_T *) I2C1_BASE) +#define I2C2 ((I2C_T *) I2C2_BASE) +#define I2C3 ((I2C_T *) I2C3_BASE) +#define I2C4 ((I2C_T *) I2C4_BASE) +#define I2C5 ((I2C_T *) I2C5_BASE) +#define SC0 ((SC_T *) SC0_BASE) +#define SC1 ((SC_T *) SC1_BASE) +#define WDT0 ((WDT_T *) WDT0_BASE) +#define WDT1 ((WDT_T *) WDT1_BASE) +#define WDT2 ((WDT_T *) WDT2_BASE) +#define WWDT2 ((WWDT_T *) WWDT2_BASE) +#define QEI0 ((QEI_T *) QEI0_BASE) +#define QEI1 ((QEI_T *) QEI1_BASE) +#define QEI2 ((QEI_T *) QEI2_BASE) +#define ECAP0 ((ECAP_T *) ECAP0_BASE) +#define ECAP1 ((ECAP_T *) ECAP1_BASE) +#define ECAP2 ((ECAP_T *) ECAP2_BASE) +#define CANFD0 ((CANFD_T*) CANFD0_BASE) +#define CANFD1 ((CANFD_T*) CANFD1_BASE) +#define CANFD2 ((CANFD_T*) CANFD2_BASE) +#define CANFD3 ((CANFD_T*) CANFD3_BASE) + +#define SSPCC ((SSPCC_T*) SSPCC_BASE) +#define SSMCC ((SSMCC_T*) SSMCC_BASE) +#define TZC0 ((TZC_T*) TZC0_BASE) +#define TZC2 ((TZC_T*) TZC2_BASE) +#define UMCTL2 ((UMCTL2_T*)UMCTL2_BASE) +#define DISP ((DISP_T*) DISP_BASE) + +#define GMAC0 ((GMAC_T*) GMAC0_BASE) +#define GMAC1 ((GMAC_T*) GMAC1_BASE) + +#define SDH0 ((SDH_T*) SDH0_BASE) +#define SDH1 ((SDH_T*) SDH1_BASE) + +#define CCAP0 ((CCAP_T*) CCAP0_BASE) +#define CCAP1 ((CCAP_T*) CCAP1_BASE) + +/*@}*/ /* end of group ERIPHERAL_DECLARATION */ + +/** @addtogroup IO_ROUTINE I/O Routines + The Declaration of I/O Routines + @{ + */ + +typedef volatile uint8_t vu8; ///< Define 8-bit unsigned volatile data type +typedef volatile uint16_t vu16; ///< Define 16-bit unsigned volatile data type +typedef volatile uint32_t vu32; ///< Define 32-bit unsigned volatile data type +typedef volatile uint64_t vu64; ///< Define 64-bit unsigned volatile data type + +/** + * @brief Get a 8-bit unsigned value from specified address + * @param[in] addr Address to get 8-bit data from + * @return 8-bit unsigned value stored in specified address + */ +#define M8(addr) (*((vu8 *) (addr))) + +/** + * @brief Get a 16-bit unsigned value from specified address + * @param[in] addr Address to get 16-bit data from + * @return 16-bit unsigned value stored in specified address + * @note The input address must be 16-bit aligned + */ +#define M16(addr) (*((vu16 *) (addr))) + +/** + * @brief Get a 32-bit unsigned value from specified address + * @param[in] addr Address to get 32-bit data from + * @return 32-bit unsigned value stored in specified address + * @note The input address must be 32-bit aligned + */ +#define M32(addr) (*((vu32 *) (addr))) + +/** + * @brief Get a 64-bit unsigned value from specified address + * @param[in] addr Address to get 64-bit data from + * @return 64-bit unsigned value stored in specified address + * @note The input address must be 64-bit aligned + */ +#define M64(addr) (*((vu64 *) (addr))) + +/** + * @brief Set a 32-bit unsigned value to specified I/O port + * @param[in] port Port address to set 32-bit data + * @param[in] value Value to write to I/O port + * @return None + * @note The output port must be 32-bit aligned + */ +#define outpw(port,value) *((vu32 *)(port)) = (value) + +/** + * @brief Get a 32-bit unsigned value from specified I/O port + * @param[in] port Port address to get 32-bit data from + * @return 32-bit unsigned value stored in specified I/O port + * @note The input port must be 32-bit aligned + */ +#define inpw(port) (*((vu32 *)(port))) + +/** + * @brief Set a 16-bit unsigned value to specified I/O port + * @param[in] port Port address to set 16-bit data + * @param[in] value Value to write to I/O port + * @return None + * @note The output port must be 16-bit aligned + */ +#define outps(port,value) *((vu16 *)(port)) = (value) + +/** + * @brief Get a 16-bit unsigned value from specified I/O port + * @param[in] port Port address to get 16-bit data from + * @return 16-bit unsigned value stored in specified I/O port + * @note The input port must be 16-bit aligned + */ +#define inps(port) (*((vu16 *)(port))) + +/** + * @brief Set a 8-bit unsigned value to specified I/O port + * @param[in] port Port address to set 8-bit data + * @param[in] value Value to write to I/O port + * @return None + */ +#define outpb(port,value) *((vu8 *)(port)) = (value) + +/** + * @brief Get a 8-bit unsigned value from specified I/O port + * @param[in] port Port address to get 8-bit data from + * @return 8-bit unsigned value stored in specified I/O port + */ +#define inpb(port) (*((vu8 *)(port))) + +/** + * @brief Set a 64-bit unsigned value to specified I/O port + * @param[in] port Port address to set 64-bit data + * @param[in] value Value to write to I/O port + * @return None + * @note The output port must be 64-bit aligned + */ +#define outp64(port,value) *((vu64 *)(port)) = (value) + +/** + * @brief Get a 64-bit unsigned value from specified I/O port + * @param[in] port Port address to get 64-bit data from + * @return 64-bit unsigned value stored in specified I/O port + * @note The input port must be 64-bit aligned + */ +#define inp64(port) (*((vu64 *)(port))) + +/** + * @brief Set a 32-bit unsigned value to specified I/O port + * @param[in] port Port address to set 32-bit data + * @param[in] value Value to write to I/O port + * @return None + * @note The output port must be 32-bit aligned + */ +#define outp32(port,value) *((vu32 *)(port)) = (value) + +/** + * @brief Get a 32-bit unsigned value from specified I/O port + * @param[in] port Port address to get 32-bit data from + * @return 32-bit unsigned value stored in specified I/O port + * @note The input port must be 32-bit aligned + */ +#define inp32(port) (*((vu32 *)(port))) + +/** + * @brief Set a 16-bit unsigned value to specified I/O port + * @param[in] port Port address to set 16-bit data + * @param[in] value Value to write to I/O port + * @return None + * @note The output port must be 16-bit aligned + */ +#define outp16(port,value) *((vu16 *)(port)) = (value) + +/** + * @brief Get a 16-bit unsigned value from specified I/O port + * @param[in] port Port address to get 16-bit data from + * @return 16-bit unsigned value stored in specified I/O port + * @note The input port must be 16-bit aligned + */ +#define inp16(port) (*((vu16 *)(port))) + +/** + * @brief Set a 8-bit unsigned value to specified I/O port + * @param[in] port Port address to set 8-bit data + * @param[in] value Value to write to I/O port + * @return None + */ +#define outp8(port,value) *((vu8 *)(port)) = (value) + +/** + * @brief Get a 8-bit unsigned value from specified I/O port + * @param[in] port Port address to get 8-bit data from + * @return 8-bit unsigned value stored in specified I/O port + */ +#define inp8(port) (*((vu8 *)(port))) + + +/*@}*/ /* end of group IO_ROUTINE */ + +/******************************************************************************/ +/* Legacy Constants */ +/******************************************************************************/ +/** @addtogroup Legacy_Constants Legacy Constants + Legacy Constants + @{ +*/ + +#ifndef NULL +#define NULL (0) ///< NUL pointer +#endif + +#define TRUE (1U) ///< Boolean true, define to use in API parameters or return value +#define FALSE (0U) ///< Boolean false, define to use in API parameters or return value + +#define ENABLE (1U) ///< Enable, define to use in API parameters +#define DISABLE (0U) ///< Disable, define to use in API parameters + +/* Define one bit mask */ +#define BIT0 (0x00000001U) ///< Bit 0 mask of an 32 bit integer +#define BIT1 (0x00000002U) ///< Bit 1 mask of an 32 bit integer +#define BIT2 (0x00000004U) ///< Bit 2 mask of an 32 bit integer +#define BIT3 (0x00000008U) ///< Bit 3 mask of an 32 bit integer +#define BIT4 (0x00000010U) ///< Bit 4 mask of an 32 bit integer +#define BIT5 (0x00000020U) ///< Bit 5 mask of an 32 bit integer +#define BIT6 (0x00000040U) ///< Bit 6 mask of an 32 bit integer +#define BIT7 (0x00000080U) ///< Bit 7 mask of an 32 bit integer +#define BIT8 (0x00000100U) ///< Bit 8 mask of an 32 bit integer +#define BIT9 (0x00000200U) ///< Bit 9 mask of an 32 bit integer +#define BIT10 (0x00000400U) ///< Bit 10 mask of an 32 bit integer +#define BIT11 (0x00000800U) ///< Bit 11 mask of an 32 bit integer +#define BIT12 (0x00001000U) ///< Bit 12 mask of an 32 bit integer +#define BIT13 (0x00002000U) ///< Bit 13 mask of an 32 bit integer +#define BIT14 (0x00004000U) ///< Bit 14 mask of an 32 bit integer +#define BIT15 (0x00008000U) ///< Bit 15 mask of an 32 bit integer +#define BIT16 (0x00010000U) ///< Bit 16 mask of an 32 bit integer +#define BIT17 (0x00020000U) ///< Bit 17 mask of an 32 bit integer +#define BIT18 (0x00040000U) ///< Bit 18 mask of an 32 bit integer +#define BIT19 (0x00080000U) ///< Bit 19 mask of an 32 bit integer +#define BIT20 (0x00100000U) ///< Bit 20 mask of an 32 bit integer +#define BIT21 (0x00200000U) ///< Bit 21 mask of an 32 bit integer +#define BIT22 (0x00400000U) ///< Bit 22 mask of an 32 bit integer +#define BIT23 (0x00800000U) ///< Bit 23 mask of an 32 bit integer +#define BIT24 (0x01000000U) ///< Bit 24 mask of an 32 bit integer +#define BIT25 (0x02000000U) ///< Bit 25 mask of an 32 bit integer +#define BIT26 (0x04000000U) ///< Bit 26 mask of an 32 bit integer +#define BIT27 (0x08000000U) ///< Bit 27 mask of an 32 bit integer +#define BIT28 (0x10000000U) ///< Bit 28 mask of an 32 bit integer +#define BIT29 (0x20000000U) ///< Bit 29 mask of an 32 bit integer +#define BIT30 (0x40000000U) ///< Bit 30 mask of an 32 bit integer +#define BIT31 (0x80000000U) ///< Bit 31 mask of an 32 bit integer + +/* Byte Mask Definitions */ +#define BYTE0_Msk (0x000000FFU) ///< Mask to get bit0~bit7 from a 32 bit integer +#define BYTE1_Msk (0x0000FF00U) ///< Mask to get bit8~bit15 from a 32 bit integer +#define BYTE2_Msk (0x00FF0000U) ///< Mask to get bit16~bit23 from a 32 bit integer +#define BYTE3_Msk (0xFF000000U) ///< Mask to get bit24~bit31 from a 32 bit integer + +#define GET_BYTE0(u32Param) (((u32Param) & BYTE0_Msk) ) /*!< Extract Byte 0 (Bit 0~ 7) from parameter u32Param */ +#define GET_BYTE1(u32Param) (((u32Param) & BYTE1_Msk) >> 8) /*!< Extract Byte 1 (Bit 8~15) from parameter u32Param */ +#define GET_BYTE2(u32Param) (((u32Param) & BYTE2_Msk) >> 16) /*!< Extract Byte 2 (Bit 16~23) from parameter u32Param */ +#define GET_BYTE3(u32Param) (((u32Param) & BYTE3_Msk) >> 24) /*!< Extract Byte 3 (Bit 24~31) from parameter u32Param */ + +/*@}*/ /* end of group Legacy_Constants */ + +/******************************************************************************/ +/* Peripheral header files */ +/******************************************************************************/ +#include "nu_sys.h" +#include "nu_clk.h" +#include "nu_uart.h" +#include "nu_pdma.h" +#include "nu_gpio.h" +#include "nu_hwsem.h" +#include "nu_whc.h" +#include "nu_ecap.h" +#include "nu_qei.h" +#include "nu_timer.h" +#include "nu_timer_pwm.h" +#include "nu_i2c.h" +#include "nu_i2s.h" +#include "nu_epwm.h" +#include "nu_eadc.h" +#include "nu_adc.h" +#include "nu_wdt.h" +#include "nu_wwdt.h" +#include "nu_ebi.h" +#include "nu_scuart.h" +#include "nu_sc.h" +#include "nu_spi.h" +#include "nu_qspi.h" +#include "nu_rtc.h" +#include "nu_kpi.h" +#include "nu_canfd.h" +#include "nu_ssmcc.h" +#include "nu_sspcc.h" +#include "nu_disp.h" +#include "nu_sdh.h" +#include "nu_ccap.h" + +#ifdef __cplusplus +} +#endif + +#endif /* __MA35D1_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/nfi_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/nfi_reg.h new file mode 100644 index 0000000000..de1320210c --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/nfi_reg.h @@ -0,0 +1,2850 @@ +/**************************************************************************//** + * @file nfi_reg.h + * @brief NFI register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NFI_REG_H__ +#define __NFI_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/******************************************************************************/ +/* Device Specific Peripheral registers structures */ +/******************************************************************************/ + +/** @addtogroup REGISTER Control Register + + @{ + +*/ + +/*---------------------- NAND Flash Interface -------------------------*/ +/** + @addtogroup NFI NAND Flash Interface(NFI) + Memory Mapped Structure for NFI Controller +@{ */ + +typedef struct +{ + + + /** + * @var NFI_T::BUFFER0 + * Offset: 0x00 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER1 + * Offset: 0x04 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER2 + * Offset: 0x08 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER3 + * Offset: 0x0C NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER4 + * Offset: 0x10 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER5 + * Offset: 0x14 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER6 + * Offset: 0x18 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER7 + * Offset: 0x1C NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER8 + * Offset: 0x20 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER9 + * Offset: 0x24 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER10 + * Offset: 0x28 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER11 + * Offset: 0x2C NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER12 + * Offset: 0x30 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER13 + * Offset: 0x34 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER14 + * Offset: 0x38 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER15 + * Offset: 0x3C NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER16 + * Offset: 0x40 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER17 + * Offset: 0x44 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER18 + * Offset: 0x48 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER19 + * Offset: 0x4C NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER20 + * Offset: 0x50 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER21 + * Offset: 0x54 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER22 + * Offset: 0x58 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER23 + * Offset: 0x5C NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER24 + * Offset: 0x60 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER25 + * Offset: 0x64 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER26 + * Offset: 0x68 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER27 + * Offset: 0x6C NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER28 + * Offset: 0x70 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER29 + * Offset: 0x74 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER30 + * Offset: 0x78 NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::BUFFER31 + * Offset: 0x7C NFI Embedded Buffer Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NFI Embedded Buffer Word n + * | | |This field indicates a 32-bit data of NAND Flash controller embedded buffer. + * @var NFI_T::DMACTL + * Offset: 0x400 NFI DMA Control and Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DMACEN |DMA Controller Engine Enable Bit + * | | |0 = DMA Controller Disabled. + * | | |1 = DMA Controller Enabled. + * | | |Note 1: If this bit is cleared, DMA will ignore all requests from NAND Flash and force bus master into IDLE state. + * | | |Note 2: If target abort occurred, DMACEN will be cleared. + * |[1] |DMARST |Software Engine Reset + * | | |0 = No effect. + * | | |1 = Reset internal state machine and pointers + * | | |The contents of control register will not be cleared + * | | |This bit will auto be cleared after a few clock cycles. + * | | |Note: The software reset DMA related registers. + * |[3] |SGEN |Scatter-gather Function for NFI Enable Bit + * | | |0 = Scatter-gather function Disabled (DMA will treat the starting address in DMASA as starting pointer of a single block memory). + * | | |1 = Scatter-gather function Enabled (DMA will treat the starting address in DMASA as a starting address of Physical Address Descriptor (PAD) table + * | | |The format of these Pads' will be described later). + * |[9] |DMABUSY |NFI DMA Transfer in Progress + * | | |This bit indicates if NFI is granted and doing DMA transfer or not. + * | | |0 = NFI DMA transfer is not in progress. + * | | |1 = NFI DMA transfer is in progress. + * @var NFI_T::DMASA + * Offset: 0x408 NFI DMA Transfer Starting Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ORDER |Determined to the PAD Table Fetching Is in Order or Out of Order + * | | |0 = PAD table is fetched in order. + * | | |1 = PAD table is fetched out of order. + * | | |Note: the bit 0 is valid in scatter-gather mode when SGEN (NFI_DMACTL[3]) = 1. + * |[31:1] |DMASA |DMA Transfer Starting Address + * | | |This field pads 0 as least significant bit indicates a 32-bit starting address of system memory (SRAM) for DMA to retrieve or fill in data. + * | | |If DMA is not in normal mode, this field will be interpreted as a starting address of Physical Address Descriptor (PAD) table. + * | | |Note: Starting address of the SRAM must be word aligned, for example, 0x0000_0000, 0x0000_0004. + * @var NFI_T::DMABCNT + * Offset: 0x40C NFI DMA Transfer Byte Count Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[25:0] |BCNT |DMA Transfer Byte Count (Read Only) + * | | |This field indicates the remained byte count of DMA transfer + * | | |The value of this field is valid only when NFI is busy; otherwise, it is zero. + * @var NFI_T::DMAINTEN + * Offset: 0x410 NFI DMA Interrupt Enable Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ABORTIEN |DMA Read/Write Target Abort Interrupt Enable Bit + * | | |0 = Target abort interrupt generation Disabled during DMA transfer. + * | | |1 = Target abort interrupt generation Enabled during DMA transfer. + * |[1] |WEOTIEN |Wrong EOT Encountered Interrupt Enable Bit + * | | |0 = Interrupt generation Disabled when wrong EOT (end of transfer) is encountered. + * | | |1 = Interrupt generation Enabled when wrong EOT (end of transfer) is encountered. + * @var NFI_T::DMAINTSTS + * Offset: 0x414 NFI DMA Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ABORTIF |DMA Read/Write Target Abort Interrupt Flag(Read Only) + * | | |0 = No bus ERROR response received. + * | | |1 = Bus ERROR response received. + * | | |Note: This bit is read only, but can be cleared by writing '1' to it. + * | | |Note: When DMA's bus master received ERROR response, it means that target abort happened + * | | |DMA will stop transfer and respond this event by set ABORTIF high + * | | |Then, NFI go to IDLE state + * | | |When target abort occurred or WEOTIF is set, it is necessary to reset NFI's DMA and then transfer those data again. + * |[1] |WEOTIF |Wrong EOT Encountered Interrupt Flag(Read Only) + * | | |When DMA Scatter-Gather function is enabled, and EOT of the descriptor is encountered before DMA transfer finished (that means the total sector count of all PAD is less than the sector count of NFI), this bit will be set. + * | | |0 = No EOT encountered before DMA transfer finished. + * | | |1 = EOT encountered before DMA transfer finished. + * | | |Note: This bit is read only, but can be cleared by writing '1' to it. + * @var NFI_T::GCTL + * Offset: 0x800 NFI Global Control and Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GCTLRST |Software Engine Reset + * | | |0 = No effect. + * | | |1 = Reset all NFI engines. + * | | |Note: The contents of control register will not be cleared + * | | |This bit will auto cleared after a few clock cycles. + * |[3] |NANDEN |NAND Flash Functionality Enable Bit + * | | |0 = NAND Flash functionality of NFI Disabled. + * | | |1 = NAND Flash functionality of NFI Enabled. + * @var NFI_T::GINTEN + * Offset: 0x804 NFI Global Interrupt Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DTAIEN |DMA READ/WRITE Target Abort Interrupt Enable Bit + * | | |0 = DMA READ/WRITE target abort interrupt generation Disabled. + * | | |1 = DMA READ/WRITE target abort interrupt generation Enabled. + * @var NFI_T::GINTSTS + * Offset: 0x808 NFI Global Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DTAIF |DMA READ/WRITE Target Abort Interrupt Flag (Read Only) + * | | |This bit indicates DMA received an ERROR response from internal AHB bus during DMA read/write operation + * | | |When Target Abort occurred, please reset all engines. + * | | |0 = No bus ERROR response received. + * | | |1 = Bus ERROR response received. + * | | |Note: This bit is read only, but can be cleared by writing '1' to it. + * @var NFI_T::NANDCTL + * Offset: 0x8A0 NAND Flash Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SWRST |Software Engine Reset + * | | |0 = No effect. + * | | |1 = Reset the internal state machine and counters (include DWREN (NFI_NANDCTL[2]) and DRDEN (NFI_NANDCTL[1])). + * | | |Note: The contents of control register will not be cleared + * | | |This bit will be auto cleared after a few clock cycles. + * |[1] |DRDEN |DMA Read Data Enable Bit + * | | |This bit enables NAND controller to transfer data (1 page) from NAND Flash or NAND type Flash into DMAC's embedded frame buffer. + * | | |0 = No effect. + * | | |1 = DMA read data transfer Enabled. + * | | |Note: When DMA transfer completed, this bit will be cleared automatically. + * |[2] |DWREN |DMA Write Data Enable Bit + * | | |This bit enables NAND controller to transfer data (1 page) from DMAC's embedded frame buffer into NAND Flash or NAND type Flash. + * | | |0 = No effect. + * | | |1 = DMA write data transfer Enabled. + * | | |Note: When DMA transfer completed, this bit will be cleared automatically. + * |[3] |REDUNREN |Redundant Area Read Enable Bit + * | | |This bit enables NAND controller to transfer redundant data from NAND Flash into NFI_NANDRA, the data size is dependent on NFI_NANDRACTL register. + * | | |0 = No effect. + * | | |1 = Read redundant data transfer Enabled. + * | | |Note: When transfer completed, this bit will be cleared automatically. + * |[4] |REDUNAUTOWEN|Redundant Area Auto Write Enable Bit + * | | |This field is used to auto write redundant data out to NAND Flash + * | | |The redundant data area is dependent on NFI_NANDRACTL register. + * | | |0 = Auto write redundant data out to NAND Flash Disabled. + * | | |1 = Auto write redundant data out to NAND Flash Enabled. + * |[7] |ECCCHK |None Used Field ECC Check After Read Page Data + * | | |0 = ECC check Disabled + * | | |The NAND controller will always check ECC result for each field, no matter it is used or not. + * | | |1 = ECC check Enabled + * | | |The NAND controller will check 1's count for byte 2, 3 of redundant data of the ECC in each field + * | | |If the count value is greater than 8, the NAND controller will treat this field as none used field; otherwise, it is used + * | | |If that field is none used field, the NAND controller will ignore its ECC check result. + * |[8] |PROT3BEN |Protect_3Byte Software Data Enable Bit + * | | |The ECC algorithm only protects data area and hardware ECC parity code + * | | |User can choose to protect software redundant data first 3 bytes by setting this bit high. + * | | |0 = Software redundant data is not protected by ECC algorithm. + * | | |1 = Software redundant data first 3 bytes protected by ECC algorithm. + * |[9] |SRAMINT |SRAM Initial + * | | |0 = No effect. + * | | |1 = Reset the internal NFI_NANDRA0~NFI_NANDRA1 to 0xFFFF_FFFF. + * | | |Note: The contents of control register will not be cleared + * | | |This bit will be auto cleared after a few clock cycles. + * |[17:16] |PSIZE |Page Size of NAND + * | | |This bit indicates the page size of NAND + * | | |There are four page sizes for choose, 2048 bytes/page, 4096 bytes/page and 8192 bytes/page + * | | |Before setting PSIZE register, user must set BCHTSEL register at first. + * | | |01 = Page size is 2048 bytes/page. + * | | |10 = Page size is 4096 bytes/page. + * | | |11 = Page size is 8192 bytes/page. + * |[22:18] |BCHTSEL |BCH Correct Bit Selection + * | | |This field is used to select BCH correct bits for data protecting + * | | |For BCH algorithm, T can be 8 or 12 or 24 for choosing (correct 8 or 12 or 24 bits). + * | | |00001 = Using BCH T24 to encode/decode (T24).(.1024 Bytes per block) + * | | |00100 = Using BCH T8 to encode/decode (T8). + * | | |01000 = Using BCH T12 to encode/decode (T12). + * |[23] |ECCEN |ECC Algorithm Enable Bit + * | | |This field is used to select the ECC algorithm for data protecting + * | | |The BCH algorithm can correct 8 or 12 or 24 bits. + * | | |0 = BCH code encode/decode Disabled. + * | | |1 = BCH code encode/decode Enabled. + * | | |Note: If disabling ECCEN and when reading data from NAND, the NAND controller will ignore its ECC check result + * | | |When writing data to NAND, the NAND controller will write out 0xFF to every parity field. + * | | |Note: The ECC algorithm only protects data area and hardware ECC parity code by default + * | | |By setting PROT3BEN (NFI_NANDCTL[8]) high, the first 3 bytes of redundant data are also protected by ECC algorithm. + * |[25] |CS0 |NAND Flash Chip Select 0 Enable Bit + * | | |0 = Chip select 0 Enabled. + * | | |1 = Chip select 0 Disabled. + * @var NFI_T::NANDTMCTL + * Offset: 0x8A4 NAND Flash Timing Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |LOWID |Read/Write Enable Signal Low Pulse Width + * | | |This field controls the low pulse width of signals -RE and -WE while HARDWARE mode page access is enabled + * | | |The pulse width is a multiple of period of AHB bus clock + * | | |( The actual width time will be [clock period*(LOWID+1)] ) + * |[15:8] |HIWID |Read/Write Enable Signal High Pulse Width + * | | |This field controls the high pulse width of signals -RE and -WE while HARDWARE mode page access is enabled + * | | |The pulse width is a multiple of period of AHB bus clock + * | | |( The actual width time will be [clock period*(HIWID+1)] ) + * |[22:16] |CALESH |CLE/ALE Setup/Hold Time + * | | |This field controls the CLE/ALE setup/hold time to -WE. + * | | |The setup/hold time can be calculated using following equation: + * | | |tCLS = (CALESH+1)*TAHB. + * | | |tCLH = ((CALESH*2)+2)*TAHB. + * | | |tALS = (CALESH+1)*TAHB. + * | | |tALH = ((CALESH*2)+2)*TAHB. + * |[27:24] |EDOD |EDO Mode Delay Time + * | | |Control this field to delay sampling point when NAND Flash enters EDO mode only. + * | | |The EDO mode delay time can be calculated using following equation: + * | | |Delay time = (EDOD+1)*(TAHB/2). + * |[31] |EDOEN |EDO Mode Enable Bit + * | | |This bit specifies NAND Flash to EDO mode + * | | |Before trigger this bit, software should fill EDOD(NFI_NANDTMCTL[27:24]), CALESH(NFI_NANDTMCTL[22:16]), HIWID(NFI_NANDTMCTL[15:8]) and LOWID(NFI_NANDTMCTL[7:0]). + * | | |0 = EDO Mode related function Disabled. + * | | |1 = EDO Mode related function Enabled. + * | | |Note: Only NAND Flash entering EDO mode should set this bit. + * @var NFI_T::NANDINTEN + * Offset: 0x8A8 NAND Flash Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DMAIE |DMA Read/Write Data Complete Interrupt Enable Bit + * | | |0 = DMA read/write data complete interrupt generation Disabled. + * | | |1 = DMA read/write data complete interrupt generation Enabled. + * |[2] |ECCFLDIE |ECC Field Check Error Interrupt Enable Bit + * | | |This bit can check the ECC error on each field (512bytes) of data transfer + * | | |Enable this bit to detect error and do error correction. + * | | |0 = ECC field check error Disabled. + * | | |1 = ECC field check error Enabled. + * |[10] |RB0IE |Ready/-Busy Rising Edge Detect Interrupt Enable Bit + * | | |0 = R/-B rising edge detect interrupt generation Disabled. + * | | |1 = R/-B rising edge detect interrupt generation Enabled. + * @var NFI_T::NANDINTSTS + * Offset: 0x8AC NAND Flash Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DMAIF |DMA Read/Write Data Complete Interrupt Flag (Read Only) + * | | |0 = DMA read/write transfer is not finished yet. + * | | |1 = DMA read/write transfer is done. + * | | |Note: This bit is read only, but can be cleared by writing '1' to it. + * |[2] |ECCFLDIF |ECC Field Check Error Interrupt Flag (Read Only) + * | | |This bit can check the ECC error on each field (512bytes) of data transfer + * | | |Read this bit to check if the error occurred. + * | | |0 = No occurrence of ECC error. + * | | |1 = Occurrence of ECC error. + * | | |Note: This bit is read only, but can be cleared by writing '1' to it. + * |[4] |EDOF |EDO Mode Entrance Flag (Read Only) + * | | |0 = NAND Flash did not enter EDO mode. + * | | |1 = NAND Flash entered EDO mode. + * | | |Note: This bit is read only, but can be cleared by writing '1' to it. + * |[10] |RB0IF |Ready/-Busy 0 Rising Edge Detect Interrupt Flag (Read Only) + * | | |0 = R/-B rising edge is not detected. + * | | |1 = R/-B rising edge is detected. + * | | |Note: This bit is read only, but can be cleared by writing '1' to it. + * |[18] |RB0Status |Ready/-Busy 0 Pin Status (Read Only) + * | | |This bit reflects the Ready/-Busy pin status of NAND Flash. + * @var NFI_T::NANDCMD + * Offset: 0x8B0 NAND Flash Command Port Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |COMMAND |NAND Flash Command Port + * | | |When CPU writes to this port, NFI will send a command to NAND Flash. + * @var NFI_T::NANDADDR + * Offset: 0x8B4 NAND Flash Address Port Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |ADDRESS |NAND Flash Address Port + * | | |By writing this port, NAND Flash control will send an address to NAND Flash. + * |[31] |EOA |End of Address + * | | |Write this bit to indicate if this address is the last one or not + * | | |By writing address port with this bit low, the NAND Flash controller will set ALE pin to active (HIGH) + * | | |After the last address is written (with this bit set high), the NAND Flash controller will set ALE pin to inactive (LOW). + * | | |0 = Not the last address cycle. + * | | |1 = The last one address cycle. + * @var NFI_T::NANDDATA + * Offset: 0x8B8 NAND Flash Data Port Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |DATA |NAND Flash Data Port + * | | |CPU can access NAND's memory array through this data port + * | | |When CPU WRITE, the lower 8-bit data from CPU will appear on the data bus of NAND controller + * | | |When CPU READ, NAND controller will get 8-bit data from data bus. + * @var NFI_T::NANDRACTL + * Offset: 0x8BC NAND Flash Redundant Area Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |RA128EN |Redundant Area 128 Byte Enable Bit + * | | |These bits indicate NAND Flash extended redundant area. + * | | |If PSIZE (NFI_NANDCTL[17:16]) = 2'b01, this field will be set 0x40 (64bytes) automatically. + * | | |If PSIZE (NFI_NANDCTL[17:16]) = 2'b10, this field will be set 0x80 (128 bytes) automatically. + * | | |If PSIZE (NFI_NANDCTL[17:16]) = 2'b11, this field will be set 0x100 (256bytes) automatically. + * | | |Note: The REA128EN must be 4 byte aligned, so bit1 and bit0 can't be filled 1 to it. + * | | |The maximum redundant area of the controller is 472Bytes. + * |[31:16] |MECC |Mask ECC During Write Page Data + * | | |These 16 bits registers indicate NAND controller to write out ECC parity or just 0xFF for each field (every 512 bytes) the real parity data will be write out to NFI_NANDRAx. + * | | |0x00 = Do not mask the ECC parity for each field. + * | | |0x01 = Mask ECC parity and write out FF to NAND ECC parity for 512 Bytes page size or 2K/4K/8K page size first 512 field. + * | | |0x02 = Mask ECC parity and write out FF to NAND ECC parity for 512 Bytes page size or 2K/4K/8K page size second 512 field. + * | | |Others = Mask ECC parity and write out FF to NAND ECC parity for 512 Bytes page size or 2K/4K/8K page size each 512 field. + * @var NFI_T::NANDECTL + * Offset: 0x8C0 NAND Flash Extend Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WP |NAND Flash Write Protect Control + * | | |Set this bit low (low active) to make NAND_nWP functional pin low to prevent the write to NAND Flash device. + * | | |0 = NAND Flash is write-protected and is not writeable. + * | | |1 = NAND Flash is not write-protected and is writeable. + * @var NFI_T::NANDECCES0 + * Offset: 0x8D0 NAND Flash ECC Error Status 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |F1STAT |ECC Status of Field 1 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 1. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[6:2] |F1ECNT |Error Count of ECC Field 1 + * | | |This field contains the error counts after ECC correct calculation of Field 1 + * | | |For this ECC core (BCH algorithm), only when F1STAT equals to 0x01, the value in this field is meaningful + * | | |F1ECNT means how many errors depending on which ECC is used. + * |[9:8] |F2STAT |ECC Status of Field 2 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 2. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[14:10] |F2ECNT |Error Count of ECC Field 2 + * | | |This field contains the error counts after ECC correct calculation of Field 2 + * | | |For this ECC core (BCH algorithm), only when F2STAT equals to 0x01, the value in this field is meaningful + * | | |F2ECNT means how many errors depending on which ECC is used. + * |[17:16] |F3STAT |ECC Status of Field 3 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 3. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[22:18] |F3ECNT |Error Count of ECC Field 3 + * | | |This field contains the error counts after ECC correct calculation of Field 3 + * | | |For this ECC core (BCH algorithm), only when F3STAT equals to 0x01, the value in this field is meaningful + * | | |F3ECNT means how many errors depending on which ECC is used. + * |[25:24] |F4STAT |ECC Status of Field 4 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 4. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[30:26] |F4ECNT |Error Count of ECC Field 4 + * | | |This field contains the error counts after ECC correct calculation of Field 4 + * | | |For this ECC core (BCH algorithm), only when F4STAT equals to 0x01, the value in this field is meaningful + * | | |F4ECNT means how many errors depending on which ECC is used. + * @var NFI_T::NANDECCES1 + * Offset: 0x8D4 NAND Flash ECC Error Status 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |F5STAT |ECC Status of Field 5 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field5. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[6:2] |F5ECNT |Error Count of ECC Field 5 + * | | |This field contains the error counts after ECC correct calculation of Field 5 + * | | |For this ECC core (BCH algorithm), only when F5STAT equals to 0x01, the value in this field is meaningful + * | | |F5ECNT means how many errors depending on which ECC is used. + * |[9:8] |F6STAT |ECC Status of Field 6 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 6. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[14:10] |F6ECNT |Error Count of ECC Field 6 + * | | |This field contains the error counts after ECC correct calculation of Field 6 + * | | |For this ECC core (BCH algorithm), only when F6STAT equals to 0x01, the value in this field is meaningful + * | | |F6ECNT means how many errors depending on which ECC is used. + * |[17:16] |F7STAT |ECC Status of Field 7 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 7. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[22:18] |F7ECNT |Error Count of ECC Field 7 + * | | |This field contains the error counts after ECC correct calculation of Field 7 + * | | |For this ECC core (BCH algorithm), only when F7STAT equals to 0x01, the value in this field is meaningful + * | | |F7ECNT means how many errors depending on which ECC is used. + * |[25:24] |F8STAT |ECC Status of Field 8 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 8. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[30:26] |F8ECNT |Error Count of ECC Field 8 + * | | |This field contains the error counts after ECC correct calculation of Field 8 + * | | |For this ECC core (BCH algorithm), only when F8STAT equals to 0x01, the value in this field is meaningful + * | | |F8ECNT means how many errors depending on which ECC is used. + * @var NFI_T::NANDECCES2 + * Offset: 0x8D8 NAND Flash ECC Error Status 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |F9STAT |ECC Status of Field 9 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 9. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[6:2] |F9ECNT |Error Count of ECC Field 9 + * | | |This field contains the error counts after ECC correct calculation of Field 9 + * | | |For this ECC core (BCH algorithm), only when F9STAT equals to 0x01, the value in this field is meaningful + * | | |F9ECNT means how many errors depending on which ECC is used. + * |[9:8] |F10STAT |ECC Status of Field 10 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 10. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[14:10] |F10ECNT |Error Count of ECC Field 10 + * | | |This field contains the error counts after ECC correct calculation of Field 10 + * | | |For this ECC core (BCH algorithm), only when F10STAT equals to 0x01, the value in this field is meaningful + * | | |F10ECNT means how many errors depending on which ECC is used. + * |[17:16] |F11STAT |ECC Status of Field 11 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 11. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[22:18] |F11ECNT |Error Count of ECC Field 11 + * | | |This field contains the error counts after ECC correct calculation of Field 11 + * | | |For this ECC core (BCH algorithm), only when F11STAT equals to 0x01, the value in this field is meaningful + * | | |F11ECNT means how many errors depending on which ECC is used. + * |[25:24] |F12STAT |ECC Status of Field 12 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 12. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[30:26] |F12ECNT |Error Count of ECC Field 12 + * | | |This field contains the error counts after ECC correct calculation of Field 12 + * | | |For this ECC core (BCH algorithm), only when F12STAT equals to 0x01, the value in this field is meaningful + * | | |F12ECNT means how many errors depending on which ECC is used. + * @var NFI_T::NANDECCES3 + * Offset: 0x8DC NAND Flash ECC Error Status 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |F13STAT |ECC Status of Field 13 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 13. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[6:2] |F13ECNT |Error Count of ECC Field 13 + * | | |This field contains the error counts after ECC correct calculation of Field 13 + * | | |For this ECC core (BCH algorithm), only when F13STAT equals to 0x01, the value in this field is meaningful + * | | |F13ECNT means how many errors depending on which ECC is used. + * |[9:8] |F14STAT |ECC Status of Field 14 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 14. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[14:10] |F14ECNT |Error Count of ECC Field 14 + * | | |This field contains the error counts after ECC correct calculation of Field 14 + * | | |For this ECC core (BCH algorithm), only when F14STAT equals to 0x01, the value in this field is meaningful + * | | |F14ECNT means how many errors depending on which ECC is used. + * |[17:16] |F15STAT |ECC Status of Field 15 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 15. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[22:18] |F15ECNT |Error Count of ECC Field 15 + * | | |This field contains the error counts after ECC correct calculation of Field 15 + * | | |For this ECC core (BCH algorithm), only when F15STAT equals to 0x01, the value in this field is meaningful + * | | |F15ECNT means how many errors depending on which ECC is used. + * |[25:24] |F16STAT |ECC Status of Field 16 + * | | |This field contains the ECC correction status (BCH algorithm) of ECC-field 16. + * | | |00 = No error. + * | | |01 = Correctable error. + * | | |10 = Uncorrectable error. + * | | |11 = Reserved. + * |[30:26] |F16ECNT |Error Count of ECC Field 16 + * | | |This field contains the error counts after ECC correct calculation of Field 16 + * | | |For this ECC core (BCH algorithm), only when F16STAT equals to 0x01, the value in this field is meaningful + * | | |F16ECNT means how many errors depending on which ECC is used. + * @var NFI_T::NANDECCEA0 + * Offset: 0x900 NAND Flash ECC Error Byte Address 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |ERRADDR0 |ECC Error Address First Field of Error 0 + * | | |This field contains an 11-bit ECC error address 0 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA0 (NFI_NANDECCED0[7:0]), to correct this error. + * |[26:16] |ERRADDR1 |ECC Error Address First Field of Error 1 + * | | |This field contains an 11-bit ECC error address 1 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA1 (NFI_NANDECCED0[15:8]), to correct this error. + * @var NFI_T::NANDECCEA1 + * Offset: 0x904 NAND Flash ECC Error Byte Address 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |ERRADDR2 |ECC Error Address First Field of Error 2 + * | | |This field contains an 11-bit ECC error address 2 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA2 (NFI_NANDECCED0[23:16]), to correct this error. + * |[26:16] |ERRADDR3 |ECC Error Address First Field of Error 3 + * | | |This field contains an 11-bit ECC error address 3 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA3 (NFI_NANDECCED0[31:24]), to correct this error. + * @var NFI_T::NANDECCEA2 + * Offset: 0x908 NAND Flash ECC Error Byte Address 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |ERRADDR4 |ECC Error Address First Field of Error 4 + * | | |This field contains an 11-bit ECC error address 4 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA4 (NFI_NANDECCED1[7:0]), to correct this error. + * |[26:16] |ERRADDR5 |ECC Error Address First Field of Error 5 + * | | |This field contains an 11-bit ECC error address 5 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA5 (NFI_NANDECCED1[15:8]), to correct this error. + * @var NFI_T::NANDECCEA3 + * Offset: 0x90C NAND Flash ECC Error Byte Address 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |ERRADDR6 |ECC Error Address First Field of Error 6 + * | | |This field contains an 11-bit ECC error address 6 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA6 (NFI_NANDECCED1[23:16]), to correct this error. + * |[26:16] |ERRADDR7 |ECC Error Address First Field of Error 7 + * | | |This field contains an 11-bit ECC error address 7 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA7 (NFI_NANDECCED1[31:24]), to correct this error. + * @var NFI_T::NANDECCEA4 + * Offset: 0x910 NAND Flash ECC Error Byte Address 4 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |ERRADDR8 |ECC Error Address First Field of Error 8 + * | | |This field contains an 11-bit ECC error address 8 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA8 (NFI_NANDECCED2[7:0]), to correct this error. + * |[26:16] |ERRADDR9 |ECC Error Address First Field of Error 9 + * | | |This field contains an 11-bit ECC error address 9 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA9 (NFI_NANDECCED2[15:8]), to correct this error. + * @var NFI_T::NANDECCEA5 + * Offset: 0x914 NAND Flash ECC Error Byte Address 5 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |ERRADDR10 |ECC Error Address First Field of Error 10 + * | | |This field contains an 11-bit ECC error address 10 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA10 (NFI_NANDECCED2[23:16]), to correct this error. + * |[26:16] |ERRADDR11 |ECC Error Address First Field of Error 11 + * | | |This field contains an 11-bit ECC error address 11 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA11 (NFI_NANDECCED2[31:24]), to correct this error. + * @var NFI_T::NANDECCEA6 + * Offset: 0x918 NAND Flash ECC Error Byte Address 6 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |ERRADDR12 |ECC Error Address First Field of Error 12 + * | | |This field contains an 11-bit ECC error address 12 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA12 (NFI_NANDECCED3[7:0]), to correct this error. + * |[26:16] |ERRADDR13 |ECC Error Address First Field of Error 13 + * | | |This field contains an 11-bit ECC error address 13 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA13 (NFI_NANDECCED3[15:8]), to correct this error. + * @var NFI_T::NANDECCEA7 + * Offset: 0x91C NAND Flash ECC Error Byte Address 7 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |ERRADDR14 |ECC Error Address First Field of Error 14 + * | | |This field contains an 11-bit ECC error address 14 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA14 (NFI_NANDECCED3[23:16]), to correct this error. + * |[26:16] |ERRADDR15 |ECC Error Address First Field of Error 15 + * | | |This field contains an 11-bit ECC error address 15 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA15 (NFI_NANDECCED3[31:24]), to correct this error. + * @var NFI_T::NANDECCEA8 + * Offset: 0x920 NAND Flash ECC Error Byte Address 8 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |ERRADDR16 |ECC Error Address First Field of Error 16 + * | | |This field contains an 11-bit ECC error address 16 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA16 (NFI_NANDECCED4[7:0]), to correct this error. + * |[26:16] |ERRADDR17 |ECC Error Address First Field of Error 17 + * | | |This field contains an 11-bit ECC error address 17 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA17 (NFI_NANDECCED4[15:8]), to correct this error. + * @var NFI_T::NANDECCEA9 + * Offset: 0x924 NAND Flash ECC Error Byte Address 9 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |ERRADDR18 |ECC Error Address First Field of Error 18 + * | | |This field contains an 11-bit ECC error address 18 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA18 (NFI_NANDECCED4[23:16]), to correct this error. + * |[26:16] |ERRADDR19 |ECC Error Address First Field of Error 19 + * | | |This field contains an 11-bit ECC error address 19 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA19 (NFI_NANDECCED4[31:24]), to correct this error. + * @var NFI_T::NANDECCEA10 + * Offset: 0x928 NAND Flash ECC Error Byte Address 10 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |ERRADDR20 |ECC Error Address First Field of Error 20 + * | | |This field contains an 11-bit ECC error address 20 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA20 (NFI_NANDECCED5[7:0]), to correct this error. + * |[26:16] |ERRADDR21 |ECC Error Address First Field of Error 21 + * | | |This field contains an 11-bit ECC error address 21 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA21 (NFI_NANDECCED5[15:8]), to correct this error. + * @var NFI_T::NANDECCEA11 + * Offset: 0x92C NAND Flash ECC Error Byte Address 11 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[10:0] |ERRADDR22 |ECC Error Address First Field of Error 22 + * | | |This field contains an 11-bit ECC error address 22 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA22 (NFI_NANDECCED5[23:16]), to correct this error. + * |[26:16] |ERRADDR23 |ECC Error Address First Field of Error 23 + * | | |This field contains an 11-bit ECC error address 23 of first field + * | | |If it is a correctable error, please read the error data, ERRDATA23 (NFI_NANDECCED5[31:24]), to correct this error. + * @var NFI_T::NANDECCED0 + * Offset: 0x960 NAND Flash ECC Error Data Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |ERRDATA0 |ECC Error Data of First Field 0 + * | | |This field contains an 8-bit BCH ECC error data 0 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR0 (NFI_ANNDECCEA0[10:0]), and then the result will be the correct data. + * |[15:8] |ERRDATA1 |ECC Error Data of First Field 1 + * | | |This field contains an 8-bit BCH ECC error data 1 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR1 (NFI_NANDECCEA0[26:16]), and then the result will be the correct data. + * |[23:16] |ERRDATA2 |ECC Error Data of First Field 2 + * | | |This field contains an 8-bit BCH ECC error data 2 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR2 (NFI_NANDECCEA1[10:0]), and then the result will be the correct data. + * |[31:24] |ERRDATA3 |ECC Error Data of First Field 3 + * | | |This field contains an 8-bit BCH ECC error data 3 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR3 (NFI_NANDECCEA1[26:16]), and then the result will be the correct data. + * @var NFI_T::NANDECCED1 + * Offset: 0x964 NAND Flash ECC Error Data Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |ERRDATA4 |ECC Error Data of First Field 4 + * | | |This field contains an 8-bit BCH ECC error data 4 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR4 (NFI_NANDECCEA2[10:0]), and then the result will be the correct data. + * |[15:8] |ERRDATA5 |ECC Error Data of First Field 5 + * | | |This field contains an 8-bit BCH ECC error data 5 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR5 (NFI_NANDECCEA2[26:16]), and then the result will be the correct data. + * |[23:16] |ERRDATA6 |ECC Error Data of First Field 6 + * | | |This field contains an 8-bit BCH ECC error data 6 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR6 (NFI_NANDECCEA3[10:0]), and then the result will be the correct data. + * |[31:24] |ERRDATA7 |ECC Error Data of First Field 7 + * | | |This field contains an 8-bit BCH ECC error data 7 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR7 (NFI_NANDECCEA3[26:16]), and then the result will be the correct data. + * @var NFI_T::NANDECCED2 + * Offset: 0x968 NAND Flash ECC Error Data Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |ERRDATA8 |ECC Error Data of First Field 8 + * | | |This field contains an 8-bit BCH ECC error data 8 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR8 (NFI_NANDECCEA4[10:0]), and then the result will be the correct data. + * |[15:8] |ERRDATA9 |ECC Error Data of First Field 9 + * | | |This field contains an 8-bit BCH ECC error data 9 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR9 (NFI_NANDECCEA4[26:16]), and then the result will be the correct data. + * |[23:16] |ERRDATA10 |ECC Error Data of First Field 10 + * | | |This field contains an 8-bit BCH ECC error data 10 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR10 (NFI_NANDECCEA5[10:0]), and then the result will be the correct data. + * |[31:24] |ERRDATA11 |ECC Error Data of First Field 11 + * | | |This field contains an 8-bit BCH ECC error data 11 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR11 (NFI_NANDECCEA5[26:16]), and then the result will be the correct data. + * @var NFI_T::NANDECCED3 + * Offset: 0x96C NAND Flash ECC Error Data Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |ERRDATA12 |ECC Error Data of First Field 12 + * | | |This field contains an 8-bit BCH ECC error data 12 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR12 (NFI_NANDECCEA6[10:0]), and then the result will be the correct data. + * |[15:8] |ERRDATA13 |ECC Error Data of First Field 13 + * | | |This field contains an 8-bit BCH ECC error data 13 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR13 (NFI_NANDECCEA6[26:16]), and then the result will be the correct data. + * |[23:16] |ERRDATA14 |ECC Error Data of First Field 14 + * | | |This field contains an 8-bit BCH ECC error data 14 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR14 (NFI_NANDECCEA7[10:0]), and then the result will be the correct data. + * |[31:24] |ERRDATA15 |ECC Error Data of First Field 15 + * | | |This field contains an 8-bit BCH ECC error data 15 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR15 (NFI_NANDECCEA7[26:16]), and then the result will be the correct data. + * @var NFI_T::NANDECCED4 + * Offset: 0x970 NAND Flash ECC Error Data Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |ERRDATA16 |ECC Error Data of First Field 16 + * | | |This field contains an 8-bit BCH ECC error data 16 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR16 (NFI_NANDECCEA8[10:0]), and then the result will be the correct data. + * |[15:8] |ERRDATA17 |ECC Error Data of First Field 17 + * | | |This field contains an 8-bit BCH ECC error data 17 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR17 (NFI_NANDECCEA8[26:16]), and then the result will be the correct data. + * |[23:16] |ERRDATA18 |ECC Error Data of First Field 18 + * | | |This field contains an 8-bit BCH ECC error data 18 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR18 (NFI_NANDECCEA9[10:0]), and then the result will be the correct data. + * |[31:24] |ERRDATA19 |ECC Error Data of First Field 19 + * | | |This field contains an 8-bit BCH ECC error data 19 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR19 (NFI_NANDECCEA9[26:16]), and then the result will be the correct data. + * @var NFI_T::NANDECCED5 + * Offset: 0x974 NAND Flash ECC Error Data Register 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |ERRDATA20 |ECC Error Data of First Field 20 + * | | |This field contains an 8-bit BCH ECC error data 20 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR20 (NFI_NANDECCEA10[10:0]), and then the result will be the correct data. + * |[15:8] |ERRDATA21 |ECC Error Data of First Field 21 + * | | |This field contains an 8-bit BCH ECC error data 21 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR21 (NFI_NANDECCEA10[26:16]), and then the result will be the correct data. + * |[23:16] |ERRDATA22 |ECC Error Data of First Field 22 + * | | |This field contains an 8-bit BCH ECC error data 22 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR22 (NFI_NANDECCEA11[10:0]), and then the result will be the correct data. + * |[31:24] |ERRDATA23 |ECC Error Data of First Field 23 + * | | |This field contains an 8-bit BCH ECC error data 23 of first field + * | | |If it is a correctable error, please read out the error data in this field and doing bitwise XOR with received data locating at address ERRADDR23 (NFI_NANDECCEA11[26:16]), and then the result will be the correct data. + * @var NFI_T::NANDRA0 + * Offset: 0xA00 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA1 + * Offset: 0xA04 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA2 + * Offset: 0xA08 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA3 + * Offset: 0xA0C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA4 + * Offset: 0xA10 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA5 + * Offset: 0xA14 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA6 + * Offset: 0xA18 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA7 + * Offset: 0xA1C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA8 + * Offset: 0xA20 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA9 + * Offset: 0xA24 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA10 + * Offset: 0xA28 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA11 + * Offset: 0xA2C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA12 + * Offset: 0xA30 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA13 + * Offset: 0xA34 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA14 + * Offset: 0xA38 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA15 + * Offset: 0xA3C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA16 + * Offset: 0xA40 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA17 + * Offset: 0xA44 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA18 + * Offset: 0xA48 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA19 + * Offset: 0xA4C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA20 + * Offset: 0xA50 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA21 + * Offset: 0xA54 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA22 + * Offset: 0xA58 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA23 + * Offset: 0xA5C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA24 + * Offset: 0xA60 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA25 + * Offset: 0xA64 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA26 + * Offset: 0xA68 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA27 + * Offset: 0xA6C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA28 + * Offset: 0xA70 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA29 + * Offset: 0xA74 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA30 + * Offset: 0xA78 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA31 + * Offset: 0xA7C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA32 + * Offset: 0xA80 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA33 + * Offset: 0xA84 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA34 + * Offset: 0xA88 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA35 + * Offset: 0xA8C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA36 + * Offset: 0xA90 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA37 + * Offset: 0xA94 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA38 + * Offset: 0xA98 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA39 + * Offset: 0xA9C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA40 + * Offset: 0xAA0 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA41 + * Offset: 0xAA4 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA42 + * Offset: 0xAA8 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA43 + * Offset: 0xAAC NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA44 + * Offset: 0xAB0 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA45 + * Offset: 0xAB4 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA46 + * Offset: 0xAB8 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA47 + * Offset: 0xABC NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA48 + * Offset: 0xAC0 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA49 + * Offset: 0xAC4 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA50 + * Offset: 0xAC8 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA51 + * Offset: 0xACC NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA52 + * Offset: 0xAD0 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA53 + * Offset: 0xAD4 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA54 + * Offset: 0xAD8 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA55 + * Offset: 0xADC NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA56 + * Offset: 0xAE0 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA57 + * Offset: 0xAE4 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA58 + * Offset: 0xAE8 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA59 + * Offset: 0xAEC NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA60 + * Offset: 0xAF0 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA61 + * Offset: 0xAF4 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA62 + * Offset: 0xAF8 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA63 + * Offset: 0xAFC NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA64 + * Offset: 0xB00 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA65 + * Offset: 0xB04 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA66 + * Offset: 0xB08 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA67 + * Offset: 0xB0C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA68 + * Offset: 0xB10 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA69 + * Offset: 0xB14 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA70 + * Offset: 0xB18 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA71 + * Offset: 0xB1C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA72 + * Offset: 0xB20 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA73 + * Offset: 0xB24 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA74 + * Offset: 0xB28 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA75 + * Offset: 0xB2C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA76 + * Offset: 0xB30 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA77 + * Offset: 0xB34 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA78 + * Offset: 0xB38 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA79 + * Offset: 0xB3C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA80 + * Offset: 0xB40 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA81 + * Offset: 0xB44 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA82 + * Offset: 0xB48 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA83 + * Offset: 0xB4C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA84 + * Offset: 0xB50 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA85 + * Offset: 0xB54 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA86 + * Offset: 0xB58 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA87 + * Offset: 0xB5C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA88 + * Offset: 0xB60 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA89 + * Offset: 0xB64 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA90 + * Offset: 0xB68 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA91 + * Offset: 0xB6C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA92 + * Offset: 0xB70 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA93 + * Offset: 0xB74 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA94 + * Offset: 0xB78 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA95 + * Offset: 0xB7C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA96 + * Offset: 0xB80 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA97 + * Offset: 0xB84 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA98 + * Offset: 0xB88 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA99 + * Offset: 0xB8C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA100 + * Offset: 0xB90 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA101 + * Offset: 0xB94 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA102 + * Offset: 0xB98 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA103 + * Offset: 0xB9C NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA104 + * Offset: 0xBA0 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA105 + * Offset: 0xBA4 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA106 + * Offset: 0xBA8 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA107 + * Offset: 0xBAC NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA108 + * Offset: 0xBB0 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA109 + * Offset: 0xBB4 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA110 + * Offset: 0xBB8 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA111 + * Offset: 0xBBC NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA112 + * Offset: 0xBC0 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA113 + * Offset: 0xBC4 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA114 + * Offset: 0xBC8 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA115 + * Offset: 0xBCC NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA116 + * Offset: 0xBD0 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + * @var NFI_T::NANDRA117 + * Offset: 0xBD4 NAND Flash Redundant Area Word n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |Data |NAND Flash Redundant Area Word n + * | | |This field indicates a 32-bit data of redundant area. + */ + __IO uint32_t BUFFER0; /*!< [0x0000] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER1; /*!< [0x0004] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER2; /*!< [0x0008] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER3; /*!< [0x000c] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER4; /*!< [0x0010] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER5; /*!< [0x0014] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER6; /*!< [0x0018] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER7; /*!< [0x001c] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER8; /*!< [0x0020] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER9; /*!< [0x0024] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER10; /*!< [0x0028] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER11; /*!< [0x002c] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER12; /*!< [0x0030] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER13; /*!< [0x0034] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER14; /*!< [0x0038] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER15; /*!< [0x003c] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER16; /*!< [0x0040] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER17; /*!< [0x0044] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER18; /*!< [0x0048] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER19; /*!< [0x004c] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER20; /*!< [0x0050] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER21; /*!< [0x0054] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER22; /*!< [0x0058] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER23; /*!< [0x005c] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER24; /*!< [0x0060] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER25; /*!< [0x0064] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER26; /*!< [0x0068] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER27; /*!< [0x006c] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER28; /*!< [0x0070] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER29; /*!< [0x0074] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER30; /*!< [0x0078] NFI Embedded Buffer Word n */ + __IO uint32_t BUFFER31; /*!< [0x007c] NFI Embedded Buffer Word n */ + __I uint32_t RESERVE0[224]; + __IO uint32_t DMACTL; /*!< [0x0400] NFI DMA Control and Status Register */ + __I uint32_t RESERVE1[1]; + __IO uint32_t DMASA; /*!< [0x0408] NFI DMA Transfer Starting Address Register */ + __I uint32_t DMABCNT; /*!< [0x040c] NFI DMA Transfer Byte Count Register */ + __IO uint32_t DMAINTEN; /*!< [0x0410] NFI DMA Interrupt Enable Control Register */ + __I uint32_t DMAINTSTS; /*!< [0x0414] NFI DMA Interrupt Status Register */ + __I uint32_t RESERVE2[250]; + __IO uint32_t GCTL; /*!< [0x0800] NFI Global Control and Status Register */ + __IO uint32_t GINTEN; /*!< [0x0804] NFI Global Interrupt Control Register */ + __I uint32_t GINTSTS; /*!< [0x0808] NFI Global Interrupt Status Register */ + __I uint32_t RESERVE3[37]; + __IO uint32_t NANDCTL; /*!< [0x08a0] NAND Flash Control Register */ + __IO uint32_t NANDTMCTL; /*!< [0x08a4] NAND Flash Timing Control Register */ + __IO uint32_t NANDINTEN; /*!< [0x08a8] NAND Flash Interrupt Enable Register */ + __IO uint32_t NANDINTSTS; /*!< [0x08ac] NAND Flash Interrupt Status Register */ + __O uint32_t NANDCMD; /*!< [0x08b0] NAND Flash Command Port Register */ + __O uint32_t NANDADDR; /*!< [0x08b4] NAND Flash Address Port Register */ + __IO uint32_t NANDDATA; /*!< [0x08b8] NAND Flash Data Port Register */ + __IO uint32_t NANDRACTL; /*!< [0x08bc] NAND Flash Redundant Area Control Register */ + __IO uint32_t NANDECTL; /*!< [0x08c0] NAND Flash Extend Control Register */ + __I uint32_t RESERVE4[3]; + __I uint32_t NANDECCES0; /*!< [0x08d0] NAND Flash ECC Error Status 0 Register */ + __I uint32_t NANDECCES1; /*!< [0x08d4] NAND Flash ECC Error Status 1 Register */ + __I uint32_t NANDECCES2; /*!< [0x08d8] NAND Flash ECC Error Status 2 Register */ + __I uint32_t NANDECCES3; /*!< [0x08dc] NAND Flash ECC Error Status 3 Register */ + __I uint32_t RESERVE5[8]; + __I uint32_t NANDECCEA0; /*!< [0x0900] NAND Flash ECC Error Byte Address 0 Register */ + __I uint32_t NANDECCEA1; /*!< [0x0904] NAND Flash ECC Error Byte Address 1 Register */ + __I uint32_t NANDECCEA2; /*!< [0x0908] NAND Flash ECC Error Byte Address 2 Register */ + __I uint32_t NANDECCEA3; /*!< [0x090c] NAND Flash ECC Error Byte Address 3 Register */ + __I uint32_t NANDECCEA4; /*!< [0x0910] NAND Flash ECC Error Byte Address 4 Register */ + __I uint32_t NANDECCEA5; /*!< [0x0914] NAND Flash ECC Error Byte Address 5 Register */ + __I uint32_t NANDECCEA6; /*!< [0x0918] NAND Flash ECC Error Byte Address 6 Register */ + __I uint32_t NANDECCEA7; /*!< [0x091c] NAND Flash ECC Error Byte Address 7 Register */ + __I uint32_t NANDECCEA8; /*!< [0x0920] NAND Flash ECC Error Byte Address 8 Register */ + __I uint32_t NANDECCEA9; /*!< [0x0924] NAND Flash ECC Error Byte Address 9 Register */ + __I uint32_t NANDECCEA10; /*!< [0x0928] NAND Flash ECC Error Byte Address 10 Register */ + __I uint32_t NANDECCEA11; /*!< [0x092c] NAND Flash ECC Error Byte Address 11 Register */ + __I uint32_t RESERVE6[12]; + __I uint32_t NANDECCED0; /*!< [0x0960] NAND Flash ECC Error Data Register 0 */ + __I uint32_t NANDECCED1; /*!< [0x0964] NAND Flash ECC Error Data Register 1 */ + __I uint32_t NANDECCED2; /*!< [0x0968] NAND Flash ECC Error Data Register 2 */ + __I uint32_t NANDECCED3; /*!< [0x096c] NAND Flash ECC Error Data Register 3 */ + __I uint32_t NANDECCED4; /*!< [0x0970] NAND Flash ECC Error Data Register 4 */ + __I uint32_t NANDECCED5; /*!< [0x0974] NAND Flash ECC Error Data Register 5 */ + __I uint32_t RESERVE7[34]; + __IO uint32_t NANDRA0; /*!< [0x0a00] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA1; /*!< [0x0a04] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA2; /*!< [0x0a08] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA3; /*!< [0x0a0c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA4; /*!< [0x0a10] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA5; /*!< [0x0a14] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA6; /*!< [0x0a18] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA7; /*!< [0x0a1c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA8; /*!< [0x0a20] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA9; /*!< [0x0a24] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA10; /*!< [0x0a28] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA11; /*!< [0x0a2c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA12; /*!< [0x0a30] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA13; /*!< [0x0a34] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA14; /*!< [0x0a38] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA15; /*!< [0x0a3c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA16; /*!< [0x0a40] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA17; /*!< [0x0a44] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA18; /*!< [0x0a48] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA19; /*!< [0x0a4c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA20; /*!< [0x0a50] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA21; /*!< [0x0a54] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA22; /*!< [0x0a58] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA23; /*!< [0x0a5c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA24; /*!< [0x0a60] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA25; /*!< [0x0a64] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA26; /*!< [0x0a68] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA27; /*!< [0x0a6c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA28; /*!< [0x0a70] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA29; /*!< [0x0a74] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA30; /*!< [0x0a78] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA31; /*!< [0x0a7c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA32; /*!< [0x0a80] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA33; /*!< [0x0a84] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA34; /*!< [0x0a88] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA35; /*!< [0x0a8c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA36; /*!< [0x0a90] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA37; /*!< [0x0a94] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA38; /*!< [0x0a98] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA39; /*!< [0x0a9c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA40; /*!< [0x0aa0] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA41; /*!< [0x0aa4] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA42; /*!< [0x0aa8] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA43; /*!< [0x0aac] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA44; /*!< [0x0ab0] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA45; /*!< [0x0ab4] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA46; /*!< [0x0ab8] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA47; /*!< [0x0abc] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA48; /*!< [0x0ac0] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA49; /*!< [0x0ac4] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA50; /*!< [0x0ac8] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA51; /*!< [0x0acc] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA52; /*!< [0x0ad0] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA53; /*!< [0x0ad4] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA54; /*!< [0x0ad8] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA55; /*!< [0x0adc] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA56; /*!< [0x0ae0] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA57; /*!< [0x0ae4] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA58; /*!< [0x0ae8] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA59; /*!< [0x0aec] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA60; /*!< [0x0af0] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA61; /*!< [0x0af4] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA62; /*!< [0x0af8] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA63; /*!< [0x0afc] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA64; /*!< [0x0b00] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA65; /*!< [0x0b04] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA66; /*!< [0x0b08] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA67; /*!< [0x0b0c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA68; /*!< [0x0b10] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA69; /*!< [0x0b14] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA70; /*!< [0x0b18] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA71; /*!< [0x0b1c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA72; /*!< [0x0b20] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA73; /*!< [0x0b24] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA74; /*!< [0x0b28] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA75; /*!< [0x0b2c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA76; /*!< [0x0b30] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA77; /*!< [0x0b34] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA78; /*!< [0x0b38] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA79; /*!< [0x0b3c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA80; /*!< [0x0b40] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA81; /*!< [0x0b44] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA82; /*!< [0x0b48] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA83; /*!< [0x0b4c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA84; /*!< [0x0b50] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA85; /*!< [0x0b54] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA86; /*!< [0x0b58] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA87; /*!< [0x0b5c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA88; /*!< [0x0b60] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA89; /*!< [0x0b64] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA90; /*!< [0x0b68] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA91; /*!< [0x0b6c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA92; /*!< [0x0b70] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA93; /*!< [0x0b74] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA94; /*!< [0x0b78] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA95; /*!< [0x0b7c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA96; /*!< [0x0b80] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA97; /*!< [0x0b84] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA98; /*!< [0x0b88] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA99; /*!< [0x0b8c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA100; /*!< [0x0b90] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA101; /*!< [0x0b94] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA102; /*!< [0x0b98] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA103; /*!< [0x0b9c] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA104; /*!< [0x0ba0] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA105; /*!< [0x0ba4] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA106; /*!< [0x0ba8] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA107; /*!< [0x0bac] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA108; /*!< [0x0bb0] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA109; /*!< [0x0bb4] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA110; /*!< [0x0bb8] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA111; /*!< [0x0bbc] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA112; /*!< [0x0bc0] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA113; /*!< [0x0bc4] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA114; /*!< [0x0bc8] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA115; /*!< [0x0bcc] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA116; /*!< [0x0bd0] NAND Flash Redundant Area Word n */ + __IO uint32_t NANDRA117; /*!< [0x0bd4] NAND Flash Redundant Area Word n */ + +} NFI_T; + +/** + @addtogroup NFI_CONST NFI Bit Field Definition + Constant Definitions for NFI Controller +@{ */ + +#define NFI_BUFFER0_Data_Pos (0) /*!< NFI_T::BUFFER0: Data Position */ +#define NFI_BUFFER0_Data_Msk (0xfffffffful << NFI_BUFFER0_Data_Pos) /*!< NFI_T::BUFFER0: Data Mask */ + +#define NFI_BUFFER1_Data_Pos (0) /*!< NFI_T::BUFFER1: Data Position */ +#define NFI_BUFFER1_Data_Msk (0xfffffffful << NFI_BUFFER1_Data_Pos) /*!< NFI_T::BUFFER1: Data Mask */ + +#define NFI_BUFFER2_Data_Pos (0) /*!< NFI_T::BUFFER2: Data Position */ +#define NFI_BUFFER2_Data_Msk (0xfffffffful << NFI_BUFFER2_Data_Pos) /*!< NFI_T::BUFFER2: Data Mask */ + +#define NFI_BUFFER3_Data_Pos (0) /*!< NFI_T::BUFFER3: Data Position */ +#define NFI_BUFFER3_Data_Msk (0xfffffffful << NFI_BUFFER3_Data_Pos) /*!< NFI_T::BUFFER3: Data Mask */ + +#define NFI_BUFFER4_Data_Pos (0) /*!< NFI_T::BUFFER4: Data Position */ +#define NFI_BUFFER4_Data_Msk (0xfffffffful << NFI_BUFFER4_Data_Pos) /*!< NFI_T::BUFFER4: Data Mask */ + +#define NFI_BUFFER5_Data_Pos (0) /*!< NFI_T::BUFFER5: Data Position */ +#define NFI_BUFFER5_Data_Msk (0xfffffffful << NFI_BUFFER5_Data_Pos) /*!< NFI_T::BUFFER5: Data Mask */ + +#define NFI_BUFFER6_Data_Pos (0) /*!< NFI_T::BUFFER6: Data Position */ +#define NFI_BUFFER6_Data_Msk (0xfffffffful << NFI_BUFFER6_Data_Pos) /*!< NFI_T::BUFFER6: Data Mask */ + +#define NFI_BUFFER7_Data_Pos (0) /*!< NFI_T::BUFFER7: Data Position */ +#define NFI_BUFFER7_Data_Msk (0xfffffffful << NFI_BUFFER7_Data_Pos) /*!< NFI_T::BUFFER7: Data Mask */ + +#define NFI_BUFFER8_Data_Pos (0) /*!< NFI_T::BUFFER8: Data Position */ +#define NFI_BUFFER8_Data_Msk (0xfffffffful << NFI_BUFFER8_Data_Pos) /*!< NFI_T::BUFFER8: Data Mask */ + +#define NFI_BUFFER9_Data_Pos (0) /*!< NFI_T::BUFFER9: Data Position */ +#define NFI_BUFFER9_Data_Msk (0xfffffffful << NFI_BUFFER9_Data_Pos) /*!< NFI_T::BUFFER9: Data Mask */ + +#define NFI_BUFFER10_Data_Pos (0) /*!< NFI_T::BUFFER10: Data Position */ +#define NFI_BUFFER10_Data_Msk (0xfffffffful << NFI_BUFFER10_Data_Pos) /*!< NFI_T::BUFFER10: Data Mask */ + +#define NFI_BUFFER11_Data_Pos (0) /*!< NFI_T::BUFFER11: Data Position */ +#define NFI_BUFFER11_Data_Msk (0xfffffffful << NFI_BUFFER11_Data_Pos) /*!< NFI_T::BUFFER11: Data Mask */ + +#define NFI_BUFFER12_Data_Pos (0) /*!< NFI_T::BUFFER12: Data Position */ +#define NFI_BUFFER12_Data_Msk (0xfffffffful << NFI_BUFFER12_Data_Pos) /*!< NFI_T::BUFFER12: Data Mask */ + +#define NFI_BUFFER13_Data_Pos (0) /*!< NFI_T::BUFFER13: Data Position */ +#define NFI_BUFFER13_Data_Msk (0xfffffffful << NFI_BUFFER13_Data_Pos) /*!< NFI_T::BUFFER13: Data Mask */ + +#define NFI_BUFFER14_Data_Pos (0) /*!< NFI_T::BUFFER14: Data Position */ +#define NFI_BUFFER14_Data_Msk (0xfffffffful << NFI_BUFFER14_Data_Pos) /*!< NFI_T::BUFFER14: Data Mask */ + +#define NFI_BUFFER15_Data_Pos (0) /*!< NFI_T::BUFFER15: Data Position */ +#define NFI_BUFFER15_Data_Msk (0xfffffffful << NFI_BUFFER15_Data_Pos) /*!< NFI_T::BUFFER15: Data Mask */ + +#define NFI_BUFFER16_Data_Pos (0) /*!< NFI_T::BUFFER16: Data Position */ +#define NFI_BUFFER16_Data_Msk (0xfffffffful << NFI_BUFFER16_Data_Pos) /*!< NFI_T::BUFFER16: Data Mask */ + +#define NFI_BUFFER17_Data_Pos (0) /*!< NFI_T::BUFFER17: Data Position */ +#define NFI_BUFFER17_Data_Msk (0xfffffffful << NFI_BUFFER17_Data_Pos) /*!< NFI_T::BUFFER17: Data Mask */ + +#define NFI_BUFFER18_Data_Pos (0) /*!< NFI_T::BUFFER18: Data Position */ +#define NFI_BUFFER18_Data_Msk (0xfffffffful << NFI_BUFFER18_Data_Pos) /*!< NFI_T::BUFFER18: Data Mask */ + +#define NFI_BUFFER19_Data_Pos (0) /*!< NFI_T::BUFFER19: Data Position */ +#define NFI_BUFFER19_Data_Msk (0xfffffffful << NFI_BUFFER19_Data_Pos) /*!< NFI_T::BUFFER19: Data Mask */ + +#define NFI_BUFFER20_Data_Pos (0) /*!< NFI_T::BUFFER20: Data Position */ +#define NFI_BUFFER20_Data_Msk (0xfffffffful << NFI_BUFFER20_Data_Pos) /*!< NFI_T::BUFFER20: Data Mask */ + +#define NFI_BUFFER21_Data_Pos (0) /*!< NFI_T::BUFFER21: Data Position */ +#define NFI_BUFFER21_Data_Msk (0xfffffffful << NFI_BUFFER21_Data_Pos) /*!< NFI_T::BUFFER21: Data Mask */ + +#define NFI_BUFFER22_Data_Pos (0) /*!< NFI_T::BUFFER22: Data Position */ +#define NFI_BUFFER22_Data_Msk (0xfffffffful << NFI_BUFFER22_Data_Pos) /*!< NFI_T::BUFFER22: Data Mask */ + +#define NFI_BUFFER23_Data_Pos (0) /*!< NFI_T::BUFFER23: Data Position */ +#define NFI_BUFFER23_Data_Msk (0xfffffffful << NFI_BUFFER23_Data_Pos) /*!< NFI_T::BUFFER23: Data Mask */ + +#define NFI_BUFFER24_Data_Pos (0) /*!< NFI_T::BUFFER24: Data Position */ +#define NFI_BUFFER24_Data_Msk (0xfffffffful << NFI_BUFFER24_Data_Pos) /*!< NFI_T::BUFFER24: Data Mask */ + +#define NFI_BUFFER25_Data_Pos (0) /*!< NFI_T::BUFFER25: Data Position */ +#define NFI_BUFFER25_Data_Msk (0xfffffffful << NFI_BUFFER25_Data_Pos) /*!< NFI_T::BUFFER25: Data Mask */ + +#define NFI_BUFFER26_Data_Pos (0) /*!< NFI_T::BUFFER26: Data Position */ +#define NFI_BUFFER26_Data_Msk (0xfffffffful << NFI_BUFFER26_Data_Pos) /*!< NFI_T::BUFFER26: Data Mask */ + +#define NFI_BUFFER27_Data_Pos (0) /*!< NFI_T::BUFFER27: Data Position */ +#define NFI_BUFFER27_Data_Msk (0xfffffffful << NFI_BUFFER27_Data_Pos) /*!< NFI_T::BUFFER27: Data Mask */ + +#define NFI_BUFFER28_Data_Pos (0) /*!< NFI_T::BUFFER28: Data Position */ +#define NFI_BUFFER28_Data_Msk (0xfffffffful << NFI_BUFFER28_Data_Pos) /*!< NFI_T::BUFFER28: Data Mask */ + +#define NFI_BUFFER29_Data_Pos (0) /*!< NFI_T::BUFFER29: Data Position */ +#define NFI_BUFFER29_Data_Msk (0xfffffffful << NFI_BUFFER29_Data_Pos) /*!< NFI_T::BUFFER29: Data Mask */ + +#define NFI_BUFFER30_Data_Pos (0) /*!< NFI_T::BUFFER30: Data Position */ +#define NFI_BUFFER30_Data_Msk (0xfffffffful << NFI_BUFFER30_Data_Pos) /*!< NFI_T::BUFFER30: Data Mask */ + +#define NFI_BUFFER31_Data_Pos (0) /*!< NFI_T::BUFFER31: Data Position */ +#define NFI_BUFFER31_Data_Msk (0xfffffffful << NFI_BUFFER31_Data_Pos) /*!< NFI_T::BUFFER31: Data Mask */ + +#define NFI_DMACTL_DMACEN_Pos (0) /*!< NFI_T::DMACTL: DMACEN Position */ +#define NFI_DMACTL_DMACEN_Msk (0x1ul << NFI_DMACTL_DMACEN_Pos) /*!< NFI_T::DMACTL: DMACEN Mask */ + +#define NFI_DMACTL_DMARST_Pos (1) /*!< NFI_T::DMACTL: DMARST Position */ +#define NFI_DMACTL_DMARST_Msk (0x1ul << NFI_DMACTL_DMARST_Pos) /*!< NFI_T::DMACTL: DMARST Mask */ + +#define NFI_DMACTL_SGEN_Pos (3) /*!< NFI_T::DMACTL: SGEN Position */ +#define NFI_DMACTL_SGEN_Msk (0x1ul << NFI_DMACTL_SGEN_Pos) /*!< NFI_T::DMACTL: SGEN Mask */ + +#define NFI_DMACTL_DMABUSY_Pos (9) /*!< NFI_T::DMACTL: DMABUSY Position */ +#define NFI_DMACTL_DMABUSY_Msk (0x1ul << NFI_DMACTL_DMABUSY_Pos) /*!< NFI_T::DMACTL: DMABUSY Mask */ + +#define NFI_DMASA_ORDER_Pos (0) /*!< NFI_T::DMASA: ORDER Position */ +#define NFI_DMASA_ORDER_Msk (0x1ul << NFI_DMASA_ORDER_Pos) /*!< NFI_T::DMASA: ORDER Mask */ + +#define NFI_DMASA_DMASA_Pos (1) /*!< NFI_T::DMASA: DMASA Position */ +#define NFI_DMASA_DMASA_Msk (0x7ffffffful << NFI_DMASA_DMASA_Pos) /*!< NFI_T::DMASA: DMASA Mask */ + +#define NFI_DMABCNT_BCNT_Pos (0) /*!< NFI_T::DMABCNT: BCNT Position */ +#define NFI_DMABCNT_BCNT_Msk (0x3fffffful << NFI_DMABCNT_BCNT_Pos) /*!< NFI_T::DMABCNT: BCNT Mask */ + +#define NFI_DMAINTEN_ABORTIEN_Pos (0) /*!< NFI_T::DMAINTEN: ABORTIEN Position */ +#define NFI_DMAINTEN_ABORTIEN_Msk (0x1ul << NFI_DMAINTEN_ABORTIEN_Pos) /*!< NFI_T::DMAINTEN: ABORTIEN Mask */ + +#define NFI_DMAINTEN_WEOTIEN_Pos (1) /*!< NFI_T::DMAINTEN: WEOTIEN Position */ +#define NFI_DMAINTEN_WEOTIEN_Msk (0x1ul << NFI_DMAINTEN_WEOTIEN_Pos) /*!< NFI_T::DMAINTEN: WEOTIEN Mask */ + +#define NFI_DMAINTSTS_ABORTIF_Pos (0) /*!< NFI_T::DMAINTSTS: ABORTIF Position */ +#define NFI_DMAINTSTS_ABORTIF_Msk (0x1ul << NFI_DMAINTSTS_ABORTIF_Pos) /*!< NFI_T::DMAINTSTS: ABORTIF Mask */ + +#define NFI_DMAINTSTS_WEOTIF_Pos (1) /*!< NFI_T::DMAINTSTS: WEOTIF Position */ +#define NFI_DMAINTSTS_WEOTIF_Msk (0x1ul << NFI_DMAINTSTS_WEOTIF_Pos) /*!< NFI_T::DMAINTSTS: WEOTIF Mask */ + +#define NFI_GCTL_GCTLRST_Pos (0) /*!< NFI_T::GCTL: GCTLRST Position */ +#define NFI_GCTL_GCTLRST_Msk (0x1ul << NFI_GCTL_GCTLRST_Pos) /*!< NFI_T::GCTL: GCTLRST Mask */ + +#define NFI_GCTL_NANDEN_Pos (3) /*!< NFI_T::GCTL: NANDEN Position */ +#define NFI_GCTL_NANDEN_Msk (0x1ul << NFI_GCTL_NANDEN_Pos) /*!< NFI_T::GCTL: NANDEN Mask */ + +#define NFI_GINTEN_DTAIEN_Pos (0) /*!< NFI_T::GINTEN: DTAIEN Position */ +#define NFI_GINTEN_DTAIEN_Msk (0x1ul << NFI_GINTEN_DTAIEN_Pos) /*!< NFI_T::GINTEN: DTAIEN Mask */ + +#define NFI_GINTSTS_DTAIF_Pos (0) /*!< NFI_T::GINTSTS: DTAIF Position */ +#define NFI_GINTSTS_DTAIF_Msk (0x1ul << NFI_GINTSTS_DTAIF_Pos) /*!< NFI_T::GINTSTS: DTAIF Mask */ + +#define NFI_NANDCTL_SWRST_Pos (0) /*!< NFI_T::NANDCTL: SWRST Position */ +#define NFI_NANDCTL_SWRST_Msk (0x1ul << NFI_NANDCTL_SWRST_Pos) /*!< NFI_T::NANDCTL: SWRST Mask */ + +#define NFI_NANDCTL_DRDEN_Pos (1) /*!< NFI_T::NANDCTL: DRDEN Position */ +#define NFI_NANDCTL_DRDEN_Msk (0x1ul << NFI_NANDCTL_DRDEN_Pos) /*!< NFI_T::NANDCTL: DRDEN Mask */ + +#define NFI_NANDCTL_DWREN_Pos (2) /*!< NFI_T::NANDCTL: DWREN Position */ +#define NFI_NANDCTL_DWREN_Msk (0x1ul << NFI_NANDCTL_DWREN_Pos) /*!< NFI_T::NANDCTL: DWREN Mask */ + +#define NFI_NANDCTL_REDUNREN_Pos (3) /*!< NFI_T::NANDCTL: REDUNREN Position */ +#define NFI_NANDCTL_REDUNREN_Msk (0x1ul << NFI_NANDCTL_REDUNREN_Pos) /*!< NFI_T::NANDCTL: REDUNREN Mask */ + +#define NFI_NANDCTL_REDUNAUTOWEN_Pos (4) /*!< NFI_T::NANDCTL: REDUNAUTOWEN Position */ +#define NFI_NANDCTL_REDUNAUTOWEN_Msk (0x1ul << NFI_NANDCTL_REDUNAUTOWEN_Pos) /*!< NFI_T::NANDCTL: REDUNAUTOWEN Mask */ + +#define NFI_NANDCTL_ECCCHK_Pos (7) /*!< NFI_T::NANDCTL: ECCCHK Position */ +#define NFI_NANDCTL_ECCCHK_Msk (0x1ul << NFI_NANDCTL_ECCCHK_Pos) /*!< NFI_T::NANDCTL: ECCCHK Mask */ + +#define NFI_NANDCTL_PROT3BEN_Pos (8) /*!< NFI_T::NANDCTL: PROT3BEN Position */ +#define NFI_NANDCTL_PROT3BEN_Msk (0x1ul << NFI_NANDCTL_PROT3BEN_Pos) /*!< NFI_T::NANDCTL: PROT3BEN Mask */ + +#define NFI_NANDCTL_SRAMINT_Pos (9) /*!< NFI_T::NANDCTL: SRAMINT Position */ +#define NFI_NANDCTL_SRAMINT_Msk (0x1ul << NFI_NANDCTL_SRAMINT_Pos) /*!< NFI_T::NANDCTL: SRAMINT Mask */ + +#define NFI_NANDCTL_PSIZE_Pos (16) /*!< NFI_T::NANDCTL: PSIZE Position */ +#define NFI_NANDCTL_PSIZE_Msk (0x3ul << NFI_NANDCTL_PSIZE_Pos) /*!< NFI_T::NANDCTL: PSIZE Mask */ + +#define NFI_NANDCTL_BCHTSEL_Pos (18) /*!< NFI_T::NANDCTL: BCHTSEL Position */ +#define NFI_NANDCTL_BCHTSEL_Msk (0x1ful << NFI_NANDCTL_BCHTSEL_Pos) /*!< NFI_T::NANDCTL: BCHTSEL Mask */ + +#define NFI_NANDCTL_ECCEN_Pos (23) /*!< NFI_T::NANDCTL: ECCEN Position */ +#define NFI_NANDCTL_ECCEN_Msk (0x1ul << NFI_NANDCTL_ECCEN_Pos) /*!< NFI_T::NANDCTL: ECCEN Mask */ + +#define NFI_NANDCTL_CS0_Pos (25) /*!< NFI_T::NANDCTL: CS0 Position */ +#define NFI_NANDCTL_CS0_Msk (0x1ul << NFI_NANDCTL_CS0_Pos) /*!< NFI_T::NANDCTL: CS0 Mask */ + +#define NFI_NANDTMCTL_LOWID_Pos (0) /*!< NFI_T::NANDTMCTL: LOWID Position */ +#define NFI_NANDTMCTL_LOWID_Msk (0xfful << NFI_NANDTMCTL_LOWID_Pos) /*!< NFI_T::NANDTMCTL: LOWID Mask */ + +#define NFI_NANDTMCTL_HIWID_Pos (8) /*!< NFI_T::NANDTMCTL: HIWID Position */ +#define NFI_NANDTMCTL_HIWID_Msk (0xfful << NFI_NANDTMCTL_HIWID_Pos) /*!< NFI_T::NANDTMCTL: HIWID Mask */ + +#define NFI_NANDTMCTL_CALESH_Pos (16) /*!< NFI_T::NANDTMCTL: CALESH Position */ +#define NFI_NANDTMCTL_CALESH_Msk (0x7ful << NFI_NANDTMCTL_CALESH_Pos) /*!< NFI_T::NANDTMCTL: CALESH Mask */ + +#define NFI_NANDTMCTL_EDOD_Pos (24) /*!< NFI_T::NANDTMCTL: EDOD Position */ +#define NFI_NANDTMCTL_EDOD_Msk (0xful << NFI_NANDTMCTL_EDOD_Pos) /*!< NFI_T::NANDTMCTL: EDOD Mask */ + +#define NFI_NANDTMCTL_EDOEN_Pos (31) /*!< NFI_T::NANDTMCTL: EDOEN Position */ +#define NFI_NANDTMCTL_EDOEN_Msk (0x1ul << NFI_NANDTMCTL_EDOEN_Pos) /*!< NFI_T::NANDTMCTL: EDOEN Mask */ + +#define NFI_NANDINTEN_DMAIE_Pos (0) /*!< NFI_T::NANDINTEN: DMAIE Position */ +#define NFI_NANDINTEN_DMAIE_Msk (0x1ul << NFI_NANDINTEN_DMAIE_Pos) /*!< NFI_T::NANDINTEN: DMAIE Mask */ + +#define NFI_NANDINTEN_ECCFLDIE_Pos (2) /*!< NFI_T::NANDINTEN: ECCFLDIE Position */ +#define NFI_NANDINTEN_ECCFLDIE_Msk (0x1ul << NFI_NANDINTEN_ECCFLDIE_Pos) /*!< NFI_T::NANDINTEN: ECCFLDIE Mask */ + +#define NFI_NANDINTEN_RB0IE_Pos (10) /*!< NFI_T::NANDINTEN: RB0IE Position */ +#define NFI_NANDINTEN_RB0IE_Msk (0x1ul << NFI_NANDINTEN_RB0IE_Pos) /*!< NFI_T::NANDINTEN: RB0IE Mask */ + +#define NFI_NANDINTSTS_DMAIF_Pos (0) /*!< NFI_T::NANDINTSTS: DMAIF Position */ +#define NFI_NANDINTSTS_DMAIF_Msk (0x1ul << NFI_NANDINTSTS_DMAIF_Pos) /*!< NFI_T::NANDINTSTS: DMAIF Mask */ + +#define NFI_NANDINTSTS_ECCFLDIF_Pos (2) /*!< NFI_T::NANDINTSTS: ECCFLDIF Position */ +#define NFI_NANDINTSTS_ECCFLDIF_Msk (0x1ul << NFI_NANDINTSTS_ECCFLDIF_Pos) /*!< NFI_T::NANDINTSTS: ECCFLDIF Mask */ + +#define NFI_NANDINTSTS_EDOF_Pos (4) /*!< NFI_T::NANDINTSTS: EDOF Position */ +#define NFI_NANDINTSTS_EDOF_Msk (0x1ul << NFI_NANDINTSTS_EDOF_Pos) /*!< NFI_T::NANDINTSTS: EDOF Mask */ + +#define NFI_NANDINTSTS_RB0IF_Pos (10) /*!< NFI_T::NANDINTSTS: RB0IF Position */ +#define NFI_NANDINTSTS_RB0IF_Msk (0x1ul << NFI_NANDINTSTS_RB0IF_Pos) /*!< NFI_T::NANDINTSTS: RB0IF Mask */ + +#define NFI_NANDINTSTS_RB0Status_Pos (18) /*!< NFI_T::NANDINTSTS: RB0Status Position */ +#define NFI_NANDINTSTS_RB0Status_Msk (0x1ul << NFI_NANDINTSTS_RB0Status_Pos) /*!< NFI_T::NANDINTSTS: RB0Status Mask */ + +#define NFI_NANDCMD_COMMAND_Pos (0) /*!< NFI_T::NANDCMD: COMMAND Position */ +#define NFI_NANDCMD_COMMAND_Msk (0xfful << NFI_NANDCMD_COMMAND_Pos) /*!< NFI_T::NANDCMD: COMMAND Mask */ + +#define NFI_NANDADDR_ADDRESS_Pos (0) /*!< NFI_T::NANDADDR: ADDRESS Position */ +#define NFI_NANDADDR_ADDRESS_Msk (0xfful << NFI_NANDADDR_ADDRESS_Pos) /*!< NFI_T::NANDADDR: ADDRESS Mask */ + +#define NFI_NANDADDR_EOA_Pos (31) /*!< NFI_T::NANDADDR: EOA Position */ +#define NFI_NANDADDR_EOA_Msk (0x1ul << NFI_NANDADDR_EOA_Pos) /*!< NFI_T::NANDADDR: EOA Mask */ + +#define NFI_NANDDATA_DATA_Pos (0) /*!< NFI_T::NANDDATA: DATA Position */ +#define NFI_NANDDATA_DATA_Msk (0xfful << NFI_NANDDATA_DATA_Pos) /*!< NFI_T::NANDDATA: DATA Mask */ + +#define NFI_NANDRACTL_RA128EN_Pos (0) /*!< NFI_T::NANDRACTL: RA128EN Position */ +#define NFI_NANDRACTL_RA128EN_Msk (0x1fful << NFI_NANDRACTL_RA128EN_Pos) /*!< NFI_T::NANDRACTL: RA128EN Mask */ + +#define NFI_NANDRACTL_MECC_Pos (16) /*!< NFI_T::NANDRACTL: MECC Position */ +#define NFI_NANDRACTL_MECC_Msk (0xfffful << NFI_NANDRACTL_MECC_Pos) /*!< NFI_T::NANDRACTL: MECC Mask */ + +#define NFI_NANDECTL_WP_Pos (0) /*!< NFI_T::NANDECTL: WP Position */ +#define NFI_NANDECTL_WP_Msk (0x1ul << NFI_NANDECTL_WP_Pos) /*!< NFI_T::NANDECTL: WP Mask */ + +#define NFI_NANDECCES0_F1STAT_Pos (0) /*!< NFI_T::NANDECCES0: F1STAT Position */ +#define NFI_NANDECCES0_F1STAT_Msk (0x3ul << NFI_NANDECCES0_F1STAT_Pos) /*!< NFI_T::NANDECCES0: F1STAT Mask */ + +#define NFI_NANDECCES0_F1ECNT_Pos (2) /*!< NFI_T::NANDECCES0: F1ECNT Position */ +#define NFI_NANDECCES0_F1ECNT_Msk (0x1ful << NFI_NANDECCES0_F1ECNT_Pos) /*!< NFI_T::NANDECCES0: F1ECNT Mask */ + +#define NFI_NANDECCES0_F2STAT_Pos (8) /*!< NFI_T::NANDECCES0: F2STAT Position */ +#define NFI_NANDECCES0_F2STAT_Msk (0x3ul << NFI_NANDECCES0_F2STAT_Pos) /*!< NFI_T::NANDECCES0: F2STAT Mask */ + +#define NFI_NANDECCES0_F2ECNT_Pos (10) /*!< NFI_T::NANDECCES0: F2ECNT Position */ +#define NFI_NANDECCES0_F2ECNT_Msk (0x1ful << NFI_NANDECCES0_F2ECNT_Pos) /*!< NFI_T::NANDECCES0: F2ECNT Mask */ + +#define NFI_NANDECCES0_F3STAT_Pos (16) /*!< NFI_T::NANDECCES0: F3STAT Position */ +#define NFI_NANDECCES0_F3STAT_Msk (0x3ul << NFI_NANDECCES0_F3STAT_Pos) /*!< NFI_T::NANDECCES0: F3STAT Mask */ + +#define NFI_NANDECCES0_F3ECNT_Pos (18) /*!< NFI_T::NANDECCES0: F3ECNT Position */ +#define NFI_NANDECCES0_F3ECNT_Msk (0x1ful << NFI_NANDECCES0_F3ECNT_Pos) /*!< NFI_T::NANDECCES0: F3ECNT Mask */ + +#define NFI_NANDECCES0_F4STAT_Pos (24) /*!< NFI_T::NANDECCES0: F4STAT Position */ +#define NFI_NANDECCES0_F4STAT_Msk (0x3ul << NFI_NANDECCES0_F4STAT_Pos) /*!< NFI_T::NANDECCES0: F4STAT Mask */ + +#define NFI_NANDECCES0_F4ECNT_Pos (26) /*!< NFI_T::NANDECCES0: F4ECNT Position */ +#define NFI_NANDECCES0_F4ECNT_Msk (0x1ful << NFI_NANDECCES0_F4ECNT_Pos) /*!< NFI_T::NANDECCES0: F4ECNT Mask */ + +#define NFI_NANDECCES1_F5STAT_Pos (0) /*!< NFI_T::NANDECCES1: F5STAT Position */ +#define NFI_NANDECCES1_F5STAT_Msk (0x3ul << NFI_NANDECCES1_F5STAT_Pos) /*!< NFI_T::NANDECCES1: F5STAT Mask */ + +#define NFI_NANDECCES1_F5ECNT_Pos (2) /*!< NFI_T::NANDECCES1: F5ECNT Position */ +#define NFI_NANDECCES1_F5ECNT_Msk (0x1ful << NFI_NANDECCES1_F5ECNT_Pos) /*!< NFI_T::NANDECCES1: F5ECNT Mask */ + +#define NFI_NANDECCES1_F6STAT_Pos (8) /*!< NFI_T::NANDECCES1: F6STAT Position */ +#define NFI_NANDECCES1_F6STAT_Msk (0x3ul << NFI_NANDECCES1_F6STAT_Pos) /*!< NFI_T::NANDECCES1: F6STAT Mask */ + +#define NFI_NANDECCES1_F6ECNT_Pos (10) /*!< NFI_T::NANDECCES1: F6ECNT Position */ +#define NFI_NANDECCES1_F6ECNT_Msk (0x1ful << NFI_NANDECCES1_F6ECNT_Pos) /*!< NFI_T::NANDECCES1: F6ECNT Mask */ + +#define NFI_NANDECCES1_F7STAT_Pos (16) /*!< NFI_T::NANDECCES1: F7STAT Position */ +#define NFI_NANDECCES1_F7STAT_Msk (0x3ul << NFI_NANDECCES1_F7STAT_Pos) /*!< NFI_T::NANDECCES1: F7STAT Mask */ + +#define NFI_NANDECCES1_F7ECNT_Pos (18) /*!< NFI_T::NANDECCES1: F7ECNT Position */ +#define NFI_NANDECCES1_F7ECNT_Msk (0x1ful << NFI_NANDECCES1_F7ECNT_Pos) /*!< NFI_T::NANDECCES1: F7ECNT Mask */ + +#define NFI_NANDECCES1_F8STAT_Pos (24) /*!< NFI_T::NANDECCES1: F8STAT Position */ +#define NFI_NANDECCES1_F8STAT_Msk (0x3ul << NFI_NANDECCES1_F8STAT_Pos) /*!< NFI_T::NANDECCES1: F8STAT Mask */ + +#define NFI_NANDECCES1_F8ECNT_Pos (26) /*!< NFI_T::NANDECCES1: F8ECNT Position */ +#define NFI_NANDECCES1_F8ECNT_Msk (0x1ful << NFI_NANDECCES1_F8ECNT_Pos) /*!< NFI_T::NANDECCES1: F8ECNT Mask */ + +#define NFI_NANDECCES2_F9STAT_Pos (0) /*!< NFI_T::NANDECCES2: F9STAT Position */ +#define NFI_NANDECCES2_F9STAT_Msk (0x3ul << NFI_NANDECCES2_F9STAT_Pos) /*!< NFI_T::NANDECCES2: F9STAT Mask */ + +#define NFI_NANDECCES2_F9ECNT_Pos (2) /*!< NFI_T::NANDECCES2: F9ECNT Position */ +#define NFI_NANDECCES2_F9ECNT_Msk (0x1ful << NFI_NANDECCES2_F9ECNT_Pos) /*!< NFI_T::NANDECCES2: F9ECNT Mask */ + +#define NFI_NANDECCES2_F10STAT_Pos (8) /*!< NFI_T::NANDECCES2: F10STAT Position */ +#define NFI_NANDECCES2_F10STAT_Msk (0x3ul << NFI_NANDECCES2_F10STAT_Pos) /*!< NFI_T::NANDECCES2: F10STAT Mask */ + +#define NFI_NANDECCES2_F10ECNT_Pos (10) /*!< NFI_T::NANDECCES2: F10ECNT Position */ +#define NFI_NANDECCES2_F10ECNT_Msk (0x1ful << NFI_NANDECCES2_F10ECNT_Pos) /*!< NFI_T::NANDECCES2: F10ECNT Mask */ + +#define NFI_NANDECCES2_F11STAT_Pos (16) /*!< NFI_T::NANDECCES2: F11STAT Position */ +#define NFI_NANDECCES2_F11STAT_Msk (0x3ul << NFI_NANDECCES2_F11STAT_Pos) /*!< NFI_T::NANDECCES2: F11STAT Mask */ + +#define NFI_NANDECCES2_F11ECNT_Pos (18) /*!< NFI_T::NANDECCES2: F11ECNT Position */ +#define NFI_NANDECCES2_F11ECNT_Msk (0x1ful << NFI_NANDECCES2_F11ECNT_Pos) /*!< NFI_T::NANDECCES2: F11ECNT Mask */ + +#define NFI_NANDECCES2_F12STAT_Pos (24) /*!< NFI_T::NANDECCES2: F12STAT Position */ +#define NFI_NANDECCES2_F12STAT_Msk (0x3ul << NFI_NANDECCES2_F12STAT_Pos) /*!< NFI_T::NANDECCES2: F12STAT Mask */ + +#define NFI_NANDECCES2_F12ECNT_Pos (26) /*!< NFI_T::NANDECCES2: F12ECNT Position */ +#define NFI_NANDECCES2_F12ECNT_Msk (0x1ful << NFI_NANDECCES2_F12ECNT_Pos) /*!< NFI_T::NANDECCES2: F12ECNT Mask */ + +#define NFI_NANDECCES3_F13STAT_Pos (0) /*!< NFI_T::NANDECCES3: F13STAT Position */ +#define NFI_NANDECCES3_F13STAT_Msk (0x3ul << NFI_NANDECCES3_F13STAT_Pos) /*!< NFI_T::NANDECCES3: F13STAT Mask */ + +#define NFI_NANDECCES3_F13ECNT_Pos (2) /*!< NFI_T::NANDECCES3: F13ECNT Position */ +#define NFI_NANDECCES3_F13ECNT_Msk (0x1ful << NFI_NANDECCES3_F13ECNT_Pos) /*!< NFI_T::NANDECCES3: F13ECNT Mask */ + +#define NFI_NANDECCES3_F14STAT_Pos (8) /*!< NFI_T::NANDECCES3: F14STAT Position */ +#define NFI_NANDECCES3_F14STAT_Msk (0x3ul << NFI_NANDECCES3_F14STAT_Pos) /*!< NFI_T::NANDECCES3: F14STAT Mask */ + +#define NFI_NANDECCES3_F14ECNT_Pos (10) /*!< NFI_T::NANDECCES3: F14ECNT Position */ +#define NFI_NANDECCES3_F14ECNT_Msk (0x1ful << NFI_NANDECCES3_F14ECNT_Pos) /*!< NFI_T::NANDECCES3: F14ECNT Mask */ + +#define NFI_NANDECCES3_F15STAT_Pos (16) /*!< NFI_T::NANDECCES3: F15STAT Position */ +#define NFI_NANDECCES3_F15STAT_Msk (0x3ul << NFI_NANDECCES3_F15STAT_Pos) /*!< NFI_T::NANDECCES3: F15STAT Mask */ + +#define NFI_NANDECCES3_F15ECNT_Pos (18) /*!< NFI_T::NANDECCES3: F15ECNT Position */ +#define NFI_NANDECCES3_F15ECNT_Msk (0x1ful << NFI_NANDECCES3_F15ECNT_Pos) /*!< NFI_T::NANDECCES3: F15ECNT Mask */ + +#define NFI_NANDECCES3_F16STAT_Pos (24) /*!< NFI_T::NANDECCES3: F16STAT Position */ +#define NFI_NANDECCES3_F16STAT_Msk (0x3ul << NFI_NANDECCES3_F16STAT_Pos) /*!< NFI_T::NANDECCES3: F16STAT Mask */ + +#define NFI_NANDECCES3_F16ECNT_Pos (26) /*!< NFI_T::NANDECCES3: F16ECNT Position */ +#define NFI_NANDECCES3_F16ECNT_Msk (0x1ful << NFI_NANDECCES3_F16ECNT_Pos) /*!< NFI_T::NANDECCES3: F16ECNT Mask */ + +#define NFI_NANDECCEA0_ERRADDR0_Pos (0) /*!< NFI_T::NANDECCEA0: ERRADDR0 Position */ +#define NFI_NANDECCEA0_ERRADDR0_Msk (0x7fful << NFI_NANDECCEA0_ERRADDR0_Pos) /*!< NFI_T::NANDECCEA0: ERRADDR0 Mask */ + +#define NFI_NANDECCEA0_ERRADDR1_Pos (16) /*!< NFI_T::NANDECCEA0: ERRADDR1 Position */ +#define NFI_NANDECCEA0_ERRADDR1_Msk (0x7fful << NFI_NANDECCEA0_ERRADDR1_Pos) /*!< NFI_T::NANDECCEA0: ERRADDR1 Mask */ + +#define NFI_NANDECCEA1_ERRADDR2_Pos (0) /*!< NFI_T::NANDECCEA1: ERRADDR2 Position */ +#define NFI_NANDECCEA1_ERRADDR2_Msk (0x7fful << NFI_NANDECCEA1_ERRADDR2_Pos) /*!< NFI_T::NANDECCEA1: ERRADDR2 Mask */ + +#define NFI_NANDECCEA1_ERRADDR3_Pos (16) /*!< NFI_T::NANDECCEA1: ERRADDR3 Position */ +#define NFI_NANDECCEA1_ERRADDR3_Msk (0x7fful << NFI_NANDECCEA1_ERRADDR3_Pos) /*!< NFI_T::NANDECCEA1: ERRADDR3 Mask */ + +#define NFI_NANDECCEA2_ERRADDR4_Pos (0) /*!< NFI_T::NANDECCEA2: ERRADDR4 Position */ +#define NFI_NANDECCEA2_ERRADDR4_Msk (0x7fful << NFI_NANDECCEA2_ERRADDR4_Pos) /*!< NFI_T::NANDECCEA2: ERRADDR4 Mask */ + +#define NFI_NANDECCEA2_ERRADDR5_Pos (16) /*!< NFI_T::NANDECCEA2: ERRADDR5 Position */ +#define NFI_NANDECCEA2_ERRADDR5_Msk (0x7fful << NFI_NANDECCEA2_ERRADDR5_Pos) /*!< NFI_T::NANDECCEA2: ERRADDR5 Mask */ + +#define NFI_NANDECCEA3_ERRADDR6_Pos (0) /*!< NFI_T::NANDECCEA3: ERRADDR6 Position */ +#define NFI_NANDECCEA3_ERRADDR6_Msk (0x7fful << NFI_NANDECCEA3_ERRADDR6_Pos) /*!< NFI_T::NANDECCEA3: ERRADDR6 Mask */ + +#define NFI_NANDECCEA3_ERRADDR7_Pos (16) /*!< NFI_T::NANDECCEA3: ERRADDR7 Position */ +#define NFI_NANDECCEA3_ERRADDR7_Msk (0x7fful << NFI_NANDECCEA3_ERRADDR7_Pos) /*!< NFI_T::NANDECCEA3: ERRADDR7 Mask */ + +#define NFI_NANDECCEA4_ERRADDR8_Pos (0) /*!< NFI_T::NANDECCEA4: ERRADDR8 Position */ +#define NFI_NANDECCEA4_ERRADDR8_Msk (0x7fful << NFI_NANDECCEA4_ERRADDR8_Pos) /*!< NFI_T::NANDECCEA4: ERRADDR8 Mask */ + +#define NFI_NANDECCEA4_ERRADDR9_Pos (16) /*!< NFI_T::NANDECCEA4: ERRADDR9 Position */ +#define NFI_NANDECCEA4_ERRADDR9_Msk (0x7fful << NFI_NANDECCEA4_ERRADDR9_Pos) /*!< NFI_T::NANDECCEA4: ERRADDR9 Mask */ + +#define NFI_NANDECCEA5_ERRADDR10_Pos (0) /*!< NFI_T::NANDECCEA5: ERRADDR10 Position */ +#define NFI_NANDECCEA5_ERRADDR10_Msk (0x7fful << NFI_NANDECCEA5_ERRADDR10_Pos) /*!< NFI_T::NANDECCEA5: ERRADDR10 Mask */ + +#define NFI_NANDECCEA5_ERRADDR11_Pos (16) /*!< NFI_T::NANDECCEA5: ERRADDR11 Position */ +#define NFI_NANDECCEA5_ERRADDR11_Msk (0x7fful << NFI_NANDECCEA5_ERRADDR11_Pos) /*!< NFI_T::NANDECCEA5: ERRADDR11 Mask */ + +#define NFI_NANDECCEA6_ERRADDR12_Pos (0) /*!< NFI_T::NANDECCEA6: ERRADDR12 Position */ +#define NFI_NANDECCEA6_ERRADDR12_Msk (0x7fful << NFI_NANDECCEA6_ERRADDR12_Pos) /*!< NFI_T::NANDECCEA6: ERRADDR12 Mask */ + +#define NFI_NANDECCEA6_ERRADDR13_Pos (16) /*!< NFI_T::NANDECCEA6: ERRADDR13 Position */ +#define NFI_NANDECCEA6_ERRADDR13_Msk (0x7fful << NFI_NANDECCEA6_ERRADDR13_Pos) /*!< NFI_T::NANDECCEA6: ERRADDR13 Mask */ + +#define NFI_NANDECCEA7_ERRADDR14_Pos (0) /*!< NFI_T::NANDECCEA7: ERRADDR14 Position */ +#define NFI_NANDECCEA7_ERRADDR14_Msk (0x7fful << NFI_NANDECCEA7_ERRADDR14_Pos) /*!< NFI_T::NANDECCEA7: ERRADDR14 Mask */ + +#define NFI_NANDECCEA7_ERRADDR15_Pos (16) /*!< NFI_T::NANDECCEA7: ERRADDR15 Position */ +#define NFI_NANDECCEA7_ERRADDR15_Msk (0x7fful << NFI_NANDECCEA7_ERRADDR15_Pos) /*!< NFI_T::NANDECCEA7: ERRADDR15 Mask */ + +#define NFI_NANDECCEA8_ERRADDR16_Pos (0) /*!< NFI_T::NANDECCEA8: ERRADDR16 Position */ +#define NFI_NANDECCEA8_ERRADDR16_Msk (0x7fful << NFI_NANDECCEA8_ERRADDR16_Pos) /*!< NFI_T::NANDECCEA8: ERRADDR16 Mask */ + +#define NFI_NANDECCEA8_ERRADDR17_Pos (16) /*!< NFI_T::NANDECCEA8: ERRADDR17 Position */ +#define NFI_NANDECCEA8_ERRADDR17_Msk (0x7fful << NFI_NANDECCEA8_ERRADDR17_Pos) /*!< NFI_T::NANDECCEA8: ERRADDR17 Mask */ + +#define NFI_NANDECCEA9_ERRADDR18_Pos (0) /*!< NFI_T::NANDECCEA9: ERRADDR18 Position */ +#define NFI_NANDECCEA9_ERRADDR18_Msk (0x7fful << NFI_NANDECCEA9_ERRADDR18_Pos) /*!< NFI_T::NANDECCEA9: ERRADDR18 Mask */ + +#define NFI_NANDECCEA9_ERRADDR19_Pos (16) /*!< NFI_T::NANDECCEA9: ERRADDR19 Position */ +#define NFI_NANDECCEA9_ERRADDR19_Msk (0x7fful << NFI_NANDECCEA9_ERRADDR19_Pos) /*!< NFI_T::NANDECCEA9: ERRADDR19 Mask */ + +#define NFI_NANDECCEA10_ERRADDR20_Pos (0) /*!< NFI_T::NANDECCEA10: ERRADDR20 Position */ +#define NFI_NANDECCEA10_ERRADDR20_Msk (0x7fful << NFI_NANDECCEA10_ERRADDR20_Pos) /*!< NFI_T::NANDECCEA10: ERRADDR20 Mask */ + +#define NFI_NANDECCEA10_ERRADDR21_Pos (16) /*!< NFI_T::NANDECCEA10: ERRADDR21 Position */ +#define NFI_NANDECCEA10_ERRADDR21_Msk (0x7fful << NFI_NANDECCEA10_ERRADDR21_Pos) /*!< NFI_T::NANDECCEA10: ERRADDR21 Mask */ + +#define NFI_NANDECCEA11_ERRADDR22_Pos (0) /*!< NFI_T::NANDECCEA11: ERRADDR22 Position */ +#define NFI_NANDECCEA11_ERRADDR22_Msk (0x7fful << NFI_NANDECCEA11_ERRADDR22_Pos) /*!< NFI_T::NANDECCEA11: ERRADDR22 Mask */ + +#define NFI_NANDECCEA11_ERRADDR23_Pos (16) /*!< NFI_T::NANDECCEA11: ERRADDR23 Position */ +#define NFI_NANDECCEA11_ERRADDR23_Msk (0x7fful << NFI_NANDECCEA11_ERRADDR23_Pos) /*!< NFI_T::NANDECCEA11: ERRADDR23 Mask */ + +#define NFI_NANDECCED0_ERRDATA0_Pos (0) /*!< NFI_T::NANDECCED0: ERRDATA0 Position */ +#define NFI_NANDECCED0_ERRDATA0_Msk (0xfful << NFI_NANDECCED0_ERRDATA0_Pos) /*!< NFI_T::NANDECCED0: ERRDATA0 Mask */ + +#define NFI_NANDECCED0_ERRDATA1_Pos (8) /*!< NFI_T::NANDECCED0: ERRDATA1 Position */ +#define NFI_NANDECCED0_ERRDATA1_Msk (0xfful << NFI_NANDECCED0_ERRDATA1_Pos) /*!< NFI_T::NANDECCED0: ERRDATA1 Mask */ + +#define NFI_NANDECCED0_ERRDATA2_Pos (16) /*!< NFI_T::NANDECCED0: ERRDATA2 Position */ +#define NFI_NANDECCED0_ERRDATA2_Msk (0xfful << NFI_NANDECCED0_ERRDATA2_Pos) /*!< NFI_T::NANDECCED0: ERRDATA2 Mask */ + +#define NFI_NANDECCED0_ERRDATA3_Pos (24) /*!< NFI_T::NANDECCED0: ERRDATA3 Position */ +#define NFI_NANDECCED0_ERRDATA3_Msk (0xfful << NFI_NANDECCED0_ERRDATA3_Pos) /*!< NFI_T::NANDECCED0: ERRDATA3 Mask */ + +#define NFI_NANDECCED1_ERRDATA4_Pos (0) /*!< NFI_T::NANDECCED1: ERRDATA4 Position */ +#define NFI_NANDECCED1_ERRDATA4_Msk (0xfful << NFI_NANDECCED1_ERRDATA4_Pos) /*!< NFI_T::NANDECCED1: ERRDATA4 Mask */ + +#define NFI_NANDECCED1_ERRDATA5_Pos (8) /*!< NFI_T::NANDECCED1: ERRDATA5 Position */ +#define NFI_NANDECCED1_ERRDATA5_Msk (0xfful << NFI_NANDECCED1_ERRDATA5_Pos) /*!< NFI_T::NANDECCED1: ERRDATA5 Mask */ + +#define NFI_NANDECCED1_ERRDATA6_Pos (16) /*!< NFI_T::NANDECCED1: ERRDATA6 Position */ +#define NFI_NANDECCED1_ERRDATA6_Msk (0xfful << NFI_NANDECCED1_ERRDATA6_Pos) /*!< NFI_T::NANDECCED1: ERRDATA6 Mask */ + +#define NFI_NANDECCED1_ERRDATA7_Pos (24) /*!< NFI_T::NANDECCED1: ERRDATA7 Position */ +#define NFI_NANDECCED1_ERRDATA7_Msk (0xfful << NFI_NANDECCED1_ERRDATA7_Pos) /*!< NFI_T::NANDECCED1: ERRDATA7 Mask */ + +#define NFI_NANDECCED2_ERRDATA8_Pos (0) /*!< NFI_T::NANDECCED2: ERRDATA8 Position */ +#define NFI_NANDECCED2_ERRDATA8_Msk (0xfful << NFI_NANDECCED2_ERRDATA8_Pos) /*!< NFI_T::NANDECCED2: ERRDATA8 Mask */ + +#define NFI_NANDECCED2_ERRDATA9_Pos (8) /*!< NFI_T::NANDECCED2: ERRDATA9 Position */ +#define NFI_NANDECCED2_ERRDATA9_Msk (0xfful << NFI_NANDECCED2_ERRDATA9_Pos) /*!< NFI_T::NANDECCED2: ERRDATA9 Mask */ + +#define NFI_NANDECCED2_ERRDATA10_Pos (16) /*!< NFI_T::NANDECCED2: ERRDATA10 Position */ +#define NFI_NANDECCED2_ERRDATA10_Msk (0xfful << NFI_NANDECCED2_ERRDATA10_Pos) /*!< NFI_T::NANDECCED2: ERRDATA10 Mask */ + +#define NFI_NANDECCED2_ERRDATA11_Pos (24) /*!< NFI_T::NANDECCED2: ERRDATA11 Position */ +#define NFI_NANDECCED2_ERRDATA11_Msk (0xfful << NFI_NANDECCED2_ERRDATA11_Pos) /*!< NFI_T::NANDECCED2: ERRDATA11 Mask */ + +#define NFI_NANDECCED3_ERRDATA12_Pos (0) /*!< NFI_T::NANDECCED3: ERRDATA12 Position */ +#define NFI_NANDECCED3_ERRDATA12_Msk (0xfful << NFI_NANDECCED3_ERRDATA12_Pos) /*!< NFI_T::NANDECCED3: ERRDATA12 Mask */ + +#define NFI_NANDECCED3_ERRDATA13_Pos (8) /*!< NFI_T::NANDECCED3: ERRDATA13 Position */ +#define NFI_NANDECCED3_ERRDATA13_Msk (0xfful << NFI_NANDECCED3_ERRDATA13_Pos) /*!< NFI_T::NANDECCED3: ERRDATA13 Mask */ + +#define NFI_NANDECCED3_ERRDATA14_Pos (16) /*!< NFI_T::NANDECCED3: ERRDATA14 Position */ +#define NFI_NANDECCED3_ERRDATA14_Msk (0xfful << NFI_NANDECCED3_ERRDATA14_Pos) /*!< NFI_T::NANDECCED3: ERRDATA14 Mask */ + +#define NFI_NANDECCED3_ERRDATA15_Pos (24) /*!< NFI_T::NANDECCED3: ERRDATA15 Position */ +#define NFI_NANDECCED3_ERRDATA15_Msk (0xfful << NFI_NANDECCED3_ERRDATA15_Pos) /*!< NFI_T::NANDECCED3: ERRDATA15 Mask */ + +#define NFI_NANDECCED4_ERRDATA16_Pos (0) /*!< NFI_T::NANDECCED4: ERRDATA16 Position */ +#define NFI_NANDECCED4_ERRDATA16_Msk (0xfful << NFI_NANDECCED4_ERRDATA16_Pos) /*!< NFI_T::NANDECCED4: ERRDATA16 Mask */ + +#define NFI_NANDECCED4_ERRDATA17_Pos (8) /*!< NFI_T::NANDECCED4: ERRDATA17 Position */ +#define NFI_NANDECCED4_ERRDATA17_Msk (0xfful << NFI_NANDECCED4_ERRDATA17_Pos) /*!< NFI_T::NANDECCED4: ERRDATA17 Mask */ + +#define NFI_NANDECCED4_ERRDATA18_Pos (16) /*!< NFI_T::NANDECCED4: ERRDATA18 Position */ +#define NFI_NANDECCED4_ERRDATA18_Msk (0xfful << NFI_NANDECCED4_ERRDATA18_Pos) /*!< NFI_T::NANDECCED4: ERRDATA18 Mask */ + +#define NFI_NANDECCED4_ERRDATA19_Pos (24) /*!< NFI_T::NANDECCED4: ERRDATA19 Position */ +#define NFI_NANDECCED4_ERRDATA19_Msk (0xfful << NFI_NANDECCED4_ERRDATA19_Pos) /*!< NFI_T::NANDECCED4: ERRDATA19 Mask */ + +#define NFI_NANDECCED5_ERRDATA20_Pos (0) /*!< NFI_T::NANDECCED5: ERRDATA20 Position */ +#define NFI_NANDECCED5_ERRDATA20_Msk (0xfful << NFI_NANDECCED5_ERRDATA20_Pos) /*!< NFI_T::NANDECCED5: ERRDATA20 Mask */ + +#define NFI_NANDECCED5_ERRDATA21_Pos (8) /*!< NFI_T::NANDECCED5: ERRDATA21 Position */ +#define NFI_NANDECCED5_ERRDATA21_Msk (0xfful << NFI_NANDECCED5_ERRDATA21_Pos) /*!< NFI_T::NANDECCED5: ERRDATA21 Mask */ + +#define NFI_NANDECCED5_ERRDATA22_Pos (16) /*!< NFI_T::NANDECCED5: ERRDATA22 Position */ +#define NFI_NANDECCED5_ERRDATA22_Msk (0xfful << NFI_NANDECCED5_ERRDATA22_Pos) /*!< NFI_T::NANDECCED5: ERRDATA22 Mask */ + +#define NFI_NANDECCED5_ERRDATA23_Pos (24) /*!< NFI_T::NANDECCED5: ERRDATA23 Position */ +#define NFI_NANDECCED5_ERRDATA23_Msk (0xfful << NFI_NANDECCED5_ERRDATA23_Pos) /*!< NFI_T::NANDECCED5: ERRDATA23 Mask */ + +#define NFI_NANDRA0_Data_Pos (0) /*!< NFI_T::NANDRA0: Data Position */ +#define NFI_NANDRA0_Data_Msk (0xfffffffful << NFI_NANDRA0_Data_Pos) /*!< NFI_T::NANDRA0: Data Mask */ + +#define NFI_NANDRA1_Data_Pos (0) /*!< NFI_T::NANDRA1: Data Position */ +#define NFI_NANDRA1_Data_Msk (0xfffffffful << NFI_NANDRA1_Data_Pos) /*!< NFI_T::NANDRA1: Data Mask */ + +#define NFI_NANDRA2_Data_Pos (0) /*!< NFI_T::NANDRA2: Data Position */ +#define NFI_NANDRA2_Data_Msk (0xfffffffful << NFI_NANDRA2_Data_Pos) /*!< NFI_T::NANDRA2: Data Mask */ + +#define NFI_NANDRA3_Data_Pos (0) /*!< NFI_T::NANDRA3: Data Position */ +#define NFI_NANDRA3_Data_Msk (0xfffffffful << NFI_NANDRA3_Data_Pos) /*!< NFI_T::NANDRA3: Data Mask */ + +#define NFI_NANDRA4_Data_Pos (0) /*!< NFI_T::NANDRA4: Data Position */ +#define NFI_NANDRA4_Data_Msk (0xfffffffful << NFI_NANDRA4_Data_Pos) /*!< NFI_T::NANDRA4: Data Mask */ + +#define NFI_NANDRA5_Data_Pos (0) /*!< NFI_T::NANDRA5: Data Position */ +#define NFI_NANDRA5_Data_Msk (0xfffffffful << NFI_NANDRA5_Data_Pos) /*!< NFI_T::NANDRA5: Data Mask */ + +#define NFI_NANDRA6_Data_Pos (0) /*!< NFI_T::NANDRA6: Data Position */ +#define NFI_NANDRA6_Data_Msk (0xfffffffful << NFI_NANDRA6_Data_Pos) /*!< NFI_T::NANDRA6: Data Mask */ + +#define NFI_NANDRA7_Data_Pos (0) /*!< NFI_T::NANDRA7: Data Position */ +#define NFI_NANDRA7_Data_Msk (0xfffffffful << NFI_NANDRA7_Data_Pos) /*!< NFI_T::NANDRA7: Data Mask */ + +#define NFI_NANDRA8_Data_Pos (0) /*!< NFI_T::NANDRA8: Data Position */ +#define NFI_NANDRA8_Data_Msk (0xfffffffful << NFI_NANDRA8_Data_Pos) /*!< NFI_T::NANDRA8: Data Mask */ + +#define NFI_NANDRA9_Data_Pos (0) /*!< NFI_T::NANDRA9: Data Position */ +#define NFI_NANDRA9_Data_Msk (0xfffffffful << NFI_NANDRA9_Data_Pos) /*!< NFI_T::NANDRA9: Data Mask */ + +#define NFI_NANDRA10_Data_Pos (0) /*!< NFI_T::NANDRA10: Data Position */ +#define NFI_NANDRA10_Data_Msk (0xfffffffful << NFI_NANDRA10_Data_Pos) /*!< NFI_T::NANDRA10: Data Mask */ + +#define NFI_NANDRA11_Data_Pos (0) /*!< NFI_T::NANDRA11: Data Position */ +#define NFI_NANDRA11_Data_Msk (0xfffffffful << NFI_NANDRA11_Data_Pos) /*!< NFI_T::NANDRA11: Data Mask */ + +#define NFI_NANDRA12_Data_Pos (0) /*!< NFI_T::NANDRA12: Data Position */ +#define NFI_NANDRA12_Data_Msk (0xfffffffful << NFI_NANDRA12_Data_Pos) /*!< NFI_T::NANDRA12: Data Mask */ + +#define NFI_NANDRA13_Data_Pos (0) /*!< NFI_T::NANDRA13: Data Position */ +#define NFI_NANDRA13_Data_Msk (0xfffffffful << NFI_NANDRA13_Data_Pos) /*!< NFI_T::NANDRA13: Data Mask */ + +#define NFI_NANDRA14_Data_Pos (0) /*!< NFI_T::NANDRA14: Data Position */ +#define NFI_NANDRA14_Data_Msk (0xfffffffful << NFI_NANDRA14_Data_Pos) /*!< NFI_T::NANDRA14: Data Mask */ + +#define NFI_NANDRA15_Data_Pos (0) /*!< NFI_T::NANDRA15: Data Position */ +#define NFI_NANDRA15_Data_Msk (0xfffffffful << NFI_NANDRA15_Data_Pos) /*!< NFI_T::NANDRA15: Data Mask */ + +#define NFI_NANDRA16_Data_Pos (0) /*!< NFI_T::NANDRA16: Data Position */ +#define NFI_NANDRA16_Data_Msk (0xfffffffful << NFI_NANDRA16_Data_Pos) /*!< NFI_T::NANDRA16: Data Mask */ + +#define NFI_NANDRA17_Data_Pos (0) /*!< NFI_T::NANDRA17: Data Position */ +#define NFI_NANDRA17_Data_Msk (0xfffffffful << NFI_NANDRA17_Data_Pos) /*!< NFI_T::NANDRA17: Data Mask */ + +#define NFI_NANDRA18_Data_Pos (0) /*!< NFI_T::NANDRA18: Data Position */ +#define NFI_NANDRA18_Data_Msk (0xfffffffful << NFI_NANDRA18_Data_Pos) /*!< NFI_T::NANDRA18: Data Mask */ + +#define NFI_NANDRA19_Data_Pos (0) /*!< NFI_T::NANDRA19: Data Position */ +#define NFI_NANDRA19_Data_Msk (0xfffffffful << NFI_NANDRA19_Data_Pos) /*!< NFI_T::NANDRA19: Data Mask */ + +#define NFI_NANDRA20_Data_Pos (0) /*!< NFI_T::NANDRA20: Data Position */ +#define NFI_NANDRA20_Data_Msk (0xfffffffful << NFI_NANDRA20_Data_Pos) /*!< NFI_T::NANDRA20: Data Mask */ + +#define NFI_NANDRA21_Data_Pos (0) /*!< NFI_T::NANDRA21: Data Position */ +#define NFI_NANDRA21_Data_Msk (0xfffffffful << NFI_NANDRA21_Data_Pos) /*!< NFI_T::NANDRA21: Data Mask */ + +#define NFI_NANDRA22_Data_Pos (0) /*!< NFI_T::NANDRA22: Data Position */ +#define NFI_NANDRA22_Data_Msk (0xfffffffful << NFI_NANDRA22_Data_Pos) /*!< NFI_T::NANDRA22: Data Mask */ + +#define NFI_NANDRA23_Data_Pos (0) /*!< NFI_T::NANDRA23: Data Position */ +#define NFI_NANDRA23_Data_Msk (0xfffffffful << NFI_NANDRA23_Data_Pos) /*!< NFI_T::NANDRA23: Data Mask */ + +#define NFI_NANDRA24_Data_Pos (0) /*!< NFI_T::NANDRA24: Data Position */ +#define NFI_NANDRA24_Data_Msk (0xfffffffful << NFI_NANDRA24_Data_Pos) /*!< NFI_T::NANDRA24: Data Mask */ + +#define NFI_NANDRA25_Data_Pos (0) /*!< NFI_T::NANDRA25: Data Position */ +#define NFI_NANDRA25_Data_Msk (0xfffffffful << NFI_NANDRA25_Data_Pos) /*!< NFI_T::NANDRA25: Data Mask */ + +#define NFI_NANDRA26_Data_Pos (0) /*!< NFI_T::NANDRA26: Data Position */ +#define NFI_NANDRA26_Data_Msk (0xfffffffful << NFI_NANDRA26_Data_Pos) /*!< NFI_T::NANDRA26: Data Mask */ + +#define NFI_NANDRA27_Data_Pos (0) /*!< NFI_T::NANDRA27: Data Position */ +#define NFI_NANDRA27_Data_Msk (0xfffffffful << NFI_NANDRA27_Data_Pos) /*!< NFI_T::NANDRA27: Data Mask */ + +#define NFI_NANDRA28_Data_Pos (0) /*!< NFI_T::NANDRA28: Data Position */ +#define NFI_NANDRA28_Data_Msk (0xfffffffful << NFI_NANDRA28_Data_Pos) /*!< NFI_T::NANDRA28: Data Mask */ + +#define NFI_NANDRA29_Data_Pos (0) /*!< NFI_T::NANDRA29: Data Position */ +#define NFI_NANDRA29_Data_Msk (0xfffffffful << NFI_NANDRA29_Data_Pos) /*!< NFI_T::NANDRA29: Data Mask */ + +#define NFI_NANDRA30_Data_Pos (0) /*!< NFI_T::NANDRA30: Data Position */ +#define NFI_NANDRA30_Data_Msk (0xfffffffful << NFI_NANDRA30_Data_Pos) /*!< NFI_T::NANDRA30: Data Mask */ + +#define NFI_NANDRA31_Data_Pos (0) /*!< NFI_T::NANDRA31: Data Position */ +#define NFI_NANDRA31_Data_Msk (0xfffffffful << NFI_NANDRA31_Data_Pos) /*!< NFI_T::NANDRA31: Data Mask */ + +#define NFI_NANDRA32_Data_Pos (0) /*!< NFI_T::NANDRA32: Data Position */ +#define NFI_NANDRA32_Data_Msk (0xfffffffful << NFI_NANDRA32_Data_Pos) /*!< NFI_T::NANDRA32: Data Mask */ + +#define NFI_NANDRA33_Data_Pos (0) /*!< NFI_T::NANDRA33: Data Position */ +#define NFI_NANDRA33_Data_Msk (0xfffffffful << NFI_NANDRA33_Data_Pos) /*!< NFI_T::NANDRA33: Data Mask */ + +#define NFI_NANDRA34_Data_Pos (0) /*!< NFI_T::NANDRA34: Data Position */ +#define NFI_NANDRA34_Data_Msk (0xfffffffful << NFI_NANDRA34_Data_Pos) /*!< NFI_T::NANDRA34: Data Mask */ + +#define NFI_NANDRA35_Data_Pos (0) /*!< NFI_T::NANDRA35: Data Position */ +#define NFI_NANDRA35_Data_Msk (0xfffffffful << NFI_NANDRA35_Data_Pos) /*!< NFI_T::NANDRA35: Data Mask */ + +#define NFI_NANDRA36_Data_Pos (0) /*!< NFI_T::NANDRA36: Data Position */ +#define NFI_NANDRA36_Data_Msk (0xfffffffful << NFI_NANDRA36_Data_Pos) /*!< NFI_T::NANDRA36: Data Mask */ + +#define NFI_NANDRA37_Data_Pos (0) /*!< NFI_T::NANDRA37: Data Position */ +#define NFI_NANDRA37_Data_Msk (0xfffffffful << NFI_NANDRA37_Data_Pos) /*!< NFI_T::NANDRA37: Data Mask */ + +#define NFI_NANDRA38_Data_Pos (0) /*!< NFI_T::NANDRA38: Data Position */ +#define NFI_NANDRA38_Data_Msk (0xfffffffful << NFI_NANDRA38_Data_Pos) /*!< NFI_T::NANDRA38: Data Mask */ + +#define NFI_NANDRA39_Data_Pos (0) /*!< NFI_T::NANDRA39: Data Position */ +#define NFI_NANDRA39_Data_Msk (0xfffffffful << NFI_NANDRA39_Data_Pos) /*!< NFI_T::NANDRA39: Data Mask */ + +#define NFI_NANDRA40_Data_Pos (0) /*!< NFI_T::NANDRA40: Data Position */ +#define NFI_NANDRA40_Data_Msk (0xfffffffful << NFI_NANDRA40_Data_Pos) /*!< NFI_T::NANDRA40: Data Mask */ + +#define NFI_NANDRA41_Data_Pos (0) /*!< NFI_T::NANDRA41: Data Position */ +#define NFI_NANDRA41_Data_Msk (0xfffffffful << NFI_NANDRA41_Data_Pos) /*!< NFI_T::NANDRA41: Data Mask */ + +#define NFI_NANDRA42_Data_Pos (0) /*!< NFI_T::NANDRA42: Data Position */ +#define NFI_NANDRA42_Data_Msk (0xfffffffful << NFI_NANDRA42_Data_Pos) /*!< NFI_T::NANDRA42: Data Mask */ + +#define NFI_NANDRA43_Data_Pos (0) /*!< NFI_T::NANDRA43: Data Position */ +#define NFI_NANDRA43_Data_Msk (0xfffffffful << NFI_NANDRA43_Data_Pos) /*!< NFI_T::NANDRA43: Data Mask */ + +#define NFI_NANDRA44_Data_Pos (0) /*!< NFI_T::NANDRA44: Data Position */ +#define NFI_NANDRA44_Data_Msk (0xfffffffful << NFI_NANDRA44_Data_Pos) /*!< NFI_T::NANDRA44: Data Mask */ + +#define NFI_NANDRA45_Data_Pos (0) /*!< NFI_T::NANDRA45: Data Position */ +#define NFI_NANDRA45_Data_Msk (0xfffffffful << NFI_NANDRA45_Data_Pos) /*!< NFI_T::NANDRA45: Data Mask */ + +#define NFI_NANDRA46_Data_Pos (0) /*!< NFI_T::NANDRA46: Data Position */ +#define NFI_NANDRA46_Data_Msk (0xfffffffful << NFI_NANDRA46_Data_Pos) /*!< NFI_T::NANDRA46: Data Mask */ + +#define NFI_NANDRA47_Data_Pos (0) /*!< NFI_T::NANDRA47: Data Position */ +#define NFI_NANDRA47_Data_Msk (0xfffffffful << NFI_NANDRA47_Data_Pos) /*!< NFI_T::NANDRA47: Data Mask */ + +#define NFI_NANDRA48_Data_Pos (0) /*!< NFI_T::NANDRA48: Data Position */ +#define NFI_NANDRA48_Data_Msk (0xfffffffful << NFI_NANDRA48_Data_Pos) /*!< NFI_T::NANDRA48: Data Mask */ + +#define NFI_NANDRA49_Data_Pos (0) /*!< NFI_T::NANDRA49: Data Position */ +#define NFI_NANDRA49_Data_Msk (0xfffffffful << NFI_NANDRA49_Data_Pos) /*!< NFI_T::NANDRA49: Data Mask */ + +#define NFI_NANDRA50_Data_Pos (0) /*!< NFI_T::NANDRA50: Data Position */ +#define NFI_NANDRA50_Data_Msk (0xfffffffful << NFI_NANDRA50_Data_Pos) /*!< NFI_T::NANDRA50: Data Mask */ + +#define NFI_NANDRA51_Data_Pos (0) /*!< NFI_T::NANDRA51: Data Position */ +#define NFI_NANDRA51_Data_Msk (0xfffffffful << NFI_NANDRA51_Data_Pos) /*!< NFI_T::NANDRA51: Data Mask */ + +#define NFI_NANDRA52_Data_Pos (0) /*!< NFI_T::NANDRA52: Data Position */ +#define NFI_NANDRA52_Data_Msk (0xfffffffful << NFI_NANDRA52_Data_Pos) /*!< NFI_T::NANDRA52: Data Mask */ + +#define NFI_NANDRA53_Data_Pos (0) /*!< NFI_T::NANDRA53: Data Position */ +#define NFI_NANDRA53_Data_Msk (0xfffffffful << NFI_NANDRA53_Data_Pos) /*!< NFI_T::NANDRA53: Data Mask */ + +#define NFI_NANDRA54_Data_Pos (0) /*!< NFI_T::NANDRA54: Data Position */ +#define NFI_NANDRA54_Data_Msk (0xfffffffful << NFI_NANDRA54_Data_Pos) /*!< NFI_T::NANDRA54: Data Mask */ + +#define NFI_NANDRA55_Data_Pos (0) /*!< NFI_T::NANDRA55: Data Position */ +#define NFI_NANDRA55_Data_Msk (0xfffffffful << NFI_NANDRA55_Data_Pos) /*!< NFI_T::NANDRA55: Data Mask */ + +#define NFI_NANDRA56_Data_Pos (0) /*!< NFI_T::NANDRA56: Data Position */ +#define NFI_NANDRA56_Data_Msk (0xfffffffful << NFI_NANDRA56_Data_Pos) /*!< NFI_T::NANDRA56: Data Mask */ + +#define NFI_NANDRA57_Data_Pos (0) /*!< NFI_T::NANDRA57: Data Position */ +#define NFI_NANDRA57_Data_Msk (0xfffffffful << NFI_NANDRA57_Data_Pos) /*!< NFI_T::NANDRA57: Data Mask */ + +#define NFI_NANDRA58_Data_Pos (0) /*!< NFI_T::NANDRA58: Data Position */ +#define NFI_NANDRA58_Data_Msk (0xfffffffful << NFI_NANDRA58_Data_Pos) /*!< NFI_T::NANDRA58: Data Mask */ + +#define NFI_NANDRA59_Data_Pos (0) /*!< NFI_T::NANDRA59: Data Position */ +#define NFI_NANDRA59_Data_Msk (0xfffffffful << NFI_NANDRA59_Data_Pos) /*!< NFI_T::NANDRA59: Data Mask */ + +#define NFI_NANDRA60_Data_Pos (0) /*!< NFI_T::NANDRA60: Data Position */ +#define NFI_NANDRA60_Data_Msk (0xfffffffful << NFI_NANDRA60_Data_Pos) /*!< NFI_T::NANDRA60: Data Mask */ + +#define NFI_NANDRA61_Data_Pos (0) /*!< NFI_T::NANDRA61: Data Position */ +#define NFI_NANDRA61_Data_Msk (0xfffffffful << NFI_NANDRA61_Data_Pos) /*!< NFI_T::NANDRA61: Data Mask */ + +#define NFI_NANDRA62_Data_Pos (0) /*!< NFI_T::NANDRA62: Data Position */ +#define NFI_NANDRA62_Data_Msk (0xfffffffful << NFI_NANDRA62_Data_Pos) /*!< NFI_T::NANDRA62: Data Mask */ + +#define NFI_NANDRA63_Data_Pos (0) /*!< NFI_T::NANDRA63: Data Position */ +#define NFI_NANDRA63_Data_Msk (0xfffffffful << NFI_NANDRA63_Data_Pos) /*!< NFI_T::NANDRA63: Data Mask */ + +#define NFI_NANDRA64_Data_Pos (0) /*!< NFI_T::NANDRA64: Data Position */ +#define NFI_NANDRA64_Data_Msk (0xfffffffful << NFI_NANDRA64_Data_Pos) /*!< NFI_T::NANDRA64: Data Mask */ + +#define NFI_NANDRA65_Data_Pos (0) /*!< NFI_T::NANDRA65: Data Position */ +#define NFI_NANDRA65_Data_Msk (0xfffffffful << NFI_NANDRA65_Data_Pos) /*!< NFI_T::NANDRA65: Data Mask */ + +#define NFI_NANDRA66_Data_Pos (0) /*!< NFI_T::NANDRA66: Data Position */ +#define NFI_NANDRA66_Data_Msk (0xfffffffful << NFI_NANDRA66_Data_Pos) /*!< NFI_T::NANDRA66: Data Mask */ + +#define NFI_NANDRA67_Data_Pos (0) /*!< NFI_T::NANDRA67: Data Position */ +#define NFI_NANDRA67_Data_Msk (0xfffffffful << NFI_NANDRA67_Data_Pos) /*!< NFI_T::NANDRA67: Data Mask */ + +#define NFI_NANDRA68_Data_Pos (0) /*!< NFI_T::NANDRA68: Data Position */ +#define NFI_NANDRA68_Data_Msk (0xfffffffful << NFI_NANDRA68_Data_Pos) /*!< NFI_T::NANDRA68: Data Mask */ + +#define NFI_NANDRA69_Data_Pos (0) /*!< NFI_T::NANDRA69: Data Position */ +#define NFI_NANDRA69_Data_Msk (0xfffffffful << NFI_NANDRA69_Data_Pos) /*!< NFI_T::NANDRA69: Data Mask */ + +#define NFI_NANDRA70_Data_Pos (0) /*!< NFI_T::NANDRA70: Data Position */ +#define NFI_NANDRA70_Data_Msk (0xfffffffful << NFI_NANDRA70_Data_Pos) /*!< NFI_T::NANDRA70: Data Mask */ + +#define NFI_NANDRA71_Data_Pos (0) /*!< NFI_T::NANDRA71: Data Position */ +#define NFI_NANDRA71_Data_Msk (0xfffffffful << NFI_NANDRA71_Data_Pos) /*!< NFI_T::NANDRA71: Data Mask */ + +#define NFI_NANDRA72_Data_Pos (0) /*!< NFI_T::NANDRA72: Data Position */ +#define NFI_NANDRA72_Data_Msk (0xfffffffful << NFI_NANDRA72_Data_Pos) /*!< NFI_T::NANDRA72: Data Mask */ + +#define NFI_NANDRA73_Data_Pos (0) /*!< NFI_T::NANDRA73: Data Position */ +#define NFI_NANDRA73_Data_Msk (0xfffffffful << NFI_NANDRA73_Data_Pos) /*!< NFI_T::NANDRA73: Data Mask */ + +#define NFI_NANDRA74_Data_Pos (0) /*!< NFI_T::NANDRA74: Data Position */ +#define NFI_NANDRA74_Data_Msk (0xfffffffful << NFI_NANDRA74_Data_Pos) /*!< NFI_T::NANDRA74: Data Mask */ + +#define NFI_NANDRA75_Data_Pos (0) /*!< NFI_T::NANDRA75: Data Position */ +#define NFI_NANDRA75_Data_Msk (0xfffffffful << NFI_NANDRA75_Data_Pos) /*!< NFI_T::NANDRA75: Data Mask */ + +#define NFI_NANDRA76_Data_Pos (0) /*!< NFI_T::NANDRA76: Data Position */ +#define NFI_NANDRA76_Data_Msk (0xfffffffful << NFI_NANDRA76_Data_Pos) /*!< NFI_T::NANDRA76: Data Mask */ + +#define NFI_NANDRA77_Data_Pos (0) /*!< NFI_T::NANDRA77: Data Position */ +#define NFI_NANDRA77_Data_Msk (0xfffffffful << NFI_NANDRA77_Data_Pos) /*!< NFI_T::NANDRA77: Data Mask */ + +#define NFI_NANDRA78_Data_Pos (0) /*!< NFI_T::NANDRA78: Data Position */ +#define NFI_NANDRA78_Data_Msk (0xfffffffful << NFI_NANDRA78_Data_Pos) /*!< NFI_T::NANDRA78: Data Mask */ + +#define NFI_NANDRA79_Data_Pos (0) /*!< NFI_T::NANDRA79: Data Position */ +#define NFI_NANDRA79_Data_Msk (0xfffffffful << NFI_NANDRA79_Data_Pos) /*!< NFI_T::NANDRA79: Data Mask */ + +#define NFI_NANDRA80_Data_Pos (0) /*!< NFI_T::NANDRA80: Data Position */ +#define NFI_NANDRA80_Data_Msk (0xfffffffful << NFI_NANDRA80_Data_Pos) /*!< NFI_T::NANDRA80: Data Mask */ + +#define NFI_NANDRA81_Data_Pos (0) /*!< NFI_T::NANDRA81: Data Position */ +#define NFI_NANDRA81_Data_Msk (0xfffffffful << NFI_NANDRA81_Data_Pos) /*!< NFI_T::NANDRA81: Data Mask */ + +#define NFI_NANDRA82_Data_Pos (0) /*!< NFI_T::NANDRA82: Data Position */ +#define NFI_NANDRA82_Data_Msk (0xfffffffful << NFI_NANDRA82_Data_Pos) /*!< NFI_T::NANDRA82: Data Mask */ + +#define NFI_NANDRA83_Data_Pos (0) /*!< NFI_T::NANDRA83: Data Position */ +#define NFI_NANDRA83_Data_Msk (0xfffffffful << NFI_NANDRA83_Data_Pos) /*!< NFI_T::NANDRA83: Data Mask */ + +#define NFI_NANDRA84_Data_Pos (0) /*!< NFI_T::NANDRA84: Data Position */ +#define NFI_NANDRA84_Data_Msk (0xfffffffful << NFI_NANDRA84_Data_Pos) /*!< NFI_T::NANDRA84: Data Mask */ + +#define NFI_NANDRA85_Data_Pos (0) /*!< NFI_T::NANDRA85: Data Position */ +#define NFI_NANDRA85_Data_Msk (0xfffffffful << NFI_NANDRA85_Data_Pos) /*!< NFI_T::NANDRA85: Data Mask */ + +#define NFI_NANDRA86_Data_Pos (0) /*!< NFI_T::NANDRA86: Data Position */ +#define NFI_NANDRA86_Data_Msk (0xfffffffful << NFI_NANDRA86_Data_Pos) /*!< NFI_T::NANDRA86: Data Mask */ + +#define NFI_NANDRA87_Data_Pos (0) /*!< NFI_T::NANDRA87: Data Position */ +#define NFI_NANDRA87_Data_Msk (0xfffffffful << NFI_NANDRA87_Data_Pos) /*!< NFI_T::NANDRA87: Data Mask */ + +#define NFI_NANDRA88_Data_Pos (0) /*!< NFI_T::NANDRA88: Data Position */ +#define NFI_NANDRA88_Data_Msk (0xfffffffful << NFI_NANDRA88_Data_Pos) /*!< NFI_T::NANDRA88: Data Mask */ + +#define NFI_NANDRA89_Data_Pos (0) /*!< NFI_T::NANDRA89: Data Position */ +#define NFI_NANDRA89_Data_Msk (0xfffffffful << NFI_NANDRA89_Data_Pos) /*!< NFI_T::NANDRA89: Data Mask */ + +#define NFI_NANDRA90_Data_Pos (0) /*!< NFI_T::NANDRA90: Data Position */ +#define NFI_NANDRA90_Data_Msk (0xfffffffful << NFI_NANDRA90_Data_Pos) /*!< NFI_T::NANDRA90: Data Mask */ + +#define NFI_NANDRA91_Data_Pos (0) /*!< NFI_T::NANDRA91: Data Position */ +#define NFI_NANDRA91_Data_Msk (0xfffffffful << NFI_NANDRA91_Data_Pos) /*!< NFI_T::NANDRA91: Data Mask */ + +#define NFI_NANDRA92_Data_Pos (0) /*!< NFI_T::NANDRA92: Data Position */ +#define NFI_NANDRA92_Data_Msk (0xfffffffful << NFI_NANDRA92_Data_Pos) /*!< NFI_T::NANDRA92: Data Mask */ + +#define NFI_NANDRA93_Data_Pos (0) /*!< NFI_T::NANDRA93: Data Position */ +#define NFI_NANDRA93_Data_Msk (0xfffffffful << NFI_NANDRA93_Data_Pos) /*!< NFI_T::NANDRA93: Data Mask */ + +#define NFI_NANDRA94_Data_Pos (0) /*!< NFI_T::NANDRA94: Data Position */ +#define NFI_NANDRA94_Data_Msk (0xfffffffful << NFI_NANDRA94_Data_Pos) /*!< NFI_T::NANDRA94: Data Mask */ + +#define NFI_NANDRA95_Data_Pos (0) /*!< NFI_T::NANDRA95: Data Position */ +#define NFI_NANDRA95_Data_Msk (0xfffffffful << NFI_NANDRA95_Data_Pos) /*!< NFI_T::NANDRA95: Data Mask */ + +#define NFI_NANDRA96_Data_Pos (0) /*!< NFI_T::NANDRA96: Data Position */ +#define NFI_NANDRA96_Data_Msk (0xfffffffful << NFI_NANDRA96_Data_Pos) /*!< NFI_T::NANDRA96: Data Mask */ + +#define NFI_NANDRA97_Data_Pos (0) /*!< NFI_T::NANDRA97: Data Position */ +#define NFI_NANDRA97_Data_Msk (0xfffffffful << NFI_NANDRA97_Data_Pos) /*!< NFI_T::NANDRA97: Data Mask */ + +#define NFI_NANDRA98_Data_Pos (0) /*!< NFI_T::NANDRA98: Data Position */ +#define NFI_NANDRA98_Data_Msk (0xfffffffful << NFI_NANDRA98_Data_Pos) /*!< NFI_T::NANDRA98: Data Mask */ + +#define NFI_NANDRA99_Data_Pos (0) /*!< NFI_T::NANDRA99: Data Position */ +#define NFI_NANDRA99_Data_Msk (0xfffffffful << NFI_NANDRA99_Data_Pos) /*!< NFI_T::NANDRA99: Data Mask */ + +#define NFI_NANDRA100_Data_Pos (0) /*!< NFI_T::NANDRA100: Data Position */ +#define NFI_NANDRA100_Data_Msk (0xfffffffful << NFI_NANDRA100_Data_Pos) /*!< NFI_T::NANDRA100: Data Mask */ + +#define NFI_NANDRA101_Data_Pos (0) /*!< NFI_T::NANDRA101: Data Position */ +#define NFI_NANDRA101_Data_Msk (0xfffffffful << NFI_NANDRA101_Data_Pos) /*!< NFI_T::NANDRA101: Data Mask */ + +#define NFI_NANDRA102_Data_Pos (0) /*!< NFI_T::NANDRA102: Data Position */ +#define NFI_NANDRA102_Data_Msk (0xfffffffful << NFI_NANDRA102_Data_Pos) /*!< NFI_T::NANDRA102: Data Mask */ + +#define NFI_NANDRA103_Data_Pos (0) /*!< NFI_T::NANDRA103: Data Position */ +#define NFI_NANDRA103_Data_Msk (0xfffffffful << NFI_NANDRA103_Data_Pos) /*!< NFI_T::NANDRA103: Data Mask */ + +#define NFI_NANDRA104_Data_Pos (0) /*!< NFI_T::NANDRA104: Data Position */ +#define NFI_NANDRA104_Data_Msk (0xfffffffful << NFI_NANDRA104_Data_Pos) /*!< NFI_T::NANDRA104: Data Mask */ + +#define NFI_NANDRA105_Data_Pos (0) /*!< NFI_T::NANDRA105: Data Position */ +#define NFI_NANDRA105_Data_Msk (0xfffffffful << NFI_NANDRA105_Data_Pos) /*!< NFI_T::NANDRA105: Data Mask */ + +#define NFI_NANDRA106_Data_Pos (0) /*!< NFI_T::NANDRA106: Data Position */ +#define NFI_NANDRA106_Data_Msk (0xfffffffful << NFI_NANDRA106_Data_Pos) /*!< NFI_T::NANDRA106: Data Mask */ + +#define NFI_NANDRA107_Data_Pos (0) /*!< NFI_T::NANDRA107: Data Position */ +#define NFI_NANDRA107_Data_Msk (0xfffffffful << NFI_NANDRA107_Data_Pos) /*!< NFI_T::NANDRA107: Data Mask */ + +#define NFI_NANDRA108_Data_Pos (0) /*!< NFI_T::NANDRA108: Data Position */ +#define NFI_NANDRA108_Data_Msk (0xfffffffful << NFI_NANDRA108_Data_Pos) /*!< NFI_T::NANDRA108: Data Mask */ + +#define NFI_NANDRA109_Data_Pos (0) /*!< NFI_T::NANDRA109: Data Position */ +#define NFI_NANDRA109_Data_Msk (0xfffffffful << NFI_NANDRA109_Data_Pos) /*!< NFI_T::NANDRA109: Data Mask */ + +#define NFI_NANDRA110_Data_Pos (0) /*!< NFI_T::NANDRA110: Data Position */ +#define NFI_NANDRA110_Data_Msk (0xfffffffful << NFI_NANDRA110_Data_Pos) /*!< NFI_T::NANDRA110: Data Mask */ + +#define NFI_NANDRA111_Data_Pos (0) /*!< NFI_T::NANDRA111: Data Position */ +#define NFI_NANDRA111_Data_Msk (0xfffffffful << NFI_NANDRA111_Data_Pos) /*!< NFI_T::NANDRA111: Data Mask */ + +#define NFI_NANDRA112_Data_Pos (0) /*!< NFI_T::NANDRA112: Data Position */ +#define NFI_NANDRA112_Data_Msk (0xfffffffful << NFI_NANDRA112_Data_Pos) /*!< NFI_T::NANDRA112: Data Mask */ + +#define NFI_NANDRA113_Data_Pos (0) /*!< NFI_T::NANDRA113: Data Position */ +#define NFI_NANDRA113_Data_Msk (0xfffffffful << NFI_NANDRA113_Data_Pos) /*!< NFI_T::NANDRA113: Data Mask */ + +#define NFI_NANDRA114_Data_Pos (0) /*!< NFI_T::NANDRA114: Data Position */ +#define NFI_NANDRA114_Data_Msk (0xfffffffful << NFI_NANDRA114_Data_Pos) /*!< NFI_T::NANDRA114: Data Mask */ + +#define NFI_NANDRA115_Data_Pos (0) /*!< NFI_T::NANDRA115: Data Position */ +#define NFI_NANDRA115_Data_Msk (0xfffffffful << NFI_NANDRA115_Data_Pos) /*!< NFI_T::NANDRA115: Data Mask */ + +#define NFI_NANDRA116_Data_Pos (0) /*!< NFI_T::NANDRA116: Data Position */ +#define NFI_NANDRA116_Data_Msk (0xfffffffful << NFI_NANDRA116_Data_Pos) /*!< NFI_T::NANDRA116: Data Mask */ + +#define NFI_NANDRA117_Data_Pos (0) /*!< NFI_T::NANDRA117: Data Position */ +#define NFI_NANDRA117_Data_Msk (0xfffffffful << NFI_NANDRA117_Data_Pos) /*!< NFI_T::NANDRA117: Data Mask */ + +/**@}*/ /* NFI_CONST */ +/**@}*/ /* end of NFI register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __NFI_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/otp_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/otp_reg.h new file mode 100644 index 0000000000..d71d6f1b81 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/otp_reg.h @@ -0,0 +1,346 @@ +/**************************************************************************//** +* @file otp_reg.h +* @brief OTP driver header file +* +* SPDX-License-Identifier: Apache-2.0 +* @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#ifndef __OTP_REG_H__ +#define __OTP_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup OTP One-Time Programming Controller(OTP) + Memory Mapped Structure for OTP Controller +@{ */ + +typedef struct +{ + + + /** + * @var OTP_T::CTL + * Offset: 0x00 OTP Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |START |OTP Start Control Bit + * | | |0 = No operation. + * | | |1 = Start the operation. + * |[7:4] |CMD |OTP Command Selection Bits + * | | |0x0 = Read command. + * | | |0x1 = Program command. + * | | |0x2 = Read only lock command. + * | | |0x3 = Fault Tolerance Mechanism command. + * | | |0x7 = Read checker command. + * | | |0xB = Read company ID + * | | |0xC = Read device ID + * | | |0xD = Read unique ID + * | | |Others = reserved. + * @var OTP_T::STS + * Offset: 0x04 OTP Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BUSY |OTP Busy Flag (Read Only) + * | | |0 = OTP is idle or finished. + * | | |1 = OTP is busy. + * |[1] |PFF |OTP Program Fail Flag (Write 1 to Clear) + * | | |This bit is cleared by writing 1 and it has no effect by writing 0. + * | | |0 = No OTP programming operation failed. + * | | |1 = OTP programming operation is failed. + * |[2] |ADDRFF |OTP Address Fail Flag (Write 1 to Clear) + * | | |This bit is cleared by writing 1 and it has no effect by writing 0. + * | | |0 = OTP Address is legal. + * | | |1 = OTP Address is illegal. + * |[3] |FTMFF |OTP Fault Tolerance Mechanism Fail Flag (Write 1 to Clear) + * | | |This bit is set after Fault Tolerance Mechanism command is triggered and address is assigned to a block without available spare memory. + * | | |This bit is cleared by writing 1 and it has no effect by writing 0. + * | | |0 = No OTP fault tolerance mechanism failed. + * | | |1 = OTP fault tolerance mechanism failed. + * |[4] |CMDFF |OTP Command Fail Flag (Write 1 to Clear) + * | | |This bit is set after program command or Fault Tolerance Mechanism command is triggered and address is assigned a locked block. + * | | |This bit is cleared by writing 1 and it has no effect by writing 0. + * | | |0 = No OTP command failed. + * | | |1 = OTP command is failed. + * @var OTP_T::ADDR + * Offset: 0x08 OTP Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |ADDR |OTP Address + * | | |OTP_ADDR register is byte addressable. + * | | |If OTP_ADDR is written to illegal region and START(OTP_CTL[0]) bit is triggered, ADDRFF(OTP_STS[2]) will be set and this operation will not be executed. + * @var OTP_T::DATA + * Offset: 0x0C OTP Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |OTP Data + * | | |Writing data to OTP_DATA register before OTP program operation. + * | | |Reading data from OTP_DATA register after OTP read operation. + * | | |Writing password, 0x55aa_92d6, before OTP read only lock operation or OTP Fault Tolerance Mechanism operation. + * @var OTP_T::USMSTS0 + * Offset: 0x10 OTP Unused Spare Memory 0 Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:2] |BLK1 |Block 1 Unused Spare Memory + * | | |Maximum unused spare memory is 2. + * |[5:4] |BLK2 |Block 2 Unused Spare Memory + * | | |Maximum unused spare memory is 0. + * |[7:6] |BLK3 |Block 3 Unused Spare Memory + * | | |Maximum unused spare memory is 2. + * |[9:8] |BLK4 |Block 4 Unused Spare Memory + * | | |Maximum unused spare memory is 2. + * |[11:10] |BLK5 |Block 5 Unused Spare Memory + * | | |Maximum unused spare memory is 0. + * |[13:12] |BLK6 |Block 6 Unused Spare Memory + * | | |Maximum unused spare memory is 0. + * |[15:14] |BLK7 |Block 7 Unused Spare Memory + * | | |Maximum unused spare memory is 0. + * |[17:16] |BLK8 |Block 8 Unused Spare Memory + * | | |Maximum unused spare memory is 1. + * |[19:18] |BLK9 |Block 9 Unused Spare Memory + * | | |Maximum unused spare memory is 1. + * |[21:20] |BLK10 |Block 10 Unused Spare Memory + * | | |Maximum unused spare memory is 1. + * |[23:22] |BLK11 |Block 11 Unused Spare Memory + * | | |Maximum unused spare memory is 1. + * |[25:24] |BLK12 |Block 12 Unused Spare Memory + * | | |Maximum unused spare memory is 1. + * |[27:26] |BLK13 |Block 13 Unused Spare Memory + * | | |Maximum unused spare memory is 1. + * |[29:28] |BLK14 |Block 14 Unused Spare Memory + * | | |Maximum unused spare memory is 1. + * |[31:30] |BLK15 |Block 15 Unused Spare Memory + * | | |Maximum unused spare memory is 1. + * @var OTP_T::USMSTS1 + * Offset: 0x14 OTP Unused Spare Memory 1 Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |BLK16 |Block 16 Unused Spare Memory + * | | |Maximum unused spare memory is 1. + * @var OTP_T::OTP_CTL + * Offset: 0x800 Non-secure OTP Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |START |OTP Start Control Bit + * | | |0 = No operation. + * | | |1 = Start the operation. + * |[6:4] |CMD |OTP Command Selection Bits + * | | |0x0 = Read command. + * | | |0x1 = Program command. + * | | |0x2 = Read only lock command. + * | | |0x3 = Fault Tolerance Mechanism command. + * | | |0x7 = Read checker command. + * | | |0xB = Read company ID + * | | |0xC = Read device ID + * | | |0xD = Read unique ID + * | | |Others = reserved. + * @var OTP_T::OTP_STS + * Offset: 0x804 Non-secure OTP Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BUSY |OTP Busy Flag (Read Only) + * | | |0 = OTP is idle or finished. + * | | |1 = OTP is busy. + * |[1] |PFF |OTP Program Fail Flag (Write 1 to Clear) + * | | |This bit is cleared by writing 1 and it has no effect by writing 0. + * | | |0 = No OTP programming operation failed. + * | | |1 = OTP programming operation failed. + * |[2] |ADDRFF |OTP Address Fail Flag (Write 1 to Clear) + * | | |This bit is cleared by writing 1 and it has no effect by writing 0. + * | | |0 = OTP Address is legal. + * | | |1 = OTP Address is illegal. + * |[3] |FTMFF |OTP Fault Tolerance Mechanism Fail Flag (Write 1 to Clear) + * | | |This bit is set after Fault Tolerance Mechanism command is triggered and address is assigned to a block without available spare memory. + * | | |This bit is cleared by writing 1 and it has no effect by writing 0. + * | | |0 = No OTP fault tolerance mechanism failed. + * | | |1 = OTP fault tolerance mechanism is failed. + * |[4] |CMDFF |OTP Command Fail Flag (Write 1 to Clear) + * | | |This bit is set after program command or Fault Tolerance Mechanism command is triggered and address is assigned to a locked block. + * | | |This bit is cleared by writing 1 and it has no effect by writing 0. + * | | |0 = No OTP command failed. + * | | |1 = OTP command failed. + * @var OTP_T::OTP_ADDR + * Offset: 0x808 Non-secure OTP Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |ADDR |OTP Address + * | | |OTP_ADDR register is byte addressable. + * | | |If OTP_ADDR is written to illegal region and START(OTP_CTL[0]) bit is triggered, ADDRFF(OTP_STS[2]) will be set and this operation will not be executed. + * @var OTP_T::OTP_DATA + * Offset: 0x80C Non-secure OTP Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |OTP Data + * | | |Writing data to OTP_DATA register before OTP program operation. + * | | |Reading data from OTP_DATA register after OTP read operation. + * | | |Writing password, 0x55aa_92d6, before OTP read only lock operation or OTP Fault Tolerance Mechanism operation. + * @var OTP_T::OTP_USMSTS + * Offset: 0x810 Non-secure OTP Unused Spare Memory Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:6] |BLK3 |Block 3 Unused Spare Memory + * | | |Maximum unused spare memory is 2. + * |[9:8] |BLK4 |Block 4 Unused Spare Memory + * | | |Maximum unused spare memory is 2. + * |[15:14] |BLK7 |Block 7 Unused Spare Memory + * | | |Maximum unused spare memory is 0. + */ + __IO uint32_t CTL; /*!< [0x0000] OTP Control Register */ + __IO uint32_t STS; /*!< [0x0004] OTP Status Register */ + __IO uint32_t ADDR; /*!< [0x0008] OTP Address Register */ + __IO uint32_t DATA; /*!< [0x000c] OTP Data Register */ + __I uint32_t USMSTS0; /*!< [0x0010] OTP Unused Spare Memory 0 Status Register */ + __I uint32_t USMSTS1; /*!< [0x0014] OTP Unused Spare Memory 1 Status Register */ + __I uint32_t RESERVE0[506]; + __IO uint32_t OTP_CTL; /*!< [0x0800] Non-secure OTP Control Register */ + __IO uint32_t OTP_STS; /*!< [0x0804] Non-secure OTP Status Register */ + __IO uint32_t OTP_ADDR; /*!< [0x0808] Non-secure OTP Address Register */ + __IO uint32_t OTP_DATA; /*!< [0x080c] Non-secure OTP Data Register */ + __I uint32_t OTP_USMSTS; /*!< [0x0810] Non-secure OTP Unused Spare Memory Status Register */ + +} OTP_T; + +/** + @addtogroup OTP_CONST OTP Bit Field Definition + Constant Definitions for OTP Controller +@{ */ + +#define OTP_CTL_START_Pos (0) /*!< OTP_T::CTL: START Position */ +#define OTP_CTL_START_Msk (0x1ul << OTP_CTL_START_Pos) /*!< OTP_T::CTL: START Mask */ + +#define OTP_CTL_CMD_Pos (4) /*!< OTP_T::CTL: CMD Position */ +#define OTP_CTL_CMD_Msk (0xful << OTP_CTL_CMD_Pos) /*!< OTP_T::CTL: CMD Mask */ + +#define OTP_STS_BUSY_Pos (0) /*!< OTP_T::STS: BUSY Position */ +#define OTP_STS_BUSY_Msk (0x1ul << OTP_STS_BUSY_Pos) /*!< OTP_T::STS: BUSY Mask */ + +#define OTP_STS_PFF_Pos (1) /*!< OTP_T::STS: PFF Position */ +#define OTP_STS_PFF_Msk (0x1ul << OTP_STS_PFF_Pos) /*!< OTP_T::STS: PFF Mask */ + +#define OTP_STS_ADDRFF_Pos (2) /*!< OTP_T::STS: ADDRFF Position */ +#define OTP_STS_ADDRFF_Msk (0x1ul << OTP_STS_ADDRFF_Pos) /*!< OTP_T::STS: ADDRFF Mask */ + +#define OTP_STS_FTMFF_Pos (3) /*!< OTP_T::STS: FTMFF Position */ +#define OTP_STS_FTMFF_Msk (0x1ul << OTP_STS_FTMFF_Pos) /*!< OTP_T::STS: FTMFF Mask */ + +#define OTP_STS_CMDFF_Pos (4) /*!< OTP_T::STS: CMDFF Position */ +#define OTP_STS_CMDFF_Msk (0x1ul << OTP_STS_CMDFF_Pos) /*!< OTP_T::STS: CMDFF Mask */ + +#define OTP_ADDR_ADDR_Pos (0) /*!< OTP_T::ADDR: ADDR Position */ +#define OTP_ADDR_ADDR_Msk (0xffful << OTP_ADDR_ADDR_Pos) /*!< OTP_T::ADDR: ADDR Mask */ + +#define OTP_DATA_DATA_Pos (0) /*!< OTP_T::DATA: DATA Position */ +#define OTP_DATA_DATA_Msk (0xfffffffful << OTP_DATA_DATA_Pos) /*!< OTP_T::DATA: DATA Mask */ + +#define OTP_USMSTS0_BLK1_Pos (2) /*!< OTP_T::USMSTS0: BLK1 Position */ +#define OTP_USMSTS0_BLK1_Msk (0x3ul << OTP_USMSTS0_BLK1_Pos) /*!< OTP_T::USMSTS0: BLK1 Mask */ + +#define OTP_USMSTS0_BLK2_Pos (4) /*!< OTP_T::USMSTS0: BLK2 Position */ +#define OTP_USMSTS0_BLK2_Msk (0x3ul << OTP_USMSTS0_BLK2_Pos) /*!< OTP_T::USMSTS0: BLK2 Mask */ + +#define OTP_USMSTS0_BLK3_Pos (6) /*!< OTP_T::USMSTS0: BLK3 Position */ +#define OTP_USMSTS0_BLK3_Msk (0x3ul << OTP_USMSTS0_BLK3_Pos) /*!< OTP_T::USMSTS0: BLK3 Mask */ + +#define OTP_USMSTS0_BLK4_Pos (8) /*!< OTP_T::USMSTS0: BLK4 Position */ +#define OTP_USMSTS0_BLK4_Msk (0x3ul << OTP_USMSTS0_BLK4_Pos) /*!< OTP_T::USMSTS0: BLK4 Mask */ + +#define OTP_USMSTS0_BLK5_Pos (10) /*!< OTP_T::USMSTS0: BLK5 Position */ +#define OTP_USMSTS0_BLK5_Msk (0x3ul << OTP_USMSTS0_BLK5_Pos) /*!< OTP_T::USMSTS0: BLK5 Mask */ + +#define OTP_USMSTS0_BLK6_Pos (12) /*!< OTP_T::USMSTS0: BLK6 Position */ +#define OTP_USMSTS0_BLK6_Msk (0x3ul << OTP_USMSTS0_BLK6_Pos) /*!< OTP_T::USMSTS0: BLK6 Mask */ + +#define OTP_USMSTS0_BLK7_Pos (14) /*!< OTP_T::USMSTS0: BLK7 Position */ +#define OTP_USMSTS0_BLK7_Msk (0x3ul << OTP_USMSTS0_BLK7_Pos) /*!< OTP_T::USMSTS0: BLK7 Mask */ + +#define OTP_USMSTS0_BLK8_Pos (16) /*!< OTP_T::USMSTS0: BLK8 Position */ +#define OTP_USMSTS0_BLK8_Msk (0x3ul << OTP_USMSTS0_BLK8_Pos) /*!< OTP_T::USMSTS0: BLK8 Mask */ + +#define OTP_USMSTS0_BLK9_Pos (18) /*!< OTP_T::USMSTS0: BLK9 Position */ +#define OTP_USMSTS0_BLK9_Msk (0x3ul << OTP_USMSTS0_BLK9_Pos) /*!< OTP_T::USMSTS0: BLK9 Mask */ + +#define OTP_USMSTS0_BLK10_Pos (20) /*!< OTP_T::USMSTS0: BLK10 Position */ +#define OTP_USMSTS0_BLK10_Msk (0x3ul << OTP_USMSTS0_BLK10_Pos) /*!< OTP_T::USMSTS0: BLK10 Mask */ + +#define OTP_USMSTS0_BLK11_Pos (22) /*!< OTP_T::USMSTS0: BLK11 Position */ +#define OTP_USMSTS0_BLK11_Msk (0x3ul << OTP_USMSTS0_BLK11_Pos) /*!< OTP_T::USMSTS0: BLK11 Mask */ + +#define OTP_USMSTS0_BLK12_Pos (24) /*!< OTP_T::USMSTS0: BLK12 Position */ +#define OTP_USMSTS0_BLK12_Msk (0x3ul << OTP_USMSTS0_BLK12_Pos) /*!< OTP_T::USMSTS0: BLK12 Mask */ + +#define OTP_USMSTS0_BLK13_Pos (26) /*!< OTP_T::USMSTS0: BLK13 Position */ +#define OTP_USMSTS0_BLK13_Msk (0x3ul << OTP_USMSTS0_BLK13_Pos) /*!< OTP_T::USMSTS0: BLK13 Mask */ + +#define OTP_USMSTS0_BLK14_Pos (28) /*!< OTP_T::USMSTS0: BLK14 Position */ +#define OTP_USMSTS0_BLK14_Msk (0x3ul << OTP_USMSTS0_BLK14_Pos) /*!< OTP_T::USMSTS0: BLK14 Mask */ + +#define OTP_USMSTS0_BLK15_Pos (30) /*!< OTP_T::USMSTS0: BLK15 Position */ +#define OTP_USMSTS0_BLK15_Msk (0x3ul << OTP_USMSTS0_BLK15_Pos) /*!< OTP_T::USMSTS0: BLK15 Mask */ + +#define OTP_USMSTS1_BLK16_Pos (0) /*!< OTP_T::USMSTS1: BLK16 Position */ +#define OTP_USMSTS1_BLK16_Msk (0x3ul << OTP_USMSTS1_BLK16_Pos) /*!< OTP_T::USMSTS1: BLK16 Mask */ + +#define OTP_OTP_CTL_START_Pos (0) /*!< OTP_T::OTP_CTL: START Position */ +#define OTP_OTP_CTL_START_Msk (0x1ul << OTP_OTP_CTL_START_Pos) /*!< OTP_T::OTP_CTL: START Mask */ + +#define OTP_OTP_CTL_CMD_Pos (4) /*!< OTP_T::OTP_CTL: CMD Position */ +#define OTP_OTP_CTL_CMD_Msk (0x7ul << OTP_OTP_CTL_CMD_Pos) /*!< OTP_T::OTP_CTL: CMD Mask */ + +#define OTP_OTP_STS_BUSY_Pos (0) /*!< OTP_T::OTP_STS: BUSY Position */ +#define OTP_OTP_STS_BUSY_Msk (0x1ul << OTP_OTP_STS_BUSY_Pos) /*!< OTP_T::OTP_STS: BUSY Mask */ + +#define OTP_OTP_STS_PFF_Pos (1) /*!< OTP_T::OTP_STS: PFF Position */ +#define OTP_OTP_STS_PFF_Msk (0x1ul << OTP_OTP_STS_PFF_Pos) /*!< OTP_T::OTP_STS: PFF Mask */ + +#define OTP_OTP_STS_ADDRFF_Pos (2) /*!< OTP_T::OTP_STS: ADDRFF Position */ +#define OTP_OTP_STS_ADDRFF_Msk (0x1ul << OTP_OTP_STS_ADDRFF_Pos) /*!< OTP_T::OTP_STS: ADDRFF Mask */ + +#define OTP_OTP_STS_FTMFF_Pos (3) /*!< OTP_T::OTP_STS: FTMFF Position */ +#define OTP_OTP_STS_FTMFF_Msk (0x1ul << OTP_OTP_STS_FTMFF_Pos) /*!< OTP_T::OTP_STS: FTMFF Mask */ + +#define OTP_OTP_STS_CMDFF_Pos (4) /*!< OTP_T::OTP_STS: CMDFF Position */ +#define OTP_OTP_STS_CMDFF_Msk (0x1ul << OTP_OTP_STS_CMDFF_Pos) /*!< OTP_T::OTP_STS: CMDFF Mask */ + +#define OTP_OTP_ADDR_ADDR_Pos (0) /*!< OTP_T::OTP_ADDR: ADDR Position */ +#define OTP_OTP_ADDR_ADDR_Msk (0xffful << OTP_OTP_ADDR_ADDR_Pos) /*!< OTP_T::OTP_ADDR: ADDR Mask */ + +#define OTP_OTP_DATA_DATA_Pos (0) /*!< OTP_T::OTP_DATA: DATA Position */ +#define OTP_OTP_DATA_DATA_Msk (0xfffffffful << OTP_OTP_DATA_DATA_Pos) /*!< OTP_T::OTP_DATA: DATA Mask */ + +#define OTP_OTP_USMSTS_BLK3_Pos (6) /*!< OTP_T::OTP_USMSTS: BLK3 Position */ +#define OTP_OTP_USMSTS_BLK3_Msk (0x3ul << OTP_OTP_USMSTS_BLK3_Pos) /*!< OTP_T::OTP_USMSTS: BLK3 Mask */ + +#define OTP_OTP_USMSTS_BLK4_Pos (8) /*!< OTP_T::OTP_USMSTS: BLK4 Position */ +#define OTP_OTP_USMSTS_BLK4_Msk (0x3ul << OTP_OTP_USMSTS_BLK4_Pos) /*!< OTP_T::OTP_USMSTS: BLK4 Mask */ + +#define OTP_OTP_USMSTS_BLK7_Pos (14) /*!< OTP_T::OTP_USMSTS: BLK7 Position */ +#define OTP_OTP_USMSTS_BLK7_Msk (0x3ul << OTP_OTP_USMSTS_BLK7_Pos) /*!< OTP_T::OTP_USMSTS: BLK7 Mask */ + +/**@}*/ /* OTP_CONST */ +/**@}*/ /* end of OTP register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif //__OTP_REG_H__ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/pdma_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/pdma_reg.h new file mode 100644 index 0000000000..587c0403a5 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/pdma_reg.h @@ -0,0 +1,1020 @@ +/**************************************************************************//** + * @file pdma_reg.h + * @brief PDMA register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __PDMA_REG_H__ +#define __PDMA_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +#define PDMA_CH_MAX 10UL /*!< Specify Maximum Channels of PDMA \hideinitializer */ +#define PDMA_CH_Msk ((1ul<= 1,. + * | | |If MCLKDIV = 0,. + * | | |where + * | | |is the frequency of I2S peripheral clock source, which is defined in the clock control register CLK_CLKSEL4 + * | | |In general, the master clock rate is 256 times sampling clock rate. + * |[17:8] |BCLKDIV |Bit Clock Divider + * | | |The I2S controller will generate bit clock in Master mode + * | | |The clock frequency of bit clock, fBCLK, is determined by the following expression: + * | | |where + * | | |is the frequency of I2S peripheral clock source, which is defined in the clock control register CLK_CLKSEL4. + * | | |In I2S Slave mode, this field is used to define the frequency of peripheral clock and it's determined by . + * | | |The peripheral clock frequency in I2S Slave mode must be equal to or faster than 6 times of input bit clock. + * | | |Note: The time interval must be larger than or equal 5 peripheral clock cycles between releasing SPI IP software reset and setting this clock divider register. + * |[24] |I2SMODE |I2S Clock Divider Number Selection for I2S Mode and SPI Mode + * | | |User sets I2SMODE to set frequency of peripheral clock of I2S mode or SPI mode when BCLKDIV (SPIx_I2SCLK[17:8]) or DIVIDER (SPIx_CLKDIV[8:0]) are set. + * | | |User needs to set I2SMODE before I2SEN (SPIx_I2SCTL[0]) or SPIEN (SPIx_CTL[0]) is enabled. + * | | |0 = The frequency of peripheral clock set to SPI mode. + * | | |1 = The frequency of peripheral clock set to I2S mode. + * |[25] |I2SSLAVE |I2S Clock Divider Number Selection for I2S Slave Mode and I2S Master Mode + * | | |User sets I2SSLAVE to set frequency of peripheral clock of I2S master mode and I2S slave mode when BCLKDIV (SPIx_I2SCLK[17:8]) is set. + * | | |User needs to set I2SSLAVE before I2SEN (SPIx_I2SCTL[0]) is enabled. + * | | |0 = The frequency of peripheral clock set to I2S master mode. + * | | |1 = The frequency of peripheral clock set to I2S slave mode. + * @var SPI_T::I2SSTS + * Offset: 0x68 I2S Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4] |RIGHT |Right Channel (Read Only) + * | | |This bit indicates the current transmit data is belong to which channel. + * | | |0 = Left channel. + * | | |1 = Right channel. + * |[8] |RXEMPTY |Receive FIFO Buffer Empty Indicator (Read Only) + * | | |0 = Receive FIFO buffer is not empty. + * | | |1 = Receive FIFO buffer is empty. + * |[9] |RXFULL |Receive FIFO Buffer Full Indicator (Read Only) + * | | |0 = Receive FIFO buffer is not full. + * | | |1 = Receive FIFO buffer is full. + * |[10] |RXTHIF |Receive FIFO Threshold Interrupt Flag (Read Only) + * | | |0 = The valid data count within the receive FIFO buffer is smaller than or equal to the setting value of RXTH. + * | | |1 = The valid data count within the receive FIFO buffer is larger than the setting value of RXTH. + * | | |Note: If RXTHIEN = 1 and RXTHIF = 1, the SPI/I2S controller will generate a SPI interrupt request. + * |[11] |RXOVIF |Receive FIFO Overrun Interrupt Flag + * | | |When the receive FIFO buffer is full, the follow-up data will be dropped and this bit will be set to 1. + * | | |Note: This bit will be cleared by writing 1 to it. + * |[12] |RXTOIF |Receive Time-out Interrupt Flag + * | | |0 = No receive FIFO time-out event. + * | | |1 = Receive FIFO buffer is not empty and no read operation on receive FIFO buffer over 64 SPI peripheral clock period in Master mode or over 576 SPI peripheral clock period in Slave mode + * | | |When the received FIFO buffer is read by software, the time-out status will be cleared automatically. + * | | |Note: This bit will be cleared by writing 1 to it. + * |[15] |I2SENSTS |I2S Enable Status (Read Only) + * | | |0 = The SPI/I2S control logic Disabled. + * | | |1 = The SPI/I2S control logic Enabled. + * | | |Note: The SPI peripheral clock is asynchronous with the system clock + * | | |In order to make sure the SPI/I2S control logic is disabled, this bit indicates the real status of SPI/I2S control logic for user. + * |[16] |TXEMPTY |Transmit FIFO Buffer Empty Indicator (Read Only) + * | | |0 = Transmit FIFO buffer is not empty. + * | | |1 = Transmit FIFO buffer is empty. + * |[17] |TXFULL |Transmit FIFO Buffer Full Indicator (Read Only) + * | | |0 = Transmit FIFO buffer is not full. + * | | |1 = Transmit FIFO buffer is full. + * |[18] |TXTHIF |Transmit FIFO Threshold Interrupt Flag (Read Only) + * | | |0 = The valid data count within the transmit FIFO buffer is larger than the setting value of TXTH. + * | | |1 = The valid data count within the transmit FIFO buffer is less than or equal to the setting value of TXTH. + * | | |Note: If TXTHIEN = 1 and TXTHIF = 1, the SPI/I2S controller will generate a SPI interrupt request. + * |[19] |TXUFIF |Transmit FIFO Underflow Interrupt Flag + * | | |When the transmit FIFO buffer is empty and there is no datum written into the FIFO buffer, if there is more bus clock input, this bit will be set to 1. + * | | |Note: This bit will be cleared by writing 1 to it. + * |[20] |RZCIF |Right Channel Zero Cross Interrupt Flag + * | | |0 = No zero cross event occurred on right channel. + * | | |1 = Zero cross event occurred on right channel. + * |[21] |LZCIF |Left Channel Zero Cross Interrupt Flag + * | | |0 = No zero cross event occurred on left channel. + * | | |1 = Zero cross event occurred on left channel. + * |[22] |SLVERRIF |Bit Number Error Interrupt Flag for Slave Mode + * | | |0 = No bit number error event occurred. + * | | |1 = Bit number error event occurred. + * | | |Note: This bit will be cleared by writing 1 to it. + * |[23] |TXRXRST |TX or RX Reset Status (Read Only) + * | | |0 = The reset function of TXRST or RXRST is done. + * | | |1 = Doing the reset function of TXRST or RXRST. + * | | |Note: Both the reset operations of TXRST and RXRST need 3 system clock cycles + 2 peripheral clock cycles + * | | |User can check the status of this bit to monitor the reset function is doing or done. + * |[26:24] |RXCNT |Receive FIFO Data Count (Read Only) + * | | |This bit field indicates the valid data count of receive FIFO buffer. + * |[30:28] |TXCNT |Transmit FIFO Data Count (Read Only) + * | | |This bit field indicates the valid data count of transmit FIFO buffer. + */ + __IO uint32_t CTL; /*!< [0x0000] SPI Control Register */ + __IO uint32_t CLKDIV; /*!< [0x0004] SPI Clock Divider Register */ + __IO uint32_t SSCTL; /*!< [0x0008] SPI Slave Select Control Register */ + __IO uint32_t PDMACTL; /*!< [0x000c] SPI PDMA Control Register */ + __IO uint32_t FIFOCTL; /*!< [0x0010] SPI FIFO Control Register */ + __IO uint32_t STATUS; /*!< [0x0014] SPI Status Register */ + __I uint32_t STATUS2; /*!< [0x0018] SPI Status2 Register */ + __I uint32_t RESERVE0[1]; + __O uint32_t TX; /*!< [0x0020] SPI Data Transmit Register */ + __I uint32_t RESERVE1[3]; + __I uint32_t RX; /*!< [0x0030] SPI Data Receive Register */ + __I uint32_t RESERVE2[5]; /*!< [0x0034] Reserved */ + __IO uint32_t INTERNAL; /*!< [0x0048] SPI Internal Control Register */ + __I uint32_t RESERVE3; /*!< [0x004C] Reserved */ + __I uint32_t VER_NUM; /*!< [0x0050] SPI Version Number Register */ + __I uint32_t RESERVE4[3]; /*!< [0x0054] Reserved */ + __IO uint32_t I2SCTL; /*!< [0x0060] I2S Control Register */ + __IO uint32_t I2SCLK; /*!< [0x0064] I2S Clock Divider Control Register */ + __IO uint32_t I2SSTS; /*!< [0x0068] I2S Status Register */ + +} SPI_T; + +/** + @addtogroup SPI_CONST SPI Bit Field Definition + Constant Definitions for SPI Controller +@{ */ + +#define SPI_CTL_SPIEN_Pos (0) /*!< SPI_T::CTL: SPIEN Position */ +#define SPI_CTL_SPIEN_Msk (0x1ul << SPI_CTL_SPIEN_Pos) /*!< SPI_T::CTL: SPIEN Mask */ + +#define SPI_CTL_RXNEG_Pos (1) /*!< SPI_T::CTL: RXNEG Position */ +#define SPI_CTL_RXNEG_Msk (0x1ul << SPI_CTL_RXNEG_Pos) /*!< SPI_T::CTL: RXNEG Mask */ + +#define SPI_CTL_TXNEG_Pos (2) /*!< SPI_T::CTL: TXNEG Position */ +#define SPI_CTL_TXNEG_Msk (0x1ul << SPI_CTL_TXNEG_Pos) /*!< SPI_T::CTL: TXNEG Mask */ + +#define SPI_CTL_CLKPOL_Pos (3) /*!< SPI_T::CTL: CLKPOL Position */ +#define SPI_CTL_CLKPOL_Msk (0x1ul << SPI_CTL_CLKPOL_Pos) /*!< SPI_T::CTL: CLKPOL Mask */ + +#define SPI_CTL_SUSPITV_Pos (4) /*!< SPI_T::CTL: SUSPITV Position */ +#define SPI_CTL_SUSPITV_Msk (0xful << SPI_CTL_SUSPITV_Pos) /*!< SPI_T::CTL: SUSPITV Mask */ + +#define SPI_CTL_DWIDTH_Pos (8) /*!< SPI_T::CTL: DWIDTH Position */ +#define SPI_CTL_DWIDTH_Msk (0x1ful << SPI_CTL_DWIDTH_Pos) /*!< SPI_T::CTL: DWIDTH Mask */ + +#define SPI_CTL_LSB_Pos (13) /*!< SPI_T::CTL: LSB Position */ +#define SPI_CTL_LSB_Msk (0x1ul << SPI_CTL_LSB_Pos) /*!< SPI_T::CTL: LSB Mask */ + +#define SPI_CTL_HALFDPX_Pos (14) /*!< SPI_T::CTL: HALFDPX Position */ +#define SPI_CTL_HALFDPX_Msk (0x1ul << SPI_CTL_HALFDPX_Pos) /*!< SPI_T::CTL: HALFDPX Mask */ + +#define SPI_CTL_RXONLY_Pos (15) /*!< SPI_T::CTL: RXONLY Position */ +#define SPI_CTL_RXONLY_Msk (0x1ul << SPI_CTL_RXONLY_Pos) /*!< SPI_T::CTL: RXONLY Mask */ + +#define SPI_CTL_UNITIEN_Pos (17) /*!< SPI_T::CTL: UNITIEN Position */ +#define SPI_CTL_UNITIEN_Msk (0x1ul << SPI_CTL_UNITIEN_Pos) /*!< SPI_T::CTL: UNITIEN Mask */ + +#define SPI_CTL_SLAVE_Pos (18) /*!< SPI_T::CTL: SLAVE Position */ +#define SPI_CTL_SLAVE_Msk (0x1ul << SPI_CTL_SLAVE_Pos) /*!< SPI_T::CTL: SLAVE Mask */ + +#define SPI_CTL_REORDER_Pos (19) /*!< SPI_T::CTL: REORDER Position */ +#define SPI_CTL_REORDER_Msk (0x1ul << SPI_CTL_REORDER_Pos) /*!< SPI_T::CTL: REORDER Mask */ + +#define SPI_CTL_DATDIR_Pos (20) /*!< SPI_T::CTL: DATDIR Position */ +#define SPI_CTL_DATDIR_Msk (0x1ul << SPI_CTL_DATDIR_Pos) /*!< SPI_T::CTL: DATDIR Mask */ + +#define SPI_CLKDIV_DIVIDER_Pos (0) /*!< SPI_T::CLKDIV: DIVIDER Position */ +#define SPI_CLKDIV_DIVIDER_Msk (0x1fful << SPI_CLKDIV_DIVIDER_Pos) /*!< SPI_T::CLKDIV: DIVIDER Mask */ + +#define SPI_SSCTL_SS_Pos (0) /*!< SPI_T::SSCTL: SS Position */ +#define SPI_SSCTL_SS_Msk (0x1ul << SPI_SSCTL_SS_Pos) /*!< SPI_T::SSCTL: SS Mask */ + +#define SPI_SSCTL_SS0_Pos (0) /*!< SPI_T::SSCTL: SS0 Position */ +#define SPI_SSCTL_SS0_Msk (0x1ul << SPI_SSCTL_SS0_Pos) /*!< SPI_T::SSCTL: SS0 Mask */ + +#define SPI_SSCTL_SS1_Pos (1) /*!< SPI_T::SSCTL: SS1 Position */ +#define SPI_SSCTL_SS1_Msk (0x1ul << SPI_SSCTL_SS1_Pos) /*!< SPI_T::SSCTL: SS1 Mask */ + +#define SPI_SSCTL_SSACTPOL_Pos (2) /*!< SPI_T::SSCTL: SSACTPOL Position */ +#define SPI_SSCTL_SSACTPOL_Msk (0x1ul << SPI_SSCTL_SSACTPOL_Pos) /*!< SPI_T::SSCTL: SSACTPOL Mask */ + +#define SPI_SSCTL_AUTOSS_Pos (3) /*!< SPI_T::SSCTL: AUTOSS Position */ +#define SPI_SSCTL_AUTOSS_Msk (0x1ul << SPI_SSCTL_AUTOSS_Pos) /*!< SPI_T::SSCTL: AUTOSS Mask */ + +#define SPI_SSCTL_SLV3WIRE_Pos (4) /*!< SPI_T::SSCTL: SLV3WIRE Position */ +#define SPI_SSCTL_SLV3WIRE_Msk (0x1ul << SPI_SSCTL_SLV3WIRE_Pos) /*!< SPI_T::SSCTL: SLV3WIRE Mask */ + +#define SPI_SSCTL_SLVBEIEN_Pos (8) /*!< SPI_T::SSCTL: SLVBEIEN Position */ +#define SPI_SSCTL_SLVBEIEN_Msk (0x1ul << SPI_SSCTL_SLVBEIEN_Pos) /*!< SPI_T::SSCTL: SLVBEIEN Mask */ + +#define SPI_SSCTL_SLVURIEN_Pos (9) /*!< SPI_T::SSCTL: SLVURIEN Position */ +#define SPI_SSCTL_SLVURIEN_Msk (0x1ul << SPI_SSCTL_SLVURIEN_Pos) /*!< SPI_T::SSCTL: SLVURIEN Mask */ + +#define SPI_SSCTL_SSACTIEN_Pos (12) /*!< SPI_T::SSCTL: SSACTIEN Position */ +#define SPI_SSCTL_SSACTIEN_Msk (0x1ul << SPI_SSCTL_SSACTIEN_Pos) /*!< SPI_T::SSCTL: SSACTIEN Mask */ + +#define SPI_SSCTL_SSINAIEN_Pos (13) /*!< SPI_T::SSCTL: SSINAIEN Position */ +#define SPI_SSCTL_SSINAIEN_Msk (0x1ul << SPI_SSCTL_SSINAIEN_Pos) /*!< SPI_T::SSCTL: SSINAIEN Mask */ + +#define SPI_PDMACTL_TXPDMAEN_Pos (0) /*!< SPI_T::PDMACTL: TXPDMAEN Position */ +#define SPI_PDMACTL_TXPDMAEN_Msk (0x1ul << SPI_PDMACTL_TXPDMAEN_Pos) /*!< SPI_T::PDMACTL: TXPDMAEN Mask */ + +#define SPI_PDMACTL_RXPDMAEN_Pos (1) /*!< SPI_T::PDMACTL: RXPDMAEN Position */ +#define SPI_PDMACTL_RXPDMAEN_Msk (0x1ul << SPI_PDMACTL_RXPDMAEN_Pos) /*!< SPI_T::PDMACTL: RXPDMAEN Mask */ + +#define SPI_PDMACTL_PDMARST_Pos (2) /*!< SPI_T::PDMACTL: PDMARST Position */ +#define SPI_PDMACTL_PDMARST_Msk (0x1ul << SPI_PDMACTL_PDMARST_Pos) /*!< SPI_T::PDMACTL: PDMARST Mask */ + +#define SPI_FIFOCTL_RXRST_Pos (0) /*!< SPI_T::FIFOCTL: RXRST Position */ +#define SPI_FIFOCTL_RXRST_Msk (0x1ul << SPI_FIFOCTL_RXRST_Pos) /*!< SPI_T::FIFOCTL: RXRST Mask */ + +#define SPI_FIFOCTL_TXRST_Pos (1) /*!< SPI_T::FIFOCTL: TXRST Position */ +#define SPI_FIFOCTL_TXRST_Msk (0x1ul << SPI_FIFOCTL_TXRST_Pos) /*!< SPI_T::FIFOCTL: TXRST Mask */ + +#define SPI_FIFOCTL_RXTHIEN_Pos (2) /*!< SPI_T::FIFOCTL: RXTHIEN Position */ +#define SPI_FIFOCTL_RXTHIEN_Msk (0x1ul << SPI_FIFOCTL_RXTHIEN_Pos) /*!< SPI_T::FIFOCTL: RXTHIEN Mask */ + +#define SPI_FIFOCTL_TXTHIEN_Pos (3) /*!< SPI_T::FIFOCTL: TXTHIEN Position */ +#define SPI_FIFOCTL_TXTHIEN_Msk (0x1ul << SPI_FIFOCTL_TXTHIEN_Pos) /*!< SPI_T::FIFOCTL: TXTHIEN Mask */ + +#define SPI_FIFOCTL_RXTOIEN_Pos (4) /*!< SPI_T::FIFOCTL: RXTOIEN Position */ +#define SPI_FIFOCTL_RXTOIEN_Msk (0x1ul << SPI_FIFOCTL_RXTOIEN_Pos) /*!< SPI_T::FIFOCTL: RXTOIEN Mask */ + +#define SPI_FIFOCTL_RXOVIEN_Pos (5) /*!< SPI_T::FIFOCTL: RXOVIEN Position */ +#define SPI_FIFOCTL_RXOVIEN_Msk (0x1ul << SPI_FIFOCTL_RXOVIEN_Pos) /*!< SPI_T::FIFOCTL: RXOVIEN Mask */ + +#define SPI_FIFOCTL_TXUFPOL_Pos (6) /*!< SPI_T::FIFOCTL: TXUFPOL Position */ +#define SPI_FIFOCTL_TXUFPOL_Msk (0x1ul << SPI_FIFOCTL_TXUFPOL_Pos) /*!< SPI_T::FIFOCTL: TXUFPOL Mask */ + +#define SPI_FIFOCTL_TXUFIEN_Pos (7) /*!< SPI_T::FIFOCTL: TXUFIEN Position */ +#define SPI_FIFOCTL_TXUFIEN_Msk (0x1ul << SPI_FIFOCTL_TXUFIEN_Pos) /*!< SPI_T::FIFOCTL: TXUFIEN Mask */ + +#define SPI_FIFOCTL_RXFBCLR_Pos (8) /*!< SPI_T::FIFOCTL: RXFBCLR Position */ +#define SPI_FIFOCTL_RXFBCLR_Msk (0x1ul << SPI_FIFOCTL_RXFBCLR_Pos) /*!< SPI_T::FIFOCTL: RXFBCLR Mask */ + +#define SPI_FIFOCTL_TXFBCLR_Pos (9) /*!< SPI_T::FIFOCTL: TXFBCLR Position */ +#define SPI_FIFOCTL_TXFBCLR_Msk (0x1ul << SPI_FIFOCTL_TXFBCLR_Pos) /*!< SPI_T::FIFOCTL: TXFBCLR Mask */ + +#define SPI_FIFOCTL_SLVBERX_Pos (10) /*!< SPI_T::FIFOCTL: SLVBERX Position */ +#define SPI_FIFOCTL_SLVBERX_Msk (0x1ul << SPI_FIFOCTL_SLVBERX_Pos) /*!< SPI_T::FIFOCTL: SLVBERX Mask */ + +#define SPI_FIFOCTL_RXTH_Pos (24) /*!< SPI_T::FIFOCTL: RXTH Position */ +#define SPI_FIFOCTL_RXTH_Msk (0x7ul << SPI_FIFOCTL_RXTH_Pos) /*!< SPI_T::FIFOCTL: RXTH Mask */ + +#define SPI_FIFOCTL_TXTH_Pos (28) /*!< SPI_T::FIFOCTL: TXTH Position */ +#define SPI_FIFOCTL_TXTH_Msk (0x7ul << SPI_FIFOCTL_TXTH_Pos) /*!< SPI_T::FIFOCTL: TXTH Mask */ + +#define SPI_STATUS_BUSY_Pos (0) /*!< SPI_T::STATUS: BUSY Position */ +#define SPI_STATUS_BUSY_Msk (0x1ul << SPI_STATUS_BUSY_Pos) /*!< SPI_T::STATUS: BUSY Mask */ + +#define SPI_STATUS_UNITIF_Pos (1) /*!< SPI_T::STATUS: UNITIF Position */ +#define SPI_STATUS_UNITIF_Msk (0x1ul << SPI_STATUS_UNITIF_Pos) /*!< SPI_T::STATUS: UNITIF Mask */ + +#define SPI_STATUS_SSACTIF_Pos (2) /*!< SPI_T::STATUS: SSACTIF Position */ +#define SPI_STATUS_SSACTIF_Msk (0x1ul << SPI_STATUS_SSACTIF_Pos) /*!< SPI_T::STATUS: SSACTIF Mask */ + +#define SPI_STATUS_SSINAIF_Pos (3) /*!< SPI_T::STATUS: SSINAIF Position */ +#define SPI_STATUS_SSINAIF_Msk (0x1ul << SPI_STATUS_SSINAIF_Pos) /*!< SPI_T::STATUS: SSINAIF Mask */ + +#define SPI_STATUS_SSLINE_Pos (4) /*!< SPI_T::STATUS: SSLINE Position */ +#define SPI_STATUS_SSLINE_Msk (0x1ul << SPI_STATUS_SSLINE_Pos) /*!< SPI_T::STATUS: SSLINE Mask */ + +#define SPI_STATUS_SLVBEIF_Pos (6) /*!< SPI_T::STATUS: SLVBEIF Position */ +#define SPI_STATUS_SLVBEIF_Msk (0x1ul << SPI_STATUS_SLVBEIF_Pos) /*!< SPI_T::STATUS: SLVBEIF Mask */ + +#define SPI_STATUS_SLVURIF_Pos (7) /*!< SPI_T::STATUS: SLVURIF Position */ +#define SPI_STATUS_SLVURIF_Msk (0x1ul << SPI_STATUS_SLVURIF_Pos) /*!< SPI_T::STATUS: SLVURIF Mask */ + +#define SPI_STATUS_RXEMPTY_Pos (8) /*!< SPI_T::STATUS: RXEMPTY Position */ +#define SPI_STATUS_RXEMPTY_Msk (0x1ul << SPI_STATUS_RXEMPTY_Pos) /*!< SPI_T::STATUS: RXEMPTY Mask */ + +#define SPI_STATUS_RXFULL_Pos (9) /*!< SPI_T::STATUS: RXFULL Position */ +#define SPI_STATUS_RXFULL_Msk (0x1ul << SPI_STATUS_RXFULL_Pos) /*!< SPI_T::STATUS: RXFULL Mask */ + +#define SPI_STATUS_RXTHIF_Pos (10) /*!< SPI_T::STATUS: RXTHIF Position */ +#define SPI_STATUS_RXTHIF_Msk (0x1ul << SPI_STATUS_RXTHIF_Pos) /*!< SPI_T::STATUS: RXTHIF Mask */ + +#define SPI_STATUS_RXOVIF_Pos (11) /*!< SPI_T::STATUS: RXOVIF Position */ +#define SPI_STATUS_RXOVIF_Msk (0x1ul << SPI_STATUS_RXOVIF_Pos) /*!< SPI_T::STATUS: RXOVIF Mask */ + +#define SPI_STATUS_RXTOIF_Pos (12) /*!< SPI_T::STATUS: RXTOIF Position */ +#define SPI_STATUS_RXTOIF_Msk (0x1ul << SPI_STATUS_RXTOIF_Pos) /*!< SPI_T::STATUS: RXTOIF Mask */ + +#define SPI_STATUS_SPIENSTS_Pos (15) /*!< SPI_T::STATUS: SPIENSTS Position */ +#define SPI_STATUS_SPIENSTS_Msk (0x1ul << SPI_STATUS_SPIENSTS_Pos) /*!< SPI_T::STATUS: SPIENSTS Mask */ + +#define SPI_STATUS_TXEMPTY_Pos (16) /*!< SPI_T::STATUS: TXEMPTY Position */ +#define SPI_STATUS_TXEMPTY_Msk (0x1ul << SPI_STATUS_TXEMPTY_Pos) /*!< SPI_T::STATUS: TXEMPTY Mask */ + +#define SPI_STATUS_TXFULL_Pos (17) /*!< SPI_T::STATUS: TXFULL Position */ +#define SPI_STATUS_TXFULL_Msk (0x1ul << SPI_STATUS_TXFULL_Pos) /*!< SPI_T::STATUS: TXFULL Mask */ + +#define SPI_STATUS_TXTHIF_Pos (18) /*!< SPI_T::STATUS: TXTHIF Position */ +#define SPI_STATUS_TXTHIF_Msk (0x1ul << SPI_STATUS_TXTHIF_Pos) /*!< SPI_T::STATUS: TXTHIF Mask */ + +#define SPI_STATUS_TXUFIF_Pos (19) /*!< SPI_T::STATUS: TXUFIF Position */ +#define SPI_STATUS_TXUFIF_Msk (0x1ul << SPI_STATUS_TXUFIF_Pos) /*!< SPI_T::STATUS: TXUFIF Mask */ + +#define SPI_STATUS_FIFOCLR_Pos (22) /*!< SPI_T::STATUS: FIFOCLR Position */ +#define SPI_STATUS_FIFOCLR_Msk (0x1ul << SPI_STATUS_FIFOCLR_Pos) /*!< SPI_T::STATUS: FIFOCLR Mask */ + +#define SPI_STATUS_TXRXRST_Pos (23) /*!< SPI_T::STATUS: TXRXRST Position */ +#define SPI_STATUS_TXRXRST_Msk (0x1ul << SPI_STATUS_TXRXRST_Pos) /*!< SPI_T::STATUS: TXRXRST Mask */ + +#define SPI_STATUS_RXCNT_Pos (24) /*!< SPI_T::STATUS: RXCNT Position */ +#define SPI_STATUS_RXCNT_Msk (0xful << SPI_STATUS_RXCNT_Pos) /*!< SPI_T::STATUS: RXCNT Mask */ + +#define SPI_STATUS_TXCNT_Pos (28) /*!< SPI_T::STATUS: TXCNT Position */ +#define SPI_STATUS_TXCNT_Msk (0xful << SPI_STATUS_TXCNT_Pos) /*!< SPI_T::STATUS: TXCNT Mask */ + +#define SPI_STATUS2_RXCPDMA_Pos (8) /*!< SPI_T::STATUS2: RXCPDMA Position */ +#define SPI_STATUS2_RXCPDMA_Msk (0x1ful << SPI_STATUS2_RXCPDMA_Pos) /*!< SPI_T::STATUS2: RXCPDMA Mask */ + +#define SPI_STATUS2_TXCPDMA_Pos (16) /*!< SPI_T::STATUS2: TXCPDMA Position */ +#define SPI_STATUS2_TXCPDMA_Msk (0x1ful << SPI_STATUS2_TXCPDMA_Pos) /*!< SPI_T::STATUS2: TXCPDMA Mask */ + +#define SPI_STATUS2_SLVBENUM_Pos (24) /*!< SPI_T::STATUS2: SLVBENUM Position */ +#define SPI_STATUS2_SLVBENUM_Msk (0x3ful << SPI_STATUS2_SLVBENUM_Pos) /*!< SPI_T::STATUS2: SLVBENUM Mask */ + +#define SPI_TX_TX_Pos (0) /*!< SPI_T::TX: TX Position */ +#define SPI_TX_TX_Msk (0xfffffffful << SPI_TX_TX_Pos) /*!< SPI_T::TX: TX Mask */ + +#define SPI_RX_RX_Pos (0) /*!< SPI_T::RX: RX Position */ +#define SPI_RX_RX_Msk (0xfffffffful << SPI_RX_RX_Pos) /*!< SPI_T::RX: RX Mask */ + +#define SPI_INTERNAL_MRXPHASE_Pos (12) /*!< SPI_T::INTERNAL: CLKDLY_SEL Position */ +#define SPI_INTERNAL_MRXPHASE_Msk (0xful << SPI_INTERNAL_MRXPHASE_Pos) /*!< SPI_T::INTERNAL: CLKDLY_SEL Mask */ + +#define SPI_I2SCTL_I2SEN_Pos (0) /*!< SPI_T::I2SCTL: I2SEN Position */ +#define SPI_I2SCTL_I2SEN_Msk (0x1ul << SPI_I2SCTL_I2SEN_Pos) /*!< SPI_T::I2SCTL: I2SEN Mask */ + +#define SPI_I2SCTL_TXEN_Pos (1) /*!< SPI_T::I2SCTL: TXEN Position */ +#define SPI_I2SCTL_TXEN_Msk (0x1ul << SPI_I2SCTL_TXEN_Pos) /*!< SPI_T::I2SCTL: TXEN Mask */ + +#define SPI_I2SCTL_RXEN_Pos (2) /*!< SPI_T::I2SCTL: RXEN Position */ +#define SPI_I2SCTL_RXEN_Msk (0x1ul << SPI_I2SCTL_RXEN_Pos) /*!< SPI_T::I2SCTL: RXEN Mask */ + +#define SPI_I2SCTL_MUTE_Pos (3) /*!< SPI_T::I2SCTL: MUTE Position */ +#define SPI_I2SCTL_MUTE_Msk (0x1ul << SPI_I2SCTL_MUTE_Pos) /*!< SPI_T::I2SCTL: MUTE Mask */ + +#define SPI_I2SCTL_WDWIDTH_Pos (4) /*!< SPI_T::I2SCTL: WDWIDTH Position */ +#define SPI_I2SCTL_WDWIDTH_Msk (0x3ul << SPI_I2SCTL_WDWIDTH_Pos) /*!< SPI_T::I2SCTL: WDWIDTH Mask */ + +#define SPI_I2SCTL_MONO_Pos (6) /*!< SPI_T::I2SCTL: MONO Position */ +#define SPI_I2SCTL_MONO_Msk (0x1ul << SPI_I2SCTL_MONO_Pos) /*!< SPI_T::I2SCTL: MONO Mask */ + +#define SPI_I2SCTL_ORDER_Pos (7) /*!< SPI_T::I2SCTL: ORDER Position */ +#define SPI_I2SCTL_ORDER_Msk (0x1ul << SPI_I2SCTL_ORDER_Pos) /*!< SPI_T::I2SCTL: ORDER Mask */ + +#define SPI_I2SCTL_SLAVE_Pos (8) /*!< SPI_T::I2SCTL: SLAVE Position */ +#define SPI_I2SCTL_SLAVE_Msk (0x1ul << SPI_I2SCTL_SLAVE_Pos) /*!< SPI_T::I2SCTL: SLAVE Mask */ + +#define SPI_I2SCTL_MCLKEN_Pos (15) /*!< SPI_T::I2SCTL: MCLKEN Position */ +#define SPI_I2SCTL_MCLKEN_Msk (0x1ul << SPI_I2SCTL_MCLKEN_Pos) /*!< SPI_T::I2SCTL: MCLKEN Mask */ + +#define SPI_I2SCTL_RZCEN_Pos (16) /*!< SPI_T::I2SCTL: RZCEN Position */ +#define SPI_I2SCTL_RZCEN_Msk (0x1ul << SPI_I2SCTL_RZCEN_Pos) /*!< SPI_T::I2SCTL: RZCEN Mask */ + +#define SPI_I2SCTL_LZCEN_Pos (17) /*!< SPI_T::I2SCTL: LZCEN Position */ +#define SPI_I2SCTL_LZCEN_Msk (0x1ul << SPI_I2SCTL_LZCEN_Pos) /*!< SPI_T::I2SCTL: LZCEN Mask */ + +#define SPI_I2SCTL_RXLCH_Pos (23) /*!< SPI_T::I2SCTL: RXLCH Position */ +#define SPI_I2SCTL_RXLCH_Msk (0x1ul << SPI_I2SCTL_RXLCH_Pos) /*!< SPI_T::I2SCTL: RXLCH Mask */ + +#define SPI_I2SCTL_RZCIEN_Pos (24) /*!< SPI_T::I2SCTL: RZCIEN Position */ +#define SPI_I2SCTL_RZCIEN_Msk (0x1ul << SPI_I2SCTL_RZCIEN_Pos) /*!< SPI_T::I2SCTL: RZCIEN Mask */ + +#define SPI_I2SCTL_LZCIEN_Pos (25) /*!< SPI_T::I2SCTL: LZCIEN Position */ +#define SPI_I2SCTL_LZCIEN_Msk (0x1ul << SPI_I2SCTL_LZCIEN_Pos) /*!< SPI_T::I2SCTL: LZCIEN Mask */ + +#define SPI_I2SCTL_FORMAT_Pos (28) /*!< SPI_T::I2SCTL: FORMAT Position */ +#define SPI_I2SCTL_FORMAT_Msk (0x3ul << SPI_I2SCTL_FORMAT_Pos) /*!< SPI_T::I2SCTL: FORMAT Mask */ + +#define SPI_I2SCTL_SLVERRIEN_Pos (31) /*!< SPI_T::I2SCTL: SLVERRIEN Position */ +#define SPI_I2SCTL_SLVERRIEN_Msk (0x1ul << SPI_I2SCTL_SLVERRIEN_Pos) /*!< SPI_T::I2SCTL: SLVERRIEN Mask */ + +#define SPI_I2SCLK_MCLKDIV_Pos (0) /*!< SPI_T::I2SCLK: MCLKDIV Position */ +#define SPI_I2SCLK_MCLKDIV_Msk (0x7ful << SPI_I2SCLK_MCLKDIV_Pos) /*!< SPI_T::I2SCLK: MCLKDIV Mask */ + +#define SPI_I2SCLK_BCLKDIV_Pos (8) /*!< SPI_T::I2SCLK: BCLKDIV Position */ +#define SPI_I2SCLK_BCLKDIV_Msk (0x3fful << SPI_I2SCLK_BCLKDIV_Pos) /*!< SPI_T::I2SCLK: BCLKDIV Mask */ + +#define SPI_I2SCLK_I2SMODE_Pos (24) /*!< SPI_T::I2SCLK: I2SMODE Position */ +#define SPI_I2SCLK_I2SMODE_Msk (0x1ul << SPI_I2SCLK_I2SMODE_Pos) /*!< SPI_T::I2SCLK: I2SMODE Mask */ + +#define SPI_I2SCLK_I2SSLAVE_Pos (25) /*!< SPI_T::I2SCLK: I2SSLAVE Position */ +#define SPI_I2SCLK_I2SSLAVE_Msk (0x1ul << SPI_I2SCLK_I2SSLAVE_Pos) /*!< SPI_T::I2SCLK: I2SSLAVE Mask */ + +#define SPI_I2SSTS_RIGHT_Pos (4) /*!< SPI_T::I2SSTS: RIGHT Position */ +#define SPI_I2SSTS_RIGHT_Msk (0x1ul << SPI_I2SSTS_RIGHT_Pos) /*!< SPI_T::I2SSTS: RIGHT Mask */ + +#define SPI_I2SSTS_RXEMPTY_Pos (8) /*!< SPI_T::I2SSTS: RXEMPTY Position */ +#define SPI_I2SSTS_RXEMPTY_Msk (0x1ul << SPI_I2SSTS_RXEMPTY_Pos) /*!< SPI_T::I2SSTS: RXEMPTY Mask */ + +#define SPI_I2SSTS_RXFULL_Pos (9) /*!< SPI_T::I2SSTS: RXFULL Position */ +#define SPI_I2SSTS_RXFULL_Msk (0x1ul << SPI_I2SSTS_RXFULL_Pos) /*!< SPI_T::I2SSTS: RXFULL Mask */ + +#define SPI_I2SSTS_RXTHIF_Pos (10) /*!< SPI_T::I2SSTS: RXTHIF Position */ +#define SPI_I2SSTS_RXTHIF_Msk (0x1ul << SPI_I2SSTS_RXTHIF_Pos) /*!< SPI_T::I2SSTS: RXTHIF Mask */ + +#define SPI_I2SSTS_RXOVIF_Pos (11) /*!< SPI_T::I2SSTS: RXOVIF Position */ +#define SPI_I2SSTS_RXOVIF_Msk (0x1ul << SPI_I2SSTS_RXOVIF_Pos) /*!< SPI_T::I2SSTS: RXOVIF Mask */ + +#define SPI_I2SSTS_RXTOIF_Pos (12) /*!< SPI_T::I2SSTS: RXTOIF Position */ +#define SPI_I2SSTS_RXTOIF_Msk (0x1ul << SPI_I2SSTS_RXTOIF_Pos) /*!< SPI_T::I2SSTS: RXTOIF Mask */ + +#define SPI_I2SSTS_I2SENSTS_Pos (15) /*!< SPI_T::I2SSTS: I2SENSTS Position */ +#define SPI_I2SSTS_I2SENSTS_Msk (0x1ul << SPI_I2SSTS_I2SENSTS_Pos) /*!< SPI_T::I2SSTS: I2SENSTS Mask */ + +#define SPI_I2SSTS_TXEMPTY_Pos (16) /*!< SPI_T::I2SSTS: TXEMPTY Position */ +#define SPI_I2SSTS_TXEMPTY_Msk (0x1ul << SPI_I2SSTS_TXEMPTY_Pos) /*!< SPI_T::I2SSTS: TXEMPTY Mask */ + +#define SPI_I2SSTS_TXFULL_Pos (17) /*!< SPI_T::I2SSTS: TXFULL Position */ +#define SPI_I2SSTS_TXFULL_Msk (0x1ul << SPI_I2SSTS_TXFULL_Pos) /*!< SPI_T::I2SSTS: TXFULL Mask */ + +#define SPI_I2SSTS_TXTHIF_Pos (18) /*!< SPI_T::I2SSTS: TXTHIF Position */ +#define SPI_I2SSTS_TXTHIF_Msk (0x1ul << SPI_I2SSTS_TXTHIF_Pos) /*!< SPI_T::I2SSTS: TXTHIF Mask */ + +#define SPI_I2SSTS_TXUFIF_Pos (19) /*!< SPI_T::I2SSTS: TXUFIF Position */ +#define SPI_I2SSTS_TXUFIF_Msk (0x1ul << SPI_I2SSTS_TXUFIF_Pos) /*!< SPI_T::I2SSTS: TXUFIF Mask */ + +#define SPI_I2SSTS_RZCIF_Pos (20) /*!< SPI_T::I2SSTS: RZCIF Position */ +#define SPI_I2SSTS_RZCIF_Msk (0x1ul << SPI_I2SSTS_RZCIF_Pos) /*!< SPI_T::I2SSTS: RZCIF Mask */ + +#define SPI_I2SSTS_LZCIF_Pos (21) /*!< SPI_T::I2SSTS: LZCIF Position */ +#define SPI_I2SSTS_LZCIF_Msk (0x1ul << SPI_I2SSTS_LZCIF_Pos) /*!< SPI_T::I2SSTS: LZCIF Mask */ + +#define SPI_I2SSTS_SLVERRIF_Pos (22) /*!< SPI_T::I2SSTS: SLVERRIF Position */ +#define SPI_I2SSTS_SLVERRIF_Msk (0x1ul << SPI_I2SSTS_SLVERRIF_Pos) /*!< SPI_T::I2SSTS: SLVERRIF Mask */ + +#define SPI_I2SSTS_TXRXRST_Pos (23) /*!< SPI_T::I2SSTS: TXRXRST Position */ +#define SPI_I2SSTS_TXRXRST_Msk (0x1ul << SPI_I2SSTS_TXRXRST_Pos) /*!< SPI_T::I2SSTS: TXRXRST Mask */ + +#define SPI_I2SSTS_RXCNT_Pos (24) /*!< SPI_T::I2SSTS: RXCNT Position */ +#define SPI_I2SSTS_RXCNT_Msk (0x7ul << SPI_I2SSTS_RXCNT_Pos) /*!< SPI_T::I2SSTS: RXCNT Mask */ + +#define SPI_I2SSTS_TXCNT_Pos (28) /*!< SPI_T::I2SSTS: TXCNT Position */ +#define SPI_I2SSTS_TXCNT_Msk (0x7ul << SPI_I2SSTS_TXCNT_Pos) /*!< SPI_T::I2SSTS: TXCNT Mask */ + +/**@}*/ /* SPI_CONST */ +/**@}*/ /* end of SPI register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __SPI_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ssmcc_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ssmcc_reg.h new file mode 100644 index 0000000000..1ad967d3d0 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ssmcc_reg.h @@ -0,0 +1,932 @@ +/**************************************************************************//** + * @file ssmcc_reg.h + * @brief SSMCC register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __SSMCC_REG_H__ +#define __SSMCC_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + + +/******************************************************************************/ +/* Device Specific Peripheral registers structures */ +/******************************************************************************/ + +/** @addtogroup REGISTER Control Register + + @{ + +*/ + +typedef struct +{ + /** + * @var FAIL_T::ADDRESS_LOW + * Offset: 0x20 Contains the lower 32 bits of the address of the first access that failed a region permission check in the associated filter unit. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |addr_status_low|If a region permission check fails or a region overlap occurs, this field returns the ACE-Lite address bits [31:0] of the first f. You must clear the associated interrupt status before this field can return the address of accesses of subsequent permission checks or region overlap failures. This occurs even if the ACTION register does not enable the interrupt. If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * @var FAIL_T::ADDRESS_HIGH + * Offset: 0x24 Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var FAIL_T::CONTROL + * Offset: 0x28 Contains the control status information of the first access that failed a region permission check in the associated filter unit. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[20] |Privileged|If a region permission check fails or a region overlap occurs, this field indicates whether it was an unprivileged or privileged access attempt You must clear the associated interrupt status before this field can return the values of accesses of subsequent permission checks or region overlap failures 0 Unprivileged access 1 Privileged access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * |[21] |Non_secure|If a region permission check fails or a region overlap occurs, this field indicates whether it was a Secure or Non- secure access attempt You must clear the associated interrupt status before this field can return the direction of accesses of subsequent permission checks or region overlap failures 0 Secure access 1 Non-secure access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * |[24] |Direction |If a region permission check fails or a region overlap occurs, this field indicates whether the failed access was a read or write access attempt You must clear the associated interrupt status before this field can return the direction of accesses of subsequent permission checks or region overlap failures 0 Read access 1 Write access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * @var FAIL_T::ID + * Offset: 0x2C Contains the master ACE-Lite ARID or AWID of the first access that failed a region permission check in the associated filter unit. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |id |If a region permission check fails or a region overlap occurs, this field returns the ACE-Lite ID values of the first failed access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * |[27:24] |vnet |If a region permission check fails or a region overlap occurs, this field returns the VN number of the first failed access, from either ARVNET or AWVNET as appropriate If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + */ + __I uint32_t ADDRESS_LOW; /*!< [0x0000] Contains the lower 32 bits of the address of the first access that failed a region permission check in the associated filter unit. */ + __IO uint32_t ADDRESS_HIGH; /*!< [0x0004] Reserved */ + __I uint32_t CONTROL; /*!< [0x0008] Contains the control status information of the first access that failed a region permission check in the associated filter unit. */ + __I uint32_t ID; /*!< [0x000c] Contains the master ACE-Lite ARID or AWID of the first access that failed a region permission check in the associated filter unit. */ +} FAIL_STS_T; + +typedef struct +{ + __IO uint32_t BASE_LOW; /*!< [0x0000] */ + __IO uint32_t BASE_HIGH; /*!< [0x0004] */ + __IO uint32_t TOP_LOW; /*!< [0x0008] */ + __IO uint32_t TOP_HIGH; /*!< [0x000c] */ + __IO uint32_t ATTRIBUTES; /*!< [0x0010] */ + __IO uint32_t ID_ACCESS; /*!< [0x0014] */ + __I uint32_t RESERVE2[2]; /*!< [0x0018] */ +} REGION_T; + +/*---------------------- System Security Memory Configuration Controller -------------------------*/ +/** + @addtogroup SSMCC System Security Memory Configuration Controller(SSMCC) + Memory Mapped Structure for SSMCC Controller +@{ */ + +typedef struct +{ + + + /** + * @var SSMCC_T::SCWP + * Offset: 0x00 Security Configuration Write Protect Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ENABLE |Write Protection Enable Bit + * | | |0 = Security Configuration Write Protection Disabled. + * | | |1 = Security Configuration Write Protection Enabled. + * |[1] |LOCK |Write Protection Enable and Lock Bit (Write 1 to Set) + * | | |0 = Security Configuration Write Protection Disabled. + * | | |1 = Security Configuration Write Protection Enabled. + * | | |Note: This bit can only be cleared by system reset. + * |[31:16] |WVCODE |Write Verify Code + * | | |Read operation: + * | | |Reserved, all zeros. + * | | |Write operation: + * | | |0x475A = The write verify code, 0x475A, is needed to do a valid write to SSMCC_SCWP. + * | | |Others = Invalid write verify code. + */ + __IO uint32_t SCWP; /*!< [0x0000] Security Configuration Write Protect Register */ + +} SSMCC_T; + +/** + @addtogroup SSMCC_CONST SSMCC Bit Field Definition + Constant Definitions for SSMCC Controller +@{ */ + +#define SSMCC_SCWP_ENABLE_Pos (0) /*!< SSMCC_T::SCWP: ENABLE Position */ +#define SSMCC_SCWP_ENABLE_Msk (0x1ul << SSMCC_SCWP_ENABLE_Pos) /*!< SSMCC_T::SCWP: ENABLE Mask */ + +#define SSMCC_SCWP_LOCK_Pos (1) /*!< SSMCC_T::SCWP: LOCK Position */ +#define SSMCC_SCWP_LOCK_Msk (0x1ul << SSMCC_SCWP_LOCK_Pos) /*!< SSMCC_T::SCWP: LOCK Mask */ + +#define SSMCC_SCWP_WVCODE_Pos (16) /*!< SSMCC_T::SCWP: WVCODE Position */ +#define SSMCC_SCWP_WVCODE_Msk (0xfffful << SSMCC_SCWP_WVCODE_Pos) /*!< SSMCC_T::SCWP: WVCODE Mask */ + +/**@}*/ /* SSMCC_CONST */ +/**@}*/ /* end of SSMCC register group */ + + +/*---------------------- TrustZone Address Space Controller -------------------------*/ +/** + @addtogroup TZC TrustZone Address Space Controller(TZC) + Memory Mapped Structure for TZC Controller +@{ */ + +typedef struct +{ + /** + * @var TZC_T::BUILD_CONFIG + * Offset: 0x00 Provides information about the configuration of the TZC-400. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |no_of_regions|Defines the number of regions that the TZC-400 provides: 0b01000 Nine regions All other values Reserved. + * |[13:8] |address_width|Defines the width of the ACE-Lite address bus: 0b011111 32 bits 0b100011 36 bits 0b100111 40 bits 0b101111 48 bits 0b111111 64 bits All other values Reserved. + * |[25:24] |no_of_filters|Defines the number of filter units in the design implementation: 0b00 One filter unit 0b01 Two filter units 0b10 Reserved 0b11 Four filter units. + * @var TZC_T::ACTION + * Offset: 0x04 Controls the interrupt and bus response signaling behavior of the TZC-400 when region permission failures occur. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |reaction_value|Controls how the TZC-400 uses the BRESPS[1:0], RRESPS[1:0], and TZCINT signals when a region permission failure occurs, excluding region overlap errors The settings for these bits are: 0b00 Sets TZCINT LOW and issues an OKAY response 0b01 Sets TZCINT LOW and issues a DECERR response 0b10 Sets TZCINT HIGH and issues an OKAY response 0b11 Sets TZCINT HIGH and issues a DECERR response When a region overlap for region 1 and higher occurs, this field also determines how TZCINT is set The settings are: 0b00, 0b01 TZCINT LOW 0b10, 0b11 TZCINT HIGH. + * @var TZC_T::GATE_KEEPER + * Offset: 0x08 Provides control and status for the gate keeper in each filter unit implemented + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |open_request|Each bit in this field requests the gate of the associated filter unit to be open or closed Each bit is associated as follows: bit 0 Filter 0 bit 1 Filter 1 bit 2 Filter 2 bit 3 Filter 3. Set the open_request bit to 1, to request the gate to be open Set the open_request bit to 0, to request the gate to be closed If any of the associated filter units are not implemented, the corresponding open_request bits are unused, + * |[19:16] |open_status|The current state of the gate keeper in each filter unit The bit associations are as follows: bit 16 Filter 0 gate keeper status bit 17 Filter 1 gate keeper status bit 18 Filter 2 gate keeper status bit 19 Filter 3 gate keeper status When a bit is set to 1, the gate keeper permits access to its associated filter, that is, it is open When a bit is set to 0, the gate keeper no longer permits access to its associated filter, that is, it is closed This bit is set to 0 when both of the following conditions are fulfilled:This means that the gate keeper always waits for outstanding accesses to complete • The gate keeper no longer permits access to its associated filter • All outstanding accesses through the filter unit are complete If any of the associated filter units are not implemented, the corresponding gate keeper bits are unused, + * @var TZC_T::SPECULATION_CTRL + * Offset: 0x0C Controls the read access speculation and write access speculation. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |read_spec_disable|Controls read access speculation Note This bit is ignored and assumed to be zero at a filter unit if the corresponding QVNENABLE signal is HIGH You can set this bit as follows: 0 Enables read access speculation This is the default setting 1 Disables read access speculation. + * |[1] |write_spec_disable|Controls write acc. Note This bit is ignored and assumed to be zero at a filter unit if the corresponding QVNENABLE signal is HIGH. Set this bit as follows: 0 Enables write access speculation. This is the default setting. 1 Disables write access speculation. + * @var TZC_T::INT_STATUS + * Offset: 0x10 Contains the status of the interrupt signal, TZCINT, that reports access security violations or region overlap errors. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |status |Each bit is associated as follows: bit 0 Filter 0 bit 1 Filter 1 bit 2 Filter 2 bit 3 Filter 3. Each bit in this field indicates the status of the interrupt from each filter unit as follows: 0 Interrupt is not asserted 1 Interrupt is asserted and waiting to be cleared This bit is set even if the ACTION register is set to not drive the interrupt output TZCINT HIGH Therefore, the status acts as an indicator that a region permission check failure or an overlap error has occurred at a particular filter unit. + * |[11:8] |overrun |The bit associations are as follows: bit 8 Filter 0 bit 9 Filter 1 bit 10 Filter 2 bit 11 Filter 3. When a bit is set to 1, it indicates the occurrence of two or more region permission or region overlapping failures at the associated filter unit after the interrupt was cleared by the associated bit This bit is set even if the ACTION register is set to not drive the interrupt Clear the interrupt status of the associated bit in the INT_CLEAR register to also clear this field. + * |[19:16] |overlap |The bit associations are as follows: bit 16 Filter 0 bit 17 Filter 1 bit 18 Filter 2 bit 19 Filter 3 When a bit is set to 1, it indicates a violation of the overlap region configuration rules for the associated filter unit This occurs when an access matches with two enabled regions at the same time unless the overlap is only with Region 0. This bit is set even if the ACTION register is set to not drive the interrupt When this bit is 1, the interrupt status bit is also set to 1. Clear the interrupt status of the associated bit to also clear this field + * @var TZC_T::INT_CLEAR + * Offset: 0x14 Clears the interrupt. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |clear |Contains the control bits to clear interrupts The bit associations are as follows: bit 0 Filter 0 bit 1 Filter 1 bit 2 Filter 2 bit 3 Filter 3. Write a 1 to any of these bits to clear the associated status, overrun, and overlap bits in the INT_STATUS register. + * @var TZC_T::FAIL_ADDRESS_LOW_0 + * Offset: 0x20 Contains the lower 32 bits of the address of the first access that failed a region permission check in the associated filter unit. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |addr_status_low|If a region permission check fails or a region overlap occurs, this field returns the ACE-Lite address bits [31:0] of the first f. You must clear the associated interrupt status before this field can return the address of accesses of subsequent permission checks or region overlap failures. This occurs even if the ACTION register does not enable the interrupt. If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * @var TZC_T::FAIL_ADDRESS_HIGH_0 + * Offset: 0x24 Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::FAIL_CONTROL_0 + * Offset: 0x28 Contains the control status information of the first access that failed a region permission check in the associated filter unit. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[20] |Privileged|If a region permission check fails or a region overlap occurs, this field indicates whether it was an unprivileged or privileged access attempt You must clear the associated interrupt status before this field can return the values of accesses of subsequent permission checks or region overlap failures 0 Unprivileged access 1 Privileged access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * |[21] |Non_secure|If a region permission check fails or a region overlap occurs, this field indicates whether it was a Secure or Non- secure access attempt You must clear the associated interrupt status before this field can return the direction of accesses of subsequent permission checks or region overlap failures 0 Secure access 1 Non-secure access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * |[24] |Direction |If a region permission check fails or a region overlap occurs, this field indicates whether the failed access was a read or write access attempt You must clear the associated interrupt status before this field can return the direction of accesses of subsequent permission checks or region overlap failures 0 Read access 1 Write access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * @var TZC_T::FAIL_ID_0 + * Offset: 0x2C Contains the master ACE-Lite ARID or AWID of the first access that failed a region permission check in the associated filter unit. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |id |If a region permission check fails or a region overlap occurs, this field returns the ACE-Lite ID values of the first failed access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * |[27:24] |vnet |If a region permission check fails or a region overlap occurs, this field returns the VN number of the first failed access, from either ARVNET or AWVNET as appropriate If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * @var TZC_T::FAIL_ADDRESS_LOW_1 + * Offset: 0x30 Contains the lower 32 bits of the address of the first access that failed a region permission check in the associated filter unit. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |addr_status_low|If a region permission check fails or a region overlap occurs, this field returns the ACE-Lite address bits [31:0] of the first f. You must clear the associated interrupt status before this field can return the address of accesses of subsequent permission checks or region overlap failures. This occurs even if the ACTION register does not enable the interrupt. If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * @var TZC_T::FAIL_ADDRESS_HIGH_1 + * Offset: 0x34 Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::FAIL_CONTROL_1 + * Offset: 0x38 Contains the control status information of the first access that failed a region permission check in the associated filter unit. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[20] |Privileged|If a region permission check fails or a region overlap occurs, this field indicates whether it was an unprivileged or privileged access attempt You must clear the associated interrupt status before this field can return the values of accesses of subsequent permission checks or region overlap failures 0 Unprivileged access 1 Privileged access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * |[21] |Non_secure|If a region permission check fails or a region overlap occurs, this field indicates whether it was a Secure or Non- secure access attempt You must clear the associated interrupt status before this field can return the direction of accesses of subsequent permission checks or region overlap failures 0 Secure access 1 Non-secure access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * |[24] |Direction |If a region permission check fails or a region overlap occurs, this field indicates whether the failed access was a read or write access attempt You must clear the associated interrupt status before this field can return the direction of accesses of subsequent permission checks or region overlap failures 0 Read access 1 Write access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * @var TZC_T::FAIL_ID_1 + * Offset: 0x3C Contains the master ACE-Lite ARID or AWID of the first access that failed a region permission check in the associated filter unit. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |id |If a region permission check fails or a region overlap occurs, this field returns the ACE-Lite ID values of the first failed access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * |[27:24] |vnet |If a region permission check fails or a region overlap occurs, this field returns the VN number of the first failed access, from either ARVNET or AWVNET as appropriate If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * @var TZC_T::FAIL_ADDRESS_LOW_2 + * Offset: 0x40 Contains the lower 32 bits of the address of the first access that failed a region permission check in the associated filter unit. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |addr_status_low|If a region permission check fails or a region overlap occurs, this field returns the ACE-Lite address bits [31:0] of the first f. You must clear the associated interrupt status before this field can return the address of accesses of subsequent permission checks or region overlap failures. This occurs even if the ACTION register does not enable the interrupt. If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * @var TZC_T::FAIL_ADDRESS_HIGH_2 + * Offset: 0x44 Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::FAIL_CONTROL_2 + * Offset: 0x48 Contains the control status information of the first access that failed a region permission check in the associated filter unit. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[20] |Privileged|If a region permission check fails or a region overlap occurs, this field indicates whether it was an unprivileged or privileged access attempt You must clear the associated interrupt status before this field can return the values of accesses of subsequent permission checks or region overlap failures 0 Unprivileged access 1 Privileged access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * |[21] |Non_secure|If a region permission check fails or a region overlap occurs, this field indicates whether it was a Secure or Non- secure access attempt You must clear the associated interrupt status before this field can return the direction of accesses of subsequent permission checks or region overlap failures 0 Secure access 1 Non-secure access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * |[24] |Direction |If a region permission check fails or a region overlap occurs, this field indicates whether the failed access was a read or write access attempt You must clear the associated interrupt status before this field can return the direction of accesses of subsequent permission checks or region overlap failures 0 Read access 1 Write access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * @var TZC_T::FAIL_ID_2 + * Offset: 0x4C Contains the master ACE-Lite ARID or AWID of the first access that failed a region permission check in the associated filter unit. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |id |If a region permission check fails or a region overlap occurs, this field returns the ACE-Lite ID values of the first failed access If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * |[27:24] |vnet |If a region permission check fails or a region overlap occurs, this field returns the VN number of the first failed access, from either ARVNET or AWVNET as appropriate If the status flag for the filter unit in the INT_STATUS register is already set, new region permission check failures in the same filter unit do not update the associated fail status group of registers. + * @var TZC_T::REGION_BASE_LOW_0 + * Offset: 0x100 This register is read-only and is hard-wired to all zeros. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |base_address_low_n_|Controls the base address bits[31:12] of Region + * | | |For Region 0, this field is read-only. The TZC-400 sets the base address of Region 0 to 0x0. + * @var TZC_T::REGION_BASE_HIGH_0 + * Offset: 0x104 This register is read-only and is hard-wired to all zeros. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_TOP_LOW_0 + * Offset: 0x108 This register is read-only and is hard-wired to all 1. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |top_address_low_n_|Controls the region top address bits[31:12] of region + * | | |For Region 0, this field is read-only and all bits are set HIGH. + * | | |. + * @var TZC_T::REGION_TOP_HIGH_0 + * Offset: 0x10C This register is read-only and is hard-wired to all zeros. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_ATTRIBUTES_0 + * Offset: 0x110 Controls the permissions for Region 0. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |filter_en |Independent region enable for each filter unit Each bit is associated with a filter unit Set these bits as follows: Bit 0 For Filter 0 Bit 1 For Filter 1 Bit 2 For Filter 2 Bit 3 For Filter 3. When set HIGH, it enables the use of the current region programming for the associated filter For Region 0, all bits are set HIGH and cannot be modified. + * |[30] |s_rd_en |Secure global read enable This control bit defines the permissions for the Secure reads in the region Set this bit as follows: 0 Secure read to the region is not permitted 1 Permits Secure read to the region. + * |[31] |s_wr_en |Secure global write enable This control bit defines the permissions for the Secure writes in the region Set this bit as follows: 0 Secure write to the region is not permitted 1 Permits Secure write to the region. + * @var TZC_T::REGION_ID_ACCESS_0 + * Offset: 0x114 Controls the Non-secure access based on the NSAID inputs for Region 0. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |nsaid_rd_en|NSAID read enables + * | | |This enables NSAID inputs to define Non-secure read access permission Each bit of the nsaid_rd_en register field is associated with a value on the NSAIDR signal as follows: Bit 0 Associated with NSAIDR = 0 + * | | |Bit 1 Associated with NSAIDR = 1 + * | | |Bit 2 Associated with NSAIDR = 2 + * | | |Bit 15 Associated with NSAIDR = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set HIGH, TZC-400 permits Non-secure read access to any access with the associated NSAIDR value + * | | |For example, if NSAIDR is 3 and the corresponding nsaid_rd_en[3] bit is set HIGH then TZC-400 permits the Non-secure read access to progress. + * |[31:16] |nsaid_wr_en|NSAID write enables + * | | |This enables NSAID inputs to define Non-secure write access permission Each bit of the nsaid_wr_en register field is associated with a value on the NSAIDW signal as follows: Bit 16 Associated with NSAIDW = 0 + * | | |Bit 17 Associated with NSAIDW = 1 + * | | |Bit 18 Associated with NSAIDW = 2 + * | | |Bit 31 Associated with NSAIDW = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set to 1, TZC-400 permits Non-secure write access to any access with the associated NSAIDW value + * | | |For example, if NSAIDW is 3 and the corresponding nsaid_wr_en[3] bit is set HIGH then TZC-400 permits the Non-secure write access to progress. + * @var TZC_T::REGION_BASE_LOW_1 + * Offset: 0x120 Controls the base address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |base_address_low_n_|Controls the base address bits[31:12] of Region For Region 0, this field is read-only The TZC-400 sets the base address of Region 0 to 0x0 The TZC-400 only permits a region to start at a 4KB aligned address and address bits[11:0] are zeros. + * @var TZC_T::REGION_BASE_HIGH_1 + * Offset: 0x124 Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_TOP_LOW_1 + * Offset: 0x128 Controls the region top address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |top_address_low_n_|Controls the region top address bits[31:12] of region This address points to the start of the next 4KB aligned address immediately outside the region. + * @var TZC_T::REGION_TOP_HIGH_1 + * Offset: 0x12C Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_ATTRIBUTES_1 + * Offset: 0x130 Controls the permissions and target filter region enables. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |filter_en |Independent region enable for each filter unit Each bit is associated with a filter unit Set these bits as follows: Bit 0 For Filter 0 Bit 1 For Filter 1 Bit 2 For Filter 2 Bit 3 For Filter 3. When set HIGH, it enables the use of the current region programming for the associated filter For Region 0, all bits are set HIGH and cannot be modified. + * |[30] |s_rd_en |Secure global read enable This control bit defines the permissions for the Secure reads in the region Set this bit as follows: 0 Secure read to the region is not permitted 1 Permits Secure read to the region. + * |[31] |s_wr_en |Secure global write enable This control bit defines the permissions for the Secure writes in the region Set this bit as follows: 0 Secure write to the region is not permitted 1 Permits Secure write to the region. + * @var TZC_T::REGION_ID_ACCESS_1 + * Offset: 0x134 Controls the Non-secure access based on the NSAID inputs. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |nsaid_rd_en|NSAID read enables + * | | |This enables NSAID inputs to define Non-secure read access permission Each bit of the nsaid_rd_en register field is associated with a value on the NSAIDR signal as follows: Bit 0 Associated with NSAIDR = 0 + * | | |Bit 1 Associated with NSAIDR = 1 + * | | |Bit 2 Associated with NSAIDR = 2 + * | | |Bit 15 Associated with NSAIDR = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set HIGH, TZC-400 permits Non-secure read access to any access with the associated NSAIDR value + * | | |For example, if NSAIDR is 3 and the corresponding nsaid_rd_en[3] bit is set HIGH then TZC-400 permits the Non-secure read access to progress. + * |[31:16] |nsaid_wr_en|NSAID write enables + * | | |This enables NSAID inputs to define Non-secure write access permission Each bit of the nsaid_wr_en register field is associated with a value on the NSAIDW signal as follows: Bit 16 Associated with NSAIDW = 0 + * | | |Bit 17 Associated with NSAIDW = 1 + * | | |Bit 18 Associated with NSAIDW = 2 + * | | |Bit 31 Associated with NSAIDW = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set to 1, TZC-400 permits Non-secure write access to any access with the associated NSAIDW value + * | | |For example, if NSAIDW is 3 and the corresponding nsaid_wr_en[3] bit is set HIGH then TZC-400 permits the Non-secure write access to progress. + * @var TZC_T::REGION_BASE_LOW_2 + * Offset: 0x140 Controls the base address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |base_address_low_n_|Controls the base address bits[31:12] of Region For Region 0, this field is read-only The TZC-400 sets the base address of Region 0 to 0x0 The TZC-400 only permits a region to start at a 4KB aligned address and address bits[11:0] are zeros. + * @var TZC_T::REGION_BASE_HIGH_2 + * Offset: 0x144 Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_TOP_LOW_2 + * Offset: 0x148 Controls the region top address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |top_address_low_n_|Controls the region top address bits[31:12] of region This address points to the start of the next 4KB aligned address immediately outside the region. + * @var TZC_T::REGION_TOP_HIGH_2 + * Offset: 0x14C Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_ATTRIBUTES_2 + * Offset: 0x150 Controls the permissions and target filter region enables. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |filter_en |Independent region enable for each filter unit Each bit is associated with a filter unit Set these bits as follows: Bit 0 For Filter 0 Bit 1 For Filter 1 Bit 2 For Filter 2 Bit 3 For Filter 3. When set HIGH, it enables the use of the current region programming for the associated filter For Region 0, all bits are set HIGH and cannot be modified. + * |[30] |s_rd_en |Secure global read enable This control bit defines the permissions for the Secure reads in the region Set this bit as follows: 0 Secure read to the region is not permitted 1 Permits Secure read to the region. + * |[31] |s_wr_en |Secure global write enable This control bit defines the permissions for the Secure writes in the region Set this bit as follows: 0 Secure write to the region is not permitted 1 Permits Secure write to the region. + * @var TZC_T::REGION_ID_ACCESS_2 + * Offset: 0x154 Controls the Non-secure access based on the NSAID inputs. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |nsaid_rd_en|NSAID read enables + * | | |This enables NSAID inputs to define Non-secure read access permission Each bit of the nsaid_rd_en register field is associated with a value on the NSAIDR signal as follows: Bit 0 Associated with NSAIDR = 0 + * | | |Bit 1 Associated with NSAIDR = 1 + * | | |Bit 2 Associated with NSAIDR = 2 + * | | |Bit 15 Associated with NSAIDR = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set HIGH, TZC-400 permits Non-secure read access to any access with the associated NSAIDR value + * | | |For example, if NSAIDR is 3 and the corresponding nsaid_rd_en[3] bit is set HIGH then TZC-400 permits the Non-secure read access to progress. + * |[31:16] |nsaid_wr_en|NSAID write enables + * | | |This enables NSAID inputs to define Non-secure write access permission Each bit of the nsaid_wr_en register field is associated with a value on the NSAIDW signal as follows: Bit 16 Associated with NSAIDW = 0 + * | | |Bit 17 Associated with NSAIDW = 1 + * | | |Bit 18 Associated with NSAIDW = 2 + * | | |Bit 31 Associated with NSAIDW = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set to 1, TZC-400 permits Non-secure write access to any access with the associated NSAIDW value + * | | |For example, if NSAIDW is 3 and the corresponding nsaid_wr_en[3] bit is set HIGH then TZC-400 permits the Non-secure write access to progress. + * @var TZC_T::REGION_BASE_LOW_3 + * Offset: 0x160 Controls the base address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |base_address_low_n_|Controls the base address bits[31:12] of Region For Region 0, this field is read-only The TZC-400 sets the base address of Region 0 to 0x0 The TZC-400 only permits a region to start at a 4KB aligned address and address bits[11:0] are zeros. + * @var TZC_T::REGION_BASE_HIGH_3 + * Offset: 0x164 Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_TOP_LOW_3 + * Offset: 0x168 Controls the region top address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |top_address_low_n_|Controls the region top address bits[31:12] of region This address points to the start of the next 4KB aligned address immediately outside the region. + * @var TZC_T::REGION_TOP_HIGH_3 + * Offset: 0x16C Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_ATTRIBUTES_3 + * Offset: 0x170 Controls the permissions and target filter region enables. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |filter_en |Independent region enable for each filter unit Each bit is associated with a filter unit Set these bits as follows: Bit 0 For Filter 0 Bit 1 For Filter 1 Bit 2 For Filter 2 Bit 3 For Filter 3. When set HIGH, it enables the use of the current region programming for the associated filter For Region 0, all bits are set HIGH and cannot be modified. + * |[30] |s_rd_en |Secure global read enable This control bit defines the permissions for the Secure reads in the region Set this bit as follows: 0 Secure read to the region is not permitted 1 Permits Secure read to the region. + * |[31] |s_wr_en |Secure global write enable This control bit defines the permissions for the Secure writes in the region Set this bit as follows: 0 Secure write to the region is not permitted 1 Permits Secure write to the region. + * @var TZC_T::REGION_ID_ACCESS_3 + * Offset: 0x174 Controls the Non-secure access based on the NSAID inputs. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |nsaid_rd_en|NSAID read enables + * | | |This enables NSAID inputs to define Non-secure read access permission Each bit of the nsaid_rd_en register field is associated with a value on the NSAIDR signal as follows: Bit 0 Associated with NSAIDR = 0 + * | | |Bit 1 Associated with NSAIDR = 1 + * | | |Bit 2 Associated with NSAIDR = 2 + * | | |Bit 15 Associated with NSAIDR = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set HIGH, TZC-400 permits Non-secure read access to any access with the associated NSAIDR value + * | | |For example, if NSAIDR is 3 and the corresponding nsaid_rd_en[3] bit is set HIGH then TZC-400 permits the Non-secure read access to progress. + * |[31:16] |nsaid_wr_en|NSAID write enables + * | | |This enables NSAID inputs to define Non-secure write access permission Each bit of the nsaid_wr_en register field is associated with a value on the NSAIDW signal as follows: Bit 16 Associated with NSAIDW = 0 + * | | |Bit 17 Associated with NSAIDW = 1 + * | | |Bit 18 Associated with NSAIDW = 2 + * | | |Bit 31 Associated with NSAIDW = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set to 1, TZC-400 permits Non-secure write access to any access with the associated NSAIDW value + * | | |For example, if NSAIDW is 3 and the corresponding nsaid_wr_en[3] bit is set HIGH then TZC-400 permits the Non-secure write access to progress. + * @var TZC_T::REGION_BASE_LOW_4 + * Offset: 0x180 Controls the base address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |base_address_low_n_|Controls the base address bits[31:12] of Region For Region 0, this field is read-only The TZC-400 sets the base address of Region 0 to 0x0 The TZC-400 only permits a region to start at a 4KB aligned address and address bits[11:0] are zeros. + * @var TZC_T::REGION_BASE_HIGH_4 + * Offset: 0x184 Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_TOP_LOW_4 + * Offset: 0x188 Controls the region top address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |top_address_low_n_|Controls the region top address bits[31:12] of region This address points to the start of the next 4KB aligned address immediately outside the region. + * @var TZC_T::REGION_TOP_HIGH_4 + * Offset: 0x18C Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_ATTRIBUTES_4 + * Offset: 0x190 Controls the permissions and target filter region enables. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |filter_en |Independent region enable for each filter unit Each bit is associated with a filter unit Set these bits as follows: Bit 0 For Filter 0 Bit 1 For Filter 1 Bit 2 For Filter 2 Bit 3 For Filter 3. When set HIGH, it enables the use of the current region programming for the associated filter For Region 0, all bits are set HIGH and cannot be modified. + * |[30] |s_rd_en |Secure global read enable This control bit defines the permissions for the Secure reads in the region Set this bit as follows: 0 Secure read to the region is not permitted 1 Permits Secure read to the region. + * |[31] |s_wr_en |Secure global write enable This control bit defines the permissions for the Secure writes in the region Set this bit as follows: 0 Secure write to the region is not permitted 1 Permits Secure write to the region. + * @var TZC_T::REGION_ID_ACCESS_4 + * Offset: 0x194 Controls the Non-secure access based on the NSAID inputs. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |nsaid_rd_en|NSAID read enables + * | | |This enables NSAID inputs to define Non-secure read access permission Each bit of the nsaid_rd_en register field is associated with a value on the NSAIDR signal as follows: Bit 0 Associated with NSAIDR = 0 + * | | |Bit 1 Associated with NSAIDR = 1 + * | | |Bit 2 Associated with NSAIDR = 2 + * | | |Bit 15 Associated with NSAIDR = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set HIGH, TZC-400 permits Non-secure read access to any access with the associated NSAIDR value + * | | |For example, if NSAIDR is 3 and the corresponding nsaid_rd_en[3] bit is set HIGH then TZC-400 permits the Non-secure read access to progress. + * |[31:16] |nsaid_wr_en|NSAID write enables + * | | |This enables NSAID inputs to define Non-secure write access permission Each bit of the nsaid_wr_en register field is associated with a value on the NSAIDW signal as follows: Bit 16 Associated with NSAIDW = 0 + * | | |Bit 17 Associated with NSAIDW = 1 + * | | |Bit 18 Associated with NSAIDW = 2 + * | | |Bit 31 Associated with NSAIDW = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set to 1, TZC-400 permits Non-secure write access to any access with the associated NSAIDW value + * | | |For example, if NSAIDW is 3 and the corresponding nsaid_wr_en[3] bit is set HIGH then TZC-400 permits the Non-secure write access to progress. + * @var TZC_T::REGION_BASE_LOW_5 + * Offset: 0x1A0 Controls the base address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |base_address_low_n_|Controls the base address bits[31:12] of Region For Region 0, this field is read-only The TZC-400 sets the base address of Region 0 to 0x0 The TZC-400 only permits a region to start at a 4KB aligned address and address bits[11:0] are zeros. + * @var TZC_T::REGION_BASE_HIGH_5 + * Offset: 0x1A4 Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_TOP_LOW_5 + * Offset: 0x1A8 Controls the region top address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |top_address_low_n_|Controls the region top address bits[31:12] of region This address points to the start of the next 4KB aligned address immediately outside the region. + * @var TZC_T::REGION_TOP_HIGH_5 + * Offset: 0x1AC Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_ATTRIBUTES_5 + * Offset: 0x1B0 Controls the permissions and target filter region enables. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |filter_en |Independent region enable for each filter unit Each bit is associated with a filter unit Set these bits as follows: Bit 0 For Filter 0 Bit 1 For Filter 1 Bit 2 For Filter 2 Bit 3 For Filter 3. When set HIGH, it enables the use of the current region programming for the associated filter For Region 0, all bits are set HIGH and cannot be modified. + * |[30] |s_rd_en |Secure global read enable This control bit defines the permissions for the Secure reads in the region Set this bit as follows: 0 Secure read to the region is not permitted 1 Permits Secure read to the region. + * |[31] |s_wr_en |Secure global write enable This control bit defines the permissions for the Secure writes in the region Set this bit as follows: 0 Secure write to the region is not permitted 1 Permits Secure write to the region. + * @var TZC_T::REGION_ID_ACCESS_5 + * Offset: 0x1B4 Controls the Non-secure access based on the NSAID inputs. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |nsaid_rd_en|NSAID read enables + * | | |This enables NSAID inputs to define Non-secure read access permission Each bit of the nsaid_rd_en register field is associated with a value on the NSAIDR signal as follows: Bit 0 Associated with NSAIDR = 0 + * | | |Bit 1 Associated with NSAIDR = 1 + * | | |Bit 2 Associated with NSAIDR = 2 + * | | |Bit 15 Associated with NSAIDR = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set HIGH, TZC-400 permits Non-secure read access to any access with the associated NSAIDR value + * | | |For example, if NSAIDR is 3 and the corresponding nsaid_rd_en[3] bit is set HIGH then TZC-400 permits the Non-secure read access to progress. + * |[31:16] |nsaid_wr_en|NSAID write enables + * | | |This enables NSAID inputs to define Non-secure write access permission Each bit of the nsaid_wr_en register field is associated with a value on the NSAIDW signal as follows: Bit 16 Associated with NSAIDW = 0 + * | | |Bit 17 Associated with NSAIDW = 1 + * | | |Bit 18 Associated with NSAIDW = 2 + * | | |Bit 31 Associated with NSAIDW = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set to 1, TZC-400 permits Non-secure write access to any access with the associated NSAIDW value + * | | |For example, if NSAIDW is 3 and the corresponding nsaid_wr_en[3] bit is set HIGH then TZC-400 permits the Non-secure write access to progress. + * @var TZC_T::REGION_BASE_LOW_6 + * Offset: 0x1C0 Controls the base address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |base_address_low_n_|Controls the base address bits[31:12] of Region For Region 0, this field is read-only The TZC-400 sets the base address of Region 0 to 0x0 The TZC-400 only permits a region to start at a 4KB aligned address and address bits[11:0] are zeros. + * @var TZC_T::REGION_BASE_HIGH_6 + * Offset: 0x1C4 Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_TOP_LOW_6 + * Offset: 0x1C8 Controls the region top address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |top_address_low_n_|Controls the region top address bits[31:12] of region This address points to the start of the next 4KB aligned address immediately outside the region. + * @var TZC_T::REGION_TOP_HIGH_6 + * Offset: 0x1CC Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_ATTRIBUTES_6 + * Offset: 0x1D0 Controls the permissions and target filter region enables. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |filter_en |Independent region enable for each filter unit Each bit is associated with a filter unit Set these bits as follows: Bit 0 For Filter 0 Bit 1 For Filter 1 Bit 2 For Filter 2 Bit 3 For Filter 3. When set HIGH, it enables the use of the current region programming for the associated filter For Region 0, all bits are set HIGH and cannot be modified. + * |[30] |s_rd_en |Secure global read enable This control bit defines the permissions for the Secure reads in the region Set this bit as follows: 0 Secure read to the region is not permitted 1 Permits Secure read to the region. + * |[31] |s_wr_en |Secure global write enable This control bit defines the permissions for the Secure writes in the region Set this bit as follows: 0 Secure write to the region is not permitted 1 Permits Secure write to the region. + * @var TZC_T::REGION_ID_ACCESS_6 + * Offset: 0x1D4 Controls the Non-secure access based on the NSAID inputs. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |nsaid_rd_en|NSAID read enables + * | | |This enables NSAID inputs to define Non-secure read access permission Each bit of the nsaid_rd_en register field is associated with a value on the NSAIDR signal as follows: Bit 0 Associated with NSAIDR = 0 + * | | |Bit 1 Associated with NSAIDR = 1 + * | | |Bit 2 Associated with NSAIDR = 2 + * | | |Bit 15 Associated with NSAIDR = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set HIGH, TZC-400 permits Non-secure read access to any access with the associated NSAIDR value + * | | |For example, if NSAIDR is 3 and the corresponding nsaid_rd_en[3] bit is set HIGH then TZC-400 permits the Non-secure read access to progress. + * |[31:16] |nsaid_wr_en|NSAID write enables + * | | |This enables NSAID inputs to define Non-secure write access permission Each bit of the nsaid_wr_en register field is associated with a value on the NSAIDW signal as follows: Bit 16 Associated with NSAIDW = 0 + * | | |Bit 17 Associated with NSAIDW = 1 + * | | |Bit 18 Associated with NSAIDW = 2 + * | | |Bit 31 Associated with NSAIDW = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set to 1, TZC-400 permits Non-secure write access to any access with the associated NSAIDW value + * | | |For example, if NSAIDW is 3 and the corresponding nsaid_wr_en[3] bit is set HIGH then TZC-400 permits the Non-secure write access to progress. + * @var TZC_T::REGION_BASE_LOW_7 + * Offset: 0x1E0 Controls the base address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |base_address_low_n_|Controls the base address bits[31:12] of Region For Region 0, this field is read-only The TZC-400 sets the base address of Region 0 to 0x0 The TZC-400 only permits a region to start at a 4KB aligned address and address bits[11:0] are zeros. + * @var TZC_T::REGION_BASE_HIGH_7 + * Offset: 0x1E4 Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_TOP_LOW_7 + * Offset: 0x1E8 Controls the region top address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |top_address_low_n_|Controls the region top address bits[31:12] of region This address points to the start of the next 4KB aligned address immediately outside the region. + * @var TZC_T::REGION_TOP_HIGH_7 + * Offset: 0x1EC Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_ATTRIBUTES_7 + * Offset: 0x1F0 Controls the permissions and target filter region enables. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |filter_en |Independent region enable for each filter unit Each bit is associated with a filter unit Set these bits as follows: Bit 0 For Filter 0 Bit 1 For Filter 1 Bit 2 For Filter 2 Bit 3 For Filter 3. When set HIGH, it enables the use of the current region programming for the associated filter For Region 0, all bits are set HIGH and cannot be modified. + * |[30] |s_rd_en |Secure global read enable This control bit defines the permissions for the Secure reads in the region Set this bit as follows: 0 Secure read to the region is not permitted 1 Permits Secure read to the region. + * |[31] |s_wr_en |Secure global write enable This control bit defines the permissions for the Secure writes in the region Set this bit as follows: 0 Secure write to the region is not permitted 1 Permits Secure write to the region. + * @var TZC_T::REGION_ID_ACCESS_7 + * Offset: 0x1F4 Controls the Non-secure access based on the NSAID inputs. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |nsaid_rd_en|NSAID read enables + * | | |This enables NSAID inputs to define Non-secure read access permission Each bit of the nsaid_rd_en register field is associated with a value on the NSAIDR signal as follows: Bit 0 Associated with NSAIDR = 0 + * | | |Bit 1 Associated with NSAIDR = 1 + * | | |Bit 2 Associated with NSAIDR = 2 + * | | |Bit 15 Associated with NSAIDR = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set HIGH, TZC-400 permits Non-secure read access to any access with the associated NSAIDR value + * | | |For example, if NSAIDR is 3 and the corresponding nsaid_rd_en[3] bit is set HIGH then TZC-400 permits the Non-secure read access to progress. + * |[31:16] |nsaid_wr_en|NSAID write enables + * | | |This enables NSAID inputs to define Non-secure write access permission Each bit of the nsaid_wr_en register field is associated with a value on the NSAIDW signal as follows: Bit 16 Associated with NSAIDW = 0 + * | | |Bit 17 Associated with NSAIDW = 1 + * | | |Bit 18 Associated with NSAIDW = 2 + * | | |Bit 31 Associated with NSAIDW = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set to 1, TZC-400 permits Non-secure write access to any access with the associated NSAIDW value + * | | |For example, if NSAIDW is 3 and the corresponding nsaid_wr_en[3] bit is set HIGH then TZC-400 permits the Non-secure write access to progress. + * @var TZC_T::REGION_BASE_LOW_8 + * Offset: 0x200 Controls the base address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |base_address_low_n_|Controls the base address bits[31:12] of Region For Region 0, this field is read-only The TZC-400 sets the base address of Region 0 to 0x0 The TZC-400 only permits a region to start at a 4KB aligned address and address bits[11:0] are zeros. + * @var TZC_T::REGION_BASE_HIGH_8 + * Offset: 0x204 Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_TOP_LOW_8 + * Offset: 0x208 Controls the region top address bits[31:12] of Region . + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:12] |top_address_low_n_|Controls the region top address bits[31:12] of region This address points to the start of the next 4KB aligned address immediately outside the region. + * @var TZC_T::REGION_TOP_HIGH_8 + * Offset: 0x20C Reserved + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var TZC_T::REGION_ATTRIBUTES_8 + * Offset: 0x210 Controls the permissions and target filter region enables. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |filter_en |Independent region enable for each filter unit Each bit is associated with a filter unit Set these bits as follows: Bit 0 For Filter 0 Bit 1 For Filter 1 Bit 2 For Filter 2 Bit 3 For Filter 3. When set HIGH, it enables the use of the current region programming for the associated filter For Region 0, all bits are set HIGH and cannot be modified. + * |[30] |s_rd_en |Secure global read enable This control bit defines the permissions for the Secure reads in the region Set this bit as follows: 0 Secure read to the region is not permitted 1 Permits Secure read to the region. + * |[31] |s_wr_en |Secure global write enable This control bit defines the permissions for the Secure writes in the region Set this bit as follows: 0 Secure write to the region is not permitted 1 Permits Secure write to the region. + * @var TZC_T::REGION_ID_ACCESS_8 + * Offset: 0x214 Controls the Non-secure access based on the NSAID inputs. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |nsaid_rd_en|NSAID read enables + * | | |This enables NSAID inputs to define Non-secure read access permission Each bit of the nsaid_rd_en register field is associated with a value on the NSAIDR signal as follows: Bit 0 Associated with NSAIDR = 0 + * | | |Bit 1 Associated with NSAIDR = 1 + * | | |Bit 2 Associated with NSAIDR = 2 + * | | |Bit 15 Associated with NSAIDR = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set HIGH, TZC-400 permits Non-secure read access to any access with the associated NSAIDR value + * | | |For example, if NSAIDR is 3 and the corresponding nsaid_rd_en[3] bit is set HIGH then TZC-400 permits the Non-secure read access to progress. + * |[31:16] |nsaid_wr_en|NSAID write enables + * | | |This enables NSAID inputs to define Non-secure write access permission Each bit of the nsaid_wr_en register field is associated with a value on the NSAIDW signal as follows: Bit 16 Associated with NSAIDW = 0 + * | | |Bit 17 Associated with NSAIDW = 1 + * | | |Bit 18 Associated with NSAIDW = 2 + * | | |Bit 31 Associated with NSAIDW = 15 + * | | | is the filter unit number + * | | |When any bit in this field is set to 1, TZC-400 permits Non-secure write access to any access with the associated NSAIDW value + * | | |For example, if NSAIDW is 3 and the corresponding nsaid_wr_en[3] bit is set HIGH then TZC-400 permits the Non-secure write access to progress. + * @var TZC_T::PID4 + * Offset: 0xFD0 Provides the following information about the peripheral configuration u2022 4KB_count. u2022 Jep106_c_code. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |jep106_c_code|The JEP106 continuation code value represents how many 0x7F continuation characters occur in the manufacturer identity code These bits read back as 0x4 For information on the JEP106 standard, see the Additional reading section. + * |[7:4] |4KB_count |The number of 4KB address blocks required to access the registers, expressed in powers of 2 These bits read back as 0x0 This means that the TZC-400 occupies a single 4KB address block. + * @var TZC_T::PID0 + * Offset: 0xFE0 The PID0 register provides the following information about the peripheral configuration: u2022 part_number_0. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |part_number_0|These bits read back as 0x60 + * @var TZC_T::PID1 + * Offset: 0xFE4 The PID1 register provides the following information about the peripheral configuration: u2022 part_number_1. u2022 Jep106_id_3_0. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |part_number_1|These bits read back as 0x4. + * |[7:4] |jep106_id_3_0|JEP106 identity code [3:0] See the JEP106, Standard Manufacturer Identification Code These bits read back as 0xB because ARM is the peripheral designer. + * @var TZC_T::PID2 + * Offset: 0xFE8 The PID2 register provides the following information about the peripheral configuration: u2022 Jep106_id_6_4. u2022 Revision number. u2022 JEDEC use flag. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |jep106_id_6_4|JEP106 identity code [6:4] See the JEP106, Standard Manufacturer Identification Code These bits read back as 0b011 because ARM is the peripheral designer. + * |[3] |jedec_used|This indicates that the TZC-400 uses a manufacturer identity code that was allocated by JEDEC according to JEP106 This bit always reads back as 0x1. + * |[7:4] |revision |Identifies the revision of the TZC-400 For revision r0p1, this field is set to 0x2. + * @var TZC_T::PID3 + * Offset: 0xFEC The PID3 register provides the following information about the peripheral configuration: u2022 Mod Number. u2022 RevAnd. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |mod_number|This is set to 0x0. + * |[7:4] |RevAnd |The top-level RTL provides a 4-bit input, USERPID3REVAND, that is normally tied LOW and provides a read value of 0x0 When silicon is available, and if metal fixes are required, the manufacturer can modify the tie-offs to indicate a revision of the silicon. + * @var TZC_T::CID0 + * Offset: 0xFF0 This is one of four 8-bit registers that together hold a 32-bit component ID value. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |comp_id_0 |These bits read back as 0x0D + * @var TZC_T::CID1 + * Offset: 0xFF4 This is one of four 8-bit registers, that together hold a 32-bit component ID value. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |comp_id_0 |These bits read back as 0xF0 + * @var TZC_T::CID2 + * Offset: 0xFF8 This is one of four 8-bit registers, that together hold a 32-bit component ID value. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |comp_id_2 |These bits read back as 0x05 + * @var TZC_T::CID3 + * Offset: 0xFFC This is one of four 8-bit registers that together hold a 32-bit component ID value. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |comp_id_3 |These bits read back as 0xB1 + */ + __I uint32_t BUILD_CONFIG; /*!< [0x0000] Provides information about the configuration of the TZC-400. */ + __IO uint32_t ACTION; /*!< [0x0004] Controls the interrupt and bus response signaling behavior of the TZC-400 when region permission failures occur. */ + __IO uint32_t GATE_KEEPER; /*!< [0x0008] Provides control and status for the gate keeper in each filter unit implemented */ + __IO uint32_t SPECULATION_CTRL; /*!< [0x000c] Controls the read access speculation and write access speculation. */ + __I uint32_t INT_STATUS; /*!< [0x0010] Contains the status of the interrupt signal, TZCINT, that reports access security violations or region overlap errors. */ + __O uint32_t INT_CLEAR; /*!< [0x0014] Clears the interrupt. */ + __I uint32_t RESERVE0[2]; + FAIL_STS_T FAIL[3]; /*!< [0x0020] Failed regions */ + __I uint32_t RESERVE1[44]; + + /*!< [0x0100] This register is read-only and is hard-wired to all zeros. */ + REGION_T REGION[9]; /*!< [0x0100] All structure regions in TZC. */ + __I uint32_t RESERVE10[876]; + __I uint32_t PID4; /*!< [0x0fd0] Provides the following information about the peripheral configuration u2022 4KB_count. u2022 Jep106_c_code. */ + __I uint32_t RESERVE11[3]; + __I uint32_t PID0; /*!< [0x0fe0] The PID0 register provides the following information about the peripheral configuration: u2022 part_number_0. */ + __I uint32_t PID1; /*!< [0x0fe4] The PID1 register provides the following information about the peripheral configuration: u2022 part_number_1. u2022 Jep106_id_3_0. */ + __I uint32_t PID2; /*!< [0x0fe8] The PID2 register provides the following information about the peripheral configuration: u2022 Jep106_id_6_4. u2022 Revision number. u2022 JEDEC use flag. */ + __I uint32_t PID3; /*!< [0x0fec] The PID3 register provides the following information about the peripheral configuration: u2022 Mod Number. u2022 RevAnd. */ + __I uint32_t CID0; /*!< [0x0ff0] This is one of four 8-bit registers that together hold a 32-bit component ID value. */ + __I uint32_t CID1; /*!< [0x0ff4] This is one of four 8-bit registers, that together hold a 32-bit component ID value. */ + __I uint32_t CID2; /*!< [0x0ff8] This is one of four 8-bit registers, that together hold a 32-bit component ID value. */ + __I uint32_t CID3; /*!< [0x0ffc] This is one of four 8-bit registers that together hold a 32-bit component ID value. */ + +} TZC_T; + +/** + @addtogroup TZC_CONST TZC Bit Field Definition + Constant Definitions for TZC Controller +@{ */ + +#define TZC_BUILD_CONFIG_no_of_regions_Pos (0) /*!< TZC_T::BUILD_CONFIG: no_of_regions Position*/ +#define TZC_BUILD_CONFIG_no_of_regions_Msk (0x1ful << TZC_BUILD_CONFIG_no_of_regions_Pos) /*!< TZC_T::BUILD_CONFIG: no_of_regions Mask*/ + +#define TZC_BUILD_CONFIG_address_width_Pos (8) /*!< TZC_T::BUILD_CONFIG: address_width Position*/ +#define TZC_BUILD_CONFIG_address_width_Msk (0x3ful << TZC_BUILD_CONFIG_address_width_Pos) /*!< TZC_T::BUILD_CONFIG: address_width Mask*/ + +#define TZC_BUILD_CONFIG_no_of_filters_Pos (24) /*!< TZC_T::BUILD_CONFIG: no_of_filters Position*/ +#define TZC_BUILD_CONFIG_no_of_filters_Msk (0x3ul << TZC_BUILD_CONFIG_no_of_filters_Pos) /*!< TZC_T::BUILD_CONFIG: no_of_filters Mask*/ + +#define TZC_ACTION_reaction_value_Pos (0) /*!< TZC_T::ACTION: reaction_value Position*/ +#define TZC_ACTION_reaction_value_Msk (0x3ul << TZC_ACTION_reaction_value_Pos) /*!< TZC_T::ACTION: reaction_value Mask */ + +#define TZC_GATE_KEEPER_open_request_Pos (0) /*!< TZC_T::GATE_KEEPER: open_request Position*/ +#define TZC_GATE_KEEPER_open_request_Msk (0xful << TZC_GATE_KEEPER_open_request_Pos) /*!< TZC_T::GATE_KEEPER: open_request Mask */ + +#define TZC_GATE_KEEPER_open_status_Pos (16) /*!< TZC_T::GATE_KEEPER: open_status Position*/ +#define TZC_GATE_KEEPER_open_status_Msk (0xful << TZC_GATE_KEEPER_open_status_Pos) /*!< TZC_T::GATE_KEEPER: open_status Mask */ + +#define TZC_SPECULATION_CTRL_read_spec_disable_Pos (0) /*!< TZC_T::SPECULATION_CTRL: read_spec_disable Position*/ +#define TZC_SPECULATION_CTRL_read_spec_disable_Msk (0x1ul << TZC_SPECULATION_CTRL_read_spec_disable_Pos) /*!< TZC_T::SPECULATION_CTRL: read_spec_disable Mask*/ + +#define TZC_SPECULATION_CTRL_write_spec_disable_Pos (1) /*!< TZC_T::SPECULATION_CTRL: write_spec_disable Position*/ +#define TZC_SPECULATION_CTRL_write_spec_disable_Msk (0x1ul << TZC_SPECULATION_CTRL_write_spec_disable_Pos) /*!< TZC_T::SPECULATION_CTRL: write_spec_disable Mask*/ + +#define TZC_INT_STATUS_status_Pos (0) /*!< TZC_T::INT_STATUS: status Position */ +#define TZC_INT_STATUS_status_Msk (0xful << TZC_INT_STATUS_status_Pos) /*!< TZC_T::INT_STATUS: status Mask */ + +#define TZC_INT_STATUS_overrun_Pos (8) /*!< TZC_T::INT_STATUS: overrun Position */ +#define TZC_INT_STATUS_overrun_Msk (0xful << TZC_INT_STATUS_overrun_Pos) /*!< TZC_T::INT_STATUS: overrun Mask */ + +#define TZC_INT_STATUS_overlap_Pos (16) /*!< TZC_T::INT_STATUS: overlap Position */ +#define TZC_INT_STATUS_overlap_Msk (0xful << TZC_INT_STATUS_overlap_Pos) /*!< TZC_T::INT_STATUS: overlap Mask */ + +#define TZC_INT_CLEAR_clear_Pos (0) /*!< TZC_T::INT_CLEAR: clear Position */ +#define TZC_INT_CLEAR_clear_Msk (0xful << TZC_INT_CLEAR_clear_Pos) /*!< TZC_T::INT_CLEAR: clear Mask */ + +#define TZC_FAIL_ADDRESS_LOW_addr_status_low_Pos (0) /*!< TZC_T::FAIL_ADDRESS_LOW: addr_status_low Position*/ +#define TZC_FAIL_ADDRESS_LOW_addr_status_low_Msk (0xfffffffful << TZC_FAIL_ADDRESS_LOW_addr_status_low_Pos) /*!< TZC_T::FAIL_ADDRESS_LOW: addr_status_low Mask*/ + +#define TZC_FAIL_CONTROL_Privileged_Pos (20) /*!< TZC_T::FAIL_CONTROL: Privileged Position*/ +#define TZC_FAIL_CONTROL_Privileged_Msk (0x1ul << TZC_FAIL_CONTROL_Privileged_Pos) /*!< TZC_T::FAIL_CONTROL: Privileged Mask*/ + +#define TZC_FAIL_CONTROL_Non_secure_Pos (21) /*!< TZC_T::FAIL_CONTROL: Non_secure Position*/ +#define TZC_FAIL_CONTROL_Non_secure_Msk (0x1ul << TZC_FAIL_CONTROL_Non_secure_Pos) /*!< TZC_T::FAIL_CONTROL: Non_secure Mask*/ + +#define TZC_FAIL_CONTROL_Direction_Pos (24) /*!< TZC_T::FAIL_CONTROL: Direction Position*/ +#define TZC_FAIL_CONTROL_Direction_Msk (0x1ul << TZC_FAIL_CONTROL_Direction_Pos) /*!< TZC_T::FAIL_CONTROL: Direction Mask */ + +#define TZC_FAIL_ID_id_Pos (0) /*!< TZC_T::FAIL_ID: id Position */ +#define TZC_FAIL_ID_id_Msk (0x3ful << TZC_FAIL_ID_id_Pos) /*!< TZC_T::FAIL_ID: id Mask */ + +#define TZC_FAIL_ID_vnet_Pos (24) /*!< TZC_T::FAIL_ID: vnet Position */ +#define TZC_FAIL_ID_vnet_Msk (0xful << TZC_FAIL_ID_vnet_Pos) /*!< TZC_T::FAIL_ID: vnet Mask */ + +#define TZC_REGION_BASE_LOW_base_address_low_n_Pos (12) /*!< TZC_T::REGION_BASE_LOW: base_address_low_n_ Position*/ +#define TZC_REGION_BASE_LOW_base_address_low_n_Msk (0xffffful << TZC_REGION_BASE_LOW_base_address_low_n_Pos) /*!< TZC_T::REGION_BASE_LOW: base_address_low_n_ Mask*/ + +#define TZC_REGION_TOP_LOW_top_address_low_n_Pos (12) /*!< TZC_T::REGION_TOP_LOW: top_address_low_n_ Position*/ +#define TZC_REGION_TOP_LOW_top_address_low_n_Msk (0xffffful << TZC_REGION_TOP_LOW_top_address_low_n_Pos) /*!< TZC_T::REGION_TOP_LOW: top_address_low_n_ Mask*/ + +#define TZC_REGION_ATTRIBUTES_filter_en_Pos (0) /*!< TZC_T::REGION_ATTRIBUTES: filter_en Position*/ +#define TZC_REGION_ATTRIBUTES_filter_en_Msk (0xful << TZC_REGION_ATTRIBUTES_filter_en_Pos) /*!< TZC_T::REGION_ATTRIBUTES: filter_en Mask*/ + +#define TZC_REGION_ATTRIBUTES_s_rd_en_Pos (30) /*!< TZC_T::REGION_ATTRIBUTES: s_rd_en Position*/ +#define TZC_REGION_ATTRIBUTES_s_rd_en_Msk (0x1ul << TZC_REGION_ATTRIBUTES_s_rd_en_Pos) /*!< TZC_T::REGION_ATTRIBUTES: s_rd_en Mask*/ + +#define TZC_REGION_ATTRIBUTES_s_wr_en_Pos (31) /*!< TZC_T::REGION_ATTRIBUTES: s_wr_en Position*/ +#define TZC_REGION_ATTRIBUTES_s_wr_en_Msk (0x1ul << TZC_REGION_ATTRIBUTES_s_wr_en_Pos) /*!< TZC_T::REGION_ATTRIBUTES: s_wr_en Mask*/ + +#define TZC_REGION_ID_ACCESS_nsaid_rd_en_Pos (0) /*!< TZC_T::REGION_ID_ACCESS: nsaid_rd_en Position*/ +#define TZC_REGION_ID_ACCESS_nsaid_rd_en_Msk (0xfffful << TZC_REGION_ID_ACCESS_nsaid_rd_en_Pos) /*!< TZC_T::REGION_ID_ACCESS: nsaid_rd_en Mask*/ + +#define TZC_REGION_ID_ACCESS_nsaid_wr_en_Pos (16) /*!< TZC_T::REGION_ID_ACCESS: nsaid_wr_en Position*/ +#define TZC_REGION_ID_ACCESS_nsaid_wr_en_Msk (0xfffful << TZC_REGION_ID_ACCESS_nsaid_wr_en_Pos) /*!< TZC_T::REGION_ID_ACCESS: nsaid_wr_en Mask*/ + +#define TZC_PID4_jep106_c_code_Pos (0) /*!< TZC_T::PID4: jep106_c_code Position */ +#define TZC_PID4_jep106_c_code_Msk (0xful << TZC_PID4_jep106_c_code_Pos) /*!< TZC_T::PID4: jep106_c_code Mask */ + +#define TZC_PID4_4KB_count_Pos (4) /*!< TZC_T::PID4: 4KB_count Position */ +#define TZC_PID4_4KB_count_Msk (0xful << TZC_PID4_4KB_count_Pos) /*!< TZC_T::PID4: 4KB_count Mask */ + +#define TZC_PID0_part_number_0_Pos (0) /*!< TZC_T::PID0: part_number_0 Position */ +#define TZC_PID0_part_number_0_Msk (0xfful << TZC_PID0_part_number_0_Pos) /*!< TZC_T::PID0: part_number_0 Mask */ + +#define TZC_PID1_part_number_1_Pos (0) /*!< TZC_T::PID1: part_number_1 Position */ +#define TZC_PID1_part_number_1_Msk (0xful << TZC_PID1_part_number_1_Pos) /*!< TZC_T::PID1: part_number_1 Mask */ + +#define TZC_PID1_jep106_id_3_0_Pos (4) /*!< TZC_T::PID1: jep106_id_3_0 Position */ +#define TZC_PID1_jep106_id_3_0_Msk (0xful << TZC_PID1_jep106_id_3_0_Pos) /*!< TZC_T::PID1: jep106_id_3_0 Mask */ + +#define TZC_PID2_jep106_id_6_4_Pos (0) /*!< TZC_T::PID2: jep106_id_6_4 Position */ +#define TZC_PID2_jep106_id_6_4_Msk (0x7ul << TZC_PID2_jep106_id_6_4_Pos) /*!< TZC_T::PID2: jep106_id_6_4 Mask */ + +#define TZC_PID2_jedec_used_Pos (3) /*!< TZC_T::PID2: jedec_used Position */ +#define TZC_PID2_jedec_used_Msk (0x1ul << TZC_PID2_jedec_used_Pos) /*!< TZC_T::PID2: jedec_used Mask */ + +#define TZC_PID2_revision_Pos (4) /*!< TZC_T::PID2: revision Position */ +#define TZC_PID2_revision_Msk (0xful << TZC_PID2_revision_Pos) /*!< TZC_T::PID2: revision Mask */ + +#define TZC_PID3_mod_number_Pos (0) /*!< TZC_T::PID3: mod_number Position */ +#define TZC_PID3_mod_number_Msk (0xful << TZC_PID3_mod_number_Pos) /*!< TZC_T::PID3: mod_number Mask */ + +#define TZC_PID3_RevAnd_Pos (4) /*!< TZC_T::PID3: RevAnd Position */ +#define TZC_PID3_RevAnd_Msk (0xful << TZC_PID3_RevAnd_Pos) /*!< TZC_T::PID3: RevAnd Mask */ + +#define TZC_CID0_comp_id_0_Pos (0) /*!< TZC_T::CID0: comp_id_0 Position */ +#define TZC_CID0_comp_id_0_Msk (0xfful << TZC_CID0_comp_id_0_Pos) /*!< TZC_T::CID0: comp_id_0 Mask */ + +#define TZC_CID1_comp_id_0_Pos (0) /*!< TZC_T::CID1: comp_id_0 Position */ +#define TZC_CID1_comp_id_0_Msk (0xfful << TZC_CID1_comp_id_0_Pos) /*!< TZC_T::CID1: comp_id_0 Mask */ + +#define TZC_CID2_comp_id_2_Pos (0) /*!< TZC_T::CID2: comp_id_2 Position */ +#define TZC_CID2_comp_id_2_Msk (0xfful << TZC_CID2_comp_id_2_Pos) /*!< TZC_T::CID2: comp_id_2 Mask */ + +#define TZC_CID3_comp_id_3_Pos (0) /*!< TZC_T::CID3: comp_id_3 Position */ +#define TZC_CID3_comp_id_3_Msk (0xfful << TZC_CID3_comp_id_3_Pos) /*!< TZC_T::CID3: comp_id_3 Mask */ + +/**@}*/ /* TZC_CONST */ +/**@}*/ /* end of TZC register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __SSMCC_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/sspcc_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/sspcc_reg.h new file mode 100644 index 0000000000..5e466df022 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/sspcc_reg.h @@ -0,0 +1,2625 @@ +/**************************************************************************//** + * @file sspcc_reg.h + * @brief SSPCC register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __SSPCC_REG_H__ +#define __SSPCC_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + + +/******************************************************************************/ +/* Device Specific Peripheral registers structures */ +/******************************************************************************/ + +/** @addtogroup REGISTER Control Register + + @{ + +*/ + +/*---------------------- System Security Peripheral Configuration Controller -------------------------*/ +/** + @addtogroup SSPCC System Security Peripheral Configuration Controller(SSPCC) + Memory Mapped Structure for SSPCC Controller +@{ */ + +typedef struct +{ + + + /** + * @var SSPCC_T::PSSET0 + * Offset: 0x00 Peripheral Security Attribution Set Register 0 (0x4000_0000~0x400F_FFFF) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[17:16] |PDMA0 |PDMA0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * |[19:18] |PDMA1 |PDMA1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * |[21:20] |PDMA2 |PDMA2 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PDMA3 |PDMA3 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::PSSET1 + * Offset: 0x04 Peripheral Security Attribution Set Register 1 (0x4010_0000~0x401F_FFFF) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |EBI |EBI Controller Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |SDH0 |SD Host 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * |[19:18] |SDH1 |SD Host 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * |[21:20] |NANDC |NAND Controller Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * @var SSPCC_T::PSSET2 + * Offset: 0x08 Peripheral Security Attribution Set Register 2 (0x4020_0000~0x402F_FFFF) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |HSUSBD |HS USB Device Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * @var SSPCC_T::PSSET3 + * Offset: 0x0C Peripheral Security Attribution Set Register 3 (0x4030_0000~0x403F_FFFF) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |CRYPTO |Crypto Accelerator Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * |[25:24] |CANFD0 |CANFD0 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |CANFD1 |CANFD1 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |CANFD2 |CANFD2 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |CANFD3 |CANFD3 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::PSSET4 + * Offset: 0x10 Peripheral Security Attribution Set Register 4 (0x4040_0000~0x404F_FFFF) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:4] |ADC0 |ADC 0 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |EADC0 |EADC 0 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |WDTWWDT1 |WDTWWDT1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * |[17:16] |I2S0 |I2S 0 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |I2S1 |I2S 1 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |KPI |KPI Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |DDRPHYPUB |DDR PHY Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * |[27:26] |MCTL |DRAM Controller Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * @var SSPCC_T::PSSET5 + * Offset: 0x14 Peripheral Security Attribution Set Register 5 (0x4050_0000~0x405F_FFFF) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |TMR01 |TMR01 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * |[3:2] |TMR23 |TMR23 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |TMR45 |TMR45 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |TMR67 |TMR67 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |TMR89 |TMR89 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |TMR1011 |TMR1011 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |EPWM0 |EPWM 0 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |EPWM1 |EPWM 1 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |EPWM2 |EPWM 2 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::PSSET6 + * Offset: 0x18 Peripheral Security Attribution Set Register 6 (0x4060_0000~0x406F_FFFF) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |SPI0 |SPI0 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |SPI1 |SPI1 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |SPI2 |SPI2 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |SPI3 |SPI3 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |QSPI0 |QSPI0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * |[19:18] |QSPI1 |QSPI1 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::PSSET7 + * Offset: 0x1C Peripheral Security Attribution Set Register 7 (0x4070_0000~0x407F_FFFF) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |UART0 |UART0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * |[3:2] |UART1 |UART1 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |UART2 |UART2 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |UART3 |UART3 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |UART4 |UART4 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |UART5 |UART5 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |UART6 |UART6 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |UART7 |UART7 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |UART8 |UART8 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |UART9 |UART9 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |UART10 |UART10 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |UART11 |UART11 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |UART12 |UART12 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |UART13 |UART13 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |UART14 |UART14 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |UART15 |UART15 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::PSSET8 + * Offset: 0x20 Peripheral Security Attribution Set Register 8 (0x4080_0000~0x408F_FFFF) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |I2C0 |I2C0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * |[3:2] |I2C1 |I2C1 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |I2C2 |I2C2 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |I2C3 |I2C3 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |I2C4 |I2C4 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |I2C5 |I2C5 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |UART16 |UART16 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::PSSET9 + * Offset: 0x24 Peripheral Security Attribution Set Register 9 (0x4090_0000~0x409F_FFFF) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |SC0 |SC0 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |SC1 |SC1 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::PSSET10 + * Offset: 0x28 Peripheral Security Attribution Set Register 10 (0x40A0_0000~0x40AF_FFFF) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * @var SSPCC_T::PSSET11 + * Offset: 0x2C Peripheral Security Attribution Set Register 11 (0x40B0_0000~0x40BF_FFFF) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |QEI0 |QEI0 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |QEI1 |QEI1 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |QEI2 |QEI2 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |ECAP0 |ECAP0 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |ECAP1 |ECAP1 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |ECAP2 |ECAP2 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |TRNG |TRNG Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Reserved. + * @var SSPCC_T::SRAMSB + * Offset: 0x40 SRAM Security Boundary Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |SR0BOUND |Set SRAM0 Security Boundary + * | | |Set the 16 Kbytes-aligned boundary of SRAM0. + * | | |The SRAM part below the boundary is SubM region and the part higher the boundary is ShareMemory region. + * | | |When the boundary is set to higher than the size of SRAM, the whole SRAM is SubM region. + * |[12:8] |SR1BOUND |Set SRAM1 Security Boundary + * | | |Set the 16 Kbytes-aligned boundary of data SRAM. + * | | |The SRAM part below the boundary is TZS region and the part higher the boundary is TZNS region. + * | | |When the boundary is set to higher than the size of SRAM, the whole SRAM is TZS region. + * @var SSPCC_T::EBISSET + * Offset: 0x50 EBI Memory Security Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |BANK0 |EBI Memory Bank0 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |BANK1 |EBI Memory Bank1 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |BANK2 |EBI Memory Bank2 Security Attribution Bits + * | | |00 = Reserved. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IOASSET + * Offset: 0x60 GPIO Port A Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IOBSSET + * Offset: 0x64 GPIO Port B Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IOCSSET + * Offset: 0x68 GPIO Port C Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IODSSET + * Offset: 0x6C GPIO Port D Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IOESSET + * Offset: 0x70 GPIO Port E Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IOFSSET + * Offset: 0x74 GPIO Port F Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IOGSSET + * Offset: 0x78 GPIO Port G Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IOHSSET + * Offset: 0x7C GPIO Port H Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IOISSET + * Offset: 0x80 GPIO Port I Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IOJSSET + * Offset: 0x84 GPIO Port J Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IOKSSET + * Offset: 0x88 GPIO Port K Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IOLSSET + * Offset: 0x8C GPIO Port L Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IOMSSET + * Offset: 0x90 GPIO Port M Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::IONSSET + * Offset: 0x94 GPIO Port N Security Attribution Set Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |PIN0 |GPIO Pin 0 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[3:2] |PIN1 |GPIO Pin 1 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[5:4] |PIN2 |GPIO Pin 2 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[7:6] |PIN3 |GPIO Pin 3 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[9:8] |PIN4 |GPIO Pin 4 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[11:10] |PIN5 |GPIO Pin 5 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[13:12] |PIN6 |GPIO Pin 6 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[15:14] |PIN7 |GPIO Pin 7 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[17:16] |PIN8 |GPIO Pin 8 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[19:18] |PIN9 |GPIO Pin 9 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[21:20] |PIN10 |GPIO Pin 10 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[23:22] |PIN11 |GPIO Pin 11 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[25:24] |PIN12 |GPIO Pin 12 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[27:26] |PIN13 |GPIO Pin 13 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[29:28] |PIN14 |GPIO Pin 14 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * |[31:30] |PIN15 |GPIO Pin 15 Security Attribution Bits + * | | |00 = Set to TZS. + * | | |01 = Set to TZNS. + * | | |10 = Reserved. + * | | |11 = Set to SubM. + * @var SSPCC_T::SVIEN + * Offset: 0xF0 Security Violation Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |APB0 |APB0 Security Violation Interrupt Enable Bit + * | | |0 = Interrupt triggered from security violation of APB0 Disabled. + * | | |1 = Interrupt triggered from security violation of APB0 Enabled. + * |[1] |APB3 |APB3 Security Violation Interrupt Enable Bit + * | | |0 = Interrupt triggered from security violation of APB3 Disabled. + * | | |1 = Interrupt triggered from security violation of APB3 Enabled. + * |[2] |SRAM1 |SRAM1 Security Violation Interrupt Enable Bit + * | | |0 = Interrupt triggered from security violation of SRAM1 Disabled. + * | | |1 = Interrupt triggered from security violation of SRAM1 Enabled. + * |[3] |SDH0 |SD Host0 Security Violation Interrupt Enable Bit + * | | |0 = Interrupt triggered from security violation of SD host 0 Disabled. + * | | |1 = Interrupt triggered from security violation of SD host 0 Enabled. + * |[4] |SDH1 |SD Host1 Security Violation Interrupt Enable Bit + * | | |0 = Interrupt triggered from security violation of SD host 1 Disabled. + * | | |1 = Interrupt triggered from security violation of SD host 1 Enabled. + * |[5] |HSUSBD |HighSpeed USB Device Security Violation Interrupt Enable Bit + * | | |0 = Interrupt triggered from security violation of HighSpeed USB Device Disabled. + * | | |1 = Interrupt triggered from security violation of HighSpeed USB Device Enabled. + * |[6] |NANDC |NAND Controller Security Violation Interrupt Enable Bit + * | | |0 = Interrupt triggered from security violation of NAND Controller Disabled. + * | | |1 = Interrupt triggered from security violation of NAND Controller Enabled. + * |[7] |PDMA0 |PDMA0 Security Violation Interrupt Enable Bit + * | | |0 = Interrupt triggered from security violation of PDMA0 Disabled. + * | | |1 = Interrupt triggered from security violation of PDMA0 Enabled. + * |[8] |PDMA1 |PDMA1 Security Violation Interrupt Enable Bit + * | | |0 = Interrupt triggered from security violation of PDMA1 Disabled. + * | | |1 = Interrupt triggered from security violation of PDMA1 Enabled. + * |[9] |TRNG |TRNG Security Violation Interrupt Enable Bit + * | | |0 = Interrupt triggered from security violation of TRNG Disabled. + * | | |1 = Interrupt triggered from security violation of TRNG Enabled. + * |[10] |CRYPTO |CRYPTO Security Violation Interrupt Enable Bit + * | | |0 = Interrupt triggered from security violation of CRYPTO Disabled. + * | | |1 = Interrupt triggered from security violation of CRYPTO Enabled. + * @var SSPCC_T::SVINTSTS + * Offset: 0xF4 Security Violation Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |APB0 |APB0 Security Violation Interrupt Status + * | | |0 = No APB0 violation interrupt event. + * | | |1 = There is APB0 violation interrupt event. + * | | |Note: Write 1 to clear the interrupt flag. + * |[1] |APB3 |APB3 Security Violation Interrupt Status + * | | |0 = No APB3 violation interrupt event. + * | | |1 = There is APB3 violation interrupt event. + * | | |Note: Write 1 to clear the interrupt flag. + * |[2] |SRAM1 |SRAM1 Security Violation Interrupt Status + * | | |0 = No SRAM1 violation interrupt event. + * | | |1 = There is SRAM1 violation interrupt event. + * | | |Note: Write 1 to clear the interrupt flag. + * |[3] |SDH0 |SDH0 Security Violation Interrupt Status + * | | |0 = No SDH0 violation interrupt event. + * | | |1 = There is SDH0 violation interrupt event. + * | | |Note: Write 1 to clear the interrupt flag. + * |[4] |SDH1 |SDH1 Security Violation Interrupt Status + * | | |0 = No SDH1 violation interrupt event. + * | | |1 = There is SDH1 violation interrupt event. + * | | |Note: Write 1 to clear the interrupt flag. + * |[5] |HSUSBD |High-speed USB Device Security Violation Interrupt Status + * | | |0 = No High-speed USB Device violation interrupt event. + * | | |1 = There is High-speed USB Device violation interrupt event. + * | | |Note: Write 1 to clear the interrupt flag. + * |[6] |NANDC |NAND Controller Security Violation Interrupt Status + * | | |0 = No NAND Controller violation interrupt event. + * | | |1 = There is NAND Controller violation interrupt event. + * | | |Note: Write 1 to clear the interrupt flag. + * |[7] |PDMA0 |PDMA0 Security Violation Interrupt Status + * | | |0 = No PDMA0 violation interrupt event. + * | | |1 = There is PDMA0 violation interrupt event. + * | | |Note: Write 1 to clear the interrupt flag. + * |[8] |PDMA1 |PDMA1 Security Violation Interrupt Status + * | | |0 = No PDMA1 violation interrupt event. + * | | |1 = There is PDMA1 violation interrupt event. + * | | |Note: Write 1 to clear the interrupt flag. + * |[9] |TRNG |TRNG Security Violation Interrupt Status + * | | |0 = No TRNG violation interrupt event. + * | | |1 = There is TRNG violation interrupt event. + * | | |Note: Write 1 to clear the interrupt flag. + * |[10] |CRYPTO |CRYPTO Security Violation Interrupt Status + * | | |0 = No CRYPTO violation interrupt event. + * | | |1 = There is CRYPTO violation interrupt event. + * | | |Note: Write 1 to clear the interrupt flag. + * @var SSPCC_T::APB0VSRC + * Offset: 0x100 APB0 Security Policy Violation Source + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |MASTER |Master Violating Security Policy + * | | |Indicate which master invokes the security violation. + * | | |0x0 = CA35. + * | | |0x1 = CoreSight AP. + * | | |0x3 = Crypto Engine + * | | |0x2 = CM4. + * | | |0x4 = PDMA0. + * | | |0x5 = PDMA1. + * | | |0x6 = PDMA2. + * | | |0x7 = PDMA3. + * | | |0x8 = SDH0. + * | | |0x9 = SDH1. + * | | |0xA = USBH2. + * | | |0xB = USBH0/HSUSBH0. + * | | |0xC = USBH1/HSUSBH1. + * | | |0xD = HSUSBD. + * | | |0xE = NAND. + * | | |Others is undefined. + * @var SSPCC_T::APB3VSRC + * Offset: 0x104 APB3 Security Policy Violation Source + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |MASTER |Master Violating Security Policy + * | | |Indicate which master invokes the security violation. + * | | |0x0 = CA35. + * | | |0x1 = CoreSight AP. + * | | |0x3 = Crypto Engine + * | | |0x2 = CM4. + * | | |0x4 = PDMA0. + * | | |0x5 = PDMA1. + * | | |0x6 = PDMA2. + * | | |0x7 = PDMA3. + * | | |0x8 = SDH0. + * | | |0x9 = SDH1. + * | | |0xA = USBH2. + * | | |0xB = USBH0/HSUSBH0. + * | | |0xC = USBH1/HSUSBH1. + * | | |0xD = HSUSBD. + * | | |0xE = NAND. + * | | |Others is undefined. + * @var SSPCC_T::SRAM1VSRC + * Offset: 0x108 SRAM1 Security Policy Violation Source + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |MASTER |Master Violating Security Policy + * | | |Indicate which master invokes the security violation. + * | | |0x0 = CA35. + * | | |0x1 = CoreSight AP. + * | | |0x3 = Crypto Engine + * | | |0x2 = CM4. + * | | |0x4 = PDMA0. + * | | |0x5 = PDMA1. + * | | |0x6 = PDMA2. + * | | |0x7 = PDMA3. + * | | |0x8 = SDH0. + * | | |0x9 = SDH1. + * | | |0xA = USBH2. + * | | |0xB = USBH0/HSUSBH0. + * | | |0xC = USBH1/HSUSBH1. + * | | |0xD = HSUSBD. + * | | |0xE = NAND. + * | | |Others is undefined. + * @var SSPCC_T::SDH0VSRC + * Offset: 0x10C SDH0 Security Policy Violation Source + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |MASTER |Master Violating Security Policy + * | | |Indicate which master invokes the security violation. + * | | |0x0 = CA35. + * | | |0x1 = CoreSight AP. + * | | |0x3 = Crypto Engine + * | | |0x2 = CM4. + * | | |0x4 = PDMA0. + * | | |0x5 = PDMA1. + * | | |0x6 = PDMA2. + * | | |0x7 = PDMA3. + * | | |0x8 = SDH0. + * | | |0x9 = SDH1. + * | | |0xA = USBH2. + * | | |0xB = USBH0/HSUSBH0. + * | | |0xC = USBH1/HSUSBH1. + * | | |0xD = HSUSBD. + * | | |0xE = NAND. + * | | |Others is undefined. + * @var SSPCC_T::SDH1VSRC + * Offset: 0x110 SDH1 Security Policy Violation Source + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |MASTER |Master Violating Security Policy + * | | |Indicate which master invokes the security violation. + * | | |0x0 = CA35. + * | | |0x1 = CoreSight AP. + * | | |0x3 = Crypto Engine + * | | |0x2 = CM4. + * | | |0x4 = PDMA0. + * | | |0x5 = PDMA1. + * | | |0x6 = PDMA2. + * | | |0x7 = PDMA3. + * | | |0x8 = SDH0. + * | | |0x9 = SDH1. + * | | |0xA = USBH2. + * | | |0xB = USBH0/HSUSBH0. + * | | |0xC = USBH1/HSUSBH1. + * | | |0xD = HSUSBD. + * | | |0xE = NAND. + * | | |Others is undefined. + * @var SSPCC_T::HSUSBDVSRC + * Offset: 0x114 HSUSBD Security Policy Violation Source + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |MASTER |Master Violating Security Policy + * | | |Indicate which master invokes the security violation. + * | | |0x0 = CA35. + * | | |0x1 = CoreSight AP. + * | | |0x3 = Crypto Engine + * | | |0x2 = CM4. + * | | |0x4 = PDMA0. + * | | |0x5 = PDMA1. + * | | |0x6 = PDMA2. + * | | |0x7 = PDMA3. + * | | |0x8 = SDH0. + * | | |0x9 = SDH1. + * | | |0xA = USBH2. + * | | |0xB = USBH0/HSUSBH0. + * | | |0xC = USBH1/HSUSBH1. + * | | |0xD = HSUSBD. + * | | |0xE = NAND. + * | | |Others is undefined. + * @var SSPCC_T::NANDCVSRC + * Offset: 0x118 NANDC Security Policy Violation Source + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |MASTER |Master Violating Security Policy + * | | |Indicate which master invokes the security violation. + * | | |0x0 = CA35. + * | | |0x1 = CoreSight AP. + * | | |0x3 = Crypto Engine + * | | |0x2 = CM4. + * | | |0x4 = PDMA0. + * | | |0x5 = PDMA1. + * | | |0x6 = PDMA2. + * | | |0x7 = PDMA3. + * | | |0x8 = SDH0. + * | | |0x9 = SDH1. + * | | |0xA = USBH2. + * | | |0xB = USBH0/HSUSBH0. + * | | |0xC = USBH1/HSUSBH1. + * | | |0xD = HSUSBD. + * | | |0xE = NAND. + * | | |Others is undefined. + * @var SSPCC_T::PDMA0VSRC + * Offset: 0x11C PDMA0 Security Policy Violation Source + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |MASTER |Master Violating Security Policy + * | | |Indicate which master invokes the security violation. + * | | |0x0 = CA35. + * | | |0x1 = CoreSight AP. + * | | |0x3 = Crypto Engine + * | | |0x2 = CM4. + * | | |0x4 = PDMA0. + * | | |0x5 = PDMA1. + * | | |0x6 = PDMA2. + * | | |0x7 = PDMA3. + * | | |0x8 = SDH0. + * | | |0x9 = SDH1. + * | | |0xA = USBH2. + * | | |0xB = USBH0/HSUSBH0. + * | | |0xC = USBH1/HSUSBH1. + * | | |0xD = HSUSBD. + * | | |0xE = NAND. + * | | |Others is undefined. + * @var SSPCC_T::PDMA1VSRC + * Offset: 0x120 PDMA1 Security Policy Violation Source + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |MASTER |Master Violating Security Policy + * | | |Indicate which master invokes the security violation. + * | | |0x0 = CA35. + * | | |0x1 = CoreSight AP. + * | | |0x3 = Crypto Engine + * | | |0x2 = CM4. + * | | |0x4 = PDMA0. + * | | |0x5 = PDMA1. + * | | |0x6 = PDMA2. + * | | |0x7 = PDMA3. + * | | |0x8 = SDH0. + * | | |0x9 = SDH1. + * | | |0xA = USBH2. + * | | |0xB = USBH0/HSUSBH0. + * | | |0xC = USBH1/HSUSBH1. + * | | |0xD = HSUSBD. + * | | |0xE = NAND. + * | | |Others is undefined. + * @var SSPCC_T::TRNGVSRC + * Offset: 0x124 TRNG Security Policy Violation Source + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |MASTER |Master Violating Security Policy + * | | |Indicate which master invokes the security violation. + * | | |0x0 = CA35. + * | | |0x1 = CoreSight AP. + * | | |0x3 = Crypto Engine + * | | |0x2 = CM4. + * | | |0x4 = PDMA0. + * | | |0x5 = PDMA1. + * | | |0x6 = PDMA2. + * | | |0x7 = PDMA3. + * | | |0x8 = SDH0. + * | | |0x9 = SDH1. + * | | |0xA = USBH2. + * | | |0xB = USBH0/HSUSBH0. + * | | |0xC = USBH1/HSUSBH1. + * | | |0xD = HSUSBD. + * | | |0xE = NAND. + * | | |Others is undefined. + * @var SSPCC_T::CRYPTOVSRC + * Offset: 0x128 CRYPTO Security Policy Violation Source + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |MASTER |Master Violating Security Policy + * | | |Indicate which master invokes the security violation. + * | | |0x0 = CA35. + * | | |0x1 = CoreSight AP. + * | | |0x3 = Crypto Engine + * | | |0x2 = CM4. + * | | |0x4 = PDMA0. + * | | |0x5 = PDMA1. + * | | |0x6 = PDMA2. + * | | |0x7 = PDMA3. + * | | |0x8 = SDH0. + * | | |0x9 = SDH1. + * | | |0xA = USBH2. + * | | |0xB = USBH0/HSUSBH0. + * | | |0xC = USBH1/HSUSBH1. + * | | |0xD = HSUSBD. + * | | |0xE = NAND. + * | | |Others is undefined. + * @var SSPCC_T::APB0VA + * Offset: 0x180 APB0 Security Policy Violation Address + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VIOADDR |Violation Address + * | | |Indicate the target address of the access, which invokes the security violation. + * @var SSPCC_T::APB3VA + * Offset: 0x184 APB3 Security Policy Violation Address + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VIOADDR |Violation Address + * | | |Indicate the target address of the access, which invokes the security violation. + * @var SSPCC_T::SRAM1VA + * Offset: 0x188 SRAM1 Security Policy Violation Address + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VIOADDR |Violation Address + * | | |Indicate the target address of the access, which invokes the security violation. + * @var SSPCC_T::SDH0VA + * Offset: 0x18C SDH0 Security Policy Violation Address + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VIOADDR |Violation Address + * | | |Indicate the target address of the access, which invokes the security violation. + * @var SSPCC_T::SDH1VA + * Offset: 0x190 SDH1 Security Policy Violation Address + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VIOADDR |Violation Address + * | | |Indicate the target address of the access, which invokes the security violation. + * @var SSPCC_T::HSUSBDVA + * Offset: 0x194 HSUSBD Security Policy Violation Address + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VIOADDR |Violation Address + * | | |Indicate the target address of the access, which invokes the security violation. + * @var SSPCC_T::NANDCVA + * Offset: 0x198 NANDC Security Policy Violation Address + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VIOADDR |Violation Address + * | | |Indicate the target address of the access, which invokes the security violation. + * @var SSPCC_T::PDMA0VA + * Offset: 0x19C PDMA0 Security Policy Violation Address + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VIOADDR |Violation Address + * | | |Indicate the target address of the access, which invokes the security violation. + * @var SSPCC_T::PDMA1VA + * Offset: 0x1A0 PDMA1 Security Policy Violation Address + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VIOADDR |Violation Address + * | | |Indicate the target address of the access, which invokes the security violation. + * @var SSPCC_T::TRNGVA + * Offset: 0x1A4 TRNG Security Policy Violation Address + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VIOADDR |Violation Address + * | | |Indicate the target address of the access, which invokes the security violation. + * @var SSPCC_T::CRYPTOVA + * Offset: 0x1A8 CRYPTO Security Policy Violation Address + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |VIOADDR |Violation Address + * | | |Indicate the target address of the access, which invokes the security violation. + * @var SSPCC_T::SINFAEN + * Offset: 0x200 Shared Information Access Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SSPCCSIAEN|SSPCC Shared Information Access Enable Bit + * | | |0 = SSPCC shared information Disabled. + * | | |1 = SSPCC shared information Enabled. + * |[1] |SYSSIAEN |SYS Shared Information Access Enable Bit + * | | |0 = SYS shared information Disabled. + * | | |1 = SYS shared information Enabled. + * | | |Note: Include clock information. + * |[2] |RTCSIAEN |RTC Shared Information Access Enable Bit + * | | |0 = RTC shared information Disabled. + * | | |1 = RTC shared information Enabled. + * |[6] |OTPSIAEN |OTP Controller Shared Information Access Enable Bit + * | | |0 = OTP controller shared information Disabled. + * | | |1 = OTP controller shared information Enabled. + * |[7] |KSSIAEN |Key Store Shared Information Access Enable Bit + * | | |0 = Key Store shared information Disabled. + * | | |1 = Key Store shared information Enabled. + * @var SSPCC_T::SCWP + * Offset: 0x204 Security Configuration Write Protection Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ENABLE |Write Protection Enable Bit + * | | |0 = Write Protection Disabled. + * | | |1 = Write Protection Enabled. + * |[1] |LOCK |Enable Write Protection Lock Bit (Write Once) + * | | |0 = Write protection lock Disabled. + * | | |1 = Write protection Enabled and locked. + * | | |Note: This bit cannot be cleared to 0 after set to 1. + * |[31:16] |WVCODE |Write Verify Code + * | | |Read operation: + * | | |Reserved, all zeros. + * | | |Write operation: + * | | |0x475A = The write verify code, 0x475A, is needed to do a valid write to SSPCC_SCWP. + * | | |Others = Invalid write verify code. + */ + __IO uint32_t PSSET0; /*!< [0x0000] Peripheral Security Attribution Set Register 0 (0x4000_0000~0x400F_FFFF) */ + __IO uint32_t PSSET1; /*!< [0x0004] Peripheral Security Attribution Set Register 1 (0x4010_0000~0x401F_FFFF) */ + __IO uint32_t PSSET2; /*!< [0x0008] Peripheral Security Attribution Set Register 2 (0x4020_0000~0x402F_FFFF) */ + __IO uint32_t PSSET3; /*!< [0x000c] Peripheral Security Attribution Set Register 3 (0x4030_0000~0x403F_FFFF) */ + __IO uint32_t PSSET4; /*!< [0x0010] Peripheral Security Attribution Set Register 4 (0x4040_0000~0x404F_FFFF) */ + __IO uint32_t PSSET5; /*!< [0x0014] Peripheral Security Attribution Set Register 5 (0x4050_0000~0x405F_FFFF) */ + __IO uint32_t PSSET6; /*!< [0x0018] Peripheral Security Attribution Set Register 6 (0x4060_0000~0x406F_FFFF) */ + __IO uint32_t PSSET7; /*!< [0x001c] Peripheral Security Attribution Set Register 7 (0x4070_0000~0x407F_FFFF) */ + __IO uint32_t PSSET8; /*!< [0x0020] Peripheral Security Attribution Set Register 8 (0x4080_0000~0x408F_FFFF) */ + __IO uint32_t PSSET9; /*!< [0x0024] Peripheral Security Attribution Set Register 9 (0x4090_0000~0x409F_FFFF) */ + __IO uint32_t PSSET10; /*!< [0x0028] Peripheral Security Attribution Set Register 10 (0x40A0_0000~0x40AF_FFFF) */ + __IO uint32_t PSSET11; /*!< [0x002c] Peripheral Security Attribution Set Register 11 (0x40B0_0000~0x40BF_FFFF) */ + __I uint32_t RESERVE0[4]; + __IO uint32_t SRAMSB; /*!< [0x0040] SRAM Security Boundary Set Register */ + __I uint32_t RESERVE1[3]; + __IO uint32_t EBISSET; /*!< [0x0050] EBI Memory Security Set Register */ + __I uint32_t RESERVE2[3]; + __IO uint32_t IOASSET; /*!< [0x0060] GPIO Port A Security Attribution Set Register */ + __IO uint32_t IOBSSET; /*!< [0x0064] GPIO Port B Security Attribution Set Register */ + __IO uint32_t IOCSSET; /*!< [0x0068] GPIO Port C Security Attribution Set Register */ + __IO uint32_t IODSSET; /*!< [0x006c] GPIO Port D Security Attribution Set Register */ + __IO uint32_t IOESSET; /*!< [0x0070] GPIO Port E Security Attribution Set Register */ + __IO uint32_t IOFSSET; /*!< [0x0074] GPIO Port F Security Attribution Set Register */ + __IO uint32_t IOGSSET; /*!< [0x0078] GPIO Port G Security Attribution Set Register */ + __IO uint32_t IOHSSET; /*!< [0x007c] GPIO Port H Security Attribution Set Register */ + __IO uint32_t IOISSET; /*!< [0x0080] GPIO Port I Security Attribution Set Register */ + __IO uint32_t IOJSSET; /*!< [0x0084] GPIO Port J Security Attribution Set Register */ + __IO uint32_t IOKSSET; /*!< [0x0088] GPIO Port K Security Attribution Set Register */ + __IO uint32_t IOLSSET; /*!< [0x008c] GPIO Port L Security Attribution Set Register */ + __IO uint32_t IOMSSET; /*!< [0x0090] GPIO Port M Security Attribution Set Register */ + __IO uint32_t IONSSET; /*!< [0x0094] GPIO Port N Security Attribution Set Register */ + __I uint32_t RESERVE3[22]; + __IO uint32_t SVIEN; /*!< [0x00f0] Security Violation Interrupt Enable Register */ + __IO uint32_t SVINTSTS; /*!< [0x00f4] Security Violation Interrupt Status Register */ + __I uint32_t RESERVE4[2]; + __I uint32_t APB0VSRC; /*!< [0x0100] APB0 Security Policy Violation Source */ + __I uint32_t APB3VSRC; /*!< [0x0104] APB3 Security Policy Violation Source */ + __I uint32_t SRAM1VSRC; /*!< [0x0108] SRAM1 Security Policy Violation Source */ + __I uint32_t SDH0VSRC; /*!< [0x010c] SDH0 Security Policy Violation Source */ + __I uint32_t SDH1VSRC; /*!< [0x0110] SDH1 Security Policy Violation Source */ + __I uint32_t HSUSBDVSRC; /*!< [0x0114] HSUSBD Security Policy Violation Source */ + __I uint32_t NANDCVSRC; /*!< [0x0118] NANDC Security Policy Violation Source */ + __I uint32_t PDMA0VSRC; /*!< [0x011c] PDMA0 Security Policy Violation Source */ + __I uint32_t PDMA1VSRC; /*!< [0x0120] PDMA1 Security Policy Violation Source */ + __I uint32_t TRNGVSRC; /*!< [0x0124] TRNG Security Policy Violation Source */ + __I uint32_t CRYPTOVSRC; /*!< [0x0128] CRYPTO Security Policy Violation Source */ + __I uint32_t RESERVE5[21]; + __I uint32_t APB0VA; /*!< [0x0180] APB0 Security Policy Violation Address */ + __I uint32_t APB3VA; /*!< [0x0184] APB3 Security Policy Violation Address */ + __I uint32_t SRAM1VA; /*!< [0x0188] SRAM1 Security Policy Violation Address */ + __I uint32_t SDH0VA; /*!< [0x018c] SDH0 Security Policy Violation Address */ + __I uint32_t SDH1VA; /*!< [0x0190] SDH1 Security Policy Violation Address */ + __I uint32_t HSUSBDVA; /*!< [0x0194] HSUSBD Security Policy Violation Address */ + __I uint32_t NANDCVA; /*!< [0x0198] NANDC Security Policy Violation Address */ + __I uint32_t PDMA0VA; /*!< [0x019c] PDMA0 Security Policy Violation Address */ + __I uint32_t PDMA1VA; /*!< [0x01a0] PDMA1 Security Policy Violation Address */ + __I uint32_t TRNGVA; /*!< [0x01a4] TRNG Security Policy Violation Address */ + __I uint32_t CRYPTOVA; /*!< [0x01a8] CRYPTO Security Policy Violation Address */ + __I uint32_t RESERVE6[21]; + __IO uint32_t SINFAEN; /*!< [0x0200] Shared Information Access Enable Register */ + __IO uint32_t SCWP; /*!< [0x0204] Security Configuration Write Protection Register */ + +} SSPCC_T; + +/** + @addtogroup SSPCC_CONST SSPCC Bit Field Definition + Constant Definitions for SSPCC Controller +@{ */ + +#define SSPCC_PSSET0_PDMA0_Pos (16) /*!< SSPCC_T::PSSET0: PDMA0 Position */ +#define SSPCC_PSSET0_PDMA0_Msk (0x3ul << SSPCC_PSSET0_PDMA0_Pos) /*!< SSPCC_T::PSSET0: PDMA0 Mask */ + +#define SSPCC_PSSET0_PDMA1_Pos (18) /*!< SSPCC_T::PSSET0: PDMA1 Position */ +#define SSPCC_PSSET0_PDMA1_Msk (0x3ul << SSPCC_PSSET0_PDMA1_Pos) /*!< SSPCC_T::PSSET0: PDMA1 Mask */ + +#define SSPCC_PSSET0_PDMA2_Pos (20) /*!< SSPCC_T::PSSET0: PDMA2 Position */ +#define SSPCC_PSSET0_PDMA2_Msk (0x3ul << SSPCC_PSSET0_PDMA2_Pos) /*!< SSPCC_T::PSSET0: PDMA2 Mask */ + +#define SSPCC_PSSET0_PDMA3_Pos (22) /*!< SSPCC_T::PSSET0: PDMA3 Position */ +#define SSPCC_PSSET0_PDMA3_Msk (0x3ul << SSPCC_PSSET0_PDMA3_Pos) /*!< SSPCC_T::PSSET0: PDMA3 Mask */ + +#define SSPCC_PSSET1_EBI_Pos (0) /*!< SSPCC_T::PSSET1: EBI Position */ +#define SSPCC_PSSET1_EBI_Msk (0x3ul << SSPCC_PSSET1_EBI_Pos) /*!< SSPCC_T::PSSET1: EBI Mask */ + +#define SSPCC_PSSET1_SDH0_Pos (16) /*!< SSPCC_T::PSSET1: SDH0 Position */ +#define SSPCC_PSSET1_SDH0_Msk (0x3ul << SSPCC_PSSET1_SDH0_Pos) /*!< SSPCC_T::PSSET1: SDH0 Mask */ + +#define SSPCC_PSSET1_SDH1_Pos (18) /*!< SSPCC_T::PSSET1: SDH1 Position */ +#define SSPCC_PSSET1_SDH1_Msk (0x3ul << SSPCC_PSSET1_SDH1_Pos) /*!< SSPCC_T::PSSET1: SDH1 Mask */ + +#define SSPCC_PSSET1_NANDC_Pos (20) /*!< SSPCC_T::PSSET1: NANDC Position */ +#define SSPCC_PSSET1_NANDC_Msk (0x3ul << SSPCC_PSSET1_NANDC_Pos) /*!< SSPCC_T::PSSET1: NANDC Mask */ + +#define SSPCC_PSSET2_HSUSBD_Pos (0) /*!< SSPCC_T::PSSET2: HSUSBD Position */ +#define SSPCC_PSSET2_HSUSBD_Msk (0x3ul << SSPCC_PSSET2_HSUSBD_Pos) /*!< SSPCC_T::PSSET2: HSUSBD Mask */ + +#define SSPCC_PSSET3_CRYPTO_Pos (0) /*!< SSPCC_T::PSSET3: CRYPTO Position */ +#define SSPCC_PSSET3_CRYPTO_Msk (0x3ul << SSPCC_PSSET3_CRYPTO_Pos) /*!< SSPCC_T::PSSET3: CRYPTO Mask */ + +#define SSPCC_PSSET3_CANFD0_Pos (24) /*!< SSPCC_T::PSSET3: CANFD0 Position */ +#define SSPCC_PSSET3_CANFD0_Msk (0x3ul << SSPCC_PSSET3_CANFD0_Pos) /*!< SSPCC_T::PSSET3: CANFD0 Mask */ + +#define SSPCC_PSSET3_CANFD1_Pos (26) /*!< SSPCC_T::PSSET3: CANFD1 Position */ +#define SSPCC_PSSET3_CANFD1_Msk (0x3ul << SSPCC_PSSET3_CANFD1_Pos) /*!< SSPCC_T::PSSET3: CANFD1 Mask */ + +#define SSPCC_PSSET3_CANFD2_Pos (28) /*!< SSPCC_T::PSSET3: CANFD2 Position */ +#define SSPCC_PSSET3_CANFD2_Msk (0x3ul << SSPCC_PSSET3_CANFD2_Pos) /*!< SSPCC_T::PSSET3: CANFD2 Mask */ + +#define SSPCC_PSSET3_CANFD3_Pos (30) /*!< SSPCC_T::PSSET3: CANFD3 Position */ +#define SSPCC_PSSET3_CANFD3_Msk (0x3ul << SSPCC_PSSET3_CANFD3_Pos) /*!< SSPCC_T::PSSET3: CANFD3 Mask */ + +#define SSPCC_PSSET4_ADC0_Pos (4) /*!< SSPCC_T::PSSET4: ADC0 Position */ +#define SSPCC_PSSET4_ADC0_Msk (0x3ul << SSPCC_PSSET4_ADC0_Pos) /*!< SSPCC_T::PSSET4: ADC0 Mask */ + +#define SSPCC_PSSET4_EADC0_Pos (6) /*!< SSPCC_T::PSSET4: EADC0 Position */ +#define SSPCC_PSSET4_EADC0_Msk (0x3ul << SSPCC_PSSET4_EADC0_Pos) /*!< SSPCC_T::PSSET4: EADC0 Mask */ + +#define SSPCC_PSSET4_WDTWWDT1_Pos (8) /*!< SSPCC_T::PSSET4: WDTWWDT1 Position */ +#define SSPCC_PSSET4_WDTWWDT1_Msk (0x3ul << SSPCC_PSSET4_WDTWWDT1_Pos) /*!< SSPCC_T::PSSET4: WDTWWDT1 Mask */ + +#define SSPCC_PSSET4_I2S0_Pos (16) /*!< SSPCC_T::PSSET4: I2S0 Position */ +#define SSPCC_PSSET4_I2S0_Msk (0x3ul << SSPCC_PSSET4_I2S0_Pos) /*!< SSPCC_T::PSSET4: I2S0 Mask */ + +#define SSPCC_PSSET4_I2S1_Pos (18) /*!< SSPCC_T::PSSET4: I2S1 Position */ +#define SSPCC_PSSET4_I2S1_Msk (0x3ul << SSPCC_PSSET4_I2S1_Pos) /*!< SSPCC_T::PSSET4: I2S1 Mask */ + +#define SSPCC_PSSET4_KPI_Pos (20) /*!< SSPCC_T::PSSET4: KPI Position */ +#define SSPCC_PSSET4_KPI_Msk (0x3ul << SSPCC_PSSET4_KPI_Pos) /*!< SSPCC_T::PSSET4: KPI Mask */ + +#define SSPCC_PSSET4_DDRPHYPUB_Pos (24) /*!< SSPCC_T::PSSET4: DDRPHYPUB Position */ +#define SSPCC_PSSET4_DDRPHYPUB_Msk (0x3ul << SSPCC_PSSET4_DDRPHYPUB_Pos) /*!< SSPCC_T::PSSET4: DDRPHYPUB Mask */ + +#define SSPCC_PSSET4_MCTL_Pos (26) /*!< SSPCC_T::PSSET4: MCTL Position */ +#define SSPCC_PSSET4_MCTL_Msk (0x3ul << SSPCC_PSSET4_MCTL_Pos) /*!< SSPCC_T::PSSET4: MCTL Mask */ + +#define SSPCC_PSSET5_TMR01_Pos (0) /*!< SSPCC_T::PSSET5: TMR01 Position */ +#define SSPCC_PSSET5_TMR01_Msk (0x3ul << SSPCC_PSSET5_TMR01_Pos) /*!< SSPCC_T::PSSET5: TMR01 Mask */ + +#define SSPCC_PSSET5_TMR23_Pos (2) /*!< SSPCC_T::PSSET5: TMR23 Position */ +#define SSPCC_PSSET5_TMR23_Msk (0x3ul << SSPCC_PSSET5_TMR23_Pos) /*!< SSPCC_T::PSSET5: TMR23 Mask */ + +#define SSPCC_PSSET5_TMR45_Pos (4) /*!< SSPCC_T::PSSET5: TMR45 Position */ +#define SSPCC_PSSET5_TMR45_Msk (0x3ul << SSPCC_PSSET5_TMR45_Pos) /*!< SSPCC_T::PSSET5: TMR45 Mask */ + +#define SSPCC_PSSET5_TMR67_Pos (6) /*!< SSPCC_T::PSSET5: TMR67 Position */ +#define SSPCC_PSSET5_TMR67_Msk (0x3ul << SSPCC_PSSET5_TMR67_Pos) /*!< SSPCC_T::PSSET5: TMR67 Mask */ + +#define SSPCC_PSSET5_TMR89_Pos (8) /*!< SSPCC_T::PSSET5: TMR89 Position */ +#define SSPCC_PSSET5_TMR89_Msk (0x3ul << SSPCC_PSSET5_TMR89_Pos) /*!< SSPCC_T::PSSET5: TMR89 Mask */ + +#define SSPCC_PSSET5_TMR1011_Pos (10) /*!< SSPCC_T::PSSET5: TMR1011 Position */ +#define SSPCC_PSSET5_TMR1011_Msk (0x3ul << SSPCC_PSSET5_TMR1011_Pos) /*!< SSPCC_T::PSSET5: TMR1011 Mask */ + +#define SSPCC_PSSET5_EPWM0_Pos (16) /*!< SSPCC_T::PSSET5: EPWM0 Position */ +#define SSPCC_PSSET5_EPWM0_Msk (0x3ul << SSPCC_PSSET5_EPWM0_Pos) /*!< SSPCC_T::PSSET5: EPWM0 Mask */ + +#define SSPCC_PSSET5_EPWM1_Pos (18) /*!< SSPCC_T::PSSET5: EPWM1 Position */ +#define SSPCC_PSSET5_EPWM1_Msk (0x3ul << SSPCC_PSSET5_EPWM1_Pos) /*!< SSPCC_T::PSSET5: EPWM1 Mask */ + +#define SSPCC_PSSET5_EPWM2_Pos (20) /*!< SSPCC_T::PSSET5: EPWM2 Position */ +#define SSPCC_PSSET5_EPWM2_Msk (0x3ul << SSPCC_PSSET5_EPWM2_Pos) /*!< SSPCC_T::PSSET5: EPWM2 Mask */ + +#define SSPCC_PSSET6_SPI0_Pos (0) /*!< SSPCC_T::PSSET6: SPI0 Position */ +#define SSPCC_PSSET6_SPI0_Msk (0x3ul << SSPCC_PSSET6_SPI0_Pos) /*!< SSPCC_T::PSSET6: SPI0 Mask */ + +#define SSPCC_PSSET6_SPI1_Pos (2) /*!< SSPCC_T::PSSET6: SPI1 Position */ +#define SSPCC_PSSET6_SPI1_Msk (0x3ul << SSPCC_PSSET6_SPI1_Pos) /*!< SSPCC_T::PSSET6: SPI1 Mask */ + +#define SSPCC_PSSET6_SPI2_Pos (4) /*!< SSPCC_T::PSSET6: SPI2 Position */ +#define SSPCC_PSSET6_SPI2_Msk (0x3ul << SSPCC_PSSET6_SPI2_Pos) /*!< SSPCC_T::PSSET6: SPI2 Mask */ + +#define SSPCC_PSSET6_SPI3_Pos (6) /*!< SSPCC_T::PSSET6: SPI3 Position */ +#define SSPCC_PSSET6_SPI3_Msk (0x3ul << SSPCC_PSSET6_SPI3_Pos) /*!< SSPCC_T::PSSET6: SPI3 Mask */ + +#define SSPCC_PSSET6_QSPI0_Pos (16) /*!< SSPCC_T::PSSET6: QSPI0 Position */ +#define SSPCC_PSSET6_QSPI0_Msk (0x3ul << SSPCC_PSSET6_QSPI0_Pos) /*!< SSPCC_T::PSSET6: QSPI0 Mask */ + +#define SSPCC_PSSET6_QSPI1_Pos (18) /*!< SSPCC_T::PSSET6: QSPI1 Position */ +#define SSPCC_PSSET6_QSPI1_Msk (0x3ul << SSPCC_PSSET6_QSPI1_Pos) /*!< SSPCC_T::PSSET6: QSPI1 Mask */ + +#define SSPCC_PSSET7_UART0_Pos (0) /*!< SSPCC_T::PSSET7: UART0 Position */ +#define SSPCC_PSSET7_UART0_Msk (0x3ul << SSPCC_PSSET7_UART0_Pos) /*!< SSPCC_T::PSSET7: UART0 Mask */ + +#define SSPCC_PSSET7_UART1_Pos (2) /*!< SSPCC_T::PSSET7: UART1 Position */ +#define SSPCC_PSSET7_UART1_Msk (0x3ul << SSPCC_PSSET7_UART1_Pos) /*!< SSPCC_T::PSSET7: UART1 Mask */ + +#define SSPCC_PSSET7_UART2_Pos (4) /*!< SSPCC_T::PSSET7: UART2 Position */ +#define SSPCC_PSSET7_UART2_Msk (0x3ul << SSPCC_PSSET7_UART2_Pos) /*!< SSPCC_T::PSSET7: UART2 Mask */ + +#define SSPCC_PSSET7_UART3_Pos (6) /*!< SSPCC_T::PSSET7: UART3 Position */ +#define SSPCC_PSSET7_UART3_Msk (0x3ul << SSPCC_PSSET7_UART3_Pos) /*!< SSPCC_T::PSSET7: UART3 Mask */ + +#define SSPCC_PSSET7_UART4_Pos (8) /*!< SSPCC_T::PSSET7: UART4 Position */ +#define SSPCC_PSSET7_UART4_Msk (0x3ul << SSPCC_PSSET7_UART4_Pos) /*!< SSPCC_T::PSSET7: UART4 Mask */ + +#define SSPCC_PSSET7_UART5_Pos (10) /*!< SSPCC_T::PSSET7: UART5 Position */ +#define SSPCC_PSSET7_UART5_Msk (0x3ul << SSPCC_PSSET7_UART5_Pos) /*!< SSPCC_T::PSSET7: UART5 Mask */ + +#define SSPCC_PSSET7_UART6_Pos (12) /*!< SSPCC_T::PSSET7: UART6 Position */ +#define SSPCC_PSSET7_UART6_Msk (0x3ul << SSPCC_PSSET7_UART6_Pos) /*!< SSPCC_T::PSSET7: UART6 Mask */ + +#define SSPCC_PSSET7_UART7_Pos (14) /*!< SSPCC_T::PSSET7: UART7 Position */ +#define SSPCC_PSSET7_UART7_Msk (0x3ul << SSPCC_PSSET7_UART7_Pos) /*!< SSPCC_T::PSSET7: UART7 Mask */ + +#define SSPCC_PSSET7_UART8_Pos (16) /*!< SSPCC_T::PSSET7: UART8 Position */ +#define SSPCC_PSSET7_UART8_Msk (0x3ul << SSPCC_PSSET7_UART8_Pos) /*!< SSPCC_T::PSSET7: UART8 Mask */ + +#define SSPCC_PSSET7_UART9_Pos (18) /*!< SSPCC_T::PSSET7: UART9 Position */ +#define SSPCC_PSSET7_UART9_Msk (0x3ul << SSPCC_PSSET7_UART9_Pos) /*!< SSPCC_T::PSSET7: UART9 Mask */ + +#define SSPCC_PSSET7_UART10_Pos (20) /*!< SSPCC_T::PSSET7: UART10 Position */ +#define SSPCC_PSSET7_UART10_Msk (0x3ul << SSPCC_PSSET7_UART10_Pos) /*!< SSPCC_T::PSSET7: UART10 Mask */ + +#define SSPCC_PSSET7_UART11_Pos (22) /*!< SSPCC_T::PSSET7: UART11 Position */ +#define SSPCC_PSSET7_UART11_Msk (0x3ul << SSPCC_PSSET7_UART11_Pos) /*!< SSPCC_T::PSSET7: UART11 Mask */ + +#define SSPCC_PSSET7_UART12_Pos (24) /*!< SSPCC_T::PSSET7: UART12 Position */ +#define SSPCC_PSSET7_UART12_Msk (0x3ul << SSPCC_PSSET7_UART12_Pos) /*!< SSPCC_T::PSSET7: UART12 Mask */ + +#define SSPCC_PSSET7_UART13_Pos (26) /*!< SSPCC_T::PSSET7: UART13 Position */ +#define SSPCC_PSSET7_UART13_Msk (0x3ul << SSPCC_PSSET7_UART13_Pos) /*!< SSPCC_T::PSSET7: UART13 Mask */ + +#define SSPCC_PSSET7_UART14_Pos (28) /*!< SSPCC_T::PSSET7: UART14 Position */ +#define SSPCC_PSSET7_UART14_Msk (0x3ul << SSPCC_PSSET7_UART14_Pos) /*!< SSPCC_T::PSSET7: UART14 Mask */ + +#define SSPCC_PSSET7_UART15_Pos (30) /*!< SSPCC_T::PSSET7: UART15 Position */ +#define SSPCC_PSSET7_UART15_Msk (0x3ul << SSPCC_PSSET7_UART15_Pos) /*!< SSPCC_T::PSSET7: UART15 Mask */ + +#define SSPCC_PSSET8_I2C0_Pos (0) /*!< SSPCC_T::PSSET8: I2C0 Position */ +#define SSPCC_PSSET8_I2C0_Msk (0x3ul << SSPCC_PSSET8_I2C0_Pos) /*!< SSPCC_T::PSSET8: I2C0 Mask */ + +#define SSPCC_PSSET8_I2C1_Pos (2) /*!< SSPCC_T::PSSET8: I2C1 Position */ +#define SSPCC_PSSET8_I2C1_Msk (0x3ul << SSPCC_PSSET8_I2C1_Pos) /*!< SSPCC_T::PSSET8: I2C1 Mask */ + +#define SSPCC_PSSET8_I2C2_Pos (4) /*!< SSPCC_T::PSSET8: I2C2 Position */ +#define SSPCC_PSSET8_I2C2_Msk (0x3ul << SSPCC_PSSET8_I2C2_Pos) /*!< SSPCC_T::PSSET8: I2C2 Mask */ + +#define SSPCC_PSSET8_I2C3_Pos (6) /*!< SSPCC_T::PSSET8: I2C3 Position */ +#define SSPCC_PSSET8_I2C3_Msk (0x3ul << SSPCC_PSSET8_I2C3_Pos) /*!< SSPCC_T::PSSET8: I2C3 Mask */ + +#define SSPCC_PSSET8_I2C4_Pos (8) /*!< SSPCC_T::PSSET8: I2C4 Position */ +#define SSPCC_PSSET8_I2C4_Msk (0x3ul << SSPCC_PSSET8_I2C4_Pos) /*!< SSPCC_T::PSSET8: I2C4 Mask */ + +#define SSPCC_PSSET8_I2C5_Pos (10) /*!< SSPCC_T::PSSET8: I2C5 Position */ +#define SSPCC_PSSET8_I2C5_Msk (0x3ul << SSPCC_PSSET8_I2C5_Pos) /*!< SSPCC_T::PSSET8: I2C5 Mask */ + +#define SSPCC_PSSET8_UART16_Pos (16) /*!< SSPCC_T::PSSET8: UART16 Position */ +#define SSPCC_PSSET8_UART16_Msk (0x3ul << SSPCC_PSSET8_UART16_Pos) /*!< SSPCC_T::PSSET8: UART16 Mask */ + +#define SSPCC_PSSET9_SC0_Pos (0) /*!< SSPCC_T::PSSET9: SC0 Position */ +#define SSPCC_PSSET9_SC0_Msk (0x3ul << SSPCC_PSSET9_SC0_Pos) /*!< SSPCC_T::PSSET9: SC0 Mask */ + +#define SSPCC_PSSET9_SC1_Pos (2) /*!< SSPCC_T::PSSET9: SC1 Position */ +#define SSPCC_PSSET9_SC1_Msk (0x3ul << SSPCC_PSSET9_SC1_Pos) /*!< SSPCC_T::PSSET9: SC1 Mask */ + +#define SSPCC_PSSET11_QEI0_Pos (0) /*!< SSPCC_T::PSSET11: QEI0 Position */ +#define SSPCC_PSSET11_QEI0_Msk (0x3ul << SSPCC_PSSET11_QEI0_Pos) /*!< SSPCC_T::PSSET11: QEI0 Mask */ + +#define SSPCC_PSSET11_QEI1_Pos (2) /*!< SSPCC_T::PSSET11: QEI1 Position */ +#define SSPCC_PSSET11_QEI1_Msk (0x3ul << SSPCC_PSSET11_QEI1_Pos) /*!< SSPCC_T::PSSET11: QEI1 Mask */ + +#define SSPCC_PSSET11_QEI2_Pos (4) /*!< SSPCC_T::PSSET11: QEI2 Position */ +#define SSPCC_PSSET11_QEI2_Msk (0x3ul << SSPCC_PSSET11_QEI2_Pos) /*!< SSPCC_T::PSSET11: QEI2 Mask */ + +#define SSPCC_PSSET11_ECAP0_Pos (8) /*!< SSPCC_T::PSSET11: ECAP0 Position */ +#define SSPCC_PSSET11_ECAP0_Msk (0x3ul << SSPCC_PSSET11_ECAP0_Pos) /*!< SSPCC_T::PSSET11: ECAP0 Mask */ + +#define SSPCC_PSSET11_ECAP1_Pos (10) /*!< SSPCC_T::PSSET11: ECAP1 Position */ +#define SSPCC_PSSET11_ECAP1_Msk (0x3ul << SSPCC_PSSET11_ECAP1_Pos) /*!< SSPCC_T::PSSET11: ECAP1 Mask */ + +#define SSPCC_PSSET11_ECAP2_Pos (12) /*!< SSPCC_T::PSSET11: ECAP2 Position */ +#define SSPCC_PSSET11_ECAP2_Msk (0x3ul << SSPCC_PSSET11_ECAP2_Pos) /*!< SSPCC_T::PSSET11: ECAP2 Mask */ + +#define SSPCC_PSSET11_TRNG_Pos (18) /*!< SSPCC_T::PSSET11: TRNG Position */ +#define SSPCC_PSSET11_TRNG_Msk (0x3ul << SSPCC_PSSET11_TRNG_Pos) /*!< SSPCC_T::PSSET11: TRNG Mask */ + +#define SSPCC_SRAMSB_SR0BOUND_Pos (0) /*!< SSPCC_T::SRAMSB: SR0BOUND Position */ +#define SSPCC_SRAMSB_SR0BOUND_Msk (0x1ful << SSPCC_SRAMSB_SR0BOUND_Pos) /*!< SSPCC_T::SRAMSB: SR0BOUND Mask */ + +#define SSPCC_SRAMSB_SR1BOUND_Pos (8) /*!< SSPCC_T::SRAMSB: SR1BOUND Position */ +#define SSPCC_SRAMSB_SR1BOUND_Msk (0x1ful << SSPCC_SRAMSB_SR1BOUND_Pos) /*!< SSPCC_T::SRAMSB: SR1BOUND Mask */ + +#define SSPCC_EBISSET_BANK0_Pos (0) /*!< SSPCC_T::EBISSET: BANK0 Position */ +#define SSPCC_EBISSET_BANK0_Msk (0x3ul << SSPCC_EBISSET_BANK0_Pos) /*!< SSPCC_T::EBISSET: BANK0 Mask */ + +#define SSPCC_EBISSET_BANK1_Pos (2) /*!< SSPCC_T::EBISSET: BANK1 Position */ +#define SSPCC_EBISSET_BANK1_Msk (0x3ul << SSPCC_EBISSET_BANK1_Pos) /*!< SSPCC_T::EBISSET: BANK1 Mask */ + +#define SSPCC_EBISSET_BANK2_Pos (4) /*!< SSPCC_T::EBISSET: BANK2 Position */ +#define SSPCC_EBISSET_BANK2_Msk (0x3ul << SSPCC_EBISSET_BANK2_Pos) /*!< SSPCC_T::EBISSET: BANK2 Mask */ + +#define SSPCC_IOxSSET_PIN0_Pos (0) /*!< SSPCC_T::IOxSSET: PIN0 Position */ +#define SSPCC_IOxSSET_PIN0_Msk (0x3ul << SSPCC_IOxSSET_PIN0_Pos) /*!< SSPCC_T::IOxSSET: PIN0 Mask */ + +#define SSPCC_IOxSSET_PIN1_Pos (2) /*!< SSPCC_T::IOxSSET: PIN1 Position */ +#define SSPCC_IOxSSET_PIN1_Msk (0x3ul << SSPCC_IOxSSET_PIN1_Pos) /*!< SSPCC_T::IOxSSET: PIN1 Mask */ + +#define SSPCC_IOxSSET_PIN2_Pos (4) /*!< SSPCC_T::IOxSSET: PIN2 Position */ +#define SSPCC_IOxSSET_PIN2_Msk (0x3ul << SSPCC_IOxSSET_PIN2_Pos) /*!< SSPCC_T::IOxSSET: PIN2 Mask */ + +#define SSPCC_IOxSSET_PIN3_Pos (6) /*!< SSPCC_T::IOxSSET: PIN3 Position */ +#define SSPCC_IOxSSET_PIN3_Msk (0x3ul << SSPCC_IOxSSET_PIN3_Pos) /*!< SSPCC_T::IOxSSET: PIN3 Mask */ + +#define SSPCC_IOxSSET_PIN4_Pos (8) /*!< SSPCC_T::IOxSSET: PIN4 Position */ +#define SSPCC_IOxSSET_PIN4_Msk (0x3ul << SSPCC_IOxSSET_PIN4_Pos) /*!< SSPCC_T::IOxSSET: PIN4 Mask */ + +#define SSPCC_IOxSSET_PIN5_Pos (10) /*!< SSPCC_T::IOxSSET: PIN5 Position */ +#define SSPCC_IOxSSET_PIN5_Msk (0x3ul << SSPCC_IOxSSET_PIN5_Pos) /*!< SSPCC_T::IOxSSET: PIN5 Mask */ + +#define SSPCC_IOxSSET_PIN6_Pos (12) /*!< SSPCC_T::IOxSSET: PIN6 Position */ +#define SSPCC_IOxSSET_PIN6_Msk (0x3ul << SSPCC_IOxSSET_PIN6_Pos) /*!< SSPCC_T::IOxSSET: PIN6 Mask */ + +#define SSPCC_IOxSSET_PIN7_Pos (14) /*!< SSPCC_T::IOxSSET: PIN7 Position */ +#define SSPCC_IOxSSET_PIN7_Msk (0x3ul << SSPCC_IOxSSET_PIN7_Pos) /*!< SSPCC_T::IOxSSET: PIN7 Mask */ + +#define SSPCC_IOxSSET_PIN8_Pos (16) /*!< SSPCC_T::IOxSSET: PIN8 Position */ +#define SSPCC_IOxSSET_PIN8_Msk (0x3ul << SSPCC_IOxSSET_PIN8_Pos) /*!< SSPCC_T::IOxSSET: PIN8 Mask */ + +#define SSPCC_IOxSSET_PIN9_Pos (18) /*!< SSPCC_T::IOxSSET: PIN9 Position */ +#define SSPCC_IOxSSET_PIN9_Msk (0x3ul << SSPCC_IOxSSET_PIN9_Pos) /*!< SSPCC_T::IOxSSET: PIN9 Mask */ + +#define SSPCC_IOxSSET_PIN10_Pos (20) /*!< SSPCC_T::IOxSSET: PIN10 Position */ +#define SSPCC_IOxSSET_PIN10_Msk (0x3ul << SSPCC_IOxSSET_PIN10_Pos) /*!< SSPCC_T::IOxSSET: PIN10 Mask */ + +#define SSPCC_IOxSSET_PIN11_Pos (22) /*!< SSPCC_T::IOxSSET: PIN11 Position */ +#define SSPCC_IOxSSET_PIN11_Msk (0x3ul << SSPCC_IOxSSET_PIN11_Pos) /*!< SSPCC_T::IOxSSET: PIN11 Mask */ + +#define SSPCC_IOxSSET_PIN12_Pos (24) /*!< SSPCC_T::IOxSSET: PIN12 Position */ +#define SSPCC_IOxSSET_PIN12_Msk (0x3ul << SSPCC_IOxSSET_PIN12_Pos) /*!< SSPCC_T::IOxSSET: PIN12 Mask */ + +#define SSPCC_IOxSSET_PIN13_Pos (26) /*!< SSPCC_T::IOxSSET: PIN13 Position */ +#define SSPCC_IOxSSET_PIN13_Msk (0x3ul << SSPCC_IOxSSET_PIN13_Pos) /*!< SSPCC_T::IOxSSET: PIN13 Mask */ + +#define SSPCC_IOxSSET_PIN14_Pos (28) /*!< SSPCC_T::IOxSSET: PIN14 Position */ +#define SSPCC_IOxSSET_PIN14_Msk (0x3ul << SSPCC_IOxSSET_PIN14_Pos) /*!< SSPCC_T::IOxSSET: PIN14 Mask */ + +#define SSPCC_IOxSSET_PIN15_Pos (30) /*!< SSPCC_T::IOxSSET: PIN15 Position */ +#define SSPCC_IOxSSET_PIN15_Msk (0x3ul << SSPCC_IOxSSET_PIN15_Pos) /*!< SSPCC_T::IOxSSET: PIN15 Mask */ + +#define SSPCC_SVIEN_APB0_Pos (0) /*!< SSPCC_T::SVIEN: APB0 Position */ +#define SSPCC_SVIEN_APB0_Msk (0x1ul << SSPCC_SVIEN_APB0_Pos) /*!< SSPCC_T::SVIEN: APB0 Mask */ + +#define SSPCC_SVIEN_APB3_Pos (1) /*!< SSPCC_T::SVIEN: APB3 Position */ +#define SSPCC_SVIEN_APB3_Msk (0x1ul << SSPCC_SVIEN_APB3_Pos) /*!< SSPCC_T::SVIEN: APB3 Mask */ + +#define SSPCC_SVIEN_SRAM1_Pos (2) /*!< SSPCC_T::SVIEN: SRAM1 Position */ +#define SSPCC_SVIEN_SRAM1_Msk (0x1ul << SSPCC_SVIEN_SRAM1_Pos) /*!< SSPCC_T::SVIEN: SRAM1 Mask */ + +#define SSPCC_SVIEN_SDH0_Pos (3) /*!< SSPCC_T::SVIEN: SDH0 Position */ +#define SSPCC_SVIEN_SDH0_Msk (0x1ul << SSPCC_SVIEN_SDH0_Pos) /*!< SSPCC_T::SVIEN: SDH0 Mask */ + +#define SSPCC_SVIEN_SDH1_Pos (4) /*!< SSPCC_T::SVIEN: SDH1 Position */ +#define SSPCC_SVIEN_SDH1_Msk (0x1ul << SSPCC_SVIEN_SDH1_Pos) /*!< SSPCC_T::SVIEN: SDH1 Mask */ + +#define SSPCC_SVIEN_HSUSBD_Pos (5) /*!< SSPCC_T::SVIEN: HSUSBD Position */ +#define SSPCC_SVIEN_HSUSBD_Msk (0x1ul << SSPCC_SVIEN_HSUSBD_Pos) /*!< SSPCC_T::SVIEN: HSUSBD Mask */ + +#define SSPCC_SVIEN_NANDC_Pos (6) /*!< SSPCC_T::SVIEN: NANDC Position */ +#define SSPCC_SVIEN_NANDC_Msk (0x1ul << SSPCC_SVIEN_NANDC_Pos) /*!< SSPCC_T::SVIEN: NANDC Mask */ + +#define SSPCC_SVIEN_PDMA0_Pos (7) /*!< SSPCC_T::SVIEN: PDMA0 Position */ +#define SSPCC_SVIEN_PDMA0_Msk (0x1ul << SSPCC_SVIEN_PDMA0_Pos) /*!< SSPCC_T::SVIEN: PDMA0 Mask */ + +#define SSPCC_SVIEN_PDMA1_Pos (8) /*!< SSPCC_T::SVIEN: PDMA1 Position */ +#define SSPCC_SVIEN_PDMA1_Msk (0x1ul << SSPCC_SVIEN_PDMA1_Pos) /*!< SSPCC_T::SVIEN: PDMA1 Mask */ + +#define SSPCC_SVIEN_TRNG_Pos (9) /*!< SSPCC_T::SVIEN: TRNG Position */ +#define SSPCC_SVIEN_TRNG_Msk (0x1ul << SSPCC_SVIEN_TRNG_Pos) /*!< SSPCC_T::SVIEN: TRNG Mask */ + +#define SSPCC_SVIEN_CRYPTO_Pos (10) /*!< SSPCC_T::SVIEN: CRYPTO Position */ +#define SSPCC_SVIEN_CRYPTO_Msk (0x1ul << SSPCC_SVIEN_CRYPTO_Pos) /*!< SSPCC_T::SVIEN: CRYPTO Mask */ + +#define SSPCC_SVINTSTS_APB0_Pos (0) /*!< SSPCC_T::SVINTSTS: APB0 Position */ +#define SSPCC_SVINTSTS_APB0_Msk (0x1ul << SSPCC_SVINTSTS_APB0_Pos) /*!< SSPCC_T::SVINTSTS: APB0 Mask */ + +#define SSPCC_SVINTSTS_APB3_Pos (1) /*!< SSPCC_T::SVINTSTS: APB3 Position */ +#define SSPCC_SVINTSTS_APB3_Msk (0x1ul << SSPCC_SVINTSTS_APB3_Pos) /*!< SSPCC_T::SVINTSTS: APB3 Mask */ + +#define SSPCC_SVINTSTS_SRAM1_Pos (2) /*!< SSPCC_T::SVINTSTS: SRAM1 Position */ +#define SSPCC_SVINTSTS_SRAM1_Msk (0x1ul << SSPCC_SVINTSTS_SRAM1_Pos) /*!< SSPCC_T::SVINTSTS: SRAM1 Mask */ + +#define SSPCC_SVINTSTS_SDH0_Pos (3) /*!< SSPCC_T::SVINTSTS: SDH0 Position */ +#define SSPCC_SVINTSTS_SDH0_Msk (0x1ul << SSPCC_SVINTSTS_SDH0_Pos) /*!< SSPCC_T::SVINTSTS: SDH0 Mask */ + +#define SSPCC_SVINTSTS_SDH1_Pos (4) /*!< SSPCC_T::SVINTSTS: SDH1 Position */ +#define SSPCC_SVINTSTS_SDH1_Msk (0x1ul << SSPCC_SVINTSTS_SDH1_Pos) /*!< SSPCC_T::SVINTSTS: SDH1 Mask */ + +#define SSPCC_SVINTSTS_HSUSBD_Pos (5) /*!< SSPCC_T::SVINTSTS: HSUSBD Position */ +#define SSPCC_SVINTSTS_HSUSBD_Msk (0x1ul << SSPCC_SVINTSTS_HSUSBD_Pos) /*!< SSPCC_T::SVINTSTS: HSUSBD Mask */ + +#define SSPCC_SVINTSTS_NANDC_Pos (6) /*!< SSPCC_T::SVINTSTS: NANDC Position */ +#define SSPCC_SVINTSTS_NANDC_Msk (0x1ul << SSPCC_SVINTSTS_NANDC_Pos) /*!< SSPCC_T::SVINTSTS: NANDC Mask */ + +#define SSPCC_SVINTSTS_PDMA0_Pos (7) /*!< SSPCC_T::SVINTSTS: PDMA0 Position */ +#define SSPCC_SVINTSTS_PDMA0_Msk (0x1ul << SSPCC_SVINTSTS_PDMA0_Pos) /*!< SSPCC_T::SVINTSTS: PDMA0 Mask */ + +#define SSPCC_SVINTSTS_PDMA1_Pos (8) /*!< SSPCC_T::SVINTSTS: PDMA1 Position */ +#define SSPCC_SVINTSTS_PDMA1_Msk (0x1ul << SSPCC_SVINTSTS_PDMA1_Pos) /*!< SSPCC_T::SVINTSTS: PDMA1 Mask */ + +#define SSPCC_SVINTSTS_TRNG_Pos (9) /*!< SSPCC_T::SVINTSTS: TRNG Position */ +#define SSPCC_SVINTSTS_TRNG_Msk (0x1ul << SSPCC_SVINTSTS_TRNG_Pos) /*!< SSPCC_T::SVINTSTS: TRNG Mask */ + +#define SSPCC_SVINTSTS_CRYPTO_Pos (10) /*!< SSPCC_T::SVINTSTS: CRYPTO Position */ +#define SSPCC_SVINTSTS_CRYPTO_Msk (0x1ul << SSPCC_SVINTSTS_CRYPTO_Pos) /*!< SSPCC_T::SVINTSTS: CRYPTO Mask */ + +#define SSPCC_APB0VSRC_MASTER_Pos (0) /*!< SSPCC_T::APB0VSRC: MASTER Position */ +#define SSPCC_APB0VSRC_MASTER_Msk (0xful << SSPCC_APB0VSRC_MASTER_Pos) /*!< SSPCC_T::APB0VSRC: MASTER Mask */ + +#define SSPCC_APB3VSRC_MASTER_Pos (0) /*!< SSPCC_T::APB3VSRC: MASTER Position */ +#define SSPCC_APB3VSRC_MASTER_Msk (0xful << SSPCC_APB3VSRC_MASTER_Pos) /*!< SSPCC_T::APB3VSRC: MASTER Mask */ + +#define SSPCC_SRAM1VSRC_MASTER_Pos (0) /*!< SSPCC_T::SRAM1VSRC: MASTER Position */ +#define SSPCC_SRAM1VSRC_MASTER_Msk (0xful << SSPCC_SRAM1VSRC_MASTER_Pos) /*!< SSPCC_T::SRAM1VSRC: MASTER Mask */ + +#define SSPCC_SDH0VSRC_MASTER_Pos (0) /*!< SSPCC_T::SDH0VSRC: MASTER Position */ +#define SSPCC_SDH0VSRC_MASTER_Msk (0xful << SSPCC_SDH0VSRC_MASTER_Pos) /*!< SSPCC_T::SDH0VSRC: MASTER Mask */ + +#define SSPCC_SDH1VSRC_MASTER_Pos (0) /*!< SSPCC_T::SDH1VSRC: MASTER Position */ +#define SSPCC_SDH1VSRC_MASTER_Msk (0xful << SSPCC_SDH1VSRC_MASTER_Pos) /*!< SSPCC_T::SDH1VSRC: MASTER Mask */ + +#define SSPCC_HSUSBDVSRC_MASTER_Pos (0) /*!< SSPCC_T::HSUSBDVSRC: MASTER Position */ +#define SSPCC_HSUSBDVSRC_MASTER_Msk (0xful << SSPCC_HSUSBDVSRC_MASTER_Pos) /*!< SSPCC_T::HSUSBDVSRC: MASTER Mask */ + +#define SSPCC_NANDCVSRC_MASTER_Pos (0) /*!< SSPCC_T::NANDCVSRC: MASTER Position */ +#define SSPCC_NANDCVSRC_MASTER_Msk (0xful << SSPCC_NANDCVSRC_MASTER_Pos) /*!< SSPCC_T::NANDCVSRC: MASTER Mask */ + +#define SSPCC_PDMA0VSRC_MASTER_Pos (0) /*!< SSPCC_T::PDMA0VSRC: MASTER Position */ +#define SSPCC_PDMA0VSRC_MASTER_Msk (0xful << SSPCC_PDMA0VSRC_MASTER_Pos) /*!< SSPCC_T::PDMA0VSRC: MASTER Mask */ + +#define SSPCC_PDMA1VSRC_MASTER_Pos (0) /*!< SSPCC_T::PDMA1VSRC: MASTER Position */ +#define SSPCC_PDMA1VSRC_MASTER_Msk (0xful << SSPCC_PDMA1VSRC_MASTER_Pos) /*!< SSPCC_T::PDMA1VSRC: MASTER Mask */ + +#define SSPCC_TRNGVSRC_MASTER_Pos (0) /*!< SSPCC_T::TRNGVSRC: MASTER Position */ +#define SSPCC_TRNGVSRC_MASTER_Msk (0xful << SSPCC_TRNGVSRC_MASTER_Pos) /*!< SSPCC_T::TRNGVSRC: MASTER Mask */ + +#define SSPCC_CRYPTOVSRC_MASTER_Pos (0) /*!< SSPCC_T::CRYPTOVSRC: MASTER Position */ +#define SSPCC_CRYPTOVSRC_MASTER_Msk (0xful << SSPCC_CRYPTOVSRC_MASTER_Pos) /*!< SSPCC_T::CRYPTOVSRC: MASTER Mask */ + +#define SSPCC_APB0VA_VIOADDR_Pos (0) /*!< SSPCC_T::APB0VA: VIOADDR Position */ +#define SSPCC_APB0VA_VIOADDR_Msk (0xfffffffful << SSPCC_APB0VA_VIOADDR_Pos) /*!< SSPCC_T::APB0VA: VIOADDR Mask */ + +#define SSPCC_APB3VA_VIOADDR_Pos (0) /*!< SSPCC_T::APB3VA: VIOADDR Position */ +#define SSPCC_APB3VA_VIOADDR_Msk (0xfffffffful << SSPCC_APB3VA_VIOADDR_Pos) /*!< SSPCC_T::APB3VA: VIOADDR Mask */ + +#define SSPCC_SRAM1VA_VIOADDR_Pos (0) /*!< SSPCC_T::SRAM1VA: VIOADDR Position */ +#define SSPCC_SRAM1VA_VIOADDR_Msk (0xfffffffful << SSPCC_SRAM1VA_VIOADDR_Pos) /*!< SSPCC_T::SRAM1VA: VIOADDR Mask */ + +#define SSPCC_SDH0VA_VIOADDR_Pos (0) /*!< SSPCC_T::SDH0VA: VIOADDR Position */ +#define SSPCC_SDH0VA_VIOADDR_Msk (0xfffffffful << SSPCC_SDH0VA_VIOADDR_Pos) /*!< SSPCC_T::SDH0VA: VIOADDR Mask */ + +#define SSPCC_SDH1VA_VIOADDR_Pos (0) /*!< SSPCC_T::SDH1VA: VIOADDR Position */ +#define SSPCC_SDH1VA_VIOADDR_Msk (0xfffffffful << SSPCC_SDH1VA_VIOADDR_Pos) /*!< SSPCC_T::SDH1VA: VIOADDR Mask */ + +#define SSPCC_HSUSBDVA_VIOADDR_Pos (0) /*!< SSPCC_T::HSUSBDVA: VIOADDR Position */ +#define SSPCC_HSUSBDVA_VIOADDR_Msk (0xfffffffful << SSPCC_HSUSBDVA_VIOADDR_Pos) /*!< SSPCC_T::HSUSBDVA: VIOADDR Mask */ + +#define SSPCC_NANDCVA_VIOADDR_Pos (0) /*!< SSPCC_T::NANDCVA: VIOADDR Position */ +#define SSPCC_NANDCVA_VIOADDR_Msk (0xfffffffful << SSPCC_NANDCVA_VIOADDR_Pos) /*!< SSPCC_T::NANDCVA: VIOADDR Mask */ + +#define SSPCC_PDMA0VA_VIOADDR_Pos (0) /*!< SSPCC_T::PDMA0VA: VIOADDR Position */ +#define SSPCC_PDMA0VA_VIOADDR_Msk (0xfffffffful << SSPCC_PDMA0VA_VIOADDR_Pos) /*!< SSPCC_T::PDMA0VA: VIOADDR Mask */ + +#define SSPCC_PDMA1VA_VIOADDR_Pos (0) /*!< SSPCC_T::PDMA1VA: VIOADDR Position */ +#define SSPCC_PDMA1VA_VIOADDR_Msk (0xfffffffful << SSPCC_PDMA1VA_VIOADDR_Pos) /*!< SSPCC_T::PDMA1VA: VIOADDR Mask */ + +#define SSPCC_TRNGVA_VIOADDR_Pos (0) /*!< SSPCC_T::TRNGVA: VIOADDR Position */ +#define SSPCC_TRNGVA_VIOADDR_Msk (0xfffffffful << SSPCC_TRNGVA_VIOADDR_Pos) /*!< SSPCC_T::TRNGVA: VIOADDR Mask */ + +#define SSPCC_CRYPTOVA_VIOADDR_Pos (0) /*!< SSPCC_T::CRYPTOVA: VIOADDR Position */ +#define SSPCC_CRYPTOVA_VIOADDR_Msk (0xfffffffful << SSPCC_CRYPTOVA_VIOADDR_Pos) /*!< SSPCC_T::CRYPTOVA: VIOADDR Mask */ + +#define SSPCC_SINFAEN_SSPCCSIAEN_Pos (0) /*!< SSPCC_T::SINFAEN: SSPCCSIAEN Position */ +#define SSPCC_SINFAEN_SSPCCSIAEN_Msk (0x1ul << SSPCC_SINFAEN_SSPCCSIAEN_Pos) /*!< SSPCC_T::SINFAEN: SSPCCSIAEN Mask */ + +#define SSPCC_SINFAEN_SYSSIAEN_Pos (1) /*!< SSPCC_T::SINFAEN: SYSSIAEN Position */ +#define SSPCC_SINFAEN_SYSSIAEN_Msk (0x1ul << SSPCC_SINFAEN_SYSSIAEN_Pos) /*!< SSPCC_T::SINFAEN: SYSSIAEN Mask */ + +#define SSPCC_SINFAEN_RTCSIAEN_Pos (2) /*!< SSPCC_T::SINFAEN: RTCSIAEN Position */ +#define SSPCC_SINFAEN_RTCSIAEN_Msk (0x1ul << SSPCC_SINFAEN_RTCSIAEN_Pos) /*!< SSPCC_T::SINFAEN: RTCSIAEN Mask */ + +#define SSPCC_SINFAEN_OTPSIAEN_Pos (6) /*!< SSPCC_T::SINFAEN: OTPSIAEN Position */ +#define SSPCC_SINFAEN_OTPSIAEN_Msk (0x1ul << SSPCC_SINFAEN_OTPSIAEN_Pos) /*!< SSPCC_T::SINFAEN: OTPSIAEN Mask */ + +#define SSPCC_SINFAEN_KSSIAEN_Pos (7) /*!< SSPCC_T::SINFAEN: KSSIAEN Position */ +#define SSPCC_SINFAEN_KSSIAEN_Msk (0x1ul << SSPCC_SINFAEN_KSSIAEN_Pos) /*!< SSPCC_T::SINFAEN: KSSIAEN Mask */ + +#define SSPCC_SCWP_ENABLE_Pos (0) /*!< SSPCC_T::SCWP: ENABLE Position */ +#define SSPCC_SCWP_ENABLE_Msk (0x1ul << SSPCC_SCWP_ENABLE_Pos) /*!< SSPCC_T::SCWP: ENABLE Mask */ + +#define SSPCC_SCWP_LOCK_Pos (1) /*!< SSPCC_T::SCWP: LOCK Position */ +#define SSPCC_SCWP_LOCK_Msk (0x1ul << SSPCC_SCWP_LOCK_Pos) /*!< SSPCC_T::SCWP: LOCK Mask */ + +#define SSPCC_SCWP_WVCODE_Pos (16) /*!< SSPCC_T::SCWP: WVCODE Position */ +#define SSPCC_SCWP_WVCODE_Msk (0xfffful << SSPCC_SCWP_WVCODE_Pos) /*!< SSPCC_T::SCWP: WVCODE Mask */ + +/**@}*/ /* SSPCC_CONST */ +/**@}*/ /* end of SSPCC register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __SSPCC_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/sys_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/sys_reg.h new file mode 100644 index 0000000000..0b5cedd15b --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/sys_reg.h @@ -0,0 +1,5816 @@ +/**************************************************************************//** + * @file sys_reg.h + * @brief SYS register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __SYS_REG_H__ +#define __SYS_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup SYS System Manger Controller(SYS) + Memory Mapped Structure for SYS Controller +@{ */ + +typedef struct +{ + + + /** + * @var SYS_T::PDID + * Offset: 0x00 Product and Device Identifier Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PID |Product ID + * | | |This field stores the 16-bit Product ID loaded from OTP memory. + * |[27:16] |DID |Device ID + * | | |This field stores the 8-bit Device ID loaded from OTP memory. + * @var SYS_T::PWRONOTP + * Offset: 0x04 Power-on Setting OTP Source Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PWRONSRC |Power on Setting Source Control (Read Only) + * | | |0 = Power on setting values come from pin. (Default) + * | | |1 = Power on setting values come from OTP. + * |[1] |QSPI0CKSEL|QSPI0_CLK Frequency Selection (Read Only) + * | | |0 = QSPI0_CLK frequency is 30 MHz. + * | | |1 = QSPI0_CLK frequency is 50 MHz. + * | | |Note: The value of WDT0ON latched from OTP when pin nRESET transited from low to high. + * |[2] |WDT0ON |Watchdog Timer 0 ON/OFF Selection (Read Only) + * | | |0 = After power-on, WDT 0 Disabled. + * | | |1 = after power-on WDT 0 Enabled. + * | | |Note: The value of WDT0ON latched from OTP when pin nRESET transited from low to high. + * |[4] |UR0DBGDIS |UART 0 Debug Message Output Disable Bit (Read Only) + * | | |0= UART 0 debug message output Enabled. + * | | |1= UART 0 debug message output Disabled. + * | | |Note: The value of UR0DBGDIS latched from OTP when pin nRESET transited from low to high. + * |[5] |SD0BKEN |SD0 Back Up Boot Enable Bit (Read Only) + * | | |0 = SD0 back up boot Disabled (Default). + * | | |1 = SD0 back up boot Enabled. + * | | |Note: SD0BKEN didn't take effect if BTSRCSEL= 01 and BTOPTION = 00.. + * |[11:10] |BTSRCSEL |Boot Source Selection (Read Only) + * | | |00 = Boot from SPI Flash (Default). + * | | |01 = Boot from SD/eMMC. + * | | |10 = Boot from NAND Flash. + * | | |11 = Boot from USB. + * | | |Note: If PWRONSRC = 0, the value of pin PG[3:2] latched to BTSRCSEL when pin nRESET transited from low to high + * | | |If PWRONSRC = 1, the value of BTSRCSEL latched from OTP's BTSRCSEL. + * |[13:12] |NPAGESEL |NAND Flash Page Size Selection (Read Only) + * | | |00 = NAND Flash page size is 2 KB. + * | | |01 = NAND Flash page size is 4 KB. + * | | |10 = NAND Flash page size is 8 KB. + * | | |11 = Ignore. + * | | |Note: If PWRONSRC = 0, the value of pin PG[5:4] latched to NPAGSEL when pin nRESET transited from low to high + * | | |If PWRONSRC = 1, the value of NPAGSEL latched from OTP's BTNANDPS. + * |[15:14] |MISCCFG |Miscellaneous Configuration (Read Only) + * | | |If BTSRCSEL = 01, boot from SD/eMMC. + * | | |MISCCFG[0]: + * | | |0 = SD0/eMMC0 booting. (Default) + * | | |1 = SD1/eMMC1 booting. + * | | |MISCCFG[1]: + * | | |0 = eMMC 4-bit booting. (Default) + * | | |1 = eMMC 8-bit booting.00 = SD0/eMMC0 booting (Default). + * | | |01 = SD1/eMMC1 booting. + * | | |10 = SD1/eMMC1 booting. + * | | |11 = SD1/eMMC1 booting. + * | | |If BTSRCSEL = 10, boot from NAND Flash. + * | | |00 = No ECC (Default). + * | | |01 = ECC is BCH T12. + * | | |10 = ECC is BCH T24. + * | | |11 = Ignore. + * | | |If BTSRCSEL = 00, the Boot from SPI Flash. + * | | |00 = SPI-NAND Flash with 1-bit mode booting (Default). + * | | |01 = SPI-NAND Flash with 4-bit mode booting. + * | | |10 = SPI-NOR Flash with 1-bit mode booting. + * | | |11 = SPI-NOR Flash with 4-bit mode booting. + * | | |Note: If PWRONSRC = 0, the value of pin PG[7:6] latched to MISCCFG when pin nRESET transited from low to high + * | | |If PWRONSRC = 1, the value of MISCCFG latched from OTP's BTOPTION. + * |[16] |USBP0ID |USB Port 0 ID Pin Status + * | | |0= USB port 0 used as a USB device. + * | | |1= USB port 0 used as a USB host. + * |[31:24] |SECBTPSWD |Secure Boot Disable Password (Read Only) + * | | |If SECBTPSWD is 0x5A, the secure boot Disabled. + * | | |Note 1: SECBTPSWD didn't take effect and PG[0] used as Secure Boot Disable if PWRONSRC = 0. + * | | |Note 2: In RMA mode, SECBTPSWD didn't take effect and PG[0] used as Secure Boot Disable. + * @var SYS_T::PWRONPIN + * Offset: 0x08 Power-on Setting Pin Source Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SECBTDIS |Secure Boot Disable Bit (Read Only) + * | | |0 = Secure Boot Enabled (Default). + * | | |1 = Secure Boot Disabled. + * | | |Note: If PWRONSRC = 0, the value of pin PG[0] latched to SECBTDIS when pin nRESET transited from low to high + * | | |If PWRONSRC = 1, the value of SECBTDIS latched from OTP's SECBTDIS. + * |[3:2] |BTSRCSEL |Boot Source Selection (Read Only) + * | | |00 = Boot from SPI Flash (Default). + * | | |01 = Boot from SD/eMMC. + * | | |10 = Boot from NAND Flash. + * | | |11 = Boot from USB. + * | | |Note: If PWRONSRC = 0, the value of pin PG[3:2] latched to BTSRCSEL when pin nRESET transited from low to high + * | | |If PWRONSRC = 1, the value of BTSRCSEL latched from OTP's BTSRCSEL. + * |[5:4] |NPAGESEL |NAND Flash Page Size Selection (Read Only) + * | | |00 = NAND Flash page size is 2 KB. + * | | |01 = NAND Flash page size is 4 KB. + * | | |10 = NAND Flash page size is 8 KB. + * | | |11 = Ignore. + * | | |Note: If PWRONSRC = 0, the value of pin PG[5:4] latched to NPAGSEL when pin nRESET transited from low to high + * | | |If PWRONSRC = 1, the value of NPAGSEL latched from OTP's BTNANDPS. + * |[7:6] |MISCCFG |Miscellaneous Configuration (Read Only) + * | | |If BTSRCSEL = 01, boot from SD/eMMC. + * | | |MISCCFG[0]: + * | | |0 = SD0/eMMC0 booting. (Default) + * | | |1 = SD1/eMMC1 booting. + * | | |MISCCFG[1]: + * | | |0 = eMMC 4-bit booting. (Default) + * | | |1 = eMMC 8-bit booting.00 = SD0/eMMC0 booting (Default). + * | | |01 = SD1/eMMC1 booting. + * | | |10 = SD1/eMMC1 booting. + * | | |11 = SD1/eMMC1 booting. + * | | |If BTSRCSEL = 10, boot from NAND Flash. + * | | |00 = No ECC (Default). + * | | |01 = ECC is BCH T12. + * | | |10 = ECC is BCH T24. + * | | |11 = Ignore. + * | | |If BTSRCSEL = 00, the Boot from SPI Flash. + * | | |00 = SPI-NAND Flash with 1-bit mode booting (Default). + * | | |01 = SPI-NAND Flash with 4-bit mode booting. + * | | |10 = SPI-NOR Flash with 1-bit mode booting. + * | | |11 = SPI-NOR Flash with 4-bit mode booting. + * | | |Note: If PWRONSRC = 0, the value of pin PG[7:6] latched to MISCCFG when pin nRESET transited from low to high + * | | |If PWRONSRC = 1, the value of MISCCFG latched from OTP's BTOPTION. + * @var SYS_T::RSTSTS + * Offset: 0x10 Reset Source Active Status Register (Shared) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PORF |POR Reset Flag + * | | |0 = No reset from POR. + * | | |1 = POR had issued reset signal to reset the chip. + * | | |Note: Write 1 to clear this bit to 0. + * |[1] |PINRF |NRESET Pin Reset Flag + * | | |0 = No reset from nRESET pin. + * | | |1 = nRESET pin had issued reset signal to reset the chip. + * | | |Note: Write 1 to clear this bit to 0. + * |[2] |WDT0RF |WDT 0 Reset Flag + * | | |The WDT 0 reset flag is set by the "Reset Signal" from the Watchdog Timer 0 or Window Watchdog Timer 0 to indicate the previous reset source. + * | | |0 = No reset from watchdog timer 0 or window watchdog timer 0. + * | | |1 = The watchdog timer 0 or window watchdog timer 0 had issued the reset signal to reset the system. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: Watchdog Timer 0 register RSTF(WDT0_CTL[2]) bit is set if the system has been reset by WDT 0 time-out reset + * | | |Window Watchdog Timer 0 register WWDTRF(WWDT0_STATUS[1]) bit is set if the system has been reset by WWDT 0 time-out reset. + * |[3] |LVRF |LVR Reset Flag + * | | |The LVR reset flag is set by the "Reset Signal" from the Low Voltage Reset Controller to indicate the previous reset source. + * | | |0 = No reset from LVR. + * | | |1 = LVR had issued reset signal to reset the chip. + * | | |Note: Write 1 to clear this bit to 0. + * |[4] |CPU0DBGRF |Cortex-A35 Core 0 Debug Reset Flag + * | | |The Cortex-A35 core 0 debug reset flag is set by the "Reset Signal" from DBGRSTREQ of Cortex-A35 core 0 to indicate the previous reset source. + * | | |0 = No reset from DBGRSTREQ of Cortex-A35 core 0. + * | | |1 = The Cortex-A35 core 0 had issued DBGRSTREQ reset signal to reset itself. + * | | |Note: Write 1 to clear this bit to 0. + * |[5] |CPU0WARMRF|Cortex-A35 Core 0 Warm Reset Flag + * | | |The Cortex-A35 core 0 warm reset flag is set by the "Reset Signal" from WARMRSTREQ of Cortex-A35 core 0 to indicate the previous reset source + * | | |The WARMRSTREQ of Cortex-A35 core 0 trigger by writing 1 to the bit RR (RMR[1], Reset Management Register of Cortex-A35 core 0) + * | | |0 = No reset from WARMRSTREQ of Cortex-A35 core 0. + * | | |1 = The Cortex-A35 core 0 had issued WARMRSTREQ reset signal to reset itself. + * | | |Note: Write 1 to clear this bit to 0. + * |[6] |HRESETRF |HRESET Reset Flag + * | | |The HRESET reset flag is set by the "Reset Signal" from the HRESET. + * | | |0 = No reset from HRESET. + * | | |1 = Reset from HRESET. + * | | |Note: Write 1 to clear this bit to 0. + * |[7] |CPU0RF |CPU 0 Reset Flag + * | | |The CPU 0 reset flag is set by hardware if software writes CA35CR0RST (SYS_IPRST0[1]) 1 to reset Cortex-A35 Core 0. + * | | |0 = No reset to CPU. + * | | |1 = The Cortex-A35 Core 0 is reset by software setting CA35CR0RST (SYS_IPRST0[1]) to 1. + * | | |Note: Write 1 to clear this bit to 0. + * |[10] |WDT1RF |WDT 1 Reset Flag + * | | |The WDT 1 reset flag is set by the "Reset Signal" from the Watchdog Timer 1 or Window Watchdog Timer 1 to indicate the previous reset source. + * | | |0 = No reset from watchdog timer 1 or window watchdog timer 1. + * | | |1 = The watchdog timer 1 or window watchdog timer 1 had issued the reset signal to reset the system. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: Watchdog Timer 1 register RSTF (WDT1_CTL[2]) bit is set if the system has been reset by WDT 1 time-out reset + * | | |Window Watchdog Timer 1 register WWDTRF (WWDT1_STATUS[1]) bit is set if the system has been reset by WWDT 1 time-out reset. + * | | |Note 3: This flag only take effect when WDT1RSTAEN (SYS_MISCRFCR[16]) is 1. + * |[11] |WDT2RFA |WDT 2 Reset Flag for Cortex-A35 + * | | |The WDT 2 reset flag is set by the "Reset Signal" from the Watchdog Timer 2 or Window Watchdog Timer 2 to indicate the previous reset source. + * | | |0 = No reset from watchdog timer 2 or window watchdog timer 2. + * | | |1 = The watchdog timer 2 or window watchdog timer 2 had issued the reset signal to reset the system. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: Watchdog Timer 2 register RSTF(WDT2_CTL[2]) bit is set if the system has been reset by WDT 2 time-out reset + * | | |Window Watchdog Timer 2 register WWDTRF(WWDT2_STATUS[1]) bit is set if the system has been reset by WWDT 2 time-out reset. + * | | |Note 3: This flag only take effect when WDT2RSTAEN (SYS_MISCRFCR[17]) is 1. + * |[12] |CPU1DBGRF |Cortex-A35 Core 1 Debug Reset Flag + * | | |The Cortex-A35 core 1 debug reset flag is set by the "Reset Signal" from DBGRSTREQ of Cortex-A35 core 1 to indicate the previous reset source. + * | | |0 = No reset from DBGRSTREQ of Cortex-A35 core 1. + * | | |1 = The Cortex-A35 core 1 had issued DBGRSTREQ reset signal to reset itself. + * | | |Note: Write 1 to clear this bit to 0. + * |[13] |CPU1WARMRF|Cortex-A35 Core 1 Warm Reset Flag + * | | |The Cortex-A35 core 1 warm reset flag is set by the "Reset Signal" from WARMRSTREQ of Cortex-A35 core 1 to indicate the previous reset source + * | | |The WARMRSTREQ of Cortex-A35 core 1 trigger by writing 1 to the bit RR (RMR[1], Reset Management Register of Cortex-A35 core 1) + * | | |0 = No reset from WARMRSTREQ of Cortex-A35 core 1. + * | | |1 = The Cortex-A35 core 1 had issued WARMRSTREQ reset signal to reset itself. + * | | |Note: Write 1 to clear this bit to 0. + * |[15] |CPU1RF |Cortex-A35 Core 1 Reset Flag + * | | |The Cortex-A35 Core 1 reset flag is set by hardware if software writes CA35CR1RST (SYS_IPRST0[2]) 1 to reset Cortex-A35 Core 1. + * | | |0 = No reset to Cortex-A35 Core 1. + * | | |1 = The Cortex-A35 Core 1 is reset by software setting CA35CR1RST (SYS_IPRST0[2]) to 1. + * | | |Note: Write 1 to clear this bit to 0. + * |[18] |WDT1RFM |WDT 1 Reset Flag for RTP Cortex-M4 + * | | |The WDT 1 reset flag is set by the "Reset Signal" from the Watchdog Timer 1 or Window Watchdog Timer 1 to indicate the previous reset source. + * | | |0 = No reset from watchdog timer 1 or window watchdog timer 1. + * | | |1 = The watchdog timer 1 or window watchdog timer 1 had issued the reset signal to reset the system. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: Watchdog Timer 1 register RSTF(WDT1_CTL[2]) bit is set if the system has been reset by WDT 1 time-out reset + * | | |Window Watchdog Timer 1 register WWDTRF(WWDT1_STATUS[1]) bit is set if the system has been reset by WWDT 1 time-out reset. + * | | |Note 3: This flag only take effect when WDT1RSTMEN (SYS_MISCRFCR[18]) is 1. + * |[19] |WDT2RF |WDT 2 Reset Flag for RTP Cortex-M4 + * | | |The WDT 2 reset flag is set by the "Reset Signal" from the Watchdog Timer 2 or Window Watchdog Timer 2 to indicate the previous reset source. + * | | |0 = No reset from watchdog timer 2 or window watchdog timer 2. + * | | |1 = The watchdog timer 2 or window watchdog timer 2 had issued the reset signal to reset the system. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: Watchdog Timer 2 register RSTF(WDT2_CTL[2]) bit is set if the system has been reset by WDT 2 time-out reset + * | | |Window Watchdog Timer 2 register WWDTRF(WWDT2_STATUS[1]) bit is set if the system has been reset by WWDT 2 time-out reset. + * |[20] |RTPM4LKRF |RTP M4 CPU Lockup Reset Flag + * | | |0 = No reset from RTP M4 CPU lockup happened. + * | | |1 = The RTP Cortex-M4 lockup happened and chip is reset. + * | | |Note 1: Write 1 to clear this bit to 0. + * | | |Note 2: When CPU lockup happened under ICE is connected, this flag will set to 1 but chip will not reset. + * |[21] |RTPM4SYSRF|RTP M4 System Reset Flag + * | | |The system reset flag is set by the "Reset Signal" from the Cortex-M4 Core to indicate the previous reset source. + * | | |0 = No reset from Cortex-M4. + * | | |1 = The Cortex-M4 had issued the reset signal to reset the system by writing 1 to the bit SYSRESETREQ(AIRCR[2], Application Interrupt and Reset Control Register, address = 0xE000ED0C) in system control registers of Cortex-M4 core. + * | | |Note: Write 1 to clear this bit to 0. + * |[22] |RTPPMUSYSRF|RTP PMU System Reset Flag + * | | |The system reset flag is set by the "Reset Signal" from the PMU of Cortex-M4 Core to indicate the previous reset source. + * | | |0 = No reset from PMU of Cortex-M4. + * | | |1 = The PMU of Cortex-M4 had issued the reset signal (PMURESETREQ) to reset the system. + * | | |Note: Write 1 to clear this bit to 0. + * |[23] |RTPM4CPURF|RTP M4 CPU Reset Flag + * | | |The RTP M4 CPU reset flag is set by hardware if software writes CM4RST (SYS_IPRST0[3]) 1 to reset Cortex-M4 Core. + * | | |0 = No reset to RTP M4 CPU. + * | | |1 = The RTP M4 CPU core is reset by software setting CM4RST (SYS_IPRST0[3]) to 1. + * | | |Note: Write 1 to clear this bit to 0. + * @var SYS_T::MISCRFCR + * Offset: 0x14 Miscellaneous Reset Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PORDISCODE|Power-on-reset Disable Code (Write Protect) + * | | |When powered on, the Power-On-Reset (POR) circuit generates a reset signal to reset whole chip function + * | | |However, after power is ready, the POR circuit would consume a few power + * | | |To minimize the POR circuit power consumption, user to disable POR circuit by writing 0x5AA5 to this field. + * | | |The POR circuit will become active again when this field is set to other value or chip is reset by other reset source, including /RESET pin, Watchdog, LVR reset and the software chip reset function. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[16] |WDT1RSTAEN|WDT 1 Reset Cortex-A35 Enable Bit (Write Protect) + * | | |0 = WDT 1 reset Cortex-A35 Disabled. (Default) + * | | |1 = WDT 1 reset Cortex-A35 Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[17] |WDT2RSTAEN|WDT 2 Reset Cortex-A35 Enable Bit (Write Protect) + * | | |0 = WDT 2 reset Cortex-A35 Disabled. (Default) + * | | |1 = WDT 2 reset Cortex-A35 Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[18] |WDT1RSTMEN|WDT 1 Reset Real Time Cortex-M4 Sub-system Enable Bit (Write Protect) + * | | |0 = WDT 1 reset real time Cortex-M4 sub-system Disabled. (Default) + * | | |1 = WDT 1 reset real time Cortex-M4 sub-system Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * @var SYS_T::RSTDEBCTL + * Offset: 0x18 Reset Pin De-bounce Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |DEBCNT |Power-on-reset Disable Code (Write Protect) + * | | |This 16-bit external RESET De-bounce Counter can specify the external RESET de-bounce time up to around 5.46ms (0xFFFF) @ XIN=12 MHz. + * | | |The default external RESET de-bounce time is 0.1ms (0x04B0) @ XIN = 12 MHz. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[31] |RSTDEBEN |Reset Pin De-bounce Enable Bit (Write Protect) + * | | |0 = Reset pin de-bounce Disabled. + * | | |1 = Reset pin de-bounce Enabled. (Default) + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * @var SYS_T::LVRDCR + * Offset: 0x1C Low Voltage Reset & Detect Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |LVREN |Low Voltage Reset Enable Bit (Write Protect) + * | | |0 = Low voltage reset function Disabled. + * | | |1 = Low voltage reset function Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[3:1] |LVRDGSEL |LVR Output De-glitch Time Select (Write Protect) + * | | |000 = Without de-glitch function. + * | | |001 = 4 system clock (LVRDGCLK). + * | | |010 = 8 system clock (LVRDGCLK). + * | | |011 = 16 system clock (LVRDGCLK). + * | | |100 = 32 system clock (LVRDGCLK). + * | | |101 = 64 system clock (LVRDGCLK). + * | | |110 = 128 system clock (LVRDGCLK). + * | | |111 = 256 system clock (LVRDGCLK). + * | | |Note 1: These bits are write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: Refer to LVRDBSEL (CLK_CLKSEL0[3]) for LVRDGCLK clock source selection. + * |[8] |LVDEN |Low Voltage Detect Enable Bit (Write Protect) + * | | |0 = Low voltage detect function Disabled. + * | | |1 = Low voltage detect function Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[9] |LVDSEL |Low Voltage Detect Threshold Selection (Write Protect) + * | | |0 = Low voltage detection level is 2.8V. + * | | |1 = Low voltage detection level is 2.6V. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[10] |LVDWKA35EN|Low Voltage Detect Wake-up Cortex-A35 Enable Control Bit (Write Protect) + * | | |0 = Low voltage detection wakeup A35 Disabled. + * | | |1 = Low voltage detection wakeup A35 Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[11] |LVDWKRTPEN|Low Voltage Detect Wake-up RTP Cortex-M4 Enable Control Bit (Write Protect) + * | | |0 = Low voltage detection wakeup RTP Cortex-M4 Disabled. + * | | |1 = Low voltage detection wakeup RTP Cortex-M4 Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[14:12] |LVDODGSEL |LVD Output De-glitch Time Select (Write Protect) + * | | |000 = Without de-glitch function. + * | | |001 = 4 system clock (LVRDGCLK). + * | | |010 = 8 system clock (LVRDGCLK). + * | | |011 = 16 system clock (LVRDGCLK). + * | | |100 = 32 system clock (LVRDGCLK). + * | | |101 = 64 system clock (LVRDGCLK). + * | | |110 = 128 system clock (LVRDGCLK). + * | | |111 = 256 system clock (LVRDGCLK). + * | | |Note 1: These bits are write protected. Refer to the SYS_RLKTZS register. + * | | |Note 2: Refer to LVRDBSEL (CLK_CLKSEL0[3]) for LVRDGCLK clock source selection. + * @var SYS_T::IPRST0 + * Offset: 0x20 Reset Control Register 0 (Shared) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CHIPRST |Chip One-shot Reset Enable Bit (Write Protect) + * | | |0 = Chip one-shot reset Disabled. + * | | |1 = Chip one-shot reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[1] |CA35CR0RST|Cortex-A35 Core 0 One-shot Reset (Write Protect) + * | | |0 = Cortex-A35 core 0 one-shot reset Disabled. + * | | |1 = Cortex-A35 core 0 one-shot reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[2] |CA35CR1RST|Cortex-A35 Core 1 One-shot Reset (Write Protect) + * | | |0 = Cortex-A35 core 1 one-shot reset Disabled. + * | | |1 = Cortex-A35 core 1 one-shot reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[3] |CM4RST |Cortex-M4 Core Reset (Write Protect) + * | | |0 = Cortex-M4 core reset Disabled. + * | | |1 = Cortex-M4 core reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[4] |PDMA0RST |PDMA 0 Reset Enable Bit (Write Protect) + * | | |0 = PDMA 0 reset Disabled. + * | | |1 = PDMA 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[5] |PDMA1RST |PDMA 1 Reset Enable Bit (Write Protect) + * | | |0 = PDMA 1 reset Disabled. + * | | |1 = PDMA 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[6] |PDMA2RST |PDMA2 Reset Enable Bit (Write Protect) + * | | |0 = PDMA 2 reset Disabled. + * | | |1 = PDMA 2 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[7] |PDMA3RST |PDMA 3 Reset Enable Bit (Write Protect) + * | | |0 = PDMA 3 reset Disabled. + * | | |1 = PDMA 3 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[9] |DISPCRST |LCD Display Controller Reset Enable Bit (Write Protect) + * | | |0 = LCD Display Controller reset Disabled. + * | | |1 = LCD Display Controller reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[10] |VCAP0RST |Video Capture Sensor Interface 0 Reset Enable Bit (Write Protect) + * | | |0 = Video Capture sensor interface 0 reset Disabled. + * | | |1 = Video Capture sensor interface 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[11] |VCAP1RST |Video Capture Sensor Interface 1 Reset Enable Bit (Write Protect) + * | | |0 = Video Capture sensor interface 1 reset Disabled. + * | | |1 = Video Capture sensor interface 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[12] |GFXRST |Graphic Engine Reset Enable Bit (Write Protect) + * | | |0 = Graphic Engine reset Disabled. + * | | |1 = Graphic Engine reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[13] |VDECRST |Video Decoder Reset Enable Bit (Write Protect) + * | | |0 = Video Decoder (H.264/JPEG) reset Disabled. + * | | |1 = Video Decoder (H.264/JPEG) reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[14] |WRHO0RST |Wormhole 0 Reset Enable Bit (Write Protect) + * | | |0 = Wormhole 0 reset Disabled. + * | | |1 = Wormhole 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[15] |WRHO1RST |Wormhole 1 Reset Enable Bit (Write Protect) + * | | |0 = Wormhole 1 reset Disabled. + * | | |1 = Wormhole 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[16] |GMAC0RST |Gigabit Ethernet MAC 0 Reset Enable Bit (Write Protect) + * | | |0 = Gigabit Ethernet MAC 0 reset Disabled. + * | | |1 = Gigabit Ethernet MAC 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[17] |GMAC1RST |Gigabit Ethernet MAC 1 Reset Enable Bit (Write Protect) + * | | |0 = Gigabit Ethernet MAC 1 reset Disabled. + * | | |1 = Gigabit Ethernet MAC 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[18] |HWSEMRST |Hardware Semaphore Reset Enable Bit (Write Protect) + * | | |0 = Hardware Semaphore reset Disabled. + * | | |1 = Hardware Semaphore reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[19] |EBIRST |EBI Controller Reset (Write Protect) + * | | |0 = EBI controller reset Disabled. + * | | |1 = EBI controller reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[20] |HSUSBH0RST|High-speed USB Host Controller 0 Reset Enable Bit (Write Protect) + * | | |0 = High-Speed USB host controller 0 reset Disabled. + * | | |1 = High-Speed USB host controller 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[21] |HSUSBH1RST|High-speed USB Host Controller 1 Reset Enable Bit (Write Protect) + * | | |0 = High-Speed USB host controller 1 reset Disabled. + * | | |1 = High-Speed USB host controller 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[22] |HSUSBDRST |High-speed USB Device Controller Reset Enable Bit (Write Protect) + * | | |0 = High-Speed USB device controller reset Disabled. + * | | |1 = High-Speed USB device controller reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[24] |SDH0RST |SDIO Controller 0 Reset Enable Bit (Write Protect) + * | | |0 = SDIO controller 0 reset Disabled. + * | | |1 = SDIO controller 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[25] |SDH1RST |SDIO Controller 1 Reset Enable Bit (Write Protect) + * | | |0 = SDIO controller 1 reset Disabled. + * | | |1 = SDIO controller 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[26] |NANDRST |NAND Flash Controller Reset Enable Bit (Write Protect) + * | | |0 = NAND Flash controller reset Disabled. + * | | |1 = NAND Flash controller reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[27] |GPIORST |GPIO Reset Enable Bit (Write Protect) + * | | |0 = GPIO reset Disabled. + * | | |1 = GPIO reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[28] |MCTLPRST |DDR Memory Controller MCTL2 APB Interface Reset Enable Bit (Write Protect) + * | | |Write 1 to enable MCTL2 APB reset to reset APB interface logic of MCTL2. + * | | |Write 0 to trigger a reset disable procedure and this bit cleared automatically after 128 pclk. + * | | |0 = DDR Memory Controller MCTL2 APB interface reset Disabled. + * | | |1 = DDR Memory Controller MCTL2 APB interface reset Enabled. + * | | |Note 1: Once trigger reset disable procedure, it's necessary to poll MCTLPRST till its 0. + * | | |Note 2: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[29] |MCTLCRST |DDR Memory Controller MCTL2 Core Reset Enable Bit (Write Protect) + * | | |0 = DDR Memory Controller MCTL2 core reset Disabled. + * | | |1 = DDR Memory Controller MCTL2 core reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[30] |DDRPUBRST |DDR PHY PUB Reset Enable Bit (Write Protect) + * | | |0 = DDR PHY PUB reset Disabled. + * | | |1 = DDR PHY PUB reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * @var SYS_T::IPRST1 + * Offset: 0x24 Reset Control Register 1 (Shared) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2] |TMR0RST |TIMER 0 Reset Enable Bit (Write Protect) + * | | |0 = TIMER 0 reset Disabled. + * | | |1 = TIMER 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[3] |TMR1RST |TIMER 1 Reset Enable Bit (Write Protect) + * | | |0 = TIMER 1 reset Disabled. + * | | |1 = TIMER 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[4] |TMR2RST |TIMER 2 Reset Enable Bit (Write Protect) + * | | |0 = TIMER 2 reset Disabled. + * | | |1 = TIMER 2 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[5] |TMR3RST |TIMER 3 Reset Enable Bit (Write Protect) + * | | |0 = TIMER 3 reset Disabled. + * | | |1 = TIMER 3 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[8] |I2C0RST |I2C 0 Reset Enable Bit (Write Protect) + * | | |0 = I2C 0 reset Disabled. + * | | |1 = I2C 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[9] |I2C1RST |I2C 1 Reset Enable Bit (Write Protect) + * | | |0 = I2C 1 reset Disabled. + * | | |1 = I2C 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[10] |I2C2RST |I2C 2 Reset Enable Bit (Write Protect) + * | | |0 = I2C 2 reset Disabled. + * | | |1 = I2C 2 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[11] |I2C3RST |I2C 3 Reset Enable Bit (Write Protect) + * | | |0 = I2C 3 reset Disabled. + * | | |1 = I2C 3 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[12] |QSPI0RST |QSPI 0 Reset Enable Bit (Write Protect) + * | | |0 = QSPI 0 reset Disabled. + * | | |1 = QSPI 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[13] |SPI0RST |SPI 0 Reset Enable Bit (Write Protect) + * | | |0 = SPI 0 reset Disabled. + * | | |1 = SPI 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[14] |SPI1RST |SPI 1 Reset Enable Bit (Write Protect) + * | | |0 = SPI 1 reset Disabled. + * | | |1 = SPI 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[15] |SPI2RST |SPI 2 Reset Enable Bit (Write Protect) + * | | |0 = SPI 2 reset Disabled. + * | | |1 = SPI 2 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[16] |UART0RST |UART 0 Reset Enable Bit (Write Protect) + * | | |0 = UART 0 reset Disabled. + * | | |1 = UART 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[17] |UART1RST |UART 1 Reset Enable Bit (Write Protect) + * | | |0 = UART 1 reset Disabled. + * | | |1 = UART 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[18] |UART2RST |UART 2 Reset Enable Bit (Write Protect) + * | | |0 = UART 2 reset Disabled. + * | | |1 = UART 2 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[19] |UART3RST |UART 3 Reset Enable Bit (Write Protect) + * | | |0 = UART 3 reset Disabled. + * | | |1 = UART 3 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[20] |UART4RST |UART 4 Reset Enable Bit (Write Protect) + * | | |0 = UART 4 reset Disabled. + * | | |1 = UART 4 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[21] |UART5RST |UART 5 Reset Enable Bit (Write Protect) + * | | |0 = UART 5 reset Disabled. + * | | |1 = UART 5 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[22] |UART6RST |UART 6 Reset Enable Bit (Write Protect) + * | | |0 = UART 6 reset Disabled. + * | | |1 = UART 6 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[23] |UART7RST |UART 7 Reset Enable Bit (Write Protect) + * | | |0 = UART 7 reset Disabled. + * | | |1 = UART 7 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[24] |CANFD0RST |CAN FD 1 Reset Enable Bit (Write Protect) + * | | |0 = CAN FD 1 reset Disabled. + * | | |1 = CAN FD 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[25] |CANFD1RST |CAN FD 1 Reset Enable Bit (Write Protect) + * | | |0 = CAN FD 1 reset Disabled. + * | | |1 = CAN FD 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[28] |EADC0RST |EADC 0 Reset Enable Bit (Write Protect) + * | | |0 = EADC 0 reset Disabled. + * | | |1 = EADC 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[29] |I2S0RST |I2S 0 Reset Enable Bit (Write Protect) + * | | |0 = I2S 0 reset Disabled. + * | | |1 = I2S 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * @var SYS_T::IPRST2 + * Offset: 0x28 Reset Control Register 2 (Shared) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SC0RST |SC 0 Reset Enable Bit (Write Protect) + * | | |0 = SC 0 reset Disabled. + * | | |1 = SC 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[1] |SC1RST |SC 1 Reset Enable Bit (Write Protect) + * | | |0 = SC 1 reset Disabled. + * | | |1 = SC 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[4] |QSPI1RST |QSPI 1 Reset Enable Bit (Write Protect) + * | | |0 = QSPI 1 reset Disabled. + * | | |1 = QSPI 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[6] |SPI3RST |SPI 3 Reset Enable Bit (Write Protect) + * | | |0 = SPI 3 reset Disabled. + * | | |1 = SPI 3 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[16] |EPWM0RST |EPWM 0 Reset Enable Bit (Write Protect) + * | | |0 = EPWM 0 reset Disabled. + * | | |1 = EPWM 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[17] |EPWM1RST |EPWM 1 Reset Enable Bit (Write Protect) + * | | |0 = EPWM 1 reset Disabled. + * | | |1 = EPWM 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[22] |QEI0RST |QEI 0 Reset Enable Bit (Write Protect) + * | | |0 = QEI 0 reset Disabled. + * | | |1 = QEI 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[23] |QEI1RST |QEI 1 Reset Enable Bit (Write Protect) + * | | |0 = QEI 1 reset Disabled. + * | | |1 = QEI 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[26] |ECAP0RST |ECAP 0 Reset Enable Bit (Write Protect) + * | | |0 = ECAP 0 reset Disabled. + * | | |1 = ECAP 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[27] |ECAP1RST |ECAP 1 Reset Enable Bit (Write Protect) + * | | |0 = ECAP 1 reset Disabled. + * | | |1 = ECAP 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[28] |CANFD2RST |CAN FD 2 Reset Enable Bit (Write Protect) + * | | |0 = CAN FD 2 reset Disabled. + * | | |1 = CAN FD 2 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[31] |ADC0RST |ADC 0 Reset Enable Bit (Write Protect) + * | | |0 = ADC 0 reset Disabled. + * | | |1 = ADC 0 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * @var SYS_T::IPRST3 + * Offset: 0x2C Reset Control Register 3 (Shared) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TMR4RST |TIMER 4 Reset Enable Bit (Write Protect) + * | | |0 = TIMER 4 reset Disabled. + * | | |1 = TIMER 4 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[1] |TMR5RST |TIMER 5 Reset Enable Bit (Write Protect) + * | | |0 = TIMER 5 reset Disabled. + * | | |1 = TIMER 5 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[2] |TMR6RST |TIMER 6 Reset Enable Bit (Write Protect) + * | | |0 = TIMER 6 reset Disabled. + * | | |1 = TIMER 6 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[3] |TMR7RST |TIMER 7 Reset Enable Bit (Write Protect) + * | | |0 = TIMER 7 reset Disabled. + * | | |1 = TIMER 7 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[4] |TMR8RST |TIMER 8 Reset Enable Bit (Write Protect) + * | | |0 = TIMER 8 reset Disabled. + * | | |1 = TIMER 8 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[5] |TMR9RST |TIMER 9 Reset Enable Bit (Write Protect) + * | | |0 = TIMER 9 reset Disabled. + * | | |1 = TIMER 9 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[6] |TMR10RST |TIMER 10 Reset Enable Bit (Write Protect) + * | | |0 = TIMER 10 reset Disabled. + * | | |1 = TIMER 10 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[7] |TMR11RST |TIMER 11 Reset Enable Bit (Write Protect) + * | | |0 = TIMER 11 reset Disabled. + * | | |1 = TIMER 11 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[8] |UART8RST |UART 8 Reset Enable Bit (Write Protect) + * | | |0 = UART 8 reset Disabled. + * | | |1 = UART 8 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[9] |UART9RST |UART 9 Reset Enable Bit (Write Protect) + * | | |0 = UART 9 reset Disabled. + * | | |1 = UART 9 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[10] |UART10RST |UART 10 Reset Enable Bit (Write Protect) + * | | |0 = UART 10 reset Disabled. + * | | |1 = UART 10 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[11] |UART11RST |UART 11 Reset Enable Bit (Write Protect) + * | | |0 = UART 11 reset Disabled. + * | | |1 = UART 11 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[12] |UART12RST |UART 12 Reset Enable Bit (Write Protect) + * | | |0 = UART 12 reset Disabled. + * | | |1 = UART 12 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[13] |UART13RST |UART 13 Reset Enable Bit (Write Protect) + * | | |0 = UART 13 reset Disabled. + * | | |1 = UART 13 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[14] |UART14RST |UART 14 Reset Enable Bit (Write Protect) + * | | |0 = UART 14 reset Disabled. + * | | |1 = UART 14 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[15] |UART15RST |UART 15 Reset Enable Bit (Write Protect) + * | | |0 = UART 15 reset Disabled. + * | | |1 = UART 15 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[16] |UART16RST |UART 16 Reset Enable Bit (Write Protect) + * | | |0 = UART 16 reset Disabled. + * | | |1 = UART 16 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[17] |I2S1RST |I2S 1 Reset Enable Bit (Write Protect) + * | | |0 = I2S 1 reset Disabled. + * | | |1 = I2S 1 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[18] |I2C4RST |I2C 4 Reset Enable Bit (Write Protect) + * | | |0 = I2C 4 reset Disabled. + * | | |1 = I2C 4reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[19] |I2C5RST |I2C 5 Reset Enable Bit (Write Protect) + * | | |0 = I2C 5 reset Disabled. + * | | |1 = I2C 5 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[20] |EPWM2RST |EPWM 2 Reset Enable Bit (Write Protect) + * | | |0 = EPWM 2 reset Disabled. + * | | |1 = EPWM 2 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[21] |ECAP2RST |ECAP 2 Reset Enable Bit (Write Protect) + * | | |0 = ECAP 2 reset Disabled. + * | | |1 = ECAP 2 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[22] |QEI2RST |QEI 2 Reset Enable Bit (Write Protect) + * | | |0 = QEI 2 reset Disabled. + * | | |1 = QEI 2 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[23] |CANFD3RST |CAN FD 3 Reset Enable Bit (Write Protect) + * | | |0 = CAN FD 3 reset Disabled. + * | | |1 = CAN FD 3 reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[24] |KPIRST |KPI Reset Enable Bit (Write Protect) + * | | |0 = KPI reset Disabled. + * | | |1 = KPI reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[28] |GICRST |GIC Reset Enable Bit (Write Protect) + * | | |0 = GIC reset Disabled. + * | | |1 = GIC reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[30] |SSMCCRST |SSMCC Reset Enable Bit (Write Protect) + * | | |0 = SSMCC reset Disabled. + * | | |1 = SSMCC reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[31] |SSPCCRST |SSPCC Reset Enable Bit (Write Protect) + * | | |0 = SSPCC reset Disabled. + * | | |1 = SSPCC reset Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * @var SYS_T::PMUCR + * Offset: 0x30 Power Management Unit Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |A35PGEN |Cortex-A35 Power Gating Enable (Write Protect) + * | | |0 = Cortex-A35 dual core power gating Disabled. + * | | |1 = Cortex-A35 dual core power gating Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[4] |AUTOL2FDIS|Automatic L2 Cache Flush Disable (Write Protect) + * | | |0 = Automatic L2 cache flush Enabled. + * | | |1 = Automatic L2 cache flush Disabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[6] |PDWKDLY |Wake-up Delay Counter Enable Bit (Write Protect) + * | | |When the Cortex-A35 wakes up from Power-down mode, the clock control will delay certain clock cycles to wait system clock stable. + * | | |The delayed clock cycle is 4096 clock cycles when chip works at 24 Mhz external high speed crystal oscillator (HXT), and 256 clock cycles when chip works at 12 MHz internal high speed RC oscillator (HIRC). + * | | |0 = Wake-up delay counter Disabled. + * | | |1 = Wake-up delay counter Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[11:8] |PWRSTBTM |Power Gating Acknowledgement Stable Time (Write Protect) + * | | |The PWRSTBTM indicates the stable time after receiving power gating acknowledgement. + * | | |0000 = 5us (Default). + * | | |0001 = 10us. + * | | |0010 = 20us. + * | | |0011 = 40us. + * | | |0100 = 60us. + * | | |0101 = 80us. + * | | |0110 = 100us. + * | | |0111 = 200us. + * | | |1000 = 400us. + * | | |1001 = 600us. + * | | |1010 = 800us. + * | | |1011 = 1ms. + * | | |1100 = 2ms. + * | | |1101 = 4ms. + * | | |1110 = 5.4ms. + * | | |1111 = 0us. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[15:12] |PWRACKTO |Power Gating Acknowledgement Time Out Selection (Write Protect) + * | | |0000 = 20us (Default). + * | | |0001 = 30us. + * | | |0010 = 40us. + * | | |0011 = 50us. + * | | |0100 = 60us. + * | | |0101 = 80us. + * | | |0110 = 100us. + * | | |0111 = 200us. + * | | |1000 = 400us. + * | | |1001 = 600us. + * | | |1010 = 800us. + * | | |1011 = 1ms. + * | | |1100 = 2ms. + * | | |1101 = 4ms. + * | | |1110 = 5.4ms. + * | | |1111 = 0us. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[16] |A35PDEN |Cortex-A35 Power Down Enable Bit (Write Protect) + * | | |When this bit is set to 1, Power-down mode is enabled and the chip keeps active till the CPU sleep mode is also active and then the chip enters Power-down mode. + * | | |When chip wakes up from Power-down mode, this bit is auto cleared + * | | |Users need to set this bit again for next Power-down. + * | | |In Power-down mode, HXT, HIRC, HIRC48, PLL and system clock will be disabled and ignored the clock source selection + * | | |The clocks of peripheral are not controlled by Power-down mode, if the peripheral clock source is from LXT or LIRC. + * | | |0 = Chip operating normally or chip in idle mode because of WFI command. + * | | |1 = Chip waits CPU sleep command WFI and then enters Power-down mode. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[18] |A35DBPDEN |Cortex-A35 Entering Power-down Even ICE Connected (Write Protect) + * | | |0 = Cortex-A35 does not enter Power-down during Debug mode. + * | | |1 = Cortex-A35 enters power-down in Debug mode. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[24] |RTPPDEN |RTP M4 Power Down Enable (Write Protect) + * | | |When this bit is set to 1, Power-down mode is enabled and the chip keeps active till the CPU sleep mode is also active and then the chip enters Power-down mode. + * | | |When chip wakes up from Power-down mode, this bit is auto cleared + * | | |Users need to set this bit again for next Power-down. + * | | |In Power-down mode, HXT, HIRC, HIRC48, PLL and system clock will be disabled and ignored the clock source selection + * | | |The clocks of peripheral are not controlled by Power-down mode, if the peripheral clock source is from LXT or LIRC. + * | | |0 = Chip operating normally or chip in idle mode because of WFI command. + * | | |1 = Chip waits CPU sleep command WFI and then enters Power-down mode. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[26] |RTPDBPDEN |RTP M4 Entering Power-down Even ICE Connected (Write Protect) + * | | |0 = RTP M4 does not enter Power-down during Debug mode. + * | | |1 = RTP M4 enters power-down in Debug mode. + * | | |Note: This bit is write protected. Refer to the SYS_RLKSUBM register. + * @var SYS_T::DDRCQCSR + * Offset: 0x34 DDR Controller Q Channel Control and Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |AXIQBYPAS |DDR Controller AXI Port 7 ~ Port 0 Q Channel Handshake Bypass (Write Protect) + * | | |The AXIQBYPAS indicates to bypass DDR controller's AXI port Q channel handshake mechanism + * | | |The each bit of AXIQBYPAS is for corresponding AXI port of DDR controller. + * | | |AXIQBYPAS[x] + * | | |0 = Q channel handshake mechanism of AXI port x Not Bypassed (x=0, 1, ?? 7). + * | | |1 = Q channel handshake mechanism of AXI port x Bypassed (x=0, 1, ?? 7). + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[15:8] |AXIQDENYIF|DDR Controller AXI Port 7 ~ Port 0 Q Channel Interrupt Flag + * | | |0 = Q channel power down request accept by DDR controller AXI port x (x=0, 1, ?? 7). + * | | |1 = Q channel power down request reject by DDR controller AXI port x, AXI port x wouldn't enter low power mode and clock of AXI port x keep clocking (x=0, 1, ?? 7). + * |[16] |DDRCQBYPAS|DDR Controller Core Q Channel Handshake Bypass (Write Protect) + * | | |0 = Q channel handshake of DDR controller core Not Bypassed. + * | | |1 = Q channel handshake of DDR controller core Bypassed. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[17] |DDRCQDENYIF|DDR Controller Core Q Channel Deny Interrupt Flag + * | | |0 = Q channel power down request accept by DDR controller core. + * | | |1 = Q channel power down request reject by DDR controller core and DDR controller wouldn't enter self-refresh mode. + * |[27:24] |DDRQREQDLY|DDR Controller Q Channel Request Delay Time Selection (Write Protect) + * | | |0000 = 20us (Default). + * | | |0001 = 30us. + * | | |0010 = 40us. + * | | |0011 = 50us. + * | | |0100 = 60us. + * | | |0101 = 80us. + * | | |0110 = 100us. + * | | |0111 = 200us. + * | | |1000 = 400us. + * | | |1001 = 600us. + * | | |1010 = 800us. + * | | |1011 = 1ms. + * | | |1100 = 2ms. + * | | |1101 = 3ms. + * | | |1110 = 5.4ms. + * | | |1111 = 0us. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[31:28] |DDRQACKTO |DDR Controller Q Channel Acknowledgement Time Out Selection (Write Protect) + * | | |0000 = 20us (Default). + * | | |0001 = 30us. + * | | |0010 = 40us. + * | | |0011 = 50us. + * | | |0100 = 60us. + * | | |0101 = 80us. + * | | |0110 = 100us. + * | | |0111 = 200us. + * | | |1000 = 400us. + * | | |1001 = 600us. + * | | |1010 = 800us. + * | | |1011 = 1ms. + * | | |1100 = 2ms. + * | | |1101 = 3ms. + * | | |1110 = 5.4ms. + * | | |1111 = 0us. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * @var SYS_T::PMUIEN + * Offset: 0x38 Power Management Unit Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PMUIEN |PMU Interrupt Enable Control Bit (Write Protect) + * | | |0 = PMU interrupt Disabled. + * | | |1 = PMU interrupt Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[8] |A35PDWKIEN|Cortex-A35 Power-down Wake-up Interrupt Enable Control Bit (Write Protect) + * | | |0 = Cortex-a35 wake-up interrupt Disabled. + * | | |1 = Cortex-a35 wake-up interrupt Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKTZS register. + * |[12] |RTPPDWKIEN|RTP M4 Power-down Wake-up Interrupt Enable Control Bit (Write Protect) + * | | |0 = RTP M4 wake-up interrupt Disabled. + * | | |1 = RTP M4 wake-up interrupt Enabled. + * | | |Note: This bit is write protected. Refer to the SYS_RLKSUBM register. + * @var SYS_T::PMUSTS + * Offset: 0x3C Power Management Unit Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PMUIF |PMU Interrupt Flag + * | | |When PMUIEN high, this bit high to indicate that PGTOIF, DDRCQDENYIF or AXIQDENYIF is active + * | | |When PMUIEN low, this bit didn't take effect. + * | | |0 = PGTOIF, DDRCQDENYIF and AXIQDENYIF are not active. + * | | |1 = PGTOIF, DDRCQDENYIF or AXIQDENYIF is active. + * |[1] |PGTOIF |Power Gating Time Out Interrupt Flag + * | | |0 = Power gating acknowledgement counter is not time-out yet. + * | | |1 = Power gating acknowledgement counter is time-out. + * |[5] |L2FDONE |Cortex-A35 L2 Cache Flush Done Status + * | | |0 = Cortex-A35 L2 cache flush didn't finish yet. + * | | |1 = Cortex-A35 L2 cache flush done. + * |[8] |A35PDWKIF |Cortex-A35 Power-down Wake-up Interrupt Flag + * | | |0 = Cortex-A35 didn't wake-up from power-down mode. + * | | |1 = Cortex-A35 receive a wake-up event and wake-up from power-down mode. + * |[12] |RTPPDWKIF |RTP M4 Power-down Wake-up Interrupt Flag + * | | |0 = RTP M4 didn't wake-up from power-down mode. + * | | |1 = RTP M4 receive a wake-up event and wake-up from power-down mode. + * |[31:16] |PWRACKCNT |Power Gating Acknowledgement Timing Counter Value + * | | |The PWRACKCNT show the value of power gating acknowledgement time-out counter. + * @var SYS_T::CA35WRBADR0 + * Offset: 0x40 Cortexu00AE-A35 Core 0 Warm-boot Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |WRMBTADDR |Warm Boot Address + * | | |The WRMBTADDR indicates the warm boot run address for Cortex-A35 Core 0. + * @var SYS_T::CA35WRBPAR0 + * Offset: 0x44 Cortexu00AE-A35 Core 0 Warm-boot Parameter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |WRMBTPARA |Warm Boot Parameter + * | | |The WRMBTPARA indicates the warm boot parameters for Cortex-A35 Core 0. + * @var SYS_T::CA35WRBADR1 + * Offset: 0x48 Cortexu00AE-A35 Core 1 Warm-boot Address Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |WRMBTADDR |Warm Boot Address + * | | |The WRMBTADDR indicates the warm boot run address for Cortex-A35 Core 1. + * @var SYS_T::CA35WRBPAR1 + * Offset: 0x4C Cortexu00AE-A35 Core 1 Warm-boot Parameter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |WRMBTPARA |Warm Boot Parameter + * | | |The WRMBTPARA indicates the warm boot parameters for Cortex-A35 Core 1. + * @var SYS_T::USBPMISCR + * Offset: 0x60 USB PHY Miscellaneous Control Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PHY0POR |USB 2.0 Port 0 High-speed PHY Power-On Reset Control Bit + * | | |0 = All test registers and state machines in the USB 2.0 port 0 high-speed PHY are not in reset state. + * | | |1 = All test registers and state machines in the USB 2.0 port 0 high-speed PHY are in reset state. + * |[1] |PHY0SUSPEND|USB 2.0 Port 0 High-speed PHY Suspend Control Bit + * | | |0 = USB 2.0 port 0 high-speed PHY is in Suspend mode. + * | | |1 = USB 2.0 port 0 high-speed PHY is in Normal operating mode. + * |[2] |PHY0COMN |USB 2.0 Port 0 High-speed PHY Common Block Power-Down Control Bit + * | | |0 = In Suspend or Sleep modes, the REFCLK_LOGIC, Bias and PLL blocks of USB 2.0 port 0 high-speed PHY remain powered + * | | |With this setting, the input reference clock must remain on and valid during suspend or sleep. + * | | |1 = In Suspend mode, the REFCLK_LOGIC, Bias and PLL blocks of USB 2.0 port 0 high-speed PHY are powered down + * | | |In Sleep mode, the Bias and PLL blocks of USB 2.0 port 0 high-speed PHY are powered down. + * |[6:4] |VBUSDGSEL |VBUS Detect De-glitch Time Select + * | | |000 = Without de-glitch function. + * | | |001 = 4 HIRC clock. + * | | |010 = 8 HIRC clock. + * | | |011 = 16 HIRC clock. + * | | |100 = 32 HIRC clock. + * | | |101 = 64 HIRC clock. + * | | |110 = 128 HIRC clock. + * | | |111 = 256 HIRC clock. + * |[7] |EFUSESEL0 |USB 2.0 Port 0 High-speed PHY Resistor Calibration with External Resistor Control Bit + * | | |0 = An external resistor (REXT) is needed and internal digital calibration code is based on REXT. + * | | |1 = Enable the internal resistor method with RCALCODE1 resistance control up to +/- 18%, allowing the removal of the REXT resistor. + * |[8] |PHY0HSTCKSTB|USB 2.0 Port 0 High-speed PHY 60 MHz UTMI Interface Clock for Host Stable Flag + * | | |0 = USB 2.0 port 0 high-speed PHY UTMI Interface clock for Host is not stable. + * | | |1 = USB 2.0 port 0 high-speed PHY UTMI Interface clock for Host is stable. + * |[9] |PHY0CK12MSTB|USB 2.0 Port 0 High-speed PHY 12 MHz Clock Stable Flag + * | | |0 = USB 2.0 port 0 high-speed PHY 12 MHz clock is not stable. + * | | |1 = USB 2.0 port 0 high-speed PHY 12 MHz clock is stable. + * |[10] |PHY0DEVCKSTB|USB 2.0 Port 0 High-speed PHY 60 MHz UTMI Interface Clock for Device Stable Flag + * | | |0 = USB 2.0 port 0 high-speed PHY UTMI Interface clock for Device is not stable. + * | | |1 = USB 2.0 port 0 high-speed PHY UTMI Interface clock for Device is stable. + * |[11] |RTUNESEL0 |USB 2.0 Port 0 High-speed PHY Source Impedance Tuning Method Selection + * | | |0 = Internal digital calibration codes are used for tuning the high-speed source impedance. + * | | |1 = The RCALCODE0 value is used for tuning the high-speed source impedance. + * |[15:12] |RCALCODE0 |USB 2.0 Port 0 High-Speed PHY Internal Resistor Trim Code + * | | |If RTUNESEL0 = 1, RCALCODE0 provides the tuning code for high-speed source impedance directly. + * | | |If RTUNESEL0 = 0, RCALCODE0 provides the tuning code for on-chip resistor within +/- 18% resistance tuning range. + * | | |0000 = +18% (236 u03A9). + * | | |0001 = +15.6%. + * | | |0010 = +13.2%. + * | | |0011 = +10.8%. + * | | |0100 = +8.4%. + * | | |0101 = +6%. + * | | |0110 = +3.6%. + * | | |0111 = +1.2%. + * | | |1000 = -1.2%. + * | | |1001 = -3.6%. + * | | |1010 = -6%. + * | | |1011 = -8.4%. + * | | |1100 = -10.8%. + * | | |1101 = -13.2%. + * | | |1110 = -15.6%. + * | | |1111 = -18% (164 u03A9). + * |[16] |PHY1POR |USB 2.0 Port 1 High-speed PHY Power-On Reset Control Bit + * | | |0 = All test registers and state machines in the USB 2.0 port 1 high-speed PHY are not in reset state. + * | | |1 = All test registers and state machines in the USB 2.0 port 1 high-speed PHY are in reset state. + * |[17] |PHY1SUSPEND|USB 2.0 Port 1 High-speed PHY Suspend Control Bit + * | | |0 = USB 2.0 port 1 high-speed PHY is in Suspend mode. + * | | |1 = USB 2.0 port 1 high-speed PHY is in Normal operating mode. + * |[18] |PHY1COMN |USB 2.0 Port 1 High-speed PHY Common Block Power-Down Control Bit + * | | |0 = In Suspend or Sleep modes, the REFCLK_LOGIC, Bias and PLL blocks of USB 2.0 port 1 high-speed PHY remain powered + * | | |With this setting, the input reference clock must remain on and valid during suspend or sleep. + * | | |1 = In Suspend mode, the REFCLK_LOGIC, Bias and PLL blocks of USB 2.0 port 1 high-speed PHY are powered down + * | | |In Sleep mode, the Bias and PLL blocks of USB 2.0 port 1 high-speed PHY are powered down. + * |[23] |EFUSESEL1 |USB 2.0 Port 1 High-speed PHY Resistor Calibration with External Resistor Control Bit + * | | |0 = An external resistor (REXT) is needed and internal digital calibration code is based on REXT. + * | | |1 = Enable the internal resistor method with RCALCODE1 resistance control up to +/- 18%, allowing the removal of the REXT resistor. + * |[24] |PHY1HSTCKSTB|USB 2.0 Port 1 High-speed PHY 60 MHz UTMI Interface Clock for Host Stable Flag + * | | |0 = USB 2.0 port 1 high-speed PHY UTMI Interface clock for Host is not stable. + * | | |1 = USB 2.0 port 1 high-speed PHY UTMI Interface clock for Host is stable. + * |[25] |PHY1CK12MSTB|USB 2.0 Port 1 High-speed PHY 12 MHz Clock Stable Flag + * | | |0 = USB 2.0 port 1 high-speed PHY 12 MHz clock is not stable. + * | | |1 = USB 2.0 port 1 high-speed PHY 12 MHz clock is stable. + * |[27] |RTUNESEL1 |USB 2.0 Port 1 High-speed PHY Source Impedance Tuning Method Selection + * | | |0 = Internal digital calibration codes are used for tuning the high-speed source impedance. + * | | |1 = The RCALCODE1 value is used for tuning the high-speed source impedance. + * |[31:28] |RCALCODE1 |USB 2.0 Port 1 High-Speed PHY Internal Resistor Trim Code + * | | |If RTUNESEL1 = 1, RCALCODE1 provides the tuning code for high-speed source impedance directly. + * | | |If RTUNESEL1 = 0, RCALCODE1 provides the tuning code for on-chip resistor within +/- 18% resistance tuning range. + * | | |0000 = +18% (236 u03A9). + * | | |0001 = +15.6%. + * | | |0010 = +13.2%. + * | | |0011 = +10.8%. + * | | |0100 = +8.4%. + * | | |0101 = +6%. + * | | |0110 = +3.6%. + * | | |0111 = +1.2%. + * | | |1000 = -1.2%. + * | | |1001 = -3.6%. + * | | |1010 = -6%. + * | | |1011 = -8.4%. + * | | |1100 = -10.8%. + * | | |1101 = -13.2%. + * | | |1110 = -15.6%. + * | | |1111 = -18% (164 u03A9). + * @var SYS_T::USBP0PCR + * Offset: 0x64 USB Port 0 PHY Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |COMPDISTUNE|USB 2.0 High-speed Disconnect Threshold Adjustment + * | | |The SQRXTUNE adjusts the voltage level for the threshold used to detect a disconnect event at the host. + * | | |000 = -5.48%. + * | | |001 = 0. (Default) + * | | |010 = +6.04%. + * | | |011 = +12.75%. + * | | |100 = +19.66%. + * | | |101 = +28.24%. + * | | |110 = +38.31%. + * | | |111 = +50.28%. + * |[3] |EQBYPASSENB|USB 2.0 High-speed PHY Squelch Equalizer Bypass Control Bit + * | | |0 = Equalizer is Enabled. + * | | |1 = Equalizer is bypassed and acts as a simple differential input amplifier. + * |[6:4] |SQRXTUNE |USB 2.0 High-speed PHY Squelch Threshold Adjustment + * | | |The SQRXTUNE adjusts the voltage level for the threshold used to detect valid high-speed data. + * | | |000 = +15.5%. + * | | |001 = +10.87%. + * | | |010 = +5.86%. + * | | |011 = 0 (Default). + * | | |100 = -5.86%. + * | | |101 = -13.33%. + * | | |110 = -21.56%. + * | | |111 = -31.54%. + * |[7] |TXPREEMPPULSETUNE|USB 2.0 High-speed PHY Squelch Equalizer Bypass Control Bit + * | | |0 = Equalizer is Enabled. + * | | |1 = Equalizer is bypassed and acts as a simple differential input amplifier. + * |[11:8] |PLLPTUNE |USB 2.0 High-speed PHY PLL Proportional Path Tune + * | | |The value of PLLPTUNE should be keep in default. + * | | |0000 = 4.0x. + * | | |0001 = 4.5x. + * | | |0010 = 5.0x. + * | | |0011 = 5.5x. + * | | |0100 = 6.0x. + * | | |0101 = 6.5x. + * | | |0110 = 7.0x. + * | | |0111 = 7.5x. + * | | |1000 = 8.0x. + * | | |1001 = 8.5x. + * | | |1010 = 9.0x. + * | | |1011 = 9.5x. + * | | |1100 = 10.0x (Default). + * | | |1101 = 10.5x. + * | | |1110 = 11.0x. + * | | |1111 = 11.5x. + * |[15:12] |TXFSLSTUNE|USB 2.0 High-speed PHY FS/LS Source Impedance Adjustment + * | | |The TXFSLSTUNE adjusts the low- and full-speed single-ended source impedance while driving high. + * | | |0000 = +14.2%. + * | | |0001 = +6.60% + * | | |0011 = 0 (Default). + * | | |0111 = -5.48% + * | | |1111 = -10.29% + * |[17:16] |PLLITUNE |USB 2.0 High-speed PHY Integral Path Tune + * | | |The value of PLLITUNE should be keep in default. + * | | |00 = 1.0x (Default). + * | | |01 = 2.0x + * | | |10 = 3.0x + * | | |11 = 4.0x + * |[21:20] |TXPREEMPAMPTUNE|USB 2.0 High-speed PHY HS Transmitter Pre-Emphasis Current Control + * | | |00 = HS Transmitter pre-emphasis is disabled. (Default) + * | | |01 = HS Transmitter pre-emphasis circuit sources 1x pre-emphasis current. + * | | |10 = HS Transmitter pre-emphasis circuit sources 2x pre-emphasis current. + * | | |11 = HS Transmitter pre-emphasis circuit sources 3x pre-emphasis current. + * |[23:22] |TXRISETUNE|USB 2.0 High-speed PHY HS Transmitter Rise/Fall Time Adjustment + * | | |The TXRISETUNE adjusts the rise/fall times of the high-speed waveform. + * | | |00 = +7.34%. + * | | |01 = 0 (Default) + * | | |10 = -5.98%. + * | | |11 = -7.49% + * |[27:24] |TXVREFTUNE|USB 2.0 High-speed PHY HS DC Voltage Level Adjustment + * | | |The TXVREFTUNE adjusts the high-speed DC level voltage. + * | | |0000 = -9.37%. + * | | |0001 = -6.24%. + * | | |0010 = -3.12%. + * | | |0011 = 0 (Default) + * | | |0100 = +2.75%. + * | | |0101 = +5.87%. + * | | |0110 = +8.99%. + * | | |0111 = +12.11%. + * | | |1000 = +14.71%. + * | | |1001 = +17.82%. + * | | |1010 = +20.94%. + * | | |1011 = +24.06%. + * | | |1100 = +26.81%. + * | | |1101 = +29.94%. + * | | |1110 = +33.06%. + * | | |1111 = +36.18%. + * |[29:28] |TXHSXVTUNE|USB 2.0 High-speed PHY Transmitter High-Speed Crossover Adjustment + * | | |The TXHSXVTUNE adjusts the voltage at which the DP and DM signals cross while transmitting in HS mode. + * | | |00 = Reserved + * | | |01 = -9.16mV + * | | |10 = +9.42mV + * | | |11 = 0 (Default) + * |[31:30] |TXRESTUNE |USB 2.0 High-speed PHY USB Source Impedance Adjustment + * | | |00 = Source Impedance is increased by approximately 3.03 u03A9 + * | | |01 = 0 (Default) + * | | |10 = Source Impedance is increased by approximately 2.11 u03A9 + * | | |11 = Source Impedance is increased by approximately 4.51 u03A9 + * @var SYS_T::USBP1PCR + * Offset: 0x68 USB Port 1 PHY Control Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |COMPDISTUNE|USB 2.0 High-speed Disconnect Threshold Adjustment + * | | |The SQRXTUNE adjusts the voltage level for the threshold used to detect a disconnect event at the host. + * | | |000 = -5.48%. + * | | |001 = 0. (Default) + * | | |010 = +6.04%. + * | | |011 = +12.75%. + * | | |100 = +19.66%. + * | | |101 = +28.24%. + * | | |110 = +38.31%. + * | | |111 = +50.28%. + * |[3] |EQBYPASSENB|USB 2.0 High-speed PHY Squelch Equalizer Bypass Control Bit + * | | |0 = Equalizer is Enabled. + * | | |1 = Equalizer is bypassed and acts as a simple differential input amplifier. + * |[6:4] |SQRXTUNE |USB 2.0 High-speed PHY Squelch Threshold Adjustment + * | | |The SQRXTUNE adjusts the voltage level for the threshold used to detect valid high-speed data. + * | | |000 = +15.5%. + * | | |001 = +10.87%. + * | | |010 = +5.86%. + * | | |011 = 0 (Default). + * | | |100 = -5.86%. + * | | |101 = -13.33%. + * | | |110 = -21.56%. + * | | |111 = -31.54%. + * |[7] |TXPREEMPPULSETUNE|USB 2.0 High-speed PHY Squelch Equalizer Bypass Control Bit + * | | |0 = Equalizer is Enabled. + * | | |1 = Equalizer is bypassed and acts as a simple differential input amplifier. + * |[11:8] |PLLPTUNE |USB 2.0 High-speed PHY PLL Proportional Path Tune + * | | |The value of PLLPTUNE should be keep in default. + * | | |0000 = 4.0x. + * | | |0001 = 4.5x. + * | | |0010 = 5.0x. + * | | |0011 = 5.5x. + * | | |0100 = 6.0x. + * | | |0101 = 6.5x. + * | | |0110 = 7.0x. + * | | |0111 = 7.5x. + * | | |1000 = 8.0x. + * | | |1001 = 8.5x. + * | | |1010 = 9.0x. + * | | |1011 = 9.5x. + * | | |1100 = 10.0x (Default). + * | | |1101 = 10.5x. + * | | |1110 = 11.0x. + * | | |1111 = 11.5x. + * |[15:12] |TXFSLSTUNE|USB 2.0 High-speed PHY FS/LS Source Impedance Adjustment + * | | |The TXFSLSTUNE adjusts the low- and full-speed single-ended source impedance while driving high. + * | | |0000 = +14.2%. + * | | |0001 = +6.60% + * | | |0011 = 0 (Default). + * | | |0111 = -5.48% + * | | |1111 = -10.29% + * |[17:16] |PLLITUNE |USB 2.0 High-speed PHY Integral Path Tune + * | | |The value of PLLITUNE should be keep in default. + * | | |00 = 1.0x (Default). + * | | |01 = 2.0x + * | | |10 = 3.0x + * | | |11 = 4.0x + * |[21:20] |TXPREEMPAMPTUNE|USB 2.0 High-speed PHY HS Transmitter Pre-Emphasis Current Control + * | | |00 = HS Transmitter pre-emphasis is disabled. (Default) + * | | |01 = HS Transmitter pre-emphasis circuit sources 1x pre-emphasis current. + * | | |10 = HS Transmitter pre-emphasis circuit sources 2x pre-emphasis current. + * | | |11 = HS Transmitter pre-emphasis circuit sources 3x pre-emphasis current. + * |[23:22] |TXRISETUNE|USB 2.0 High-speed PHY HS Transmitter Rise/Fall Time Adjustment + * | | |The TXRISETUNE adjusts the rise/fall times of the high-speed waveform. + * | | |00 = +7.34%. + * | | |01 = 0 (Default) + * | | |10 = -5.98%. + * | | |11 = -7.49% + * |[27:24] |TXVREFTUNE|USB 2.0 High-speed PHY HS DC Voltage Level Adjustment + * | | |The TXVREFTUNE adjusts the high-speed DC level voltage. + * | | |0000 = -9.37%. + * | | |0001 = -6.24%. + * | | |0010 = -3.12%. + * | | |0011 = 0 (Default) + * | | |0100 = +2.75%. + * | | |0101 = +5.87%. + * | | |0110 = +8.99%. + * | | |0111 = +12.11%. + * | | |1000 = +14.71%. + * | | |1001 = +17.82%. + * | | |1010 = +20.94%. + * | | |1011 = +24.06%. + * | | |1100 = +26.81%. + * | | |1101 = +29.94%. + * | | |1110 = +33.06%. + * | | |1111 = +36.18%. + * |[29:28] |TXHSXVTUNE|USB 2.0 High-speed PHY Transmitter High-Speed Crossover Adjustment + * | | |The TXHSXVTUNE adjusts the voltage at which the DP and DM signals cross while transmitting in HS mode. + * | | |00 = Reserved + * | | |01 = -9.16mV + * | | |10 = +9.42mV + * | | |11 = 0 (Default) + * |[31:30] |TXRESTUNE |USB 2.0 High-speed PHY USB Source Impedance Adjustment + * | | |00 = Source Impedance is increased by approximately 3.03 u03A9 + * | | |01 = 0 (Default) + * | | |10 = Source Impedance is increased by approximately 2.11 u03A9 + * | | |11 = Source Impedance is increased by approximately 4.51 u03A9 + * @var SYS_T::MISCFCR0 + * Offset: 0x70 Miscellaneous Function Control Register 0 (Shared) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RTPICACHEN|Real-time Cortex-M4 Processor Instruction Cache Enable Bit (SUBM) + * | | |0 = Real-Time Cortex-M4 processor instruction cache Disabled. + * | | |1 = Real-Time Cortex-M4 processor instruction cache Enabled. + * |[1] |RTPDCACHEN|Real-time Cortex-M4 Processor Data Cache Enable Bit (SUBM) + * | | |0 = Real-Time Cortex-M4 processor data cache Disabled. + * | | |1 = Real-Time Cortex-M4 processor data cache Enabled. + * |[8] |WDT0RSTEN |WatchDog Timer 0 Reset Connection Enable Bit + * | | |This bit is use to enable the function that connect watch-dog timer 0 reset to nRESET pin + * | | |If this bit is enabled, the watch-dog timer 0 reset is connected to nRESET pin internally + * | | |0 = Watch-dog timer 0 reset not connected to nRESET pin internally. + * | | |1 = Watch-dog timer 0 reset connected to nRESET pin internally. + * |[9] |HDSPUEN |HDS Pin Internal Pull-up Enable Bit (TZNS) + * | | |0 = HDS pin internal pull-up resister Disabled. + * | | |1 = HDS pin internal pull-up resister Enabled. + * |[12] |UHOVRCURH |USB Host Overcurrent Detection High Active (TZNS) + * | | |0 = USB host overcurrent detection signal is low active. + * | | |1 = USB host overcurrent detection signal is high active. + * |[13] |SELFTEST |Self-test Mode Enable Bit + * | | |0 = Self-Test mode Disabled. + * | | |1 = Self-Test mode Enabled. + * |[14] |WDT1RSTEN |WatchDog Timer 1 Reset Connection Enable Bit (TZNS) + * | | |This bit is use to enable the function that connect watch-dog timer 1 reset to nRESET pin + * | | |If this bit is enabled, the watch-dog timer 1 reset is connected to nRESET pin internally + * | | |0 = Watch-dog timer 1 reset not connected to nRESET pin internally. + * | | |1 = Watch-dog timer 1 reset connected to nRESET pin internally. + * |[15] |WDT2RSTEN |WatchDog Timer 2 Reset Connection Enable Bit (SUBM) + * | | |This bit is use to enable the function that connect watch-dog timer 2 reset to nRESET pin + * | | |If this bit is enabled, the watch-dog timer 2 reset is connected to nRESET pin internally + * | | |0 = Watch-dog timer 2 reset not connected to nRESET pin internally. + * | | |1 = Watch-dog timer 2 reset connected to nRESET pin internally. + * |[16] |SDH0VSTB |Voltage Stable Indicator to SDH 0 (TZNS) + * | | |Set this bit high to indicate SDH 0 that I/O voltage is stable. + * | | |0 = Voltage of I/O used as SDH 0 is not stable. + * | | |1 = Voltage of I/O used as SDH 0 is stable. + * |[17] |SDH1VSTB |Voltage Stable Indicator to SDH 1 (TZNS) + * | | |Set this bit high to indicate SDH 1 that I/O voltage is stable. + * | | |0 = Voltage of I/O used as SDH 1 is not stable. + * | | |1 = Voltage of I/O used as SDH 1 is stable. + * |[18] |VBUSWKEN |HSUSBD VBUS Detect Wakeup Enable Control Bit (TZNS) + * | | |0 = HSUSBD VBUS detect wakeup system from Power-down mode Disabled. + * | | |1 = HSUSBD VBUS detect wakeup system from Power-down mode Enabled. + * |[19] |LNSTWKEN |HSUSBD Line State Wakeup Enable Control Bit (TZNS) + * | | |0 = HSUSBD line state wakeup system from Power-down mode Disabled. + * | | |1 = HSUSBD line state wakeup system from Power-down mode Enabled. + * |[23] |DDRCGDIS |DDR Controller Core Clock Gating Disable Bit + * | | |0 = DDR controller core clock gating in auto self-refresh mode Enabled. + * | | |1 = DDR controller core clock gating in auto self-refresh mode Disabled. + * | | |Note: This register needs to be set to 1'b1 to bypass clock gating function of DDR core clock before user writes/reads control registers or status registers of DDR memory controller. + * | | |Therefore the signals in PCLK domain of DDR memory controller can be synchronous to core clock domain of DDR memory controller, and the signals in core clock domain of DDR memory controller can be synchronous to PCLK domain of DDR memory controller correctly. + * | | |After user writes/reads control registers or status registers of DDR memory controller, this register can be set to 1'b0 to enable clock gating function of DDR core clock. + * |[31:24] |DRATSRDLY |DDR Auto Self Refresh Delay Count + * | | |This register uses to set the delay cycles of DDR memory controller before the core clock of DDR memory controller is gating + * | | |It allows for the self-refresh status to propagate to the APB domain so the STAT.selfref_type register field also reflects the status. + * | | |It is sufficient to set this delay cycles to 31 cycles normally + * | | |In particular, if the AXI frequency is much less than the DDRC frequency, a higher value may be required in order to ensure that all read data is synchronized to the AXI domain before the clock is removed. + * | | |Note: User can set this register value during core reset of DDR memory controller is asserted (i.e + * | | |MCTLCRST (SYS_IPRST0[29]) set to 1'b1). + * @var SYS_T::MISCFCR1 + * Offset: 0x74 Miscellaneous Function Control Register 1 (Shared) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CANFD0PDEN|CAN FD 0 Power Down Enable Bit + * | | |0 = CAN FD 0 Power-down mode Disabled. + * | | |1 = CAN FD 0 Power-down mode Enabled. + * |[1] |CANFD1PDEN|CAN FD 1 Power Down Enable Bit + * | | |0 = CAN FD 1 Power-down mode Disabled. + * | | |1 = CAN FD 1 Power-down mode Enabled. + * |[2] |CANFD2PDEN|CAN FD 2 Power Down Enable Bit + * | | |0 = CAN FD 2 Power-down mode Disabled. + * | | |1 = CAN FD 2 Power-down mode Enabled. + * |[3] |CANFD3PDEN|CAN FD 3 Power Down Enable Bit + * | | |0 = CAN FD 3 Power-down mode Disabled. + * | | |1 = CAN FD 3 Power-down mode Enabled. + * |[4] |CANFD0CKSTP|CAN FD 0 Clock Stop Acknowledgement (Read Only) + * | | |0 = CAN FD 0 clock didn't stop. + * | | |1 = CAN FD 0 clock stop. + * |[5] |CANFD1CKSTP|CAN FD 1 Clock Stop Acknowledgement (Read Only) + * | | |0 = CAN FD 1 clock didn't stop. + * | | |1 = CAN FD 1 clock stop. + * |[6] |CANFD2CKSTP|CAN FD 2 Clock Stop Acknowledgement (Read Only) + * | | |0 = CAN FD 2 clock didn't stop. + * | | |1 = CAN FD 2 clock stop. + * |[7] |CANFD3CKSTP|CAN FD 3 Clock Stop Acknowledgement (Read Only) + * | | |0 = CAN FD 3 clock didn't stop. + * | | |1 = CAN FD 3 clock stop. + * |[9:8] |HXTDS |HXT Driving Current Selection (Write Protect) + * | | |00 = Low power consumption mode for 2.5V~3.3V operating voltage. + * | | |01 = High noise immunity mode for 2.5V~3.3V operating voltage. + * | | |10 = Low power consumption mode for 1.8V~2.5V operating voltage. + * | | |11 = High noise immunity mode for 1.8V~2.5V operating voltage. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[15:12] |TSENSRTRIM|Temperature Sensor VTRIM (Write Protect) + * | | |Trimming for temperature sensor calibration. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[16] |RMEL1RAM |Cortex-A35 L1 Cache SRAM Macro RME Control Bit (Write Protect) + * | | |0 = Default read-write margin of Cortex-A35 L1 cache SRAM selected. + * | | |1 = High speed read-write margin of Cortex-A35 L1 cache SRAM selected. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * |[17] |RMESYSRAM |System SRAM Macro RME Control Bit (Write Protect) + * | | |0 = Default read-write margin of system SRAM selected. + * | | |1 = High speed read-write margin of system SRAM selected. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS, SYS_RLKTZNS or SYS_RLKSUBM register according to security attribute of each circuit. + * @var SYS_T::MISCIER + * Offset: 0x78 Miscellaneous Interrupt Enable Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |LVDIEN |Low Voltage Detect Interrupt Enable Bit + * | | |0 = Low voltage detect interrupt Disabled. + * | | |1 = Low voltage detect interrupt Enabled. + * |[1] |USB0IDCHGIEN|USB0_ID Pin Status Change Interrupt Enable Bit + * | | |0 = USB0_ID pin status change interrupt Disabled. + * | | |1 = USB0_ID pin status change interrupt Enabled. + * |[2] |VBUSCHGIEN|USUSB0_VBUSVLD Pin Status Change Interrupt Enable Bit + * | | |0 = USUSB0_VBUSVLD pin status change interrupt Disabled. + * | | |1 = USUSB0_VBUSVLD pin status change interrupt Enabled. + * @var SYS_T::MISCISR + * Offset: 0x7C Miscellaneous Interrupt Status Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |LVDIF |Low Voltage Detect Interrupt Flag + * | | |0 = No low voltage event. + * | | |1 = Low voltage event detected. + * |[1] |USB0IDCHGIF|USB0_ID Pin State Change Interrupt Flag + * | | |0 = USB0_ID state didn't change. + * | | |1 = USB0_ID state changed from low to high or from high to low. + * |[2] |VBUSCHGIF |USUSB0_VBUSVLD Pin State Change Interrupt Flag + * | | |0 = USUSB0_VBUSVLD pin state didn't change. + * | | |1 = USUSB0_VBUSVLD pin state changed from low to high or from high to low. + * |[16] |LVDSTS |Low Voltage Detect State + * | | |0 = Low voltage detect state is low. + * | | |1 = Low voltage detect state is high. + * |[17] |USB0IDSTS |USB0_ID Pin State + * | | |0 = USB port 0 used as a USB device port. + * | | |1 = USB port 0 used as a USB host port. + * |[18] |VBUSSTS |VBUS Detect Pin State + * | | |0 = VBUS detect pin state is low. + * | | |1 = VBUS detect pin state is high. + * @var SYS_T::GPA_MFPL + * Offset: 0x80 GPIOA Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PA0MFP |PA.0 Multi-function Pin Selection + * |[7:4] |PA1MFP |PA.1 Multi-function Pin Selection + * |[11:8] |PA2MFP |PA.2 Multi-function Pin Selection + * |[15:12] |PA3MFP |PA.3 Multi-function Pin Selection + * |[19:16] |PA4MFP |PA.4 Multi-function Pin Selection + * |[23:20] |PA5MFP |PA.5 Multi-function Pin Selection + * |[27:24] |PA6MFP |PA.6 Multi-function Pin Selection + * |[31:28] |PA7MFP |PA.7 Multi-function Pin Selection + * @var SYS_T::GPA_MFPH + * Offset: 0x84 GPIOA High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PA8MFP |PA.8 Multi-function Pin Selection + * |[7:4] |PA9MFP |PA.9 Multi-function Pin Selection + * |[11:8] |PA10MFP |PA.10 Multi-function Pin Selection + * |[15:12] |PA11MFP |PA.11 Multi-function Pin Selection + * |[19:16] |PA12MFP |PA.12 Multi-function Pin Selection + * |[23:20] |PA13MFP |PA.13 Multi-function Pin Selection + * |[27:24] |PA14MFP |PA.14 Multi-function Pin Selection + * |[31:28] |PA15MFP |PA.15 Multi-function Pin Selection + * @var SYS_T::GPB_MFPL + * Offset: 0x88 GPIOB Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PB0MFP |PB.0 Multi-function Pin Selection + * |[7:4] |PB1MFP |PB.1 Multi-function Pin Selection + * |[11:8] |PB2MFP |PB.2 Multi-function Pin Selection + * |[15:12] |PB3MFP |PB.3 Multi-function Pin Selection + * |[19:16] |PB4MFP |PB.4 Multi-function Pin Selection + * |[23:20] |PB5MFP |PB.5 Multi-function Pin Selection + * |[27:24] |PB6MFP |PB.6 Multi-function Pin Selection + * |[31:28] |PB7MFP |PB.7 Multi-function Pin Selection + * @var SYS_T::GPB_MFPH + * Offset: 0x8C GPIOB High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PB8MFP |PB.8 Multi-function Pin Selection + * |[7:4] |PB9MFP |PB.9 Multi-function Pin Selection + * |[11:8] |PB10MFP |PB.10 Multi-function Pin Selection + * |[15:12] |PB11MFP |PB.11 Multi-function Pin Selection + * |[19:16] |PB12MFP |PB.12 Multi-function Pin Selection + * |[23:20] |PB13MFP |PB.13 Multi-function Pin Selection + * |[27:24] |PB14MFP |PB.14 Multi-function Pin Selection + * |[31:28] |PB15MFP |PB.15 Multi-function Pin Selection + * @var SYS_T::GPC_MFPL + * Offset: 0x90 GPIOC Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PC0MFP |PC.0 Multi-function Pin Selection + * |[7:4] |PC1MFP |PC.1 Multi-function Pin Selection + * |[11:8] |PC2MFP |PC.2 Multi-function Pin Selection + * |[15:12] |PC3MFP |PC.3 Multi-function Pin Selection + * |[19:16] |PC4MFP |PC.4 Multi-function Pin Selection + * |[23:20] |PC5MFP |PC.5 Multi-function Pin Selection + * |[27:24] |PC6MFP |PC.6 Multi-function Pin Selection + * |[31:28] |PC7MFP |PC.7 Multi-function Pin Selection + * @var SYS_T::GPC_MFPH + * Offset: 0x94 GPIOC High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PC8MFP |PC.8 Multi-function Pin Selection + * |[7:4] |PC9MFP |PC.9 Multi-function Pin Selection + * |[11:8] |PC10MFP |PC.10 Multi-function Pin Selection + * |[15:12] |PC11MFP |PC.11 Multi-function Pin Selection + * |[19:16] |PC12MFP |PC.12 Multi-function Pin Selection + * |[23:20] |PC13MFP |PC.13 Multi-function Pin Selection + * |[27:24] |PC14MFP |PC.14 Multi-function Pin Selection + * |[31:28] |PC15MFP |PC.15 Multi-function Pin Selection + * @var SYS_T::GPD_MFPL + * Offset: 0x98 GPIOD Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PD0MFP |PD.0 Multi-function Pin Selection + * |[7:4] |PD1MFP |PD.1 Multi-function Pin Selection + * |[11:8] |PD2MFP |PD.2 Multi-function Pin Selection + * |[15:12] |PD3MFP |PD.3 Multi-function Pin Selection + * |[19:16] |PD4MFP |PD.4 Multi-function Pin Selection + * |[23:20] |PD5MFP |PD.5 Multi-function Pin Selection + * |[27:24] |PD6MFP |PD.6 Multi-function Pin Selection + * |[31:28] |PD7MFP |PD.7 Multi-function Pin Selection + * @var SYS_T::GPD_MFPH + * Offset: 0x9C GPIOD High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PD8MFP |PD.8 Multi-function Pin Selection + * |[7:4] |PD9MFP |PD.9 Multi-function Pin Selection + * |[11:8] |PD10MFP |PD.10 Multi-function Pin Selection + * |[15:12] |PD11MFP |PD.11 Multi-function Pin Selection + * |[19:16] |PD12MFP |PD.12 Multi-function Pin Selection + * |[23:20] |PD13MFP |PD.13 Multi-function Pin Selection + * |[27:24] |PD14MFP |PD.14 Multi-function Pin Selection + * |[31:28] |PD15MFP |PD.15 Multi-function Pin Selection + * @var SYS_T::GPE_MFPL + * Offset: 0xA0 GPIOE Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PE0MFP |PE.0 Multi-function Pin Selection + * |[7:4] |PE1MFP |PE.1 Multi-function Pin Selection + * |[11:8] |PE2MFP |PE.2 Multi-function Pin Selection + * |[15:12] |PE3MFP |PE.3 Multi-function Pin Selection + * |[19:16] |PE4MFP |PE.4 Multi-function Pin Selection + * |[23:20] |PE5MFP |PE.5 Multi-function Pin Selection + * |[27:24] |PE6MFP |PE.6 Multi-function Pin Selection + * |[31:28] |PE7MFP |PE.7 Multi-function Pin Selection + * @var SYS_T::GPE_MFPH + * Offset: 0xA4 GPIOE High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PE8MFP |PE.8 Multi-function Pin Selection + * |[7:4] |PE9MFP |PE.9 Multi-function Pin Selection + * |[11:8] |PE10MFP |PE.10 Multi-function Pin Selection + * |[15:12] |PE11MFP |PE.11 Multi-function Pin Selection + * |[19:16] |PE12MFP |PE.12 Multi-function Pin Selection + * |[23:20] |PE13MFP |PE.13 Multi-function Pin Selection + * |[27:24] |PE14MFP |PE.14 Multi-function Pin Selection + * |[31:28] |PE15MFP |PE.15 Multi-function Pin Selection + * @var SYS_T::GPF_MFPL + * Offset: 0xA8 GPIOF Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PF0MFP |PF.0 Multi-function Pin Selection + * |[7:4] |PF1MFP |PF.1 Multi-function Pin Selection + * |[11:8] |PF2MFP |PF.2 Multi-function Pin Selection + * |[15:12] |PF3MFP |PF.3 Multi-function Pin Selection + * |[19:16] |PF4MFP |PF.4 Multi-function Pin Selection + * |[23:20] |PF5MFP |PF.5 Multi-function Pin Selection + * |[27:24] |PF6MFP |PF.6 Multi-function Pin Selection + * |[31:28] |PF7MFP |PF.7 Multi-function Pin Selection + * @var SYS_T::GPF_MFPH + * Offset: 0xAC GPIOF High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PF8MFP |PF.8 Multi-function Pin Selection + * |[7:4] |PF9MFP |PF.9 Multi-function Pin Selection + * |[11:8] |PF10MFP |PF.10 Multi-function Pin Selection + * |[15:12] |PF11MFP |PF.11 Multi-function Pin Selection + * |[19:16] |PF12MFP |PF.12 Multi-function Pin Selection + * |[23:20] |PF13MFP |PF.13 Multi-function Pin Selection + * |[27:24] |PF14MFP |PF.14 Multi-function Pin Selection + * |[31:28] |PF15MFP |PF.15 Multi-function Pin Selection + * @var SYS_T::GPG_MFPL + * Offset: 0xB0 GPIOG Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PG0MFP |PG.0 Multi-function Pin Selection + * |[7:4] |PG1MFP |PG.1 Multi-function Pin Selection + * |[11:8] |PG2MFP |PG.2 Multi-function Pin Selection + * |[15:12] |PG3MFP |PG.3 Multi-function Pin Selection + * |[19:16] |PG4MFP |PG.4 Multi-function Pin Selection + * |[23:20] |PG5MFP |PG.5 Multi-function Pin Selection + * |[27:24] |PG6MFP |PG.6 Multi-function Pin Selection + * |[31:28] |PG7MFP |PG.7 Multi-function Pin Selection + * @var SYS_T::GPG_MFPH + * Offset: 0xB4 GPIOG High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PG8MFP |PG.8 Multi-function Pin Selection + * |[7:4] |PG9MFP |PG.9 Multi-function Pin Selection + * |[11:8] |PG10MFP |PG.10 Multi-function Pin Selection + * |[15:12] |PG11MFP |PG.11 Multi-function Pin Selection + * |[19:16] |PG12MFP |PG.12 Multi-function Pin Selection + * |[23:20] |PG13MFP |PG.13 Multi-function Pin Selection + * |[27:24] |PG14MFP |PG.14 Multi-function Pin Selection + * |[31:28] |PG15MFP |PG.15 Multi-function Pin Selection + * @var SYS_T::GPH_MFPL + * Offset: 0xB8 GPIOH Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PH0MFP |PH.0 Multi-function Pin Selection + * |[7:4] |PH1MFP |PH.1 Multi-function Pin Selection + * |[11:8] |PH2MFP |PH.2 Multi-function Pin Selection + * |[15:12] |PH3MFP |PH.3 Multi-function Pin Selection + * |[19:16] |PH4MFP |PH.4 Multi-function Pin Selection + * |[23:20] |PH5MFP |PH.5 Multi-function Pin Selection + * |[27:24] |PH6MFP |PH.6 Multi-function Pin Selection + * |[31:28] |PH7MFP |PH.7 Multi-function Pin Selection + * @var SYS_T::GPH_MFPH + * Offset: 0xBC GPIOH High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PH8MFP |PH.8 Multi-function Pin Selection + * |[7:4] |PH9MFP |PH.9 Multi-function Pin Selection + * |[11:8] |PH10MFP |PH.10 Multi-function Pin Selection + * |[15:12] |PH11MFP |PH.11 Multi-function Pin Selection + * |[19:16] |PH12MFP |PH.12 Multi-function Pin Selection + * |[23:20] |PH13MFP |PH.13 Multi-function Pin Selection + * |[27:24] |PH14MFP |PH.14 Multi-function Pin Selection + * |[31:28] |PH15MFP |PH.15 Multi-function Pin Selection + * @var SYS_T::GPI_MFPL + * Offset: 0xC0 GPIOI Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PI0MFP |PI.0 Multi-function Pin Selection + * |[7:4] |PI1MFP |PI.1 Multi-function Pin Selection + * |[11:8] |PI2MFP |PI.2 Multi-function Pin Selection + * |[15:12] |PI3MFP |PI.3 Multi-function Pin Selection + * |[19:16] |PI4MFP |PI.4 Multi-function Pin Selection + * |[23:20] |PI5MFP |PI.5 Multi-function Pin Selection + * |[27:24] |PI6MFP |PI.6 Multi-function Pin Selection + * |[31:28] |PI7MFP |PI.7 Multi-function Pin Selection + * @var SYS_T::GPI_MFPH + * Offset: 0xC4 GPIOI High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PI8MFP |PI.8 Multi-function Pin Selection + * |[7:4] |PI9MFP |PI.9 Multi-function Pin Selection + * |[11:8] |PI10MFP |PI.10 Multi-function Pin Selection + * |[15:12] |PI11MFP |PI.11 Multi-function Pin Selection + * |[19:16] |PI12MFP |PI.12 Multi-function Pin Selection + * |[23:20] |PI13MFP |PI.13 Multi-function Pin Selection + * |[27:24] |PI14MFP |PI.14 Multi-function Pin Selection + * |[31:28] |PI15MFP |PI.15 Multi-function Pin Selection + * @var SYS_T::GPJ_MFPL + * Offset: 0xC8 GPIOJ Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PJ0MFP |PJ.0 Multi-function Pin Selection + * |[7:4] |PJ1MFP |PJ.1 Multi-function Pin Selection + * |[11:8] |PJ2MFP |PJ.2 Multi-function Pin Selection + * |[15:12] |PJ3MFP |PJ.3 Multi-function Pin Selection + * |[19:16] |PJ4MFP |PJ.4 Multi-function Pin Selection + * |[23:20] |PJ5MFP |PJ.5 Multi-function Pin Selection + * |[27:24] |PJ6MFP |PJ.6 Multi-function Pin Selection + * |[31:28] |PJ7MFP |PJ.7 Multi-function Pin Selection + * @var SYS_T::GPJ_MFPH + * Offset: 0xCC GPIOJ High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PJ8MFP |PJ.8 Multi-function Pin Selection + * |[7:4] |PJ9MFP |PJ.9 Multi-function Pin Selection + * |[11:8] |PJ10MFP |PJ.10 Multi-function Pin Selection + * |[15:12] |PJ11MFP |PJ.11 Multi-function Pin Selection + * |[19:16] |PJ12MFP |PJ.12 Multi-function Pin Selection + * |[23:20] |PJ13MFP |PJ.13 Multi-function Pin Selection + * |[27:24] |PJ14MFP |PJ.14 Multi-function Pin Selection + * |[31:28] |PJ15MFP |PJ.15 Multi-function Pin Selection + * @var SYS_T::GPK_MFPL + * Offset: 0xD0 GPIOK Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PK0MFP |PK.0 Multi-function Pin Selection + * |[7:4] |PK1MFP |PK.1 Multi-function Pin Selection + * |[11:8] |PK2MFP |PK.2 Multi-function Pin Selection + * |[15:12] |PK3MFP |PK.3 Multi-function Pin Selection + * |[19:16] |PK4MFP |PK.4 Multi-function Pin Selection + * |[23:20] |PK5MFP |PK.5 Multi-function Pin Selection + * |[27:24] |PK6MFP |PK.6 Multi-function Pin Selection + * |[31:28] |PK7MFP |PK.7 Multi-function Pin Selection + * @var SYS_T::GPK_MFPH + * Offset: 0xD4 GPIOK High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PK8MFP |PK.8 Multi-function Pin Selection + * |[7:4] |PK9MFP |PK.9 Multi-function Pin Selection + * |[11:8] |PK10MFP |PK.10 Multi-function Pin Selection + * |[15:12] |PK11MFP |PK.11 Multi-function Pin Selection + * |[19:16] |PK12MFP |PK.12 Multi-function Pin Selection + * |[23:20] |PK13MFP |PK.13 Multi-function Pin Selection + * |[27:24] |PK14MFP |PK.14 Multi-function Pin Selection + * |[31:28] |PK15MFP |PK.15 Multi-function Pin Selection + * @var SYS_T::GPL_MFPL + * Offset: 0xD8 GPIOL Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PL0MFP |PL.0 Multi-function Pin Selection + * |[7:4] |PL1MFP |PL.1 Multi-function Pin Selection + * |[11:8] |PL2MFP |PL.2 Multi-function Pin Selection + * |[15:12] |PL3MFP |PL.3 Multi-function Pin Selection + * |[19:16] |PL4MFP |PL.4 Multi-function Pin Selection + * |[23:20] |PL5MFP |PL.5 Multi-function Pin Selection + * |[27:24] |PL6MFP |PL.6 Multi-function Pin Selection + * |[31:28] |PL7MFP |PL.7 Multi-function Pin Selection + * @var SYS_T::GPL_MFPH + * Offset: 0xDC GPIOL High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PL8MFP |PL.8 Multi-function Pin Selection + * |[7:4] |PL9MFP |PL.9 Multi-function Pin Selection + * |[11:8] |PL10MFP |PL.10 Multi-function Pin Selection + * |[15:12] |PL11MFP |PL.11 Multi-function Pin Selection + * |[19:16] |PL12MFP |PL.12 Multi-function Pin Selection + * |[23:20] |PL13MFP |PL.13 Multi-function Pin Selection + * |[27:24] |PL14MFP |PL.14 Multi-function Pin Selection + * |[31:28] |PL15MFP |PL.15 Multi-function Pin Selection + * @var SYS_T::GPM_MFPL + * Offset: 0xE0 GPIOM Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PM0MFP |PM.0 Multi-function Pin Selection + * |[7:4] |PM1MFP |PM.1 Multi-function Pin Selection + * |[11:8] |PM2MFP |PM.2 Multi-function Pin Selection + * |[15:12] |PM3MFP |PM.3 Multi-function Pin Selection + * |[19:16] |PM4MFP |PM.4 Multi-function Pin Selection + * |[23:20] |PM5MFP |PM.5 Multi-function Pin Selection + * |[27:24] |PM6MFP |PM.6 Multi-function Pin Selection + * |[31:28] |PM7MFP |PM.7 Multi-function Pin Selection + * @var SYS_T::GPM_MFPH + * Offset: 0xE4 GPIOM High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PM8MFP |PM.8 Multi-function Pin Selection + * |[7:4] |PM9MFP |PM.9 Multi-function Pin Selection + * |[11:8] |PM10MFP |PM.10 Multi-function Pin Selection + * |[15:12] |PM11MFP |PM.11 Multi-function Pin Selection + * |[19:16] |PM12MFP |PM.12 Multi-function Pin Selection + * |[23:20] |PM13MFP |PM.13 Multi-function Pin Selection + * |[27:24] |PM14MFP |PM.14 Multi-function Pin Selection + * |[31:28] |PM15MFP |PM.15 Multi-function Pin Selection + * @var SYS_T::GPN_MFPL + * Offset: 0xE8 GPION Low Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PN0MFP |PN.0 Multi-function Pin Selection + * |[7:4] |PN1MFP |PN.1 Multi-function Pin Selection + * |[11:8] |PN2MFP |PN.2 Multi-function Pin Selection + * |[15:12] |PN3MFP |PN.3 Multi-function Pin Selection + * |[19:16] |PN4MFP |PN.4 Multi-function Pin Selection + * |[23:20] |PN5MFP |PN.5 Multi-function Pin Selection + * |[27:24] |PN6MFP |PN.6 Multi-function Pin Selection + * |[31:28] |PN7MFP |PN.7 Multi-function Pin Selection + * @var SYS_T::GPN_MFPH + * Offset: 0xEC GPION High Byte Multiple Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |PN8MFP |PN.8 Multi-function Pin Selection + * |[7:4] |PN9MFP |PN.9 Multi-function Pin Selection + * |[11:8] |PN10MFP |PN.10 Multi-function Pin Selection + * |[15:12] |PN11MFP |PN.11 Multi-function Pin Selection + * |[19:16] |PN12MFP |PN.12 Multi-function Pin Selection + * |[23:20] |PN13MFP |PN.13 Multi-function Pin Selection + * |[27:24] |PN14MFP |PN.14 Multi-function Pin Selection + * |[31:28] |PN15MFP |PN.15 Multi-function Pin Selection + * @var SYS_T::TSENSRFCR + * Offset: 0x104 Temperature Sensor Function Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |TSENSRREF0|Temperature Sensor Reference Value 0 + * | | |TSENSRREF0 keeps 8-bit value measured at 25C for temperature conversion formula variable A calibration. + * |[15:8] |TSENSRREF1|Temperature Sensor Reference Value 1 + * | | |TSENSRREF1 keeps 8-bit value measured at 25C for temperature conversion formula variable B calibration. + * |[27:16] |TSENSRDATA|Temperature Sensor Data + * | | |TSENSRDATA keeps 12-bit value measured by temperature sensor. + * |[28] |PD |Temperature Sensor Power Down + * | | |0 = Temperature sensor data is in normal operation. + * | | |1 = Temperature sensor data is in power down. + * |[29] |REFUDEN |Temperature Sensor Reference Data Update Enable Bit + * | | |0 = Write to update TSENSRREF0 and TSENSRREF1 is Disabled. + * | | |1 = Write to update TSENSRREF0 and TSENSRREF1 is Enabled. + * |[31] |DATAVALID |Temperature Sensor Data Valid + * | | |0 = Temperature sensor data in TSENSRDATA is not valid. + * | | |1 = Temperature sensor data in TSENSRDATA is valid. + * | | |Note: This bit is only cleared by writing 1 to it. + * @var SYS_T::GMAC0MISCR + * Offset: 0x108 GMAC 0 Miscellaneous Control Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RMIIEN |RMII Mode Enable Bit + * | | |0 = GMAC 0 is in RGMII mode. + * | | |1 = GMAC 0 is in RMII mode. + * |[1] |PFRMTXEN |Pause Frame Transmit Enable Bit + * | | |0 = Pause frame transmit Disabled. + * | | |1 = Pause frame transmit Enabled. + * |[8] |TXCLKINV |Transmit Clock Inverter Enable Bit + * | | |0 = Transmit clock (output) inverter Disabled. + * | | |1 = Transmit clock (output) inverter Enabled. + * | | |Note: This bit is reserved when GMAC 0 is in RMII mode. + * |[9] |TXCLKGEN |Transmit Clock Gating Enable Bit + * | | |0 = Transmit clock (output) gating when entered LPI mode Disabled. + * | | |1 = Transmit clock (output) gating when entered LPI mode Enabled. + * | | |Note: This bit is reserved when GMAC 0 is in RMII mode. + * |[12] |RXCLKINV |Receive Clock Inverter Enable Bit + * | | |0 = Receive clock (input) inverter Disabled. + * | | |1 = Receive clock (input) inverter Enabled. + * | | |Note: This bit is reserved when GMAC 0 is in RMII mode. + * |[19:16] |TXCLKDLY |Transmit Clock Path Delay Control + * | | |0000 = 0.00ns (Default). + * | | |0001 = 0.13ns. + * | | |0010 = 0.27ns. + * | | |0011 = 0.40ns. + * | | |0100 = 0.53ns. + * | | |0101 = 0.67ns. + * | | |0110 = 0.80ns. + * | | |0111 = 0.93ns. + * | | |1000 = 1.07ns. + * | | |1001 = 1.20ns. + * | | |1010 = 1.33ns. + * | | |1011 = 1.47ns. + * | | |1100 = 1.60ns. + * | | |1101 = 1.73ns. + * | | |1110 = 1.87ns. + * | | |1111 = 2.00ns. + * | | |Note: These bits are reserved when GMAC 0 is in RMII mode. + * |[23:20] |RXCLKDLY |Receive Clock Path Delay Control + * | | |0000 = 0.00ns (Default). + * | | |0001 = 0.13ns. + * | | |0010 = 0.27ns. + * | | |0011 = 0.40ns. + * | | |0100 = 0.53ns. + * | | |0101 = 0.67ns. + * | | |0110 = 0.80ns. + * | | |0111 = 0.93ns. + * | | |1000 = 1.07ns. + * | | |1001 = 1.20ns. + * | | |1010 = 1.33ns. + * | | |1011 = 1.47ns. + * | | |1100 = 1.60ns. + * | | |1101 = 1.73ns. + * | | |1110 = 1.87ns. + * | | |1111 = 2.00ns. + * | | |Note: These bits are reserved when GMAC 0 is in RMII mode. + * @var SYS_T::GMAC1MISCR + * Offset: 0x10C GMAC 1 Miscellaneous Control Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RMIIEN |RMII Mode Enable Bit + * | | |0 = GMAC 1 is in RGMII mode. + * | | |1 = GMAC 1 is in RMII mode. + * |[1] |PFRMTXEN |Pause Frame Transmit Enable Bit + * | | |0 = Pause frame transmit Disabled. + * | | |1 = Pause frame transmit Enabled. + * |[8] |TXCLKINV |Transmit Clock Inverter Enable Bit + * | | |0 = Transmit clock (output) inverter Disabled. + * | | |1 = Transmit clock (output) inverter Enabled. + * | | |Note: This bit is reserved when GMAC 1 is in RMII mode. + * |[9] |TXCLKGEN |Transmit Clock Gating Enable Bit + * | | |0 = Transmit clock (output) gating when entered LPI mode Disabled. + * | | |1 = Transmit clock (output) gating when entered LPI mode Enabled. + * | | |Note: This bit is reserved when GMAC 1 is in RMII mode. + * |[12] |RXCLKINV |Receive Clock Inverter Enable Bit + * | | |0 = Receive clock (input) inverter Disabled. + * | | |1 = Receive clock (input) inverter Enabled. + * | | |Note: This bit is reserved when GMAC 1 is in RMII mode. + * |[19:16] |TXCLKDLY |Transmit Clock Path Delay Control + * | | |0000 = 0.00ns (Default). + * | | |0001 = 0.13ns. + * | | |0010 = 0.27ns. + * | | |0011 = 0.40ns. + * | | |0100 = 0.53ns. + * | | |0101 = 0.67ns. + * | | |0110 = 0.80ns. + * | | |0111 = 0.93ns. + * | | |1000 = 1.07ns. + * | | |1001 = 1.20ns. + * | | |1010 = 1.33ns. + * | | |1011 = 1.47ns. + * | | |1100 = 1.60ns. + * | | |1101 = 1.73ns. + * | | |1110 = 1.87ns. + * | | |1111 = 2.00ns. + * | | |Note: These bits are reserved when GMAC 1 is in RMII mode. + * |[23:20] |RXCLKDLY |Receive Clock Path Delay Control + * | | |0000 = 0.00ns (Default). + * | | |0001 = 0.13ns. + * | | |0010 = 0.27ns. + * | | |0011 = 0.40ns. + * | | |0100 = 0.53ns. + * | | |0101 = 0.67ns. + * | | |0110 = 0.80ns. + * | | |0111 = 0.93ns. + * | | |1000 = 1.07ns. + * | | |1001 = 1.20ns. + * | | |1010 = 1.33ns. + * | | |1011 = 1.47ns. + * | | |1100 = 1.60ns. + * | | |1101 = 1.73ns. + * | | |1110 = 1.87ns. + * | | |1111 = 2.00ns. + * | | |Note: These bits are reserved when GMAC 1 is in RMII mode. + * @var SYS_T::MACAD0LSR + * Offset: 0x110 MAC Address 0 Low Significant Word Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |MACADRLSR |MAC Address Low Significant Word Register + * @var SYS_T::MACAD0HSR + * Offset: 0x114 MAC Address 0 High Significant Word Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |MACADRHSR |MAC Address High Significant Word Register + * @var SYS_T::MACAD1LSR + * Offset: 0x118 MAC Address 1 Low Significant Word Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |MACADRLSR |MAC Address Low Significant Word Register + * @var SYS_T::MACAD1HSR + * Offset: 0x11C MAC Address 1 High Significant Word Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |MACADRHSR |MAC Address High Significant Word Register + * @var SYS_T::CSDBGCTL + * Offset: 0x120 CoreSight Debug Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |DBGRST |Debug Reset Bit + * | | |0 = Release the reset for all debug component including A35, RTP and Coresight + * | | |1 = Reset all debug component including A35, RTP and Coresight + * |[1] |DBGPWRUPREQ|Debug Power Up Request Bit + * | | |0 = Disable the power-up request. + * | | |1 = Enable the power-up request + * | | |Note: If user wants to do self-hosted debug, it has to write the DBGPWRUPREQ to 1, and check the DBGPWRUPACK to 1 before self-hosted debug start + * | | |This bit will enable A35 power and clock and RTP clock. + * |[2] |DBGPWRUPACK|Debug Power Up Acknowledge Bit + * | | |0 = Debug power-up request is not ready + * | | |1 = Debug power-up request is ready + * |[3] |LPEMU |Low Power Emulation Enable Bit + * | | |0 = Low power Emulation Enabled. + * | | |1 = Low power Emulation Disabled. + * | | |When this bit is on, CA35 and RTP's clock and power will be maintained even the SOC in power-down mode. + * @var SYS_T::GPAB_MFOS + * Offset: 0x140 GPIOA and GPIOB Multiple Function Output Mode Select Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GPIOxMFOS0|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[1] |GPIOxMFOS1|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[2] |GPIOxMFOS2|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[3] |GPIOxMFOS3|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[4] |GPIOxMFOS4|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[5] |GPIOxMFOS5|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[6] |GPIOxMFOS6|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[7] |GPIOxMFOS7|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[8] |GPIOxMFOS8|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[9] |GPIOxMFOS9|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[10] |GPIOxMFOS10|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[11] |GPIOxMFOS11|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[12] |GPIOxMFOS12|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[13] |GPIOxMFOS13|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[14] |GPIOxMFOS14|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[15] |GPIOxMFOS15|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[16] |GPIOyMFOS16|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[17] |GPIOyMFOS17|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[18] |GPIOyMFOS18|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[19] |GPIOyMFOS19|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[20] |GPIOyMFOS20|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[21] |GPIOyMFOS21|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[22] |GPIOyMFOS22|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[23] |GPIOyMFOS23|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[24] |GPIOyMFOS24|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[25] |GPIOyMFOS25|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[26] |GPIOyMFOS26|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[27] |GPIOyMFOS27|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[28] |GPIOyMFOS28|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[29] |GPIOyMFOS29|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[30] |GPIOyMFOS30|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[31] |GPIOyMFOS31|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * @var SYS_T::GPCD_MFOS + * Offset: 0x144 GPIOC and GPIOD Multiple Function Output Mode Select Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GPIOxMFOS0|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[1] |GPIOxMFOS1|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[2] |GPIOxMFOS2|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[3] |GPIOxMFOS3|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[4] |GPIOxMFOS4|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[5] |GPIOxMFOS5|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[6] |GPIOxMFOS6|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[7] |GPIOxMFOS7|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[8] |GPIOxMFOS8|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[9] |GPIOxMFOS9|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[10] |GPIOxMFOS10|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[11] |GPIOxMFOS11|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[12] |GPIOxMFOS12|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[13] |GPIOxMFOS13|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[14] |GPIOxMFOS14|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[15] |GPIOxMFOS15|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[16] |GPIOyMFOS16|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[17] |GPIOyMFOS17|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[18] |GPIOyMFOS18|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[19] |GPIOyMFOS19|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[20] |GPIOyMFOS20|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[21] |GPIOyMFOS21|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[22] |GPIOyMFOS22|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[23] |GPIOyMFOS23|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[24] |GPIOyMFOS24|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[25] |GPIOyMFOS25|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[26] |GPIOyMFOS26|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[27] |GPIOyMFOS27|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[28] |GPIOyMFOS28|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[29] |GPIOyMFOS29|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[30] |GPIOyMFOS30|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[31] |GPIOyMFOS31|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * @var SYS_T::GPEF_MFOS + * Offset: 0x148 GPIOE and GPIOF Multiple Function Output Mode Select Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GPIOxMFOS0|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[1] |GPIOxMFOS1|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[2] |GPIOxMFOS2|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[3] |GPIOxMFOS3|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[4] |GPIOxMFOS4|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[5] |GPIOxMFOS5|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[6] |GPIOxMFOS6|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[7] |GPIOxMFOS7|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[8] |GPIOxMFOS8|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[9] |GPIOxMFOS9|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[10] |GPIOxMFOS10|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[11] |GPIOxMFOS11|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[12] |GPIOxMFOS12|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[13] |GPIOxMFOS13|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[14] |GPIOxMFOS14|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[15] |GPIOxMFOS15|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[16] |GPIOyMFOS16|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[17] |GPIOyMFOS17|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[18] |GPIOyMFOS18|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[19] |GPIOyMFOS19|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[20] |GPIOyMFOS20|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[21] |GPIOyMFOS21|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[22] |GPIOyMFOS22|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[23] |GPIOyMFOS23|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[24] |GPIOyMFOS24|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[25] |GPIOyMFOS25|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[26] |GPIOyMFOS26|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[27] |GPIOyMFOS27|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[28] |GPIOyMFOS28|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[29] |GPIOyMFOS29|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[30] |GPIOyMFOS30|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[31] |GPIOyMFOS31|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * @var SYS_T::GPGH_MFOS + * Offset: 0x14C GPIOG and GPIOH Multiple Function Output Mode Select Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GPIOxMFOS0|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[1] |GPIOxMFOS1|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[2] |GPIOxMFOS2|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[3] |GPIOxMFOS3|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[4] |GPIOxMFOS4|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[5] |GPIOxMFOS5|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[6] |GPIOxMFOS6|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[7] |GPIOxMFOS7|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[8] |GPIOxMFOS8|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[9] |GPIOxMFOS9|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[10] |GPIOxMFOS10|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[11] |GPIOxMFOS11|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[12] |GPIOxMFOS12|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[13] |GPIOxMFOS13|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[14] |GPIOxMFOS14|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[15] |GPIOxMFOS15|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[16] |GPIOyMFOS16|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[17] |GPIOyMFOS17|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[18] |GPIOyMFOS18|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[19] |GPIOyMFOS19|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[20] |GPIOyMFOS20|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[21] |GPIOyMFOS21|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[22] |GPIOyMFOS22|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[23] |GPIOyMFOS23|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[24] |GPIOyMFOS24|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[25] |GPIOyMFOS25|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[26] |GPIOyMFOS26|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[27] |GPIOyMFOS27|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[28] |GPIOyMFOS28|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[29] |GPIOyMFOS29|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[30] |GPIOyMFOS30|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[31] |GPIOyMFOS31|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * @var SYS_T::GPIJ_MFOS + * Offset: 0x150 GPIOI and GPIOJ Multiple Function Output Mode Select Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GPIOxMFOS0|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[1] |GPIOxMFOS1|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[2] |GPIOxMFOS2|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[3] |GPIOxMFOS3|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[4] |GPIOxMFOS4|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[5] |GPIOxMFOS5|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[6] |GPIOxMFOS6|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[7] |GPIOxMFOS7|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[8] |GPIOxMFOS8|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[9] |GPIOxMFOS9|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[10] |GPIOxMFOS10|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[11] |GPIOxMFOS11|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[12] |GPIOxMFOS12|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[13] |GPIOxMFOS13|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[14] |GPIOxMFOS14|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[15] |GPIOxMFOS15|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[16] |GPIOyMFOS16|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[17] |GPIOyMFOS17|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[18] |GPIOyMFOS18|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[19] |GPIOyMFOS19|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[20] |GPIOyMFOS20|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[21] |GPIOyMFOS21|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[22] |GPIOyMFOS22|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[23] |GPIOyMFOS23|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[24] |GPIOyMFOS24|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[25] |GPIOyMFOS25|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[26] |GPIOyMFOS26|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[27] |GPIOyMFOS27|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[28] |GPIOyMFOS28|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[29] |GPIOyMFOS29|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[30] |GPIOyMFOS30|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[31] |GPIOyMFOS31|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * @var SYS_T::GPKL_MFOS + * Offset: 0x154 GPIOK and GPIOL Multiple Function Output Mode Select Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GPIOxMFOS0|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[1] |GPIOxMFOS1|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[2] |GPIOxMFOS2|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[3] |GPIOxMFOS3|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[4] |GPIOxMFOS4|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[5] |GPIOxMFOS5|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[6] |GPIOxMFOS6|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[7] |GPIOxMFOS7|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[8] |GPIOxMFOS8|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[9] |GPIOxMFOS9|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[10] |GPIOxMFOS10|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[11] |GPIOxMFOS11|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[12] |GPIOxMFOS12|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[13] |GPIOxMFOS13|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[14] |GPIOxMFOS14|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[15] |GPIOxMFOS15|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[16] |GPIOyMFOS16|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[17] |GPIOyMFOS17|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[18] |GPIOyMFOS18|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[19] |GPIOyMFOS19|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[20] |GPIOyMFOS20|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[21] |GPIOyMFOS21|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[22] |GPIOyMFOS22|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[23] |GPIOyMFOS23|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[24] |GPIOyMFOS24|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[25] |GPIOyMFOS25|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[26] |GPIOyMFOS26|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[27] |GPIOyMFOS27|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[28] |GPIOyMFOS28|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[29] |GPIOyMFOS29|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[30] |GPIOyMFOS30|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[31] |GPIOyMFOS31|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * @var SYS_T::GPMN_MFOS + * Offset: 0x158 GPIOM and GPION Multiple Function Output Mode Select Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |GPIOxMFOS0|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[1] |GPIOxMFOS1|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[2] |GPIOxMFOS2|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[3] |GPIOxMFOS3|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[4] |GPIOxMFOS4|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[5] |GPIOxMFOS5|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[6] |GPIOxMFOS6|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[7] |GPIOxMFOS7|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[8] |GPIOxMFOS8|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[9] |GPIOxMFOS9|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[10] |GPIOxMFOS10|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[11] |GPIOxMFOS11|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[12] |GPIOxMFOS12|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[13] |GPIOxMFOS13|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[14] |GPIOxMFOS14|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[15] |GPIOxMFOS15|GPIOx Pin[m] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Px.m pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: Max. m=15. + * | | |Note: y= A, C, E, F, I, K, M + * |[16] |GPIOyMFOS16|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[17] |GPIOyMFOS17|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[18] |GPIOyMFOS18|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[19] |GPIOyMFOS19|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[20] |GPIOyMFOS20|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[21] |GPIOyMFOS21|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[22] |GPIOyMFOS22|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[23] |GPIOyMFOS23|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[24] |GPIOyMFOS24|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[25] |GPIOyMFOS25|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[26] |GPIOyMFOS26|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[27] |GPIOyMFOS27|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[28] |GPIOyMFOS28|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[29] |GPIOyMFOS29|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[30] |GPIOyMFOS30|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * |[31] |GPIOyMFOS31|GPIOy Pin[n] Multiple Function Pin Output Mode Select + * | | |This bit used to select multiple function pin output mode type for Py.n pin + * | | |0 = Multiple function pin output mode type is Push-pull mode. + * | | |1 = Multiple function pin output mode type is Open-drain mode. + * | | |Note: n=0, 1..15, Max. n=15. + * | | |Note: y= B, D, F, H, J, L, N + * @var SYS_T::UID0 + * Offset: 0x180 Unique Identifier Word 0 Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |UID |Unique ID + * | | |Unique identify number of the chip. + * | | |Loaded from OTP automatically during chip power on. + * @var SYS_T::UID1 + * Offset: 0x184 Unique Identifier Word 1 Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |UID |Unique ID + * | | |Unique identify number of the chip. + * | | |Loaded from OTP automatically during chip power on. + * @var SYS_T::UID2 + * Offset: 0x188 Unique Identifier Word 2 Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |UID |Unique ID + * | | |Unique identify number of the chip. + * | | |Loaded from OTP automatically during chip power on. + * @var SYS_T::UCID0 + * Offset: 0x190 Unique Customer Identifier Word 0 Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |UCID |Unique Customer ID + * | | |Unique customer identifier number of the chip. + * | | |Loaded from OTP automatically during chip power on. + * @var SYS_T::UCID1 + * Offset: 0x194 Unique Customer Identifier Word 1 Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |UCID |Unique Customer ID + * | | |Unique customer identifier number of the chip. + * | | |Loaded from OTP automatically during chip power on. + * @var SYS_T::UCID2 + * Offset: 0x198 Unique Customer Identifier Word 2 Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |UCID |Unique Customer ID + * | | |Unique customer identifier number of the chip. + * | | |Loaded from OTP automatically during chip power on. + * @var SYS_T::RLKTZS + * Offset: 0x1A0 TZS Register Lock Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |REGLCTL |Register Lock Control Code (Write Only) + * | | |Some registers have write-protection function + * | | |Writing these registers have to disable the protected function by writing the sequence value "59h", "16h", "88h" to this field + * | | |After this sequence is completed, the REGLCTL bit will be set to 1 and write-protection registers can be normal write. + * | | |REGLCTL[0] + * | | |Register Lock Control Disable Index (Read Only) + * | | |0 = Write-protection Enabled for writing protected registers + * | | |Any write to the protected register is ignored. + * | | |1 = Write-protection Disabled for writing protected registers. + * @var SYS_T::RLKTZNS + * Offset: 0x1A4 TZNS Register Lock Control Register (TZNS) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |REGLCTL |Register Lock Control Code (Write Only) + * | | |Some registers have write-protection function + * | | |Writing these registers have to disable the protected function by writing the sequence value "59h", "16h", "88h" to this field + * | | |After this sequence is completed, the REGLCTL bit will be set to 1 and write-protection registers can be normal write. + * | | |REGLCTL[0] + * | | |Register Lock Control Disable Index (Read Only) + * | | |0 = Write-protection Enabled for writing protected registers + * | | |Any write to the protected register is ignored. + * | | |1 = Write-protection Disabled for writing protected registers. + * @var SYS_T::RLKSUBM + * Offset: 0x1A8 SUBM Register Lock Control Register (SUBM) + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |REGLCTL |Register Lock Control Code (Write Only) + * | | |Some registers have write-protection function + * | | |Writing these registers have to disable the protected function by writing the sequence value "59h", "16h", "88h" to this field + * | | |After this sequence is completed, the REGLCTL bit will be set to 1 and write-protection registers can be normal write. + * | | |REGLCTL[0] + * | | |Register Lock Control Disable Index (Read Only) + * | | |0 = Write-protection Enabled for writing protected registers + * | | |Any write to the protected register is ignored. + * | | |1 = Write-protection Disabled for writing protected registers. + */ + __I uint32_t PDID; /*!< [0x0000] Product and Device Identifier Register (TZNS) */ + __I uint32_t PWRONOTP; /*!< [0x0004] Power-on Setting OTP Source Register (TZNS) */ + __I uint32_t PWRONPIN; /*!< [0x0008] Power-on Setting Pin Source Register (TZNS) */ + __I uint32_t RESERVE0[1]; + __IO uint32_t RSTSTS; /*!< [0x0010] Reset Source Active Status Register (Shared) */ + __IO uint32_t MISCRFCR; /*!< [0x0014] Miscellaneous Reset Function Control Register */ + __IO uint32_t RSTDEBCTL; /*!< [0x0018] Reset Pin De-bounce Control Register */ + __IO uint32_t LVRDCR; /*!< [0x001c] Low Voltage Reset & Detect Control Register */ + __IO uint32_t IPRST0; /*!< [0x0020] Reset Control Register 0 (Shared) */ + __IO uint32_t IPRST1; /*!< [0x0024] Reset Control Register 1 (Shared) */ + __IO uint32_t IPRST2; /*!< [0x0028] Reset Control Register 2 (Shared) */ + __IO uint32_t IPRST3; /*!< [0x002c] Reset Control Register 3 (Shared) */ + __IO uint32_t PMUCR; /*!< [0x0030] Power Management Unit Control Register */ + __IO uint32_t DDRCQCSR; /*!< [0x0034] DDR Controller Q Channel Control and Status Register */ + __IO uint32_t PMUIEN; /*!< [0x0038] Power Management Unit Interrupt Enable Register */ + __IO uint32_t PMUSTS; /*!< [0x003c] Power Management Unit Status Register */ + __IO uint32_t CA35WRBADR0; /*!< [0x0040] Cortexu00AE-A35 Core 0 Warm-boot Address Register */ + __IO uint32_t CA35WRBPAR0; /*!< [0x0044] Cortexu00AE-A35 Core 0 Warm-boot Parameter Register */ + __IO uint32_t CA35WRBADR1; /*!< [0x0048] Cortexu00AE-A35 Core 1 Warm-boot Address Register */ + __IO uint32_t CA35WRBPAR1; /*!< [0x004c] Cortexu00AE-A35 Core 1 Warm-boot Parameter Register */ + __I uint32_t RESERVE1[4]; + __IO uint32_t USBPMISCR; /*!< [0x0060] USB PHY Miscellaneous Control Register (TZNS) */ + __IO uint32_t USBP0PCR; /*!< [0x0064] USB Port 0 PHY Control Register */ + __IO uint32_t USBP1PCR; /*!< [0x0068] USB Port 1 PHY Control Register (TZNS) */ + __I uint32_t RESERVE2[1]; + __IO uint32_t MISCFCR0; /*!< [0x0070] Miscellaneous Function Control Register 0 (Shared) */ + __IO uint32_t MISCFCR1; /*!< [0x0074] Miscellaneous Function Control Register 1 (Shared) */ + __IO uint32_t MISCIER; /*!< [0x0078] Miscellaneous Interrupt Enable Register (TZNS) */ + __IO uint32_t MISCISR; /*!< [0x007c] Miscellaneous Interrupt Status Register (TZNS) */ + __IO uint32_t GPA_MFPL; /*!< [0x0080] GPIOA Low Byte Multiple Function Control Register */ + __IO uint32_t GPA_MFPH; /*!< [0x0084] GPIOA High Byte Multiple Function Control Register */ + __IO uint32_t GPB_MFPL; /*!< [0x0088] GPIOB Low Byte Multiple Function Control Register */ + __IO uint32_t GPB_MFPH; /*!< [0x008c] GPIOB High Byte Multiple Function Control Register */ + __IO uint32_t GPC_MFPL; /*!< [0x0090] GPIOC Low Byte Multiple Function Control Register */ + __IO uint32_t GPC_MFPH; /*!< [0x0094] GPIOC High Byte Multiple Function Control Register */ + __IO uint32_t GPD_MFPL; /*!< [0x0098] GPIOD Low Byte Multiple Function Control Register */ + __IO uint32_t GPD_MFPH; /*!< [0x009c] GPIOD High Byte Multiple Function Control Register */ + __IO uint32_t GPE_MFPL; /*!< [0x00a0] GPIOE Low Byte Multiple Function Control Register */ + __IO uint32_t GPE_MFPH; /*!< [0x00a4] GPIOE High Byte Multiple Function Control Register */ + __IO uint32_t GPF_MFPL; /*!< [0x00a8] GPIOF Low Byte Multiple Function Control Register */ + __IO uint32_t GPF_MFPH; /*!< [0x00ac] GPIOF High Byte Multiple Function Control Register */ + __IO uint32_t GPG_MFPL; /*!< [0x00b0] GPIOG Low Byte Multiple Function Control Register */ + __IO uint32_t GPG_MFPH; /*!< [0x00b4] GPIOG High Byte Multiple Function Control Register */ + __IO uint32_t GPH_MFPL; /*!< [0x00b8] GPIOH Low Byte Multiple Function Control Register */ + __IO uint32_t GPH_MFPH; /*!< [0x00bc] GPIOH High Byte Multiple Function Control Register */ + __IO uint32_t GPI_MFPL; /*!< [0x00c0] GPIOI Low Byte Multiple Function Control Register */ + __IO uint32_t GPI_MFPH; /*!< [0x00c4] GPIOI High Byte Multiple Function Control Register */ + __IO uint32_t GPJ_MFPL; /*!< [0x00c8] GPIOJ Low Byte Multiple Function Control Register */ + __IO uint32_t GPJ_MFPH; /*!< [0x00cc] GPIOJ High Byte Multiple Function Control Register */ + __IO uint32_t GPK_MFPL; /*!< [0x00d0] GPIOK Low Byte Multiple Function Control Register */ + __IO uint32_t GPK_MFPH; /*!< [0x00d4] GPIOK High Byte Multiple Function Control Register */ + __IO uint32_t GPL_MFPL; /*!< [0x00d8] GPIOL Low Byte Multiple Function Control Register */ + __IO uint32_t GPL_MFPH; /*!< [0x00dc] GPIOL High Byte Multiple Function Control Register */ + __IO uint32_t GPM_MFPL; /*!< [0x00e0] GPIOM Low Byte Multiple Function Control Register */ + __IO uint32_t GPM_MFPH; /*!< [0x00e4] GPIOM High Byte Multiple Function Control Register */ + __IO uint32_t GPN_MFPL; /*!< [0x00e8] GPION Low Byte Multiple Function Control Register */ + __IO uint32_t GPN_MFPH; /*!< [0x00ec] GPION High Byte Multiple Function Control Register */ + __I uint32_t RESERVE3[5]; + __IO uint32_t TSENSRFCR; /*!< [0x0104] Temperature Sensor Function Control Register */ + __IO uint32_t GMAC0MISCR; /*!< [0x0108] GMAC 0 Miscellaneous Control Register (TZNS) */ + __IO uint32_t GMAC1MISCR; /*!< [0x010c] GMAC 1 Miscellaneous Control Register (TZNS) */ + __I uint32_t MACAD0LSR; /*!< [0x0110] MAC Address 0 Low Significant Word Register (TZNS) */ + __I uint32_t MACAD0HSR; /*!< [0x0114] MAC Address 0 High Significant Word Register (TZNS) */ + __I uint32_t MACAD1LSR; /*!< [0x0118] MAC Address 1 Low Significant Word Register (TZNS) */ + __I uint32_t MACAD1HSR; /*!< [0x011c] MAC Address 1 High Significant Word Register (TZNS) */ + __IO uint32_t CSDBGCTL; /*!< [0x0120] CoreSight Debug Control Register */ + __I uint32_t RESERVE4[7]; + __IO uint32_t GPAB_MFOS; /*!< [0x0140] GPIOA and GPIOB Multiple Function Output Mode Select Register */ + __IO uint32_t GPCD_MFOS; /*!< [0x0144] GPIOC and GPIOD Multiple Function Output Mode Select Register */ + __IO uint32_t GPEF_MFOS; /*!< [0x0148] GPIOE and GPIOF Multiple Function Output Mode Select Register */ + __IO uint32_t GPGH_MFOS; /*!< [0x014c] GPIOG and GPIOH Multiple Function Output Mode Select Register */ + __IO uint32_t GPIJ_MFOS; /*!< [0x0150] GPIOI and GPIOJ Multiple Function Output Mode Select Register */ + __IO uint32_t GPKL_MFOS; /*!< [0x0154] GPIOK and GPIOL Multiple Function Output Mode Select Register */ + __IO uint32_t GPMN_MFOS; /*!< [0x0158] GPIOM and GPION Multiple Function Output Mode Select Register */ + __I uint32_t RESERVE5[9]; + __I uint32_t UID0; /*!< [0x0180] Unique Identifier Word 0 Register (TZNS) */ + __I uint32_t UID1; /*!< [0x0184] Unique Identifier Word 1 Register (TZNS) */ + __I uint32_t UID2; /*!< [0x0188] Unique Identifier Word 2 Register (TZNS) */ + __I uint32_t RESERVE6[1]; + __I uint32_t UCID0; /*!< [0x0190] Unique Customer Identifier Word 0 Register (TZNS) */ + __I uint32_t UCID1; /*!< [0x0194] Unique Customer Identifier Word 1 Register (TZNS) */ + __I uint32_t UCID2; /*!< [0x0198] Unique Customer Identifier Word 2 Register (TZNS) */ + __I uint32_t RESERVE7[1]; + __O uint32_t RLKTZS; /*!< [0x01a0] TZS Register Lock Control Register */ + __O uint32_t RLKTZNS; /*!< [0x01a4] TZNS Register Lock Control Register (TZNS) */ + __O uint32_t RLKSUBM; /*!< [0x01a8] SUBM Register Lock Control Register (SUBM) */ + +} SYS_T; + +/** + @addtogroup SYS_CONST SYS Bit Field Definition + Constant Definitions for SYS Controller +@{ */ + +#define SYS_PDID_PID_Pos (0) /*!< SYS_T::PDID: PID Position */ +#define SYS_PDID_PID_Msk (0xfffful << SYS_PDID_PID_Pos) /*!< SYS_T::PDID: PID Mask */ + +#define SYS_PDID_DID_Pos (16) /*!< SYS_T::PDID: DID Position */ +#define SYS_PDID_DID_Msk (0xffful << SYS_PDID_DID_Pos) /*!< SYS_T::PDID: DID Mask */ + +#define SYS_PWRONOTP_PWRONSRC_Pos (0) /*!< SYS_T::PWRONOTP: PWRONSRC Position */ +#define SYS_PWRONOTP_PWRONSRC_Msk (0x1ul << SYS_PWRONOTP_PWRONSRC_Pos) /*!< SYS_T::PWRONOTP: PWRONSRC Mask */ + +#define SYS_PWRONOTP_QSPI0CKSEL_Pos (1) /*!< SYS_T::PWRONOTP: QSPI0CKSEL Position */ +#define SYS_PWRONOTP_QSPI0CKSEL_Msk (0x1ul << SYS_PWRONOTP_QSPI0CKSEL_Pos) /*!< SYS_T::PWRONOTP: QSPI0CKSEL Mask */ + +#define SYS_PWRONOTP_WDT0ON_Pos (2) /*!< SYS_T::PWRONOTP: WDT0ON Position */ +#define SYS_PWRONOTP_WDT0ON_Msk (0x1ul << SYS_PWRONOTP_WDT0ON_Pos) /*!< SYS_T::PWRONOTP: WDT0ON Mask */ + +#define SYS_PWRONOTP_UR0DBGDIS_Pos (4) /*!< SYS_T::PWRONOTP: UR0DBGDIS Position */ +#define SYS_PWRONOTP_UR0DBGDIS_Msk (0x1ul << SYS_PWRONOTP_UR0DBGDIS_Pos) /*!< SYS_T::PWRONOTP: UR0DBGDIS Mask */ + +#define SYS_PWRONOTP_SD0BKEN_Pos (5) /*!< SYS_T::PWRONOTP: SD0BKEN Position */ +#define SYS_PWRONOTP_SD0BKEN_Msk (0x1ul << SYS_PWRONOTP_SD0BKEN_Pos) /*!< SYS_T::PWRONOTP: SD0BKEN Mask */ + +#define SYS_PWRONOTP_BTSRCSEL_Pos (10) /*!< SYS_T::PWRONOTP: BTSRCSEL Position */ +#define SYS_PWRONOTP_BTSRCSEL_Msk (0x3ul << SYS_PWRONOTP_BTSRCSEL_Pos) /*!< SYS_T::PWRONOTP: BTSRCSEL Mask */ + +#define SYS_PWRONOTP_NPAGESEL_Pos (12) /*!< SYS_T::PWRONOTP: NPAGESEL Position */ +#define SYS_PWRONOTP_NPAGESEL_Msk (0x3ul << SYS_PWRONOTP_NPAGESEL_Pos) /*!< SYS_T::PWRONOTP: NPAGESEL Mask */ + +#define SYS_PWRONOTP_MISCCFG_Pos (14) /*!< SYS_T::PWRONOTP: MISCCFG Position */ +#define SYS_PWRONOTP_MISCCFG_Msk (0x3ul << SYS_PWRONOTP_MISCCFG_Pos) /*!< SYS_T::PWRONOTP: MISCCFG Mask */ + +#define SYS_PWRONOTP_USBP0ID_Pos (16) /*!< SYS_T::PWRONOTP: USBP0ID Position */ +#define SYS_PWRONOTP_USBP0ID_Msk (0x1ul << SYS_PWRONOTP_USBP0ID_Pos) /*!< SYS_T::PWRONOTP: USBP0ID Mask */ + +#define SYS_PWRONOTP_SECBTPSWD_Pos (24) /*!< SYS_T::PWRONOTP: SECBTPSWD Position */ +#define SYS_PWRONOTP_SECBTPSWD_Msk (0xfful << SYS_PWRONOTP_SECBTPSWD_Pos) /*!< SYS_T::PWRONOTP: SECBTPSWD Mask */ + +#define SYS_PWRONPIN_SECBTDIS_Pos (0) /*!< SYS_T::PWRONPIN: SECBTDIS Position */ +#define SYS_PWRONPIN_SECBTDIS_Msk (0x1ul << SYS_PWRONPIN_SECBTDIS_Pos) /*!< SYS_T::PWRONPIN: SECBTDIS Mask */ + +#define SYS_PWRONPIN_BTSRCSEL_Pos (2) /*!< SYS_T::PWRONPIN: BTSRCSEL Position */ +#define SYS_PWRONPIN_BTSRCSEL_Msk (0x3ul << SYS_PWRONPIN_BTSRCSEL_Pos) /*!< SYS_T::PWRONPIN: BTSRCSEL Mask */ + +#define SYS_PWRONPIN_NPAGESEL_Pos (4) /*!< SYS_T::PWRONPIN: NPAGESEL Position */ +#define SYS_PWRONPIN_NPAGESEL_Msk (0x3ul << SYS_PWRONPIN_NPAGESEL_Pos) /*!< SYS_T::PWRONPIN: NPAGESEL Mask */ + +#define SYS_PWRONPIN_MISCCFG_Pos (6) /*!< SYS_T::PWRONPIN: MISCCFG Position */ +#define SYS_PWRONPIN_MISCCFG_Msk (0x3ul << SYS_PWRONPIN_MISCCFG_Pos) /*!< SYS_T::PWRONPIN: MISCCFG Mask */ + +#define SYS_RSTSTS_PORF_Pos (0) /*!< SYS_T::RSTSTS: PORF Position */ +#define SYS_RSTSTS_PORF_Msk (0x1ul << SYS_RSTSTS_PORF_Pos) /*!< SYS_T::RSTSTS: PORF Mask */ + +#define SYS_RSTSTS_PINRF_Pos (1) /*!< SYS_T::RSTSTS: PINRF Position */ +#define SYS_RSTSTS_PINRF_Msk (0x1ul << SYS_RSTSTS_PINRF_Pos) /*!< SYS_T::RSTSTS: PINRF Mask */ + +#define SYS_RSTSTS_WDT0RF_Pos (2) /*!< SYS_T::RSTSTS: WDT0RF Position */ +#define SYS_RSTSTS_WDT0RF_Msk (0x1ul << SYS_RSTSTS_WDT0RF_Pos) /*!< SYS_T::RSTSTS: WDT0RF Mask */ + +#define SYS_RSTSTS_LVRF_Pos (3) /*!< SYS_T::RSTSTS: LVRF Position */ +#define SYS_RSTSTS_LVRF_Msk (0x1ul << SYS_RSTSTS_LVRF_Pos) /*!< SYS_T::RSTSTS: LVRF Mask */ + +#define SYS_RSTSTS_CPU0DBGRF_Pos (4) /*!< SYS_T::RSTSTS: CPU0DBGRF Position */ +#define SYS_RSTSTS_CPU0DBGRF_Msk (0x1ul << SYS_RSTSTS_CPU0DBGRF_Pos) /*!< SYS_T::RSTSTS: CPU0DBGRF Mask */ + +#define SYS_RSTSTS_CPU0WARMRF_Pos (5) /*!< SYS_T::RSTSTS: CPU0WARMRF Position */ +#define SYS_RSTSTS_CPU0WARMRF_Msk (0x1ul << SYS_RSTSTS_CPU0WARMRF_Pos) /*!< SYS_T::RSTSTS: CPU0WARMRF Mask */ + +#define SYS_RSTSTS_HRESETRF_Pos (6) /*!< SYS_T::RSTSTS: HRESETRF Position */ +#define SYS_RSTSTS_HRESETRF_Msk (0x1ul << SYS_RSTSTS_HRESETRF_Pos) /*!< SYS_T::RSTSTS: HRESETRF Mask */ + +#define SYS_RSTSTS_CPU0RF_Pos (7) /*!< SYS_T::RSTSTS: CPU0RF Position */ +#define SYS_RSTSTS_CPU0RF_Msk (0x1ul << SYS_RSTSTS_CPU0RF_Pos) /*!< SYS_T::RSTSTS: CPU0RF Mask */ + +#define SYS_RSTSTS_WDT1RF_Pos (10) /*!< SYS_T::RSTSTS: WDT1RF Position */ +#define SYS_RSTSTS_WDT1RF_Msk (0x1ul << SYS_RSTSTS_WDT1RF_Pos) /*!< SYS_T::RSTSTS: WDT1RF Mask */ + +#define SYS_RSTSTS_WDT2RFA_Pos (11) /*!< SYS_T::RSTSTS: WDT2RFA Position */ +#define SYS_RSTSTS_WDT2RFA_Msk (0x1ul << SYS_RSTSTS_WDT2RFA_Pos) /*!< SYS_T::RSTSTS: WDT2RFA Mask */ + +#define SYS_RSTSTS_CPU1DBGRF_Pos (12) /*!< SYS_T::RSTSTS: CPU1DBGRF Position */ +#define SYS_RSTSTS_CPU1DBGRF_Msk (0x1ul << SYS_RSTSTS_CPU1DBGRF_Pos) /*!< SYS_T::RSTSTS: CPU1DBGRF Mask */ + +#define SYS_RSTSTS_CPU1WARMRF_Pos (13) /*!< SYS_T::RSTSTS: CPU1WARMRF Position */ +#define SYS_RSTSTS_CPU1WARMRF_Msk (0x1ul << SYS_RSTSTS_CPU1WARMRF_Pos) /*!< SYS_T::RSTSTS: CPU1WARMRF Mask */ + +#define SYS_RSTSTS_CPU1RF_Pos (15) /*!< SYS_T::RSTSTS: CPU1RF Position */ +#define SYS_RSTSTS_CPU1RF_Msk (0x1ul << SYS_RSTSTS_CPU1RF_Pos) /*!< SYS_T::RSTSTS: CPU1RF Mask */ + +#define SYS_RSTSTS_WDT1RFM_Pos (18) /*!< SYS_T::RSTSTS: WDT1RFM Position */ +#define SYS_RSTSTS_WDT1RFM_Msk (0x1ul << SYS_RSTSTS_WDT1RFM_Pos) /*!< SYS_T::RSTSTS: WDT1RFM Mask */ + +#define SYS_RSTSTS_WDT2RF_Pos (19) /*!< SYS_T::RSTSTS: WDT2RF Position */ +#define SYS_RSTSTS_WDT2RF_Msk (0x1ul << SYS_RSTSTS_WDT2RF_Pos) /*!< SYS_T::RSTSTS: WDT2RF Mask */ + +#define SYS_RSTSTS_RTPM4LKRF_Pos (20) /*!< SYS_T::RSTSTS: RTPM4LKRF Position */ +#define SYS_RSTSTS_RTPM4LKRF_Msk (0x1ul << SYS_RSTSTS_RTPM4LKRF_Pos) /*!< SYS_T::RSTSTS: RTPM4LKRF Mask */ + +#define SYS_RSTSTS_RTPM4SYSRF_Pos (21) /*!< SYS_T::RSTSTS: RTPM4SYSRF Position */ +#define SYS_RSTSTS_RTPM4SYSRF_Msk (0x1ul << SYS_RSTSTS_RTPM4SYSRF_Pos) /*!< SYS_T::RSTSTS: RTPM4SYSRF Mask */ + +#define SYS_RSTSTS_RTPPMUSYSRF_Pos (22) /*!< SYS_T::RSTSTS: RTPPMUSYSRF Position */ +#define SYS_RSTSTS_RTPPMUSYSRF_Msk (0x1ul << SYS_RSTSTS_RTPPMUSYSRF_Pos) /*!< SYS_T::RSTSTS: RTPPMUSYSRF Mask */ + +#define SYS_RSTSTS_RTPM4CPURF_Pos (23) /*!< SYS_T::RSTSTS: RTPM4CPURF Position */ +#define SYS_RSTSTS_RTPM4CPURF_Msk (0x1ul << SYS_RSTSTS_RTPM4CPURF_Pos) /*!< SYS_T::RSTSTS: RTPM4CPURF Mask */ + +#define SYS_MISCRFCR_PORDISCODE_Pos (0) /*!< SYS_T::MISCRFCR: PORDISCODE Position */ +#define SYS_MISCRFCR_PORDISCODE_Msk (0xfffful << SYS_MISCRFCR_PORDISCODE_Pos) /*!< SYS_T::MISCRFCR: PORDISCODE Mask */ + +#define SYS_MISCRFCR_WDT1RSTAEN_Pos (16) /*!< SYS_T::MISCRFCR: WDT1RSTAEN Position */ +#define SYS_MISCRFCR_WDT1RSTAEN_Msk (0x1ul << SYS_MISCRFCR_WDT1RSTAEN_Pos) /*!< SYS_T::MISCRFCR: WDT1RSTAEN Mask */ + +#define SYS_MISCRFCR_WDT2RSTAEN_Pos (17) /*!< SYS_T::MISCRFCR: WDT2RSTAEN Position */ +#define SYS_MISCRFCR_WDT2RSTAEN_Msk (0x1ul << SYS_MISCRFCR_WDT2RSTAEN_Pos) /*!< SYS_T::MISCRFCR: WDT2RSTAEN Mask */ + +#define SYS_MISCRFCR_WDT1RSTMEN_Pos (18) /*!< SYS_T::MISCRFCR: WDT1RSTMEN Position */ +#define SYS_MISCRFCR_WDT1RSTMEN_Msk (0x1ul << SYS_MISCRFCR_WDT1RSTMEN_Pos) /*!< SYS_T::MISCRFCR: WDT1RSTMEN Mask */ + +#define SYS_RSTDEBCTL_DEBCNT_Pos (0) /*!< SYS_T::RSTDEBCTL: DEBCNT Position */ +#define SYS_RSTDEBCTL_DEBCNT_Msk (0xfffful << SYS_RSTDEBCTL_DEBCNT_Pos) /*!< SYS_T::RSTDEBCTL: DEBCNT Mask */ + +#define SYS_RSTDEBCTL_RSTDEBEN_Pos (31) /*!< SYS_T::RSTDEBCTL: RSTDEBEN Position */ +#define SYS_RSTDEBCTL_RSTDEBEN_Msk (0x1ul << SYS_RSTDEBCTL_RSTDEBEN_Pos) /*!< SYS_T::RSTDEBCTL: RSTDEBEN Mask */ + +#define SYS_LVRDCR_LVREN_Pos (0) /*!< SYS_T::LVRDCR: LVREN Position */ +#define SYS_LVRDCR_LVREN_Msk (0x1ul << SYS_LVRDCR_LVREN_Pos) /*!< SYS_T::LVRDCR: LVREN Mask */ + +#define SYS_LVRDCR_LVRDGSEL_Pos (1) /*!< SYS_T::LVRDCR: LVRDGSEL Position */ +#define SYS_LVRDCR_LVRDGSEL_Msk (0x7ul << SYS_LVRDCR_LVRDGSEL_Pos) /*!< SYS_T::LVRDCR: LVRDGSEL Mask */ + +#define SYS_LVRDCR_LVDEN_Pos (8) /*!< SYS_T::LVRDCR: LVDEN Position */ +#define SYS_LVRDCR_LVDEN_Msk (0x1ul << SYS_LVRDCR_LVDEN_Pos) /*!< SYS_T::LVRDCR: LVDEN Mask */ + +#define SYS_LVRDCR_LVDSEL_Pos (9) /*!< SYS_T::LVRDCR: LVDSEL Position */ +#define SYS_LVRDCR_LVDSEL_Msk (0x1ul << SYS_LVRDCR_LVDSEL_Pos) /*!< SYS_T::LVRDCR: LVDSEL Mask */ + +#define SYS_LVRDCR_LVDWKA35EN_Pos (10) /*!< SYS_T::LVRDCR: LVDWKA35EN Position */ +#define SYS_LVRDCR_LVDWKA35EN_Msk (0x1ul << SYS_LVRDCR_LVDWKA35EN_Pos) /*!< SYS_T::LVRDCR: LVDWKA35EN Mask */ + +#define SYS_LVRDCR_LVDWKRTPEN_Pos (11) /*!< SYS_T::LVRDCR: LVDWKRTPEN Position */ +#define SYS_LVRDCR_LVDWKRTPEN_Msk (0x1ul << SYS_LVRDCR_LVDWKRTPEN_Pos) /*!< SYS_T::LVRDCR: LVDWKRTPEN Mask */ + +#define SYS_LVRDCR_LVDODGSEL_Pos (12) /*!< SYS_T::LVRDCR: LVDODGSEL Position */ +#define SYS_LVRDCR_LVDODGSEL_Msk (0x7ul << SYS_LVRDCR_LVDODGSEL_Pos) /*!< SYS_T::LVRDCR: LVDODGSEL Mask */ + +#define SYS_IPRST0_CHIPRST_Pos (0) /*!< SYS_T::IPRST0: CHIPRST Position */ +#define SYS_IPRST0_CHIPRST_Msk (0x1ul << SYS_IPRST0_CHIPRST_Pos) /*!< SYS_T::IPRST0: CHIPRST Mask */ + +#define SYS_IPRST0_CA35CR0RST_Pos (1) /*!< SYS_T::IPRST0: CA35CR0RST Position */ +#define SYS_IPRST0_CA35CR0RST_Msk (0x1ul << SYS_IPRST0_CA35CR0RST_Pos) /*!< SYS_T::IPRST0: CA35CR0RST Mask */ + +#define SYS_IPRST0_CA35CR1RST_Pos (2) /*!< SYS_T::IPRST0: CA35CR1RST Position */ +#define SYS_IPRST0_CA35CR1RST_Msk (0x1ul << SYS_IPRST0_CA35CR1RST_Pos) /*!< SYS_T::IPRST0: CA35CR1RST Mask */ + +#define SYS_IPRST0_CM4RST_Pos (3) /*!< SYS_T::IPRST0: CM4RST Position */ +#define SYS_IPRST0_CM4RST_Msk (0x1ul << SYS_IPRST0_CM4RST_Pos) /*!< SYS_T::IPRST0: CM4RST Mask */ + +#define SYS_IPRST0_PDMA0RST_Pos (4) /*!< SYS_T::IPRST0: PDMA0RST Position */ +#define SYS_IPRST0_PDMA0RST_Msk (0x1ul << SYS_IPRST0_PDMA0RST_Pos) /*!< SYS_T::IPRST0: PDMA0RST Mask */ + +#define SYS_IPRST0_PDMA1RST_Pos (5) /*!< SYS_T::IPRST0: PDMA1RST Position */ +#define SYS_IPRST0_PDMA1RST_Msk (0x1ul << SYS_IPRST0_PDMA1RST_Pos) /*!< SYS_T::IPRST0: PDMA1RST Mask */ + +#define SYS_IPRST0_PDMA2RST_Pos (6) /*!< SYS_T::IPRST0: PDMA2RST Position */ +#define SYS_IPRST0_PDMA2RST_Msk (0x1ul << SYS_IPRST0_PDMA2RST_Pos) /*!< SYS_T::IPRST0: PDMA2RST Mask */ + +#define SYS_IPRST0_PDMA3RST_Pos (7) /*!< SYS_T::IPRST0: PDMA3RST Position */ +#define SYS_IPRST0_PDMA3RST_Msk (0x1ul << SYS_IPRST0_PDMA3RST_Pos) /*!< SYS_T::IPRST0: PDMA3RST Mask */ + +#define SYS_IPRST0_DISPCRST_Pos (9) /*!< SYS_T::IPRST0: DISPCRST Position */ +#define SYS_IPRST0_DISPCRST_Msk (0x1ul << SYS_IPRST0_DISPCRST_Pos) /*!< SYS_T::IPRST0: DISPCRST Mask */ + +#define SYS_IPRST0_CCAP0RST_Pos (10) /*!< SYS_T::IPRST0: CCAP0RST Position */ +#define SYS_IPRST0_CCAP0RST_Msk (0x1ul << SYS_IPRST0_CCAP0RST_Pos) /*!< SYS_T::IPRST0: CCAP0RST Mask */ + +#define SYS_IPRST0_CCAP1RST_Pos (11) /*!< SYS_T::IPRST0: CCAP1RST Position */ +#define SYS_IPRST0_CCAP1RST_Msk (0x1ul << SYS_IPRST0_CCAP1RST_Pos) /*!< SYS_T::IPRST0: CCAP1RST Mask */ + +#define SYS_IPRST0_GFXRST_Pos (12) /*!< SYS_T::IPRST0: GFXRST Position */ +#define SYS_IPRST0_GFXRST_Msk (0x1ul << SYS_IPRST0_GFXRST_Pos) /*!< SYS_T::IPRST0: GFXRST Mask */ + +#define SYS_IPRST0_VDECRST_Pos (13) /*!< SYS_T::IPRST0: VDECRST Position */ +#define SYS_IPRST0_VDECRST_Msk (0x1ul << SYS_IPRST0_VDECRST_Pos) /*!< SYS_T::IPRST0: VDECRST Mask */ + +#define SYS_IPRST0_WRHO0RST_Pos (14) /*!< SYS_T::IPRST0: WRHO0RST Position */ +#define SYS_IPRST0_WRHO0RST_Msk (0x1ul << SYS_IPRST0_WRHO0RST_Pos) /*!< SYS_T::IPRST0: WRHO0RST Mask */ + +#define SYS_IPRST0_WRHO1RST_Pos (15) /*!< SYS_T::IPRST0: WRHO1RST Position */ +#define SYS_IPRST0_WRHO1RST_Msk (0x1ul << SYS_IPRST0_WRHO1RST_Pos) /*!< SYS_T::IPRST0: WRHO1RST Mask */ + +#define SYS_IPRST0_GMAC0RST_Pos (16) /*!< SYS_T::IPRST0: GMAC0RST Position */ +#define SYS_IPRST0_GMAC0RST_Msk (0x1ul << SYS_IPRST0_GMAC0RST_Pos) /*!< SYS_T::IPRST0: GMAC0RST Mask */ + +#define SYS_IPRST0_GMAC1RST_Pos (17) /*!< SYS_T::IPRST0: GMAC1RST Position */ +#define SYS_IPRST0_GMAC1RST_Msk (0x1ul << SYS_IPRST0_GMAC1RST_Pos) /*!< SYS_T::IPRST0: GMAC1RST Mask */ + +#define SYS_IPRST0_HWSEMRST_Pos (18) /*!< SYS_T::IPRST0: HWSEMRST Position */ +#define SYS_IPRST0_HWSEMRST_Msk (0x1ul << SYS_IPRST0_HWSEMRST_Pos) /*!< SYS_T::IPRST0: HWSEMRST Mask */ + +#define SYS_IPRST0_EBIRST_Pos (19) /*!< SYS_T::IPRST0: EBIRST Position */ +#define SYS_IPRST0_EBIRST_Msk (0x1ul << SYS_IPRST0_EBIRST_Pos) /*!< SYS_T::IPRST0: EBIRST Mask */ + +#define SYS_IPRST0_HSUSBH0RST_Pos (20) /*!< SYS_T::IPRST0: HSUSBH0RST Position */ +#define SYS_IPRST0_HSUSBH0RST_Msk (0x1ul << SYS_IPRST0_HSUSBH0RST_Pos) /*!< SYS_T::IPRST0: HSUSBH0RST Mask */ + +#define SYS_IPRST0_HSUSBH1RST_Pos (21) /*!< SYS_T::IPRST0: HSUSBH1RST Position */ +#define SYS_IPRST0_HSUSBH1RST_Msk (0x1ul << SYS_IPRST0_HSUSBH1RST_Pos) /*!< SYS_T::IPRST0: HSUSBH1RST Mask */ + +#define SYS_IPRST0_HSUSBDRST_Pos (22) /*!< SYS_T::IPRST0: HSUSBDRST Position */ +#define SYS_IPRST0_HSUSBDRST_Msk (0x1ul << SYS_IPRST0_HSUSBDRST_Pos) /*!< SYS_T::IPRST0: HSUSBDRST Mask */ + +#define SYS_IPRST0_SDH0RST_Pos (24) /*!< SYS_T::IPRST0: SDH0RST Position */ +#define SYS_IPRST0_SDH0RST_Msk (0x1ul << SYS_IPRST0_SDH0RST_Pos) /*!< SYS_T::IPRST0: SDH0RST Mask */ + +#define SYS_IPRST0_SDH1RST_Pos (25) /*!< SYS_T::IPRST0: SDH1RST Position */ +#define SYS_IPRST0_SDH1RST_Msk (0x1ul << SYS_IPRST0_SDH1RST_Pos) /*!< SYS_T::IPRST0: SDH1RST Mask */ + +#define SYS_IPRST0_NANDRST_Pos (26) /*!< SYS_T::IPRST0: NANDRST Position */ +#define SYS_IPRST0_NANDRST_Msk (0x1ul << SYS_IPRST0_NANDRST_Pos) /*!< SYS_T::IPRST0: NANDRST Mask */ + +#define SYS_IPRST0_GPIORST_Pos (27) /*!< SYS_T::IPRST0: GPIORST Position */ +#define SYS_IPRST0_GPIORST_Msk (0x1ul << SYS_IPRST0_GPIORST_Pos) /*!< SYS_T::IPRST0: GPIORST Mask */ + +#define SYS_IPRST0_MCTLPRST_Pos (28) /*!< SYS_T::IPRST0: MCTLPRST Position */ +#define SYS_IPRST0_MCTLPRST_Msk (0x1ul << SYS_IPRST0_MCTLPRST_Pos) /*!< SYS_T::IPRST0: MCTLPRST Mask */ + +#define SYS_IPRST0_MCTLCRST_Pos (29) /*!< SYS_T::IPRST0: MCTLCRST Position */ +#define SYS_IPRST0_MCTLCRST_Msk (0x1ul << SYS_IPRST0_MCTLCRST_Pos) /*!< SYS_T::IPRST0: MCTLCRST Mask */ + +#define SYS_IPRST0_DDRPUBRST_Pos (30) /*!< SYS_T::IPRST0: DDRPUBRST Position */ +#define SYS_IPRST0_DDRPUBRST_Msk (0x1ul << SYS_IPRST0_DDRPUBRST_Pos) /*!< SYS_T::IPRST0: DDRPUBRST Mask */ + +#define SYS_IPRST1_TMR0RST_Pos (2) /*!< SYS_T::IPRST1: TMR0RST Position */ +#define SYS_IPRST1_TMR0RST_Msk (0x1ul << SYS_IPRST1_TMR0RST_Pos) /*!< SYS_T::IPRST1: TMR0RST Mask */ + +#define SYS_IPRST1_TMR1RST_Pos (3) /*!< SYS_T::IPRST1: TMR1RST Position */ +#define SYS_IPRST1_TMR1RST_Msk (0x1ul << SYS_IPRST1_TMR1RST_Pos) /*!< SYS_T::IPRST1: TMR1RST Mask */ + +#define SYS_IPRST1_TMR2RST_Pos (4) /*!< SYS_T::IPRST1: TMR2RST Position */ +#define SYS_IPRST1_TMR2RST_Msk (0x1ul << SYS_IPRST1_TMR2RST_Pos) /*!< SYS_T::IPRST1: TMR2RST Mask */ + +#define SYS_IPRST1_TMR3RST_Pos (5) /*!< SYS_T::IPRST1: TMR3RST Position */ +#define SYS_IPRST1_TMR3RST_Msk (0x1ul << SYS_IPRST1_TMR3RST_Pos) /*!< SYS_T::IPRST1: TMR3RST Mask */ + +#define SYS_IPRST1_I2C0RST_Pos (8) /*!< SYS_T::IPRST1: I2C0RST Position */ +#define SYS_IPRST1_I2C0RST_Msk (0x1ul << SYS_IPRST1_I2C0RST_Pos) /*!< SYS_T::IPRST1: I2C0RST Mask */ + +#define SYS_IPRST1_I2C1RST_Pos (9) /*!< SYS_T::IPRST1: I2C1RST Position */ +#define SYS_IPRST1_I2C1RST_Msk (0x1ul << SYS_IPRST1_I2C1RST_Pos) /*!< SYS_T::IPRST1: I2C1RST Mask */ + +#define SYS_IPRST1_I2C2RST_Pos (10) /*!< SYS_T::IPRST1: I2C2RST Position */ +#define SYS_IPRST1_I2C2RST_Msk (0x1ul << SYS_IPRST1_I2C2RST_Pos) /*!< SYS_T::IPRST1: I2C2RST Mask */ + +#define SYS_IPRST1_I2C3RST_Pos (11) /*!< SYS_T::IPRST1: I2C3RST Position */ +#define SYS_IPRST1_I2C3RST_Msk (0x1ul << SYS_IPRST1_I2C3RST_Pos) /*!< SYS_T::IPRST1: I2C3RST Mask */ + +#define SYS_IPRST1_QSPI0RST_Pos (12) /*!< SYS_T::IPRST1: QSPI0RST Position */ +#define SYS_IPRST1_QSPI0RST_Msk (0x1ul << SYS_IPRST1_QSPI0RST_Pos) /*!< SYS_T::IPRST1: QSPI0RST Mask */ + +#define SYS_IPRST1_SPI0RST_Pos (13) /*!< SYS_T::IPRST1: SPI0RST Position */ +#define SYS_IPRST1_SPI0RST_Msk (0x1ul << SYS_IPRST1_SPI0RST_Pos) /*!< SYS_T::IPRST1: SPI0RST Mask */ + +#define SYS_IPRST1_SPI1RST_Pos (14) /*!< SYS_T::IPRST1: SPI1RST Position */ +#define SYS_IPRST1_SPI1RST_Msk (0x1ul << SYS_IPRST1_SPI1RST_Pos) /*!< SYS_T::IPRST1: SPI1RST Mask */ + +#define SYS_IPRST1_SPI2RST_Pos (15) /*!< SYS_T::IPRST1: SPI2RST Position */ +#define SYS_IPRST1_SPI2RST_Msk (0x1ul << SYS_IPRST1_SPI2RST_Pos) /*!< SYS_T::IPRST1: SPI2RST Mask */ + +#define SYS_IPRST1_UART0RST_Pos (16) /*!< SYS_T::IPRST1: UART0RST Position */ +#define SYS_IPRST1_UART0RST_Msk (0x1ul << SYS_IPRST1_UART0RST_Pos) /*!< SYS_T::IPRST1: UART0RST Mask */ + +#define SYS_IPRST1_UART1RST_Pos (17) /*!< SYS_T::IPRST1: UART1RST Position */ +#define SYS_IPRST1_UART1RST_Msk (0x1ul << SYS_IPRST1_UART1RST_Pos) /*!< SYS_T::IPRST1: UART1RST Mask */ + +#define SYS_IPRST1_UART2RST_Pos (18) /*!< SYS_T::IPRST1: UART2RST Position */ +#define SYS_IPRST1_UART2RST_Msk (0x1ul << SYS_IPRST1_UART2RST_Pos) /*!< SYS_T::IPRST1: UART2RST Mask */ + +#define SYS_IPRST1_UART3RST_Pos (19) /*!< SYS_T::IPRST1: UART3RST Position */ +#define SYS_IPRST1_UART3RST_Msk (0x1ul << SYS_IPRST1_UART3RST_Pos) /*!< SYS_T::IPRST1: UART3RST Mask */ + +#define SYS_IPRST1_UART4RST_Pos (20) /*!< SYS_T::IPRST1: UART4RST Position */ +#define SYS_IPRST1_UART4RST_Msk (0x1ul << SYS_IPRST1_UART4RST_Pos) /*!< SYS_T::IPRST1: UART4RST Mask */ + +#define SYS_IPRST1_UART5RST_Pos (21) /*!< SYS_T::IPRST1: UART5RST Position */ +#define SYS_IPRST1_UART5RST_Msk (0x1ul << SYS_IPRST1_UART5RST_Pos) /*!< SYS_T::IPRST1: UART5RST Mask */ + +#define SYS_IPRST1_UART6RST_Pos (22) /*!< SYS_T::IPRST1: UART6RST Position */ +#define SYS_IPRST1_UART6RST_Msk (0x1ul << SYS_IPRST1_UART6RST_Pos) /*!< SYS_T::IPRST1: UART6RST Mask */ + +#define SYS_IPRST1_UART7RST_Pos (23) /*!< SYS_T::IPRST1: UART7RST Position */ +#define SYS_IPRST1_UART7RST_Msk (0x1ul << SYS_IPRST1_UART7RST_Pos) /*!< SYS_T::IPRST1: UART7RST Mask */ + +#define SYS_IPRST1_CANFD0RST_Pos (24) /*!< SYS_T::IPRST1: CANFD0RST Position */ +#define SYS_IPRST1_CANFD0RST_Msk (0x1ul << SYS_IPRST1_CANFD0RST_Pos) /*!< SYS_T::IPRST1: CANFD0RST Mask */ + +#define SYS_IPRST1_CANFD1RST_Pos (25) /*!< SYS_T::IPRST1: CANFD1RST Position */ +#define SYS_IPRST1_CANFD1RST_Msk (0x1ul << SYS_IPRST1_CANFD1RST_Pos) /*!< SYS_T::IPRST1: CANFD1RST Mask */ + +#define SYS_IPRST1_EADC0RST_Pos (28) /*!< SYS_T::IPRST1: EADC0RST Position */ +#define SYS_IPRST1_EADC0RST_Msk (0x1ul << SYS_IPRST1_EADC0RST_Pos) /*!< SYS_T::IPRST1: EADC0RST Mask */ + +#define SYS_IPRST1_I2S0RST_Pos (29) /*!< SYS_T::IPRST1: I2S0RST Position */ +#define SYS_IPRST1_I2S0RST_Msk (0x1ul << SYS_IPRST1_I2S0RST_Pos) /*!< SYS_T::IPRST1: I2S0RST Mask */ + +#define SYS_IPRST2_SC0RST_Pos (0) /*!< SYS_T::IPRST2: SC0RST Position */ +#define SYS_IPRST2_SC0RST_Msk (0x1ul << SYS_IPRST2_SC0RST_Pos) /*!< SYS_T::IPRST2: SC0RST Mask */ + +#define SYS_IPRST2_SC1RST_Pos (1) /*!< SYS_T::IPRST2: SC1RST Position */ +#define SYS_IPRST2_SC1RST_Msk (0x1ul << SYS_IPRST2_SC1RST_Pos) /*!< SYS_T::IPRST2: SC1RST Mask */ + +#define SYS_IPRST2_QSPI1RST_Pos (4) /*!< SYS_T::IPRST2: QSPI1RST Position */ +#define SYS_IPRST2_QSPI1RST_Msk (0x1ul << SYS_IPRST2_QSPI1RST_Pos) /*!< SYS_T::IPRST2: QSPI1RST Mask */ + +#define SYS_IPRST2_SPI3RST_Pos (6) /*!< SYS_T::IPRST2: SPI3RST Position */ +#define SYS_IPRST2_SPI3RST_Msk (0x1ul << SYS_IPRST2_SPI3RST_Pos) /*!< SYS_T::IPRST2: SPI3RST Mask */ + +#define SYS_IPRST2_EPWM0RST_Pos (16) /*!< SYS_T::IPRST2: EPWM0RST Position */ +#define SYS_IPRST2_EPWM0RST_Msk (0x1ul << SYS_IPRST2_EPWM0RST_Pos) /*!< SYS_T::IPRST2: EPWM0RST Mask */ + +#define SYS_IPRST2_EPWM1RST_Pos (17) /*!< SYS_T::IPRST2: EPWM1RST Position */ +#define SYS_IPRST2_EPWM1RST_Msk (0x1ul << SYS_IPRST2_EPWM1RST_Pos) /*!< SYS_T::IPRST2: EPWM1RST Mask */ + +#define SYS_IPRST2_QEI0RST_Pos (22) /*!< SYS_T::IPRST2: QEI0RST Position */ +#define SYS_IPRST2_QEI0RST_Msk (0x1ul << SYS_IPRST2_QEI0RST_Pos) /*!< SYS_T::IPRST2: QEI0RST Mask */ + +#define SYS_IPRST2_QEI1RST_Pos (23) /*!< SYS_T::IPRST2: QEI1RST Position */ +#define SYS_IPRST2_QEI1RST_Msk (0x1ul << SYS_IPRST2_QEI1RST_Pos) /*!< SYS_T::IPRST2: QEI1RST Mask */ + +#define SYS_IPRST2_ECAP0RST_Pos (26) /*!< SYS_T::IPRST2: ECAP0RST Position */ +#define SYS_IPRST2_ECAP0RST_Msk (0x1ul << SYS_IPRST2_ECAP0RST_Pos) /*!< SYS_T::IPRST2: ECAP0RST Mask */ + +#define SYS_IPRST2_ECAP1RST_Pos (27) /*!< SYS_T::IPRST2: ECAP1RST Position */ +#define SYS_IPRST2_ECAP1RST_Msk (0x1ul << SYS_IPRST2_ECAP1RST_Pos) /*!< SYS_T::IPRST2: ECAP1RST Mask */ + +#define SYS_IPRST2_CANFD2RST_Pos (28) /*!< SYS_T::IPRST2: CANFD2RST Position */ +#define SYS_IPRST2_CANFD2RST_Msk (0x1ul << SYS_IPRST2_CANFD2RST_Pos) /*!< SYS_T::IPRST2: CANFD2RST Mask */ + +#define SYS_IPRST2_ADC0RST_Pos (31) /*!< SYS_T::IPRST2: ADC0RST Position */ +#define SYS_IPRST2_ADC0RST_Msk (0x1ul << SYS_IPRST2_ADC0RST_Pos) /*!< SYS_T::IPRST2: ADC0RST Mask */ + +#define SYS_IPRST3_TMR4RST_Pos (0) /*!< SYS_T::IPRST3: TMR4RST Position */ +#define SYS_IPRST3_TMR4RST_Msk (0x1ul << SYS_IPRST3_TMR4RST_Pos) /*!< SYS_T::IPRST3: TMR4RST Mask */ + +#define SYS_IPRST3_TMR5RST_Pos (1) /*!< SYS_T::IPRST3: TMR5RST Position */ +#define SYS_IPRST3_TMR5RST_Msk (0x1ul << SYS_IPRST3_TMR5RST_Pos) /*!< SYS_T::IPRST3: TMR5RST Mask */ + +#define SYS_IPRST3_TMR6RST_Pos (2) /*!< SYS_T::IPRST3: TMR6RST Position */ +#define SYS_IPRST3_TMR6RST_Msk (0x1ul << SYS_IPRST3_TMR6RST_Pos) /*!< SYS_T::IPRST3: TMR6RST Mask */ + +#define SYS_IPRST3_TMR7RST_Pos (3) /*!< SYS_T::IPRST3: TMR7RST Position */ +#define SYS_IPRST3_TMR7RST_Msk (0x1ul << SYS_IPRST3_TMR7RST_Pos) /*!< SYS_T::IPRST3: TMR7RST Mask */ + +#define SYS_IPRST3_TMR8RST_Pos (4) /*!< SYS_T::IPRST3: TMR8RST Position */ +#define SYS_IPRST3_TMR8RST_Msk (0x1ul << SYS_IPRST3_TMR8RST_Pos) /*!< SYS_T::IPRST3: TMR8RST Mask */ + +#define SYS_IPRST3_TMR9RST_Pos (5) /*!< SYS_T::IPRST3: TMR9RST Position */ +#define SYS_IPRST3_TMR9RST_Msk (0x1ul << SYS_IPRST3_TMR9RST_Pos) /*!< SYS_T::IPRST3: TMR9RST Mask */ + +#define SYS_IPRST3_TMR10RST_Pos (6) /*!< SYS_T::IPRST3: TMR10RST Position */ +#define SYS_IPRST3_TMR10RST_Msk (0x1ul << SYS_IPRST3_TMR10RST_Pos) /*!< SYS_T::IPRST3: TMR10RST Mask */ + +#define SYS_IPRST3_TMR11RST_Pos (7) /*!< SYS_T::IPRST3: TMR11RST Position */ +#define SYS_IPRST3_TMR11RST_Msk (0x1ul << SYS_IPRST3_TMR11RST_Pos) /*!< SYS_T::IPRST3: TMR11RST Mask */ + +#define SYS_IPRST3_UART8RST_Pos (8) /*!< SYS_T::IPRST3: UART8RST Position */ +#define SYS_IPRST3_UART8RST_Msk (0x1ul << SYS_IPRST3_UART8RST_Pos) /*!< SYS_T::IPRST3: UART8RST Mask */ + +#define SYS_IPRST3_UART9RST_Pos (9) /*!< SYS_T::IPRST3: UART9RST Position */ +#define SYS_IPRST3_UART9RST_Msk (0x1ul << SYS_IPRST3_UART9RST_Pos) /*!< SYS_T::IPRST3: UART9RST Mask */ + +#define SYS_IPRST3_UART10RST_Pos (10) /*!< SYS_T::IPRST3: UART10RST Position */ +#define SYS_IPRST3_UART10RST_Msk (0x1ul << SYS_IPRST3_UART10RST_Pos) /*!< SYS_T::IPRST3: UART10RST Mask */ + +#define SYS_IPRST3_UART11RST_Pos (11) /*!< SYS_T::IPRST3: UART11RST Position */ +#define SYS_IPRST3_UART11RST_Msk (0x1ul << SYS_IPRST3_UART11RST_Pos) /*!< SYS_T::IPRST3: UART11RST Mask */ + +#define SYS_IPRST3_UART12RST_Pos (12) /*!< SYS_T::IPRST3: UART12RST Position */ +#define SYS_IPRST3_UART12RST_Msk (0x1ul << SYS_IPRST3_UART12RST_Pos) /*!< SYS_T::IPRST3: UART12RST Mask */ + +#define SYS_IPRST3_UART13RST_Pos (13) /*!< SYS_T::IPRST3: UART13RST Position */ +#define SYS_IPRST3_UART13RST_Msk (0x1ul << SYS_IPRST3_UART13RST_Pos) /*!< SYS_T::IPRST3: UART13RST Mask */ + +#define SYS_IPRST3_UART14RST_Pos (14) /*!< SYS_T::IPRST3: UART14RST Position */ +#define SYS_IPRST3_UART14RST_Msk (0x1ul << SYS_IPRST3_UART14RST_Pos) /*!< SYS_T::IPRST3: UART14RST Mask */ + +#define SYS_IPRST3_UART15RST_Pos (15) /*!< SYS_T::IPRST3: UART15RST Position */ +#define SYS_IPRST3_UART15RST_Msk (0x1ul << SYS_IPRST3_UART15RST_Pos) /*!< SYS_T::IPRST3: UART15RST Mask */ + +#define SYS_IPRST3_UART16RST_Pos (16) /*!< SYS_T::IPRST3: UART16RST Position */ +#define SYS_IPRST3_UART16RST_Msk (0x1ul << SYS_IPRST3_UART16RST_Pos) /*!< SYS_T::IPRST3: UART16RST Mask */ + +#define SYS_IPRST3_I2S1RST_Pos (17) /*!< SYS_T::IPRST3: I2S1RST Position */ +#define SYS_IPRST3_I2S1RST_Msk (0x1ul << SYS_IPRST3_I2S1RST_Pos) /*!< SYS_T::IPRST3: I2S1RST Mask */ + +#define SYS_IPRST3_I2C4RST_Pos (18) /*!< SYS_T::IPRST3: I2C4RST Position */ +#define SYS_IPRST3_I2C4RST_Msk (0x1ul << SYS_IPRST3_I2C4RST_Pos) /*!< SYS_T::IPRST3: I2C4RST Mask */ + +#define SYS_IPRST3_I2C5RST_Pos (19) /*!< SYS_T::IPRST3: I2C5RST Position */ +#define SYS_IPRST3_I2C5RST_Msk (0x1ul << SYS_IPRST3_I2C5RST_Pos) /*!< SYS_T::IPRST3: I2C5RST Mask */ + +#define SYS_IPRST3_EPWM2RST_Pos (20) /*!< SYS_T::IPRST3: EPWM2RST Position */ +#define SYS_IPRST3_EPWM2RST_Msk (0x1ul << SYS_IPRST3_EPWM2RST_Pos) /*!< SYS_T::IPRST3: EPWM2RST Mask */ + +#define SYS_IPRST3_ECAP2RST_Pos (21) /*!< SYS_T::IPRST3: ECAP2RST Position */ +#define SYS_IPRST3_ECAP2RST_Msk (0x1ul << SYS_IPRST3_ECAP2RST_Pos) /*!< SYS_T::IPRST3: ECAP2RST Mask */ + +#define SYS_IPRST3_QEI2RST_Pos (22) /*!< SYS_T::IPRST3: QEI2RST Position */ +#define SYS_IPRST3_QEI2RST_Msk (0x1ul << SYS_IPRST3_QEI2RST_Pos) /*!< SYS_T::IPRST3: QEI2RST Mask */ + +#define SYS_IPRST3_CANFD3RST_Pos (23) /*!< SYS_T::IPRST3: CANFD3RST Position */ +#define SYS_IPRST3_CANFD3RST_Msk (0x1ul << SYS_IPRST3_CANFD3RST_Pos) /*!< SYS_T::IPRST3: CANFD3RST Mask */ + +#define SYS_IPRST3_KPIRST_Pos (24) /*!< SYS_T::IPRST3: KPIRST Position */ +#define SYS_IPRST3_KPIRST_Msk (0x1ul << SYS_IPRST3_KPIRST_Pos) /*!< SYS_T::IPRST3: KPIRST Mask */ + +#define SYS_IPRST3_GICRST_Pos (28) /*!< SYS_T::IPRST3: GICRST Position */ +#define SYS_IPRST3_GICRST_Msk (0x1ul << SYS_IPRST3_GICRST_Pos) /*!< SYS_T::IPRST3: GICRST Mask */ + +#define SYS_IPRST3_SSMCCRST_Pos (30) /*!< SYS_T::IPRST3: SSMCCRST Position */ +#define SYS_IPRST3_SSMCCRST_Msk (0x1ul << SYS_IPRST3_SSMCCRST_Pos) /*!< SYS_T::IPRST3: SSMCCRST Mask */ + +#define SYS_IPRST3_SSPCCRST_Pos (31) /*!< SYS_T::IPRST3: SSPCCRST Position */ +#define SYS_IPRST3_SSPCCRST_Msk (0x1ul << SYS_IPRST3_SSPCCRST_Pos) /*!< SYS_T::IPRST3: SSPCCRST Mask */ + +#define SYS_PMUCR_A35PGEN_Pos (0) /*!< SYS_T::PMUCR: A35PGEN Position */ +#define SYS_PMUCR_A35PGEN_Msk (0x1ul << SYS_PMUCR_A35PGEN_Pos) /*!< SYS_T::PMUCR: A35PGEN Mask */ + +#define SYS_PMUCR_AUTOL2FDIS_Pos (4) /*!< SYS_T::PMUCR: AUTOL2FDIS Position */ +#define SYS_PMUCR_AUTOL2FDIS_Msk (0x1ul << SYS_PMUCR_AUTOL2FDIS_Pos) /*!< SYS_T::PMUCR: AUTOL2FDIS Mask */ + +#define SYS_PMUCR_PDWKDLY_Pos (6) /*!< SYS_T::PMUCR: PDWKDLY Position */ +#define SYS_PMUCR_PDWKDLY_Msk (0x1ul << SYS_PMUCR_PDWKDLY_Pos) /*!< SYS_T::PMUCR: PDWKDLY Mask */ + +#define SYS_PMUCR_PWRSTBTM_Pos (8) /*!< SYS_T::PMUCR: PWRSTBTM Position */ +#define SYS_PMUCR_PWRSTBTM_Msk (0xful << SYS_PMUCR_PWRSTBTM_Pos) /*!< SYS_T::PMUCR: PWRSTBTM Mask */ + +#define SYS_PMUCR_PWRACKTO_Pos (12) /*!< SYS_T::PMUCR: PWRACKTO Position */ +#define SYS_PMUCR_PWRACKTO_Msk (0xful << SYS_PMUCR_PWRACKTO_Pos) /*!< SYS_T::PMUCR: PWRACKTO Mask */ + +#define SYS_PMUCR_A35PDEN_Pos (16) /*!< SYS_T::PMUCR: A35PDEN Position */ +#define SYS_PMUCR_A35PDEN_Msk (0x1ul << SYS_PMUCR_A35PDEN_Pos) /*!< SYS_T::PMUCR: A35PDEN Mask */ + +#define SYS_PMUCR_A35DBPDEN_Pos (18) /*!< SYS_T::PMUCR: A35DBPDEN Position */ +#define SYS_PMUCR_A35DBPDEN_Msk (0x1ul << SYS_PMUCR_A35DBPDEN_Pos) /*!< SYS_T::PMUCR: A35DBPDEN Mask */ + +#define SYS_PMUCR_RTPPDEN_Pos (24) /*!< SYS_T::PMUCR: RTPPDEN Position */ +#define SYS_PMUCR_RTPPDEN_Msk (0x1ul << SYS_PMUCR_RTPPDEN_Pos) /*!< SYS_T::PMUCR: RTPPDEN Mask */ + +#define SYS_PMUCR_RTPDBPDEN_Pos (26) /*!< SYS_T::PMUCR: RTPDBPDEN Position */ +#define SYS_PMUCR_RTPDBPDEN_Msk (0x1ul << SYS_PMUCR_RTPDBPDEN_Pos) /*!< SYS_T::PMUCR: RTPDBPDEN Mask */ + +#define SYS_DDRCQCSR_AXIQBYPAS_Pos (0) /*!< SYS_T::DDRCQCSR: AXIQBYPAS Position */ +#define SYS_DDRCQCSR_AXIQBYPAS_Msk (0xfful << SYS_DDRCQCSR_AXIQBYPAS_Pos) /*!< SYS_T::DDRCQCSR: AXIQBYPAS Mask */ + +#define SYS_DDRCQCSR_AXIQDENYIF_Pos (8) /*!< SYS_T::DDRCQCSR: AXIQDENYIF Position */ +#define SYS_DDRCQCSR_AXIQDENYIF_Msk (0xfful << SYS_DDRCQCSR_AXIQDENYIF_Pos) /*!< SYS_T::DDRCQCSR: AXIQDENYIF Mask */ + +#define SYS_DDRCQCSR_DDRCQBYPAS_Pos (16) /*!< SYS_T::DDRCQCSR: DDRCQBYPAS Position */ +#define SYS_DDRCQCSR_DDRCQBYPAS_Msk (0x1ul << SYS_DDRCQCSR_DDRCQBYPAS_Pos) /*!< SYS_T::DDRCQCSR: DDRCQBYPAS Mask */ + +#define SYS_DDRCQCSR_DDRCQDENYIF_Pos (17) /*!< SYS_T::DDRCQCSR: DDRCQDENYIF Position */ +#define SYS_DDRCQCSR_DDRCQDENYIF_Msk (0x1ul << SYS_DDRCQCSR_DDRCQDENYIF_Pos) /*!< SYS_T::DDRCQCSR: DDRCQDENYIF Mask */ + +#define SYS_DDRCQCSR_DDRQREQDLY_Pos (24) /*!< SYS_T::DDRCQCSR: DDRQREQDLY Position */ +#define SYS_DDRCQCSR_DDRQREQDLY_Msk (0xful << SYS_DDRCQCSR_DDRQREQDLY_Pos) /*!< SYS_T::DDRCQCSR: DDRQREQDLY Mask */ + +#define SYS_DDRCQCSR_DDRQACKTO_Pos (28) /*!< SYS_T::DDRCQCSR: DDRQACKTO Position */ +#define SYS_DDRCQCSR_DDRQACKTO_Msk (0xful << SYS_DDRCQCSR_DDRQACKTO_Pos) /*!< SYS_T::DDRCQCSR: DDRQACKTO Mask */ + +#define SYS_PMUIEN_PMUIEN_Pos (0) /*!< SYS_T::PMUIEN: PMUIEN Position */ +#define SYS_PMUIEN_PMUIEN_Msk (0x1ul << SYS_PMUIEN_PMUIEN_Pos) /*!< SYS_T::PMUIEN: PMUIEN Mask */ + +#define SYS_PMUIEN_A35PDWKIEN_Pos (8) /*!< SYS_T::PMUIEN: A35PDWKIEN Position */ +#define SYS_PMUIEN_A35PDWKIEN_Msk (0x1ul << SYS_PMUIEN_A35PDWKIEN_Pos) /*!< SYS_T::PMUIEN: A35PDWKIEN Mask */ + +#define SYS_PMUIEN_RTPPDWKIEN_Pos (12) /*!< SYS_T::PMUIEN: RTPPDWKIEN Position */ +#define SYS_PMUIEN_RTPPDWKIEN_Msk (0x1ul << SYS_PMUIEN_RTPPDWKIEN_Pos) /*!< SYS_T::PMUIEN: RTPPDWKIEN Mask */ + +#define SYS_PMUSTS_PMUIF_Pos (0) /*!< SYS_T::PMUSTS: PMUIF Position */ +#define SYS_PMUSTS_PMUIF_Msk (0x1ul << SYS_PMUSTS_PMUIF_Pos) /*!< SYS_T::PMUSTS: PMUIF Mask */ + +#define SYS_PMUSTS_PGTOIF_Pos (1) /*!< SYS_T::PMUSTS: PGTOIF Position */ +#define SYS_PMUSTS_PGTOIF_Msk (0x1ul << SYS_PMUSTS_PGTOIF_Pos) /*!< SYS_T::PMUSTS: PGTOIF Mask */ + +#define SYS_PMUSTS_L2FDONE_Pos (5) /*!< SYS_T::PMUSTS: L2FDONE Position */ +#define SYS_PMUSTS_L2FDONE_Msk (0x1ul << SYS_PMUSTS_L2FDONE_Pos) /*!< SYS_T::PMUSTS: L2FDONE Mask */ + +#define SYS_PMUSTS_A35PDWKIF_Pos (8) /*!< SYS_T::PMUSTS: A35PDWKIF Position */ +#define SYS_PMUSTS_A35PDWKIF_Msk (0x1ul << SYS_PMUSTS_A35PDWKIF_Pos) /*!< SYS_T::PMUSTS: A35PDWKIF Mask */ + +#define SYS_PMUSTS_RTPPDWKIF_Pos (12) /*!< SYS_T::PMUSTS: RTPPDWKIF Position */ +#define SYS_PMUSTS_RTPPDWKIF_Msk (0x1ul << SYS_PMUSTS_RTPPDWKIF_Pos) /*!< SYS_T::PMUSTS: RTPPDWKIF Mask */ + +#define SYS_PMUSTS_PWRACKCNT_Pos (16) /*!< SYS_T::PMUSTS: PWRACKCNT Position */ +#define SYS_PMUSTS_PWRACKCNT_Msk (0xfffful << SYS_PMUSTS_PWRACKCNT_Pos) /*!< SYS_T::PMUSTS: PWRACKCNT Mask */ + +#define SYS_CA35WRBADR0_WRMBTADDR_Pos (0) /*!< SYS_T::CA35WRBADR0: WRMBTADDR Position */ +#define SYS_CA35WRBADR0_WRMBTADDR_Msk (0xfffffffful << SYS_CA35WRBADR0_WRMBTADDR_Pos) /*!< SYS_T::CA35WRBADR0: WRMBTADDR Mask */ + +#define SYS_CA35WRBPAR0_WRMBTPARA_Pos (0) /*!< SYS_T::CA35WRBPAR0: WRMBTPARA Position */ +#define SYS_CA35WRBPAR0_WRMBTPARA_Msk (0xfffffffful << SYS_CA35WRBPAR0_WRMBTPARA_Pos) /*!< SYS_T::CA35WRBPAR0: WRMBTPARA Mask */ + +#define SYS_CA35WRBADR1_WRMBTADDR_Pos (0) /*!< SYS_T::CA35WRBADR1: WRMBTADDR Position */ +#define SYS_CA35WRBADR1_WRMBTADDR_Msk (0xfffffffful << SYS_CA35WRBADR1_WRMBTADDR_Pos) /*!< SYS_T::CA35WRBADR1: WRMBTADDR Mask */ + +#define SYS_CA35WRBPAR1_WRMBTPARA_Pos (0) /*!< SYS_T::CA35WRBPAR1: WRMBTPARA Position */ +#define SYS_CA35WRBPAR1_WRMBTPARA_Msk (0xfffffffful << SYS_CA35WRBPAR1_WRMBTPARA_Pos) /*!< SYS_T::CA35WRBPAR1: WRMBTPARA Mask */ + +#define SYS_USBPMISCR_PHY0POR_Pos (0) /*!< SYS_T::USBPMISCR: PHY0POR Position */ +#define SYS_USBPMISCR_PHY0POR_Msk (0x1ul << SYS_USBPMISCR_PHY0POR_Pos) /*!< SYS_T::USBPMISCR: PHY0POR Mask */ + +#define SYS_USBPMISCR_PHY0SUSPEND_Pos (1) /*!< SYS_T::USBPMISCR: PHY0SUSPEND Position */ +#define SYS_USBPMISCR_PHY0SUSPEND_Msk (0x1ul << SYS_USBPMISCR_PHY0SUSPEND_Pos) /*!< SYS_T::USBPMISCR: PHY0SUSPEND Mask */ + +#define SYS_USBPMISCR_PHY0COMN_Pos (2) /*!< SYS_T::USBPMISCR: PHY0COMN Position */ +#define SYS_USBPMISCR_PHY0COMN_Msk (0x1ul << SYS_USBPMISCR_PHY0COMN_Pos) /*!< SYS_T::USBPMISCR: PHY0COMN Mask */ + +#define SYS_USBPMISCR_VBUSDGSEL_Pos (4) /*!< SYS_T::USBPMISCR: VBUSDGSEL Position */ +#define SYS_USBPMISCR_VBUSDGSEL_Msk (0x7ul << SYS_USBPMISCR_VBUSDGSEL_Pos) /*!< SYS_T::USBPMISCR: VBUSDGSEL Mask */ + +#define SYS_USBPMISCR_EFUSESEL0_Pos (7) /*!< SYS_T::USBPMISCR: EFUSESEL0 Position */ +#define SYS_USBPMISCR_EFUSESEL0_Msk (0x1ul << SYS_USBPMISCR_EFUSESEL0_Pos) /*!< SYS_T::USBPMISCR: EFUSESEL0 Mask */ + +#define SYS_USBPMISCR_PHY0HSTCKSTB_Pos (8) /*!< SYS_T::USBPMISCR: PHY0HSTCKSTB Position*/ +#define SYS_USBPMISCR_PHY0HSTCKSTB_Msk (0x1ul << SYS_USBPMISCR_PHY0HSTCKSTB_Pos) /*!< SYS_T::USBPMISCR: PHY0HSTCKSTB Mask */ + +#define SYS_USBPMISCR_PHY0CK12MSTB_Pos (9) /*!< SYS_T::USBPMISCR: PHY0CK12MSTB Position*/ +#define SYS_USBPMISCR_PHY0CK12MSTB_Msk (0x1ul << SYS_USBPMISCR_PHY0CK12MSTB_Pos) /*!< SYS_T::USBPMISCR: PHY0CK12MSTB Mask */ + +#define SYS_USBPMISCR_PHY0DEVCKSTB_Pos (10) /*!< SYS_T::USBPMISCR: PHY0DEVCKSTB Position*/ +#define SYS_USBPMISCR_PHY0DEVCKSTB_Msk (0x1ul << SYS_USBPMISCR_PHY0DEVCKSTB_Pos) /*!< SYS_T::USBPMISCR: PHY0DEVCKSTB Mask */ + +#define SYS_USBPMISCR_RTUNESEL0_Pos (11) /*!< SYS_T::USBPMISCR: RTUNESEL0 Position */ +#define SYS_USBPMISCR_RTUNESEL0_Msk (0x1ul << SYS_USBPMISCR_RTUNESEL0_Pos) /*!< SYS_T::USBPMISCR: RTUNESEL0 Mask */ + +#define SYS_USBPMISCR_RCALCODE0_Pos (12) /*!< SYS_T::USBPMISCR: RCALCODE0 Position */ +#define SYS_USBPMISCR_RCALCODE0_Msk (0xful << SYS_USBPMISCR_RCALCODE0_Pos) /*!< SYS_T::USBPMISCR: RCALCODE0 Mask */ + +#define SYS_USBPMISCR_PHY1POR_Pos (16) /*!< SYS_T::USBPMISCR: PHY1POR Position */ +#define SYS_USBPMISCR_PHY1POR_Msk (0x1ul << SYS_USBPMISCR_PHY1POR_Pos) /*!< SYS_T::USBPMISCR: PHY1POR Mask */ + +#define SYS_USBPMISCR_PHY1SUSPEND_Pos (17) /*!< SYS_T::USBPMISCR: PHY1SUSPEND Position */ +#define SYS_USBPMISCR_PHY1SUSPEND_Msk (0x1ul << SYS_USBPMISCR_PHY1SUSPEND_Pos) /*!< SYS_T::USBPMISCR: PHY1SUSPEND Mask */ + +#define SYS_USBPMISCR_PHY1COMN_Pos (18) /*!< SYS_T::USBPMISCR: PHY1COMN Position */ +#define SYS_USBPMISCR_PHY1COMN_Msk (0x1ul << SYS_USBPMISCR_PHY1COMN_Pos) /*!< SYS_T::USBPMISCR: PHY1COMN Mask */ + +#define SYS_USBPMISCR_EFUSESEL1_Pos (23) /*!< SYS_T::USBPMISCR: EFUSESEL1 Position */ +#define SYS_USBPMISCR_EFUSESEL1_Msk (0x1ul << SYS_USBPMISCR_EFUSESEL1_Pos) /*!< SYS_T::USBPMISCR: EFUSESEL1 Mask */ + +#define SYS_USBPMISCR_PHY1HSTCKSTB_Pos (24) /*!< SYS_T::USBPMISCR: PHY1HSTCKSTB Position*/ +#define SYS_USBPMISCR_PHY1HSTCKSTB_Msk (0x1ul << SYS_USBPMISCR_PHY1HSTCKSTB_Pos) /*!< SYS_T::USBPMISCR: PHY1HSTCKSTB Mask */ + +#define SYS_USBPMISCR_PHY1CK12MSTB_Pos (25) /*!< SYS_T::USBPMISCR: PHY1CK12MSTB Position*/ +#define SYS_USBPMISCR_PHY1CK12MSTB_Msk (0x1ul << SYS_USBPMISCR_PHY1CK12MSTB_Pos) /*!< SYS_T::USBPMISCR: PHY1CK12MSTB Mask */ + +#define SYS_USBPMISCR_RTUNESEL1_Pos (27) /*!< SYS_T::USBPMISCR: RTUNESEL1 Position */ +#define SYS_USBPMISCR_RTUNESEL1_Msk (0x1ul << SYS_USBPMISCR_RTUNESEL1_Pos) /*!< SYS_T::USBPMISCR: RTUNESEL1 Mask */ + +#define SYS_USBPMISCR_RCALCODE1_Pos (28) /*!< SYS_T::USBPMISCR: RCALCODE1 Position */ +#define SYS_USBPMISCR_RCALCODE1_Msk (0xful << SYS_USBPMISCR_RCALCODE1_Pos) /*!< SYS_T::USBPMISCR: RCALCODE1 Mask */ + +#define SYS_USBP0PCR_COMPDISTUNE_Pos (0) /*!< SYS_T::USBP0PCR: COMPDISTUNE Position */ +#define SYS_USBP0PCR_COMPDISTUNE_Msk (0x7ul << SYS_USBP0PCR_COMPDISTUNE_Pos) /*!< SYS_T::USBP0PCR: COMPDISTUNE Mask */ + +#define SYS_USBP0PCR_EQBYPASSENB_Pos (3) /*!< SYS_T::USBP0PCR: EQBYPASSENB Position */ +#define SYS_USBP0PCR_EQBYPASSENB_Msk (0x1ul << SYS_USBP0PCR_EQBYPASSENB_Pos) /*!< SYS_T::USBP0PCR: EQBYPASSENB Mask */ + +#define SYS_USBP0PCR_SQRXTUNE_Pos (4) /*!< SYS_T::USBP0PCR: SQRXTUNE Position */ +#define SYS_USBP0PCR_SQRXTUNE_Msk (0x7ul << SYS_USBP0PCR_SQRXTUNE_Pos) /*!< SYS_T::USBP0PCR: SQRXTUNE Mask */ + +#define SYS_USBP0PCR_TXPREEMPPULSETUNE_Pos (7) /*!< SYS_T::USBP0PCR: TXPREEMPPULSETUNE Position*/ +#define SYS_USBP0PCR_TXPREEMPPULSETUNE_Msk (0x1ul << SYS_USBP0PCR_TXPREEMPPULSETUNE_Pos) /*!< SYS_T::USBP0PCR: TXPREEMPPULSETUNE Mask*/ + +#define SYS_USBP0PCR_PLLPTUNE_Pos (8) /*!< SYS_T::USBP0PCR: PLLPTUNE Position */ +#define SYS_USBP0PCR_PLLPTUNE_Msk (0xful << SYS_USBP0PCR_PLLPTUNE_Pos) /*!< SYS_T::USBP0PCR: PLLPTUNE Mask */ + +#define SYS_USBP0PCR_TXFSLSTUNE_Pos (12) /*!< SYS_T::USBP0PCR: TXFSLSTUNE Position */ +#define SYS_USBP0PCR_TXFSLSTUNE_Msk (0xful << SYS_USBP0PCR_TXFSLSTUNE_Pos) /*!< SYS_T::USBP0PCR: TXFSLSTUNE Mask */ + +#define SYS_USBP0PCR_PLLITUNE_Pos (16) /*!< SYS_T::USBP0PCR: PLLITUNE Position */ +#define SYS_USBP0PCR_PLLITUNE_Msk (0x3ul << SYS_USBP0PCR_PLLITUNE_Pos) /*!< SYS_T::USBP0PCR: PLLITUNE Mask */ + +#define SYS_USBP0PCR_TXPREEMPAMPTUNE_Pos (20) /*!< SYS_T::USBP0PCR: TXPREEMPAMPTUNE Position*/ +#define SYS_USBP0PCR_TXPREEMPAMPTUNE_Msk (0x3ul << SYS_USBP0PCR_TXPREEMPAMPTUNE_Pos) /*!< SYS_T::USBP0PCR: TXPREEMPAMPTUNE Mask */ + +#define SYS_USBP0PCR_TXRISETUNE_Pos (22) /*!< SYS_T::USBP0PCR: TXRISETUNE Position */ +#define SYS_USBP0PCR_TXRISETUNE_Msk (0x3ul << SYS_USBP0PCR_TXRISETUNE_Pos) /*!< SYS_T::USBP0PCR: TXRISETUNE Mask */ + +#define SYS_USBP0PCR_TXVREFTUNE_Pos (24) /*!< SYS_T::USBP0PCR: TXVREFTUNE Position */ +#define SYS_USBP0PCR_TXVREFTUNE_Msk (0xful << SYS_USBP0PCR_TXVREFTUNE_Pos) /*!< SYS_T::USBP0PCR: TXVREFTUNE Mask */ + +#define SYS_USBP0PCR_TXHSXVTUNE_Pos (28) /*!< SYS_T::USBP0PCR: TXHSXVTUNE Position */ +#define SYS_USBP0PCR_TXHSXVTUNE_Msk (0x3ul << SYS_USBP0PCR_TXHSXVTUNE_Pos) /*!< SYS_T::USBP0PCR: TXHSXVTUNE Mask */ + +#define SYS_USBP0PCR_TXRESTUNE_Pos (30) /*!< SYS_T::USBP0PCR: TXRESTUNE Position */ +#define SYS_USBP0PCR_TXRESTUNE_Msk (0x3ul << SYS_USBP0PCR_TXRESTUNE_Pos) /*!< SYS_T::USBP0PCR: TXRESTUNE Mask */ + +#define SYS_USBP1PCR_COMPDISTUNE_Pos (0) /*!< SYS_T::USBP1PCR: COMPDISTUNE Position */ +#define SYS_USBP1PCR_COMPDISTUNE_Msk (0x7ul << SYS_USBP1PCR_COMPDISTUNE_Pos) /*!< SYS_T::USBP1PCR: COMPDISTUNE Mask */ + +#define SYS_USBP1PCR_EQBYPASSENB_Pos (3) /*!< SYS_T::USBP1PCR: EQBYPASSENB Position */ +#define SYS_USBP1PCR_EQBYPASSENB_Msk (0x1ul << SYS_USBP1PCR_EQBYPASSENB_Pos) /*!< SYS_T::USBP1PCR: EQBYPASSENB Mask */ + +#define SYS_USBP1PCR_SQRXTUNE_Pos (4) /*!< SYS_T::USBP1PCR: SQRXTUNE Position */ +#define SYS_USBP1PCR_SQRXTUNE_Msk (0x7ul << SYS_USBP1PCR_SQRXTUNE_Pos) /*!< SYS_T::USBP1PCR: SQRXTUNE Mask */ + +#define SYS_USBP1PCR_TXPREEMPPULSETUNE_Pos (7) /*!< SYS_T::USBP1PCR: TXPREEMPPULSETUNE Position*/ +#define SYS_USBP1PCR_TXPREEMPPULSETUNE_Msk (0x1ul << SYS_USBP1PCR_TXPREEMPPULSETUNE_Pos) /*!< SYS_T::USBP1PCR: TXPREEMPPULSETUNE Mask*/ + +#define SYS_USBP1PCR_PLLPTUNE_Pos (8) /*!< SYS_T::USBP1PCR: PLLPTUNE Position */ +#define SYS_USBP1PCR_PLLPTUNE_Msk (0xful << SYS_USBP1PCR_PLLPTUNE_Pos) /*!< SYS_T::USBP1PCR: PLLPTUNE Mask */ + +#define SYS_USBP1PCR_TXFSLSTUNE_Pos (12) /*!< SYS_T::USBP1PCR: TXFSLSTUNE Position */ +#define SYS_USBP1PCR_TXFSLSTUNE_Msk (0xful << SYS_USBP1PCR_TXFSLSTUNE_Pos) /*!< SYS_T::USBP1PCR: TXFSLSTUNE Mask */ + +#define SYS_USBP1PCR_PLLITUNE_Pos (16) /*!< SYS_T::USBP1PCR: PLLITUNE Position */ +#define SYS_USBP1PCR_PLLITUNE_Msk (0x3ul << SYS_USBP1PCR_PLLITUNE_Pos) /*!< SYS_T::USBP1PCR: PLLITUNE Mask */ + +#define SYS_USBP1PCR_TXPREEMPAMPTUNE_Pos (20) /*!< SYS_T::USBP1PCR: TXPREEMPAMPTUNE Position*/ +#define SYS_USBP1PCR_TXPREEMPAMPTUNE_Msk (0x3ul << SYS_USBP1PCR_TXPREEMPAMPTUNE_Pos) /*!< SYS_T::USBP1PCR: TXPREEMPAMPTUNE Mask */ + +#define SYS_USBP1PCR_TXRISETUNE_Pos (22) /*!< SYS_T::USBP1PCR: TXRISETUNE Position */ +#define SYS_USBP1PCR_TXRISETUNE_Msk (0x3ul << SYS_USBP1PCR_TXRISETUNE_Pos) /*!< SYS_T::USBP1PCR: TXRISETUNE Mask */ + +#define SYS_USBP1PCR_TXVREFTUNE_Pos (24) /*!< SYS_T::USBP1PCR: TXVREFTUNE Position */ +#define SYS_USBP1PCR_TXVREFTUNE_Msk (0xful << SYS_USBP1PCR_TXVREFTUNE_Pos) /*!< SYS_T::USBP1PCR: TXVREFTUNE Mask */ + +#define SYS_USBP1PCR_TXHSXVTUNE_Pos (28) /*!< SYS_T::USBP1PCR: TXHSXVTUNE Position */ +#define SYS_USBP1PCR_TXHSXVTUNE_Msk (0x3ul << SYS_USBP1PCR_TXHSXVTUNE_Pos) /*!< SYS_T::USBP1PCR: TXHSXVTUNE Mask */ + +#define SYS_USBP1PCR_TXRESTUNE_Pos (30) /*!< SYS_T::USBP1PCR: TXRESTUNE Position */ +#define SYS_USBP1PCR_TXRESTUNE_Msk (0x3ul << SYS_USBP1PCR_TXRESTUNE_Pos) /*!< SYS_T::USBP1PCR: TXRESTUNE Mask */ + +#define SYS_MISCFCR0_RTPICACHEN_Pos (0) /*!< SYS_T::MISCFCR0: RTPICACHEN Position */ +#define SYS_MISCFCR0_RTPICACHEN_Msk (0x1ul << SYS_MISCFCR0_RTPICACHEN_Pos) /*!< SYS_T::MISCFCR0: RTPICACHEN Mask */ + +#define SYS_MISCFCR0_RTPDCACHEN_Pos (1) /*!< SYS_T::MISCFCR0: RTPDCACHEN Position */ +#define SYS_MISCFCR0_RTPDCACHEN_Msk (0x1ul << SYS_MISCFCR0_RTPDCACHEN_Pos) /*!< SYS_T::MISCFCR0: RTPDCACHEN Mask */ + +#define SYS_MISCFCR0_RTPDRMAEN_Pos (2) /*!< SYS_T::MISCFCR0: RTPDRMAEN Position */ +#define SYS_MISCFCR0_RTPDRMAEN_Msk (0x1ul << SYS_MISCFCR0_RTPDRMAEN_Pos) /*!< SYS_T::MISCFCR0: RTPDRMAEN Mask */ + +#define SYS_MISCFCR0_WDT0RSTEN_Pos (8) /*!< SYS_T::MISCFCR0: WDT0RSTEN Position */ +#define SYS_MISCFCR0_WDT0RSTEN_Msk (0x1ul << SYS_MISCFCR0_WDT0RSTEN_Pos) /*!< SYS_T::MISCFCR0: WDT0RSTEN Mask */ + +#define SYS_MISCFCR0_HDSPUEN_Pos (9) /*!< SYS_T::MISCFCR0: HDSPUEN Position */ +#define SYS_MISCFCR0_HDSPUEN_Msk (0x1ul << SYS_MISCFCR0_HDSPUEN_Pos) /*!< SYS_T::MISCFCR0: HDSPUEN Mask */ + +#define SYS_MISCFCR0_UHOVRCURH_Pos (12) /*!< SYS_T::MISCFCR0: UHOVRCURH Position */ +#define SYS_MISCFCR0_UHOVRCURH_Msk (0x1ul << SYS_MISCFCR0_UHOVRCURH_Pos) /*!< SYS_T::MISCFCR0: UHOVRCURH Mask */ + +#define SYS_MISCFCR0_SELFTEST_Pos (13) /*!< SYS_T::MISCFCR0: SELFTEST Position */ +#define SYS_MISCFCR0_SELFTEST_Msk (0x1ul << SYS_MISCFCR0_SELFTEST_Pos) /*!< SYS_T::MISCFCR0: SELFTEST Mask */ + +#define SYS_MISCFCR0_WDT1RSTEN_Pos (14) /*!< SYS_T::MISCFCR0: WDT1RSTEN Position */ +#define SYS_MISCFCR0_WDT1RSTEN_Msk (0x1ul << SYS_MISCFCR0_WDT1RSTEN_Pos) /*!< SYS_T::MISCFCR0: WDT1RSTEN Mask */ + +#define SYS_MISCFCR0_WDT2RSTEN_Pos (15) /*!< SYS_T::MISCFCR0: WDT2RSTEN Position */ +#define SYS_MISCFCR0_WDT2RSTEN_Msk (0x1ul << SYS_MISCFCR0_WDT2RSTEN_Pos) /*!< SYS_T::MISCFCR0: WDT2RSTEN Mask */ + +#define SYS_MISCFCR0_SDH0VSTB_Pos (16) /*!< SYS_T::MISCFCR0: SDH0VSTB Position */ +#define SYS_MISCFCR0_SDH0VSTB_Msk (0x1ul << SYS_MISCFCR0_SDH0VSTB_Pos) /*!< SYS_T::MISCFCR0: SDH0VSTB Mask */ + +#define SYS_MISCFCR0_SDH1VSTB_Pos (17) /*!< SYS_T::MISCFCR0: SDH1VSTB Position */ +#define SYS_MISCFCR0_SDH1VSTB_Msk (0x1ul << SYS_MISCFCR0_SDH1VSTB_Pos) /*!< SYS_T::MISCFCR0: SDH1VSTB Mask */ + +#define SYS_MISCFCR0_VBUSWKEN_Pos (18) /*!< SYS_T::MISCFCR0: VBUSWKEN Position */ +#define SYS_MISCFCR0_VBUSWKEN_Msk (0x1ul << SYS_MISCFCR0_VBUSWKEN_Pos) /*!< SYS_T::MISCFCR0: VBUSWKEN Mask */ + +#define SYS_MISCFCR0_LNSTWKEN_Pos (19) /*!< SYS_T::MISCFCR0: LNSTWKEN Position */ +#define SYS_MISCFCR0_LNSTWKEN_Msk (0x1ul << SYS_MISCFCR0_LNSTWKEN_Pos) /*!< SYS_T::MISCFCR0: LNSTWKEN Mask */ + +#define SYS_MISCFCR0_DDRCGDIS_Pos (23) /*!< SYS_T::MISCFCR0: DDRCGDIS Position */ +#define SYS_MISCFCR0_DDRCGDIS_Msk (0x1ul << SYS_MISCFCR0_DDRCGDIS_Pos) /*!< SYS_T::MISCFCR0: DDRCGDIS Mask */ + +#define SYS_MISCFCR0_DRATSRDLY_Pos (24) /*!< SYS_T::MISCFCR0: DRATSRDLY Position */ +#define SYS_MISCFCR0_DRATSRDLY_Msk (0xfful << SYS_MISCFCR0_DRATSRDLY_Pos) /*!< SYS_T::MISCFCR0: DRATSRDLY Mask */ + +#define SYS_MISCFCR1_CANFD0PDEN_Pos (0) /*!< SYS_T::MISCFCR1: CANFD0PDEN Position */ +#define SYS_MISCFCR1_CANFD0PDEN_Msk (0x1ul << SYS_MISCFCR1_CANFD0PDEN_Pos) /*!< SYS_T::MISCFCR1: CANFD0PDEN Mask */ + +#define SYS_MISCFCR1_CANFD1PDEN_Pos (1) /*!< SYS_T::MISCFCR1: CANFD1PDEN Position */ +#define SYS_MISCFCR1_CANFD1PDEN_Msk (0x1ul << SYS_MISCFCR1_CANFD1PDEN_Pos) /*!< SYS_T::MISCFCR1: CANFD1PDEN Mask */ + +#define SYS_MISCFCR1_CANFD2PDEN_Pos (2) /*!< SYS_T::MISCFCR1: CANFD2PDEN Position */ +#define SYS_MISCFCR1_CANFD2PDEN_Msk (0x1ul << SYS_MISCFCR1_CANFD2PDEN_Pos) /*!< SYS_T::MISCFCR1: CANFD2PDEN Mask */ + +#define SYS_MISCFCR1_CANFD3PDEN_Pos (3) /*!< SYS_T::MISCFCR1: CANFD3PDEN Position */ +#define SYS_MISCFCR1_CANFD3PDEN_Msk (0x1ul << SYS_MISCFCR1_CANFD3PDEN_Pos) /*!< SYS_T::MISCFCR1: CANFD3PDEN Mask */ + +#define SYS_MISCFCR1_CANFD0CKSTP_Pos (4) /*!< SYS_T::MISCFCR1: CANFD0CKSTP Position */ +#define SYS_MISCFCR1_CANFD0CKSTP_Msk (0x1ul << SYS_MISCFCR1_CANFD0CKSTP_Pos) /*!< SYS_T::MISCFCR1: CANFD0CKSTP Mask */ + +#define SYS_MISCFCR1_CANFD1CKSTP_Pos (5) /*!< SYS_T::MISCFCR1: CANFD1CKSTP Position */ +#define SYS_MISCFCR1_CANFD1CKSTP_Msk (0x1ul << SYS_MISCFCR1_CANFD1CKSTP_Pos) /*!< SYS_T::MISCFCR1: CANFD1CKSTP Mask */ + +#define SYS_MISCFCR1_CANFD2CKSTP_Pos (6) /*!< SYS_T::MISCFCR1: CANFD2CKSTP Position */ +#define SYS_MISCFCR1_CANFD2CKSTP_Msk (0x1ul << SYS_MISCFCR1_CANFD2CKSTP_Pos) /*!< SYS_T::MISCFCR1: CANFD2CKSTP Mask */ + +#define SYS_MISCFCR1_CANFD3CKSTP_Pos (7) /*!< SYS_T::MISCFCR1: CANFD3CKSTP Position */ +#define SYS_MISCFCR1_CANFD3CKSTP_Msk (0x1ul << SYS_MISCFCR1_CANFD3CKSTP_Pos) /*!< SYS_T::MISCFCR1: CANFD3CKSTP Mask */ + +#define SYS_MISCFCR1_HXTDS_Pos (8) /*!< SYS_T::MISCFCR1: HXTDS Position */ +#define SYS_MISCFCR1_HXTDS_Msk (0x3ul << SYS_MISCFCR1_HXTDS_Pos) /*!< SYS_T::MISCFCR1: HXTDS Mask */ + +#define SYS_MISCFCR1_TSENSRTRIM_Pos (12) /*!< SYS_T::MISCFCR1: TSENSRTRIM Position */ +#define SYS_MISCFCR1_TSENSRTRIM_Msk (0xful << SYS_MISCFCR1_TSENSRTRIM_Pos) /*!< SYS_T::MISCFCR1: TSENSRTRIM Mask */ + +#define SYS_MISCFCR1_RMEL1RAM_Pos (16) /*!< SYS_T::MISCFCR1: RMEL1RAM Position */ +#define SYS_MISCFCR1_RMEL1RAM_Msk (0x1ul << SYS_MISCFCR1_RMEL1RAM_Pos) /*!< SYS_T::MISCFCR1: RMEL1RAM Mask */ + +#define SYS_MISCFCR1_RMESYSRAM_Pos (17) /*!< SYS_T::MISCFCR1: RMESYSRAM Position */ +#define SYS_MISCFCR1_RMESYSRAM_Msk (0x1ul << SYS_MISCFCR1_RMESYSRAM_Pos) /*!< SYS_T::MISCFCR1: RMESYSRAM Mask */ + +#define SYS_MISCIER_LVDIEN_Pos (0) /*!< SYS_T::MISCIER: LVDIEN Position */ +#define SYS_MISCIER_LVDIEN_Msk (0x1ul << SYS_MISCIER_LVDIEN_Pos) /*!< SYS_T::MISCIER: LVDIEN Mask */ + +#define SYS_MISCIER_USB0IDCHGIEN_Pos (1) /*!< SYS_T::MISCIER: USB0IDCHGIEN Position */ +#define SYS_MISCIER_USB0IDCHGIEN_Msk (0x1ul << SYS_MISCIER_USB0IDCHGIEN_Pos) /*!< SYS_T::MISCIER: USB0IDCHGIEN Mask */ + +#define SYS_MISCIER_VBUSCHGIEN_Pos (2) /*!< SYS_T::MISCIER: VBUSCHGIEN Position */ +#define SYS_MISCIER_VBUSCHGIEN_Msk (0x1ul << SYS_MISCIER_VBUSCHGIEN_Pos) /*!< SYS_T::MISCIER: VBUSCHGIEN Mask */ + +#define SYS_MISCISR_LVDIF_Pos (0) /*!< SYS_T::MISCISR: LVDIF Position */ +#define SYS_MISCISR_LVDIF_Msk (0x1ul << SYS_MISCISR_LVDIF_Pos) /*!< SYS_T::MISCISR: LVDIF Mask */ + +#define SYS_MISCISR_USB0IDCHGIF_Pos (1) /*!< SYS_T::MISCISR: USB0IDCHGIF Position */ +#define SYS_MISCISR_USB0IDCHGIF_Msk (0x1ul << SYS_MISCISR_USB0IDCHGIF_Pos) /*!< SYS_T::MISCISR: USB0IDCHGIF Mask */ + +#define SYS_MISCISR_VBUSCHGIF_Pos (2) /*!< SYS_T::MISCISR: VBUSCHGIF Position */ +#define SYS_MISCISR_VBUSCHGIF_Msk (0x1ul << SYS_MISCISR_VBUSCHGIF_Pos) /*!< SYS_T::MISCISR: VBUSCHGIF Mask */ + +#define SYS_MISCISR_LVDSTS_Pos (16) /*!< SYS_T::MISCISR: LVDSTS Position */ +#define SYS_MISCISR_LVDSTS_Msk (0x1ul << SYS_MISCISR_LVDSTS_Pos) /*!< SYS_T::MISCISR: LVDSTS Mask */ + +#define SYS_MISCISR_USB0IDSTS_Pos (17) /*!< SYS_T::MISCISR: USB0IDSTS Position */ +#define SYS_MISCISR_USB0IDSTS_Msk (0x1ul << SYS_MISCISR_USB0IDSTS_Pos) /*!< SYS_T::MISCISR: USB0IDSTS Mask */ + +#define SYS_MISCISR_VBUSSTS_Pos (18) /*!< SYS_T::MISCISR: VBUSSTS Position */ +#define SYS_MISCISR_VBUSSTS_Msk (0x1ul << SYS_MISCISR_VBUSSTS_Pos) /*!< SYS_T::MISCISR: VBUSSTS Mask */ + +#define SYS_GPA_MFPL_PA0MFP_Pos (0) /*!< SYS_T::GPA_MFPL: PA0MFP Position */ +#define SYS_GPA_MFPL_PA0MFP_Msk (0xful << SYS_GPA_MFPL_PA0MFP_Pos) /*!< SYS_T::GPA_MFPL: PA0MFP Mask */ + +#define SYS_GPA_MFPL_PA1MFP_Pos (4) /*!< SYS_T::GPA_MFPL: PA1MFP Position */ +#define SYS_GPA_MFPL_PA1MFP_Msk (0xful << SYS_GPA_MFPL_PA1MFP_Pos) /*!< SYS_T::GPA_MFPL: PA1MFP Mask */ + +#define SYS_GPA_MFPL_PA2MFP_Pos (8) /*!< SYS_T::GPA_MFPL: PA2MFP Position */ +#define SYS_GPA_MFPL_PA2MFP_Msk (0xful << SYS_GPA_MFPL_PA2MFP_Pos) /*!< SYS_T::GPA_MFPL: PA2MFP Mask */ + +#define SYS_GPA_MFPL_PA3MFP_Pos (12) /*!< SYS_T::GPA_MFPL: PA3MFP Position */ +#define SYS_GPA_MFPL_PA3MFP_Msk (0xful << SYS_GPA_MFPL_PA3MFP_Pos) /*!< SYS_T::GPA_MFPL: PA3MFP Mask */ + +#define SYS_GPA_MFPL_PA4MFP_Pos (16) /*!< SYS_T::GPA_MFPL: PA4MFP Position */ +#define SYS_GPA_MFPL_PA4MFP_Msk (0xful << SYS_GPA_MFPL_PA4MFP_Pos) /*!< SYS_T::GPA_MFPL: PA4MFP Mask */ + +#define SYS_GPA_MFPL_PA5MFP_Pos (20) /*!< SYS_T::GPA_MFPL: PA5MFP Position */ +#define SYS_GPA_MFPL_PA5MFP_Msk (0xful << SYS_GPA_MFPL_PA5MFP_Pos) /*!< SYS_T::GPA_MFPL: PA5MFP Mask */ + +#define SYS_GPA_MFPL_PA6MFP_Pos (24) /*!< SYS_T::GPA_MFPL: PA6MFP Position */ +#define SYS_GPA_MFPL_PA6MFP_Msk (0xful << SYS_GPA_MFPL_PA6MFP_Pos) /*!< SYS_T::GPA_MFPL: PA6MFP Mask */ + +#define SYS_GPA_MFPL_PA7MFP_Pos (28) /*!< SYS_T::GPA_MFPL: PA7MFP Position */ +#define SYS_GPA_MFPL_PA7MFP_Msk (0xful << SYS_GPA_MFPL_PA7MFP_Pos) /*!< SYS_T::GPA_MFPL: PA7MFP Mask */ + +#define SYS_GPA_MFPH_PA8MFP_Pos (0) /*!< SYS_T::GPA_MFPH: PA8MFP Position */ +#define SYS_GPA_MFPH_PA8MFP_Msk (0xful << SYS_GPA_MFPH_PA8MFP_Pos) /*!< SYS_T::GPA_MFPH: PA8MFP Mask */ + +#define SYS_GPA_MFPH_PA9MFP_Pos (4) /*!< SYS_T::GPA_MFPH: PA9MFP Position */ +#define SYS_GPA_MFPH_PA9MFP_Msk (0xful << SYS_GPA_MFPH_PA9MFP_Pos) /*!< SYS_T::GPA_MFPH: PA9MFP Mask */ + +#define SYS_GPA_MFPH_PA10MFP_Pos (8) /*!< SYS_T::GPA_MFPH: PA10MFP Position */ +#define SYS_GPA_MFPH_PA10MFP_Msk (0xful << SYS_GPA_MFPH_PA10MFP_Pos) /*!< SYS_T::GPA_MFPH: PA10MFP Mask */ + +#define SYS_GPA_MFPH_PA11MFP_Pos (12) /*!< SYS_T::GPA_MFPH: PA11MFP Position */ +#define SYS_GPA_MFPH_PA11MFP_Msk (0xful << SYS_GPA_MFPH_PA11MFP_Pos) /*!< SYS_T::GPA_MFPH: PA11MFP Mask */ + +#define SYS_GPA_MFPH_PA12MFP_Pos (16) /*!< SYS_T::GPA_MFPH: PA12MFP Position */ +#define SYS_GPA_MFPH_PA12MFP_Msk (0xful << SYS_GPA_MFPH_PA12MFP_Pos) /*!< SYS_T::GPA_MFPH: PA12MFP Mask */ + +#define SYS_GPA_MFPH_PA13MFP_Pos (20) /*!< SYS_T::GPA_MFPH: PA13MFP Position */ +#define SYS_GPA_MFPH_PA13MFP_Msk (0xful << SYS_GPA_MFPH_PA13MFP_Pos) /*!< SYS_T::GPA_MFPH: PA13MFP Mask */ + +#define SYS_GPA_MFPH_PA14MFP_Pos (24) /*!< SYS_T::GPA_MFPH: PA14MFP Position */ +#define SYS_GPA_MFPH_PA14MFP_Msk (0xful << SYS_GPA_MFPH_PA14MFP_Pos) /*!< SYS_T::GPA_MFPH: PA14MFP Mask */ + +#define SYS_GPA_MFPH_PA15MFP_Pos (28) /*!< SYS_T::GPA_MFPH: PA15MFP Position */ +#define SYS_GPA_MFPH_PA15MFP_Msk (0xful << SYS_GPA_MFPH_PA15MFP_Pos) /*!< SYS_T::GPA_MFPH: PA15MFP Mask */ + +#define SYS_GPB_MFPL_PB0MFP_Pos (0) /*!< SYS_T::GPB_MFPL: PB0MFP Position */ +#define SYS_GPB_MFPL_PB0MFP_Msk (0xful << SYS_GPB_MFPL_PB0MFP_Pos) /*!< SYS_T::GPB_MFPL: PB0MFP Mask */ + +#define SYS_GPB_MFPL_PB1MFP_Pos (4) /*!< SYS_T::GPB_MFPL: PB1MFP Position */ +#define SYS_GPB_MFPL_PB1MFP_Msk (0xful << SYS_GPB_MFPL_PB1MFP_Pos) /*!< SYS_T::GPB_MFPL: PB1MFP Mask */ + +#define SYS_GPB_MFPL_PB2MFP_Pos (8) /*!< SYS_T::GPB_MFPL: PB2MFP Position */ +#define SYS_GPB_MFPL_PB2MFP_Msk (0xful << SYS_GPB_MFPL_PB2MFP_Pos) /*!< SYS_T::GPB_MFPL: PB2MFP Mask */ + +#define SYS_GPB_MFPL_PB3MFP_Pos (12) /*!< SYS_T::GPB_MFPL: PB3MFP Position */ +#define SYS_GPB_MFPL_PB3MFP_Msk (0xful << SYS_GPB_MFPL_PB3MFP_Pos) /*!< SYS_T::GPB_MFPL: PB3MFP Mask */ + +#define SYS_GPB_MFPL_PB4MFP_Pos (16) /*!< SYS_T::GPB_MFPL: PB4MFP Position */ +#define SYS_GPB_MFPL_PB4MFP_Msk (0xful << SYS_GPB_MFPL_PB4MFP_Pos) /*!< SYS_T::GPB_MFPL: PB4MFP Mask */ + +#define SYS_GPB_MFPL_PB5MFP_Pos (20) /*!< SYS_T::GPB_MFPL: PB5MFP Position */ +#define SYS_GPB_MFPL_PB5MFP_Msk (0xful << SYS_GPB_MFPL_PB5MFP_Pos) /*!< SYS_T::GPB_MFPL: PB5MFP Mask */ + +#define SYS_GPB_MFPL_PB6MFP_Pos (24) /*!< SYS_T::GPB_MFPL: PB6MFP Position */ +#define SYS_GPB_MFPL_PB6MFP_Msk (0xful << SYS_GPB_MFPL_PB6MFP_Pos) /*!< SYS_T::GPB_MFPL: PB6MFP Mask */ + +#define SYS_GPB_MFPL_PB7MFP_Pos (28) /*!< SYS_T::GPB_MFPL: PB7MFP Position */ +#define SYS_GPB_MFPL_PB7MFP_Msk (0xful << SYS_GPB_MFPL_PB7MFP_Pos) /*!< SYS_T::GPB_MFPL: PB7MFP Mask */ + +#define SYS_GPB_MFPH_PB8MFP_Pos (0) /*!< SYS_T::GPB_MFPH: PB8MFP Position */ +#define SYS_GPB_MFPH_PB8MFP_Msk (0xful << SYS_GPB_MFPH_PB8MFP_Pos) /*!< SYS_T::GPB_MFPH: PB8MFP Mask */ + +#define SYS_GPB_MFPH_PB9MFP_Pos (4) /*!< SYS_T::GPB_MFPH: PB9MFP Position */ +#define SYS_GPB_MFPH_PB9MFP_Msk (0xful << SYS_GPB_MFPH_PB9MFP_Pos) /*!< SYS_T::GPB_MFPH: PB9MFP Mask */ + +#define SYS_GPB_MFPH_PB10MFP_Pos (8) /*!< SYS_T::GPB_MFPH: PB10MFP Position */ +#define SYS_GPB_MFPH_PB10MFP_Msk (0xful << SYS_GPB_MFPH_PB10MFP_Pos) /*!< SYS_T::GPB_MFPH: PB10MFP Mask */ + +#define SYS_GPB_MFPH_PB11MFP_Pos (12) /*!< SYS_T::GPB_MFPH: PB11MFP Position */ +#define SYS_GPB_MFPH_PB11MFP_Msk (0xful << SYS_GPB_MFPH_PB11MFP_Pos) /*!< SYS_T::GPB_MFPH: PB11MFP Mask */ + +#define SYS_GPB_MFPH_PB12MFP_Pos (16) /*!< SYS_T::GPB_MFPH: PB12MFP Position */ +#define SYS_GPB_MFPH_PB12MFP_Msk (0xful << SYS_GPB_MFPH_PB12MFP_Pos) /*!< SYS_T::GPB_MFPH: PB12MFP Mask */ + +#define SYS_GPB_MFPH_PB13MFP_Pos (20) /*!< SYS_T::GPB_MFPH: PB13MFP Position */ +#define SYS_GPB_MFPH_PB13MFP_Msk (0xful << SYS_GPB_MFPH_PB13MFP_Pos) /*!< SYS_T::GPB_MFPH: PB13MFP Mask */ + +#define SYS_GPB_MFPH_PB14MFP_Pos (24) /*!< SYS_T::GPB_MFPH: PB14MFP Position */ +#define SYS_GPB_MFPH_PB14MFP_Msk (0xful << SYS_GPB_MFPH_PB14MFP_Pos) /*!< SYS_T::GPB_MFPH: PB14MFP Mask */ + +#define SYS_GPB_MFPH_PB15MFP_Pos (28) /*!< SYS_T::GPB_MFPH: PB15MFP Position */ +#define SYS_GPB_MFPH_PB15MFP_Msk (0xful << SYS_GPB_MFPH_PB15MFP_Pos) /*!< SYS_T::GPB_MFPH: PB15MFP Mask */ + +#define SYS_GPC_MFPL_PC0MFP_Pos (0) /*!< SYS_T::GPC_MFPL: PC0MFP Position */ +#define SYS_GPC_MFPL_PC0MFP_Msk (0xful << SYS_GPC_MFPL_PC0MFP_Pos) /*!< SYS_T::GPC_MFPL: PC0MFP Mask */ + +#define SYS_GPC_MFPL_PC1MFP_Pos (4) /*!< SYS_T::GPC_MFPL: PC1MFP Position */ +#define SYS_GPC_MFPL_PC1MFP_Msk (0xful << SYS_GPC_MFPL_PC1MFP_Pos) /*!< SYS_T::GPC_MFPL: PC1MFP Mask */ + +#define SYS_GPC_MFPL_PC2MFP_Pos (8) /*!< SYS_T::GPC_MFPL: PC2MFP Position */ +#define SYS_GPC_MFPL_PC2MFP_Msk (0xful << SYS_GPC_MFPL_PC2MFP_Pos) /*!< SYS_T::GPC_MFPL: PC2MFP Mask */ + +#define SYS_GPC_MFPL_PC3MFP_Pos (12) /*!< SYS_T::GPC_MFPL: PC3MFP Position */ +#define SYS_GPC_MFPL_PC3MFP_Msk (0xful << SYS_GPC_MFPL_PC3MFP_Pos) /*!< SYS_T::GPC_MFPL: PC3MFP Mask */ + +#define SYS_GPC_MFPL_PC4MFP_Pos (16) /*!< SYS_T::GPC_MFPL: PC4MFP Position */ +#define SYS_GPC_MFPL_PC4MFP_Msk (0xful << SYS_GPC_MFPL_PC4MFP_Pos) /*!< SYS_T::GPC_MFPL: PC4MFP Mask */ + +#define SYS_GPC_MFPL_PC5MFP_Pos (20) /*!< SYS_T::GPC_MFPL: PC5MFP Position */ +#define SYS_GPC_MFPL_PC5MFP_Msk (0xful << SYS_GPC_MFPL_PC5MFP_Pos) /*!< SYS_T::GPC_MFPL: PC5MFP Mask */ + +#define SYS_GPC_MFPL_PC6MFP_Pos (24) /*!< SYS_T::GPC_MFPL: PC6MFP Position */ +#define SYS_GPC_MFPL_PC6MFP_Msk (0xful << SYS_GPC_MFPL_PC6MFP_Pos) /*!< SYS_T::GPC_MFPL: PC6MFP Mask */ + +#define SYS_GPC_MFPL_PC7MFP_Pos (28) /*!< SYS_T::GPC_MFPL: PC7MFP Position */ +#define SYS_GPC_MFPL_PC7MFP_Msk (0xful << SYS_GPC_MFPL_PC7MFP_Pos) /*!< SYS_T::GPC_MFPL: PC7MFP Mask */ + +#define SYS_GPC_MFPH_PC8MFP_Pos (0) /*!< SYS_T::GPC_MFPH: PC8MFP Position */ +#define SYS_GPC_MFPH_PC8MFP_Msk (0xful << SYS_GPC_MFPH_PC8MFP_Pos) /*!< SYS_T::GPC_MFPH: PC8MFP Mask */ + +#define SYS_GPC_MFPH_PC9MFP_Pos (4) /*!< SYS_T::GPC_MFPH: PC9MFP Position */ +#define SYS_GPC_MFPH_PC9MFP_Msk (0xful << SYS_GPC_MFPH_PC9MFP_Pos) /*!< SYS_T::GPC_MFPH: PC9MFP Mask */ + +#define SYS_GPC_MFPH_PC10MFP_Pos (8) /*!< SYS_T::GPC_MFPH: PC10MFP Position */ +#define SYS_GPC_MFPH_PC10MFP_Msk (0xful << SYS_GPC_MFPH_PC10MFP_Pos) /*!< SYS_T::GPC_MFPH: PC10MFP Mask */ + +#define SYS_GPC_MFPH_PC11MFP_Pos (12) /*!< SYS_T::GPC_MFPH: PC11MFP Position */ +#define SYS_GPC_MFPH_PC11MFP_Msk (0xful << SYS_GPC_MFPH_PC11MFP_Pos) /*!< SYS_T::GPC_MFPH: PC11MFP Mask */ + +#define SYS_GPC_MFPH_PC12MFP_Pos (16) /*!< SYS_T::GPC_MFPH: PC12MFP Position */ +#define SYS_GPC_MFPH_PC12MFP_Msk (0xful << SYS_GPC_MFPH_PC12MFP_Pos) /*!< SYS_T::GPC_MFPH: PC12MFP Mask */ + +#define SYS_GPC_MFPH_PC13MFP_Pos (20) /*!< SYS_T::GPC_MFPH: PC13MFP Position */ +#define SYS_GPC_MFPH_PC13MFP_Msk (0xful << SYS_GPC_MFPH_PC13MFP_Pos) /*!< SYS_T::GPC_MFPH: PC13MFP Mask */ + +#define SYS_GPC_MFPH_PC14MFP_Pos (24) /*!< SYS_T::GPC_MFPH: PC14MFP Position */ +#define SYS_GPC_MFPH_PC14MFP_Msk (0xful << SYS_GPC_MFPH_PC14MFP_Pos) /*!< SYS_T::GPC_MFPH: PC14MFP Mask */ + +#define SYS_GPC_MFPH_PC15MFP_Pos (28) /*!< SYS_T::GPC_MFPH: PC15MFP Position */ +#define SYS_GPC_MFPH_PC15MFP_Msk (0xful << SYS_GPC_MFPH_PC15MFP_Pos) /*!< SYS_T::GPC_MFPH: PC15MFP Mask */ + +#define SYS_GPD_MFPL_PD0MFP_Pos (0) /*!< SYS_T::GPD_MFPL: PD0MFP Position */ +#define SYS_GPD_MFPL_PD0MFP_Msk (0xful << SYS_GPD_MFPL_PD0MFP_Pos) /*!< SYS_T::GPD_MFPL: PD0MFP Mask */ + +#define SYS_GPD_MFPL_PD1MFP_Pos (4) /*!< SYS_T::GPD_MFPL: PD1MFP Position */ +#define SYS_GPD_MFPL_PD1MFP_Msk (0xful << SYS_GPD_MFPL_PD1MFP_Pos) /*!< SYS_T::GPD_MFPL: PD1MFP Mask */ + +#define SYS_GPD_MFPL_PD2MFP_Pos (8) /*!< SYS_T::GPD_MFPL: PD2MFP Position */ +#define SYS_GPD_MFPL_PD2MFP_Msk (0xful << SYS_GPD_MFPL_PD2MFP_Pos) /*!< SYS_T::GPD_MFPL: PD2MFP Mask */ + +#define SYS_GPD_MFPL_PD3MFP_Pos (12) /*!< SYS_T::GPD_MFPL: PD3MFP Position */ +#define SYS_GPD_MFPL_PD3MFP_Msk (0xful << SYS_GPD_MFPL_PD3MFP_Pos) /*!< SYS_T::GPD_MFPL: PD3MFP Mask */ + +#define SYS_GPD_MFPL_PD4MFP_Pos (16) /*!< SYS_T::GPD_MFPL: PD4MFP Position */ +#define SYS_GPD_MFPL_PD4MFP_Msk (0xful << SYS_GPD_MFPL_PD4MFP_Pos) /*!< SYS_T::GPD_MFPL: PD4MFP Mask */ + +#define SYS_GPD_MFPL_PD5MFP_Pos (20) /*!< SYS_T::GPD_MFPL: PD5MFP Position */ +#define SYS_GPD_MFPL_PD5MFP_Msk (0xful << SYS_GPD_MFPL_PD5MFP_Pos) /*!< SYS_T::GPD_MFPL: PD5MFP Mask */ + +#define SYS_GPD_MFPL_PD6MFP_Pos (24) /*!< SYS_T::GPD_MFPL: PD6MFP Position */ +#define SYS_GPD_MFPL_PD6MFP_Msk (0xful << SYS_GPD_MFPL_PD6MFP_Pos) /*!< SYS_T::GPD_MFPL: PD6MFP Mask */ + +#define SYS_GPD_MFPL_PD7MFP_Pos (28) /*!< SYS_T::GPD_MFPL: PD7MFP Position */ +#define SYS_GPD_MFPL_PD7MFP_Msk (0xful << SYS_GPD_MFPL_PD7MFP_Pos) /*!< SYS_T::GPD_MFPL: PD7MFP Mask */ + +#define SYS_GPD_MFPH_PD8MFP_Pos (0) /*!< SYS_T::GPD_MFPH: PD8MFP Position */ +#define SYS_GPD_MFPH_PD8MFP_Msk (0xful << SYS_GPD_MFPH_PD8MFP_Pos) /*!< SYS_T::GPD_MFPH: PD8MFP Mask */ + +#define SYS_GPD_MFPH_PD9MFP_Pos (4) /*!< SYS_T::GPD_MFPH: PD9MFP Position */ +#define SYS_GPD_MFPH_PD9MFP_Msk (0xful << SYS_GPD_MFPH_PD9MFP_Pos) /*!< SYS_T::GPD_MFPH: PD9MFP Mask */ + +#define SYS_GPD_MFPH_PD10MFP_Pos (8) /*!< SYS_T::GPD_MFPH: PD10MFP Position */ +#define SYS_GPD_MFPH_PD10MFP_Msk (0xful << SYS_GPD_MFPH_PD10MFP_Pos) /*!< SYS_T::GPD_MFPH: PD10MFP Mask */ + +#define SYS_GPD_MFPH_PD11MFP_Pos (12) /*!< SYS_T::GPD_MFPH: PD11MFP Position */ +#define SYS_GPD_MFPH_PD11MFP_Msk (0xful << SYS_GPD_MFPH_PD11MFP_Pos) /*!< SYS_T::GPD_MFPH: PD11MFP Mask */ + +#define SYS_GPD_MFPH_PD12MFP_Pos (16) /*!< SYS_T::GPD_MFPH: PD12MFP Position */ +#define SYS_GPD_MFPH_PD12MFP_Msk (0xful << SYS_GPD_MFPH_PD12MFP_Pos) /*!< SYS_T::GPD_MFPH: PD12MFP Mask */ + +#define SYS_GPD_MFPH_PD13MFP_Pos (20) /*!< SYS_T::GPD_MFPH: PD13MFP Position */ +#define SYS_GPD_MFPH_PD13MFP_Msk (0xful << SYS_GPD_MFPH_PD13MFP_Pos) /*!< SYS_T::GPD_MFPH: PD13MFP Mask */ + +#define SYS_GPD_MFPH_PD14MFP_Pos (24) /*!< SYS_T::GPD_MFPH: PD14MFP Position */ +#define SYS_GPD_MFPH_PD14MFP_Msk (0xful << SYS_GPD_MFPH_PD14MFP_Pos) /*!< SYS_T::GPD_MFPH: PD14MFP Mask */ + +#define SYS_GPD_MFPH_PD15MFP_Pos (28) /*!< SYS_T::GPD_MFPH: PD15MFP Position */ +#define SYS_GPD_MFPH_PD15MFP_Msk (0xful << SYS_GPD_MFPH_PD15MFP_Pos) /*!< SYS_T::GPD_MFPH: PD15MFP Mask */ + +#define SYS_GPE_MFPL_PE0MFP_Pos (0) /*!< SYS_T::GPE_MFPL: PE0MFP Position */ +#define SYS_GPE_MFPL_PE0MFP_Msk (0xful << SYS_GPE_MFPL_PE0MFP_Pos) /*!< SYS_T::GPE_MFPL: PE0MFP Mask */ + +#define SYS_GPE_MFPL_PE1MFP_Pos (4) /*!< SYS_T::GPE_MFPL: PE1MFP Position */ +#define SYS_GPE_MFPL_PE1MFP_Msk (0xful << SYS_GPE_MFPL_PE1MFP_Pos) /*!< SYS_T::GPE_MFPL: PE1MFP Mask */ + +#define SYS_GPE_MFPL_PE2MFP_Pos (8) /*!< SYS_T::GPE_MFPL: PE2MFP Position */ +#define SYS_GPE_MFPL_PE2MFP_Msk (0xful << SYS_GPE_MFPL_PE2MFP_Pos) /*!< SYS_T::GPE_MFPL: PE2MFP Mask */ + +#define SYS_GPE_MFPL_PE3MFP_Pos (12) /*!< SYS_T::GPE_MFPL: PE3MFP Position */ +#define SYS_GPE_MFPL_PE3MFP_Msk (0xful << SYS_GPE_MFPL_PE3MFP_Pos) /*!< SYS_T::GPE_MFPL: PE3MFP Mask */ + +#define SYS_GPE_MFPL_PE4MFP_Pos (16) /*!< SYS_T::GPE_MFPL: PE4MFP Position */ +#define SYS_GPE_MFPL_PE4MFP_Msk (0xful << SYS_GPE_MFPL_PE4MFP_Pos) /*!< SYS_T::GPE_MFPL: PE4MFP Mask */ + +#define SYS_GPE_MFPL_PE5MFP_Pos (20) /*!< SYS_T::GPE_MFPL: PE5MFP Position */ +#define SYS_GPE_MFPL_PE5MFP_Msk (0xful << SYS_GPE_MFPL_PE5MFP_Pos) /*!< SYS_T::GPE_MFPL: PE5MFP Mask */ + +#define SYS_GPE_MFPL_PE6MFP_Pos (24) /*!< SYS_T::GPE_MFPL: PE6MFP Position */ +#define SYS_GPE_MFPL_PE6MFP_Msk (0xful << SYS_GPE_MFPL_PE6MFP_Pos) /*!< SYS_T::GPE_MFPL: PE6MFP Mask */ + +#define SYS_GPE_MFPL_PE7MFP_Pos (28) /*!< SYS_T::GPE_MFPL: PE7MFP Position */ +#define SYS_GPE_MFPL_PE7MFP_Msk (0xful << SYS_GPE_MFPL_PE7MFP_Pos) /*!< SYS_T::GPE_MFPL: PE7MFP Mask */ + +#define SYS_GPE_MFPH_PE8MFP_Pos (0) /*!< SYS_T::GPE_MFPH: PE8MFP Position */ +#define SYS_GPE_MFPH_PE8MFP_Msk (0xful << SYS_GPE_MFPH_PE8MFP_Pos) /*!< SYS_T::GPE_MFPH: PE8MFP Mask */ + +#define SYS_GPE_MFPH_PE9MFP_Pos (4) /*!< SYS_T::GPE_MFPH: PE9MFP Position */ +#define SYS_GPE_MFPH_PE9MFP_Msk (0xful << SYS_GPE_MFPH_PE9MFP_Pos) /*!< SYS_T::GPE_MFPH: PE9MFP Mask */ + +#define SYS_GPE_MFPH_PE10MFP_Pos (8) /*!< SYS_T::GPE_MFPH: PE10MFP Position */ +#define SYS_GPE_MFPH_PE10MFP_Msk (0xful << SYS_GPE_MFPH_PE10MFP_Pos) /*!< SYS_T::GPE_MFPH: PE10MFP Mask */ + +#define SYS_GPE_MFPH_PE11MFP_Pos (12) /*!< SYS_T::GPE_MFPH: PE11MFP Position */ +#define SYS_GPE_MFPH_PE11MFP_Msk (0xful << SYS_GPE_MFPH_PE11MFP_Pos) /*!< SYS_T::GPE_MFPH: PE11MFP Mask */ + +#define SYS_GPE_MFPH_PE12MFP_Pos (16) /*!< SYS_T::GPE_MFPH: PE12MFP Position */ +#define SYS_GPE_MFPH_PE12MFP_Msk (0xful << SYS_GPE_MFPH_PE12MFP_Pos) /*!< SYS_T::GPE_MFPH: PE12MFP Mask */ + +#define SYS_GPE_MFPH_PE13MFP_Pos (20) /*!< SYS_T::GPE_MFPH: PE13MFP Position */ +#define SYS_GPE_MFPH_PE13MFP_Msk (0xful << SYS_GPE_MFPH_PE13MFP_Pos) /*!< SYS_T::GPE_MFPH: PE13MFP Mask */ + +#define SYS_GPE_MFPH_PE14MFP_Pos (24) /*!< SYS_T::GPE_MFPH: PE14MFP Position */ +#define SYS_GPE_MFPH_PE14MFP_Msk (0xful << SYS_GPE_MFPH_PE14MFP_Pos) /*!< SYS_T::GPE_MFPH: PE14MFP Mask */ + +#define SYS_GPE_MFPH_PE15MFP_Pos (28) /*!< SYS_T::GPE_MFPH: PE15MFP Position */ +#define SYS_GPE_MFPH_PE15MFP_Msk (0xful << SYS_GPE_MFPH_PE15MFP_Pos) /*!< SYS_T::GPE_MFPH: PE15MFP Mask */ + +#define SYS_GPF_MFPL_PF0MFP_Pos (0) /*!< SYS_T::GPF_MFPL: PF0MFP Position */ +#define SYS_GPF_MFPL_PF0MFP_Msk (0xful << SYS_GPF_MFPL_PF0MFP_Pos) /*!< SYS_T::GPF_MFPL: PF0MFP Mask */ + +#define SYS_GPF_MFPL_PF1MFP_Pos (4) /*!< SYS_T::GPF_MFPL: PF1MFP Position */ +#define SYS_GPF_MFPL_PF1MFP_Msk (0xful << SYS_GPF_MFPL_PF1MFP_Pos) /*!< SYS_T::GPF_MFPL: PF1MFP Mask */ + +#define SYS_GPF_MFPL_PF2MFP_Pos (8) /*!< SYS_T::GPF_MFPL: PF2MFP Position */ +#define SYS_GPF_MFPL_PF2MFP_Msk (0xful << SYS_GPF_MFPL_PF2MFP_Pos) /*!< SYS_T::GPF_MFPL: PF2MFP Mask */ + +#define SYS_GPF_MFPL_PF3MFP_Pos (12) /*!< SYS_T::GPF_MFPL: PF3MFP Position */ +#define SYS_GPF_MFPL_PF3MFP_Msk (0xful << SYS_GPF_MFPL_PF3MFP_Pos) /*!< SYS_T::GPF_MFPL: PF3MFP Mask */ + +#define SYS_GPF_MFPL_PF4MFP_Pos (16) /*!< SYS_T::GPF_MFPL: PF4MFP Position */ +#define SYS_GPF_MFPL_PF4MFP_Msk (0xful << SYS_GPF_MFPL_PF4MFP_Pos) /*!< SYS_T::GPF_MFPL: PF4MFP Mask */ + +#define SYS_GPF_MFPL_PF5MFP_Pos (20) /*!< SYS_T::GPF_MFPL: PF5MFP Position */ +#define SYS_GPF_MFPL_PF5MFP_Msk (0xful << SYS_GPF_MFPL_PF5MFP_Pos) /*!< SYS_T::GPF_MFPL: PF5MFP Mask */ + +#define SYS_GPF_MFPL_PF6MFP_Pos (24) /*!< SYS_T::GPF_MFPL: PF6MFP Position */ +#define SYS_GPF_MFPL_PF6MFP_Msk (0xful << SYS_GPF_MFPL_PF6MFP_Pos) /*!< SYS_T::GPF_MFPL: PF6MFP Mask */ + +#define SYS_GPF_MFPL_PF7MFP_Pos (28) /*!< SYS_T::GPF_MFPL: PF7MFP Position */ +#define SYS_GPF_MFPL_PF7MFP_Msk (0xful << SYS_GPF_MFPL_PF7MFP_Pos) /*!< SYS_T::GPF_MFPL: PF7MFP Mask */ + +#define SYS_GPF_MFPH_PF8MFP_Pos (0) /*!< SYS_T::GPF_MFPH: PF8MFP Position */ +#define SYS_GPF_MFPH_PF8MFP_Msk (0xful << SYS_GPF_MFPH_PF8MFP_Pos) /*!< SYS_T::GPF_MFPH: PF8MFP Mask */ + +#define SYS_GPF_MFPH_PF9MFP_Pos (4) /*!< SYS_T::GPF_MFPH: PF9MFP Position */ +#define SYS_GPF_MFPH_PF9MFP_Msk (0xful << SYS_GPF_MFPH_PF9MFP_Pos) /*!< SYS_T::GPF_MFPH: PF9MFP Mask */ + +#define SYS_GPF_MFPH_PF10MFP_Pos (8) /*!< SYS_T::GPF_MFPH: PF10MFP Position */ +#define SYS_GPF_MFPH_PF10MFP_Msk (0xful << SYS_GPF_MFPH_PF10MFP_Pos) /*!< SYS_T::GPF_MFPH: PF10MFP Mask */ + +#define SYS_GPF_MFPH_PF11MFP_Pos (12) /*!< SYS_T::GPF_MFPH: PF11MFP Position */ +#define SYS_GPF_MFPH_PF11MFP_Msk (0xful << SYS_GPF_MFPH_PF11MFP_Pos) /*!< SYS_T::GPF_MFPH: PF11MFP Mask */ + +#define SYS_GPF_MFPH_PF12MFP_Pos (16) /*!< SYS_T::GPF_MFPH: PF12MFP Position */ +#define SYS_GPF_MFPH_PF12MFP_Msk (0xful << SYS_GPF_MFPH_PF12MFP_Pos) /*!< SYS_T::GPF_MFPH: PF12MFP Mask */ + +#define SYS_GPF_MFPH_PF13MFP_Pos (20) /*!< SYS_T::GPF_MFPH: PF13MFP Position */ +#define SYS_GPF_MFPH_PF13MFP_Msk (0xful << SYS_GPF_MFPH_PF13MFP_Pos) /*!< SYS_T::GPF_MFPH: PF13MFP Mask */ + +#define SYS_GPF_MFPH_PF14MFP_Pos (24) /*!< SYS_T::GPF_MFPH: PF14MFP Position */ +#define SYS_GPF_MFPH_PF14MFP_Msk (0xful << SYS_GPF_MFPH_PF14MFP_Pos) /*!< SYS_T::GPF_MFPH: PF14MFP Mask */ + +#define SYS_GPF_MFPH_PF15MFP_Pos (28) /*!< SYS_T::GPF_MFPH: PF15MFP Position */ +#define SYS_GPF_MFPH_PF15MFP_Msk (0xful << SYS_GPF_MFPH_PF15MFP_Pos) /*!< SYS_T::GPF_MFPH: PF15MFP Mask */ + +#define SYS_GPG_MFPL_PG0MFP_Pos (0) /*!< SYS_T::GPG_MFPL: PG0MFP Position */ +#define SYS_GPG_MFPL_PG0MFP_Msk (0xful << SYS_GPG_MFPL_PG0MFP_Pos) /*!< SYS_T::GPG_MFPL: PG0MFP Mask */ + +#define SYS_GPG_MFPL_PG1MFP_Pos (4) /*!< SYS_T::GPG_MFPL: PG1MFP Position */ +#define SYS_GPG_MFPL_PG1MFP_Msk (0xful << SYS_GPG_MFPL_PG1MFP_Pos) /*!< SYS_T::GPG_MFPL: PG1MFP Mask */ + +#define SYS_GPG_MFPL_PG2MFP_Pos (8) /*!< SYS_T::GPG_MFPL: PG2MFP Position */ +#define SYS_GPG_MFPL_PG2MFP_Msk (0xful << SYS_GPG_MFPL_PG2MFP_Pos) /*!< SYS_T::GPG_MFPL: PG2MFP Mask */ + +#define SYS_GPG_MFPL_PG3MFP_Pos (12) /*!< SYS_T::GPG_MFPL: PG3MFP Position */ +#define SYS_GPG_MFPL_PG3MFP_Msk (0xful << SYS_GPG_MFPL_PG3MFP_Pos) /*!< SYS_T::GPG_MFPL: PG3MFP Mask */ + +#define SYS_GPG_MFPL_PG4MFP_Pos (16) /*!< SYS_T::GPG_MFPL: PG4MFP Position */ +#define SYS_GPG_MFPL_PG4MFP_Msk (0xful << SYS_GPG_MFPL_PG4MFP_Pos) /*!< SYS_T::GPG_MFPL: PG4MFP Mask */ + +#define SYS_GPG_MFPL_PG5MFP_Pos (20) /*!< SYS_T::GPG_MFPL: PG5MFP Position */ +#define SYS_GPG_MFPL_PG5MFP_Msk (0xful << SYS_GPG_MFPL_PG5MFP_Pos) /*!< SYS_T::GPG_MFPL: PG5MFP Mask */ + +#define SYS_GPG_MFPL_PG6MFP_Pos (24) /*!< SYS_T::GPG_MFPL: PG6MFP Position */ +#define SYS_GPG_MFPL_PG6MFP_Msk (0xful << SYS_GPG_MFPL_PG6MFP_Pos) /*!< SYS_T::GPG_MFPL: PG6MFP Mask */ + +#define SYS_GPG_MFPL_PG7MFP_Pos (28) /*!< SYS_T::GPG_MFPL: PG7MFP Position */ +#define SYS_GPG_MFPL_PG7MFP_Msk (0xful << SYS_GPG_MFPL_PG7MFP_Pos) /*!< SYS_T::GPG_MFPL: PG7MFP Mask */ + +#define SYS_GPG_MFPH_PG8MFP_Pos (0) /*!< SYS_T::GPG_MFPH: PG8MFP Position */ +#define SYS_GPG_MFPH_PG8MFP_Msk (0xful << SYS_GPG_MFPH_PG8MFP_Pos) /*!< SYS_T::GPG_MFPH: PG8MFP Mask */ + +#define SYS_GPG_MFPH_PG9MFP_Pos (4) /*!< SYS_T::GPG_MFPH: PG9MFP Position */ +#define SYS_GPG_MFPH_PG9MFP_Msk (0xful << SYS_GPG_MFPH_PG9MFP_Pos) /*!< SYS_T::GPG_MFPH: PG9MFP Mask */ + +#define SYS_GPG_MFPH_PG10MFP_Pos (8) /*!< SYS_T::GPG_MFPH: PG10MFP Position */ +#define SYS_GPG_MFPH_PG10MFP_Msk (0xful << SYS_GPG_MFPH_PG10MFP_Pos) /*!< SYS_T::GPG_MFPH: PG10MFP Mask */ + +#define SYS_GPG_MFPH_PG11MFP_Pos (12) /*!< SYS_T::GPG_MFPH: PG11MFP Position */ +#define SYS_GPG_MFPH_PG11MFP_Msk (0xful << SYS_GPG_MFPH_PG11MFP_Pos) /*!< SYS_T::GPG_MFPH: PG11MFP Mask */ + +#define SYS_GPG_MFPH_PG12MFP_Pos (16) /*!< SYS_T::GPG_MFPH: PG12MFP Position */ +#define SYS_GPG_MFPH_PG12MFP_Msk (0xful << SYS_GPG_MFPH_PG12MFP_Pos) /*!< SYS_T::GPG_MFPH: PG12MFP Mask */ + +#define SYS_GPG_MFPH_PG13MFP_Pos (20) /*!< SYS_T::GPG_MFPH: PG13MFP Position */ +#define SYS_GPG_MFPH_PG13MFP_Msk (0xful << SYS_GPG_MFPH_PG13MFP_Pos) /*!< SYS_T::GPG_MFPH: PG13MFP Mask */ + +#define SYS_GPG_MFPH_PG14MFP_Pos (24) /*!< SYS_T::GPG_MFPH: PG14MFP Position */ +#define SYS_GPG_MFPH_PG14MFP_Msk (0xful << SYS_GPG_MFPH_PG14MFP_Pos) /*!< SYS_T::GPG_MFPH: PG14MFP Mask */ + +#define SYS_GPG_MFPH_PG15MFP_Pos (28) /*!< SYS_T::GPG_MFPH: PG15MFP Position */ +#define SYS_GPG_MFPH_PG15MFP_Msk (0xful << SYS_GPG_MFPH_PG15MFP_Pos) /*!< SYS_T::GPG_MFPH: PG15MFP Mask */ + +#define SYS_GPH_MFPL_PH0MFP_Pos (0) /*!< SYS_T::GPH_MFPL: PH0MFP Position */ +#define SYS_GPH_MFPL_PH0MFP_Msk (0xful << SYS_GPH_MFPL_PH0MFP_Pos) /*!< SYS_T::GPH_MFPL: PH0MFP Mask */ + +#define SYS_GPH_MFPL_PH1MFP_Pos (4) /*!< SYS_T::GPH_MFPL: PH1MFP Position */ +#define SYS_GPH_MFPL_PH1MFP_Msk (0xful << SYS_GPH_MFPL_PH1MFP_Pos) /*!< SYS_T::GPH_MFPL: PH1MFP Mask */ + +#define SYS_GPH_MFPL_PH2MFP_Pos (8) /*!< SYS_T::GPH_MFPL: PH2MFP Position */ +#define SYS_GPH_MFPL_PH2MFP_Msk (0xful << SYS_GPH_MFPL_PH2MFP_Pos) /*!< SYS_T::GPH_MFPL: PH2MFP Mask */ + +#define SYS_GPH_MFPL_PH3MFP_Pos (12) /*!< SYS_T::GPH_MFPL: PH3MFP Position */ +#define SYS_GPH_MFPL_PH3MFP_Msk (0xful << SYS_GPH_MFPL_PH3MFP_Pos) /*!< SYS_T::GPH_MFPL: PH3MFP Mask */ + +#define SYS_GPH_MFPL_PH4MFP_Pos (16) /*!< SYS_T::GPH_MFPL: PH4MFP Position */ +#define SYS_GPH_MFPL_PH4MFP_Msk (0xful << SYS_GPH_MFPL_PH4MFP_Pos) /*!< SYS_T::GPH_MFPL: PH4MFP Mask */ + +#define SYS_GPH_MFPL_PH5MFP_Pos (20) /*!< SYS_T::GPH_MFPL: PH5MFP Position */ +#define SYS_GPH_MFPL_PH5MFP_Msk (0xful << SYS_GPH_MFPL_PH5MFP_Pos) /*!< SYS_T::GPH_MFPL: PH5MFP Mask */ + +#define SYS_GPH_MFPL_PH6MFP_Pos (24) /*!< SYS_T::GPH_MFPL: PH6MFP Position */ +#define SYS_GPH_MFPL_PH6MFP_Msk (0xful << SYS_GPH_MFPL_PH6MFP_Pos) /*!< SYS_T::GPH_MFPL: PH6MFP Mask */ + +#define SYS_GPH_MFPL_PH7MFP_Pos (28) /*!< SYS_T::GPH_MFPL: PH7MFP Position */ +#define SYS_GPH_MFPL_PH7MFP_Msk (0xful << SYS_GPH_MFPL_PH7MFP_Pos) /*!< SYS_T::GPH_MFPL: PH7MFP Mask */ + +#define SYS_GPH_MFPH_PH8MFP_Pos (0) /*!< SYS_T::GPH_MFPH: PH8MFP Position */ +#define SYS_GPH_MFPH_PH8MFP_Msk (0xful << SYS_GPH_MFPH_PH8MFP_Pos) /*!< SYS_T::GPH_MFPH: PH8MFP Mask */ + +#define SYS_GPH_MFPH_PH9MFP_Pos (4) /*!< SYS_T::GPH_MFPH: PH9MFP Position */ +#define SYS_GPH_MFPH_PH9MFP_Msk (0xful << SYS_GPH_MFPH_PH9MFP_Pos) /*!< SYS_T::GPH_MFPH: PH9MFP Mask */ + +#define SYS_GPH_MFPH_PH10MFP_Pos (8) /*!< SYS_T::GPH_MFPH: PH10MFP Position */ +#define SYS_GPH_MFPH_PH10MFP_Msk (0xful << SYS_GPH_MFPH_PH10MFP_Pos) /*!< SYS_T::GPH_MFPH: PH10MFP Mask */ + +#define SYS_GPH_MFPH_PH11MFP_Pos (12) /*!< SYS_T::GPH_MFPH: PH11MFP Position */ +#define SYS_GPH_MFPH_PH11MFP_Msk (0xful << SYS_GPH_MFPH_PH11MFP_Pos) /*!< SYS_T::GPH_MFPH: PH11MFP Mask */ + +#define SYS_GPH_MFPH_PH12MFP_Pos (16) /*!< SYS_T::GPH_MFPH: PH12MFP Position */ +#define SYS_GPH_MFPH_PH12MFP_Msk (0xful << SYS_GPH_MFPH_PH12MFP_Pos) /*!< SYS_T::GPH_MFPH: PH12MFP Mask */ + +#define SYS_GPH_MFPH_PH13MFP_Pos (20) /*!< SYS_T::GPH_MFPH: PH13MFP Position */ +#define SYS_GPH_MFPH_PH13MFP_Msk (0xful << SYS_GPH_MFPH_PH13MFP_Pos) /*!< SYS_T::GPH_MFPH: PH13MFP Mask */ + +#define SYS_GPH_MFPH_PH14MFP_Pos (24) /*!< SYS_T::GPH_MFPH: PH14MFP Position */ +#define SYS_GPH_MFPH_PH14MFP_Msk (0xful << SYS_GPH_MFPH_PH14MFP_Pos) /*!< SYS_T::GPH_MFPH: PH14MFP Mask */ + +#define SYS_GPH_MFPH_PH15MFP_Pos (28) /*!< SYS_T::GPH_MFPH: PH15MFP Position */ +#define SYS_GPH_MFPH_PH15MFP_Msk (0xful << SYS_GPH_MFPH_PH15MFP_Pos) /*!< SYS_T::GPH_MFPH: PH15MFP Mask */ + +#define SYS_GPI_MFPL_PI0MFP_Pos (0) /*!< SYS_T::GPI_MFPL: PI0MFP Position */ +#define SYS_GPI_MFPL_PI0MFP_Msk (0xful << SYS_GPI_MFPL_PI0MFP_Pos) /*!< SYS_T::GPI_MFPL: PI0MFP Mask */ + +#define SYS_GPI_MFPL_PI1MFP_Pos (4) /*!< SYS_T::GPI_MFPL: PI1MFP Position */ +#define SYS_GPI_MFPL_PI1MFP_Msk (0xful << SYS_GPI_MFPL_PI1MFP_Pos) /*!< SYS_T::GPI_MFPL: PI1MFP Mask */ + +#define SYS_GPI_MFPL_PI2MFP_Pos (8) /*!< SYS_T::GPI_MFPL: PI2MFP Position */ +#define SYS_GPI_MFPL_PI2MFP_Msk (0xful << SYS_GPI_MFPL_PI2MFP_Pos) /*!< SYS_T::GPI_MFPL: PI2MFP Mask */ + +#define SYS_GPI_MFPL_PI3MFP_Pos (12) /*!< SYS_T::GPI_MFPL: PI3MFP Position */ +#define SYS_GPI_MFPL_PI3MFP_Msk (0xful << SYS_GPI_MFPL_PI3MFP_Pos) /*!< SYS_T::GPI_MFPL: PI3MFP Mask */ + +#define SYS_GPI_MFPL_PI4MFP_Pos (16) /*!< SYS_T::GPI_MFPL: PI4MFP Position */ +#define SYS_GPI_MFPL_PI4MFP_Msk (0xful << SYS_GPI_MFPL_PI4MFP_Pos) /*!< SYS_T::GPI_MFPL: PI4MFP Mask */ + +#define SYS_GPI_MFPL_PI5MFP_Pos (20) /*!< SYS_T::GPI_MFPL: PI5MFP Position */ +#define SYS_GPI_MFPL_PI5MFP_Msk (0xful << SYS_GPI_MFPL_PI5MFP_Pos) /*!< SYS_T::GPI_MFPL: PI5MFP Mask */ + +#define SYS_GPI_MFPL_PI6MFP_Pos (24) /*!< SYS_T::GPI_MFPL: PI6MFP Position */ +#define SYS_GPI_MFPL_PI6MFP_Msk (0xful << SYS_GPI_MFPL_PI6MFP_Pos) /*!< SYS_T::GPI_MFPL: PI6MFP Mask */ + +#define SYS_GPI_MFPL_PI7MFP_Pos (28) /*!< SYS_T::GPI_MFPL: PI7MFP Position */ +#define SYS_GPI_MFPL_PI7MFP_Msk (0xful << SYS_GPI_MFPL_PI7MFP_Pos) /*!< SYS_T::GPI_MFPL: PI7MFP Mask */ + +#define SYS_GPI_MFPH_PI8MFP_Pos (0) /*!< SYS_T::GPI_MFPH: PI8MFP Position */ +#define SYS_GPI_MFPH_PI8MFP_Msk (0xful << SYS_GPI_MFPH_PI8MFP_Pos) /*!< SYS_T::GPI_MFPH: PI8MFP Mask */ + +#define SYS_GPI_MFPH_PI9MFP_Pos (4) /*!< SYS_T::GPI_MFPH: PI9MFP Position */ +#define SYS_GPI_MFPH_PI9MFP_Msk (0xful << SYS_GPI_MFPH_PI9MFP_Pos) /*!< SYS_T::GPI_MFPH: PI9MFP Mask */ + +#define SYS_GPI_MFPH_PI10MFP_Pos (8) /*!< SYS_T::GPI_MFPH: PI10MFP Position */ +#define SYS_GPI_MFPH_PI10MFP_Msk (0xful << SYS_GPI_MFPH_PI10MFP_Pos) /*!< SYS_T::GPI_MFPH: PI10MFP Mask */ + +#define SYS_GPI_MFPH_PI11MFP_Pos (12) /*!< SYS_T::GPI_MFPH: PI11MFP Position */ +#define SYS_GPI_MFPH_PI11MFP_Msk (0xful << SYS_GPI_MFPH_PI11MFP_Pos) /*!< SYS_T::GPI_MFPH: PI11MFP Mask */ + +#define SYS_GPI_MFPH_PI12MFP_Pos (16) /*!< SYS_T::GPI_MFPH: PI12MFP Position */ +#define SYS_GPI_MFPH_PI12MFP_Msk (0xful << SYS_GPI_MFPH_PI12MFP_Pos) /*!< SYS_T::GPI_MFPH: PI12MFP Mask */ + +#define SYS_GPI_MFPH_PI13MFP_Pos (20) /*!< SYS_T::GPI_MFPH: PI13MFP Position */ +#define SYS_GPI_MFPH_PI13MFP_Msk (0xful << SYS_GPI_MFPH_PI13MFP_Pos) /*!< SYS_T::GPI_MFPH: PI13MFP Mask */ + +#define SYS_GPI_MFPH_PI14MFP_Pos (24) /*!< SYS_T::GPI_MFPH: PI14MFP Position */ +#define SYS_GPI_MFPH_PI14MFP_Msk (0xful << SYS_GPI_MFPH_PI14MFP_Pos) /*!< SYS_T::GPI_MFPH: PI14MFP Mask */ + +#define SYS_GPI_MFPH_PI15MFP_Pos (28) /*!< SYS_T::GPI_MFPH: PI15MFP Position */ +#define SYS_GPI_MFPH_PI15MFP_Msk (0xful << SYS_GPI_MFPH_PI15MFP_Pos) /*!< SYS_T::GPI_MFPH: PI15MFP Mask */ + +#define SYS_GPJ_MFPL_PJ0MFP_Pos (0) /*!< SYS_T::GPJ_MFPL: PJ0MFP Position */ +#define SYS_GPJ_MFPL_PJ0MFP_Msk (0xful << SYS_GPJ_MFPL_PJ0MFP_Pos) /*!< SYS_T::GPJ_MFPL: PJ0MFP Mask */ + +#define SYS_GPJ_MFPL_PJ1MFP_Pos (4) /*!< SYS_T::GPJ_MFPL: PJ1MFP Position */ +#define SYS_GPJ_MFPL_PJ1MFP_Msk (0xful << SYS_GPJ_MFPL_PJ1MFP_Pos) /*!< SYS_T::GPJ_MFPL: PJ1MFP Mask */ + +#define SYS_GPJ_MFPL_PJ2MFP_Pos (8) /*!< SYS_T::GPJ_MFPL: PJ2MFP Position */ +#define SYS_GPJ_MFPL_PJ2MFP_Msk (0xful << SYS_GPJ_MFPL_PJ2MFP_Pos) /*!< SYS_T::GPJ_MFPL: PJ2MFP Mask */ + +#define SYS_GPJ_MFPL_PJ3MFP_Pos (12) /*!< SYS_T::GPJ_MFPL: PJ3MFP Position */ +#define SYS_GPJ_MFPL_PJ3MFP_Msk (0xful << SYS_GPJ_MFPL_PJ3MFP_Pos) /*!< SYS_T::GPJ_MFPL: PJ3MFP Mask */ + +#define SYS_GPJ_MFPL_PJ4MFP_Pos (16) /*!< SYS_T::GPJ_MFPL: PJ4MFP Position */ +#define SYS_GPJ_MFPL_PJ4MFP_Msk (0xful << SYS_GPJ_MFPL_PJ4MFP_Pos) /*!< SYS_T::GPJ_MFPL: PJ4MFP Mask */ + +#define SYS_GPJ_MFPL_PJ5MFP_Pos (20) /*!< SYS_T::GPJ_MFPL: PJ5MFP Position */ +#define SYS_GPJ_MFPL_PJ5MFP_Msk (0xful << SYS_GPJ_MFPL_PJ5MFP_Pos) /*!< SYS_T::GPJ_MFPL: PJ5MFP Mask */ + +#define SYS_GPJ_MFPL_PJ6MFP_Pos (24) /*!< SYS_T::GPJ_MFPL: PJ6MFP Position */ +#define SYS_GPJ_MFPL_PJ6MFP_Msk (0xful << SYS_GPJ_MFPL_PJ6MFP_Pos) /*!< SYS_T::GPJ_MFPL: PJ6MFP Mask */ + +#define SYS_GPJ_MFPL_PJ7MFP_Pos (28) /*!< SYS_T::GPJ_MFPL: PJ7MFP Position */ +#define SYS_GPJ_MFPL_PJ7MFP_Msk (0xful << SYS_GPJ_MFPL_PJ7MFP_Pos) /*!< SYS_T::GPJ_MFPL: PJ7MFP Mask */ + +#define SYS_GPJ_MFPH_PJ8MFP_Pos (0) /*!< SYS_T::GPJ_MFPH: PJ8MFP Position */ +#define SYS_GPJ_MFPH_PJ8MFP_Msk (0xful << SYS_GPJ_MFPH_PJ8MFP_Pos) /*!< SYS_T::GPJ_MFPH: PJ8MFP Mask */ + +#define SYS_GPJ_MFPH_PJ9MFP_Pos (4) /*!< SYS_T::GPJ_MFPH: PJ9MFP Position */ +#define SYS_GPJ_MFPH_PJ9MFP_Msk (0xful << SYS_GPJ_MFPH_PJ9MFP_Pos) /*!< SYS_T::GPJ_MFPH: PJ9MFP Mask */ + +#define SYS_GPJ_MFPH_PJ10MFP_Pos (8) /*!< SYS_T::GPJ_MFPH: PJ10MFP Position */ +#define SYS_GPJ_MFPH_PJ10MFP_Msk (0xful << SYS_GPJ_MFPH_PJ10MFP_Pos) /*!< SYS_T::GPJ_MFPH: PJ10MFP Mask */ + +#define SYS_GPJ_MFPH_PJ11MFP_Pos (12) /*!< SYS_T::GPJ_MFPH: PJ11MFP Position */ +#define SYS_GPJ_MFPH_PJ11MFP_Msk (0xful << SYS_GPJ_MFPH_PJ11MFP_Pos) /*!< SYS_T::GPJ_MFPH: PJ11MFP Mask */ + +#define SYS_GPJ_MFPH_PJ12MFP_Pos (16) /*!< SYS_T::GPJ_MFPH: PJ12MFP Position */ +#define SYS_GPJ_MFPH_PJ12MFP_Msk (0xful << SYS_GPJ_MFPH_PJ12MFP_Pos) /*!< SYS_T::GPJ_MFPH: PJ12MFP Mask */ + +#define SYS_GPJ_MFPH_PJ13MFP_Pos (20) /*!< SYS_T::GPJ_MFPH: PJ13MFP Position */ +#define SYS_GPJ_MFPH_PJ13MFP_Msk (0xful << SYS_GPJ_MFPH_PJ13MFP_Pos) /*!< SYS_T::GPJ_MFPH: PJ13MFP Mask */ + +#define SYS_GPJ_MFPH_PJ14MFP_Pos (24) /*!< SYS_T::GPJ_MFPH: PJ14MFP Position */ +#define SYS_GPJ_MFPH_PJ14MFP_Msk (0xful << SYS_GPJ_MFPH_PJ14MFP_Pos) /*!< SYS_T::GPJ_MFPH: PJ14MFP Mask */ + +#define SYS_GPJ_MFPH_PJ15MFP_Pos (28) /*!< SYS_T::GPJ_MFPH: PJ15MFP Position */ +#define SYS_GPJ_MFPH_PJ15MFP_Msk (0xful << SYS_GPJ_MFPH_PJ15MFP_Pos) /*!< SYS_T::GPJ_MFPH: PJ15MFP Mask */ + +#define SYS_GPK_MFPL_PK0MFP_Pos (0) /*!< SYS_T::GPK_MFPL: PK0MFP Position */ +#define SYS_GPK_MFPL_PK0MFP_Msk (0xful << SYS_GPK_MFPL_PK0MFP_Pos) /*!< SYS_T::GPK_MFPL: PK0MFP Mask */ + +#define SYS_GPK_MFPL_PK1MFP_Pos (4) /*!< SYS_T::GPK_MFPL: PK1MFP Position */ +#define SYS_GPK_MFPL_PK1MFP_Msk (0xful << SYS_GPK_MFPL_PK1MFP_Pos) /*!< SYS_T::GPK_MFPL: PK1MFP Mask */ + +#define SYS_GPK_MFPL_PK2MFP_Pos (8) /*!< SYS_T::GPK_MFPL: PK2MFP Position */ +#define SYS_GPK_MFPL_PK2MFP_Msk (0xful << SYS_GPK_MFPL_PK2MFP_Pos) /*!< SYS_T::GPK_MFPL: PK2MFP Mask */ + +#define SYS_GPK_MFPL_PK3MFP_Pos (12) /*!< SYS_T::GPK_MFPL: PK3MFP Position */ +#define SYS_GPK_MFPL_PK3MFP_Msk (0xful << SYS_GPK_MFPL_PK3MFP_Pos) /*!< SYS_T::GPK_MFPL: PK3MFP Mask */ + +#define SYS_GPK_MFPL_PK4MFP_Pos (16) /*!< SYS_T::GPK_MFPL: PK4MFP Position */ +#define SYS_GPK_MFPL_PK4MFP_Msk (0xful << SYS_GPK_MFPL_PK4MFP_Pos) /*!< SYS_T::GPK_MFPL: PK4MFP Mask */ + +#define SYS_GPK_MFPL_PK5MFP_Pos (20) /*!< SYS_T::GPK_MFPL: PK5MFP Position */ +#define SYS_GPK_MFPL_PK5MFP_Msk (0xful << SYS_GPK_MFPL_PK5MFP_Pos) /*!< SYS_T::GPK_MFPL: PK5MFP Mask */ + +#define SYS_GPK_MFPL_PK6MFP_Pos (24) /*!< SYS_T::GPK_MFPL: PK6MFP Position */ +#define SYS_GPK_MFPL_PK6MFP_Msk (0xful << SYS_GPK_MFPL_PK6MFP_Pos) /*!< SYS_T::GPK_MFPL: PK6MFP Mask */ + +#define SYS_GPK_MFPL_PK7MFP_Pos (28) /*!< SYS_T::GPK_MFPL: PK7MFP Position */ +#define SYS_GPK_MFPL_PK7MFP_Msk (0xful << SYS_GPK_MFPL_PK7MFP_Pos) /*!< SYS_T::GPK_MFPL: PK7MFP Mask */ + +#define SYS_GPK_MFPH_PK8MFP_Pos (0) /*!< SYS_T::GPK_MFPH: PK8MFP Position */ +#define SYS_GPK_MFPH_PK8MFP_Msk (0xful << SYS_GPK_MFPH_PK8MFP_Pos) /*!< SYS_T::GPK_MFPH: PK8MFP Mask */ + +#define SYS_GPK_MFPH_PK9MFP_Pos (4) /*!< SYS_T::GPK_MFPH: PK9MFP Position */ +#define SYS_GPK_MFPH_PK9MFP_Msk (0xful << SYS_GPK_MFPH_PK9MFP_Pos) /*!< SYS_T::GPK_MFPH: PK9MFP Mask */ + +#define SYS_GPK_MFPH_PK10MFP_Pos (8) /*!< SYS_T::GPK_MFPH: PK10MFP Position */ +#define SYS_GPK_MFPH_PK10MFP_Msk (0xful << SYS_GPK_MFPH_PK10MFP_Pos) /*!< SYS_T::GPK_MFPH: PK10MFP Mask */ + +#define SYS_GPK_MFPH_PK11MFP_Pos (12) /*!< SYS_T::GPK_MFPH: PK11MFP Position */ +#define SYS_GPK_MFPH_PK11MFP_Msk (0xful << SYS_GPK_MFPH_PK11MFP_Pos) /*!< SYS_T::GPK_MFPH: PK11MFP Mask */ + +#define SYS_GPK_MFPH_PK12MFP_Pos (16) /*!< SYS_T::GPK_MFPH: PK12MFP Position */ +#define SYS_GPK_MFPH_PK12MFP_Msk (0xful << SYS_GPK_MFPH_PK12MFP_Pos) /*!< SYS_T::GPK_MFPH: PK12MFP Mask */ + +#define SYS_GPK_MFPH_PK13MFP_Pos (20) /*!< SYS_T::GPK_MFPH: PK13MFP Position */ +#define SYS_GPK_MFPH_PK13MFP_Msk (0xful << SYS_GPK_MFPH_PK13MFP_Pos) /*!< SYS_T::GPK_MFPH: PK13MFP Mask */ + +#define SYS_GPK_MFPH_PK14MFP_Pos (24) /*!< SYS_T::GPK_MFPH: PK14MFP Position */ +#define SYS_GPK_MFPH_PK14MFP_Msk (0xful << SYS_GPK_MFPH_PK14MFP_Pos) /*!< SYS_T::GPK_MFPH: PK14MFP Mask */ + +#define SYS_GPK_MFPH_PK15MFP_Pos (28) /*!< SYS_T::GPK_MFPH: PK15MFP Position */ +#define SYS_GPK_MFPH_PK15MFP_Msk (0xful << SYS_GPK_MFPH_PK15MFP_Pos) /*!< SYS_T::GPK_MFPH: PK15MFP Mask */ + +#define SYS_GPL_MFPL_PL0MFP_Pos (0) /*!< SYS_T::GPL_MFPL: PL0MFP Position */ +#define SYS_GPL_MFPL_PL0MFP_Msk (0xful << SYS_GPL_MFPL_PL0MFP_Pos) /*!< SYS_T::GPL_MFPL: PL0MFP Mask */ + +#define SYS_GPL_MFPL_PL1MFP_Pos (4) /*!< SYS_T::GPL_MFPL: PL1MFP Position */ +#define SYS_GPL_MFPL_PL1MFP_Msk (0xful << SYS_GPL_MFPL_PL1MFP_Pos) /*!< SYS_T::GPL_MFPL: PL1MFP Mask */ + +#define SYS_GPL_MFPL_PL2MFP_Pos (8) /*!< SYS_T::GPL_MFPL: PL2MFP Position */ +#define SYS_GPL_MFPL_PL2MFP_Msk (0xful << SYS_GPL_MFPL_PL2MFP_Pos) /*!< SYS_T::GPL_MFPL: PL2MFP Mask */ + +#define SYS_GPL_MFPL_PL3MFP_Pos (12) /*!< SYS_T::GPL_MFPL: PL3MFP Position */ +#define SYS_GPL_MFPL_PL3MFP_Msk (0xful << SYS_GPL_MFPL_PL3MFP_Pos) /*!< SYS_T::GPL_MFPL: PL3MFP Mask */ + +#define SYS_GPL_MFPL_PL4MFP_Pos (16) /*!< SYS_T::GPL_MFPL: PL4MFP Position */ +#define SYS_GPL_MFPL_PL4MFP_Msk (0xful << SYS_GPL_MFPL_PL4MFP_Pos) /*!< SYS_T::GPL_MFPL: PL4MFP Mask */ + +#define SYS_GPL_MFPL_PL5MFP_Pos (20) /*!< SYS_T::GPL_MFPL: PL5MFP Position */ +#define SYS_GPL_MFPL_PL5MFP_Msk (0xful << SYS_GPL_MFPL_PL5MFP_Pos) /*!< SYS_T::GPL_MFPL: PL5MFP Mask */ + +#define SYS_GPL_MFPL_PL6MFP_Pos (24) /*!< SYS_T::GPL_MFPL: PL6MFP Position */ +#define SYS_GPL_MFPL_PL6MFP_Msk (0xful << SYS_GPL_MFPL_PL6MFP_Pos) /*!< SYS_T::GPL_MFPL: PL6MFP Mask */ + +#define SYS_GPL_MFPL_PL7MFP_Pos (28) /*!< SYS_T::GPL_MFPL: PL7MFP Position */ +#define SYS_GPL_MFPL_PL7MFP_Msk (0xful << SYS_GPL_MFPL_PL7MFP_Pos) /*!< SYS_T::GPL_MFPL: PL7MFP Mask */ + +#define SYS_GPL_MFPH_PL8MFP_Pos (0) /*!< SYS_T::GPL_MFPH: PL8MFP Position */ +#define SYS_GPL_MFPH_PL8MFP_Msk (0xful << SYS_GPL_MFPH_PL8MFP_Pos) /*!< SYS_T::GPL_MFPH: PL8MFP Mask */ + +#define SYS_GPL_MFPH_PL9MFP_Pos (4) /*!< SYS_T::GPL_MFPH: PL9MFP Position */ +#define SYS_GPL_MFPH_PL9MFP_Msk (0xful << SYS_GPL_MFPH_PL9MFP_Pos) /*!< SYS_T::GPL_MFPH: PL9MFP Mask */ + +#define SYS_GPL_MFPH_PL10MFP_Pos (8) /*!< SYS_T::GPL_MFPH: PL10MFP Position */ +#define SYS_GPL_MFPH_PL10MFP_Msk (0xful << SYS_GPL_MFPH_PL10MFP_Pos) /*!< SYS_T::GPL_MFPH: PL10MFP Mask */ + +#define SYS_GPL_MFPH_PL11MFP_Pos (12) /*!< SYS_T::GPL_MFPH: PL11MFP Position */ +#define SYS_GPL_MFPH_PL11MFP_Msk (0xful << SYS_GPL_MFPH_PL11MFP_Pos) /*!< SYS_T::GPL_MFPH: PL11MFP Mask */ + +#define SYS_GPL_MFPH_PL12MFP_Pos (16) /*!< SYS_T::GPL_MFPH: PL12MFP Position */ +#define SYS_GPL_MFPH_PL12MFP_Msk (0xful << SYS_GPL_MFPH_PL12MFP_Pos) /*!< SYS_T::GPL_MFPH: PL12MFP Mask */ + +#define SYS_GPL_MFPH_PL13MFP_Pos (20) /*!< SYS_T::GPL_MFPH: PL13MFP Position */ +#define SYS_GPL_MFPH_PL13MFP_Msk (0xful << SYS_GPL_MFPH_PL13MFP_Pos) /*!< SYS_T::GPL_MFPH: PL13MFP Mask */ + +#define SYS_GPL_MFPH_PL14MFP_Pos (24) /*!< SYS_T::GPL_MFPH: PL14MFP Position */ +#define SYS_GPL_MFPH_PL14MFP_Msk (0xful << SYS_GPL_MFPH_PL14MFP_Pos) /*!< SYS_T::GPL_MFPH: PL14MFP Mask */ + +#define SYS_GPL_MFPH_PL15MFP_Pos (28) /*!< SYS_T::GPL_MFPH: PL15MFP Position */ +#define SYS_GPL_MFPH_PL15MFP_Msk (0xful << SYS_GPL_MFPH_PL15MFP_Pos) /*!< SYS_T::GPL_MFPH: PL15MFP Mask */ + +#define SYS_GPM_MFPL_PM0MFP_Pos (0) /*!< SYS_T::GPM_MFPL: PM0MFP Position */ +#define SYS_GPM_MFPL_PM0MFP_Msk (0xful << SYS_GPM_MFPL_PM0MFP_Pos) /*!< SYS_T::GPM_MFPL: PM0MFP Mask */ + +#define SYS_GPM_MFPL_PM1MFP_Pos (4) /*!< SYS_T::GPM_MFPL: PM1MFP Position */ +#define SYS_GPM_MFPL_PM1MFP_Msk (0xful << SYS_GPM_MFPL_PM1MFP_Pos) /*!< SYS_T::GPM_MFPL: PM1MFP Mask */ + +#define SYS_GPM_MFPL_PM2MFP_Pos (8) /*!< SYS_T::GPM_MFPL: PM2MFP Position */ +#define SYS_GPM_MFPL_PM2MFP_Msk (0xful << SYS_GPM_MFPL_PM2MFP_Pos) /*!< SYS_T::GPM_MFPL: PM2MFP Mask */ + +#define SYS_GPM_MFPL_PM3MFP_Pos (12) /*!< SYS_T::GPM_MFPL: PM3MFP Position */ +#define SYS_GPM_MFPL_PM3MFP_Msk (0xful << SYS_GPM_MFPL_PM3MFP_Pos) /*!< SYS_T::GPM_MFPL: PM3MFP Mask */ + +#define SYS_GPM_MFPL_PM4MFP_Pos (16) /*!< SYS_T::GPM_MFPL: PM4MFP Position */ +#define SYS_GPM_MFPL_PM4MFP_Msk (0xful << SYS_GPM_MFPL_PM4MFP_Pos) /*!< SYS_T::GPM_MFPL: PM4MFP Mask */ + +#define SYS_GPM_MFPL_PM5MFP_Pos (20) /*!< SYS_T::GPM_MFPL: PM5MFP Position */ +#define SYS_GPM_MFPL_PM5MFP_Msk (0xful << SYS_GPM_MFPL_PM5MFP_Pos) /*!< SYS_T::GPM_MFPL: PM5MFP Mask */ + +#define SYS_GPM_MFPL_PM6MFP_Pos (24) /*!< SYS_T::GPM_MFPL: PM6MFP Position */ +#define SYS_GPM_MFPL_PM6MFP_Msk (0xful << SYS_GPM_MFPL_PM6MFP_Pos) /*!< SYS_T::GPM_MFPL: PM6MFP Mask */ + +#define SYS_GPM_MFPL_PM7MFP_Pos (28) /*!< SYS_T::GPM_MFPL: PM7MFP Position */ +#define SYS_GPM_MFPL_PM7MFP_Msk (0xful << SYS_GPM_MFPL_PM7MFP_Pos) /*!< SYS_T::GPM_MFPL: PM7MFP Mask */ + +#define SYS_GPM_MFPH_PM8MFP_Pos (0) /*!< SYS_T::GPM_MFPH: PM8MFP Position */ +#define SYS_GPM_MFPH_PM8MFP_Msk (0xful << SYS_GPM_MFPH_PM8MFP_Pos) /*!< SYS_T::GPM_MFPH: PM8MFP Mask */ + +#define SYS_GPM_MFPH_PM9MFP_Pos (4) /*!< SYS_T::GPM_MFPH: PM9MFP Position */ +#define SYS_GPM_MFPH_PM9MFP_Msk (0xful << SYS_GPM_MFPH_PM9MFP_Pos) /*!< SYS_T::GPM_MFPH: PM9MFP Mask */ + +#define SYS_GPM_MFPH_PM10MFP_Pos (8) /*!< SYS_T::GPM_MFPH: PM10MFP Position */ +#define SYS_GPM_MFPH_PM10MFP_Msk (0xful << SYS_GPM_MFPH_PM10MFP_Pos) /*!< SYS_T::GPM_MFPH: PM10MFP Mask */ + +#define SYS_GPM_MFPH_PM11MFP_Pos (12) /*!< SYS_T::GPM_MFPH: PM11MFP Position */ +#define SYS_GPM_MFPH_PM11MFP_Msk (0xful << SYS_GPM_MFPH_PM11MFP_Pos) /*!< SYS_T::GPM_MFPH: PM11MFP Mask */ + +#define SYS_GPM_MFPH_PM12MFP_Pos (16) /*!< SYS_T::GPM_MFPH: PM12MFP Position */ +#define SYS_GPM_MFPH_PM12MFP_Msk (0xful << SYS_GPM_MFPH_PM12MFP_Pos) /*!< SYS_T::GPM_MFPH: PM12MFP Mask */ + +#define SYS_GPM_MFPH_PM13MFP_Pos (20) /*!< SYS_T::GPM_MFPH: PM13MFP Position */ +#define SYS_GPM_MFPH_PM13MFP_Msk (0xful << SYS_GPM_MFPH_PM13MFP_Pos) /*!< SYS_T::GPM_MFPH: PM13MFP Mask */ + +#define SYS_GPM_MFPH_PM14MFP_Pos (24) /*!< SYS_T::GPM_MFPH: PM14MFP Position */ +#define SYS_GPM_MFPH_PM14MFP_Msk (0xful << SYS_GPM_MFPH_PM14MFP_Pos) /*!< SYS_T::GPM_MFPH: PM14MFP Mask */ + +#define SYS_GPM_MFPH_PM15MFP_Pos (28) /*!< SYS_T::GPM_MFPH: PM15MFP Position */ +#define SYS_GPM_MFPH_PM15MFP_Msk (0xful << SYS_GPM_MFPH_PM15MFP_Pos) /*!< SYS_T::GPM_MFPH: PM15MFP Mask */ + +#define SYS_GPN_MFPL_PN0MFP_Pos (0) /*!< SYS_T::GPN_MFPL: PN0MFP Position */ +#define SYS_GPN_MFPL_PN0MFP_Msk (0xful << SYS_GPN_MFPL_PN0MFP_Pos) /*!< SYS_T::GPN_MFPL: PN0MFP Mask */ + +#define SYS_GPN_MFPL_PN1MFP_Pos (4) /*!< SYS_T::GPN_MFPL: PN1MFP Position */ +#define SYS_GPN_MFPL_PN1MFP_Msk (0xful << SYS_GPN_MFPL_PN1MFP_Pos) /*!< SYS_T::GPN_MFPL: PN1MFP Mask */ + +#define SYS_GPN_MFPL_PN2MFP_Pos (8) /*!< SYS_T::GPN_MFPL: PN2MFP Position */ +#define SYS_GPN_MFPL_PN2MFP_Msk (0xful << SYS_GPN_MFPL_PN2MFP_Pos) /*!< SYS_T::GPN_MFPL: PN2MFP Mask */ + +#define SYS_GPN_MFPL_PN3MFP_Pos (12) /*!< SYS_T::GPN_MFPL: PN3MFP Position */ +#define SYS_GPN_MFPL_PN3MFP_Msk (0xful << SYS_GPN_MFPL_PN3MFP_Pos) /*!< SYS_T::GPN_MFPL: PN3MFP Mask */ + +#define SYS_GPN_MFPL_PN4MFP_Pos (16) /*!< SYS_T::GPN_MFPL: PN4MFP Position */ +#define SYS_GPN_MFPL_PN4MFP_Msk (0xful << SYS_GPN_MFPL_PN4MFP_Pos) /*!< SYS_T::GPN_MFPL: PN4MFP Mask */ + +#define SYS_GPN_MFPL_PN5MFP_Pos (20) /*!< SYS_T::GPN_MFPL: PN5MFP Position */ +#define SYS_GPN_MFPL_PN5MFP_Msk (0xful << SYS_GPN_MFPL_PN5MFP_Pos) /*!< SYS_T::GPN_MFPL: PN5MFP Mask */ + +#define SYS_GPN_MFPL_PN6MFP_Pos (24) /*!< SYS_T::GPN_MFPL: PN6MFP Position */ +#define SYS_GPN_MFPL_PN6MFP_Msk (0xful << SYS_GPN_MFPL_PN6MFP_Pos) /*!< SYS_T::GPN_MFPL: PN6MFP Mask */ + +#define SYS_GPN_MFPL_PN7MFP_Pos (28) /*!< SYS_T::GPN_MFPL: PN7MFP Position */ +#define SYS_GPN_MFPL_PN7MFP_Msk (0xful << SYS_GPN_MFPL_PN7MFP_Pos) /*!< SYS_T::GPN_MFPL: PN7MFP Mask */ + +#define SYS_GPN_MFPH_PN8MFP_Pos (0) /*!< SYS_T::GPN_MFPH: PN8MFP Position */ +#define SYS_GPN_MFPH_PN8MFP_Msk (0xful << SYS_GPN_MFPH_PN8MFP_Pos) /*!< SYS_T::GPN_MFPH: PN8MFP Mask */ + +#define SYS_GPN_MFPH_PN9MFP_Pos (4) /*!< SYS_T::GPN_MFPH: PN9MFP Position */ +#define SYS_GPN_MFPH_PN9MFP_Msk (0xful << SYS_GPN_MFPH_PN9MFP_Pos) /*!< SYS_T::GPN_MFPH: PN9MFP Mask */ + +#define SYS_GPN_MFPH_PN10MFP_Pos (8) /*!< SYS_T::GPN_MFPH: PN10MFP Position */ +#define SYS_GPN_MFPH_PN10MFP_Msk (0xful << SYS_GPN_MFPH_PN10MFP_Pos) /*!< SYS_T::GPN_MFPH: PN10MFP Mask */ + +#define SYS_GPN_MFPH_PN11MFP_Pos (12) /*!< SYS_T::GPN_MFPH: PN11MFP Position */ +#define SYS_GPN_MFPH_PN11MFP_Msk (0xful << SYS_GPN_MFPH_PN11MFP_Pos) /*!< SYS_T::GPN_MFPH: PN11MFP Mask */ + +#define SYS_GPN_MFPH_PN12MFP_Pos (16) /*!< SYS_T::GPN_MFPH: PN12MFP Position */ +#define SYS_GPN_MFPH_PN12MFP_Msk (0xful << SYS_GPN_MFPH_PN12MFP_Pos) /*!< SYS_T::GPN_MFPH: PN12MFP Mask */ + +#define SYS_GPN_MFPH_PN13MFP_Pos (20) /*!< SYS_T::GPN_MFPH: PN13MFP Position */ +#define SYS_GPN_MFPH_PN13MFP_Msk (0xful << SYS_GPN_MFPH_PN13MFP_Pos) /*!< SYS_T::GPN_MFPH: PN13MFP Mask */ + +#define SYS_GPN_MFPH_PN14MFP_Pos (24) /*!< SYS_T::GPN_MFPH: PN14MFP Position */ +#define SYS_GPN_MFPH_PN14MFP_Msk (0xful << SYS_GPN_MFPH_PN14MFP_Pos) /*!< SYS_T::GPN_MFPH: PN14MFP Mask */ + +#define SYS_GPN_MFPH_PN15MFP_Pos (28) /*!< SYS_T::GPN_MFPH: PN15MFP Position */ +#define SYS_GPN_MFPH_PN15MFP_Msk (0xful << SYS_GPN_MFPH_PN15MFP_Pos) /*!< SYS_T::GPN_MFPH: PN15MFP Mask */ + +#define SYS_TSENSRFCR_TSENSRREF0_Pos (0) /*!< SYS_T::TSENSRFCR: TSENSRREF0 Position */ +#define SYS_TSENSRFCR_TSENSRREF0_Msk (0xfful << SYS_TSENSRFCR_TSENSRREF0_Pos) /*!< SYS_T::TSENSRFCR: TSENSRREF0 Mask */ + +#define SYS_TSENSRFCR_TSENSRREF1_Pos (8) /*!< SYS_T::TSENSRFCR: TSENSRREF1 Position */ +#define SYS_TSENSRFCR_TSENSRREF1_Msk (0xfful << SYS_TSENSRFCR_TSENSRREF1_Pos) /*!< SYS_T::TSENSRFCR: TSENSRREF1 Mask */ + +#define SYS_TSENSRFCR_TSENSRDATA_Pos (16) /*!< SYS_T::TSENSRFCR: TSENSRDATA Position */ +#define SYS_TSENSRFCR_TSENSRDATA_Msk (0xffful << SYS_TSENSRFCR_TSENSRDATA_Pos) /*!< SYS_T::TSENSRFCR: TSENSRDATA Mask */ + +#define SYS_TSENSRFCR_PD_Pos (28) /*!< SYS_T::TSENSRFCR: PD Position */ +#define SYS_TSENSRFCR_PD_Msk (0x1ul << SYS_TSENSRFCR_PD_Pos) /*!< SYS_T::TSENSRFCR: PD Mask */ + +#define SYS_TSENSRFCR_REFUDEN_Pos (29) /*!< SYS_T::TSENSRFCR: REFUDEN Position */ +#define SYS_TSENSRFCR_REFUDEN_Msk (0x1ul << SYS_TSENSRFCR_REFUDEN_Pos) /*!< SYS_T::TSENSRFCR: REFUDEN Mask */ + +#define SYS_TSENSRFCR_DATAVALID_Pos (31) /*!< SYS_T::TSENSRFCR: DATAVALID Position */ +#define SYS_TSENSRFCR_DATAVALID_Msk (0x1ul << SYS_TSENSRFCR_DATAVALID_Pos) /*!< SYS_T::TSENSRFCR: DATAVALID Mask */ + +#define SYS_GMAC0MISCR_RMIIEN_Pos (0) /*!< SYS_T::GMAC0MISCR: RMIIEN Position */ +#define SYS_GMAC0MISCR_RMIIEN_Msk (0x1ul << SYS_GMAC0MISCR_RMIIEN_Pos) /*!< SYS_T::GMAC0MISCR: RMIIEN Mask */ + +#define SYS_GMAC0MISCR_PFRMTXEN_Pos (1) /*!< SYS_T::GMAC0MISCR: PFRMTXEN Position */ +#define SYS_GMAC0MISCR_PFRMTXEN_Msk (0x1ul << SYS_GMAC0MISCR_PFRMTXEN_Pos) /*!< SYS_T::GMAC0MISCR: PFRMTXEN Mask */ + +#define SYS_GMAC0MISCR_TXCLKINV_Pos (8) /*!< SYS_T::GMAC0MISCR: TXCLKINV Position */ +#define SYS_GMAC0MISCR_TXCLKINV_Msk (0x1ul << SYS_GMAC0MISCR_TXCLKINV_Pos) /*!< SYS_T::GMAC0MISCR: TXCLKINV Mask */ + +#define SYS_GMAC0MISCR_TXCLKGEN_Pos (9) /*!< SYS_T::GMAC0MISCR: TXCLKGEN Position */ +#define SYS_GMAC0MISCR_TXCLKGEN_Msk (0x1ul << SYS_GMAC0MISCR_TXCLKGEN_Pos) /*!< SYS_T::GMAC0MISCR: TXCLKGEN Mask */ + +#define SYS_GMAC0MISCR_RXCLKINV_Pos (12) /*!< SYS_T::GMAC0MISCR: RXCLKINV Position */ +#define SYS_GMAC0MISCR_RXCLKINV_Msk (0x1ul << SYS_GMAC0MISCR_RXCLKINV_Pos) /*!< SYS_T::GMAC0MISCR: RXCLKINV Mask */ + +#define SYS_GMAC0MISCR_TXCLKDLY_Pos (16) /*!< SYS_T::GMAC0MISCR: TXCLKDLY Position */ +#define SYS_GMAC0MISCR_TXCLKDLY_Msk (0xful << SYS_GMAC0MISCR_TXCLKDLY_Pos) /*!< SYS_T::GMAC0MISCR: TXCLKDLY Mask */ + +#define SYS_GMAC0MISCR_RXCLKDLY_Pos (20) /*!< SYS_T::GMAC0MISCR: RXCLKDLY Position */ +#define SYS_GMAC0MISCR_RXCLKDLY_Msk (0xful << SYS_GMAC0MISCR_RXCLKDLY_Pos) /*!< SYS_T::GMAC0MISCR: RXCLKDLY Mask */ + +#define SYS_GMAC1MISCR_RMIIEN_Pos (0) /*!< SYS_T::GMAC1MISCR: RMIIEN Position */ +#define SYS_GMAC1MISCR_RMIIEN_Msk (0x1ul << SYS_GMAC1MISCR_RMIIEN_Pos) /*!< SYS_T::GMAC1MISCR: RMIIEN Mask */ + +#define SYS_GMAC1MISCR_PFRMTXEN_Pos (1) /*!< SYS_T::GMAC1MISCR: PFRMTXEN Position */ +#define SYS_GMAC1MISCR_PFRMTXEN_Msk (0x1ul << SYS_GMAC1MISCR_PFRMTXEN_Pos) /*!< SYS_T::GMAC1MISCR: PFRMTXEN Mask */ + +#define SYS_GMAC1MISCR_TXCLKINV_Pos (8) /*!< SYS_T::GMAC1MISCR: TXCLKINV Position */ +#define SYS_GMAC1MISCR_TXCLKINV_Msk (0x1ul << SYS_GMAC1MISCR_TXCLKINV_Pos) /*!< SYS_T::GMAC1MISCR: TXCLKINV Mask */ + +#define SYS_GMAC1MISCR_TXCLKGEN_Pos (9) /*!< SYS_T::GMAC1MISCR: TXCLKGEN Position */ +#define SYS_GMAC1MISCR_TXCLKGEN_Msk (0x1ul << SYS_GMAC1MISCR_TXCLKGEN_Pos) /*!< SYS_T::GMAC1MISCR: TXCLKGEN Mask */ + +#define SYS_GMAC1MISCR_RXCLKINV_Pos (12) /*!< SYS_T::GMAC1MISCR: RXCLKINV Position */ +#define SYS_GMAC1MISCR_RXCLKINV_Msk (0x1ul << SYS_GMAC1MISCR_RXCLKINV_Pos) /*!< SYS_T::GMAC1MISCR: RXCLKINV Mask */ + +#define SYS_GMAC1MISCR_TXCLKDLY_Pos (16) /*!< SYS_T::GMAC1MISCR: TXCLKDLY Position */ +#define SYS_GMAC1MISCR_TXCLKDLY_Msk (0xful << SYS_GMAC1MISCR_TXCLKDLY_Pos) /*!< SYS_T::GMAC1MISCR: TXCLKDLY Mask */ + +#define SYS_GMAC1MISCR_RXCLKDLY_Pos (20) /*!< SYS_T::GMAC1MISCR: RXCLKDLY Position */ +#define SYS_GMAC1MISCR_RXCLKDLY_Msk (0xful << SYS_GMAC1MISCR_RXCLKDLY_Pos) /*!< SYS_T::GMAC1MISCR: RXCLKDLY Mask */ + +#define SYS_MACAD0LSR_MACADRLSR_Pos (0) /*!< SYS_T::MACAD0LSR: MACADRLSR Position */ +#define SYS_MACAD0LSR_MACADRLSR_Msk (0xfffffffful << SYS_MACAD0LSR_MACADRLSR_Pos) /*!< SYS_T::MACAD0LSR: MACADRLSR Mask */ + +#define SYS_MACAD0HSR_MACADRHSR_Pos (0) /*!< SYS_T::MACAD0HSR: MACADRHSR Position */ +#define SYS_MACAD0HSR_MACADRHSR_Msk (0xfffful << SYS_MACAD0HSR_MACADRHSR_Pos) /*!< SYS_T::MACAD0HSR: MACADRHSR Mask */ + +#define SYS_MACAD1LSR_MACADRLSR_Pos (0) /*!< SYS_T::MACAD1LSR: MACADRLSR Position */ +#define SYS_MACAD1LSR_MACADRLSR_Msk (0xfffffffful << SYS_MACAD1LSR_MACADRLSR_Pos) /*!< SYS_T::MACAD1LSR: MACADRLSR Mask */ + +#define SYS_MACAD1HSR_MACADRHSR_Pos (0) /*!< SYS_T::MACAD1HSR: MACADRHSR Position */ +#define SYS_MACAD1HSR_MACADRHSR_Msk (0xfffful << SYS_MACAD1HSR_MACADRHSR_Pos) /*!< SYS_T::MACAD1HSR: MACADRHSR Mask */ + +#define SYS_CSDBGCTL_DBGRST_Pos (0) /*!< SYS_T::CSDBGCTL: DBGRST Position */ +#define SYS_CSDBGCTL_DBGRST_Msk (0x1ul << SYS_CSDBGCTL_DBGRST_Pos) /*!< SYS_T::CSDBGCTL: DBGRST Mask */ + +#define SYS_CSDBGCTL_DBGPWRUPREQ_Pos (1) /*!< SYS_T::CSDBGCTL: DBGPWRUPREQ Position */ +#define SYS_CSDBGCTL_DBGPWRUPREQ_Msk (0x1ul << SYS_CSDBGCTL_DBGPWRUPREQ_Pos) /*!< SYS_T::CSDBGCTL: DBGPWRUPREQ Mask */ + +#define SYS_CSDBGCTL_DBGPWRUPACK_Pos (2) /*!< SYS_T::CSDBGCTL: DBGPWRUPACK Position */ +#define SYS_CSDBGCTL_DBGPWRUPACK_Msk (0x1ul << SYS_CSDBGCTL_DBGPWRUPACK_Pos) /*!< SYS_T::CSDBGCTL: DBGPWRUPACK Mask */ + +#define SYS_CSDBGCTL_LPEMU_Pos (3) /*!< SYS_T::CSDBGCTL: LPEMU Position */ +#define SYS_CSDBGCTL_LPEMU_Msk (0x1ul << SYS_CSDBGCTL_LPEMU_Pos) /*!< SYS_T::CSDBGCTL: LPEMU Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS0_Pos (0) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS0 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS0_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS0_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS0 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS1_Pos (1) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS1 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS1_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS1_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS1 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS2_Pos (2) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS2 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS2_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS2_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS2 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS3_Pos (3) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS3 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS3_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS3_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS3 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS4_Pos (4) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS4 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS4_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS4_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS4 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS5_Pos (5) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS5 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS5_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS5_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS5 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS6_Pos (6) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS6 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS6_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS6_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS6 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS7_Pos (7) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS7 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS7_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS7_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS7 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS8_Pos (8) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS8 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS8_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS8_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS8 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS9_Pos (9) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS9 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS9_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS9_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS9 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS10_Pos (10) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS10 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS10_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS10_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS10 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS11_Pos (11) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS11 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS11_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS11_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS11 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS12_Pos (12) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS12 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS12_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS12_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS12 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS13_Pos (13) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS13 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS13_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS13_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS13 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS14_Pos (14) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS14 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS14_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS14_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS14 Mask */ + +#define SYS_GPAB_MFOS_GPIOxMFOS15_Pos (15) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS15 Position */ +#define SYS_GPAB_MFOS_GPIOxMFOS15_Msk (0x1ul << SYS_GPAB_MFOS_GPIOxMFOS15_Pos) /*!< SYS_T::GPAB_MFOS: GPIOxMFOS15 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS16_Pos (16) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS16 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS16_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS16_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS16 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS17_Pos (17) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS17 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS17_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS17_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS17 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS18_Pos (18) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS18 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS18_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS18_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS18 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS19_Pos (19) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS19 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS19_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS19_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS19 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS20_Pos (20) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS20 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS20_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS20_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS20 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS21_Pos (21) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS21 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS21_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS21_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS21 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS22_Pos (22) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS22 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS22_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS22_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS22 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS23_Pos (23) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS23 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS23_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS23_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS23 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS24_Pos (24) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS24 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS24_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS24_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS24 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS25_Pos (25) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS25 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS25_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS25_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS25 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS26_Pos (26) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS26 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS26_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS26_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS26 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS27_Pos (27) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS27 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS27_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS27_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS27 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS28_Pos (28) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS28 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS28_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS28_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS28 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS29_Pos (29) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS29 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS29_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS29_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS29 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS30_Pos (30) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS30 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS30_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS30_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS30 Mask */ + +#define SYS_GPAB_MFOS_GPIOyMFOS31_Pos (31) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS31 Position */ +#define SYS_GPAB_MFOS_GPIOyMFOS31_Msk (0x1ul << SYS_GPAB_MFOS_GPIOyMFOS31_Pos) /*!< SYS_T::GPAB_MFOS: GPIOyMFOS31 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS0_Pos (0) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS0 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS0_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS0_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS0 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS1_Pos (1) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS1 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS1_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS1_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS1 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS2_Pos (2) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS2 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS2_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS2_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS2 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS3_Pos (3) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS3 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS3_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS3_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS3 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS4_Pos (4) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS4 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS4_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS4_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS4 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS5_Pos (5) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS5 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS5_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS5_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS5 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS6_Pos (6) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS6 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS6_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS6_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS6 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS7_Pos (7) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS7 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS7_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS7_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS7 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS8_Pos (8) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS8 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS8_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS8_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS8 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS9_Pos (9) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS9 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS9_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS9_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS9 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS10_Pos (10) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS10 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS10_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS10_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS10 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS11_Pos (11) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS11 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS11_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS11_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS11 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS12_Pos (12) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS12 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS12_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS12_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS12 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS13_Pos (13) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS13 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS13_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS13_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS13 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS14_Pos (14) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS14 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS14_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS14_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS14 Mask */ + +#define SYS_GPCD_MFOS_GPIOxMFOS15_Pos (15) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS15 Position */ +#define SYS_GPCD_MFOS_GPIOxMFOS15_Msk (0x1ul << SYS_GPCD_MFOS_GPIOxMFOS15_Pos) /*!< SYS_T::GPCD_MFOS: GPIOxMFOS15 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS16_Pos (16) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS16 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS16_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS16_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS16 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS17_Pos (17) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS17 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS17_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS17_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS17 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS18_Pos (18) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS18 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS18_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS18_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS18 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS19_Pos (19) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS19 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS19_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS19_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS19 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS20_Pos (20) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS20 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS20_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS20_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS20 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS21_Pos (21) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS21 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS21_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS21_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS21 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS22_Pos (22) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS22 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS22_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS22_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS22 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS23_Pos (23) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS23 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS23_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS23_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS23 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS24_Pos (24) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS24 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS24_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS24_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS24 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS25_Pos (25) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS25 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS25_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS25_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS25 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS26_Pos (26) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS26 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS26_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS26_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS26 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS27_Pos (27) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS27 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS27_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS27_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS27 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS28_Pos (28) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS28 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS28_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS28_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS28 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS29_Pos (29) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS29 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS29_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS29_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS29 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS30_Pos (30) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS30 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS30_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS30_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS30 Mask */ + +#define SYS_GPCD_MFOS_GPIOyMFOS31_Pos (31) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS31 Position */ +#define SYS_GPCD_MFOS_GPIOyMFOS31_Msk (0x1ul << SYS_GPCD_MFOS_GPIOyMFOS31_Pos) /*!< SYS_T::GPCD_MFOS: GPIOyMFOS31 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS0_Pos (0) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS0 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS0_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS0_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS0 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS1_Pos (1) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS1 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS1_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS1_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS1 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS2_Pos (2) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS2 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS2_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS2_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS2 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS3_Pos (3) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS3 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS3_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS3_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS3 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS4_Pos (4) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS4 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS4_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS4_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS4 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS5_Pos (5) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS5 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS5_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS5_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS5 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS6_Pos (6) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS6 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS6_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS6_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS6 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS7_Pos (7) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS7 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS7_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS7_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS7 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS8_Pos (8) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS8 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS8_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS8_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS8 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS9_Pos (9) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS9 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS9_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS9_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS9 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS10_Pos (10) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS10 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS10_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS10_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS10 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS11_Pos (11) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS11 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS11_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS11_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS11 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS12_Pos (12) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS12 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS12_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS12_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS12 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS13_Pos (13) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS13 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS13_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS13_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS13 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS14_Pos (14) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS14 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS14_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS14_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS14 Mask */ + +#define SYS_GPEF_MFOS_GPIOxMFOS15_Pos (15) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS15 Position */ +#define SYS_GPEF_MFOS_GPIOxMFOS15_Msk (0x1ul << SYS_GPEF_MFOS_GPIOxMFOS15_Pos) /*!< SYS_T::GPEF_MFOS: GPIOxMFOS15 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS16_Pos (16) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS16 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS16_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS16_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS16 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS17_Pos (17) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS17 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS17_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS17_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS17 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS18_Pos (18) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS18 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS18_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS18_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS18 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS19_Pos (19) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS19 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS19_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS19_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS19 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS20_Pos (20) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS20 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS20_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS20_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS20 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS21_Pos (21) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS21 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS21_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS21_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS21 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS22_Pos (22) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS22 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS22_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS22_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS22 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS23_Pos (23) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS23 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS23_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS23_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS23 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS24_Pos (24) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS24 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS24_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS24_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS24 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS25_Pos (25) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS25 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS25_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS25_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS25 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS26_Pos (26) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS26 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS26_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS26_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS26 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS27_Pos (27) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS27 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS27_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS27_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS27 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS28_Pos (28) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS28 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS28_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS28_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS28 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS29_Pos (29) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS29 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS29_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS29_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS29 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS30_Pos (30) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS30 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS30_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS30_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS30 Mask */ + +#define SYS_GPEF_MFOS_GPIOyMFOS31_Pos (31) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS31 Position */ +#define SYS_GPEF_MFOS_GPIOyMFOS31_Msk (0x1ul << SYS_GPEF_MFOS_GPIOyMFOS31_Pos) /*!< SYS_T::GPEF_MFOS: GPIOyMFOS31 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS0_Pos (0) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS0 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS0_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS0_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS0 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS1_Pos (1) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS1 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS1_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS1_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS1 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS2_Pos (2) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS2 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS2_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS2_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS2 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS3_Pos (3) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS3 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS3_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS3_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS3 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS4_Pos (4) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS4 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS4_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS4_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS4 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS5_Pos (5) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS5 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS5_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS5_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS5 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS6_Pos (6) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS6 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS6_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS6_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS6 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS7_Pos (7) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS7 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS7_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS7_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS7 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS8_Pos (8) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS8 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS8_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS8_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS8 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS9_Pos (9) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS9 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS9_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS9_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS9 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS10_Pos (10) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS10 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS10_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS10_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS10 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS11_Pos (11) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS11 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS11_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS11_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS11 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS12_Pos (12) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS12 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS12_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS12_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS12 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS13_Pos (13) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS13 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS13_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS13_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS13 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS14_Pos (14) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS14 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS14_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS14_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS14 Mask */ + +#define SYS_GPGH_MFOS_GPIOxMFOS15_Pos (15) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS15 Position */ +#define SYS_GPGH_MFOS_GPIOxMFOS15_Msk (0x1ul << SYS_GPGH_MFOS_GPIOxMFOS15_Pos) /*!< SYS_T::GPGH_MFOS: GPIOxMFOS15 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS16_Pos (16) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS16 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS16_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS16_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS16 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS17_Pos (17) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS17 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS17_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS17_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS17 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS18_Pos (18) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS18 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS18_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS18_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS18 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS19_Pos (19) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS19 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS19_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS19_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS19 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS20_Pos (20) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS20 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS20_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS20_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS20 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS21_Pos (21) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS21 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS21_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS21_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS21 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS22_Pos (22) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS22 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS22_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS22_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS22 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS23_Pos (23) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS23 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS23_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS23_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS23 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS24_Pos (24) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS24 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS24_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS24_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS24 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS25_Pos (25) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS25 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS25_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS25_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS25 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS26_Pos (26) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS26 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS26_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS26_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS26 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS27_Pos (27) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS27 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS27_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS27_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS27 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS28_Pos (28) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS28 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS28_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS28_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS28 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS29_Pos (29) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS29 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS29_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS29_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS29 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS30_Pos (30) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS30 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS30_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS30_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS30 Mask */ + +#define SYS_GPGH_MFOS_GPIOyMFOS31_Pos (31) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS31 Position */ +#define SYS_GPGH_MFOS_GPIOyMFOS31_Msk (0x1ul << SYS_GPGH_MFOS_GPIOyMFOS31_Pos) /*!< SYS_T::GPGH_MFOS: GPIOyMFOS31 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS0_Pos (0) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS0 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS0_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS0_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS0 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS1_Pos (1) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS1 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS1_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS1_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS1 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS2_Pos (2) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS2 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS2_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS2_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS2 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS3_Pos (3) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS3 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS3_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS3_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS3 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS4_Pos (4) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS4 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS4_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS4_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS4 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS5_Pos (5) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS5 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS5_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS5_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS5 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS6_Pos (6) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS6 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS6_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS6_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS6 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS7_Pos (7) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS7 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS7_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS7_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS7 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS8_Pos (8) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS8 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS8_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS8_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS8 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS9_Pos (9) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS9 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS9_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS9_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS9 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS10_Pos (10) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS10 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS10_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS10_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS10 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS11_Pos (11) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS11 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS11_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS11_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS11 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS12_Pos (12) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS12 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS12_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS12_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS12 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS13_Pos (13) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS13 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS13_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS13_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS13 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS14_Pos (14) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS14 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS14_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS14_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS14 Mask */ + +#define SYS_GPIJ_MFOS_GPIOxMFOS15_Pos (15) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS15 Position */ +#define SYS_GPIJ_MFOS_GPIOxMFOS15_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOxMFOS15_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOxMFOS15 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS16_Pos (16) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS16 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS16_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS16_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS16 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS17_Pos (17) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS17 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS17_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS17_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS17 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS18_Pos (18) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS18 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS18_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS18_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS18 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS19_Pos (19) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS19 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS19_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS19_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS19 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS20_Pos (20) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS20 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS20_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS20_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS20 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS21_Pos (21) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS21 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS21_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS21_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS21 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS22_Pos (22) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS22 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS22_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS22_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS22 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS23_Pos (23) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS23 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS23_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS23_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS23 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS24_Pos (24) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS24 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS24_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS24_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS24 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS25_Pos (25) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS25 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS25_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS25_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS25 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS26_Pos (26) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS26 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS26_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS26_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS26 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS27_Pos (27) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS27 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS27_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS27_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS27 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS28_Pos (28) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS28 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS28_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS28_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS28 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS29_Pos (29) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS29 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS29_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS29_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS29 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS30_Pos (30) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS30 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS30_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS30_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS30 Mask */ + +#define SYS_GPIJ_MFOS_GPIOyMFOS31_Pos (31) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS31 Position */ +#define SYS_GPIJ_MFOS_GPIOyMFOS31_Msk (0x1ul << SYS_GPIJ_MFOS_GPIOyMFOS31_Pos) /*!< SYS_T::GPIJ_MFOS: GPIOyMFOS31 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS0_Pos (0) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS0 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS0_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS0_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS0 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS1_Pos (1) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS1 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS1_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS1_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS1 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS2_Pos (2) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS2 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS2_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS2_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS2 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS3_Pos (3) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS3 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS3_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS3_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS3 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS4_Pos (4) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS4 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS4_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS4_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS4 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS5_Pos (5) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS5 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS5_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS5_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS5 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS6_Pos (6) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS6 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS6_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS6_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS6 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS7_Pos (7) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS7 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS7_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS7_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS7 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS8_Pos (8) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS8 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS8_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS8_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS8 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS9_Pos (9) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS9 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS9_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS9_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS9 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS10_Pos (10) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS10 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS10_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS10_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS10 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS11_Pos (11) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS11 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS11_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS11_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS11 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS12_Pos (12) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS12 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS12_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS12_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS12 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS13_Pos (13) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS13 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS13_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS13_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS13 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS14_Pos (14) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS14 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS14_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS14_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS14 Mask */ + +#define SYS_GPKL_MFOS_GPIOxMFOS15_Pos (15) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS15 Position */ +#define SYS_GPKL_MFOS_GPIOxMFOS15_Msk (0x1ul << SYS_GPKL_MFOS_GPIOxMFOS15_Pos) /*!< SYS_T::GPKL_MFOS: GPIOxMFOS15 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS16_Pos (16) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS16 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS16_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS16_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS16 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS17_Pos (17) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS17 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS17_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS17_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS17 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS18_Pos (18) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS18 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS18_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS18_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS18 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS19_Pos (19) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS19 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS19_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS19_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS19 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS20_Pos (20) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS20 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS20_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS20_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS20 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS21_Pos (21) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS21 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS21_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS21_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS21 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS22_Pos (22) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS22 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS22_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS22_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS22 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS23_Pos (23) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS23 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS23_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS23_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS23 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS24_Pos (24) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS24 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS24_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS24_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS24 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS25_Pos (25) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS25 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS25_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS25_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS25 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS26_Pos (26) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS26 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS26_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS26_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS26 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS27_Pos (27) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS27 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS27_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS27_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS27 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS28_Pos (28) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS28 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS28_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS28_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS28 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS29_Pos (29) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS29 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS29_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS29_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS29 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS30_Pos (30) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS30 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS30_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS30_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS30 Mask */ + +#define SYS_GPKL_MFOS_GPIOyMFOS31_Pos (31) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS31 Position */ +#define SYS_GPKL_MFOS_GPIOyMFOS31_Msk (0x1ul << SYS_GPKL_MFOS_GPIOyMFOS31_Pos) /*!< SYS_T::GPKL_MFOS: GPIOyMFOS31 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS0_Pos (0) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS0 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS0_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS0_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS0 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS1_Pos (1) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS1 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS1_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS1_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS1 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS2_Pos (2) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS2 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS2_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS2_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS2 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS3_Pos (3) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS3 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS3_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS3_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS3 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS4_Pos (4) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS4 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS4_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS4_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS4 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS5_Pos (5) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS5 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS5_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS5_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS5 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS6_Pos (6) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS6 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS6_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS6_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS6 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS7_Pos (7) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS7 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS7_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS7_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS7 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS8_Pos (8) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS8 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS8_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS8_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS8 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS9_Pos (9) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS9 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS9_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS9_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS9 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS10_Pos (10) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS10 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS10_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS10_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS10 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS11_Pos (11) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS11 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS11_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS11_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS11 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS12_Pos (12) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS12 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS12_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS12_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS12 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS13_Pos (13) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS13 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS13_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS13_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS13 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS14_Pos (14) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS14 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS14_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS14_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS14 Mask */ + +#define SYS_GPMN_MFOS_GPIOxMFOS15_Pos (15) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS15 Position */ +#define SYS_GPMN_MFOS_GPIOxMFOS15_Msk (0x1ul << SYS_GPMN_MFOS_GPIOxMFOS15_Pos) /*!< SYS_T::GPMN_MFOS: GPIOxMFOS15 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS16_Pos (16) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS16 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS16_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS16_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS16 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS17_Pos (17) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS17 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS17_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS17_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS17 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS18_Pos (18) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS18 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS18_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS18_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS18 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS19_Pos (19) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS19 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS19_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS19_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS19 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS20_Pos (20) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS20 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS20_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS20_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS20 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS21_Pos (21) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS21 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS21_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS21_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS21 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS22_Pos (22) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS22 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS22_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS22_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS22 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS23_Pos (23) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS23 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS23_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS23_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS23 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS24_Pos (24) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS24 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS24_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS24_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS24 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS25_Pos (25) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS25 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS25_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS25_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS25 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS26_Pos (26) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS26 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS26_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS26_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS26 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS27_Pos (27) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS27 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS27_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS27_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS27 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS28_Pos (28) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS28 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS28_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS28_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS28 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS29_Pos (29) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS29 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS29_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS29_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS29 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS30_Pos (30) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS30 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS30_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS30_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS30 Mask */ + +#define SYS_GPMN_MFOS_GPIOyMFOS31_Pos (31) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS31 Position */ +#define SYS_GPMN_MFOS_GPIOyMFOS31_Msk (0x1ul << SYS_GPMN_MFOS_GPIOyMFOS31_Pos) /*!< SYS_T::GPMN_MFOS: GPIOyMFOS31 Mask */ + +#define SYS_UID0_UID_Pos (0) /*!< SYS_T::UID0: UID Position */ +#define SYS_UID0_UID_Msk (0xfffffffful << SYS_UID0_UID_Pos) /*!< SYS_T::UID0: UID Mask */ + +#define SYS_UID1_UID_Pos (0) /*!< SYS_T::UID1: UID Position */ +#define SYS_UID1_UID_Msk (0xfffffffful << SYS_UID1_UID_Pos) /*!< SYS_T::UID1: UID Mask */ + +#define SYS_UID2_UID_Pos (0) /*!< SYS_T::UID2: UID Position */ +#define SYS_UID2_UID_Msk (0xfffffffful << SYS_UID2_UID_Pos) /*!< SYS_T::UID2: UID Mask */ + +#define SYS_UCID0_UCID_Pos (0) /*!< SYS_T::UCID0: UCID Position */ +#define SYS_UCID0_UCID_Msk (0xfffffffful << SYS_UCID0_UCID_Pos) /*!< SYS_T::UCID0: UCID Mask */ + +#define SYS_UCID1_UCID_Pos (0) /*!< SYS_T::UCID1: UCID Position */ +#define SYS_UCID1_UCID_Msk (0xfffffffful << SYS_UCID1_UCID_Pos) /*!< SYS_T::UCID1: UCID Mask */ + +#define SYS_UCID2_UCID_Pos (0) /*!< SYS_T::UCID2: UCID Position */ +#define SYS_UCID2_UCID_Msk (0xfffffffful << SYS_UCID2_UCID_Pos) /*!< SYS_T::UCID2: UCID Mask */ + +#define SYS_RLKTZS_REGLCTL_Pos (0) /*!< SYS_T::RLKTZS: REGLCTL Position */ +#define SYS_RLKTZS_REGLCTL_Msk (0xfful << SYS_RLKTZS_REGLCTL_Pos) /*!< SYS_T::RLKTZS: REGLCTL Mask */ + +#define SYS_RLKTZNS_REGLCTL_Pos (0) /*!< SYS_T::RLKTZNS: REGLCTL Position */ +#define SYS_RLKTZNS_REGLCTL_Msk (0xfful << SYS_RLKTZNS_REGLCTL_Pos) /*!< SYS_T::RLKTZNS: REGLCTL Mask */ + +#define SYS_RLKSUBM_REGLCTL_Pos (0) /*!< SYS_T::RLKSUBM: REGLCTL Position */ +#define SYS_RLKSUBM_REGLCTL_Msk (0xfful << SYS_RLKSUBM_REGLCTL_Pos) + +/**@}*/ /* SYS_CONST */ +/**@}*/ /* end of SYS register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __SYS_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/system_ma35d1.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/system_ma35d1.h new file mode 100644 index 0000000000..5891fad76f --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/system_ma35d1.h @@ -0,0 +1,65 @@ +/**************************************************************************//** + * @file system_ma35d1_rtp.h + * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#ifndef __SYSTEM_MA35D1_RTP_H__ +#define __SYSTEM_MA35D1_RTP_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ + +#define __HSI (24000000UL) /*!< PLL default output is 50MHz */ +#define __HXT (24000000UL) /*!< External Crystal Clock Frequency */ +#define __LXT (32768UL) /*!< External Crystal Clock Frequency 32.768KHz */ +#define __HIRC (12000000UL) /*!< Internal 12M RC Oscillator Frequency */ +#define __LIRC (30000UL) /*!< Internal 10K RC Oscillator Frequency */ +#define __SYS_OSC_CLK ( ___HSI) /* Main oscillator frequency */ + + +#define __SYSTEM_CLOCK (1UL*__HXT) + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ +extern uint32_t CyclesPerUs; /*!< Cycles per micro second */ +extern uint32_t PllClock; /*!< PLL Output Clock Frequency */ + + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the micro controller system. + * Initialize the System and update the SystemCoreClock variable. + */ +extern void SystemInit(void); + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +extern void SystemCoreClockUpdate(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __SYSTEM_MA35D1_RTP_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/timer_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/timer_reg.h new file mode 100644 index 0000000000..a401e163f6 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/timer_reg.h @@ -0,0 +1,1069 @@ +/**************************************************************************//** + * @file timer_reg.h + * @brief TIMER register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __TIMER_REG_H__ +#define __TIMER_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup TIMER Timer Controller(TIMER) + Memory Mapped Structure for TIMER Controller +@{ */ + +typedef struct +{ + + + /** + * @var TIMER_T::CTL + * Offset: 0x00 Timer Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |PSC |Prescale Counter + * | | |Timer input clock or event source is divided by (PSC+1) before it is fed to the timer up counter + * | | |If this field is 0 (PSC = 0), then there is no scaling. + * | | |Note: Update prescale counter value will reset internal 8-bit prescale counter and 24-bit up counter value. + * |[19] |INTRGEN |Inter-timer Trigger Mode Enable Bit + * | | |Setting this bit will enable the inter-timer trigger capture function. + * | | |The Timer0/2/4/6/8/10 will be in event counter mode and counting with external clock source or event + * | | |Also, Timer1/3/5/7/9/11 will be in trigger-counting mode of capture function. + * | | |0 = Inter-Timer Trigger Capture mode Disabled. + * | | |1 = Inter-Timer Trigger Capture mode Enabled. + * | | |Note: For Timer1/3/5/7/9/11, this bit is ignored and the read back value is always 0. + * |[20] |PERIOSEL |Periodic Mode Behavior Selection Enable Bit + * | | |0 = The behavior selection in periodic mode is Disabled. + * | | |When user updates CMPDAT while timer is running in periodic mode, + * | | |CNT will be reset to default value. + * | | |1 = The behavior selection in periodic mode is Enabled. + * | | |When user update CMPDAT while timer is running in periodic mode, the limitations as bellows list, + * | | |If updated CMPDAT value > CNT, CMPDAT will be updated and CNT keep running continually. + * | | |If updated CMPDAT value = CNT, timer time-out interrupt will be asserted immediately. + * | | |If updated CMPDAT value < CNT, CNT will be reset to default value. + * |[21] |TGLPINSEL |Toggle-output Pin Select + * | | |0 = Toggle mode output to TMx (Timer Event Counter Pin). + * | | |1 = Toggle mode output to TMx_EXT (Timer External Capture Pin). + * |[22] |CAPSRC |Capture Pin Source Selection + * | | |0 = Capture Function source is from TMx_EXT (x= 0~11) pin. + * | | |1 = Capture Function source is from internal clock source (HIRC 12M, LIRC) or external clock (HXT, LXT). + * | | |Note: When CAPSRC = 1, user can set ICAPSSEL (TIMERx_EXTCTL[10:8]) to decide which clock is as timer capture source. + * |[23] |WKEN |Wake-up Function Enable Bit + * | | |If this bit is set to 1, while timer interrupt flag TIF (TIMERx_INTSTS[0]) is 1 and INTEN (TIMERx_CTL[29]) is enabled, the timer interrupt signal will generate a wake-up trigger event to CPU. + * | | |0 = Wake-up function Disabled if timer interrupt signal generated. + * | | |1 = Wake-up function Enabled if timer interrupt signal generated. + * |[24] |EXTCNTEN |Event Counter Mode Enable Bit + * | | |This bit is for external counting pin function enabled. + * | | |0 = Event counter mode Disabled. + * | | |1 = Event counter mode Enabled. + * | | |Note: When timer is used as an event counter, this bit should be set to 1 and select PCLK as timer clock source. + * |[25] |ACTSTS |Timer Active Status Bit (Read Only) + * | | |This bit indicates the 24-bit up counter status. + * | | |0 = 24-bit up counter is not active. + * | | |1 = 24-bit up counter is active. + * | | |Note: This bit may active when CNT 0 transition to CNT 1. + * |[28:27] |OPMODE |Timer Counting Mode Select + * | | |00 = The Timer controller is operated in One-shot mode. + * | | |01 = The Timer controller is operated in Periodic mode. + * | | |10 = The Timer controller is operated in Toggle-output mode. + * | | |11 = The Timer controller is operated in Continuous Counting mode. + * |[29] |INTEN |Timer Interrupt Enable Bit + * | | |0 = Timer time-out interrupt Disabled. + * | | |1 = Timer time-out interrupt Enabled. + * | | |Note: If this bit is enabled, when the timer time-out interrupt flag TIF is set to 1, the timer interrupt signal is generated and inform to CPU. + * |[30] |CNTEN |Timer Counting Enable Bit + * | | |0 = Stops/Suspends counting. + * | | |1 = Starts counting. + * | | |Note 1: In stop status, and then set CNTEN to 1 will enable the 24-bit up counter to keep counting from the last stop counting value. + * | | |Note 2: This bit is auto-cleared by hardware in one-shot mode (TIMER_CTL[28:27] = 00) when the timer time-out interrupt flag TIF (TIMERx_INTSTS[0]) is generated. + * | | |Note 3: Set enable/disable this bit needs 2 * TMR_CLK period to become active, user can read ACTSTS (TIMERx_CTL[25]) to check enable/disable command is completed or not. + * |[31] |ICEDEBUG |ICE Debug Mode Acknowledge Disable Bit (Write Protect) + * | | |0 = ICE debug mode acknowledgement effects TIMER counting. + * | | |TIMER counter will be held while CPU is held by ICE. + * | | |1 = ICE debug mode acknowledgement Disabled. + * | | |TIMER counter will keep going no matter CPU is held by ICE or not. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * @var TIMER_T::CMP + * Offset: 0x04 Timer Comparator Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |CMPDAT |Timer Comparator Value + * | | |CMPDAT is a 24-bit compared value register + * | | |When the internal 24-bit up counter value is equal to CMPDAT value, the TIF (TIMERx_INTSTS[0] Timer Interrupt Flag) will set to 1. + * | | |Time-out period = (Period of timer clock input) * (8-bit PSC + 1) * (24-bit CMPDAT). + * | | |Note 1: Never write 0x0 or 0x1 in CMPDAT field, or the core will run into unknown state. + * | | |Note 2: When timer is operating at continuous counting mode, the 24-bit up counter will keep counting continuously even if user writes a new value into CMPDAT field + * | | |But if timer is operating at other modes, the 24-bit up counter will restart counting from 0 and using newest CMPDAT value to be the timer compared value while user writes a new value into CMPDAT field. + * @var TIMER_T::INTSTS + * Offset: 0x08 Timer Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TIF |Timer Interrupt Flag + * | | |This bit indicates the interrupt flag status of Timer while 24-bit timer up counter CNT (TIMERx_CNT[23:0]) value reaches to CMPDAT (TIMERx_CMP[23:0]) value. + * | | |0 = No effect. + * | | |1 = CNT value matches the CMPDAT value. + * | | |Note: This bit is cleared by writing 1 to it. + * |[1] |TWKF |Timer Wake-up Flag + * | | |This bit indicates the interrupt wake-up flag status of timer. + * | | |0 = Timer does not cause CPU wake-up. + * | | |1 = CPU wake-up from Idle or Power-down mode if timer time-out interrupt signal generated. + * | | |Note: This bit is cleared by writing 1 to it. + * @var TIMER_T::CNT + * Offset: 0x0C Timer Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |CNT |Timer Data Register + * | | |Read operation. + * | | |Read this register to get CNT value. For example: + * | | |If EXTCNTEN (TIMERx_CTL[24]) is 0, user can read CNT value for getting current 24-bit counter value. + * | | |If EXTCNTEN (TIMERx_CTL[24]) is 1, user can read CNT value for getting current 24-bit event input counter value. + * | | |Write operation. + * | | |Writing any value to this register will reset current CNT value to 0 and reload internal 8-bit prescale counter. + * |[31] |RSTACT |Timer Data Register Reset Active (Read Only) + * | | |This bit indicates if the counter reset operation active. + * | | |When user writes this CNT register, timer starts to reset its internal 24-bit timer up-counter to 0 and reload 8-bit pre-scale counter + * | | |At the same time, timer set this flag to 1 to indicate the counter reset operation is in progress + * | | |Once the counter reset operation done, timer clear this bit to 0 automatically. + * | | |0 = Reset operation is done. + * | | |1 = Reset operation triggered by writing TIMERx_CNT is in progress. + * @var TIMER_T::CAP + * Offset: 0x10 Timer Capture Data Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:0] |CAPDAT |Timer Capture Data Register + * | | |When CAPEN (TIMERx_EXTCTL[3]) bit is set, CAPFUNCS (TIMERx_EXTCTL[4]) bit is 0, and a transition on TMx_EXT pin matched the CAPEDGE (TIMERx_EXTCTL[14:12]) setting, CAPIF (TIMERx_EINTSTS[0]) will set to 1 and the current timer counter value CNT (TIMERx_CNT[23:0]) will be auto-loaded into this CAPDAT field. + * @var TIMER_T::EXTCTL + * Offset: 0x14 Timer External Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CNTPHASE |Timer External Count Phase + * | | |This bit indicates the detection phase of external counting pin TMx (x= 0~11). + * | | |0 = A falling edge of external counting pin will be counted. + * | | |1 = A rising edge of external counting pin will be counted. + * |[3] |CAPEN |Timer External Capture Pin Enable Bit + * | | |This bit enables the TMx_EXT capture pin input function. + * | | |0 =TMx_EXT (x= 0~11) pin Disabled. + * | | |1 =TMx_EXT (x= 0~11) pin Enabled. + * |[4] |CAPFUNCS |Capture Function Selection + * | | |0 = External Capture Mode Enabled. + * | | |1 = External Reset Mode Enabled. + * | | |Note 1: When CAPFUNCS is 0, transition on TMx_EXT (x= 0~11) pin is using to save current 24-bit timer counter value (CNT value) to CAPDAT field. + * | | |Note 2: When CAPFUNCS is 1, transition on TMx_EXT (x= 0~11) pin is using to save current 24-bit timer counter value (CNT value) to CAPDAT field then CNT value will be reset immediately. + * |[5] |CAPIEN |Timer External Capture Interrupt Enable Bit + * | | |0 = TMx_EXT (x= 0~11) pin detection Interrupt Disabled. + * | | |1 = TMx_EXT (x= 0~11) pin detection Interrupt Enabled. + * | | |Note: CAPIEN is used to enable timer external interrupt + * | | |If CAPIEN enabled, timer will rise an interrupt when CAPIF (TIMERx_EINTSTS[0]) is 1. + * | | |For example, while CAPIEN = 1, CAPEN = 1, and CAPEDGE = 00, a 1 to 0 transition on the TMx_EXT pin will cause the CAPIF to be set then the interrupt signal is generated and sent to NVIC to inform CPU. + * |[6] |CAPDBEN |Timer External Capture Pin De-bounce Enable Bit + * | | |0 = TMx_EXT (x= 0~11) pin de-bounce Disabled. + * | | |1 = TMx_EXT (x= 0~11) pin de-bounce Enabled. + * | | |Note: If this bit is enabled, the edge detection of TMx_EXT pin is detected with de-bounce circuit. + * |[7] |CNTDBEN |Timer Counter Pin De-bounce Enable Bit + * | | |0 = TMx (x= 0~11) pin de-bounce Disabled. + * | | |1 = TMx (x= 0~11) pin de-bounce Enabled. + * | | |Note: If this bit is enabled, the edge detection of TMx pin is detected with de-bounce circuit. + * |[10:8] |ICAPSSEL |Internal Capture Source Selection + * | | |010 = Capture Function source is from HXT. + * | | |011 = Capture Function source is from LXT. + * | | |100 = Capture Function source is from HIRC. + * | | |101 = Capture Function source is from LIRC. + * | | |110 = Reserved. + * | | |111 = Reserved. + * | | |Note: these bits only available when CAPSRC (TIMERx_CTL[22]) is 1. + * |[14:12] |CAPEDGE |Timer External Capture Pin Edge Detect + * | | |When first capture event is generated, the CNT (TIMERx_CNT[23:0]) will be reset to 0 and first CAPDAT (TIMERx_CAP[23:0]) should be to 0. + * | | |000 = Capture event occurred when detect falling edge transfer on TMx_EXT (x= 0~11) pin. + * | | |001 = Capture event occurred when detect rising edge transfer on TMx_EXT (x= 0~11) pin. + * | | |010 = Capture event occurred when detect both falling and rising edge transfer on TMx_EXT (x= 0~11) pin, and first capture event occurred at falling edge transfer. + * | | |011 = Capture event occurred when detect both rising and falling edge transfer on TMx_EXT (x= 0~11) pin, and first capture event occurred at rising edge transfer. + * | | |110 = First capture event occurred at falling edge, follows capture events are at rising edge transfer on TMx_EXT (x= 0~11) pin. + * | | |111 = First capture event occurred at rising edge, follows capture events are at falling edge transfer on TMx_EXT (x= 0~11) pin. + * | | |100, 101 = Reserved. + * |[16] |ECNTSSEL |Event Counter Source Selection to Trigger Event Counter Function + * | | |0 = Event Counter input source is from TMx (x= 0~11) pin. + * |[31:28] |CAPSDIV |Timer Capture Source Divider + * | | |This bits indicate the divide scale for capture source. + * | | |0000 = Capture source/1. + * | | |0001 = Capture source/2. + * | | |0010 = Capture source/4. + * | | |0011 = Capture source/8. + * | | |0100 = Capture source/16. + * | | |0101 = Capture source/32. + * | | |0110 = Capture source/64. + * | | |0111 = Capture source/128. + * | | |1000 = Capture source/256. + * | | |1001~1111 = Reserved. + * | | |Note: Sets ICAPSSEL (TIMERx_EXTCTL[10:8]) and CAPSRC (TIMERx_CTL[22]) to select capture source. + * @var TIMER_T::EINTSTS + * Offset: 0x18 Timer External Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CAPIF |Timer External Capture Interrupt Flag + * | | |This bit indicates the timer external capture interrupt flag status. + * | | |0 = TMx_EXT (x= 0~11) pin interrupt did not occur. + * | | |1 = TMx_EXT (x= 0~11) pin interrupt occurred. + * | | |Note 1: This bit is cleared by writing 1 to it. + * | | |Note 2: When CAPEN (TIMERx_EXTCTL[3]) bit is set, CAPFUNCS (TIMERx_EXTCTL[4]) bit is 0, and a transition on TMx_EXT (x= 0~11) pin matched the CAPEDGE (TIMERx_EXTCTL[2:1]) setting, this bit will set to 1 by hardware. + * | | |Note 3: There is a new incoming capture event detected before CPU clearing the CAPIF status + * | | |If the above condition occurred, the Timer will keep register TIMERx_CAP unchanged and drop the new capture value. + * @var TIMER_T::TRGCTL + * Offset: 0x1C Timer Trigger Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TRGSSEL |Trigger Source Select Bit + * | | |This bit is used to select internal trigger source is form timer time-out interrupt signal or capture interrupt signal. + * | | |0 = Time-out interrupt signal is used to internal trigger EPWM, BPWM, PDMA and ADC. + * | | |1 = Capture interrupt signal is used to internal trigger EPWM, BPWM, PDMA and ADC. + * |[1] |TRGPWM |Trigger EPWM and BPWM Enable Bit + * | | |If this bit is set to 1, each timer time-out event or capture event can be as EPWM and BPWM counter clock source. + * | | |0 = Timer interrupt trigger EPWM and BPWM Disabled. + * | | |1 = Timer interrupt trigger EPWM and BPWM Enabled. + * | | |Note: If TRGSSEL (TIMERx_TRGCTL[0]) = 0, time-out interrupt signal as EPWM and BPWM counter clock source. + * | | |If TRGSSEL (TIMERx_TRGCTL[0]) = 1, capture interrupt signal as EPWM and BPWM counter clock source. + * |[2] |TRGEADC |Trigger EADC Enable Bit + * | | |If this bit is set to 1, each timer time-out event or capture event can be triggered EADC conversion. + * | | |0 = Timer interrupt trigger EADC Disabled. + * | | |1 = Timer interrupt trigger EADC Enabled. + * | | |Note: If TRGSSEL (TIMERx_TRGCTL[0]) = 0, time-out interrupt signal will trigger EADC conversion. + * | | |If TRGSSEL (TIMERx_TRGCTL[0]) = 1, capture interrupt signal will trigger EADC conversion. + * |[4] |TRGPDMA |Trigger PDMA Enable Bit + * | | |If this bit is set to 1, each timer time-out event or capture event can be triggered PDMA transfer. + * | | |0 = Timer interrupt trigger PDMA Disabled. + * | | |1 = Timer interrupt trigger PDMA Enabled. + * | | |Note: If TRGSSEL (TIMERx_TRGCTL[0]) = 0, time-out interrupt signal will trigger PDMA transfer. + * | | |If TRGSSEL (TIMERx_TRGCTL[0]) = 1, capture interrupt signal will trigger PDMA transfer. + * @var TIMER_T::ALTCTL + * Offset: 0x20 Timer Alternative Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |FUNCSEL |Function Selection + * | | |0 = Timer controller is used as timer function. + * | | |1 = Timer controller is used as PWM function. + * | | |Note: When timer is used as PWM, the clock source of time controller will be forced to PCLKx automatically. + * @var TIMER_T::PWMCTL + * Offset: 0x40 Timer PWM Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CNTEN |PWM Counter Enable Bit + * | | |0 = PWM counter and clock prescale Stop Running. + * | | |1 = PWM counter and clock prescale Start Running. + * |[2:1] |CNTTYPE |PWM Counter Behavior Type + * | | |00 = Up count type. + * | | |01 = Down count type. + * | | |10 = Up-down count type. + * | | |11 = Reserved. + * |[3] |CNTMODE |PWM Counter Mode + * | | |0 = Auto-reload mode. + * | | |1 = One-shot mode. + * |[8] |CTRLD |Center Re-load + * | | |In up-down count type, PERIOD will load to PBUF when current PWM period is completed always and CMP will load to CMPBUF at the center point of current period. + * |[9] |IMMLDEN |Immediately Load Enable Bit + * | | |0 = PERIOD will load to PBUF when current PWM period is completed no matter CTRLD is enabled/disabled + * | | |If CTRLD is disabled, CMP will load to CMPBUF when current PWM period is completed; if CTRLD is enabled in up-down count type, CMP will load to CMPBUF at the center point of current period. + * | | |1 = PERIOD/CMP will load to PBUF/CMPBUF immediately when user update PERIOD/CMP. + * | | |Note: If IMMLDEN is enabled, CTRLD will be invalid. + * |[16] |OUTMODE |PWM Output Mode + * | | |This bit controls the output mode of corresponding PWM channel. + * | | |0 = PWM independent mode. + * | | |1 = PWM complementary mode. + * |[30] |DBGHALT |ICE Debug Mode Counter Halt (Write Protect) + * | | |If debug mode counter halt is enabled, PWM counter will keep current value until exit ICE debug mode. + * | | |0 = ICE debug mode counter halt disable. + * | | |1 = ICE debug mode counter halt enable. + * | | |Note: This bit is write protected. Refer to SYS_RLKTZS or SYS_RLKTZND or SYS_RLKSUBM register. + * |[31] |DBGTRIOFF |ICE Debug Mode Acknowledge Disable Bit (Write Protect) + * | | |0 = ICE debug mode acknowledgement effects PWM output. + * | | |PWM output pin will be forced as tri-state while ICE debug mode acknowledged. + * | | |1 = ICE debug mode acknowledgement disabled. + * | | |PWM output pin will keep output no matter ICE debug mode acknowledged or not. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * @var TIMER_T::PWMCLKSRC + * Offset: 0x44 Timer PWM Counter Clock Source Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |CLKSRC |PWM Counter Clock Source Select + * | | |The PWM counter clock source can be selected from TMRx_CLK or internal timer time-out or capture event. + * | | |0000 = TMRx_CLK. + * | | |0001 = Internal TIMER0 time-out or capture event. + * | | |0010 = Internal TIMER1 time-out or capture event. + * | | |0011 = Internal TIMER2 time-out or capture event. + * | | |0100 = Internal TIMER3 time-out or capture event. + * | | |0101 = Internal TIMER4 time-out or capture event. + * | | |0110 = Internal TIMER5 time-out or capture event. + * | | |0111 = Internal TIMER6 time-out or capture event. + * | | |1000 = Internal TIMER7 time-out or capture event. + * | | |1001 = Internal TIMER8 time-out or capture event. + * | | |1010 = Internal TIMER9 time-out or capture event. + * | | |1011 = Internal TIMER10 time-out or capture event. + * | | |1100 = Internal TIMER11 time-out or capture event. + * | | |Others = Reserved. + * | | |Note: If TIMER0 PWM function is enabled, the PWM counter clock source can be selected from TMR0_CLK, TIMER1 interrupt events, TIMER2 interrupt events, or TIMER3 interrupt events. + * @var TIMER_T::PWMCLKPSC + * Offset: 0x48 Timer PWM Counter Clock Pre-scale Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |CLKPSC |PWM Counter Clock Pre-scale + * | | |The active clock of PWM counter is decided by counter clock prescale and divided by (CLKPSC + 1) + * | | |If CLKPSC is 0, then there is no scaling in PWM counter clock source. + * @var TIMER_T::PWMCNTCLR + * Offset: 0x4C Timer PWM Clear Counter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CNTCLR |Clear PWM Counter Control Bit + * | | |It is automatically cleared by hardware. + * | | |0 = No effect. + * | | |1 = Clear 16-bit PWM counter to 0x10000 in up and up-down count type and reset counter value to PERIOD in down count type. + * @var TIMER_T::PWMPERIOD + * Offset: 0x50 Timer PWM Period Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PERIOD |PWM Period Register + * | | |In up count type: PWM counter counts from 0 to PERIOD, and restarts from 0. + * | | |In down count type: PWM counter counts from PERIOD to 0, and restarts from PERIOD. + * | | |In up-down count type: PWM counter counts from 0 to PERIOD, then decrements to 0 and repeats again. + * | | |In up and down count type: + * | | |PWM period time = (PERIOD + 1) * (CLKPSC + 1) * TMRx_PWMCLK. + * | | |In up-down count type: + * | | |PWM period time = 2 * PERIOD * (CLKPSC+ 1) * TMRx_PWMCLK. + * | | |Note: User should take care DIRF (TIMERx_PWMCNT[16]) bit in up/down/up-down count type to monitor current counter direction in each count type. + * @var TIMER_T::PWMCMPDAT + * Offset: 0x54 Timer PWM Comparator Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMP |PWM Comparator Register + * | | |PWM CMP is used to compare with PWM CNT to generate PWM output waveform, interrupt events and trigger ADC to start conversion. + * @var TIMER_T::PWMDTCTL + * Offset: 0x58 Timer PWM Dead-time Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |DTCNT |Dead-time Counter (Write Protect) + * | | |The dead-time can be calculated from the following two formulas: + * | | |Dead-time = (DTCNT[11:0] + 1) * TMRx_PWMCLK, if DTCKSEL is 0. + * | | |Dead-time = (DTCNT[11:0] + 1) * TMRx_PWMCLK * (CLKPSC + 1), if DTCKSEL is 1. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[16] |DTEN |Enable Dead-time Insertion for PWMx_CH0 and PWMx_CH1 (Write Protect) + * | | |Dead-time insertion function is only active when PWM complementary mode is enabled + * | | |If dead- time insertion is inactive, the outputs of PWMx_CH0 and PWMx_CH1 are complementary without any delay. + * | | |0 = Dead-time insertion Disabled on the pin pair. + * | | |1 = Dead-time insertion Enabled on the pin pair. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[24] |DTCKSEL |Dead-time Clock Select (Write Protect) + * | | |0 = Dead-time clock source from TMRx_PWMCLK without counter clock prescale. + * | | |1 = Dead-time clock source from TMRx_PWMCLK with counter clock prescale. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * @var TIMER_T::PWMCNT + * Offset: 0x5C Timer PWM Counter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CNT |PWM Counter Value Register (Read Only) + * | | |User can monitor CNT to know the current counter value in 16-bit period counter. + * |[16] |DIRF |PWM Counter Direction Indicator Flag (Read Only) + * | | |0 = Counter is active in down count. + * | | |1 = Counter is active up count. + * @var TIMER_T::PWMMSKEN + * Offset: 0x60 Timer PWM Output Mask Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |MSKEN0 |PWMx_CH0 Output Mask Enable Bit + * | | |The PWMx_CH0 output signal will be masked when this bit is enabled + * | | |The PWMx_CH0 will output MSKDAT0 (TIMER_PWMMSK[0]) data. + * | | |0 = PWMx_CH0 output signal is non-masked. + * | | |1 = PWMx_CH0 output signal is masked and output MSKDAT0 data. + * |[1] |MSKEN1 |PWMx_CH1 Output Mask Enable Bit + * | | |The PWMx_CH1 output signal will be masked when this bit is enabled + * | | |The PWMx_CH1 will output MSKDAT1 (TIMER_PWMMSK[1]) data. + * | | |0 = PWMx_CH1 output signal is non-masked. + * | | |1 = PWMx_CH1 output signal is masked and output MSKDAT1 data. + * @var TIMER_T::PWMMSK + * Offset: 0x64 Timer PWM Output Mask Data Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |MSKDAT0 |PWMx_CH0 Output Mask Data Control Bit + * | | |This bit is used to control the output state of PWMx_CH0 pin when PWMx_CH0 output mask function is enabled (MSKEN0 = 1). + * | | |0 = Output logic Low to PWMx_CH0. + * | | |1 = Output logic High to PWMx_CH0. + * |[1] |MSKDAT1 |PWMx_CH1 Output Mask Data Control Bit + * | | |This bit is used to control the output state of PWMx_CH1 pin when PWMx_CH1 output mask function is enabled (MSKEN1 = 1). + * | | |0 = Output logic Low to PWMx_CH1. + * | | |1 = Output logic High to PWMx_CH1. + * @var TIMER_T::PWMBNF + * Offset: 0x68 Timer PWM Brake Pin Noise Filter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BRKNFEN |Brake Pin Noise Filter Enable Bit + * | | |0 = Pin noise filter detect of PWMx_BRAKEy Disabled. + * | | |1 = Pin noise filter detect of PWMx_BRAKEy Enabled. + * |[3:1] |BRKNFSEL |Brake Pin Noise Filter Clock Selection + * | | |000 = Noise filter clock is PCLKx. + * | | |001 = Noise filter clock is PCLKx/2. + * | | |010 = Noise filter clock is PCLKx/4. + * | | |011 = Noise filter clock is PCLKx/8. + * | | |100 = Noise filter clock is PCLKx/16. + * | | |101 = Noise filter clock is PCLKx/32. + * | | |110 = Noise filter clock is PCLKx/64. + * | | |111 = Noise filter clock is PCLKx/128. + * |[6:4] |BRKFCNT |Brake Pin Noise Filter Count + * | | |The fields is used to control the active noise filter sample time. + * | | |Once noise filter sample time = (Period time of BRKDBCS) * BRKFCNT. + * |[7] |BRKPINV |Brake Pin Detection Control Bit + * | | |0 = Brake pin event will be detected if PWMx_BRAKEy pin status transfer from low to high in edge-detect, or pin status is high in level-detect. + * | | |1 = Brake pin event will be detected if PWMx_BRAKEy pin status transfer from high to low in edge-detect, or pin status is low in level-detect . + * |[18:16] |BKPINSRC |Brake Pin Source Select + * | | |000 = Brake pin source comes from PWM0_BRAKE0 pin. + * | | |001 = Brake pin source comes from PWM0_BRAKE1 pin. + * | | |010 = Brake pin source comes from PWM1_BRAKE0 pin. + * | | |011 = Brake pin source comes from PWM1_BRAKE1 pin. + * | | |100 = Brake pin source comes from PWM2_BRAKE0 pin. + * | | |101 = Brake pin source comes from PWM2_BRAKE1 pin. + * @var TIMER_T::PWMFAILBRK + * Offset: 0x6C Timer PWM System Fail Brake Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CSSBRKEN |Clock Security System Detection Trigger PWM Brake Function Enable Bit + * | | |0 = Brake Function triggered by clock fail detection Disabled. + * | | |1 = Brake Function triggered by clock fail detection Enabled. + * |[1] |LVDBRKEN |Low Voltage Interrupt Flag Detection Trigger PWM Brake Function Enable Bit + * | | |0 = Brake Function triggered by LVD interrupt flag event Disabled. + * | | |1 = Brake Function triggered by LVD interrupt flag event Enabled. + * |[3] |CORBRKEN |Core Lockup Detection Trigger PWM Brake Function Enable Bit + * | | |0 = Brake Function triggered by core lockup event Disabled. + * | | |1 = Brake Function triggered by core lockup event Enabled. + * @var TIMER_T::PWMBRKCTL + * Offset: 0x70 Timer PWM Brake Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4] |BRKPEEN |Enable TM_BRAKEx Pin As Edge-detect Brake Source (Write Protect) + * | | |0 = PWMx_BRAKEy pin event as edge-detect brake source Disabled. + * | | |1 = PWMx_BRAKEy pin event as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[7] |SYSEBEN |Enable System Fail As Edge-detect Brake Source (Write Protect) + * | | |0 = System fail condition as edge-detect brake source Disabled. + * | | |1 = System fail condition as edge-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[12] |BRKPLEN |Enable TM_BRAKEx Pin As Level-detect Brake Source (Write Protect) + * | | |0 = PWMx_BRAKEy pin event as level-detect brake source Disabled. + * | | |1 = PWMx_BRAKEy pin event as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[15] |SYSLBEN |Enable System Fail As Level-detect Brake Source (Write Protect) + * | | |0 = System fail condition as level-detect brake source Disabled. + * | | |1 = System fail condition as level-detect brake source Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[17:16] |BRKAEVEN |PWM Brake Action Select for PWMx_CH0 (Write Protect) + * | | |00 = PWMx_BRAKEy brake event will not affect PWMx_CH0 output. + * | | |01 = PWMx_CH0 output tri-state when PWMx_BRAKEy brake event happened. + * | | |10 = PWMx_CH0 output low level when PWMx_BRAKEy brake event happened. + * | | |11 = PWMx_CH0 output high level when PWMx_BRAKEy brake event happened. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[19:18] |BRKAODD |PWM Brake Action Select for PWMx_CH1 (Write Protect) + * | | |00 = PWMx_BRAKEy brake event will not affect PWMx_CH1 output. + * | | |01 = PWMx_CH1 output tri-state when PWMx_BRAKEy brake event happened. + * | | |10 = PWMx_CH1 output low level when PWMx_BRAKEy brake event happened. + * | | |11 = PWMx_CH1 output high level when PWMx_BRAKEy brake event happened. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * @var TIMER_T::PWMPOLCTL + * Offset: 0x74 Timer PWM Pin Output Polar Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |PINV0 |PWMx_CH0 Output Pin Polar Control Bit + * | | |The bit is used to control polarity state of PWMx_CH0 output pin. + * | | |0 = PWMx_CH0 output pin polar inverse Disabled. + * | | |1 = PWMx_CH0 output pin polar inverse Enabled. + * |[1] |PINV1 |PWMx_CH1 Output Pin Polar Control Bit + * | | |The bit is used to control polarity state of PWMx_CH1 output pin. + * | | |0 = PWMx_CH1 output pin polar inverse Disabled. + * | | |1 = PWMx_CH1 output pin polar inverse Enabled. + * @var TIMER_T::PWMPOEN + * Offset: 0x78 Timer PWM Pin Output Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |POEN0 |PWMx_CH0 Output Pin Enable Bit + * | | |0 = PWMx_CH0 pin at tri-state mode. + * | | |1 = PWMx_CH0 pin in output mode. + * |[1] |POEN1 |PWMx_CH1 Output Pin Enable Bit + * | | |0 = PWMx_CH1 pin at tri-state mode. + * | | |1 = PWMx_CH1 pin in output mode. + * @var TIMER_T::PWMSWBRK + * Offset: 0x7C Timer PWM Software Trigger Brake Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BRKETRG |Software Trigger Edge-detect Brake Source (Write Only) (Write Protect) + * | | |Write 1 to this bit will trigger PWM edge-detect brake source, then BRKEIF0 and BRKEIF1 will set to 1 automatically in TIMERx_PWMINTSTS1 register. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[8] |BRKLTRG |Software Trigger Level-detect Brake Source (Write Only) (Write Protect) + * | | |Write 1 to this bit will trigger PWM level-detect brake source, then BRKLIF0 and BRKLIF1 will set to 1 automatically in TIMERx_PWMINTSTS1 register. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * @var TIMER_T::PWMINTEN0 + * Offset: 0x80 Timer PWM Interrupt Enable Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ZIEN |PWM Zero Point Interrupt Enable Bit + * | | |0 = Zero point interrupt Disabled. + * | | |1 = Zero point interrupt Enabled. + * |[1] |PIEN |PWM Period Point Interrupt Enable Bit + * | | |0 = Period point interrupt Disabled. + * | | |1 = Period point interrupt Enabled. + * | | |Note: In up-down count type, period point means the center point of current PWM period. + * |[2] |CMPUIEN |PWM Compare Up Count Interrupt Enable Bit + * | | |0 = Compare up count interrupt Disabled. + * | | |1 = Compare up count interrupt Enabled. + * |[3] |CMPDIEN |PWM Compare Down Count Interrupt Enable Bit + * | | |0 = Compare down count interrupt Disabled. + * | | |1 = Compare down count interrupt Enabled. + * @var TIMER_T::PWMINTEN1 + * Offset: 0x84 Timer PWM Interrupt Enable Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BRKEIEN |PWM Edge-detect Brake Interrupt Enable Bit + * | | |0 = PWM edge-detect brake interrupt Disabled. + * | | |1 = PWM edge-detect brake interrupt Enabled. + * |[8] |BRKLIEN |PWM Level-detect Brake Interrupt Enable Bit + * | | |0 = PWM level-detect brake interrupt Disabled. + * | | |1 = PWM level-detect brake interrupt Enabled. + * @var TIMER_T::PWMINTSTS0 + * Offset: 0x88 Timer PWM Interrupt Status Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ZIF |PWM Zero Point Interrupt Flag + * | | |This bit is set by hardware when TIMERx_PWM counter reaches 0. + * | | |Note: This bit is cleared by writing 1 to it. + * |[1] |PIF |PWM Period Point Interrupt Flag + * | | |This bit is set by hardware when TIMERx_PWM counter reaches PERIOD. + * | | |Note 1: In up-down count type, PIF flag means the center point flag of current PWM period. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[2] |CMPUIF |PWM Compare Up Count Interrupt Flag + * | | |This bit is set by hardware when TIMERx_PWM counter in up count direction and reaches CMP. + * | | |Note 1: If CMP equal to PERIOD, there is no CMPUIF flag in up count type and up-down count type. + * | | |Note 2: This bit is cleared by writing 1 to it. + * |[3] |CMPDIF |PWM Compare Down Count Interrupt Flag + * | | |This bit is set by hardware when TIMERx_PWM counter in down count direction and reaches CMP. + * | | |Note 1: If CMP equal to PERIOD, there is no CMPDIF flag in down count type. + * | | |Note 2: This bit is cleared by writing 1 to it. + * @var TIMER_T::PWMINTSTS1 + * Offset: 0x8C Timer PWM Interrupt Status Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |BRKEIF0 |Edge-detect Brake Interrupt Flag on PWMx_CH0 (Write Protect) + * | | |0 = PWMx_CH0 edge-detect brake event do not happened. + * | | |1 = PWMx_CH0 edge-detect brake event happened. + * | | |Note 1: This bit is cleared by writing 1 to it. + * | | |Note 2: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[1] |BRKEIF1 |Edge-detect Brake Interrupt Flag PWMx_CH1 (Write Protect) + * | | |0 = PWMx_CH1 edge-detect brake event do not happened. + * | | |1 = PWMx_CH1 edge-detect brake event happened. + * | | |Note 1: This bit is cleared by writing 1 to it. + * | | |Note 2: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[8] |BRKLIF0 |Level-detect Brake Interrupt Flag on PWMx_CH0 (Write Protect) + * | | |0 = PWMx_CH0 level-detect brake event do not happened. + * | | |1 = PWMx_CH0 level-detect brake event happened. + * | | |Note 1: This bit is cleared by writing 1 to it. + * | | |Note 2: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[9] |BRKLIF1 |Level-detect Brake Interrupt Flag on PWMx_CH1 (Write Protect) + * | | |0 = PWMx_CH1 level-detect brake event do not happened. + * | | |1 = PWMx_CH1 level-detect brake event happened. + * | | |Note 1: This bit is cleared by writing 1 to it. + * | | |Note 2: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * |[16] |BRKESTS0 |Edge -detect Brake Status of PWMx_CH0 (Read Only) + * | | |0 = PWMx_CH0 edge-detect brake state is released. + * | | |1 = PWMx_CH0 at edge-detect brake state. + * | | |Note: User can set BRKEIF0 1 to clear BRKEIF0 flag and PWMx_CH0 will release brake state when current PWM period finished and resume PWMx_CH0 output waveform start from next full PWM period. + * |[17] |BRKESTS1 |Edge-detect Brake Status of PWMx_CH1 (Read Only) + * | | |0 = PWMx_CH1 edge-detect brake state is released. + * | | |1 = PWMx_CH1 at edge-detect brake state. + * | | |Note: User can set BRKEIF1 1 to clear BRKEIF1 flag and PWMx_CH1 will release brake state when current PWM period finished and resume PWMx_CH1 output waveform start from next full PWM period. + * |[24] |BRKLSTS0 |Level-detect Brake Status of PWMx_CH0 (Read Only) + * | | |0 = PWMx_CH0 level-detect brake state is released. + * | | |1 = PWMx_CH0 at level-detect brake state. + * | | |Note: If TIMERx_PWM level-detect brake source has released, both PWMx_CH0 and PWMx_CH1 will release brake state when current PWM period finished and resume PWMx_CH0 and PWMx_CH1 output waveform start from next full PWM period. + * |[25] |BRKLSTS1 |Level-detect Brake Status of PWMx_CH1 (Read Only) + * | | |0 = PWMx_CH1 level-detect brake state is released. + * | | |1 = PWMx_CH1 at level-detect brake state. + * | | |Note: If TIMERx_PWM level-detect brake source has released, both PWMx_CH0 and PWMx_CH1 will release brake state when current PWM period finished and resume PWMx_CH0 and PWMx_CH1 output waveform start from next full PWM period. + * @var TIMER_T::PWMEADCTS + * Offset: 0x90 Timer PWM EADC Trigger Source Select Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |TRGSEL |PWM Counter Event Source Select to Trigger EADC Conversion + * | | |000 = Trigger EADC conversion at zero point (ZIF). + * | | |001 = Trigger EADC conversion at period point (PIF). + * | | |010 = Trigger EADC conversion at zero or period point (ZIF or PIF). + * | | |011 = Trigger EADC conversion at compare up count point (CMPUIF). + * | | |100 = Trigger EADC conversion at compare down count point (CMPDIF). + * | | |Others = Reserved. + * |[7] |TRGEN |PWM Counter Event Trigger EADC Conversion Enable Bit + * | | |0 = PWM counter event trigger EADC conversion Disabled. + * | | |1 = PWM counter event trigger EADC conversion Enabled. + * @var TIMER_T::PWMSCTL + * Offset: 0x94 Timer PWM Synchronous Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |SYNCMODE |PWM Synchronous Mode Enable Select + * | | |00 = PWM synchronous function Disabled. + * | | |01 = PWM synchronous counter start function Enabled. + * | | |10 = Reserved. + * | | |11 = PWM synchronous counter clear function Enabled. + * |[10:8] |SYNCSRC |PWM Synchronous Counter Start/Clear Source Select + * | | |000 = Counter synchronous start/clear by trigger TIMER0_PWMSTRG STRGEN. + * | | |001 = Counter synchronous start/clear by trigger TIMER2_PWMSTRG STRGEN. + * | | |010 = Counter synchronous start/clear by trigger TIMER4_PWMSTRG STRGEN. + * | | |011 = Counter synchronous start/clear by trigger TIMER6_PWMSTRG STRGEN. + * | | |100 = Counter synchronous start/clear by trigger TIMER8_PWMSTRG STRGEN. + * | | |101 = Counter synchronous start/clear by trigger TIMER10_PWMSTRG STRGEN. + * | | |Note 1: If TIMER0/1/2/3 PWM counter synchronous source are from TIMER0, TIMER0_PWMSCTL[8], TIMER1_PWMSCTL[8], TIMER2_PWMSCTL[8] and TIMER3_PWMSCTL[8] should be 0. + * | | |Note 2: If TIMER0/1/ PWM counter synchronous source are from TIMER0, TIMER0_PWMSCTL[8] and TIMER1_PWMSCTL[8] should be set 0, and TIMER2/3/ PWM counter synchronous source are from TIMER2, TIME2_PWMSCTL[8] and TIMER3_PWMSCTL[8] should be set 1. + * @var TIMER_T::PWMSTRG + * Offset: 0x98 Timer PWM Synchronous Trigger Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |STRGEN |PWM Counter Synchronous Trigger Enable Bit (Write Only) + * | | |PMW counter synchronous function is used to make selected PWM channels (include TIMER0/1/2/3 PWM, TIMER0/1 PWM and TIMER2/3 PWM) start counting or clear counter at the same time according to TIMERx_PWMSCTL setting. + * | | |Note: This bit is only available in TIMER0 and TIMER2. + * @var TIMER_T::PWMSTATUS + * Offset: 0x9C Timer PWM Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CNTMAXF |PWM Counter Equal to 0xFFFF Flag + * | | |0 = The PWM counter value never reached its maximum value 0xFFFF. + * | | |1 = The PWM counter value has reached its maximum value. + * | | |Note: This bit is cleared by writing 1 to it. + * |[16] |EADCTRGF |Trigger EADC Start Conversion Flag + * | | |0 = PWM counter event trigger EADC start conversion is not occurred. + * | | |1 = PWM counter event trigger EADC start conversion has occurred. + * | | |Note: This bit is cleared by writing 1 to it. + * @var TIMER_T::PWMPBUF + * Offset: 0xA0 Timer PWM Period Buffer Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |PBUF |PWM Period Buffer Register (Read Only) + * | | |Used as PERIOD active register. + * @var TIMER_T::PWMCMPBUF + * Offset: 0xA4 Timer PWM Comparator Buffer Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |CMPBUF |PWM Comparator Buffer Register (Read Only) + * | | |Used as CMP active register. + */ + __IO uint32_t CTL; /*!< [0x0000] Timer Control Register */ + __IO uint32_t CMP; /*!< [0x0004] Timer Comparator Register */ + __IO uint32_t INTSTS; /*!< [0x0008] Timer Interrupt Status Register */ + __IO uint32_t CNT; /*!< [0x000c] Timer Data Register */ + __I uint32_t CAP; /*!< [0x0010] Timer Capture Data Register */ + __IO uint32_t EXTCTL; /*!< [0x0014] Timer External Control Register */ + __IO uint32_t EINTSTS; /*!< [0x0018] Timer External Interrupt Status Register */ + __IO uint32_t TRGCTL; /*!< [0x001c] Timer Trigger Control Register */ + __IO uint32_t ALTCTL; /*!< [0x0020] Timer Alternative Control Register */ + __I uint32_t RESERVE0[7]; + __IO uint32_t PWMCTL; /*!< [0x0040] Timer PWM Control Register */ + __IO uint32_t PWMCLKSRC; /*!< [0x0044] Timer PWM Counter Clock Source Register */ + __IO uint32_t PWMCLKPSC; /*!< [0x0048] Timer PWM Counter Clock Pre-scale Register */ + __IO uint32_t PWMCNTCLR; /*!< [0x004c] Timer PWM Clear Counter Register */ + __IO uint32_t PWMPERIOD; /*!< [0x0050] Timer PWM Period Register */ + __IO uint32_t PWMCMPDAT; /*!< [0x0054] Timer PWM Comparator Register */ + __IO uint32_t PWMDTCTL; /*!< [0x0058] Timer PWM Dead-time Control Register */ + __I uint32_t PWMCNT; /*!< [0x005c] Timer PWM Counter Register */ + __IO uint32_t PWMMSKEN; /*!< [0x0060] Timer PWM Output Mask Enable Register */ + __IO uint32_t PWMMSK; /*!< [0x0064] Timer PWM Output Mask Data Control Register */ + __IO uint32_t PWMBNF; /*!< [0x0068] Timer PWM Brake Pin Noise Filter Register */ + __IO uint32_t PWMFAILBRK; /*!< [0x006c] Timer PWM System Fail Brake Control Register */ + __IO uint32_t PWMBRKCTL; /*!< [0x0070] Timer PWM Brake Control Register */ + __IO uint32_t PWMPOLCTL; /*!< [0x0074] Timer PWM Pin Output Polar Control Register */ + __IO uint32_t PWMPOEN; /*!< [0x0078] Timer PWM Pin Output Enable Register */ + __O uint32_t PWMSWBRK; /*!< [0x007c] Timer PWM Software Trigger Brake Control Register */ + __IO uint32_t PWMINTEN0; /*!< [0x0080] Timer PWM Interrupt Enable Register 0 */ + __IO uint32_t PWMINTEN1; /*!< [0x0084] Timer PWM Interrupt Enable Register 1 */ + __IO uint32_t PWMINTSTS0; /*!< [0x0088] Timer PWM Interrupt Status Register 0 */ + __IO uint32_t PWMINTSTS1; /*!< [0x008c] Timer PWM Interrupt Status Register 1 */ + __IO uint32_t PWMEADCTS; /*!< [0x0090] Timer PWM EADC Trigger Source Select Register */ + __IO uint32_t PWMSCTL; /*!< [0x0094] Timer PWM Synchronous Control Register */ + __O uint32_t PWMSTRG; /*!< [0x0098] Timer PWM Synchronous Trigger Register */ + __IO uint32_t PWMSTATUS; /*!< [0x009c] Timer PWM Status Register */ + __I uint32_t PWMPBUF; /*!< [0x00a0] Timer PWM Period Buffer Register */ + __I uint32_t PWMCMPBUF; /*!< [0x00a4] Timer PWM Comparator Buffer Register */ + +} TIMER_T; + +/** + @addtogroup TIMER_CONST TIMER Bit Field Definition + Constant Definitions for TIMER Controller +@{ */ + +#define TIMER_CTL_PSC_Pos (0) /*!< TIMER_T::CTL: PSC Position */ +#define TIMER_CTL_PSC_Msk (0xfful << TIMER_CTL_PSC_Pos) /*!< TIMER_T::CTL: PSC Mask */ + +#define TIMER_CTL_INTRGEN_Pos (19) /*!< TIMER_T::CTL: INTRGEN Position */ +#define TIMER_CTL_INTRGEN_Msk (0x1ul << TIMER_CTL_INTRGEN_Pos) /*!< TIMER_T::CTL: INTRGEN Mask */ + +#define TIMER_CTL_PERIOSEL_Pos (20) /*!< TIMER_T::CTL: PERIOSEL Position */ +#define TIMER_CTL_PERIOSEL_Msk (0x1ul << TIMER_CTL_PERIOSEL_Pos) /*!< TIMER_T::CTL: PERIOSEL Mask */ + +#define TIMER_CTL_TGLPINSEL_Pos (21) /*!< TIMER_T::CTL: TGLPINSEL Position */ +#define TIMER_CTL_TGLPINSEL_Msk (0x1ul << TIMER_CTL_TGLPINSEL_Pos) /*!< TIMER_T::CTL: TGLPINSEL Mask */ + +#define TIMER_CTL_CAPSRC_Pos (22) /*!< TIMER_T::CTL: CAPSRC Position */ +#define TIMER_CTL_CAPSRC_Msk (0x1ul << TIMER_CTL_CAPSRC_Pos) /*!< TIMER_T::CTL: CAPSRC Mask */ + +#define TIMER_CTL_WKEN_Pos (23) /*!< TIMER_T::CTL: WKEN Position */ +#define TIMER_CTL_WKEN_Msk (0x1ul << TIMER_CTL_WKEN_Pos) /*!< TIMER_T::CTL: WKEN Mask */ + +#define TIMER_CTL_EXTCNTEN_Pos (24) /*!< TIMER_T::CTL: EXTCNTEN Position */ +#define TIMER_CTL_EXTCNTEN_Msk (0x1ul << TIMER_CTL_EXTCNTEN_Pos) /*!< TIMER_T::CTL: EXTCNTEN Mask */ + +#define TIMER_CTL_ACTSTS_Pos (25) /*!< TIMER_T::CTL: ACTSTS Position */ +#define TIMER_CTL_ACTSTS_Msk (0x1ul << TIMER_CTL_ACTSTS_Pos) /*!< TIMER_T::CTL: ACTSTS Mask */ + +#define TIMER_CTL_OPMODE_Pos (27) /*!< TIMER_T::CTL: OPMODE Position */ +#define TIMER_CTL_OPMODE_Msk (0x3ul << TIMER_CTL_OPMODE_Pos) /*!< TIMER_T::CTL: OPMODE Mask */ + +#define TIMER_CTL_INTEN_Pos (29) /*!< TIMER_T::CTL: INTEN Position */ +#define TIMER_CTL_INTEN_Msk (0x1ul << TIMER_CTL_INTEN_Pos) /*!< TIMER_T::CTL: INTEN Mask */ + +#define TIMER_CTL_CNTEN_Pos (30) /*!< TIMER_T::CTL: CNTEN Position */ +#define TIMER_CTL_CNTEN_Msk (0x1ul << TIMER_CTL_CNTEN_Pos) /*!< TIMER_T::CTL: CNTEN Mask */ + +#define TIMER_CTL_ICEDEBUG_Pos (31) /*!< TIMER_T::CTL: ICEDEBUG Position */ +#define TIMER_CTL_ICEDEBUG_Msk (0x1ul << TIMER_CTL_ICEDEBUG_Pos) /*!< TIMER_T::CTL: ICEDEBUG Mask */ + +#define TIMER_CMP_CMPDAT_Pos (0) /*!< TIMER_T::CMP: CMPDAT Position */ +#define TIMER_CMP_CMPDAT_Msk (0xfffffful << TIMER_CMP_CMPDAT_Pos) /*!< TIMER_T::CMP: CMPDAT Mask */ + +#define TIMER_INTSTS_TIF_Pos (0) /*!< TIMER_T::INTSTS: TIF Position */ +#define TIMER_INTSTS_TIF_Msk (0x1ul << TIMER_INTSTS_TIF_Pos) /*!< TIMER_T::INTSTS: TIF Mask */ + +#define TIMER_INTSTS_TWKF_Pos (1) /*!< TIMER_T::INTSTS: TWKF Position */ +#define TIMER_INTSTS_TWKF_Msk (0x1ul << TIMER_INTSTS_TWKF_Pos) /*!< TIMER_T::INTSTS: TWKF Mask */ + +#define TIMER_CNT_CNT_Pos (0) /*!< TIMER_T::CNT: CNT Position */ +#define TIMER_CNT_CNT_Msk (0xfffffful << TIMER_CNT_CNT_Pos) /*!< TIMER_T::CNT: CNT Mask */ + +#define TIMER_CNT_RSTACT_Pos (31) /*!< TIMER_T::CNT: RSTACT Position */ +#define TIMER_CNT_RSTACT_Msk (0x1ul << TIMER_CNT_RSTACT_Pos) /*!< TIMER_T::CNT: RSTACT Mask */ + +#define TIMER_CAP_CAPDAT_Pos (0) /*!< TIMER_T::CAP: CAPDAT Position */ +#define TIMER_CAP_CAPDAT_Msk (0xfffffful << TIMER_CAP_CAPDAT_Pos) /*!< TIMER_T::CAP: CAPDAT Mask */ + +#define TIMER_EXTCTL_CNTPHASE_Pos (0) /*!< TIMER_T::EXTCTL: CNTPHASE Position */ +#define TIMER_EXTCTL_CNTPHASE_Msk (0x1ul << TIMER_EXTCTL_CNTPHASE_Pos) /*!< TIMER_T::EXTCTL: CNTPHASE Mask */ + +#define TIMER_EXTCTL_CAPEN_Pos (3) /*!< TIMER_T::EXTCTL: CAPEN Position */ +#define TIMER_EXTCTL_CAPEN_Msk (0x1ul << TIMER_EXTCTL_CAPEN_Pos) /*!< TIMER_T::EXTCTL: CAPEN Mask */ + +#define TIMER_EXTCTL_CAPFUNCS_Pos (4) /*!< TIMER_T::EXTCTL: CAPFUNCS Position */ +#define TIMER_EXTCTL_CAPFUNCS_Msk (0x1ul << TIMER_EXTCTL_CAPFUNCS_Pos) /*!< TIMER_T::EXTCTL: CAPFUNCS Mask */ + +#define TIMER_EXTCTL_CAPIEN_Pos (5) /*!< TIMER_T::EXTCTL: CAPIEN Position */ +#define TIMER_EXTCTL_CAPIEN_Msk (0x1ul << TIMER_EXTCTL_CAPIEN_Pos) /*!< TIMER_T::EXTCTL: CAPIEN Mask */ + +#define TIMER_EXTCTL_CAPDBEN_Pos (6) /*!< TIMER_T::EXTCTL: CAPDBEN Position */ +#define TIMER_EXTCTL_CAPDBEN_Msk (0x1ul << TIMER_EXTCTL_CAPDBEN_Pos) /*!< TIMER_T::EXTCTL: CAPDBEN Mask */ + +#define TIMER_EXTCTL_CNTDBEN_Pos (7) /*!< TIMER_T::EXTCTL: CNTDBEN Position */ +#define TIMER_EXTCTL_CNTDBEN_Msk (0x1ul << TIMER_EXTCTL_CNTDBEN_Pos) /*!< TIMER_T::EXTCTL: CNTDBEN Mask */ + +#define TIMER_EXTCTL_ICAPSSEL_Pos (8) /*!< TIMER_T::EXTCTL: ICAPSSEL Position */ +#define TIMER_EXTCTL_ICAPSSEL_Msk (0x7ul << TIMER_EXTCTL_ICAPSSEL_Pos) /*!< TIMER_T::EXTCTL: ICAPSSEL Mask */ + +#define TIMER_EXTCTL_CAPEDGE_Pos (12) /*!< TIMER_T::EXTCTL: CAPEDGE Position */ +#define TIMER_EXTCTL_CAPEDGE_Msk (0x7ul << TIMER_EXTCTL_CAPEDGE_Pos) /*!< TIMER_T::EXTCTL: CAPEDGE Mask */ + +#define TIMER_EXTCTL_ECNTSSEL_Pos (16) /*!< TIMER_T::EXTCTL: ECNTSSEL Position */ +#define TIMER_EXTCTL_ECNTSSEL_Msk (0x1ul << TIMER_EXTCTL_ECNTSSEL_Pos) /*!< TIMER_T::EXTCTL: ECNTSSEL Mask */ + +#define TIMER_EXTCTL_CAPSDIV_Pos (28) /*!< TIMER_T::EXTCTL: CAPSDIV Position */ +#define TIMER_EXTCTL_CAPSDIV_Msk (0xful << TIMER_EXTCTL_CAPSDIV_Pos) /*!< TIMER_T::EXTCTL: CAPSDIV Mask */ + +#define TIMER_EINTSTS_CAPIF_Pos (0) /*!< TIMER_T::EINTSTS: CAPIF Position */ +#define TIMER_EINTSTS_CAPIF_Msk (0x1ul << TIMER_EINTSTS_CAPIF_Pos) /*!< TIMER_T::EINTSTS: CAPIF Mask */ + +#define TIMER_TRGCTL_TRGSSEL_Pos (0) /*!< TIMER_T::TRGCTL: TRGSSEL Position */ +#define TIMER_TRGCTL_TRGSSEL_Msk (0x1ul << TIMER_TRGCTL_TRGSSEL_Pos) /*!< TIMER_T::TRGCTL: TRGSSEL Mask */ + +#define TIMER_TRGCTL_TRGPWM_Pos (1) /*!< TIMER_T::TRGCTL: TRGPWM Position */ +#define TIMER_TRGCTL_TRGPWM_Msk (0x1ul << TIMER_TRGCTL_TRGPWM_Pos) /*!< TIMER_T::TRGCTL: TRGPWM Mask */ + +#define TIMER_TRGCTL_TRGEADC_Pos (2) /*!< TIMER_T::TRGCTL: TRGEADC Position */ +#define TIMER_TRGCTL_TRGEADC_Msk (0x1ul << TIMER_TRGCTL_TRGEADC_Pos) /*!< TIMER_T::TRGCTL: TRGEADC Mask */ + +#define TIMER_TRGCTL_TRGPDMA_Pos (4) /*!< TIMER_T::TRGCTL: TRGPDMA Position */ +#define TIMER_TRGCTL_TRGPDMA_Msk (0x1ul << TIMER_TRGCTL_TRGPDMA_Pos) /*!< TIMER_T::TRGCTL: TRGPDMA Mask */ + +#define TIMER_ALTCTL_FUNCSEL_Pos (0) /*!< TIMER_T::ALTCTL: FUNCSEL Position */ +#define TIMER_ALTCTL_FUNCSEL_Msk (0x1ul << TIMER_ALTCTL_FUNCSEL_Pos) /*!< TIMER_T::ALTCTL: FUNCSEL Mask */ + +#define TIMER_PWMCTL_CNTEN_Pos (0) /*!< TIMER_T::PWMCTL: CNTEN Position */ +#define TIMER_PWMCTL_CNTEN_Msk (0x1ul << TIMER_PWMCTL_CNTEN_Pos) /*!< TIMER_T::PWMCTL: CNTEN Mask */ + +#define TIMER_PWMCTL_CNTTYPE_Pos (1) /*!< TIMER_T::PWMCTL: CNTTYPE Position */ +#define TIMER_PWMCTL_CNTTYPE_Msk (0x3ul << TIMER_PWMCTL_CNTTYPE_Pos) /*!< TIMER_T::PWMCTL: CNTTYPE Mask */ + +#define TIMER_PWMCTL_CNTMODE_Pos (3) /*!< TIMER_T::PWMCTL: CNTMODE Position */ +#define TIMER_PWMCTL_CNTMODE_Msk (0x1ul << TIMER_PWMCTL_CNTMODE_Pos) /*!< TIMER_T::PWMCTL: CNTMODE Mask */ + +#define TIMER_PWMCTL_CTRLD_Pos (8) /*!< TIMER_T::PWMCTL: CTRLD Position */ +#define TIMER_PWMCTL_CTRLD_Msk (0x1ul << TIMER_PWMCTL_CTRLD_Pos) /*!< TIMER_T::PWMCTL: CTRLD Mask */ + +#define TIMER_PWMCTL_IMMLDEN_Pos (9) /*!< TIMER_T::PWMCTL: IMMLDEN Position */ +#define TIMER_PWMCTL_IMMLDEN_Msk (0x1ul << TIMER_PWMCTL_IMMLDEN_Pos) /*!< TIMER_T::PWMCTL: IMMLDEN Mask */ + +#define TIMER_PWMCTL_OUTMODE_Pos (16) /*!< TIMER_T::PWMCTL: OUTMODE Position */ +#define TIMER_PWMCTL_OUTMODE_Msk (0x1ul << TIMER_PWMCTL_OUTMODE_Pos) /*!< TIMER_T::PWMCTL: OUTMODE Mask */ + +#define TIMER_PWMCTL_DBGHALT_Pos (30) /*!< TIMER_T::PWMCTL: DBGHALT Position */ +#define TIMER_PWMCTL_DBGHALT_Msk (0x1ul << TIMER_PWMCTL_DBGHALT_Pos) /*!< TIMER_T::PWMCTL: DBGHALT Mask */ + +#define TIMER_PWMCTL_DBGTRIOFF_Pos (31) /*!< TIMER_T::PWMCTL: DBGTRIOFF Position */ +#define TIMER_PWMCTL_DBGTRIOFF_Msk (0x1ul << TIMER_PWMCTL_DBGTRIOFF_Pos) /*!< TIMER_T::PWMCTL: DBGTRIOFF Mask */ + +#define TIMER_PWMCLKSRC_CLKSRC_Pos (0) /*!< TIMER_T::PWMCLKSRC: CLKSRC Position */ +#define TIMER_PWMCLKSRC_CLKSRC_Msk (0xful << TIMER_PWMCLKSRC_CLKSRC_Pos) /*!< TIMER_T::PWMCLKSRC: CLKSRC Mask */ + +#define TIMER_PWMCLKPSC_CLKPSC_Pos (0) /*!< TIMER_T::PWMCLKPSC: CLKPSC Position */ +#define TIMER_PWMCLKPSC_CLKPSC_Msk (0xffful << TIMER_PWMCLKPSC_CLKPSC_Pos) /*!< TIMER_T::PWMCLKPSC: CLKPSC Mask */ + +#define TIMER_PWMCNTCLR_CNTCLR_Pos (0) /*!< TIMER_T::PWMCNTCLR: CNTCLR Position */ +#define TIMER_PWMCNTCLR_CNTCLR_Msk (0x1ul << TIMER_PWMCNTCLR_CNTCLR_Pos) /*!< TIMER_T::PWMCNTCLR: CNTCLR Mask */ + +#define TIMER_PWMPERIOD_PERIOD_Pos (0) /*!< TIMER_T::PWMPERIOD: PERIOD Position */ +#define TIMER_PWMPERIOD_PERIOD_Msk (0xfffful << TIMER_PWMPERIOD_PERIOD_Pos) /*!< TIMER_T::PWMPERIOD: PERIOD Mask */ + +#define TIMER_PWMCMPDAT_CMP_Pos (0) /*!< TIMER_T::PWMCMPDAT: CMP Position */ +#define TIMER_PWMCMPDAT_CMP_Msk (0xfffful << TIMER_PWMCMPDAT_CMP_Pos) /*!< TIMER_T::PWMCMPDAT: CMP Mask */ + +#define TIMER_PWMDTCTL_DTCNT_Pos (0) /*!< TIMER_T::PWMDTCTL: DTCNT Position */ +#define TIMER_PWMDTCTL_DTCNT_Msk (0xffful << TIMER_PWMDTCTL_DTCNT_Pos) /*!< TIMER_T::PWMDTCTL: DTCNT Mask */ + +#define TIMER_PWMDTCTL_DTEN_Pos (16) /*!< TIMER_T::PWMDTCTL: DTEN Position */ +#define TIMER_PWMDTCTL_DTEN_Msk (0x1ul << TIMER_PWMDTCTL_DTEN_Pos) /*!< TIMER_T::PWMDTCTL: DTEN Mask */ + +#define TIMER_PWMDTCTL_DTCKSEL_Pos (24) /*!< TIMER_T::PWMDTCTL: DTCKSEL Position */ +#define TIMER_PWMDTCTL_DTCKSEL_Msk (0x1ul << TIMER_PWMDTCTL_DTCKSEL_Pos) /*!< TIMER_T::PWMDTCTL: DTCKSEL Mask */ + +#define TIMER_PWMCNT_CNT_Pos (0) /*!< TIMER_T::PWMCNT: CNT Position */ +#define TIMER_PWMCNT_CNT_Msk (0xfffful << TIMER_PWMCNT_CNT_Pos) /*!< TIMER_T::PWMCNT: CNT Mask */ + +#define TIMER_PWMCNT_DIRF_Pos (16) /*!< TIMER_T::PWMCNT: DIRF Position */ +#define TIMER_PWMCNT_DIRF_Msk (0x1ul << TIMER_PWMCNT_DIRF_Pos) /*!< TIMER_T::PWMCNT: DIRF Mask */ + +#define TIMER_PWMMSKEN_MSKEN0_Pos (0) /*!< TIMER_T::PWMMSKEN: MSKEN0 Position */ +#define TIMER_PWMMSKEN_MSKEN0_Msk (0x1ul << TIMER_PWMMSKEN_MSKEN0_Pos) /*!< TIMER_T::PWMMSKEN: MSKEN0 Mask */ + +#define TIMER_PWMMSKEN_MSKEN1_Pos (1) /*!< TIMER_T::PWMMSKEN: MSKEN1 Position */ +#define TIMER_PWMMSKEN_MSKEN1_Msk (0x1ul << TIMER_PWMMSKEN_MSKEN1_Pos) /*!< TIMER_T::PWMMSKEN: MSKEN1 Mask */ + +#define TIMER_PWMMSK_MSKDAT0_Pos (0) /*!< TIMER_T::PWMMSK: MSKDAT0 Position */ +#define TIMER_PWMMSK_MSKDAT0_Msk (0x1ul << TIMER_PWMMSK_MSKDAT0_Pos) /*!< TIMER_T::PWMMSK: MSKDAT0 Mask */ + +#define TIMER_PWMMSK_MSKDAT1_Pos (1) /*!< TIMER_T::PWMMSK: MSKDAT1 Position */ +#define TIMER_PWMMSK_MSKDAT1_Msk (0x1ul << TIMER_PWMMSK_MSKDAT1_Pos) /*!< TIMER_T::PWMMSK: MSKDAT1 Mask */ + +#define TIMER_PWMBNF_BRKNFEN_Pos (0) /*!< TIMER_T::PWMBNF: BRKNFEN Position */ +#define TIMER_PWMBNF_BRKNFEN_Msk (0x1ul << TIMER_PWMBNF_BRKNFEN_Pos) /*!< TIMER_T::PWMBNF: BRKNFEN Mask */ + +#define TIMER_PWMBNF_BRKNFSEL_Pos (1) /*!< TIMER_T::PWMBNF: BRKNFSEL Position */ +#define TIMER_PWMBNF_BRKNFSEL_Msk (0x7ul << TIMER_PWMBNF_BRKNFSEL_Pos) /*!< TIMER_T::PWMBNF: BRKNFSEL Mask */ + +#define TIMER_PWMBNF_BRKFCNT_Pos (4) /*!< TIMER_T::PWMBNF: BRKFCNT Position */ +#define TIMER_PWMBNF_BRKFCNT_Msk (0x7ul << TIMER_PWMBNF_BRKFCNT_Pos) /*!< TIMER_T::PWMBNF: BRKFCNT Mask */ + +#define TIMER_PWMBNF_BRKPINV_Pos (7) /*!< TIMER_T::PWMBNF: BRKPINV Position */ +#define TIMER_PWMBNF_BRKPINV_Msk (0x1ul << TIMER_PWMBNF_BRKPINV_Pos) /*!< TIMER_T::PWMBNF: BRKPINV Mask */ + +#define TIMER_PWMBNF_BKPINSRC_Pos (16) /*!< TIMER_T::PWMBNF: BKPINSRC Position */ +#define TIMER_PWMBNF_BKPINSRC_Msk (0x7ul << TIMER_PWMBNF_BKPINSRC_Pos) /*!< TIMER_T::PWMBNF: BKPINSRC Mask */ + +#define TIMER_PWMFAILBRK_CSSBRKEN_Pos (0) /*!< TIMER_T::PWMFAILBRK: CSSBRKEN Position */ +#define TIMER_PWMFAILBRK_CSSBRKEN_Msk (0x1ul << TIMER_PWMFAILBRK_CSSBRKEN_Pos) /*!< TIMER_T::PWMFAILBRK: CSSBRKEN Mask */ + +#define TIMER_PWMFAILBRK_LVDBRKEN_Pos (1) /*!< TIMER_T::PWMFAILBRK: LVDBRKEN Position */ +#define TIMER_PWMFAILBRK_LVDBRKEN_Msk (0x1ul << TIMER_PWMFAILBRK_LVDBRKEN_Pos) /*!< TIMER_T::PWMFAILBRK: LVDBRKEN Mask */ + +#define TIMER_PWMFAILBRK_CORBRKEN_Pos (3) /*!< TIMER_T::PWMFAILBRK: CORBRKEN Position */ +#define TIMER_PWMFAILBRK_CORBRKEN_Msk (0x1ul << TIMER_PWMFAILBRK_CORBRKEN_Pos) /*!< TIMER_T::PWMFAILBRK: CORBRKEN Mask */ + +#define TIMER_PWMBRKCTL_BRKPEEN_Pos (4) /*!< TIMER_T::PWMBRKCTL: BRKPEEN Position */ +#define TIMER_PWMBRKCTL_BRKPEEN_Msk (0x1ul << TIMER_PWMBRKCTL_BRKPEEN_Pos) /*!< TIMER_T::PWMBRKCTL: BRKPEEN Mask */ + +#define TIMER_PWMBRKCTL_SYSEBEN_Pos (7) /*!< TIMER_T::PWMBRKCTL: SYSEBEN Position */ +#define TIMER_PWMBRKCTL_SYSEBEN_Msk (0x1ul << TIMER_PWMBRKCTL_SYSEBEN_Pos) /*!< TIMER_T::PWMBRKCTL: SYSEBEN Mask */ + +#define TIMER_PWMBRKCTL_BRKPLEN_Pos (12) /*!< TIMER_T::PWMBRKCTL: BRKPLEN Position */ +#define TIMER_PWMBRKCTL_BRKPLEN_Msk (0x1ul << TIMER_PWMBRKCTL_BRKPLEN_Pos) /*!< TIMER_T::PWMBRKCTL: BRKPLEN Mask */ + +#define TIMER_PWMBRKCTL_SYSLBEN_Pos (15) /*!< TIMER_T::PWMBRKCTL: SYSLBEN Position */ +#define TIMER_PWMBRKCTL_SYSLBEN_Msk (0x1ul << TIMER_PWMBRKCTL_SYSLBEN_Pos) /*!< TIMER_T::PWMBRKCTL: SYSLBEN Mask */ + +#define TIMER_PWMBRKCTL_BRKAEVEN_Pos (16) /*!< TIMER_T::PWMBRKCTL: BRKAEVEN Position */ +#define TIMER_PWMBRKCTL_BRKAEVEN_Msk (0x3ul << TIMER_PWMBRKCTL_BRKAEVEN_Pos) /*!< TIMER_T::PWMBRKCTL: BRKAEVEN Mask */ + +#define TIMER_PWMBRKCTL_BRKAODD_Pos (18) /*!< TIMER_T::PWMBRKCTL: BRKAODD Position */ +#define TIMER_PWMBRKCTL_BRKAODD_Msk (0x3ul << TIMER_PWMBRKCTL_BRKAODD_Pos) /*!< TIMER_T::PWMBRKCTL: BRKAODD Mask */ + +#define TIMER_PWMPOLCTL_PINV0_Pos (0) /*!< TIMER_T::PWMPOLCTL: PINV0 Position */ +#define TIMER_PWMPOLCTL_PINV0_Msk (0x1ul << TIMER_PWMPOLCTL_PINV0_Pos) /*!< TIMER_T::PWMPOLCTL: PINV0 Mask */ + +#define TIMER_PWMPOLCTL_PINV1_Pos (1) /*!< TIMER_T::PWMPOLCTL: PINV1 Position */ +#define TIMER_PWMPOLCTL_PINV1_Msk (0x1ul << TIMER_PWMPOLCTL_PINV1_Pos) /*!< TIMER_T::PWMPOLCTL: PINV1 Mask */ + +#define TIMER_PWMPOEN_POEN0_Pos (0) /*!< TIMER_T::PWMPOEN: POEN0 Position */ +#define TIMER_PWMPOEN_POEN0_Msk (0x1ul << TIMER_PWMPOEN_POEN0_Pos) /*!< TIMER_T::PWMPOEN: POEN0 Mask */ + +#define TIMER_PWMPOEN_POEN1_Pos (1) /*!< TIMER_T::PWMPOEN: POEN1 Position */ +#define TIMER_PWMPOEN_POEN1_Msk (0x1ul << TIMER_PWMPOEN_POEN1_Pos) /*!< TIMER_T::PWMPOEN: POEN1 Mask */ + +#define TIMER_PWMSWBRK_BRKETRG_Pos (0) /*!< TIMER_T::PWMSWBRK: BRKETRG Position */ +#define TIMER_PWMSWBRK_BRKETRG_Msk (0x1ul << TIMER_PWMSWBRK_BRKETRG_Pos) /*!< TIMER_T::PWMSWBRK: BRKETRG Mask */ + +#define TIMER_PWMSWBRK_BRKLTRG_Pos (8) /*!< TIMER_T::PWMSWBRK: BRKLTRG Position */ +#define TIMER_PWMSWBRK_BRKLTRG_Msk (0x1ul << TIMER_PWMSWBRK_BRKLTRG_Pos) /*!< TIMER_T::PWMSWBRK: BRKLTRG Mask */ + +#define TIMER_PWMINTEN0_ZIEN_Pos (0) /*!< TIMER_T::PWMINTEN0: ZIEN Position */ +#define TIMER_PWMINTEN0_ZIEN_Msk (0x1ul << TIMER_PWMINTEN0_ZIEN_Pos) /*!< TIMER_T::PWMINTEN0: ZIEN Mask */ + +#define TIMER_PWMINTEN0_PIEN_Pos (1) /*!< TIMER_T::PWMINTEN0: PIEN Position */ +#define TIMER_PWMINTEN0_PIEN_Msk (0x1ul << TIMER_PWMINTEN0_PIEN_Pos) /*!< TIMER_T::PWMINTEN0: PIEN Mask */ + +#define TIMER_PWMINTEN0_CMPUIEN_Pos (2) /*!< TIMER_T::PWMINTEN0: CMPUIEN Position */ +#define TIMER_PWMINTEN0_CMPUIEN_Msk (0x1ul << TIMER_PWMINTEN0_CMPUIEN_Pos) /*!< TIMER_T::PWMINTEN0: CMPUIEN Mask */ + +#define TIMER_PWMINTEN0_CMPDIEN_Pos (3) /*!< TIMER_T::PWMINTEN0: CMPDIEN Position */ +#define TIMER_PWMINTEN0_CMPDIEN_Msk (0x1ul << TIMER_PWMINTEN0_CMPDIEN_Pos) /*!< TIMER_T::PWMINTEN0: CMPDIEN Mask */ + +#define TIMER_PWMINTEN1_BRKEIEN_Pos (0) /*!< TIMER_T::PWMINTEN1: BRKEIEN Position */ +#define TIMER_PWMINTEN1_BRKEIEN_Msk (0x1ul << TIMER_PWMINTEN1_BRKEIEN_Pos) /*!< TIMER_T::PWMINTEN1: BRKEIEN Mask */ + +#define TIMER_PWMINTEN1_BRKLIEN_Pos (8) /*!< TIMER_T::PWMINTEN1: BRKLIEN Position */ +#define TIMER_PWMINTEN1_BRKLIEN_Msk (0x1ul << TIMER_PWMINTEN1_BRKLIEN_Pos) /*!< TIMER_T::PWMINTEN1: BRKLIEN Mask */ + +#define TIMER_PWMINTSTS0_ZIF_Pos (0) /*!< TIMER_T::PWMINTSTS0: ZIF Position */ +#define TIMER_PWMINTSTS0_ZIF_Msk (0x1ul << TIMER_PWMINTSTS0_ZIF_Pos) /*!< TIMER_T::PWMINTSTS0: ZIF Mask */ + +#define TIMER_PWMINTSTS0_PIF_Pos (1) /*!< TIMER_T::PWMINTSTS0: PIF Position */ +#define TIMER_PWMINTSTS0_PIF_Msk (0x1ul << TIMER_PWMINTSTS0_PIF_Pos) /*!< TIMER_T::PWMINTSTS0: PIF Mask */ + +#define TIMER_PWMINTSTS0_CMPUIF_Pos (2) /*!< TIMER_T::PWMINTSTS0: CMPUIF Position */ +#define TIMER_PWMINTSTS0_CMPUIF_Msk (0x1ul << TIMER_PWMINTSTS0_CMPUIF_Pos) /*!< TIMER_T::PWMINTSTS0: CMPUIF Mask */ + +#define TIMER_PWMINTSTS0_CMPDIF_Pos (3) /*!< TIMER_T::PWMINTSTS0: CMPDIF Position */ +#define TIMER_PWMINTSTS0_CMPDIF_Msk (0x1ul << TIMER_PWMINTSTS0_CMPDIF_Pos) /*!< TIMER_T::PWMINTSTS0: CMPDIF Mask */ + +#define TIMER_PWMINTSTS1_BRKEIF0_Pos (0) /*!< TIMER_T::PWMINTSTS1: BRKEIF0 Position */ +#define TIMER_PWMINTSTS1_BRKEIF0_Msk (0x1ul << TIMER_PWMINTSTS1_BRKEIF0_Pos) /*!< TIMER_T::PWMINTSTS1: BRKEIF0 Mask */ + +#define TIMER_PWMINTSTS1_BRKEIF1_Pos (1) /*!< TIMER_T::PWMINTSTS1: BRKEIF1 Position */ +#define TIMER_PWMINTSTS1_BRKEIF1_Msk (0x1ul << TIMER_PWMINTSTS1_BRKEIF1_Pos) /*!< TIMER_T::PWMINTSTS1: BRKEIF1 Mask */ + +#define TIMER_PWMINTSTS1_BRKLIF0_Pos (8) /*!< TIMER_T::PWMINTSTS1: BRKLIF0 Position */ +#define TIMER_PWMINTSTS1_BRKLIF0_Msk (0x1ul << TIMER_PWMINTSTS1_BRKLIF0_Pos) /*!< TIMER_T::PWMINTSTS1: BRKLIF0 Mask */ + +#define TIMER_PWMINTSTS1_BRKLIF1_Pos (9) /*!< TIMER_T::PWMINTSTS1: BRKLIF1 Position */ +#define TIMER_PWMINTSTS1_BRKLIF1_Msk (0x1ul << TIMER_PWMINTSTS1_BRKLIF1_Pos) /*!< TIMER_T::PWMINTSTS1: BRKLIF1 Mask */ + +#define TIMER_PWMINTSTS1_BRKESTS0_Pos (16) /*!< TIMER_T::PWMINTSTS1: BRKESTS0 Position */ +#define TIMER_PWMINTSTS1_BRKESTS0_Msk (0x1ul << TIMER_PWMINTSTS1_BRKESTS0_Pos) /*!< TIMER_T::PWMINTSTS1: BRKESTS0 Mask */ + +#define TIMER_PWMINTSTS1_BRKESTS1_Pos (17) /*!< TIMER_T::PWMINTSTS1: BRKESTS1 Position */ +#define TIMER_PWMINTSTS1_BRKESTS1_Msk (0x1ul << TIMER_PWMINTSTS1_BRKESTS1_Pos) /*!< TIMER_T::PWMINTSTS1: BRKESTS1 Mask */ + +#define TIMER_PWMINTSTS1_BRKLSTS0_Pos (24) /*!< TIMER_T::PWMINTSTS1: BRKLSTS0 Position */ +#define TIMER_PWMINTSTS1_BRKLSTS0_Msk (0x1ul << TIMER_PWMINTSTS1_BRKLSTS0_Pos) /*!< TIMER_T::PWMINTSTS1: BRKLSTS0 Mask */ + +#define TIMER_PWMINTSTS1_BRKLSTS1_Pos (25) /*!< TIMER_T::PWMINTSTS1: BRKLSTS1 Position */ +#define TIMER_PWMINTSTS1_BRKLSTS1_Msk (0x1ul << TIMER_PWMINTSTS1_BRKLSTS1_Pos) /*!< TIMER_T::PWMINTSTS1: BRKLSTS1 Mask */ + +#define TIMER_PWMEADCTS_TRGSEL_Pos (0) /*!< TIMER_T::PWMEADCTS: TRGSEL Position */ +#define TIMER_PWMEADCTS_TRGSEL_Msk (0x7ul << TIMER_PWMEADCTS_TRGSEL_Pos) /*!< TIMER_T::PWMEADCTS: TRGSEL Mask */ + +#define TIMER_PWMEADCTS_TRGEN_Pos (7) /*!< TIMER_T::PWMEADCTS: TRGEN Position */ +#define TIMER_PWMEADCTS_TRGEN_Msk (0x1ul << TIMER_PWMEADCTS_TRGEN_Pos) /*!< TIMER_T::PWMEADCTS: TRGEN Mask */ + +#define TIMER_PWMSCTL_SYNCMODE_Pos (0) /*!< TIMER_T::PWMSCTL: SYNCMODE Position */ +#define TIMER_PWMSCTL_SYNCMODE_Msk (0x3ul << TIMER_PWMSCTL_SYNCMODE_Pos) /*!< TIMER_T::PWMSCTL: SYNCMODE Mask */ + +#define TIMER_PWMSCTL_SYNCSRC_Pos (8) /*!< TIMER_T::PWMSCTL: SYNCSRC Position */ +#define TIMER_PWMSCTL_SYNCSRC_Msk (0x7ul << TIMER_PWMSCTL_SYNCSRC_Pos) /*!< TIMER_T::PWMSCTL: SYNCSRC Mask */ + +#define TIMER_PWMSTRG_STRGEN_Pos (0) /*!< TIMER_T::PWMSTRG: STRGEN Position */ +#define TIMER_PWMSTRG_STRGEN_Msk (0x1ul << TIMER_PWMSTRG_STRGEN_Pos) /*!< TIMER_T::PWMSTRG: STRGEN Mask */ + +#define TIMER_PWMSTATUS_CNTMAXF_Pos (0) /*!< TIMER_T::PWMSTATUS: CNTMAXF Position */ +#define TIMER_PWMSTATUS_CNTMAXF_Msk (0x1ul << TIMER_PWMSTATUS_CNTMAXF_Pos) /*!< TIMER_T::PWMSTATUS: CNTMAXF Mask */ + +#define TIMER_PWMSTATUS_EADCTRGF_Pos (16) /*!< TIMER_T::PWMSTATUS: EADCTRGF Position */ +#define TIMER_PWMSTATUS_EADCTRGF_Msk (0x1ul << TIMER_PWMSTATUS_EADCTRGF_Pos) /*!< TIMER_T::PWMSTATUS: EADCTRGF Mask */ + +#define TIMER_PWMPBUF_PBUF_Pos (0) /*!< TIMER_T::PWMPBUF: PBUF Position */ +#define TIMER_PWMPBUF_PBUF_Msk (0xfffful << TIMER_PWMPBUF_PBUF_Pos) /*!< TIMER_T::PWMPBUF: PBUF Mask */ + +#define TIMER_PWMCMPBUF_CMPBUF_Pos (0) /*!< TIMER_T::PWMCMPBUF: CMPBUF Position */ +#define TIMER_PWMCMPBUF_CMPBUF_Msk (0xfffful << TIMER_PWMCMPBUF_CMPBUF_Pos) /*!< TIMER_T::PWMCMPBUF: CMPBUF Mask */ + +/**@}*/ /* TIMER_CONST */ +/**@}*/ /* end of TIMER register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __TIMER_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/trng_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/trng_reg.h new file mode 100644 index 0000000000..64ed957e56 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/trng_reg.h @@ -0,0 +1,922 @@ +/**************************************************************************//** + * @file trng_reg.h + * @brief True Random Number Generator register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __TRNG_REG_H__ +#define __TRNG_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/*---------------------- True Random Number Generator -------------------------*/ +/** + @addtogroup TRNG True Random Number Generator(TRNG) + Memory Mapped Structure for TRNG Controller +@{ */ + +typedef struct +{ + /** + * @var TRNG_T::CTL + * Offset: 0x00 The CTRL register is used to cause the TRNG NIST to execute one of a number of actions. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |CMD |Execute a Command + * | | |Enumerated values not listed are 'reserved'. + * | | |0000 = (NOP): Execute a NOP. + * | | |0001 = (GEN_NOISE): Generate full-entropy seed from noise. + * | | |0010 = (GEN_NONCE): Generate seed from host-written nonce. + * | | |0011 = (CREATE_STATE): Move DRBG to create state. + * | | |0100 = (RENEW_STATE): Move DRBG to renew state. + * | | |0101 = (REFRESH_ADDIN): Move DRBG to refresh addin. + * | | |0110 = (GEN_RANDOM): Generate a random number. + * | | |0111 = (ADVANCE_STATE): Advance DRBG state. + * | | |1000 = (RUN_KAT): Run KAT on DRBG or entropy source. + * | | |1111 = (ZEROIZE): Zeroize. + * @var TRNG_T::MODE + * Offset: 0x04 The MODE register is used to enable or disable certain run-time features within the TRNG NIST. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SEC_ALG |Select Security Strength in DRBG + * | | |0 = (SEC_128): AES-128. + * | | |1 = (SEC_256): AES-256. + * |[3] |PRED_RESIST|Prediction Resistance + * | | |0 = (PRED_DISABLE): Prediction resistance is not required. + * | | |1 = (PRED_ENABLED): Prediction resistance is required. + * |[4] |ADDIN_PRESENT|Availability of the Additional Input + * | | |0 = (ADDIN_NOT_REQ): No Additional Input required from host. + * | | |1 = (ADDIN_REQ): Additional input must be provided by host. + * |[6:5] |KAT_VEC |Select Test Vectors for Known-answer Test + * | | |00 = (KAT_VEC0): KAT vector 0. + * | | |01 = (KAT_VEC1): KAT vector 1. + * | | |10 = (KAT_VEC2): KAT vector 2. + * | | |11 = (KAT_ALL): Run all 3 KAT vectors. + * |[8:7] |KAT_SEL |Select Test Component for Known-answer Test + * | | |00 = (KAT_DRBG): KAT on DRBG. + * | | |01 = (KAT_DF): KAT on conditioning component (Derivation Function). + * | | |10 = (KAT_BOTH): KAT on both DRBG and DF. + * | | |11 = Reserved. + * @var TRNG_T::SMODE + * Offset: 0x08 The SMODE register is used to enable or disable certain MISSION mode run-time features. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |NONCE |Set the Core in Nonce Seeding Mode + * | | |0 = (NONCE_DISABLED): Disable nonce mode. + * | | |1 = (NONCE_ENABLED): Enable nonce mode. + * |[1] |MISSION_MODE|Operating Mode + * | | |0 = (RST_TEST_MODE): test mode. + * | | |1 = (RST_MISSION_MODE): mission mode. + * | | |Note: Any change to the state of this field (1 to 0 or 0 to 1) causes the TRNG NIST to zeroize itself. + * |[9:2] |MAX_REJECTS|Maximum Number of Consecutive Bit Rejections Before Issuing Ring Tweak + * | | |Default is to 10 (0xa). + * |[23:16] |INDIV_HT_DISABLE|Statistical Health Tests Individually + * | | |0 = Disable. + * | | |1 = Enable. + * | | |INDIV_HT_DISABLE[0] = Repetition Count test on raw entropy. + * | | |INDIV_HT_DISABLE[1] = Adaptive Proportion test on raw entropy. + * | | |INDIV_HT_DISABLE[2] = Monobit test on raw entropy. + * | | |INDIV_HT_DISABLE[3] = Poker test on raw entropy. + * | | |INDIV_HT_DISABLE[4] = Run test on raw entropy. + * | | |INDIV_HT_DISABLE[5] = Long Run test on raw entropy. + * | | |INDIV_HT_DISABLE[6] = Auto-correlation test on raw entropy. + * | | |INDIV_HT_DISABLE[7] = Repetition Count test on entropy source output. + * | | |Note: Users only can enable/disable statistical health test in TEST mode + * | | |This field cannot change in MISSION mode and its value is always 0 in MISSION mode. + * |[31] |NOISE_COLLECT|Raw Noise Collection Mode + * | | |0 = Disable. + * | | |1 = Enable. + * | | |Note: Users only can enable/disable raw noise collection in TEST mode + * | | |This bit cannot be set to 1 in MISSION mode. + * @var TRNG_T::STAT + * Offset: 0x0C The STAT register allows the user to monitor the internal status of the TRNG NIST. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |LAST_CMD |Last Command + * | | |0000 = (NOP). + * | | |0001 = (GEN_NOISE). + * | | |0011 = (GEN_NONCE). + * | | |0011 = (CREATE_STATE). + * | | |0100 = (RENEW_STATE). + * | | |0101 = (REFRESH_ADDIN). + * | | |0110 = (GEN_RANDOM). + * | | |0111 = (ADVANCE_STATE). + * | | |1000 = (RUN_KAT). + * | | |1111 = (ZEROIZE). + * | | |Others = Reserved. + * |[4] |SEC_ALG |Reflects State of MODE.SEC_ALG + * | | |0 = (SEC_ALG_0): Maximum security strength set to 128. + * | | |1 =(SEC_ALG_1): Maximum security strength set to 256. + * |[5] |NONCE_MODE|Reflects State of SMODE.NONCE + * | | |0 = (NONCE_DISABLE): Nonce mode disabled. + * | | |1 = (NONCE_ENABLE): Nonce mode enabled (allows CTRL.CMD value of 2). + * |[6] |MISSION_MODE|Reflects State of SMODE.MISSION_MODE + * | | |0 = (SEC_MODE_MISSION): Core is in TEST mode. + * | | |1 = (SEC_MODE_TEST): Core is in MISSION mode. + * |[8:7] |DRBG_STATE|Reflects How a DRBG State Is Instantiated + * | | |00 = (DRBG_NOT_INIT): State is not instantiated. + * | | |01 = (DRBG_NS): State is instantiated using the built-in noise source. + * | | |10 = (DRBG_HOST): State is instantiated using the host-provided nonce. + * | | |11 = Reserved. + * |[9] |STARTUP_TEST_STUCK|Indicates Whether the Startup Test Is Stuck + * | | |0 = (STARTUP_TEST_NOT_STUCK): Startup test is not stuck (yet). + * | | |1 = (STARTUP_TEST_IS_STUCK): Startup test is highly likely stuck. + * | | |Note: Only valid when sticky startup test feature Is enabled. + * |[10] |STARTUP_TEST_IN_PROG|Indicates Whether the Startup Test Is in Progress + * | | |0 = (STARTUP_TEST_NOT_STUCK): Startup test is finished. + * | | |1 = (STARTUP_TEST_IS_STUCK): Startup test is in progress. + * |[31] |BUSY |State of the Core + * | | |0 = (BUSY_NOT): Idle. + * | | |1 = (BUSY_EXEC): Currently executing a command. + * @var TRNG_T::IE + * Offset: 0x10 The IE register is used to enable or disable interrupts within the TRNG NIST. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ZEROIZED |Include or Exclude ZEROIZED Interrupt Contribution + * | | |0 = (ZEROIZED_DIS): Disable ZEROIZED interrupt contribution. + * | | |1 = (ZEROIZED_EN): Enable ZEROIZED interrupt contribution. + * |[1] |KAT_COMPLETED|Include or Exclude KAT_COMPLETED Interrupt Contribution + * | | |0 = (KAT_COMPLETED_DIS): Disable KAT_COMPLETED interrupt contribution. + * | | |1 = (KAT_COMPLETED_EN): Enable KAT_COMPLETED interrupt contribution. + * |[2] |NOISE_RDY |Include or Exclude NOISE_RDY Interrupt Contribution + * | | |0 = (NOISE_RDY_DIS): Disable NOISE_RDY interrupt contribution. + * | | |1 = (NOISE_RDY_EN): Enable NOISE_RDY interrupt contribution. + * |[3] |ALARMS |Include or Exclude ALARMS Interrupt Contribution + * | | |0 = (ALARMS_DIS): Disable ALARMS interrupt contribution. + * | | |1 = (ALARMS_EN): Enable ALARMS interrupt contribution. + * |[4] |DONE |Include or Exclude DONE Interrupt Contribution + * | | |0 = (DONE_DIS): Disable DONE interrupt contribution. + * | | |1 = (DONE_EN): Enable DONE interrupt contribution. + * |[31] |GLBL |Global Interrupt Enable Signal for the TRNG NIST + * | | |0 = (GLBL_DIS): Disable GLBL interrupt contribution. + * | | |1 = (GLBL_EN): Enable GLBL interrupt contribution. + * @var TRNG_T::ISTAT + * Offset: 0x14 The ISTAT register allows the user to monitor the interrupt contributions of the TRNG NIST. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ZEROIZED |ZEROIZED Flag + * | | |Indicates the Completion of the ZEROIZE Operation + * | | |0 = (ZEROIZED_R0): R0: No unacknowledged ZEROIZED. + * | | | (ZEROIZED_W0): W0: NOP. + * | | |1 = (ZEROIZED_R1): R1: Unacknowledged ZEROIZED. + * | | | (ZEROIZED_W1): W1: Clear ZEROIZED flag. + * |[1] |KAT_COMPLETED|KAT_COMPLETED Flag + * | | |Indicates the Completion of the RUN_KAT Command + * | | |0 = (KAT_COMPLETED_R0): R0: No unacknowledged KAT_COMPLETED. + * | | | (KAT_COMPLETED_W0): W0: NOP. + * | | |1 = (KAT_COMPLETED_R1): R1: Unacknowledged KAT_COMPLETED. + * | | | (KAT_COMPLETED_W1): W1: Clear KAT_COMPLETED flag. + * |[2] |NOISE_RDY |NOISE_RDY Flag + * | | |When TRNG NIST is generating a full-entropy seed in the self-seeding mode, MISSION_MODE(TRNG_SMODE[1]) is 0 (TEST mode) and SMODE.NOISE_COLLECT is set to 1, the NOISE_RDY bit informs the user when 512 bits of noise have been generated + * | | |This interrupt never happens in the MISSION mode of operation. + * | | |0 = (NOISE_RDY_R0): R0: No unacknowledged noise generation completion. + * | | | (NOISE_RDY_W0): W0: NOP. + * | | |1 = (NOISE_RDY_R1): R1: Unacknowledged noise generation completion. + * | | | (NOISE_RDY_W1): W1: Clear NOISE_RDY flag. + * |[3] |ALARMS |ALARMS Flag + * | | |The ALARMS bit allows the user to poll failures + * | | |When an alarm occurs, an automatic zeroize happens + * | | |Clearing this interrupt also clears the O_alarm pin. + * | | |0 = (ALARMS_R0): R0: No unacknowledged ALARMS. + * | | | (ALARMS_W0): W0: NOP. + * | | |1 = (ALARMS_R1): R1: Unacknowledged ALARMS. + * | | | (ALARMS_W1): W1: Clear ALARMS flag. + * |[4] |DONE |DONE Flag + * | | |The DONE bit allows the user to poll the completion of all commands except RUN_KAT and ZEROIZE which have their own interrupt. + * | | |0 = (DONE_R0): R0: No unacknowledged command completion. + * | | | (DONE_W0): W0: NOP. + * | | |1 = (DONE_R1): R1: Unacknowledged command completion. + * | | | (DONE_W1): W1: Clear DONE flag. + * @var TRNG_T::ALARMS + * Offset: 0x18 The ALARMS register allows the user to monitor the source of critical alarms. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |FAILED_TEST_ID|FAILED_TEST_ID Error Flag + * | | |When an alarm is issued, the FAILED_TEST_ID field shows which test has failed + * | | |This fields only shows the first detected failed test and it should not be assumed that the remaining statistical tests are passed. + * | | |0000 = (FAILED_TEST_ID_0): no failure. + * | | |0001 = (FAILED_TEST_ID_1): failure in both KAT and statistical tests. + * | | |0010 = (FAILED_TEST_ID_2): KAT test failure. + * | | |0011 = (FAILED_TEST_ID_3): Monobit test failure. + * | | |0100 = (FAILED_TEST_ID_4): Run test failure. + * | | |0101 = (FAILED_TEST_ID_5): Long Run test failure. + * | | |0110 = (FAILED_TEST_ID_6): Auto-correlation test failure. + * | | |0111 = (FAILED_TEST_ID_7): Poker test failure. + * | | |1000 = (FAILED_TEST_ID_8): Repetition Count test failure. + * | | |1001 = (FAILED_TEST_ID_9): Adaptive Proportion test failure. + * | | |Others = Reserved. + * |[4] |ILLEGAL_CMD_SEQ|ILLEGAL_CMD_SEQ Error Flag + * | | |The ILLEGAL_CMD_SEQ field indicates that the SOFTWARE Driver has executed an illegal command sequence. + * | | |0 = (ILLEGAL_CMD_SEQ _0): no failure. + * | | |1 = (ILLEGAL_CMD_SEQ _1): Executed an illegal command sequence. + * |[5] |FAILED_SEED_ST_HT|FAILED_SEED_ST_HT Error Flag + * | | |The FAILED_SEED_ST_HT field indicates that the statistical tests applied on the entropy source output is failed (Only valid when entropy source output statistical health test feature is included). + * | | |0 = (FAILED_SEED_ST_HT_0): no failure. + * | | |1 = (FAILED_SEED_ST_HT_1): Entropy source health test is failed. + * @var TRNG_T::COREKIT_REL + * Offset: 0x1C Contains the static coreKit release information. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |REL_NUM |The CoreKit Release Version In Pseudo-BCD + * | | |For example, release '2.35e-lca04' is encoded as 0x235e. + * | | |This TRNG version is 0x300a. + * |[23:16] |EXT_VER |The CoreKit Release Extension Version Number + * | | |For example, release '2.35e-lp04' is encoded as 0x4. + * | | |GA releases has a value of 0. + * |[31:28] |EXT_ENUM |The CoreKit Release Extension Type + * | | |For example, release '2.35e-lca04' is encoded as 0x1. + * | | |0000 = (EXT_ENUM_GA): GA release. + * | | |0001 = (EXT_ENUM_LCA): LCA release. + * | | |0010 = (EXT_ENUM_EA): EA release. + * | | |0011 = (EXT_ENUM_LP): LP release. + * | | |0100 = (EXT_ENUM_LPC): LPC release. + * | | |0101 = (EXT_ENUM_SOW): SOW release. + * | | |Others = Reserved. + * @var TRNG_T::FEATURES + * Offset: 0x20 The FEATURES register returns the state of various build-time parameter values. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SECURE_RST_STATE|The Core Resets to MISSION or TEST Mode + * | | |0 = test mode. + * | | |1 = mission mode. + * |[3:1] |DIAG_LEVEL_ST_HLT|Level Of Diagnostic Circuitry For The Health Test + * |[6:4] |DIAG_LEVEL_CLP800|Level Of Diagnostic Circuitry For TRNG When Noise Source + * |[7] |DIAG_LEVEL_NS|Level Of Diagnostic Circuitry For Noise Source Output Registers + * |[8] |PS_PRESENT|The NPA_DATAx Registers Is used As A Personalization String During The Create_State Command + * | | |0 = No. + * | | |1 = Yes. + * |[9] |AES_256 |The Instantiated AES + * | | |0 = AES-128. + * | | |1 = AES-256. + * @var TRNG_T::RAND0 + * Offset: 0x24 The RAND0 register is used by the host to read bits [31:0] of the newly generated 128-bit random data. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |RAND |Random Data Word + * @var TRNG_T::RAND1 + * Offset: 0x28 The RAND1 register is used by the host to read bits [63:32] of the newly generated 128-bit random data. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |RAND |Random Data Word + * @var TRNG_T::RAND2 + * Offset: 0x2C The RAND2 register is used by the host to read bits [95:64] of the newly generated 128-bit random data. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |RAND |Random Data Word + * @var TRNG_T::RAND3 + * Offset: 0x30 The RAND3 register is used by the host to read bits [127:96] of the newly generated 128-bit random data. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |RAND |Random Data Word + * @var TRNG_T::NPA_DATA0 + * Offset: 0x34 The NPA_DATA0 register holds Noise/Nonce/Personalization String/Additional Input - bits [31:0]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA1 + * Offset: 0x38 The NPA_DATA1 register holds Noise/Nonce/Personalization String/Additional Input - bits [63:32]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA2 + * Offset: 0x3C The NPA_DATA2 register holds Noise/Nonce/Personalization String/Additional Input - bits [95:64]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA3 + * Offset: 0x40 The NPA_DATA3 register holds Noise/Nonce/Personalization String/Additional Input - bits [127:96]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA4 + * Offset: 0x44 The NPA_DATA4 register holds Noise/Nonce/Personalization String/Additional Input - bits [159:128]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA5 + * Offset: 0x48 The NPA_DATA5 register holds Noise/Nonce/Personalization String/Additional Input - bits [191:160]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA6 + * Offset: 0x4C The NPA_DATA6 register holds Noise/Nonce/Personalization String/Additional Input - bits [223:192]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA7 + * Offset: 0x50 The NPA_DATA7 register holds Noise/Nonce/Personalization String/Additional Input - bits [255:224]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA8 + * Offset: 0x54 The NPA_DATA8 register holds Noise/Nonce/Personalization String/Additional Input - bits [287:256]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA9 + * Offset: 0x58 The NPA_DATA9 register holds Noise/Nonce/Personalization String/Additional Input - bits [319:288]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA10 + * Offset: 0x5C The NPA_DATA10 register holds Noise/Nonce/Personalization String/Additional Input - bits [351:320]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA11 + * Offset: 0x60 The NPA_DATA11 register holds Noise/Nonce/Personalization String/Additional Input - bits [383:352]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA12 + * Offset: 0x64 The NPA_DATA12 register holds Noise/Nonce - bits [415:384]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA13 + * Offset: 0x68 The NPA_DATA13 register holds Noise/Nonce - bits [447:416]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA14 + * Offset: 0x6C The NPA_DATA14 register holds Noise/Nonce - bits [479:448]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::NPA_DATA15 + * Offset: 0x70 The NPA_DATA15 register holds Noise/Nonce - bits [511:480]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |NPA_DATA |NPA data word + * | | |Noise/Nonce can be stored in register NPA_DATA0 ~ NPA_DATA15. + * | | |Personalization String/Additional Input can be stored in register NPA_DATA0 ~ NPA_DATA11. + * @var TRNG_T::SEED0 + * Offset: 0x74 The SEED0 register holds seed value used in the DRBG - bits [31:0]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |SEED data word + * @var TRNG_T::SEED1 + * Offset: 0x78 The SEED1 register holds seed value used in the DRBG - bits [63:32]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |SEED data word + * @var TRNG_T::SEED2 + * Offset: 0x7C The SEED2 register holds seed value used in the DRBG - bits [95:64]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |SEED data word + * @var TRNG_T::SEED3 + * Offset: 0x80 The SEED3 register holds seed value used in the DRBG - bits [127:96]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |SEED data word + * @var TRNG_T::SEED4 + * Offset: 0x84 The SEED4 register holds seed value used in the DRBG - bits [159:128]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |SEED data word + * @var TRNG_T::SEED5 + * Offset: 0x88 The SEED5 register holds seed value used in the DRBG - bits [191:160]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |SEED data word + * @var TRNG_T::SEED6 + * Offset: 0x8C The SEED6 register holds seed value used in the DRBG - bits [223:192]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |SEED data word + * @var TRNG_T::SEED7 + * Offset: 0x90 The SEED7 register holds seed value used in the DRBG - bits [255:224]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |SEED data word + * @var TRNG_T::SEED8 + * Offset: 0x94 The SEED8 register holds seed value used in the DRBG - bits [287:256]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |SEED data word + * @var TRNG_T::SEED9 + * Offset: 0x98 The SEED9 register holds seed value used in the DRBG - bits [319:288]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |SEED data word + * @var TRNG_T::SEED10 + * Offset: 0x9C The SEED10 register holds seed value used in the DRBG - bits [351:320]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |SEED data word + * @var TRNG_T::SEED11 + * Offset: 0xA0 The SEED11 register holds seed value used in the DRBG - bits [383:352]. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |SEED |SEED data word + * @var TRNG_T::TIME_TO_SEED + * Offset: 0xD0 The Time-to-Seed (TTS) register records the number of clock cycles taken to collect the set of raw noise bits used by the previous GEN_NOISE command. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |TTS |TRNG Time To Seed Shows the number of system clock cycles taken to generate raw noise for the last GEN_NOISE command. + * @var TRNG_T::BUILD_CFG0 + * Offset: 0xF0 Contains build-time TRNG NIST parameter settings. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |CORE_TYPE |Core Type + * | | |00 = (CORE_TYPE_BASE_TRNG): TRNG. + * | | |01 = (CORE_TYPE_BASE_TRNG_WITH_ESM_NONCE): TRNG with ESM nonce I/O. + * | | |10 = (CORE_TYPE_NIST_TRNG): TRNG NIST. + * | | |11 = (CORE_TYPE_NIST_TRNG_WITH_EDU): TRNG NIST with EDU. + * |[7] |BG8 |Indicates Number Of Bit Generators Present + * | | |0 = (SIX_BGS): 6 Bit Generators present. + * | | |1 = (EIGHT_BGS): 8 Bit Generators present.. + * |[9:8] |CDC_SYNC_DEPTH|Depth Of The CDC Resynchronizer Chains + * | | |00 = (CDC_RESYNC_4): CDC resynchronizer depth 4. + * | | |01 = Reserved. + * | | |10 = (CDC_RESYNC_2): CDC resynchronizer depth 2. + * | | |11 = (CDC_RESYNC_3): CDC resynchronizer depth 3. + * |[10] |BACKGROUND_NOISE|Indicates Background Noise Collection Is Present + * | | |0 = (BACKGROUND_NOISE _NOT_PRESENT): not present. + * | | |1 = (BACKGROUND_NOISE_PRESENT): present.. + * |[11] |EDU_PRESENT|Indicates EDU Is Present + * | | |0 = (EDU_PRESENT_NOT_PRESENT): not present. + * | | |1 = (EDU_PRESENT_PRESENT): present.. + * |[12] |AES_DATAPATH|AES Datapath Width + * | | |0 = (AES_DATAPATH_32): 32-bit datapath. + * | | |1 = (AES_DATAPATH_128): 128-bit datapath. + * |[13] |AES_MAX_KEY_SIZE|AES Max Key Size + * | | |0 = (AES_MAX_KEY_SIZE_128): 128-bit key. + * | | |1 = (AES_MAX_KEY_SIZE_256): 256-bit key. + * |[14] |PERSONALIZATION_STR|Personalization String Used + * | | |0 = (PS_NOT_PRESENT): not present. + * | | |1 = (PS_PRESENT): present. + * @var TRNG_T::BUILD_CFG1 + * Offset: 0xF4 Contains additional build-time TRNG NIST parameter settings. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |NUM_RAW_NOISE_BLKS|Number of Raw Noise Blocks Used for Start-up Test + * |[8] |STICKY_STARTUP|Sticky-startup Test Present + * | | |0 = (STICKY_STARTUP_TEST_NOT_PRESENT): not present. + * | | |1 = (STICKY_STARTUP_TEST_PRESENT): present. + * |[12] |AUTO_CORRELATION_TEST|Auto-correlation Test Present + * | | |0 = (AUTO_CORRELATION_TEST_NOT_PRESENT): not present. + * | | |1 = (AUTO_CORRELATION_TEST_PRESENT): present. + * |[13] |MONOBIT_TEST|Monobit Test Present + * | | |0 = (MONOBIT_TEST_NOT_PRESENT): not present. + * | | |1 = (MONOBIT_TEST_PRESENT): present. + * |[14] |RUN_TEST |Run Test Present + * | | |0 = (RUN_TEST_NOT_PRESENT): not present. + * | | |1 = (RUN_TEST_PRESENT): present. + * |[15] |POKER_TEST|Poker Test Present + * | | |0 = (POKER_TEST_NOT_PRESENT): not present. + * | | |1 = (POKER_TEST_PRESENT): present. + * |[18:16] |RAW_HT_ADAP_TEST|Raw Health Adaptive Proportion Test + * | | |000 = (RAW_HT_ADAP_TEST_NOT_PRESENT): not present. + * | | |001 = (RAW_HT_ADAP_TEST_1K_SAMPLES): 1k samples per window. + * | | |010 = (RAW_HT_ADAP_TEST_2K_SAMPLES): 2k samples per window. + * | | |011 = (RAW_HT_ADAP_TEST_4K_SAMPLES): 4k samples per window. + * | | |100 = (RAW_HT_ADAP_TEST_8K_SAMPLES): 8k samples per window. + * | | |101 = (RAW_HT_ADAP_TEST_16K_SAMPLES): 16k samples per window. + * | | |110 = (RAW_HT_ADAP_TEST_32K_SAMPLES): 32k samples per window. + * | | |111 = (RAW_HT_ADAP_TEST_64K_SAMPLES): 64k samples per window. + * |[19] |RAW_HT_REP_TEST|Raw Health Repetition Test Present + * | | |0 = (RAW_HT_REP_TEST_NOT_PRESENT): not present. + * | | |1 = (RAW_HT_REP_TEST_PRESENT): present. + * |[22:20] |ENT_SRC_REP_SMPL_SIZE|Entropy Source: Sample Size + * | | |000 = (ENT_SRC_REP_SMPL_SIZE_1): Sample size 1. + * | | |001 = (ENT_SRC_REP_SMPL_SIZE_2): Sample size 2. + * | | |010 = (ENT_SRC_REP_SMPL_SIZE_4): Sample size 4. + * | | |011 = (ENT_SRC_REP_SMPL_SIZE_8): Sample size 8. + * | | |100 = (ENT_SRC_REP_SMPL_SIZE_16): Sample size 16. + * | | |101 = (ENT_SRC_REP_SMPL_SIZE_32): Sample size 32. + * | | |110 = (ENT_SRC_REP_SMPL_SIZE_64): Sample size 64. + * | | |111 = (ENT_SRC_REP_SMPL_SIZE_128): Sample size 128. + * |[23] |ENT_SRC_REP_TEST|Entropy Source Repetition Test Present + * | | |0 = (ENT_SRC_REP_TEST_NOT_PRESENT): not present. + * | | |1 = (ENT_SRC_REP_TEST_PRESENT): present. + * |[30:24] |ENT_SRC_REP_MIN_ENTROPY|Entropy Source Repetition Minimum Entropy Per Bit + */ + __O uint32_t CTL; /*!< [0x0000] The CTRL register is used to cause the TRNG NIST to execute one of a number of actions. */ + __IO uint32_t MODE; /*!< [0x0004] The MODE register is used to enable or disable certain run-time features within the TRNG NIST. */ + __IO uint32_t SMODE; /*!< [0x0008] The SMODE register is used to enable or disable certain MISSION mode run-time features. */ + __I uint32_t STAT; /*!< [0x000c] The STAT register allows the user to monitor the internal status of the TRNG NIST. */ + __IO uint32_t IE; /*!< [0x0010] The IE register is used to enable or disable interrupts within the TRNG NIST. */ + __IO uint32_t ISTAT; /*!< [0x0014] The ISTAT register allows the user to monitor the interrupt contributions of the TRNG NIST. */ + __IO uint32_t ALARMS; /*!< [0x0018] The ALARMS register allows the user to monitor the source of critical alarms. */ + __I uint32_t COREKIT_REL; /*!< [0x001c] Contains the static coreKit release information. */ + __I uint32_t FEATURES; /*!< [0x0020] The FEATURES register returns the state of various build-time parameter values. */ + __I uint32_t RAND0; /*!< [0x0024] The RAND0 register is used by the host to read bits [31:0] of the newly generated 128-bit random data. */ + __I uint32_t RAND1; /*!< [0x0028] The RAND1 register is used by the host to read bits [63:32] of the newly generated 128-bit random data. */ + __I uint32_t RAND2; /*!< [0x002c] The RAND2 register is used by the host to read bits [95:64] of the newly generated 128-bit random data. */ + __I uint32_t RAND3; /*!< [0x0030] The RAND3 register is used by the host to read bits [127:96] of the newly generated 128-bit random data. */ + __IO uint32_t NPA_DATA0; /*!< [0x0034] The NPA_DATA0 register holds Noise/Nonce/Personalization String/Additional Input - bits [31:0]. */ + __IO uint32_t NPA_DATA1; /*!< [0x0038] The NPA_DATA1 register holds Noise/Nonce/Personalization String/Additional Input - bits [63:32]. */ + __IO uint32_t NPA_DATA2; /*!< [0x003c] The NPA_DATA2 register holds Noise/Nonce/Personalization String/Additional Input - bits [95:64]. */ + __IO uint32_t NPA_DATA3; /*!< [0x0040] The NPA_DATA3 register holds Noise/Nonce/Personalization String/Additional Input - bits [127:96]. */ + __IO uint32_t NPA_DATA4; /*!< [0x0044] The NPA_DATA4 register holds Noise/Nonce/Personalization String/Additional Input - bits [159:128]. */ + __IO uint32_t NPA_DATA5; /*!< [0x0048] The NPA_DATA5 register holds Noise/Nonce/Personalization String/Additional Input - bits [191:160]. */ + __IO uint32_t NPA_DATA6; /*!< [0x004c] The NPA_DATA6 register holds Noise/Nonce/Personalization String/Additional Input - bits [223:192]. */ + __IO uint32_t NPA_DATA7; /*!< [0x0050] The NPA_DATA7 register holds Noise/Nonce/Personalization String/Additional Input - bits [255:224]. */ + __IO uint32_t NPA_DATA8; /*!< [0x0054] The NPA_DATA8 register holds Noise/Nonce/Personalization String/Additional Input - bits [287:256]. */ + __IO uint32_t NPA_DATA9; /*!< [0x0058] The NPA_DATA9 register holds Noise/Nonce/Personalization String/Additional Input - bits [319:288]. */ + __IO uint32_t NPA_DATA10; /*!< [0x005c] The NPA_DATA10 register holds Noise/Nonce/Personalization String/Additional Input - bits [351:320]. */ + __IO uint32_t NPA_DATA11; /*!< [0x0060] The NPA_DATA11 register holds Noise/Nonce/Personalization String/Additional Input - bits [383:352]. */ + __IO uint32_t NPA_DATA12; /*!< [0x0064] The NPA_DATA12 register holds Noise/Nonce - bits [415:384]. */ + __IO uint32_t NPA_DATA13; /*!< [0x0068] The NPA_DATA13 register holds Noise/Nonce - bits [447:416]. */ + __IO uint32_t NPA_DATA14; /*!< [0x006c] The NPA_DATA14 register holds Noise/Nonce - bits [479:448]. */ + __IO uint32_t NPA_DATA15; /*!< [0x0070] The NPA_DATA15 register holds Noise/Nonce - bits [511:480]. */ + __IO uint32_t SEED0; /*!< [0x0074] The SEED0 register holds seed value used in the DRBG - bits [31:0]. */ + __IO uint32_t SEED1; /*!< [0x0078] The SEED1 register holds seed value used in the DRBG - bits [63:32]. */ + __IO uint32_t SEED2; /*!< [0x007c] The SEED2 register holds seed value used in the DRBG - bits [95:64]. */ + __IO uint32_t SEED3; /*!< [0x0080] The SEED3 register holds seed value used in the DRBG - bits [127:96]. */ + __IO uint32_t SEED4; /*!< [0x0084] The SEED4 register holds seed value used in the DRBG - bits [159:128]. */ + __IO uint32_t SEED5; /*!< [0x0088] The SEED5 register holds seed value used in the DRBG - bits [191:160]. */ + __IO uint32_t SEED6; /*!< [0x008c] The SEED6 register holds seed value used in the DRBG - bits [223:192]. */ + __IO uint32_t SEED7; /*!< [0x0090] The SEED7 register holds seed value used in the DRBG - bits [255:224]. */ + __IO uint32_t SEED8; /*!< [0x0094] The SEED8 register holds seed value used in the DRBG - bits [287:256]. */ + __IO uint32_t SEED9; /*!< [0x0098] The SEED9 register holds seed value used in the DRBG - bits [319:288]. */ + __IO uint32_t SEED10; /*!< [0x009c] The SEED10 register holds seed value used in the DRBG - bits [351:320]. */ + __IO uint32_t SEED11; /*!< [0x00a0] The SEED11 register holds seed value used in the DRBG - bits [383:352]. */ + __I uint32_t RESERVE0[11]; + __I uint32_t TIME_TO_SEED; /*!< [0x00d0] The Time-to-Seed (TTS) register records the number of clock cycles taken to collect the set of raw noise bits used by the previous GEN_NOISE command. */ + __I uint32_t RESERVE1[7]; + __I uint32_t BUILD_CFG0; /*!< [0x00f0] Contains build-time TRNG NIST parameter settings. */ + __I uint32_t BUILD_CFG1; /*!< [0x00f4] Contains additional build-time TRNG NIST parameter settings. */ + +} TRNG_T; + +/** + @addtogroup TRNG_CONST TRNG Bit Field Definition + Constant Definitions for TRNG Controller +@{ */ + +#define TRNG_CTL_CMD_Pos (0) /*!< TRNG_T::CTL: CMD Position */ +#define TRNG_CTL_CMD_Msk (0xful << TRNG_CTL_CMD_Pos) /*!< TRNG_T::CTL: CMD Mask */ + +#define TRNG_MODE_SEC_ALG_Pos (0) /*!< TRNG_T::MODE: SEC_ALG Position */ +#define TRNG_MODE_SEC_ALG_Msk (0x1ul << TRNG_MODE_SEC_ALG_Pos) /*!< TRNG_T::MODE: SEC_ALG Mask */ + +#define TRNG_MODE_PRED_RESIST_Pos (3) /*!< TRNG_T::MODE: PRED_RESIST Position */ +#define TRNG_MODE_PRED_RESIST_Msk (0x1ul << TRNG_MODE_PRED_RESIST_Pos) /*!< TRNG_T::MODE: PRED_RESIST Mask */ + +#define TRNG_MODE_ADDIN_PRESENT_Pos (4) /*!< TRNG_T::MODE: ADDIN_PRESENT Position */ +#define TRNG_MODE_ADDIN_PRESENT_Msk (0x1ul << TRNG_MODE_ADDIN_PRESENT_Pos) /*!< TRNG_T::MODE: ADDIN_PRESENT Mask */ + +#define TRNG_MODE_KAT_VEC_Pos (5) /*!< TRNG_T::MODE: KAT_VEC Position */ +#define TRNG_MODE_KAT_VEC_Msk (0x3ul << TRNG_MODE_KAT_VEC_Pos) /*!< TRNG_T::MODE: KAT_VEC Mask */ + +#define TRNG_MODE_KAT_SEL_Pos (7) /*!< TRNG_T::MODE: KAT_SEL Position */ +#define TRNG_MODE_KAT_SEL_Msk (0x3ul << TRNG_MODE_KAT_SEL_Pos) /*!< TRNG_T::MODE: KAT_SEL Mask */ + +#define TRNG_SMODE_NONCE_Pos (0) /*!< TRNG_T::SMODE: NONCE Position */ +#define TRNG_SMODE_NONCE_Msk (0x1ul << TRNG_SMODE_NONCE_Pos) /*!< TRNG_T::SMODE: NONCE Mask */ + +#define TRNG_SMODE_MISSION_MODE_Pos (1) /*!< TRNG_T::SMODE: MISSION_MODE Position */ +#define TRNG_SMODE_MISSION_MODE_Msk (0x1ul << TRNG_SMODE_MISSION_MODE_Pos) /*!< TRNG_T::SMODE: MISSION_MODE Mask */ + +#define TRNG_SMODE_MAX_REJECTS_Pos (2) /*!< TRNG_T::SMODE: MAX_REJECTS Position */ +#define TRNG_SMODE_MAX_REJECTS_Msk (0xfful << TRNG_SMODE_MAX_REJECTS_Pos) /*!< TRNG_T::SMODE: MAX_REJECTS Mask */ + +#define TRNG_SMODE_INDIV_HT_DISABLE_Pos (16) /*!< TRNG_T::SMODE: INDIV_HT_DISABLE Position*/ +#define TRNG_SMODE_INDIV_HT_DISABLE_Msk (0xfful << TRNG_SMODE_INDIV_HT_DISABLE_Pos) /*!< TRNG_T::SMODE: INDIV_HT_DISABLE Mask */ + +#define TRNG_SMODE_NOISE_COLLECT_Pos (31) /*!< TRNG_T::SMODE: NOISE_COLLECT Position */ +#define TRNG_SMODE_NOISE_COLLECT_Msk (0x1ul << TRNG_SMODE_NOISE_COLLECT_Pos) /*!< TRNG_T::SMODE: NOISE_COLLECT Mask */ + +#define TRNG_STAT_LAST_CMD_Pos (0) /*!< TRNG_T::STAT: LAST_CMD Position */ +#define TRNG_STAT_LAST_CMD_Msk (0xful << TRNG_STAT_LAST_CMD_Pos) /*!< TRNG_T::STAT: LAST_CMD Mask */ + +#define TRNG_STAT_SEC_ALG_Pos (4) /*!< TRNG_T::STAT: SEC_ALG Position */ +#define TRNG_STAT_SEC_ALG_Msk (0x1ul << TRNG_STAT_SEC_ALG_Pos) /*!< TRNG_T::STAT: SEC_ALG Mask */ + +#define TRNG_STAT_NONCE_MODE_Pos (5) /*!< TRNG_T::STAT: NONCE_MODE Position */ +#define TRNG_STAT_NONCE_MODE_Msk (0x1ul << TRNG_STAT_NONCE_MODE_Pos) /*!< TRNG_T::STAT: NONCE_MODE Mask */ + +#define TRNG_STAT_MISSION_MODE_Pos (6) /*!< TRNG_T::STAT: MISSION_MODE Position */ +#define TRNG_STAT_MISSION_MODE_Msk (0x1ul << TRNG_STAT_MISSION_MODE_Pos) /*!< TRNG_T::STAT: MISSION_MODE Mask */ + +#define TRNG_STAT_DRBG_STATE_Pos (7) /*!< TRNG_T::STAT: DRBG_STATE Position */ +#define TRNG_STAT_DRBG_STATE_Msk (0x3ul << TRNG_STAT_DRBG_STATE_Pos) /*!< TRNG_T::STAT: DRBG_STATE Mask */ + +#define TRNG_STAT_STARTUP_TEST_STUCK_Pos (9) /*!< TRNG_T::STAT: STARTUP_TEST_STUCK Position*/ +#define TRNG_STAT_STARTUP_TEST_STUCK_Msk (0x1ul << TRNG_STAT_STARTUP_TEST_STUCK_Pos) /*!< TRNG_T::STAT: STARTUP_TEST_STUCK Mask */ + +#define TRNG_STAT_STARTUP_TEST_IN_PROG_Pos (10) /*!< TRNG_T::STAT: STARTUP_TEST_IN_PROG Position*/ +#define TRNG_STAT_STARTUP_TEST_IN_PROG_Msk (0x1ul << TRNG_STAT_STARTUP_TEST_IN_PROG_Pos) /*!< TRNG_T::STAT: STARTUP_TEST_IN_PROG Mask*/ + +#define TRNG_STAT_BUSY_Pos (31) /*!< TRNG_T::STAT: BUSY Position */ +#define TRNG_STAT_BUSY_Msk (0x1ul << TRNG_STAT_BUSY_Pos) /*!< TRNG_T::STAT: BUSY Mask */ + +#define TRNG_IE_ZEROIZED_Pos (0) /*!< TRNG_T::IE: ZEROIZED Position */ +#define TRNG_IE_ZEROIZED_Msk (0x1ul << TRNG_IE_ZEROIZED_Pos) /*!< TRNG_T::IE: ZEROIZED Mask */ + +#define TRNG_IE_KAT_COMPLETED_Pos (1) /*!< TRNG_T::IE: KAT_COMPLETED Position */ +#define TRNG_IE_KAT_COMPLETED_Msk (0x1ul << TRNG_IE_KAT_COMPLETED_Pos) /*!< TRNG_T::IE: KAT_COMPLETED Mask */ + +#define TRNG_IE_NOISE_RDY_Pos (2) /*!< TRNG_T::IE: NOISE_RDY Position */ +#define TRNG_IE_NOISE_RDY_Msk (0x1ul << TRNG_IE_NOISE_RDY_Pos) /*!< TRNG_T::IE: NOISE_RDY Mask */ + +#define TRNG_IE_ALARMS_Pos (3) /*!< TRNG_T::IE: ALARMS Position */ +#define TRNG_IE_ALARMS_Msk (0x1ul << TRNG_IE_ALARMS_Pos) /*!< TRNG_T::IE: ALARMS Mask */ + +#define TRNG_IE_DONE_Pos (4) /*!< TRNG_T::IE: DONE Position */ +#define TRNG_IE_DONE_Msk (0x1ul << TRNG_IE_DONE_Pos) /*!< TRNG_T::IE: DONE Mask */ + +#define TRNG_IE_GLBL_Pos (31) /*!< TRNG_T::IE: GLBL Position */ +#define TRNG_IE_GLBL_Msk (0x1ul << TRNG_IE_GLBL_Pos) /*!< TRNG_T::IE: GLBL Mask */ + +#define TRNG_ISTAT_ZEROIZED_Pos (0) /*!< TRNG_T::ISTAT: ZEROIZED Position */ +#define TRNG_ISTAT_ZEROIZED_Msk (0x1ul << TRNG_ISTAT_ZEROIZED_Pos) /*!< TRNG_T::ISTAT: ZEROIZED Mask */ + +#define TRNG_ISTAT_KAT_COMPLETED_Pos (1) /*!< TRNG_T::ISTAT: KAT_COMPLETED Position */ +#define TRNG_ISTAT_KAT_COMPLETED_Msk (0x1ul << TRNG_ISTAT_KAT_COMPLETED_Pos) /*!< TRNG_T::ISTAT: KAT_COMPLETED Mask */ + +#define TRNG_ISTAT_NOISE_RDY_Pos (2) /*!< TRNG_T::ISTAT: NOISE_RDY Position */ +#define TRNG_ISTAT_NOISE_RDY_Msk (0x1ul << TRNG_ISTAT_NOISE_RDY_Pos) /*!< TRNG_T::ISTAT: NOISE_RDY Mask */ + +#define TRNG_ISTAT_ALARMS_Pos (3) /*!< TRNG_T::ISTAT: ALARMS Position */ +#define TRNG_ISTAT_ALARMS_Msk (0x1ul << TRNG_ISTAT_ALARMS_Pos) /*!< TRNG_T::ISTAT: ALARMS Mask */ + +#define TRNG_ISTAT_DONE_Pos (4) /*!< TRNG_T::ISTAT: DONE Position */ +#define TRNG_ISTAT_DONE_Msk (0x1ul << TRNG_ISTAT_DONE_Pos) /*!< TRNG_T::ISTAT: DONE Mask */ + +#define TRNG_ALARMS_FAILED_TEST_ID_Pos (0) /*!< TRNG_T::ALARMS: FAILED_TEST_ID Position*/ +#define TRNG_ALARMS_FAILED_TEST_ID_Msk (0xful << TRNG_ALARMS_FAILED_TEST_ID_Pos) /*!< TRNG_T::ALARMS: FAILED_TEST_ID Mask */ + +#define TRNG_ALARMS_ILLEGAL_CMD_SEQ_Pos (4) /*!< TRNG_T::ALARMS: ILLEGAL_CMD_SEQ Position*/ +#define TRNG_ALARMS_ILLEGAL_CMD_SEQ_Msk (0x1ul << TRNG_ALARMS_ILLEGAL_CMD_SEQ_Pos) /*!< TRNG_T::ALARMS: ILLEGAL_CMD_SEQ Mask */ + +#define TRNG_ALARMS_FAILED_SEED_ST_HT_Pos (5) /*!< TRNG_T::ALARMS: FAILED_SEED_ST_HT Position*/ +#define TRNG_ALARMS_FAILED_SEED_ST_HT_Msk (0x1ul << TRNG_ALARMS_FAILED_SEED_ST_HT_Pos) /*!< TRNG_T::ALARMS: FAILED_SEED_ST_HT Mask */ + +#define TRNG_COREKIT_REL_REL_NUM_Pos (0) /*!< TRNG_T::COREKIT_REL: REL_NUM Position */ +#define TRNG_COREKIT_REL_REL_NUM_Msk (0xfffful << TRNG_COREKIT_REL_REL_NUM_Pos) /*!< TRNG_T::COREKIT_REL: REL_NUM Mask */ + +#define TRNG_COREKIT_REL_EXT_VER_Pos (16) /*!< TRNG_T::COREKIT_REL: EXT_VER Position */ +#define TRNG_COREKIT_REL_EXT_VER_Msk (0xfful << TRNG_COREKIT_REL_EXT_VER_Pos) /*!< TRNG_T::COREKIT_REL: EXT_VER Mask */ + +#define TRNG_COREKIT_REL_EXT_ENUM_Pos (28) /*!< TRNG_T::COREKIT_REL: EXT_ENUM Position */ +#define TRNG_COREKIT_REL_EXT_ENUM_Msk (0xful << TRNG_COREKIT_REL_EXT_ENUM_Pos) /*!< TRNG_T::COREKIT_REL: EXT_ENUM Mask */ + +#define TRNG_FEATURES_SECURE_RST_STATE_Pos (0) /*!< TRNG_T::FEATURES: SECURE_RST_STATE Position*/ +#define TRNG_FEATURES_SECURE_RST_STATE_Msk (0x1ul << TRNG_FEATURES_SECURE_RST_STATE_Pos) /*!< TRNG_T::FEATURES: SECURE_RST_STATE Mask*/ + +#define TRNG_FEATURES_DIAG_LEVEL_ST_HLT_Pos (1) /*!< TRNG_T::FEATURES: DIAG_LEVEL_ST_HLT Position*/ +#define TRNG_FEATURES_DIAG_LEVEL_ST_HLT_Msk (0x7ul << TRNG_FEATURES_DIAG_LEVEL_ST_HLT_Pos) /*!< TRNG_T::FEATURES: DIAG_LEVEL_ST_HLT Mask*/ + +#define TRNG_FEATURES_DIAG_LEVEL_CLP800_Pos (4) /*!< TRNG_T::FEATURES: DIAG_LEVEL_CLP800 Position*/ +#define TRNG_FEATURES_DIAG_LEVEL_CLP800_Msk (0x7ul << TRNG_FEATURES_DIAG_LEVEL_CLP800_Pos) /*!< TRNG_T::FEATURES: DIAG_LEVEL_CLP800 Mask*/ + +#define TRNG_FEATURES_DIAG_LEVEL_NS_Pos (7) /*!< TRNG_T::FEATURES: DIAG_LEVEL_NS Position*/ +#define TRNG_FEATURES_DIAG_LEVEL_NS_Msk (0x1ul << TRNG_FEATURES_DIAG_LEVEL_NS_Pos) /*!< TRNG_T::FEATURES: DIAG_LEVEL_NS Mask */ + +#define TRNG_FEATURES_PS_PRESENT_Pos (8) /*!< TRNG_T::FEATURES: PS_PRESENT Position */ +#define TRNG_FEATURES_PS_PRESENT_Msk (0x1ul << TRNG_FEATURES_PS_PRESENT_Pos) /*!< TRNG_T::FEATURES: PS_PRESENT Mask */ + +#define TRNG_FEATURES_AES_256_Pos (9) /*!< TRNG_T::FEATURES: AES_256 Position */ +#define TRNG_FEATURES_AES_256_Msk (0x1ul << TRNG_FEATURES_AES_256_Pos) /*!< TRNG_T::FEATURES: AES_256 Mask */ + +#define TRNG_RAND0_RAND_Pos (0) /*!< TRNG_T::RAND0: RAND Position */ +#define TRNG_RAND0_RAND_Msk (0xfffffffful << TRNG_RAND0_RAND_Pos) /*!< TRNG_T::RAND0: RAND Mask */ + +#define TRNG_RAND1_RAND_Pos (0) /*!< TRNG_T::RAND1: RAND Position */ +#define TRNG_RAND1_RAND_Msk (0xfffffffful << TRNG_RAND1_RAND_Pos) /*!< TRNG_T::RAND1: RAND Mask */ + +#define TRNG_RAND2_RAND_Pos (0) /*!< TRNG_T::RAND2: RAND Position */ +#define TRNG_RAND2_RAND_Msk (0xfffffffful << TRNG_RAND2_RAND_Pos) /*!< TRNG_T::RAND2: RAND Mask */ + +#define TRNG_RAND3_RAND_Pos (0) /*!< TRNG_T::RAND3: RAND Position */ +#define TRNG_RAND3_RAND_Msk (0xfffffffful << TRNG_RAND3_RAND_Pos) /*!< TRNG_T::RAND3: RAND Mask */ + +#define TRNG_NPA_DATA0_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA0: NPA_DATA Position */ +#define TRNG_NPA_DATA0_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA0_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA0: NPA_DATA Mask */ + +#define TRNG_NPA_DATA1_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA1: NPA_DATA Position */ +#define TRNG_NPA_DATA1_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA1_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA1: NPA_DATA Mask */ + +#define TRNG_NPA_DATA2_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA2: NPA_DATA Position */ +#define TRNG_NPA_DATA2_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA2_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA2: NPA_DATA Mask */ + +#define TRNG_NPA_DATA3_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA3: NPA_DATA Position */ +#define TRNG_NPA_DATA3_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA3_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA3: NPA_DATA Mask */ + +#define TRNG_NPA_DATA4_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA4: NPA_DATA Position */ +#define TRNG_NPA_DATA4_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA4_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA4: NPA_DATA Mask */ + +#define TRNG_NPA_DATA5_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA5: NPA_DATA Position */ +#define TRNG_NPA_DATA5_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA5_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA5: NPA_DATA Mask */ + +#define TRNG_NPA_DATA6_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA6: NPA_DATA Position */ +#define TRNG_NPA_DATA6_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA6_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA6: NPA_DATA Mask */ + +#define TRNG_NPA_DATA7_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA7: NPA_DATA Position */ +#define TRNG_NPA_DATA7_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA7_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA7: NPA_DATA Mask */ + +#define TRNG_NPA_DATA8_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA8: NPA_DATA Position */ +#define TRNG_NPA_DATA8_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA8_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA8: NPA_DATA Mask */ + +#define TRNG_NPA_DATA9_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA9: NPA_DATA Position */ +#define TRNG_NPA_DATA9_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA9_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA9: NPA_DATA Mask */ + +#define TRNG_NPA_DATA10_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA10: NPA_DATA Position */ +#define TRNG_NPA_DATA10_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA10_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA10: NPA_DATA Mask */ + +#define TRNG_NPA_DATA11_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA11: NPA_DATA Position */ +#define TRNG_NPA_DATA11_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA11_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA11: NPA_DATA Mask */ + +#define TRNG_NPA_DATA12_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA12: NPA_DATA Position */ +#define TRNG_NPA_DATA12_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA12_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA12: NPA_DATA Mask */ + +#define TRNG_NPA_DATA13_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA13: NPA_DATA Position */ +#define TRNG_NPA_DATA13_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA13_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA13: NPA_DATA Mask */ + +#define TRNG_NPA_DATA14_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA14: NPA_DATA Position */ +#define TRNG_NPA_DATA14_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA14_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA14: NPA_DATA Mask */ + +#define TRNG_NPA_DATA15_NPA_DATA_Pos (0) /*!< TRNG_T::NPA_DATA15: NPA_DATA Position */ +#define TRNG_NPA_DATA15_NPA_DATA_Msk (0xfffffffful << TRNG_NPA_DATA15_NPA_DATA_Pos) /*!< TRNG_T::NPA_DATA15: NPA_DATA Mask */ + +#define TRNG_SEED0_SEED_Pos (0) /*!< TRNG_T::SEED0: SEED Position */ +#define TRNG_SEED0_SEED_Msk (0xfffffffful << TRNG_SEED0_SEED_Pos) /*!< TRNG_T::SEED0: SEED Mask */ + +#define TRNG_SEED1_SEED_Pos (0) /*!< TRNG_T::SEED1: SEED Position */ +#define TRNG_SEED1_SEED_Msk (0xfffffffful << TRNG_SEED1_SEED_Pos) /*!< TRNG_T::SEED1: SEED Mask */ + +#define TRNG_SEED2_SEED_Pos (0) /*!< TRNG_T::SEED2: SEED Position */ +#define TRNG_SEED2_SEED_Msk (0xfffffffful << TRNG_SEED2_SEED_Pos) /*!< TRNG_T::SEED2: SEED Mask */ + +#define TRNG_SEED3_SEED_Pos (0) /*!< TRNG_T::SEED3: SEED Position */ +#define TRNG_SEED3_SEED_Msk (0xfffffffful << TRNG_SEED3_SEED_Pos) /*!< TRNG_T::SEED3: SEED Mask */ + +#define TRNG_SEED4_SEED_Pos (0) /*!< TRNG_T::SEED4: SEED Position */ +#define TRNG_SEED4_SEED_Msk (0xfffffffful << TRNG_SEED4_SEED_Pos) /*!< TRNG_T::SEED4: SEED Mask */ + +#define TRNG_SEED5_SEED_Pos (0) /*!< TRNG_T::SEED5: SEED Position */ +#define TRNG_SEED5_SEED_Msk (0xfffffffful << TRNG_SEED5_SEED_Pos) /*!< TRNG_T::SEED5: SEED Mask */ + +#define TRNG_SEED6_SEED_Pos (0) /*!< TRNG_T::SEED6: SEED Position */ +#define TRNG_SEED6_SEED_Msk (0xfffffffful << TRNG_SEED6_SEED_Pos) /*!< TRNG_T::SEED6: SEED Mask */ + +#define TRNG_SEED7_SEED_Pos (0) /*!< TRNG_T::SEED7: SEED Position */ +#define TRNG_SEED7_SEED_Msk (0xfffffffful << TRNG_SEED7_SEED_Pos) /*!< TRNG_T::SEED7: SEED Mask */ + +#define TRNG_SEED8_SEED_Pos (0) /*!< TRNG_T::SEED8: SEED Position */ +#define TRNG_SEED8_SEED_Msk (0xfffffffful << TRNG_SEED8_SEED_Pos) /*!< TRNG_T::SEED8: SEED Mask */ + +#define TRNG_SEED9_SEED_Pos (0) /*!< TRNG_T::SEED9: SEED Position */ +#define TRNG_SEED9_SEED_Msk (0xfffffffful << TRNG_SEED9_SEED_Pos) /*!< TRNG_T::SEED9: SEED Mask */ + +#define TRNG_SEED10_SEED_Pos (0) /*!< TRNG_T::SEED10: SEED Position */ +#define TRNG_SEED10_SEED_Msk (0xfffffffful << TRNG_SEED10_SEED_Pos) /*!< TRNG_T::SEED10: SEED Mask */ + +#define TRNG_SEED11_SEED_Pos (0) /*!< TRNG_T::SEED11: SEED Position */ +#define TRNG_SEED11_SEED_Msk (0xfffffffful << TRNG_SEED11_SEED_Pos) /*!< TRNG_T::SEED11: SEED Mask */ + +#define TRNG_TIME_TO_SEED_TTS_Pos (0) /*!< TRNG_T::TIME_TO_SEED: TTS Position */ +#define TRNG_TIME_TO_SEED_TTS_Msk (0xfffffffful << TRNG_TIME_TO_SEED_TTS_Pos) /*!< TRNG_T::TIME_TO_SEED: TTS Mask */ + +#define TRNG_BUILD_CFG0_CORE_TYPE_Pos (0) /*!< TRNG_T::BUILD_CFG0: CORE_TYPE Position */ +#define TRNG_BUILD_CFG0_CORE_TYPE_Msk (0x3ul << TRNG_BUILD_CFG0_CORE_TYPE_Pos) /*!< TRNG_T::BUILD_CFG0: CORE_TYPE Mask */ + +#define TRNG_BUILD_CFG0_BG8_Pos (7) /*!< TRNG_T::BUILD_CFG0: BG8 Position */ +#define TRNG_BUILD_CFG0_BG8_Msk (0x1ul << TRNG_BUILD_CFG0_BG8_Pos) /*!< TRNG_T::BUILD_CFG0: BG8 Mask */ + +#define TRNG_BUILD_CFG0_CDC_SYNC_DEPTH_Pos (8) /*!< TRNG_T::BUILD_CFG0: CDC_SYNC_DEPTH Position*/ +#define TRNG_BUILD_CFG0_CDC_SYNC_DEPTH_Msk (0x3ul << TRNG_BUILD_CFG0_CDC_SYNC_DEPTH_Pos) /*!< TRNG_T::BUILD_CFG0: CDC_SYNC_DEPTH Mask*/ + +#define TRNG_BUILD_CFG0_BACKGROUND_NOISE_Pos (10) /*!< TRNG_T::BUILD_CFG0: BACKGROUND_NOISE Position*/ +#define TRNG_BUILD_CFG0_BACKGROUND_NOISE_Msk (0x1ul << TRNG_BUILD_CFG0_BACKGROUND_NOISE_Pos) /*!< TRNG_T::BUILD_CFG0: BACKGROUND_NOISE Mask*/ + +#define TRNG_BUILD_CFG0_EDU_PRESENT_Pos (11) /*!< TRNG_T::BUILD_CFG0: EDU_PRESENT Position*/ +#define TRNG_BUILD_CFG0_EDU_PRESENT_Msk (0x1ul << TRNG_BUILD_CFG0_EDU_PRESENT_Pos) /*!< TRNG_T::BUILD_CFG0: EDU_PRESENT Mask */ + +#define TRNG_BUILD_CFG0_AES_DATAPATH_Pos (12) /*!< TRNG_T::BUILD_CFG0: AES_DATAPATH Position*/ +#define TRNG_BUILD_CFG0_AES_DATAPATH_Msk (0x1ul << TRNG_BUILD_CFG0_AES_DATAPATH_Pos) /*!< TRNG_T::BUILD_CFG0: AES_DATAPATH Mask */ + +#define TRNG_BUILD_CFG0_AES_MAX_KEY_SIZE_Pos (13) /*!< TRNG_T::BUILD_CFG0: AES_MAX_KEY_SIZE Position*/ +#define TRNG_BUILD_CFG0_AES_MAX_KEY_SIZE_Msk (0x1ul << TRNG_BUILD_CFG0_AES_MAX_KEY_SIZE_Pos) /*!< TRNG_T::BUILD_CFG0: AES_MAX_KEY_SIZE Mask*/ + +#define TRNG_BUILD_CFG0_PERSONALIZATION_STR_Pos (14) /*!< TRNG_T::BUILD_CFG0: PERSONALIZATION_STR Position*/ +#define TRNG_BUILD_CFG0_PERSONALIZATION_STR_Msk (0x1ul << TRNG_BUILD_CFG0_PERSONALIZATION_STR_Pos) /*!< TRNG_T::BUILD_CFG0: PERSONALIZATION_STR Mask*/ + +#define TRNG_BUILD_CFG1_NUM_RAW_NOISE_BLKS_Pos (0) /*!< TRNG_T::BUILD_CFG1: NUM_RAW_NOISE_BLKS Position*/ +#define TRNG_BUILD_CFG1_NUM_RAW_NOISE_BLKS_Msk (0xfful << TRNG_BUILD_CFG1_NUM_RAW_NOISE_BLKS_Pos) /*!< TRNG_T::BUILD_CFG1: NUM_RAW_NOISE_BLKS Mask*/ + +#define TRNG_BUILD_CFG1_STICKY_STARTUP_Pos (8) /*!< TRNG_T::BUILD_CFG1: STICKY_STARTUP Position*/ +#define TRNG_BUILD_CFG1_STICKY_STARTUP_Msk (0x1ul << TRNG_BUILD_CFG1_STICKY_STARTUP_Pos) /*!< TRNG_T::BUILD_CFG1: STICKY_STARTUP Mask*/ + +#define TRNG_BUILD_CFG1_AUTO_CORRELATION_TEST_Pos (12) /*!< TRNG_T::BUILD_CFG1: AUTO_CORRELATION_TEST Position*/ +#define TRNG_BUILD_CFG1_AUTO_CORRELATION_TEST_Msk (0x1ul << TRNG_BUILD_CFG1_AUTO_CORRELATION_TEST_Pos) /*!< TRNG_T::BUILD_CFG1: AUTO_CORRELATION_TEST Mask*/ + +#define TRNG_BUILD_CFG1_MONOBIT_TEST_Pos (13) /*!< TRNG_T::BUILD_CFG1: MONOBIT_TEST Position*/ +#define TRNG_BUILD_CFG1_MONOBIT_TEST_Msk (0x1ul << TRNG_BUILD_CFG1_MONOBIT_TEST_Pos) /*!< TRNG_T::BUILD_CFG1: MONOBIT_TEST Mask */ + +#define TRNG_BUILD_CFG1_RUN_TEST_Pos (14) /*!< TRNG_T::BUILD_CFG1: RUN_TEST Position */ +#define TRNG_BUILD_CFG1_RUN_TEST_Msk (0x1ul << TRNG_BUILD_CFG1_RUN_TEST_Pos) /*!< TRNG_T::BUILD_CFG1: RUN_TEST Mask */ + +#define TRNG_BUILD_CFG1_POKER_TEST_Pos (15) /*!< TRNG_T::BUILD_CFG1: POKER_TEST Position*/ +#define TRNG_BUILD_CFG1_POKER_TEST_Msk (0x1ul << TRNG_BUILD_CFG1_POKER_TEST_Pos) /*!< TRNG_T::BUILD_CFG1: POKER_TEST Mask */ + +#define TRNG_BUILD_CFG1_RAW_HT_ADAP_TEST_Pos (16) /*!< TRNG_T::BUILD_CFG1: RAW_HT_ADAP_TEST Position*/ +#define TRNG_BUILD_CFG1_RAW_HT_ADAP_TEST_Msk (0x7ul << TRNG_BUILD_CFG1_RAW_HT_ADAP_TEST_Pos) /*!< TRNG_T::BUILD_CFG1: RAW_HT_ADAP_TEST Mask*/ + +#define TRNG_BUILD_CFG1_RAW_HT_REP_TEST_Pos (19) /*!< TRNG_T::BUILD_CFG1: RAW_HT_REP_TEST Position*/ +#define TRNG_BUILD_CFG1_RAW_HT_REP_TEST_Msk (0x1ul << TRNG_BUILD_CFG1_RAW_HT_REP_TEST_Pos) /*!< TRNG_T::BUILD_CFG1: RAW_HT_REP_TEST Mask*/ + +#define TRNG_BUILD_CFG1_ENT_SRC_REP_SMPL_SIZE_Pos (20) /*!< TRNG_T::BUILD_CFG1: ENT_SRC_REP_SMPL_SIZE Position*/ +#define TRNG_BUILD_CFG1_ENT_SRC_REP_SMPL_SIZE_Msk (0x7ul << TRNG_BUILD_CFG1_ENT_SRC_REP_SMPL_SIZE_Pos) /*!< TRNG_T::BUILD_CFG1: ENT_SRC_REP_SMPL_SIZE Mask*/ + +#define TRNG_BUILD_CFG1_ENT_SRC_REP_TEST_Pos (23) /*!< TRNG_T::BUILD_CFG1: ENT_SRC_REP_TEST Position*/ +#define TRNG_BUILD_CFG1_ENT_SRC_REP_TEST_Msk (0x1ul << TRNG_BUILD_CFG1_ENT_SRC_REP_TEST_Pos) /*!< TRNG_T::BUILD_CFG1: ENT_SRC_REP_TEST Mask*/ + +#define TRNG_BUILD_CFG1_ENT_SRC_REP_MIN_ENTROPY_Pos (24) /*!< TRNG_T::BUILD_CFG1: ENT_SRC_REP_MIN_ENTROPY Position*/ +#define TRNG_BUILD_CFG1_ENT_SRC_REP_MIN_ENTROPY_Msk (0x7ful << TRNG_BUILD_CFG1_ENT_SRC_REP_MIN_ENTROPY_Pos) /*!< TRNG_T::BUILD_CFG1: ENT_SRC_REP_MIN_ENTROPY Mask*/ + +/**@}*/ /* TRNG_CONST */ +/**@}*/ /* end of TRNG register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __TRNG_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/uart_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/uart_reg.h new file mode 100644 index 0000000000..299b1fb873 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/uart_reg.h @@ -0,0 +1,1061 @@ +/**************************************************************************//** + * @file uart_reg.h + * @brief UART register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __UART_REG_H__ +#define __UART_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup UART Universal Asynchronous Receiver/Transmitter Controller(UART) + Memory Mapped Structure for UART Controller +@{ */ + +typedef struct +{ + + + /** + * @var UART_T::DAT + * Offset: 0x00 UART Receive/Transmit Buffer Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |DAT |Data Receive/Transmit Buffer + * | | |Write Operation: + * | | |By writing one byte to this register, the data byte will be stored in transmitter FIFO + * | | |The UART controller will send out the data stored in transmitter FIFO top location through the UART_TXD. + * | | |Read Operation: + * | | |By reading this register, the UART controller will return an 8-bit data received from receiver FIFO. + * |[8] |PARITY |Parity Bit Receive/Transmit Buffer + * | | |Write Operation: + * | | |By writing to this bit, the parity bit will be stored in transmitter FIFO + * | | |If PBE (UART_LINE[3]) and PSS (UART_LINE[7]) are set, + * | | |the UART controller will send out this bit follow the DAT (UART_DAT[7:0]) through the UART_TXD. + * | | |Read Operation: + * | | |If PBE (UART_LINE[3]) and PSS (UART_LINE[7]) are enabled, the parity bit can be read by this bit. + * | | |Note: This bit has effect only when PBE (UART_LINE[3]) and PSS (UART_LINE[7]) are set. + * @var UART_T::INTEN + * Offset: 0x04 UART Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDAIEN |Receive Data Available Interrupt Enable Bit + * | | |0 = Receive data available interrupt Disabled. + * | | |1 = Receive data available interrupt Enabled. + * |[1] |THREIEN |Transmit Holding Register Empty Interrupt Enable Bit + * | | |0 = Transmit holding register empty interrupt Disabled. + * | | |1 = Transmit holding register empty interrupt Enabled. + * |[2] |RLSIEN |Receive Line Status Interrupt Enable Bit + * | | |0 = Receive Line Status interrupt Disabled. + * | | |1 = Receive Line Status interrupt Enabled. + * |[3] |MODEMIEN |Modem Status Interrupt Enable Bit + * | | |0 = Modem status interrupt Disabled. + * | | |1 = Modem status interrupt Enabled. + * |[4] |RXTOIEN |RX Time-out Interrupt Enable Bit + * | | |0 = RX time-out interrupt Disabled. + * | | |1 = RX time-out interrupt Enabled. + * |[5] |BUFEIEN |Buffer Error Interrupt Enable Bit + * | | |0 = Buffer error interrupt Disabled. + * | | |1 = Buffer error interrupt Enabled. + * |[6] |WKIEN |Wake-up Interrupt Enable Bit + * | | |0 = Wake-up Interrupt Disabled. + * | | |1 = Wake-up Interrupt Enabled. + * |[11] |TOCNTEN |Receive Buffer Time-out Counter Enable Bit + * | | |0 = Receive Buffer Time-out counter Disabled. + * | | |1 = Receive Buffer Time-out counter Enabled. + * |[12] |ATORTSEN |nRTS Auto-flow Control Enable Bit + * | | |0 = nRTS auto-flow control Disabled. + * | | |1 = nRTS auto-flow control Enabled. + * | | |Note: When nRTS auto-flow is enabled, if the number of bytes in the RX FIFO equals the RTSTRGLV (UART_FIFO[19:16]), the UART will de-assert nRTS signal. + * |[13] |ATOCTSEN |nCTS Auto-flow Control Enable Bit + * | | |0 = nCTS auto-flow control Disabled. + * | | |1 = nCTS auto-flow control Enabled. + * | | |Note: When nCTS auto-flow is enabled, the UART will send data to external device if nCTS input assert (UART will not send data to device until nCTS is asserted). + * |[14] |TXPDMAEN |TX PDMA Enable Bit + * | | |0 = TX PDMA Disabled. + * | | |1 = TX PDMA Enabled. + * | | |Note: If RLSIEN (UART_INTEN[2]) is enabled and HWRLSINT (UART_INTSTS[26]) is set to 1, the RLS (Receive Line Status) Interrupt is caused + * | | |If RLS interrupt is caused by Break Error Flag BIF(UART_FIFOSTS[6]), Frame Error Flag FEF(UART_FIFO[5]) or Parity Error Flag PEF(UART_FIFOSTS[4]), UART PDMA transmit request operation is stopped + * | | |Clear Break Error Flag BIF or Frame Error Flag FEF or Parity Error Flag PEF by writing '1' to corresponding BIF, FEF and PEF to make UART PDMA transmit request operation continue. + * |[15] |RXPDMAEN |RX PDMA Enable Bit + * | | |This bit can enable or disable RX PDMA service. + * | | |0 = RX PDMA Disabled. + * | | |1 = RX PDMA Enabled. + * | | |Note: If RLSIEN (UART_INTEN[2]) is enabled and HWRLSINT (UART_INTSTS[26]) is set to 1, the RLS (Receive Line Status) Interrupt is caused + * | | |If RLS interrupt is caused by Break Error Flag BIF(UART_FIFOSTS[6]), Frame Error Flag FEF(UART_FIFO[5]) or Parity Error Flag PEF(UART_FIFOSTS[4]), UART PDMA receive request operation is stopped + * | | |Clear Break Error Flag BIF or Frame Error Flag FEF or Parity Error Flag PEF by writing '1' to corresponding BIF, FEF and PEF to make UART PDMA receive request operation continue. + * |[16] |SWBEIEN |Single-wire Bit Error Detection Interrupt Enable Bit + * | | |Set this bit, the Single-wire Half Duplex Bit Error Detection Interrupt SWBEINT(UART_INTSTS[24]) is generated when Single-wire Bit Error Detection SWBEIF(UART_INTSTS[16]) is set. + * | | |0 = Single-wire Bit Error Detect Interrupt Disabled. + * | | |1 = Single-wire Bit Error Detect Interrupt Enabled. + * | | |Note: This bit is valid when FUNCSEL (UART_FUNCSEL[2:0]) is select UART Single-wire mode. + * |[18] |ABRIEN |Auto-baud Rate Interrupt Enable Bit + * | | |0 = Auto-baud rate interrupt Disabled. + * | | |1 = Auto-baud rate interrupt Enabled. + * |[22] |TXENDIEN |Transmitter Empty Interrupt Enable Bit + * | | |If TXENDIEN (UART_INTEN[22]) is enabled, the Transmitter Empty interrupt TXENDINT (UART_INTSTS[30]) will be generated when TXENDIF (UART_INTSTS[22]) is set (TX FIFO (UART_DAT) is empty and the STOP bit of the last byte has been transmitted). + * | | |0 = Transmitter empty interrupt Disabled. + * | | |1 = Transmitter empty interrupt Enabled. + * @var UART_T::FIFO + * Offset: 0x08 UART FIFO Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |RXRST |RX Field Software Reset + * | | |When RXRST (UART_FIFO[1]) is set, all the byte in the receiver FIFO and RX internal state machine are cleared. + * | | |0 = No effect. + * | | |1 = Reset the RX internal state machine and pointers. + * | | |Note 1: This bit will automatically clear at least 3 UART peripheral clock cycles. + * | | |Note 2: Before setting this bit, it should wait for the RXIDLE (UART_FIFOSTS[29]) be set. + * |[2] |TXRST |TX Field Software Reset + * | | |When TXRST (UART_FIFO[2]) is set, all the byte in the transmit FIFO and TX internal state machine are cleared. + * | | |0 = No effect. + * | | |1 = Reset the TX internal state machine and pointers. + * | | |Note 1: This bit will automatically clear at least 3 UART peripheral clock cycles. + * | | |Note 2: Before setting this bit, it should wait for the TXEMPTYF (UART_FIFOSTS[28]) be set. + * |[7:4] |RFITL |RX FIFO Interrupt Trigger Level + * | | |When the number of bytes in the receive FIFO equals the RFITL, the RDAIF (UART_INTSTS[0]) will be set (if RDAIEN (UART_INTEN [0]) enabled, and an interrupt will be generated). + * | | |0000 = RX FIFO Interrupt Trigger Level is 1 byte. + * | | |0001 = RX FIFO Interrupt Trigger Level is 4 bytes. + * | | |0010 = RX FIFO Interrupt Trigger Level is 8 bytes. + * | | |0011 = RX FIFO Interrupt Trigger Level is 14 bytes. + * | | |Others = Reserved. + * |[8] |RXOFF |Receiver Disable Bit + * | | |The receiver is disabled or not (set 1 to disable receiver). + * | | |0 = Receiver Enabled. + * | | |1 = Receiver Disabled. + * | | |Note: This bit is used for RS-485 Normal Multi-drop mode + * | | |It should be programmed before RS485NMM (UART_ALTCTL [8]) is programmed. + * |[19:16] |RTSTRGLV |nRTS Trigger Level for Auto-flow Control + * | | |0000 = nRTS Trigger Level is 1 byte. + * | | |0001 = nRTS Trigger Level is 4 bytes. + * | | |0010 = nRTS Trigger Level is 8 bytes. + * | | |0011 = nRTS Trigger Level is 14 bytes. + * | | |Others = Reserved. + * | | |Note: This field is used for auto nRTS flow control. + * @var UART_T::LINE + * Offset: 0x0C UART Line Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |WLS |Word Length Selection + * | | |This field sets UART word length. + * | | |00 = 5 bits. + * | | |01 = 6 bits. + * | | |10 = 7 bits. + * | | |11 = 8 bits. + * |[2] |NSB |Number of 'STOP Bit' + * | | |0 = One 'STOP bit' is generated in the transmitted data. + * | | |1 = When select 5-bit word length, 1.5 'STOP bit' is generated in the transmitted data + * | | |When select 6-, 7- and 8-bit word length, 2 'STOP bit' is generated in the transmitted data. + * |[3] |PBE |Parity Bit Enable Bit + * | | |0 = Parity bit generated Disabled. + * | | |1 = Parity bit generated Enabled. + * | | |Note: Parity bit is generated on each outgoing character and is checked on each incoming data. + * |[4] |EPE |Even Parity Enable Bit + * | | |0 = Odd number of logic 1's is transmitted and checked in each word. + * | | |1 = Even number of logic 1's is transmitted and checked in each word. + * | | |Note: This bit has effect only when PBE (UART_LINE[3]) is set. + * |[5] |SPE |Stick Parity Enable Bit + * | | |0 = Stick parity Disabled. + * | | |1 = Stick parity Enabled. + * | | |Note: If PBE (UART_LINE[3]) and EPE (UART_LINE[4]) are logic 1, the parity bit is transmitted and checked as logic 0 + * | | |If PBE (UART_LINE[3]) is 1 and EPE (UART_LINE[4]) is 0 then the parity bit is transmitted and checked as 1. + * |[6] |BCB |Break Control Bit + * | | |0 = Break Control Disabled. + * | | |1 = Break Control Enabled. + * | | |Note: When this bit is set to logic 1, the transmitted serial data output (TX) is forced to the Spacing State (logic 0) + * | | |This bit acts only on TX line and has no effect on the transmitter logic. + * |[7] |PSS |Parity Bit Source Selection + * | | |The parity bit can be selected to be generated and checked automatically or by software. + * | | |0 = Parity bit is generated by EPE (UART_LINE[4]) and SPE (UART_LINE[5]) setting and checked automatically. + * | | |1 = Parity bit generated and checked by software. + * | | |Note 1: This bit has effect only when PBE (UART_LINE[3]) is set. + * | | |Note 2: If PSS is 0, the parity bit is transmitted and checked automatically + * | | |If PSS is 1, the transmitted parity bit value can be determined by writing PARITY (UART_DAT[8]) and the parity bit can be read by reading PARITY (UART_DAT[8]). + * |[8] |TXDINV |TX Data Inverted + * | | |0 = Transmitted data signal inverted Disabled. + * | | |1 = Transmitted data signal inverted Enabled. + * | | |Note 1: Before setting this bit, TXRXDIS (UART_FUNCSEL[3]) should be set then waited for TXRXACT (UART_FIFOSTS[31]) is cleared + * | | |When the configuration is done, cleared TXRXDIS (UART_FUNCSEL[3]) to activate UART controller. + * | | |Note 2: This bit is valid when FUNCSEL (UART_FUNCSEL[2:0]) is select UART or RS485 function. + * |[9] |RXDINV |RX Data Inverted + * | | |0 = Received data signal inverted Disabled. + * | | |1 = Received data signal inverted Enabled. + * | | |Note 1: Before setting this bit, TXRXDIS (UART_FUNCSEL[3]) should be set then waited for TXRXACT (UART_FIFOSTS[31]) is cleared + * | | |When the configuration is done, cleared TXRXDIS (UART_FUNCSEL[3]) to activate UART controller. + * | | |Note 2: This bit is valid when FUNCSEL (UART_FUNCSEL[2:0]) is select UART, LIN or RS485 function. + * @var UART_T::MODEM + * Offset: 0x10 UART Modem Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |RTS |nRTS Signal Control + * | | |This bit is direct control internal nRTS (Request-to-send) signal active or not, and then drive the nRTS pin output with RTSACTLV bit configuration. + * | | |0 = nRTS signal is active. + * | | |1 = nRTS signal is inactive. + * | | |Note 1: The nRTS signal control bit is not effective when nRTS auto-flow control is enabled in UART function mode. + * | | |Note 2: The nRTS signal control bit is not effective when RS-485 auto direction mode (AUD) is enabled in RS-485 function mode. + * | | |Note 3: Single-wire mode is support this feature. + * |[9] |RTSACTLV |nRTS Pin Active Level + * | | |This bit defines the active level state of nRTS pin output. + * | | |0 = nRTS pin output is high level active. + * | | |1 = nRTS pin output is low level active. (Default) + * | | |Note 1: Refer to Figure 6.24-13 and Figure 6.24-14 for UART function mode. + * | | |Note 2: Refer to Figure 6.24-17 and Figure 6.24-18 for RS-485 function mode. + * | | |Note 3: Before setting this bit, TXRXDIS (UART_FUNCSEL[3]) should be set then waited for TXRXACT (UART_FIFOSTS[31]) is cleared + * | | |When the configuration is done, cleared TXRXDIS (UART_FUNCSEL[3]) to activate UART controller. + * |[13] |RTSSTS |nRTS Pin Status (Read Only) + * | | |This bit mirror from nRTS pin output of voltage logic status. + * | | |0 = nRTS pin output is low level voltage logic state. + * | | |1 = nRTS pin output is high level voltage logic state. + * @var UART_T::MODEMSTS + * Offset: 0x14 UART Modem Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CTSDETF |Detect nCTS State Change Flag + * | | |This bit is set whenever nCTS input has change state, and it will generate Modem interrupt to CPU when MODEMIEN (UART_INTEN [3]) is set to 1. + * | | |0 = nCTS input has not change state. + * | | |1 = nCTS input has change state. + * | | |Note: This bit can be cleared by writing '1' to it. + * |[4] |CTSSTS |nCTS Pin Status (Read Only) + * | | |This bit mirror from nCTS pin input of voltage logic status. + * | | |0 = nCTS pin input is low level voltage logic state. + * | | |1 = nCTS pin input is high level voltage logic state. + * | | |Note: This bit echoes when UART controller peripheral clock is enabled, and nCTS multi-function port is selected. + * |[8] |CTSACTLV |nCTS Pin Active Level + * | | |This bit defines the active level state of nCTS pin input. + * | | |0 = nCTS pin input is high level active. + * | | |1 = nCTS pin input is low level active. (Default) + * | | |Note: Before setting this bit, TXRXDIS (UART_FUNCSEL[3]) should be set then waited for TXRXACT (UART_FIFOSTS[31]) is cleared + * | | |When the configuration is done, cleared TXRXDIS (UART_FUNCSEL[3]) to activate UART controller. + * @var UART_T::FIFOSTS + * Offset: 0x18 UART FIFO Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RXOVIF |RX Overflow Error Interrupt Flag + * | | |This bit is set when RX FIFO overflow. + * | | |If the number of bytes of received data is greater than RX_FIFO (UART_DAT) size 16 bytes, this bit will be set. + * | | |0 = RX FIFO is not overflow. + * | | |1 = RX FIFO is overflow. + * | | |Note: This bit can be cleared by writing '1' to it. + * |[1] |ABRDIF |Auto-baud Rate Detect Interrupt Flag + * | | |This bit is set to logic '1' when auto-baud rate detect function is finished. + * | | |0 = Auto-baud rate detect function is not finished. + * | | |1 = Auto-baud rate detect function is finished. + * | | |Note: This bit can be cleared by writing '1' to it. + * |[2] |ABRDTOIF |Auto-baud Rate Detect Time-out Interrupt Flag + * | | |This bit is set to logic '1' in Auto-baud Rate Detect mode when the baud rate counter is overflow. + * | | |0 = Auto-baud rate counter is underflow. + * | | |1 = Auto-baud rate counter is overflow. + * | | |Note: This bit can be cleared by writing '1' to it. + * |[3] |ADDRDETF |RS-485 Address Byte Detect Flag + * | | |0 = Receiver detects a data that is not an address bit (bit 9 ='0'). + * | | |1 = Receiver detects a data that is an address bit (bit 9 ='1'). + * | | |Note 1: This field is used for RS-485 function mode and ADDRDEN (UART_ALTCTL[15]) is set to 1 to enable Address detection mode. + * | | |Note 2: This bit can be cleared by writing '1' to it. + * |[4] |PEF |Parity Error Flag + * | | |This bit is set to logic 1 whenever the received character does not have a valid 'parity bit'. + * | | |0 = No parity error is generated. + * | | |1 = Parity error is generated. + * | | |Note: This bit can be cleared by writing '1' to it. + * |[5] |FEF |Framing Error Flag + * | | |This bit is set to logic 1 whenever the received character does not have a valid 'stop bit' + * | | |(that is, the stop bit following the last data bit or parity bit is detected as logic 0). + * | | |0 = No framing error is generated. + * | | |1 = Framing error is generated. + * | | |Note: This bit can be cleared by writing '1' to it. + * |[6] |BIF |Break Interrupt Flag + * | | |This bit is set to logic 1 whenever the received data input (RX) is held in the 'spacing state' (logic 0) + * | | |for longer than a full word transmission time (that is, the total time of 'start bit' + data bits + parity + stop bits). + * | | |0 = No Break interrupt is generated. + * | | |1 = Break interrupt is generated. + * | | |Note: This bit can be cleared by writing '1' to it. + * |[13:8] |RXPTR |RX FIFO Pointer (Read Only) + * | | |This field indicates the RX FIFO Buffer Pointer + * | | |When UART receives one byte from external device, RXPTR increases one + * | | |When one byte of RX FIFO is read by CPU, RXPTR decreases one. + * | | |The Maximum value shown in RXPTR is 15 + * | | |When the using level of RX FIFO Buffer equal to 16, the RXFULL bit is set to 1 and RXPTR will show 0 + * | | |As one byte of RX FIFO is read by CPU, the RXFULL bit is cleared to 0 and RXPTR will show 15 + * |[14] |RXEMPTY |Receiver FIFO Empty (Read Only) + * | | |This bit initiate RX FIFO empty or not. + * | | |0 = RX FIFO is not empty. + * | | |1 = RX FIFO is empty. + * | | |Note: When the last byte of RX FIFO has been read by CPU, hardware sets this bit high + * | | |It will be cleared when UART receives any new data. + * |[15] |RXFULL |Receiver FIFO Full (Read Only) + * | | |This bit initiates RX FIFO full or not. + * | | |0 = RX FIFO is not full. + * | | |1 = RX FIFO is full. + * | | |Note: This bit is set when the number of usage in RX FIFO Buffer is equal to 16, otherwise it is cleared by hardware. + * |[21:16] |TXPTR |TX FIFO Pointer (Read Only) + * | | |This field indicates the TX FIFO Buffer Pointer + * | | |When CPU writes one byte into UART_DAT, TXPTR increases one + * | | |When one byte of TX FIFO is transferred to Transmitter Shift Register, TXPTR decreases one. + * | | |The Maximum value shown in TXPTR is 15 + * | | |When the using level of TX FIFO Buffer equal to 16, the TXFULL bit is set to 1 and TXPTR will show 0 + * | | |As one byte of TX FIFO is transferred to Transmitter Shift Register, the TXFULL bit is cleared to 0 and TXPTR will show 15 + * |[22] |TXEMPTY |Transmitter FIFO Empty (Read Only) + * | | |This bit indicates TX FIFO empty or not. + * | | |0 = TX FIFO is not empty. + * | | |1 = TX FIFO is empty. + * | | |Note: When the last byte of TX FIFO has been transferred to Transmitter Shift Register, hardware sets this bit high + * | | |It will be cleared when writing data into UART_DAT (TX FIFO not empty). + * |[23] |TXFULL |Transmitter FIFO Full (Read Only) + * | | |This bit indicates TX FIFO full or not. + * | | |0 = TX FIFO is not full. + * | | |1 = TX FIFO is full. + * | | |Note: This bit is set when the number of usage in TX FIFO Buffer is equal to 16, otherwise it is cleared by hardware. + * |[24] |TXOVIF |TX Overflow Error Interrupt Flag + * | | |If TX FIFO (UART_DAT) is full, an additional write to UART_DAT will cause this bit to logic 1. + * | | |0 = TX FIFO is not overflow. + * | | |1 = TX FIFO is overflow. + * | | |Note: This bit can be cleared by writing '1' to it. + * |[28] |TXEMPTYF |Transmitter Empty Flag (Read Only) + * | | |This bit is set by hardware when TX FIFO (UART_DAT) is empty and the STOP bit of the last byte has been transmitted. + * | | |0 = TX FIFO is not empty or the STOP bit of the last byte has been not transmitted. + * | | |1 = TX FIFO is empty and the STOP bit of the last byte has been transmitted. + * | | |Note: This bit is cleared automatically when TX FIFO is not empty or the last byte transmission has not completed. + * |[29] |RXIDLE |RX Idle Status (Read Only) + * | | |This bit is set by hardware when RX is idle. + * | | |0 = RX is busy. + * | | |1 = RX is idle. (Default) + * |[31] |TXRXACT |TX and RX Active Status (Read Only) + * | | |This bit indicates TX and RX are active or inactive. + * | | |0 = TX and RX are inactive. + * | | |1 = TX and RX are active. (Default) + * | | |Note: When TXRXDIS (UART_FUNCSEL[3]) is set and both TX and RX are in idle state, this bit is cleared + * | | |The UART controller cannot transmit or receive data at this moment + * | | |Otherwise this bit is set. + * @var UART_T::INTSTS + * Offset: 0x1C UART Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RDAIF |Receive Data Available Interrupt Flag + * | | |When the number of bytes in the RX FIFO equals the RFITL then the RDAIF(UART_INTSTS[0]) will be set + * | | |If RDAIEN (UART_INTEN [0]) is enabled, the RDA interrupt will be generated. + * | | |0 = No RDA interrupt flag is generated. + * | | |1 = RDA interrupt flag is generated. + * | | |Note: This bit is read only and it will be cleared when the number of unread bytes of RX FIFO drops below the threshold level (RFITL(UART_FIFO[7:4]). + * |[1] |THREIF |Transmit Holding Register Empty Interrupt Flag + * | | |This bit is set when the last data of TX FIFO is transferred to Transmitter Shift Register + * | | |If THREIEN (UART_INTEN[1]) is enabled, the THRE interrupt will be generated. + * | | |0 = No THRE interrupt flag is generated. + * | | |1 = THRE interrupt flag is generated. + * | | |Note: This bit is read only and it will be cleared when writing data into UART_DAT (TX FIFO not empty). + * |[2] |RLSIF |Receive Line Interrupt Flag (Read Only) + * | | |This bit is set when the RX receive data have parity error, frame error or break error (at least one of 3 bits, BIF(UART_FIFOSTS[6]), FEF(UART_FIFOSTS[5]) and PEF(UART_FIFOSTS[4]), is set) + * | | |If RLSIEN (UART_INTEN [2]) is enabled, the RLS interrupt will be generated. + * | | |0 = No RLS interrupt flag is generated. + * | | |1 = RLS interrupt flag is generated. + * | | |Note 1: In RS-485 function mode, this field is set include "receiver detect and received address byte character (bit9 = '1') bit" + * | | |At the same time, the bit of ADDRDETF (UART_FIFOSTS[3]) is also set. + * | | |Note 2: This bit is read only and reset to 0 when all bits of BIF (UART_FIFOSTS[6]), FEF(UART_FIFOSTS[5]) and PEF(UART_FIFOSTS[4]) are cleared. + * | | |Note 3: In RS-485 function mode, this bit is read only and reset to 0 when all bits of BIF (UART_FIFOSTS[6]), FEF(UART_FIFOSTS[5]), PEF(UART_FIFOSTS[4]) and ADDRDETF (UART_FIFOSTS[3]) are cleared. + * |[3] |MODEMIF |MODEM Interrupt Flag (Read Only) + * | | |This bit is set when the nCTS pin has state change (CTSDETF (UART_MODEMSTS[0]) = 1) + * | | |If MODEMIEN (UART_INTEN [3]) is enabled, the Modem interrupt will be generated. + * | | |0 = No Modem interrupt flag is generated. + * | | |1 = Modem interrupt flag is generated. + * | | |Note: This bit is read only and reset to 0 when bit CTSDETF is cleared by a write 1 on CTSDETF(UART_MODEMSTS[0]). + * |[4] |RXTOIF |RX Time-out Interrupt Flag (Read Only) + * | | |This bit is set when the RX FIFO is not empty and no activities occurred in the RX FIFO and the time-out counter equal to TOIC (UART_TOUT[7:0]) + * | | |If RXTOIEN (UART_INTEN [4]) is enabled, the RX time-out interrupt will be generated. + * | | |0 = No RX time-out interrupt flag is generated. + * | | |1 = RX time-out interrupt flag is generated. + * | | |Note: This bit is read only and user can read UART_DAT (RX is in active) to clear it. + * |[5] |BUFEIF |Buffer Error Interrupt Flag (Read Only) + * | | |This bit is set when the TX FIFO or RX FIFO overflows (TXOVIF (UART_FIFOSTS[24]) or RXOVIF (UART_FIFOSTS[0]) is set) + * | | |When BUFERRIF (UART_INTSTS[5]) is set, the transfer is not correct + * | | |If BUFERRIEN (UART_INTEN [5]) is enabled, the buffer error interrupt will be generated. + * | | |0 = No buffer error interrupt flag is generated. + * | | |1 = Buffer error interrupt flag is generated. + * | | |Note: This bit is cleared if both of RXOVIF(UART_FIFOSTS[0]) and TXOVIF(UART_FIFOSTS[24]) are cleared to 0 by writing 1 to RXOVIF(UART_FIFOSTS[0]) and TXOVIF(UART_FIFOSTS[24]). + * |[6] |WKIF |UART Wake-up Interrupt Flag (Read Only) + * | | |This bit is set when TOUTWKF (UART_WKSTS[4]), RS485WKF (UART_WKSTS[3]), RFRTWKF (UART_WKSTS[2]), DATWKF (UART_WKSTS[1]) or CTSWKF(UART_WKSTS[0]) is set to 1. + * | | |0 = No UART wake-up interrupt flag is generated. + * | | |1 = UART wake-up interrupt flag is generated. + * | | |Note: This bit is cleared if all of TOUTWKF, RS485WKF, RFRTWKF, DATWKF and CTSWKF are cleared to 0 by writing 1 to the corresponding interrupt flag. + * |[8] |RDAINT |Receive Data Available Interrupt Indicator (Read Only) + * | | |This bit is set if RDAIEN (UART_INTEN[0]) and RDAIF (UART_INTSTS[0]) are both set to 1. + * | | |0 = No RDA interrupt is generated. + * | | |1 = RDA interrupt is generated. + * |[9] |THREINT |Transmit Holding Register Empty Interrupt Indicator (Read Only) + * | | |This bit is set if THREIEN (UART_INTEN[1]) and THREIF(UART_INTSTS[1]) are both set to 1. + * | | |0 = No THRE interrupt is generated. + * | | |1 = THRE interrupt is generated. + * |[10] |RLSINT |Receive Line Status Interrupt Indicator (Read Only) + * | | |This bit is set if RLSIEN (UART_INTEN[2]) and RLSIF(UART_INTSTS[2]) are both set to 1. + * | | |0 = No RLS interrupt is generated. + * | | |1 = RLS interrupt is generated. + * |[11] |MODEMINT |MODEM Status Interrupt Indicator (Read Only) + * | | |This bit is set if MODEMIEN(UART_INTEN[3]) and MODEMIF(UART_INTSTS[3]) are both set to 1 + * | | |0 = No Modem interrupt is generated. + * | | |1 = Modem interrupt is generated. + * |[12] |RXTOINT |RX Time-out Interrupt Indicator (Read Only) + * | | |This bit is set if RXTOIEN (UART_INTEN[4]) and RXTOIF(UART_INTSTS[4]) are both set to 1. + * | | |0 = No RX time-out interrupt is generated. + * | | |1 = RX time-out interrupt is generated. + * |[13] |BUFEINT |Buffer Error Interrupt Indicator (Read Only) + * | | |This bit is set if BUFERRIEN(UART_INTEN[5]) and BUFERRIF(UART_ INTSTS[5]) are both set to 1. + * | | |0 = No buffer error interrupt is generated. + * | | |1 = Buffer error interrupt is generated. + * |[14] |WKINT |UART Wake-up Interrupt Indicator (Read Only) + * | | |This bit is set if WKIEN (UART_INTEN[6]) and WKIF (UART_INTSTS[6]) are both set to 1. + * | | |0 = No UART wake-up interrupt is generated. + * | | |1 = UART wake-up interrupt is generated. + * |[16] |SWBEIF |Single-wire Bit Error Detection Interrupt Flag + * | | |This bit is set when the single wire bus state not equals to UART controller TX state in Single-wire mode. + * | | |0 = No single-wire bit error detection interrupt flag is generated. + * | | |1 = Single-wire bit error detection interrupt flag is generated. + * | | |Note 1: This bit is active when FUNCSEL (UART_FUNCSEL[2:0]) is select UART Single-wire mode. + * | | |Note 2: This bit can be cleared by writing '1' to it. + * |[18] |PRLSIF |PDMA Mode Receive Line Status Flag (Read Only) + * | | |This bit is set when the RX receive data have parity error, frame error or break error (at least one of 3 bits, BIF (UART_FIFOSTS[6]), FEF (UART_FIFOSTS[5]) and PEF (UART_FIFOSTS[4]) is set) + * | | |If RLSIEN (UART_INTEN [2]) is enabled, the RLS interrupt will be generated. + * | | |0 = No RLS interrupt flag is generated in PDMA mode. + * | | |1 = RLS interrupt flag is generated in PDMA mode. + * | | |Note 1: In RS-485 function mode, this field include "receiver detect any address byte received address byte character (bit9 = '1') bit". + * | | |Note 2: In UART function mode, this bit is read only and reset to 0 when all bits of BIF(UART_FIFOSTS[6]), FEF(UART_FIFOSTS[5]) and PEF(UART_FIFOSTS[4]) are cleared. + * | | |Note 3: In RS-485 function mode, this bit is read only and reset to 0 when all bits of BIF(UART_FIFOSTS[6]), FEF(UART_FIFOSTS[5]), PEF(UART_FIFOSTS[4]) and ADDRDETF (UART_FIFOSTS[3]) are cleared + * |[19] |PMODIF |PDMA Mode MODEM Interrupt Flag (Read Only) + * | | |This bit is set when the nCTS pin has state change (CTSDETF (UART_MODEMSTS [0] =1)) + * | | |If MODEMIEN (UART_INTEN [3]) is enabled, the Modem interrupt will be generated. + * | | |0 = No Modem interrupt flag is generated in PDMA mode. + * | | |1 = Modem interrupt flag is generated in PDMA mode. + * | | |Note: This bit is read only and reset to 0 when the bit CTSDETF (UART_MODEMSTS[0]) is cleared by writing 1 on CTSDETF (UART_MODEMSTS [0]). + * |[20] |PTOIF |PDMA Mode RX Time-out Interrupt Flag (Read Only) + * | | |This bit is set when the RX FIFO is not empty and no activities occurred in the RX FIFO and the time-out counter equal to TOIC (UART_TOUT[7:0]) + * | | |If RXTOIEN (UART_INTEN [4]) is enabled, the RX time-out interrupt will be generated . + * | | |0 = No RX time-out interrupt flag is generated in PDMA mode. + * | | |1 = RX time-out interrupt flag is generated in PDMA mode. + * | | |Note: This bit is read only and user can read UART_DAT (RX is in active) to clear it. + * |[21] |PBUFEIF |PDMA Mode Buffer Error Interrupt Flag (Read Only) + * | | |This bit is set when the TX or RX FIFO overflows (TXOVIF (UART_FIFOSTS [24]) or RXOVIF (UART_FIFOSTS[0]) is set) + * | | |When BUFERRIF (UART_INTSTS[5]) is set, the transfer maybe is not correct + * | | |If BUFERRIEN (UART_INTEN [5]) is enabled, the buffer error interrupt will be generated. + * | | |0 = No buffer error interrupt flag is generated in PDMA mode. + * | | |1 = Buffer error interrupt flag is generated in PDMA mode. + * | | |Note: This bit is cleared when both TXOVIF (UART_FIFOSTS[24]) and RXOVIF (UART_FIFOSTS[0]) are cleared. + * |[22] |TXENDIF |Transmitter Empty Interrupt Flag + * | | |This bit is set when TX FIFO (UART_DAT) is empty and the STOP bit of the last byte has been transmitted (TXEMPTYF (UART_FIFOSTS[28]) is set) + * | | |If TXENDIEN (UART_INTEN[22]) is enabled, the Transmitter Empty interrupt will be generated. + * | | |0 = No transmitter empty interrupt flag is generated. + * | | |1 = Transmitter empty interrupt flag is generated. + * | | |Note: This bit is cleared automatically when TX FIFO is not empty or the last byte transmission has not completed. + * |[24] |SWBEINT |Single-wire Bit Error Detect Interrupt Indicator (Read Only) + * | | |This bit is set if SWBEIEN (UART_INTEN[16]) and SWBEIF (UART_INTSTS[16]) are both set to 1. + * | | |0 = No Single-wire Bit Error Detection Interrupt generated. + * | | |1 = Single-wire Bit Error Detection Interrupt generated. + * |[26] |PRLSINT |PDMA Mode Receive Line Status Interrupt Indicator (Read Only) + * | | |This bit is set if RLSIEN (UART_INTEN[2]) and HWRLSIF(UART_INTSTS[18]) are both set to 1. + * | | |0 = No RLS interrupt is generated in PDMA mode. + * | | |1 = RLS interrupt is generated in PDMA mode. + * |[27] |PMODINT |PDMA Mode MODEM Status Interrupt Indicator (Read Only) + * | | |This bit is set if MODEMIEN (UART_INTEN[3]) and HWMODIF(UART_INTSTS[19]) are both set to 1. + * | | |0 = No Modem interrupt is generated in PDMA mode. + * | | |1 = Modem interrupt is generated in PDMA mode. + * |[28] |PTOINT |PDMA Mode RX Time-out Interrupt Indicator (Read Only) + * | | |This bit is set if RXTOIEN (UART_INTEN[4]) and HWTOIF(UART_INTSTS[20]) are both set to 1. + * | | |0 = No RX time-out interrupt is generated in PDMA mode. + * | | |1 = RX time-out interrupt is generated in PDMA mode. + * |[29] |PBUFEINT |PDMA Mode Buffer Error Interrupt Indicator (Read Only) + * | | |This bit is set if BUFERRIEN (UART_INTEN[5]) and HWBUFEIF (UART_INTSTS[21]) are both set to 1. + * | | |0 = No buffer error interrupt is generated in PDMA mode. + * | | |1 = Buffer error interrupt is generated in PDMA mode. + * |[30] |TXENDINT |Transmitter Empty Interrupt Indicator (Read Only) + * | | |This bit is set if TXENDIEN (UART_INTEN[22]) and TXENDIF(UART_INTSTS[22]) are both set to 1. + * | | |0 = No Transmitter Empty interrupt is generated. + * | | |1 = Transmitter Empty interrupt is generated. + * |[31] |ABRINT |Auto-baud Rate Interrupt Indicator (Read Only) + * | | |This bit is set if ABRIEN (UART_INTEN[18]) and ABRIF (UART_ALTCTL[17]) are both set to 1. + * | | |0 = No Auto-baud Rate interrupt is generated. + * | | |1 = The Auto-baud Rate interrupt is generated. + * @var UART_T::TOUT + * Offset: 0x20 UART Time-out Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |TOIC |Time-out Interrupt Comparator + * | | |The time-out counter resets and starts counting (the counting clock = baud rate) whenever the RX FIFO receives a new data word if time out counter is enabled by setting TOCNTEN (UART_INTEN[11]) + * | | |Once the content of time-out counter is equal to that of time-out interrupt comparator (TOIC (UART_TOUT[7:0])), a receiver time-out interrupt (RXTOINT(UART_INTSTS[12])) is generated if RXTOIEN (UART_INTEN [4]) enabled + * | | |A new incoming data word or RX FIFO empty will clear RXTOIF (UART_INTSTS[4]) + * | | |In order to avoid receiver time-out interrupt generation immediately during one character is being received, TOIC value should be set between 40 and 255 + * | | |So, for example, if TOIC is set with 40, the time-out interrupt is generated after four characters are not received when 1 stop bit and no parity check is set for UART transfer. + * |[15:8] |DLY |TX Delay Time Value + * | | |This field is used to programming the transfer delay time between the last stop bit and next start bit + * | | |The unit is bit time. + * @var UART_T::BAUD + * Offset: 0x24 UART Baud Rate Divider Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |BRD |Baud Rate Divider + * | | |The field indicates the baud rate divider + * | | |This filed is used in baud rate calculation + * | | |The detail description is shown in Table 6.24-4. + * |[27:24] |EDIVM1 |Extra Divider for BAUD Rate Mode 1 + * | | |This field is used for baud rate calculation in mode 1 and has no effect for baud rate calculation in mode 0 and mode 2 + * | | |The detail description is shown in Table 6.24-4 + * |[28] |BAUDM0 |BAUD Rate Mode Selection Bit 0 + * | | |This bit is baud rate mode selection bit 0 + * | | |UART provides three baud rate calculation modes + * | | |This bit combines with BAUDM1 (UART_BAUD[29]) to select baud rate calculation mode + * | | |The detail description is shown in Table 6.24-4. + * |[29] |BAUDM1 |BAUD Rate Mode Selection Bit 1 + * | | |This bit is baud rate mode selection bit 1 + * | | |UART provides three baud rate calculation modes + * | | |This bit combines with BAUDM0 (UART_BAUD[28]) to select baud rate calculation mode + * | | |The detail description is shown in Table 6.24-4. + * | | |Note: In IrDA mode must be operated in mode 0. + * @var UART_T::IRDA + * Offset: 0x28 UART IrDA Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |TXEN |IrDA Receiver/Transmitter Selection Enable Bit + * | | |0 = IrDA Transmitter Disabled and Receiver Enabled. (Default) + * | | |1 = IrDA Transmitter Enabled and Receiver Disabled. + * |[5] |TXINV |IrDA Inverse Transmitting Output Signal + * | | |0 = None inverse transmitting signal. (Default). + * | | |1 = Inverse transmitting output signal. + * | | |Note 1: Before setting this bit, TXRXDIS (UART_FUNCSEL[3]) should be set then waited for TXRXACT (UART_FIFOSTS[31]) is cleared + * | | |When the configuration is done, cleared TXRXDIS (UART_FUNCSEL[3]) to activate UART controller. + * | | |Note 2: This bit is valid when FUNCSEL (UART_FUNCSEL[2:0]) is select IrDA function. + * |[6] |RXINV |IrDA Inverse Receive Input Signal + * | | |0 = None inverse receiving input signal. + * | | |1 = Inverse receiving input signal. (Default) + * | | |Note 1: Before setting this bit, TXRXDIS (UART_FUNCSEL[3]) should be set then waited for TXRXACT (UART_FIFOSTS[31]) is cleared + * | | |When the configuration is done, cleared TXRXDIS (UART_FUNCSEL[3]) to activate UART controller. + * | | |Note 2: This bit is valid when FUNCSEL (UART_FUNCSEL[2:0]) is select IrDA function. + * @var UART_T::ALTCTL + * Offset: 0x2C UART Alternate Control/Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8] |RS485NMM |RS-485 Normal Multi-drop Operation Mode + * | | |0 = RS-485 Normal Multi-drop Operation mode (NMM) Disabled. + * | | |1 = RS-485 Normal Multi-drop Operation mode (NMM) Enabled. + * | | |Note: It cannot be active with RS-485_AAD operation mode. + * |[9] |RS485AAD |RS-485 Auto Address Detection Operation Mode + * | | |0 = RS-485 Auto Address Detection Operation mode (AAD) Disabled. + * | | |1 = RS-485 Auto Address Detection Operation mode (AAD) Enabled. + * | | |Note: It cannot be active with RS-485_NMM operation mode. + * |[10] |RS485AUD |RS-485 Auto Direction Function + * | | |0 = RS-485 Auto Direction Operation function (AUD) Disabled. + * | | |1 = RS-485 Auto Direction Operation function (AUD) Enabled. + * | | |Note: It can be active with RS-485_AAD or RS-485_NMM operation mode. + * |[15] |ADDRDEN |RS-485 Address Detection Enable Bit + * | | |This bit is used to enable RS-485 Address Detection mode. + * | | |0 = Address detection mode Disabled. + * | | |1 = Address detection mode Enabled. + * | | |Note: This bit is used for RS-485 any operation mode. + * |[17] |ABRIF |Auto-baud Rate Interrupt Flag (Read Only) + * | | |This bit is set when auto-baud rate detection function finished or the auto-baud rate counter was overflow and if ABRIEN(UART_INTEN [18]) is set then the auto-baud rate interrupt will be generated. + * | | |0 = No auto-baud rate interrupt flag is generated. + * | | |1 = Auto-baud rate interrupt flag is generated. + * | | |Note: This bit is read only, but it can be cleared by writing '1' to ABRDTOIF (UART_FIFOSTS[2]) and ABRDIF(UART_FIFOSTS[1]) + * |[18] |ABRDEN |Auto-baud Rate Detect Enable Bit + * | | |0 = Auto-baud rate detect function Disabled. + * | | |1 = Auto-baud rate detect function Enabled. + * | | |Note : This bit is cleared automatically after auto-baud detection is finished. + * |[20:19] |ABRDBITS |Auto-baud Rate Detect Bit Length + * | | |00 = 1-bit time from Start bit to the 1st rising edge. The input pattern shall be 0x01. + * | | |01 = 2-bit time from Start bit to the 1st rising edge. The input pattern shall be 0x02. + * | | |10 = 4-bit time from Start bit to the 1st rising edge. The input pattern shall be 0x08. + * | | |11 = 8-bit time from Start bit to the 1st rising edge. The input pattern shall be 0x80. + * | | |Note : The calculation of bit number includes the START bit. + * |[31:24] |ADDRMV |Address Match Value + * | | |This field contains the RS-485 address match values. + * | | |Note: This field is used for RS-485 auto address detection mode. + * @var UART_T::FUNCSEL + * Offset: 0x30 UART Function Select Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2:0] |FUNCSEL |Function Select + * | | |000 = UART function. + * | | |010 = IrDA function. + * | | |011 = RS-485 function. + * | | |100 = UART Single-wire function. + * | | |Others = Reserved. + * |[3] |TXRXDIS |TX and RX Disable Bit + * | | |Setting this bit can disable TX and RX. + * | | |0 = TX and RX Enabled. + * | | |1 = TX and RX Disabled. + * | | |Note: The TX and RX will not be disabled immediately when this bit is set + * | | |The TX and RX complete current task before disable TX and RX are disabled + * | | |When TX and RX are disabled, the TXRXACT (UART_FIFOSTS[31]) is cleared. + * @var UART_T::BRCOMP + * Offset: 0x3C UART Baud Rate Compensation Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[8:0] |BRCOMP |Baud Rate Compensation Patten + * | | |These 9-bits are used to define the relative bit is compensated or not. + * | | |BRCOMP[7:0] is used to define the compensation of DAT (UART_DAT[7:0]) and BRCOM[8] is used to define PARITY (UART_DAT[8]). + * |[31] |BRCOMPD |Baud Rate Compensation Decrease + * | | |0 = Positive (increase one module clock) compensation for each compensated bit. + * | | |1 = Negative (decrease one module clock) compensation for each compensated bit. + * @var UART_T::WKCTL + * Offset: 0x40 UART Wake-up Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WKCTSEN |nCTS Wake-up Enable Bit + * | | |0 = nCTS Wake-up system function Disabled. + * | | |1 = nCTS Wake-up system function Enabled. + * | | |Note: When the system is in Power-down mode, an external nCTS change will wake up system from Power-down mode. + * |[1] |WKDATEN |Incoming Data Wake-up Enable Bit + * | | |0 = Incoming data wake-up system function Disabled. + * | | |1 = Incoming data wake-up system function Enabled. + * | | |Note: When the system is in Power-down mode, incoming data will wake-up system from Power-down mode. + * |[2] |WKRFRTEN |Received Data FIFO Reached Threshold Wake-up Enable Bit + * | | |0 = Received Data FIFO reached threshold wake-up system function Disabled. + * | | |1 = Received Data FIFO reached threshold wake-up system function Enabled. + * | | |Note: When the system is in Power-down mode, Received Data FIFO reached threshold will wake-up system from Power-down mode. + * |[3] |WKAADEN |RS-485 Address Match Wake-up Enable Bit + * | | |0 = RS-485 Address Match (AAD mode) wake-up system function Disabled. + * | | |1 = RS-485 Address Match (AAD mode) wake-up system function Enabled. + * | | |Note 1: When the system is in .Power-down mode, RS-485 Address Match will wake -up system from Power-down mode. + * | | |Note 2: This bit is used for RS-485 Auto Address Detection (AAD) mode in RS-485 function mode and ADDRDEN (UART_ALTCTL[15]) is set to 1. + * |[4] |WKTOUTEN |Received Data FIFO Reached Threshold Time-out Wake-up Enable Bit + * | | |0 = Received Data FIFO reached threshold time-out wake-up system function Disabled. + * | | |1 = Received Data FIFO reached threshold time-out wake-up system function Enabled. + * | | |Note 1: When the system is in Power-down mode, Received Data FIFO reached threshold time-out will wake up system from Power-down mode. + * | | |Note 2: It is suggested the function is enabled when the WKRFRTEN (UART_WKCTL[2]) is set to 1. + * @var UART_T::WKSTS + * Offset: 0x44 UART Wake-up Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CTSWKF |nCTS Wake-up Flag + * | | |This bit is set if chip wake-up from power-down state by nCTS wake-up. + * | | |0 = Chip stays in power-down state. + * | | |1 = Chip wake-up from power-down state by nCTS wake-up. + * | | |Note 1: If WKCTSEN (UART_WKCTL[0]) is enabled, the nCTS wake-up cause this bit is set to '1'. + * | | |Note 2: This bit can be cleared by writing '1' to it. + * |[1] |DATWKF |Incoming Data Wake-up Flag + * | | |This bit is set if chip wake-up from power-down state by data wake-up. + * | | |0 = Chip stays in power-down state. + * | | |1 = Chip wake-up from power-down state by Incoming Data wake-up. + * | | |Note 1: If WKDATEN (UART_WKCTL[1]) is enabled, the Incoming Data wake-up cause this bit is set to '1'. + * | | |Note 2: This bit can be cleared by writing '1' to it. + * |[2] |RFRTWKF |Received Data FIFO Reached Threshold Wake-up Flag + * | | |This bit is set if chip wake-up from power-down state by Received Data FIFO reached threshold + * | | |wake-up . + * | | |0 = Chip stays in power-down state. + * | | |1 = Chip wake-up from power-down state by Received Data FIFO Reached Threshold wake-up. + * | | |Note 1: If WKRFRTEN (UART_WKCTL[2]) is enabled, the Received Data FIFO Reached Threshold wake-up cause this bit is set to '1'. + * | | |Note 2: This bit can be cleared by writing '1' to it. + * |[3] |RS485WKF |RS-485 Address Match Wake-up Flag + * | | |This bit is set if chip wake-up from power-down state by RS-485 Address Match (AAD mode). + * | | |0 = Chip stays in power-down state. + * | | |1 = Chip wake-up from power-down state by RS-485 Address Match (AAD mode) wake-up. + * | | |Note 1: If WKRS485EN (UART_WKCTL[3]) is enabled, the RS-485 Address Match (AAD mode) wake-up cause this bit is set to '1'. + * | | |Note 2: This bit can be cleared by writing '1' to it. + * |[4] |TOUTWKF |Received Data FIFO Threshold Time-out Wake-up Flag + * | | |This bit is set if chip wake-up from power-down state by Received Data FIFO Threshold Time-out wake-up. + * | | |0 = Chip stays in power-down state. + * | | |1 = Chip wake-up from power-down state by Received Data FIFO reached threshold time-out. + * | | |Note 1: If WKTOUTEN (UART_WKCTL[4]) is enabled, the Received Data FIFO reached threshold time-out wake-up cause this bit is set to '1'. + * | | |Note 2: This bit can be cleared by writing '1' to it. + * @var UART_T::DWKCOMP + * Offset: 0x48 UART Incoming Data Wake-up Compensation Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |STCOMP |Start Bit Compensation Value + * | | |These bits field indicate how many clock cycle selected by UART_CLK do the UART controller can get the 1st bit (start bit) when the device is woken up from Power-down mode. + * | | |Note: It is valid only when WKDATEN (UART_WKCTL[1]) is set. + */ + __IO uint32_t DAT; /*!< [0x0000] UART Receive/Transmit Buffer Register */ + __IO uint32_t INTEN; /*!< [0x0004] UART Interrupt Enable Register */ + __IO uint32_t FIFO; /*!< [0x0008] UART FIFO Control Register */ + __IO uint32_t LINE; /*!< [0x000c] UART Line Control Register */ + __IO uint32_t MODEM; /*!< [0x0010] UART Modem Control Register */ + __IO uint32_t MODEMSTS; /*!< [0x0014] UART Modem Status Register */ + __IO uint32_t FIFOSTS; /*!< [0x0018] UART FIFO Status Register */ + __IO uint32_t INTSTS; /*!< [0x001c] UART Interrupt Status Register */ + __IO uint32_t TOUT; /*!< [0x0020] UART Time-out Register */ + __IO uint32_t BAUD; /*!< [0x0024] UART Baud Rate Divider Register */ + __IO uint32_t IRDA; /*!< [0x0028] UART IrDA Control Register */ + __IO uint32_t ALTCTL; /*!< [0x002c] UART Alternate Control/Status Register */ + __IO uint32_t FUNCSEL; /*!< [0x0030] UART Function Select Register */ + __I uint32_t RESERVE0[2]; + __IO uint32_t BRCOMP; /*!< [0x003c] UART Baud Rate Compensation Register */ + __IO uint32_t WKCTL; /*!< [0x0040] UART Wake-up Control Register */ + __IO uint32_t WKSTS; /*!< [0x0044] UART Wake-up Status Register */ + __IO uint32_t DWKCOMP; /*!< [0x0048] UART Incoming Data Wake-up Compensation Register */ + +} UART_T; + +/** + @addtogroup UART_CONST UART Bit Field Definition + Constant Definitions for UART Controller +@{ */ + +#define UART_DAT_DAT_Pos (0) /*!< UART_T::DAT: DAT Position */ +#define UART_DAT_DAT_Msk (0xfful << UART_DAT_DAT_Pos) /*!< UART_T::DAT: DAT Mask */ + +#define UART_DAT_PARITY_Pos (8) /*!< UART_T::DAT: PARITY Position */ +#define UART_DAT_PARITY_Msk (0x1ul << UART_DAT_PARITY_Pos) /*!< UART_T::DAT: PARITY Mask */ + +#define UART_INTEN_RDAIEN_Pos (0) /*!< UART_T::INTEN: RDAIEN Position */ +#define UART_INTEN_RDAIEN_Msk (0x1ul << UART_INTEN_RDAIEN_Pos) /*!< UART_T::INTEN: RDAIEN Mask */ + +#define UART_INTEN_THREIEN_Pos (1) /*!< UART_T::INTEN: THREIEN Position */ +#define UART_INTEN_THREIEN_Msk (0x1ul << UART_INTEN_THREIEN_Pos) /*!< UART_T::INTEN: THREIEN Mask */ + +#define UART_INTEN_RLSIEN_Pos (2) /*!< UART_T::INTEN: RLSIEN Position */ +#define UART_INTEN_RLSIEN_Msk (0x1ul << UART_INTEN_RLSIEN_Pos) /*!< UART_T::INTEN: RLSIEN Mask */ + +#define UART_INTEN_MODEMIEN_Pos (3) /*!< UART_T::INTEN: MODEMIEN Position */ +#define UART_INTEN_MODEMIEN_Msk (0x1ul << UART_INTEN_MODEMIEN_Pos) /*!< UART_T::INTEN: MODEMIEN Mask */ + +#define UART_INTEN_RXTOIEN_Pos (4) /*!< UART_T::INTEN: RXTOIEN Position */ +#define UART_INTEN_RXTOIEN_Msk (0x1ul << UART_INTEN_RXTOIEN_Pos) /*!< UART_T::INTEN: RXTOIEN Mask */ + +#define UART_INTEN_BUFEIEN_Pos (5) /*!< UART_T::INTEN: BUFEIEN Position */ +#define UART_INTEN_BUFEIEN_Msk (0x1ul << UART_INTEN_BUFEIEN_Pos) /*!< UART_T::INTEN: BUFEIEN Mask */ + +#define UART_INTEN_WKIEN_Pos (6) /*!< UART_T::INTEN: WKIEN Position */ +#define UART_INTEN_WKIEN_Msk (0x1ul << UART_INTEN_WKIEN_Pos) /*!< UART_T::INTEN: WKIEN Mask */ + +#define UART_INTEN_TOCNTEN_Pos (11) /*!< UART_T::INTEN: TOCNTEN Position */ +#define UART_INTEN_TOCNTEN_Msk (0x1ul << UART_INTEN_TOCNTEN_Pos) /*!< UART_T::INTEN: TOCNTEN Mask */ + +#define UART_INTEN_ATORTSEN_Pos (12) /*!< UART_T::INTEN: ATORTSEN Position */ +#define UART_INTEN_ATORTSEN_Msk (0x1ul << UART_INTEN_ATORTSEN_Pos) /*!< UART_T::INTEN: ATORTSEN Mask */ + +#define UART_INTEN_ATOCTSEN_Pos (13) /*!< UART_T::INTEN: ATOCTSEN Position */ +#define UART_INTEN_ATOCTSEN_Msk (0x1ul << UART_INTEN_ATOCTSEN_Pos) /*!< UART_T::INTEN: ATOCTSEN Mask */ + +#define UART_INTEN_TXPDMAEN_Pos (14) /*!< UART_T::INTEN: TXPDMAEN Position */ +#define UART_INTEN_TXPDMAEN_Msk (0x1ul << UART_INTEN_TXPDMAEN_Pos) /*!< UART_T::INTEN: TXPDMAEN Mask */ + +#define UART_INTEN_RXPDMAEN_Pos (15) /*!< UART_T::INTEN: RXPDMAEN Position */ +#define UART_INTEN_RXPDMAEN_Msk (0x1ul << UART_INTEN_RXPDMAEN_Pos) /*!< UART_T::INTEN: RXPDMAEN Mask */ + +#define UART_INTEN_SWBEIEN_Pos (16) /*!< UART_T::INTEN: SWBEIEN Position */ +#define UART_INTEN_SWBEIEN_Msk (0x1ul << UART_INTEN_SWBEIEN_Pos) /*!< UART_T::INTEN: SWBEIEN Mask */ + +#define UART_INTEN_ABRIEN_Pos (18) /*!< UART_T::INTEN: ABRIEN Position */ +#define UART_INTEN_ABRIEN_Msk (0x1ul << UART_INTEN_ABRIEN_Pos) /*!< UART_T::INTEN: ABRIEN Mask */ + +#define UART_INTEN_TXENDIEN_Pos (22) /*!< UART_T::INTEN: TXENDIEN Position */ +#define UART_INTEN_TXENDIEN_Msk (0x1ul << UART_INTEN_TXENDIEN_Pos) /*!< UART_T::INTEN: TXENDIEN Mask */ + +#define UART_FIFO_RXRST_Pos (1) /*!< UART_T::FIFO: RXRST Position */ +#define UART_FIFO_RXRST_Msk (0x1ul << UART_FIFO_RXRST_Pos) /*!< UART_T::FIFO: RXRST Mask */ + +#define UART_FIFO_TXRST_Pos (2) /*!< UART_T::FIFO: TXRST Position */ +#define UART_FIFO_TXRST_Msk (0x1ul << UART_FIFO_TXRST_Pos) /*!< UART_T::FIFO: TXRST Mask */ + +#define UART_FIFO_RFITL_Pos (4) /*!< UART_T::FIFO: RFITL Position */ +#define UART_FIFO_RFITL_Msk (0xful << UART_FIFO_RFITL_Pos) /*!< UART_T::FIFO: RFITL Mask */ + +#define UART_FIFO_RXOFF_Pos (8) /*!< UART_T::FIFO: RXOFF Position */ +#define UART_FIFO_RXOFF_Msk (0x1ul << UART_FIFO_RXOFF_Pos) /*!< UART_T::FIFO: RXOFF Mask */ + +#define UART_FIFO_RTSTRGLV_Pos (16) /*!< UART_T::FIFO: RTSTRGLV Position */ +#define UART_FIFO_RTSTRGLV_Msk (0xful << UART_FIFO_RTSTRGLV_Pos) /*!< UART_T::FIFO: RTSTRGLV Mask */ + +#define UART_LINE_WLS_Pos (0) /*!< UART_T::LINE: WLS Position */ +#define UART_LINE_WLS_Msk (0x3ul << UART_LINE_WLS_Pos) /*!< UART_T::LINE: WLS Mask */ + +#define UART_LINE_NSB_Pos (2) /*!< UART_T::LINE: NSB Position */ +#define UART_LINE_NSB_Msk (0x1ul << UART_LINE_NSB_Pos) /*!< UART_T::LINE: NSB Mask */ + +#define UART_LINE_PBE_Pos (3) /*!< UART_T::LINE: PBE Position */ +#define UART_LINE_PBE_Msk (0x1ul << UART_LINE_PBE_Pos) /*!< UART_T::LINE: PBE Mask */ + +#define UART_LINE_EPE_Pos (4) /*!< UART_T::LINE: EPE Position */ +#define UART_LINE_EPE_Msk (0x1ul << UART_LINE_EPE_Pos) /*!< UART_T::LINE: EPE Mask */ + +#define UART_LINE_SPE_Pos (5) /*!< UART_T::LINE: SPE Position */ +#define UART_LINE_SPE_Msk (0x1ul << UART_LINE_SPE_Pos) /*!< UART_T::LINE: SPE Mask */ + +#define UART_LINE_BCB_Pos (6) /*!< UART_T::LINE: BCB Position */ +#define UART_LINE_BCB_Msk (0x1ul << UART_LINE_BCB_Pos) /*!< UART_T::LINE: BCB Mask */ + +#define UART_LINE_PSS_Pos (7) /*!< UART_T::LINE: PSS Position */ +#define UART_LINE_PSS_Msk (0x1ul << UART_LINE_PSS_Pos) /*!< UART_T::LINE: PSS Mask */ + +#define UART_LINE_TXDINV_Pos (8) /*!< UART_T::LINE: TXDINV Position */ +#define UART_LINE_TXDINV_Msk (0x1ul << UART_LINE_TXDINV_Pos) /*!< UART_T::LINE: TXDINV Mask */ + +#define UART_LINE_RXDINV_Pos (9) /*!< UART_T::LINE: RXDINV Position */ +#define UART_LINE_RXDINV_Msk (0x1ul << UART_LINE_RXDINV_Pos) /*!< UART_T::LINE: RXDINV Mask */ + +#define UART_MODEM_RTS_Pos (1) /*!< UART_T::MODEM: RTS Position */ +#define UART_MODEM_RTS_Msk (0x1ul << UART_MODEM_RTS_Pos) /*!< UART_T::MODEM: RTS Mask */ + +#define UART_MODEM_RTSACTLV_Pos (9) /*!< UART_T::MODEM: RTSACTLV Position */ +#define UART_MODEM_RTSACTLV_Msk (0x1ul << UART_MODEM_RTSACTLV_Pos) /*!< UART_T::MODEM: RTSACTLV Mask */ + +#define UART_MODEM_RTSSTS_Pos (13) /*!< UART_T::MODEM: RTSSTS Position */ +#define UART_MODEM_RTSSTS_Msk (0x1ul << UART_MODEM_RTSSTS_Pos) /*!< UART_T::MODEM: RTSSTS Mask */ + +#define UART_MODEMSTS_CTSDETF_Pos (0) /*!< UART_T::MODEMSTS: CTSDETF Position */ +#define UART_MODEMSTS_CTSDETF_Msk (0x1ul << UART_MODEMSTS_CTSDETF_Pos) /*!< UART_T::MODEMSTS: CTSDETF Mask */ + +#define UART_MODEMSTS_CTSSTS_Pos (4) /*!< UART_T::MODEMSTS: CTSSTS Position */ +#define UART_MODEMSTS_CTSSTS_Msk (0x1ul << UART_MODEMSTS_CTSSTS_Pos) /*!< UART_T::MODEMSTS: CTSSTS Mask */ + +#define UART_MODEMSTS_CTSACTLV_Pos (8) /*!< UART_T::MODEMSTS: CTSACTLV Position */ +#define UART_MODEMSTS_CTSACTLV_Msk (0x1ul << UART_MODEMSTS_CTSACTLV_Pos) /*!< UART_T::MODEMSTS: CTSACTLV Mask */ + +#define UART_FIFOSTS_RXOVIF_Pos (0) /*!< UART_T::FIFOSTS: RXOVIF Position */ +#define UART_FIFOSTS_RXOVIF_Msk (0x1ul << UART_FIFOSTS_RXOVIF_Pos) /*!< UART_T::FIFOSTS: RXOVIF Mask */ + +#define UART_FIFOSTS_ABRDIF_Pos (1) /*!< UART_T::FIFOSTS: ABRDIF Position */ +#define UART_FIFOSTS_ABRDIF_Msk (0x1ul << UART_FIFOSTS_ABRDIF_Pos) /*!< UART_T::FIFOSTS: ABRDIF Mask */ + +#define UART_FIFOSTS_ABRDTOIF_Pos (2) /*!< UART_T::FIFOSTS: ABRDTOIF Position */ +#define UART_FIFOSTS_ABRDTOIF_Msk (0x1ul << UART_FIFOSTS_ABRDTOIF_Pos) /*!< UART_T::FIFOSTS: ABRDTOIF Mask */ + +#define UART_FIFOSTS_ADDRDETF_Pos (3) /*!< UART_T::FIFOSTS: ADDRDETF Position */ +#define UART_FIFOSTS_ADDRDETF_Msk (0x1ul << UART_FIFOSTS_ADDRDETF_Pos) /*!< UART_T::FIFOSTS: ADDRDETF Mask */ + +#define UART_FIFOSTS_PEF_Pos (4) /*!< UART_T::FIFOSTS: PEF Position */ +#define UART_FIFOSTS_PEF_Msk (0x1ul << UART_FIFOSTS_PEF_Pos) /*!< UART_T::FIFOSTS: PEF Mask */ + +#define UART_FIFOSTS_FEF_Pos (5) /*!< UART_T::FIFOSTS: FEF Position */ +#define UART_FIFOSTS_FEF_Msk (0x1ul << UART_FIFOSTS_FEF_Pos) /*!< UART_T::FIFOSTS: FEF Mask */ + +#define UART_FIFOSTS_BIF_Pos (6) /*!< UART_T::FIFOSTS: BIF Position */ +#define UART_FIFOSTS_BIF_Msk (0x1ul << UART_FIFOSTS_BIF_Pos) /*!< UART_T::FIFOSTS: BIF Mask */ + +#define UART_FIFOSTS_RXPTR_Pos (8) /*!< UART_T::FIFOSTS: RXPTR Position */ +#define UART_FIFOSTS_RXPTR_Msk (0x3ful << UART_FIFOSTS_RXPTR_Pos) /*!< UART_T::FIFOSTS: RXPTR Mask */ + +#define UART_FIFOSTS_RXEMPTY_Pos (14) /*!< UART_T::FIFOSTS: RXEMPTY Position */ +#define UART_FIFOSTS_RXEMPTY_Msk (0x1ul << UART_FIFOSTS_RXEMPTY_Pos) /*!< UART_T::FIFOSTS: RXEMPTY Mask */ + +#define UART_FIFOSTS_RXFULL_Pos (15) /*!< UART_T::FIFOSTS: RXFULL Position */ +#define UART_FIFOSTS_RXFULL_Msk (0x1ul << UART_FIFOSTS_RXFULL_Pos) /*!< UART_T::FIFOSTS: RXFULL Mask */ + +#define UART_FIFOSTS_TXPTR_Pos (16) /*!< UART_T::FIFOSTS: TXPTR Position */ +#define UART_FIFOSTS_TXPTR_Msk (0x3ful << UART_FIFOSTS_TXPTR_Pos) /*!< UART_T::FIFOSTS: TXPTR Mask */ + +#define UART_FIFOSTS_TXEMPTY_Pos (22) /*!< UART_T::FIFOSTS: TXEMPTY Position */ +#define UART_FIFOSTS_TXEMPTY_Msk (0x1ul << UART_FIFOSTS_TXEMPTY_Pos) /*!< UART_T::FIFOSTS: TXEMPTY Mask */ + +#define UART_FIFOSTS_TXFULL_Pos (23) /*!< UART_T::FIFOSTS: TXFULL Position */ +#define UART_FIFOSTS_TXFULL_Msk (0x1ul << UART_FIFOSTS_TXFULL_Pos) /*!< UART_T::FIFOSTS: TXFULL Mask */ + +#define UART_FIFOSTS_TXOVIF_Pos (24) /*!< UART_T::FIFOSTS: TXOVIF Position */ +#define UART_FIFOSTS_TXOVIF_Msk (0x1ul << UART_FIFOSTS_TXOVIF_Pos) /*!< UART_T::FIFOSTS: TXOVIF Mask */ + +#define UART_FIFOSTS_TXEMPTYF_Pos (28) /*!< UART_T::FIFOSTS: TXEMPTYF Position */ +#define UART_FIFOSTS_TXEMPTYF_Msk (0x1ul << UART_FIFOSTS_TXEMPTYF_Pos) /*!< UART_T::FIFOSTS: TXEMPTYF Mask */ + +#define UART_FIFOSTS_RXIDLE_Pos (29) /*!< UART_T::FIFOSTS: RXIDLE Position */ +#define UART_FIFOSTS_RXIDLE_Msk (0x1ul << UART_FIFOSTS_RXIDLE_Pos) /*!< UART_T::FIFOSTS: RXIDLE Mask */ + +#define UART_FIFOSTS_TXRXACT_Pos (31) /*!< UART_T::FIFOSTS: TXRXACT Position */ +#define UART_FIFOSTS_TXRXACT_Msk (0x1ul << UART_FIFOSTS_TXRXACT_Pos) /*!< UART_T::FIFOSTS: TXRXACT Mask */ + +#define UART_INTSTS_RDAIF_Pos (0) /*!< UART_T::INTSTS: RDAIF Position */ +#define UART_INTSTS_RDAIF_Msk (0x1ul << UART_INTSTS_RDAIF_Pos) /*!< UART_T::INTSTS: RDAIF Mask */ + +#define UART_INTSTS_THREIF_Pos (1) /*!< UART_T::INTSTS: THREIF Position */ +#define UART_INTSTS_THREIF_Msk (0x1ul << UART_INTSTS_THREIF_Pos) /*!< UART_T::INTSTS: THREIF Mask */ + +#define UART_INTSTS_RLSIF_Pos (2) /*!< UART_T::INTSTS: RLSIF Position */ +#define UART_INTSTS_RLSIF_Msk (0x1ul << UART_INTSTS_RLSIF_Pos) /*!< UART_T::INTSTS: RLSIF Mask */ + +#define UART_INTSTS_MODEMIF_Pos (3) /*!< UART_T::INTSTS: MODEMIF Position */ +#define UART_INTSTS_MODEMIF_Msk (0x1ul << UART_INTSTS_MODEMIF_Pos) /*!< UART_T::INTSTS: MODEMIF Mask */ + +#define UART_INTSTS_RXTOIF_Pos (4) /*!< UART_T::INTSTS: RXTOIF Position */ +#define UART_INTSTS_RXTOIF_Msk (0x1ul << UART_INTSTS_RXTOIF_Pos) /*!< UART_T::INTSTS: RXTOIF Mask */ + +#define UART_INTSTS_BUFEIF_Pos (5) /*!< UART_T::INTSTS: BUFEIF Position */ +#define UART_INTSTS_BUFEIF_Msk (0x1ul << UART_INTSTS_BUFEIF_Pos) /*!< UART_T::INTSTS: BUFEIF Mask */ + +#define UART_INTSTS_WKIF_Pos (6) /*!< UART_T::INTSTS: WKIF Position */ +#define UART_INTSTS_WKIF_Msk (0x1ul << UART_INTSTS_WKIF_Pos) /*!< UART_T::INTSTS: WKIF Mask */ + +#define UART_INTSTS_RDAINT_Pos (8) /*!< UART_T::INTSTS: RDAINT Position */ +#define UART_INTSTS_RDAINT_Msk (0x1ul << UART_INTSTS_RDAINT_Pos) /*!< UART_T::INTSTS: RDAINT Mask */ + +#define UART_INTSTS_THREINT_Pos (9) /*!< UART_T::INTSTS: THREINT Position */ +#define UART_INTSTS_THREINT_Msk (0x1ul << UART_INTSTS_THREINT_Pos) /*!< UART_T::INTSTS: THREINT Mask */ + +#define UART_INTSTS_RLSINT_Pos (10) /*!< UART_T::INTSTS: RLSINT Position */ +#define UART_INTSTS_RLSINT_Msk (0x1ul << UART_INTSTS_RLSINT_Pos) /*!< UART_T::INTSTS: RLSINT Mask */ + +#define UART_INTSTS_MODEMINT_Pos (11) /*!< UART_T::INTSTS: MODEMINT Position */ +#define UART_INTSTS_MODEMINT_Msk (0x1ul << UART_INTSTS_MODEMINT_Pos) /*!< UART_T::INTSTS: MODEMINT Mask */ + +#define UART_INTSTS_RXTOINT_Pos (12) /*!< UART_T::INTSTS: RXTOINT Position */ +#define UART_INTSTS_RXTOINT_Msk (0x1ul << UART_INTSTS_RXTOINT_Pos) /*!< UART_T::INTSTS: RXTOINT Mask */ + +#define UART_INTSTS_BUFEINT_Pos (13) /*!< UART_T::INTSTS: BUFEINT Position */ +#define UART_INTSTS_BUFEINT_Msk (0x1ul << UART_INTSTS_BUFEINT_Pos) /*!< UART_T::INTSTS: BUFEINT Mask */ + +#define UART_INTSTS_WKINT_Pos (14) /*!< UART_T::INTSTS: WKINT Position */ +#define UART_INTSTS_WKINT_Msk (0x1ul << UART_INTSTS_WKINT_Pos) /*!< UART_T::INTSTS: WKINT Mask */ + +#define UART_INTSTS_SWBEIF_Pos (16) /*!< UART_T::INTSTS: SWBEIF Position */ +#define UART_INTSTS_SWBEIF_Msk (0x1ul << UART_INTSTS_SWBEIF_Pos) /*!< UART_T::INTSTS: SWBEIF Mask */ + +#define UART_INTSTS_PRLSIF_Pos (18) /*!< UART_T::INTSTS: PRLSIF Position */ +#define UART_INTSTS_PRLSIF_Msk (0x1ul << UART_INTSTS_PRLSIF_Pos) /*!< UART_T::INTSTS: PRLSIF Mask */ + +#define UART_INTSTS_PMODIF_Pos (19) /*!< UART_T::INTSTS: PMODIF Position */ +#define UART_INTSTS_PMODIF_Msk (0x1ul << UART_INTSTS_PMODIF_Pos) /*!< UART_T::INTSTS: PMODIF Mask */ + +#define UART_INTSTS_PTOIF_Pos (20) /*!< UART_T::INTSTS: PTOIF Position */ +#define UART_INTSTS_PTOIF_Msk (0x1ul << UART_INTSTS_PTOIF_Pos) /*!< UART_T::INTSTS: PTOIF Mask */ + +#define UART_INTSTS_PBUFEIF_Pos (21) /*!< UART_T::INTSTS: PBUFEIF Position */ +#define UART_INTSTS_PBUFEIF_Msk (0x1ul << UART_INTSTS_PBUFEIF_Pos) /*!< UART_T::INTSTS: PBUFEIF Mask */ + +#define UART_INTSTS_TXENDIF_Pos (22) /*!< UART_T::INTSTS: TXENDIF Position */ +#define UART_INTSTS_TXENDIF_Msk (0x1ul << UART_INTSTS_TXENDIF_Pos) /*!< UART_T::INTSTS: TXENDIF Mask */ + +#define UART_INTSTS_SWBEINT_Pos (24) /*!< UART_T::INTSTS: SWBEINT Position */ +#define UART_INTSTS_SWBEINT_Msk (0x1ul << UART_INTSTS_SWBEINT_Pos) /*!< UART_T::INTSTS: SWBEINT Mask */ + +#define UART_INTSTS_PRLSINT_Pos (26) /*!< UART_T::INTSTS: PRLSINT Position */ +#define UART_INTSTS_PRLSINT_Msk (0x1ul << UART_INTSTS_PRLSINT_Pos) /*!< UART_T::INTSTS: PRLSINT Mask */ + +#define UART_INTSTS_PMODINT_Pos (27) /*!< UART_T::INTSTS: PMODINT Position */ +#define UART_INTSTS_PMODINT_Msk (0x1ul << UART_INTSTS_PMODINT_Pos) /*!< UART_T::INTSTS: PMODINT Mask */ + +#define UART_INTSTS_PTOINT_Pos (28) /*!< UART_T::INTSTS: PTOINT Position */ +#define UART_INTSTS_PTOINT_Msk (0x1ul << UART_INTSTS_PTOINT_Pos) /*!< UART_T::INTSTS: PTOINT Mask */ + +#define UART_INTSTS_PBUFEINT_Pos (29) /*!< UART_T::INTSTS: PBUFEINT Position */ +#define UART_INTSTS_PBUFEINT_Msk (0x1ul << UART_INTSTS_PBUFEINT_Pos) /*!< UART_T::INTSTS: PBUFEINT Mask */ + +#define UART_INTSTS_TXENDINT_Pos (30) /*!< UART_T::INTSTS: TXENDINT Position */ +#define UART_INTSTS_TXENDINT_Msk (0x1ul << UART_INTSTS_TXENDINT_Pos) /*!< UART_T::INTSTS: TXENDINT Mask */ + +#define UART_INTSTS_ABRINT_Pos (31) /*!< UART_T::INTSTS: ABRINT Position */ +#define UART_INTSTS_ABRINT_Msk (0x1ul << UART_INTSTS_ABRINT_Pos) /*!< UART_T::INTSTS: ABRINT Mask */ + +#define UART_TOUT_TOIC_Pos (0) /*!< UART_T::TOUT: TOIC Position */ +#define UART_TOUT_TOIC_Msk (0xfful << UART_TOUT_TOIC_Pos) /*!< UART_T::TOUT: TOIC Mask */ + +#define UART_TOUT_DLY_Pos (8) /*!< UART_T::TOUT: DLY Position */ +#define UART_TOUT_DLY_Msk (0xfful << UART_TOUT_DLY_Pos) /*!< UART_T::TOUT: DLY Mask */ + +#define UART_BAUD_BRD_Pos (0) /*!< UART_T::BAUD: BRD Position */ +#define UART_BAUD_BRD_Msk (0xfffful << UART_BAUD_BRD_Pos) /*!< UART_T::BAUD: BRD Mask */ + +#define UART_BAUD_EDIVM1_Pos (24) /*!< UART_T::BAUD: EDIVM1 Position */ +#define UART_BAUD_EDIVM1_Msk (0xful << UART_BAUD_EDIVM1_Pos) /*!< UART_T::BAUD: EDIVM1 Mask */ + +#define UART_BAUD_BAUDM0_Pos (28) /*!< UART_T::BAUD: BAUDM0 Position */ +#define UART_BAUD_BAUDM0_Msk (0x1ul << UART_BAUD_BAUDM0_Pos) /*!< UART_T::BAUD: BAUDM0 Mask */ + +#define UART_BAUD_BAUDM1_Pos (29) /*!< UART_T::BAUD: BAUDM1 Position */ +#define UART_BAUD_BAUDM1_Msk (0x1ul << UART_BAUD_BAUDM1_Pos) /*!< UART_T::BAUD: BAUDM1 Mask */ + +#define UART_IRDA_TXEN_Pos (1) /*!< UART_T::IRDA: TXEN Position */ +#define UART_IRDA_TXEN_Msk (0x1ul << UART_IRDA_TXEN_Pos) /*!< UART_T::IRDA: TXEN Mask */ + +#define UART_IRDA_TXINV_Pos (5) /*!< UART_T::IRDA: TXINV Position */ +#define UART_IRDA_TXINV_Msk (0x1ul << UART_IRDA_TXINV_Pos) /*!< UART_T::IRDA: TXINV Mask */ + +#define UART_IRDA_RXINV_Pos (6) /*!< UART_T::IRDA: RXINV Position */ +#define UART_IRDA_RXINV_Msk (0x1ul << UART_IRDA_RXINV_Pos) /*!< UART_T::IRDA: RXINV Mask */ + +#define UART_ALTCTL_RS485NMM_Pos (8) /*!< UART_T::ALTCTL: RS485NMM Position */ +#define UART_ALTCTL_RS485NMM_Msk (0x1ul << UART_ALTCTL_RS485NMM_Pos) /*!< UART_T::ALTCTL: RS485NMM Mask */ + +#define UART_ALTCTL_RS485AAD_Pos (9) /*!< UART_T::ALTCTL: RS485AAD Position */ +#define UART_ALTCTL_RS485AAD_Msk (0x1ul << UART_ALTCTL_RS485AAD_Pos) /*!< UART_T::ALTCTL: RS485AAD Mask */ + +#define UART_ALTCTL_RS485AUD_Pos (10) /*!< UART_T::ALTCTL: RS485AUD Position */ +#define UART_ALTCTL_RS485AUD_Msk (0x1ul << UART_ALTCTL_RS485AUD_Pos) /*!< UART_T::ALTCTL: RS485AUD Mask */ + +#define UART_ALTCTL_ADDRDEN_Pos (15) /*!< UART_T::ALTCTL: ADDRDEN Position */ +#define UART_ALTCTL_ADDRDEN_Msk (0x1ul << UART_ALTCTL_ADDRDEN_Pos) /*!< UART_T::ALTCTL: ADDRDEN Mask */ + +#define UART_ALTCTL_ABRIF_Pos (17) /*!< UART_T::ALTCTL: ABRIF Position */ +#define UART_ALTCTL_ABRIF_Msk (0x1ul << UART_ALTCTL_ABRIF_Pos) /*!< UART_T::ALTCTL: ABRIF Mask */ + +#define UART_ALTCTL_ABRDEN_Pos (18) /*!< UART_T::ALTCTL: ABRDEN Position */ +#define UART_ALTCTL_ABRDEN_Msk (0x1ul << UART_ALTCTL_ABRDEN_Pos) /*!< UART_T::ALTCTL: ABRDEN Mask */ + +#define UART_ALTCTL_ABRDBITS_Pos (19) /*!< UART_T::ALTCTL: ABRDBITS Position */ +#define UART_ALTCTL_ABRDBITS_Msk (0x3ul << UART_ALTCTL_ABRDBITS_Pos) /*!< UART_T::ALTCTL: ABRDBITS Mask */ + +#define UART_ALTCTL_ADDRMV_Pos (24) /*!< UART_T::ALTCTL: ADDRMV Position */ +#define UART_ALTCTL_ADDRMV_Msk (0xfful << UART_ALTCTL_ADDRMV_Pos) /*!< UART_T::ALTCTL: ADDRMV Mask */ + +#define UART_FUNCSEL_FUNCSEL_Pos (0) /*!< UART_T::FUNCSEL: FUNCSEL Position */ +#define UART_FUNCSEL_FUNCSEL_Msk (0x7ul << UART_FUNCSEL_FUNCSEL_Pos) /*!< UART_T::FUNCSEL: FUNCSEL Mask */ + +#define UART_FUNCSEL_TXRXDIS_Pos (3) /*!< UART_T::FUNCSEL: TXRXDIS Position */ +#define UART_FUNCSEL_TXRXDIS_Msk (0x1ul << UART_FUNCSEL_TXRXDIS_Pos) /*!< UART_T::FUNCSEL: TXRXDIS Mask */ + +#define UART_BRCOMP_BRCOMP_Pos (0) /*!< UART_T::BRCOMP: BRCOMP Position */ +#define UART_BRCOMP_BRCOMP_Msk (0x1fful << UART_BRCOMP_BRCOMP_Pos) /*!< UART_T::BRCOMP: BRCOMP Mask */ + +#define UART_BRCOMP_BRCOMPD_Pos (31) /*!< UART_T::BRCOMP: BRCOMPD Position */ +#define UART_BRCOMP_BRCOMPD_Msk (0x1ul << UART_BRCOMP_BRCOMPD_Pos) /*!< UART_T::BRCOMP: BRCOMPD Mask */ + +#define UART_WKCTL_WKCTSEN_Pos (0) /*!< UART_T::WKCTL: WKCTSEN Position */ +#define UART_WKCTL_WKCTSEN_Msk (0x1ul << UART_WKCTL_WKCTSEN_Pos) /*!< UART_T::WKCTL: WKCTSEN Mask */ + +#define UART_WKCTL_WKDATEN_Pos (1) /*!< UART_T::WKCTL: WKDATEN Position */ +#define UART_WKCTL_WKDATEN_Msk (0x1ul << UART_WKCTL_WKDATEN_Pos) /*!< UART_T::WKCTL: WKDATEN Mask */ + +#define UART_WKCTL_WKRFRTEN_Pos (2) /*!< UART_T::WKCTL: WKRFRTEN Position */ +#define UART_WKCTL_WKRFRTEN_Msk (0x1ul << UART_WKCTL_WKRFRTEN_Pos) /*!< UART_T::WKCTL: WKRFRTEN Mask */ + +#define UART_WKCTL_WKAADEN_Pos (3) /*!< UART_T::WKCTL: WKAADEN Position */ +#define UART_WKCTL_WKAADEN_Msk (0x1ul << UART_WKCTL_WKAADEN_Pos) /*!< UART_T::WKCTL: WKAADEN Mask */ + +#define UART_WKCTL_WKTOUTEN_Pos (4) /*!< UART_T::WKCTL: WKTOUTEN Position */ +#define UART_WKCTL_WKTOUTEN_Msk (0x1ul << UART_WKCTL_WKTOUTEN_Pos) /*!< UART_T::WKCTL: WKTOUTEN Mask */ + +#define UART_WKSTS_CTSWKF_Pos (0) /*!< UART_T::WKSTS: CTSWKF Position */ +#define UART_WKSTS_CTSWKF_Msk (0x1ul << UART_WKSTS_CTSWKF_Pos) /*!< UART_T::WKSTS: CTSWKF Mask */ + +#define UART_WKSTS_DATWKF_Pos (1) /*!< UART_T::WKSTS: DATWKF Position */ +#define UART_WKSTS_DATWKF_Msk (0x1ul << UART_WKSTS_DATWKF_Pos) /*!< UART_T::WKSTS: DATWKF Mask */ + +#define UART_WKSTS_RFRTWKF_Pos (2) /*!< UART_T::WKSTS: RFRTWKF Position */ +#define UART_WKSTS_RFRTWKF_Msk (0x1ul << UART_WKSTS_RFRTWKF_Pos) /*!< UART_T::WKSTS: RFRTWKF Mask */ + +#define UART_WKSTS_RS485WKF_Pos (3) /*!< UART_T::WKSTS: RS485WKF Position */ +#define UART_WKSTS_RS485WKF_Msk (0x1ul << UART_WKSTS_RS485WKF_Pos) /*!< UART_T::WKSTS: RS485WKF Mask */ + +#define UART_WKSTS_TOUTWKF_Pos (4) /*!< UART_T::WKSTS: TOUTWKF Position */ +#define UART_WKSTS_TOUTWKF_Msk (0x1ul << UART_WKSTS_TOUTWKF_Pos) /*!< UART_T::WKSTS: TOUTWKF Mask */ + +#define UART_DWKCOMP_STCOMP_Pos (0) /*!< UART_T::DWKCOMP: STCOMP Position */ +#define UART_DWKCOMP_STCOMP_Msk (0xfffful << UART_DWKCOMP_STCOMP_Pos) /*!< UART_T::DWKCOMP: STCOMP Mask */ + +/**@}*/ /* UART_CONST */ +/**@}*/ /* end of UART register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __UART_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/umctl2_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/umctl2_reg.h new file mode 100644 index 0000000000..e886370146 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/umctl2_reg.h @@ -0,0 +1,3918 @@ +/**************************************************************************//** + * @file umctl2_reg.h + * @brief UMCTL2 register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __UMCTL2_REG_H__ +#define __UMCTL2_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** @addtogroup REGISTER Control Register + + @{ + +*/ + + +/*---------------------- DDR Memory Controller -------------------------*/ +/** + @addtogroup UMCTL2 DDR Memory Controller (UMCTL2) + Memory Mapped Structure for UMCTL2 Controller +@{ */ + +typedef struct +{ + + + /** + * @var UMCTL2_T::MSTR + * Offset: 0x00 Master Register0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |ddr3 |DDR3 SDRAM Type Enable Bit + * | | |Selects DDR3 SDRAM. + * | | |u00B7 1 - DDR3 SDRAM device in use + * | | |u00B7 0 - non-DDR3 SDRAM device in use + * | | |Present only in designs configured to support DDR3. + * | | |Programming Mode: Static + * |[9] |burstchop |Burst-Chop Enable Bit + * | | |When this bit is set, enables burst-chop (BC4 or 8 on-the-fly) in DDR3. + * | | |Burst Chop for reads is exercised only: + * | | |u00B7 If in full bus width mode (MSTR.data_bus_width = 00) + * | | |Burst Chop for writes is exercised only: + * | | |u00B7 If CRC is disabled (CRCPARCTL1.crc_enable = 0) + * | | |BC4 (fixed) mode is not supported. + * | | |Programming Mode: Static + * |[10] |en_2t_timing_mode|2T Timing Mode Enable Bit + * | | |If 1, then uMCTL2 uses 2T timing, otherwise uses 1T timing. + * | | |In 2T timing, all command signals (except chip select) are held for 2 clocks on the SDRAM bus + * | | |Chip select is asserted on the second cycle of the command. + * | | |Programming Mode: Static + * |[13:12] |data_bus_width|DQ Bus Width + * | | |Selects proportion of DQ bus width that is used by the SDRAM. + * | | |u00B7 00 - Full DQ bus width to SDRAM + * | | |u00B7 01 - Half DQ bus width to SDRAM + * | | |u00B7 10 - Reserved + * | | |u00B7 11 - Reserved + * | | |Note that half bus width mode is only supported when the SDRAM bus width is a multiple of 16 + * | | |Bus width refers to DQ bus width (excluding any ECC width). + * | | |Programming Mode: Static + * |[15] |dll_off_mode|DLL Off Mode Enable Bit + * | | |u00B7 1 - When the uMCTL2 and DRAM has to be put in DLL-off mode for low frequency operation + * | | |u00B7 0 - To put uMCTL2 and DRAM in DLL-on mode for normal frequency operation + * | | |Programming Mode: Quasi-dynamic Group 2 + * |[19:16] |burst_rdwr|Burst Length for Read and Write + * | | |Indicates SDRAM burst length used: + * | | |u00B7 0010 - Burst length of 4 + * | | |u00B7 0100 - Burst length of 8 + * | | |All other values are reserved. + * | | |This bit controls the burst size used to access the SDRAM + * | | |This must match the burst length mode register setting in the SDRAM + * | | |(For BC4/8 on-the-fly mode of DDR3, set this field to 0x0100) Burst length of 2 is not supported with AXI ports when MEMC_BURST_LENGTH is 8. + * | | |Burst length of 2 is only supported when the controller is operating in 1:1 frequency mode. + * | | |For DDR3, this must be set to 0x0100 (BL8). + * | | |Programming Mode: Static + * |[25:24] |active_ranks|Active Ranks + * | | |u00B7 01 - One rank + * | | |u00B7 11 - Two ranks + * | | |u00B7 Others - Reserved + * | | |Programming Mode: Static + * @var UMCTL2_T::STAT + * Offset: 0x04 Operating Mode Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |operating_mode|Operating Mode + * | | |u00B7 00 - Init + * | | |u00B7 01 - Normal + * | | |u00B7 10 - Power-down + * | | |u00B7 11 - Self-refresh + * | | |Programming Mode: Static + * |[5:4] |selfref_type|Self-Refresh Type + * | | |Flags if self-refresh is entered, and if it is under automatic self-refresh control only or not. + * | | |u00B7 00 - SDRAM is not in self-refresh + * | | |If retry is enabled by CRCPARCTL1.crc_parity_retry_enable, this also indicates that the SRE command is still in parity error window or retry is in-progress. + * | | |u00B7 11 - SDRAM is in self-refresh, which was caused by Automatic self-refresh only + * | | |If retry is enabled, this ensures that the SRE command is executed correctly without parity error. + * | | |u00B7 10 - SDRAM is in self-refresh, which was not caused solely under automatic self-refresh control + * | | |It could have been caused by Hardware Low Power Interface and/or Software (PWRCTL.selfref_sw) + * | | |If retry is enabled, this ensures that the SRE command is executed correctly without parity error. + * | | |u00B7 01 - SDRAM is in self-refresh, which is caused by PHY Master Request. + * | | |Programming Mode: Static + * |[12] |selfref_cam_not_empty|Self-Refresh with CAMs Not Empty. + * | | |Set to 1 when self-refresh is entered but CAMs are not drained. + * | | |Cleared after exiting self-refresh. + * | | |Programming Mode: Static + * @var UMCTL2_T::MRCTRL0 + * Offset: 0x10 Mode Register Read/Write Control Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:4] |mr_rank |Mode Register Accessing Rank + * | | |Controls which rank is accessed by MRCTRL0.mr_wr. + * | | |Normally, it is desired to access all ranks, so all bits must be set to 1. + * | | |Examples (assuming uMCTL2 is configured for 2 ranks): + * | | |u00B7 0x1 - Select rank 0 only + * | | |u00B7 0x2 - Select rank 1 only + * | | |u00B7 0x3 - Select ranks 0 and 1 + * | | |Programming Mode: Dynamic + * |[15:12] |mr_addr |Mode Register Address + * | | |Address of the mode register that is to be written to. + * | | |u00B7 0000 - MR0 + * | | |u00B7 0001 - MR1 + * | | |u00B7 0010 - MR2 + * | | |u00B7 0011 - MR3 + * | | |u00B7 0100 - MR4 + * | | |u00B7 0101 - MR5 + * | | |u00B7 0110 - MR6 + * | | |u00B7 0111 - MR7 + * | | |Programming Mode: Dynamic + * |[31] |mr_wr |Mode Register Read or Write Operation Trigger + * | | |Setting this register bit to 1 triggers a mode register read or write operation. + * | | |When the MR operation is complete, the uMCTL2 automatically clears this bit. + * | | |The other fields of this register must be written in a separate APB transaction, before setting this mr_wr bit. + * | | |It is recommended NOT to set this signal if in Init, Deep power-down, or MPSM operating modes. + * | | |Testable: readOnly + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::MRCTRL1 + * Offset: 0x14 Mode Register Read/Write Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |mr_data |Mode Register Write Data + * | | |Mode register write data for all DDR2/DDR3 modes. + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::MRSTAT + * Offset: 0x18 Mode Register Read/Write Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |mr_wr_busy|Mode Register Write Busy + * | | |The SoC might initiate a MR write operation only if this signal is low. + * | | |This signal goes: + * | | |u00B7 High in the clock after the uMCTL2 accepts the MRW/MRR request + * | | |u00B7 Low when the MRW/MRR command is issued to the SDRAM + * | | |It is recommended not to perform MRW/MRR commands when 'MRSTAT.mr_wr_busy' is high. + * | | |u00B7 0 - Indicates that the SoC can initiate a mode register write operation + * | | |u00B7 1 - Indicates that mode register write operation is in progress + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::PWRCTL + * Offset: 0x30 Low Power Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |selfref_en|Self-Refresh Enable Bit + * | | |If it is true, then the uMCTL2 puts the SDRAM into self-refresh after a programmable number of cycles "maximum idle clocks before self-refresh (PWRTMG.selfref_to_x32)". + * | | |This register bit may be re-programmed during the course of normal operation. + * | | |Programming Mode: Dynamic + * |[1] |powerdown_en|Power-Down Enable Bit + * | | |If it is true, then the uMCTL2 goes into power-down after a programmable number of cycles "maximum idle clocks before power down" (PWRTMG.powerdown_to_x32). + * | | |This register bit may be re-programmed during the course of normal operation. + * | | |Programming Mode: Dynamic + * |[3] |en_dfi_dram_clk_disable|dfi_dram_clk_disable Enable Bit + * | | |Enables the assertion of dfi_dram_clk_disable whenever a clock is not required by the SDRAM. + * | | |If set to 0, dfi_dram_clk_disable is never asserted. + * | | |Assertion of dfi_dram_clk_disable is as follows: + * | | |In DDR2/DDR3, can only be asserted in self-refresh. + * | | |Programming Mode: Dynamic + * |[5] |selfref_sw|Self-Refresh Entry/Exit by Software + * | | |A value of 1 to this register causes system to move to self-refresh state immediately, as long as it is not in INIT or DPD/MPSM operating_mode. + * | | |This is referred to as Software Entry/Exit to self-refresh. + * | | |u00B7 1 - Software Entry to self-refresh + * | | |u00B7 0 - Software Exit from self-refresh + * | | |Programming Mode: Dynamic + * |[7] |dis_cam_drain_selfref|Disable CAM Drain Before Entering Self-Refresh + * | | |Indicates whether skipping CAM draining is allowed when entering self-refresh. + * | | |This register field cannot be modified while PWRCTL.selfref_sw == 1. + * | | |u00B7 0 - CAMs must be empty before entering SR + * | | |u00B7 1 - CAMs are not emptied before entering SR (unsupported) Note, PWRCTL.dis_cam_drain_selfref=1 is unsupported in this release + * | | |PWRCTL.dis_cam_drain_selfref=0 is required. + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::PWRTMG + * Offset: 0x34 Low Power Timing Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |powerdown_to_x32|SDRAM Power-Down Enter After This Clock Number + * | | |After this many clocks of the DDRC command channel being idle the uMCTL2 automatically puts the SDRAM into power-down. + * | | |The DDRC command channel is considered idle when there are no HIF commands outstanding + * | | |This must be enabled in the PWRCTL.powerdown_en. + * | | |FOR PERFORMANCE ONLY. + * | | |Unit: Multiples of 32 DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 4 + * |[23:16] |selfref_to_x32|SDRAM Self-Refresh Enter After This Clock Number + * | | |After this many clocks of the DDRC command channel being idle the uMCTL2 automatically puts the SDRAM into self-refresh. + * | | |The DDRC command channel is considered idle when there are no HIF commands outstanding + * | | |This must be enabled in the PWRCTL.selfref_en. + * | | |FOR PERFORMANCE ONLY. + * | | |Unit: Multiples of 32 DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 4 + * @var UMCTL2_T::HWLPCTL + * Offset: 0x38 Hardware Low Power Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |hw_lp_en |Hardware Low Power Interface Enable Bit + * | | |Programming Mode: Quasi-dynamic Group 2 + * |[1] |hw_lp_exit_idle_en|Hardware Exit Idle Enable Bit + * | | |When this bit is programmed to 1 the cactive_in_ddrc pin of the DDRC can be used to exit from the automatic clock stop, automatic power down or automatic self-refresh modes. + * | | |Note, it does not cause exit of self-refresh that was caused by Hardware Low Power Interface and/or Software (PWRCTL.selfref_sw). + * | | |Programming Mode: Static + * |[27:16] |hw_lp_idle_x32|Hardware idle period. + * | | |The cactive_ddrc output is driven low if the DDRC command channel is idle for hw_lp_idle * 32 cycles if not in INIT or DPD/MPSM operating_mode. + * | | |The DDRC command channel is considered idle when there are no HIF commands outstanding + * | | |The hardware idle function is disabled when hw_lp_idle_x32=0 + * | | |hw_lp_idle_x32=1 is an illegal value. + * | | |FOR PERFORMANCE ONLY. + * | | |Unit: Multiples of 32 DFI clock cycles. + * | | |Programming Mode: Static + * @var UMCTL2_T::RFSHCTL0 + * Offset: 0x50 Refresh Control Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:4] |refresh_burst|Refresh Burst Number + * | | |The programmed value + 1 is the number of refresh timeouts that is allowed to accumulate before traffic is blocked and the refreshes are forced to execute. + * | | |Closing pages to perform a refresh is a one-time penalty that must be paid for each group of refreshes + * | | |Therefore, performing refreshes in a burst reduces the per-refresh penalty of these page closings. + * | | |Higher numbers for RFSHCTL.refresh_burst slightly increase utilization; lower numbers decrease the worst-case latency associated with refreshes. + * | | |u00B7 0 - Single refresh + * | | |u00B7 1 - Burst-of-2 refresh + * | | |u00B7 7 - Burst-of-8 refresh + * | | |For more information on burst refresh feature, see section 3.9 of DDR2 JEDEC specification - JESD79-2F.pdf. + * | | |For DDR2/3, the refresh is always per-rank and not per-bank + * | | |The rank refresh can be accumulated over 8*tREFI cycles using the burst refresh feature. + * | | |If using PHY-initiated updates, care must be taken in the setting of RFSHCTL0.refresh_burst, to ensure that tRFCmax is not violated due to a PHY-initiated update occurring shortly before a refresh burst is due. + * | | |In this situation, the refresh burst is delayed until the PHY-initiated update is complete. + * | | |Programming Mode: Dynamic - Refresh Related + * |[16:12] |refresh_to_x1_x32|SDRAM Bus Idle Period + * | | |If the refresh timer (tRFCnom, also known as tREFI) has expired at least once, then a speculative refresh may be performed. + * | | |A speculative refresh is a refresh performed at a time when refresh would be useful + * | | |When the SDRAM bus is idle for a period of time determined by this RFSHCTL0.refresh_to_x1_x32 and the refresh timer has expired at least once since the last refresh, then a speculative refresh is performed. + * | | |Speculative refreshes continue successively until there are no refreshes pending or until new reads or writes are issued to the uMCTL2. + * | | |FOR PERFORMANCE ONLY. + * | | |Unit: DFI clock cycles or multiples of 32 DFI clock cycles, depending on RFSHTMG.t_rfc_nom_x1_sel. + * | | |Programming Mode: Dynamic - Refresh Related + * |[23:20] |refresh_margin|Refresh Margin + * | | |Threshold value in number of DFI clock cycles before the critical refresh or page timer expires. + * | | |A critical refresh is to be issued before this threshold is reached. + * | | |It is recommended that this not be changed from the default value, currently shown as 0x2. + * | | |It must always be less than internally used t_rfc_nom/32. + * | | |Note that internally used t_rfc_nom is equal to RFSHTMG.t_rfc_nom_x1_x32 * 32 if RFSHTMG.t_rfc_nom_x1_sel=0. + * | | |Unit: Multiples of 32 DFI clock cycles. + * | | |Programming Mode: Dynamic - Refresh Related + * @var UMCTL2_T::RFSHCTL1 + * Offset: 0x54 Refresh Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |refresh_timer0_start_value_x32|Refresh Timer Start Value for Rank 0 + * | | |only present in multi-rank configurations + * | | |This is useful in staggering the refreshes to multiple ranks to help traffic to proceed. + * | | |FOR PERFORMANCE ONLY. + * | | |Unit: Multiples of 32 DFI clock cycles. + * | | |Programming Mode: Dynamic - Refresh Related + * |[27:16] |refresh_timer1_start_value_x32|Refresh Timer Start Value for Rank 1 + * | | |only present in multi-rank configurations + * | | |This is useful in staggering the refreshes to multiple ranks to help traffic to proceed. + * | | |FOR PERFORMANCE ONLY. + * | | |Unit: Multiples of 32 DFI clock cycles. + * | | |Programming Mode: Dynamic - Refresh Related + * @var UMCTL2_T::RFSHCTL3 + * Offset: 0x60 Refresh Control Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |dis_auto_refresh|Disable Auto-Refresh Enable Bit + * | | |When '1', disable auto-refresh generated by the uMCTL2. + * | | |When auto-refresh is disabled, the SoC must generate refreshes using the registers DBGCMD.rankn_refresh. + * | | |When dis_auto_refresh transitions from 0 to 1, any pending refreshes are immediately scheduled by the uMCTL2. + * | | |This register field is changeable on the fly. + * | | |Programming Mode: Dynamic - Refresh Related + * |[1] |refresh_update_level|Refresh Registers Updated Operation + * | | |Toggle this signal (either from 0 to 1 or from 1 to 0) to indicate that the refresh registers have been updated. + * | | |refresh_update_level must not be toggled when the DDRC is in reset (core_ddrc_rstn = 0). + * | | |The refresh registers are automatically updated when exiting reset. + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::RFSHTMG + * Offset: 0x64 Refresh Timing Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |t_rfc_min |Minimum Time from Refresh to Refresh or Activate + * | | |tRFC (min) + * | | |When the controller is operating in 1:1 mode, t_rfc_min must be set to RoundUp(tRFCmin/tCK). + * | | |When the controller is operating in 1:2 mode, t_rfc_min must be set to RoundUp(RoundUp(tRFCmin/tCK)/2). + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Dynamic - Refresh Related + * |[27:16] |t_rfc_nom_x1_x32|Average Time Interval between Refreshes per Rank + * | | |(Specification: 7.8us for DDR2 and DDR3). + * | | |When the controller is operating in 1:1 mode, set this register to RoundDown(tREFI/tCK) + * | | |When the controller is operating in 1:2 mode, set this register to RoundDown(RoundDown(tREFI/tCK)/2) + * | | |In both the previous cases, if RFSHTMG.t_rfc_nom_x1_sel = 0, divide the previous result by 32 and round down. + * | | |Note: + * | | |u00B7 RFSHTMG.t_rfc_nom_x1_x32 must be greater than 0x1 + * | | |u00B7 If RFSHTMG.t_rfc_nom_x1_sel == 1, RFSHTMG.t_rfc_nom_x1_x32 must be greater than RFSHTMG.t_rfc_min + * | | |u00B7 If RFSHTMG.t_rfc_nom_x1_sel == 0, RFSHTMG.t_rfc_nom_x1_x32 * 32 must be greater than RFSHTMG.t_rfc_min + * | | |u00B7 In DDR2/DDR3: RFSHTMG.t_rfc_nom_x1_x32 must be less than or equal to 0xFFE + * | | |Unit: DFI clock cycles or multiples of 32 DFI clock cycles, depending on RFSHTMG.t_rfc_nom_x1_sel. + * | | |Programming Mode: Dynamic - Refresh Related + * @var UMCTL2_T::CRCPARCTL0 + * Offset: 0xC0 CRC Parity Control Register0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |dfi_alert_err_int_en|DFI Alert Error Interrupt Enable Bit + * | | |If this bit is set, any parity/CRC error detected on the dfi_alert_n input results in an interrupt being set on CRCPARSTAT.dfi_alert_err_int. + * | | |Programming Mode: Dynamic + * |[1] |dfi_alert_err_int_clr|DFI Alert Error Interrupt Clear Bit + * | | |Interrupt clear bit for DFI alert error + * | | |If this bit is set, the alert error interrupt on CRCPARSTAT.dfi_alert_err_int is cleared + * | | |uMCTL2 automatically clears this bit. + * | | |Testable: readOnly + * | | |Programming Mode: Dynamic + * |[2] |dfi_alert_err_cnt_clr|DFI Alert Error Counter Clear Bit + * | | |Indicates the clear bit for DFI alert error counter. + * | | |Asserting this bit clears the DFI alert error counter, CRCPARSTAT.dfi_alert_err_cnt + * | | |uMCTL2 automatically clears this bit. + * | | |Testable: readOnly + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::CRCPARSTAT + * Offset: 0xCC CRC Parity Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |dfi_alert_err_cnt|DFI Alert Error Count + * | | |If a parity/CRC error is detected on dfi_alert_n, this counter be incremented + * | | |This is independent of the setting of CRCPARCTL0.dfi_alert_err_int_en + * | | |It saturates at 0xFFFF, and can be cleared by asserting CRCPARCTL0.dfi_alert_err_cnt_clr. + * | | |Programming Mode: Static + * |[16] |dfi_alert_err_int|DFI Alert Error Interrupt + * | | |If a parity/CRC error is detected on dfi_alert_n, and the interrupt is enabled by CRCPARCTL0.dfi_alert_err_int_en, this interrupt bit is set + * | | |It remains set until cleared by CRCPARCTL0.dfi_alert_err_int_clr. + * | | |Programming Mode: Static + * @var UMCTL2_T::INIT0 + * Offset: 0xD0 SDRAM Initialization Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |pre_cke_x1024|Number of Cycles to Wait after Reset before Driving CKE High to Start SDRAM Initialization + * | | |Indicates the number of cycles to wait after reset before driving CKE high to start the SDRAM initialization sequence. + * | | |DDR2 specifications typically require this to be programmed for a delay of >= 200 us. + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to JEDEC spec value divided by 2, and round it up to the next integer value. + * | | |For DDR3 RDIMMs, this must include the time needed to satisfy tSTAB. + * | | |Unit: Multiples of 1024 DFI clock cycles. + * | | |Programming Mode: Static + * |[25:16] |post_cke_x1024|Number of Cycles to Wait after Driving CKE High to Start the SDRAM Initialization + * | | |Indicates the number of cycles to wait after driving CKE high to start the SDRAM initialization sequence. + * | | |DDR2 typically requires a 400 ns delay, requiring this value to be programmed to 2 at all clock speeds. + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to JEDEC spec value divided by 2, and round it up to the next integer value. + * | | |Unit: Multiples of 1024 DFI clock cycles. + * | | |Programming Mode: Static + * |[31:30] |skip_dram_init|SDRAM Initialization Routine Skipped Enable Bit + * | | |If lower bit is enabled the SDRAM initialization routine is skipped + * | | |The upper bit decides what state the controller starts up in when reset is removed. + * | | |u00B7 00 - SDRAM Initialization routine is run after power-up + * | | |u00B7 01 - SDRAM Initialization routine is skipped after power-up + * | | |The controller starts up in normal Mode + * | | |u00B7 11 - SDRAM Initialization routine is skipped after power-up + * | | |The controller starts up in self-refresh Mode + * | | |u00B7 10 - Reserved + * | | |Programming Mode: Quasi-dynamic Group 2 + * @var UMCTL2_T::INIT1 + * Offset: 0xD4 SDRAM Initialization Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |pre_ocd_x32|Wait Period before Driving OCD Complete Command to SDRAM + * | | |Indicates the wait period before driving the OCD complete command to SDRAM. + * | | |There is no known specific requirement for this; it may be set to zero. + * | | |Unit: Multiples of 32 DFI clock cycles. + * | | |Programming Mode: Static + * |[24:16] |dram_rstn_x1024|SDRAM Reset During Initialization sequence + * | | |Indicates the number of cycles to assert SDRAM reset signal during initialization sequence. + * | | |This is only present for designs supporting DDR3 devices + * | | |For use with a Synopsys DDR PHY, this must be set to a minimum of 1. + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to JEDEC spec value divided by 2, and round it up to the next integer value. + * | | |Unit: Multiples of 1024 DFI clock cycles. + * | | |Programming Mode: Static + * @var UMCTL2_T::INIT3 + * Offset: 0xDC SDRAM Initialization Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |emr |Write Value to EMR Register + * | | |DDR2: Indicates the value to write to EMR register + * | | |Bits 9:7 are for OCD and the setting in this register is ignored + * | | |The uMCTL2 sets those bits appropriately. + * | | |DDR3: Value to write to MR1 register Set bit 7 to 0. + * | | |Programming Mode: Quasi-dynamic Group 4 + * |[31:16] |mr |Write Value to MR Register + * | | |DDR2:Indicates the value to write to MR register + * | | |Bit 8 is for DLL and the setting here is ignored + * | | |The uMCTL2 sets this bit appropriately. + * | | |DDR3: Value loaded into MR0 register. + * | | |Programming Mode: Quasi-dynamic Group 1, Group 4 + * @var UMCTL2_T::INIT4 + * Offset: 0xE0 SDRAM Initialization Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |emr3 |Write Value to EMR3 Register + * | | |DDR2: Indicates the value to write to EMR3 register. + * | | |DDR3: Value to write to MR3 register. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[31:16] |emr2 |Write Value to EMR2 Register + * | | |DDR2: Indicates the value to write to EMR2 register. + * | | |DDR3: Value to write to MR2 register. + * | | |Programming Mode: Quasi-dynamic Group 4 + * @var UMCTL2_T::INIT5 + * Offset: 0xE4 SDRAM Initialization Register 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[23:16] |dev_zqinit_x32|ZQ initial calibration, tZQINIT. + * | | |Present only in designs configured to support DDR3. + * | | |DDR3 typically requires 512 SDRAM clock cycles. + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to JEDEC spec value divided by 2, and round it up to the next integer value. + * | | |Unit: Multiples of 32 DFI clock cycles. + * | | |Programming Mode: Static + * @var UMCTL2_T::DIMMCTL + * Offset: 0xF0 DIMM Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |dimm_stagger_cs_en|DIMM Staggering Enable Bit + * | | |Staggering enable for multi-rank accesses (for multi-rank UDIMM, RDIMM and LRDIMM implementations only). + * | | |Note: Even if this bit is set it does not take care of software driven MR commands (through MRCTRL0/MRCTRL1), where software is responsible to send them to separate ranks as appropriate. + * | | |u00B7 1 - DDR2/DDR3 Send all commands to even and odd ranks separately + * | | |u00B7 0 - Do not stagger accesses + * | | |Programming Mode: Static + * |[1] |dimm_addr_mirr_en|DIMM Address Mirroring Enable Bit + * | | |Enables address mirroring (for multi-rank UDIMM implementations). + * | | |Some UDIMMs implement address mirroring for odd ranks, which means that the following address, bank address and bank group bits are swapped: (A3, A4), (A5, A6), (A7, A8), (BA0, BA1). + * | | |Setting this bit ensures that, for mode register accesses during the automatic initialization routine, these bits are swapped within the uMCTL2 to compensate for this UDIMM/RDIMM/LRDIMM swapping. + * | | |Note: This has no effect on the address of any other memory accesses, or of software-driven mode register accesses. + * | | |u00B7 1 - For odd ranks, implement address mirroring for MRS commands during initialization + * | | |u00B7 0 - Do not implement address mirroring + * | | |Programming Mode: Static + * @var UMCTL2_T::RANKCTL + * Offset: 0xF4 Rank Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |max_rank_rd|Maximum Number of Reads that Can be Scheduled Consecutively to Same Rank + * | | |Only present for multi-rank configurations. + * | | |Background: Reads to the same rank can be performed back-to-back + * | | |Reads to different ranks require additional gap dictated by the register RANKCTL.diff_rank_rd_gap. + * | | |This is to avoid possible data bus contention as well as to give PHY enough time to switch the delay when changing ranks. + * | | |The uMCTL2 arbitrates for bus access on a cycle-by-cycle basis; therefore after a read is scheduled, there are few clock cycles (determined by the value on RANKCTL.diff_rank_rd_gap register) in which only reads from the same rank are eligible to be scheduled. + * | | |This prevents reads from other ranks from having fair access to the data bus. + * | | |This parameter represents the maximum number of reads that can be scheduled consecutively to the same rank. + * | | |After this number is reached, a delay equal to RANKCTL.diff_rank_rd_gap is inserted by the scheduler to allow all ranks a fair opportunity to be scheduled. + * | | |Higher numbers increase bandwidth utilization, lower numbers increase fairness. + * | | |This feature can be DISABLED by setting this register to 0 + * | | |When set to 0, the controller stays on the same rank as long as commands are available for it. + * | | |Minimum programmable value is 0 (feature disabled) and maximum programmable value is 0xF. + * | | |For uPCTL2, this register field must be set to 0 (feature disabled) + * | | |FOR PERFORMANCE ONLY. + * | | |Programming Mode: Static + * |[7:4] |diff_rank_rd_gap|Number of Clocks of Gap in Data Responses when Performing Consecutive Reads to Different Ranks + * | | |Only present for multi-rank configurations. + * | | |Indicates the number of clocks of gap in data responses when performing consecutive reads to different ranks. + * | | |This is used to switch the delays in the PHY to match the rank requirements. + * | | |This value must consider both PHY requirement and ODT requirement. + * | | |u00B7 PHY requirement:tphy_rdcsgap (For more information on value of tphy_rdcsgap, see PHY databook) + * | | |u00B7 ODT requirement: The value programmed in this register takes care of the ODT switch off timing requirement when switching ranks during reads: + * | | |diff_rank_rd_gap must be a minimum of ODTCFG.rd_odt_hold - BL/2 + * | | |when the controller is operating in 1:1 mode, program this to the larger of PHY requirement or ODT requirement. + * | | |When the controller is operating in 1:2 mode, program this to the larger value divided by two and round it up to the next integer. + * | | |After PHY has completed training the value programmed may need to be increased + * | | |For more information, see relevant PHY documentation. + * | | |If a value greater than 0xF is needed, the RANKCTL.diff_rank_rd_gap_msb field must be used as extension + * | | |For DFI 1:2 mode, a maximum value of {diff_rank_rd_gap_msb,diff_rank_rd_gap} < 'h11 is supported + * | | |For DFI 1:1 mode a maximum value of {diff_rank_rd_gap_msb,diff_rank_rd_gap} <= 'h1F is supported. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2 + * |[11:8] |diff_rank_wr_gap|Number of Clocks of Gap in Data Responses when Performing Consecutive Writes to Different Ranks + * | | |Only present for multi-rank configurations. + * | | |Indicates the number of clocks of gap in data responses when performing consecutive writes to different ranks. + * | | |This is used to switch the delays in the PHY to match the rank requirements + * | | |This value must consider both PHY requirement and ODT requirement. + * | | |u00B7 PHY requirement - tphy_wrcsgap (For more information on value of tphy_wrcsgap, see PHY databook) + * | | |If CRC feature is enabled, must be increased by 1. + * | | |u00B7 ODT requirement - The value programmed in this register takes care of the ODT switch off timing requirement when switching ranks during writes. + * | | |For other cases, diff_rank_wr_gap must be a minimum of ODTCFG.wr_odt_hold - BL/2 + * | | |When the controller is operating in 1:1 mode, program this to the larger of PHY requirement or ODT requirement. + * | | |If CRC is enabled, the value can be decreased by 2 because the programmed value is internally increased by 1 (it is always 2 in terms of DFI PHY clock cycle as CRC is supported only with 1:2 frequency ratio). + * | | |When the controller is operating in 1:2 mode, program this to the larger value divided by two and round it up to the next integer. + * | | |After PHY has completed training the value programmed may need to be increased + * | | |For more information, see relevant PHY documentation. + * | | |If a value greater than 0xF is needed, the RANKCTL.diff_rank_wr_gap_msb field must be used as extension + * | | |For DFI 1:2 mode, a maximum value of {diff_rank_wr_gap_msb,diff_rank_wr_gap} < 'h11 is supported + * | | |For DFI 1:1 mode a maximum value of {diff_rank_wr_gap_msb,diff_rank_wr_gap} <= 'h1F is supported. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2 + * |[15:12] |max_rank_wr|Maximum Number of Writes that Can be Scheduled Consecutively to Same Rank + * | | |Only present for multi-rank configurations. + * | | |Background: Writes to the same rank can be performed back-to-back + * | | |Writes to different ranks require additional gap dictated by the register RANKCTL.diff_rank_wr_gap. + * | | |This is to avoid possible data bus contention as well as to give PHY enough time to switch the delay when changing ranks. + * | | |The uMCTL2 arbitrates for bus access on a cycle-by-cycle basis; therefore after a write is scheduled, there are few clock cycles (determined by the value on RANKCTL.diff_rank_wr_gap register) in which only writes from the same rank are eligible to be scheduled. + * | | |This prevents writes from other ranks from having fair access to the data bus. + * | | |This parameter represents the maximum number of writes that can be scheduled consecutively to the same rank + * | | |After this number is reached, a delay equal to RANKCTL.diff_rank_wr_gap is inserted by the scheduler to allow all ranks a fair opportunity to be scheduled + * | | |Higher numbers increase bandwidth utilization, lower numbers increase fairness. + * | | |This feature can be DISABLED by setting this register to 0 + * | | |When set to 0, the controller stays on the same rank as long as commands are available for it. + * | | |Minimum programmable value is 0 (feature disabled) and maximum programmable value is 0xF. + * | | |For uPCTL2, this register field must be set to 0 (feature disabled) + * | | |FOR PERFORMANCE ONLY. + * | | |Programming Mode: Static + * |[24] |diff_rank_rd_gap_msb|Different Rank Read Gap Extension Bit + * | | |Only present for multi-rank configurations. + * | | |1-bit extension to be used when RANKCTL.diff_rank_rd_gap field needs to be set to a value greater than 0xF. + * | | |Programming Mode: Quasi-dynamic Group 2 + * |[26] |diff_rank_wr_gap_msb|Different Rank Write Gap Extension Bit + * | | |Only present for multi-rank configurations. + * | | |1-bit extension to be used when RANKCTL.diff_rank_wr_gap field needs to be set to a value greater than 0xF. + * | | |Programming Mode: Quasi-dynamic Group 2 + * @var UMCTL2_T::DRAMTMG0 + * Offset: 0x100 SDRAM Timing Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |t_ras_min |Minimum Time Between Activate and Precharge to the Same Bank (tRAS(min)) + * | | |When the controller is operating in 1:1 frequency ratio mode, t_ras_min must be set to RoundUp(tRASmin/tCK) + * | | |When the controller is operating in 1:2 frequency ratio mode, 1T mode, t_ras_min must be set to RoundDown(RoundUp(tRASmin/tCK)/2) + * | | |When the controller is operating in 1:2 frequency ratio mode, 2T mode, geardown mode or LPDDR4 mode, t_ras min must be set to RoundUp(RoundUp(tRASmin/tCK)/2) + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[14:8] |t_ras_max |Maximum Time Between Activate and Precharge to the Same Bank (tRAS(max)) + * | | |This is the maximum time that a page can be kept open Minimum value of this register is 1 + * | | |Zero is invalid. + * | | |When the controller is operating in 1:1 frequency ratio mode, t_ras_max must be set to RoundDown(tRAS(max)/tCK/1024). + * | | |When the controller is operating in 1:2 frequency ratio mode, t_ras_max must be set to RoundDown((RoundDown(tRAS(max)/tCK/1024)-1)/2). + * | | |Unit: Multiples of 1024 DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[21:16] |t_faw |Four Active Window for 2 Kbytes Page Size + * | | |tFAW - valid only when 8 or more banks(or banks x bank groups) are present. + * | | |In 8-bank design, at most 4 banks must be activated in a rolling window of tFAW cycles. + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to (tFAW/2) and round up to next integer value. + * | | |In a 4-bank design, set this register to 0x1 independent of the 1:1/1:2 frequency mode. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[30:24] |wr2pre |Minimum Time Between Write and Precharge to Same Bank. + * | | |Specifications: WL + BL/2 + tWR = approximately 8 cycles + 15 ns = 14 clocks @400 MHz and less for lower frequencies. + * | | |where: + * | | |u00B7 WL: Write latency + * | | |u00B7 BL: Burst length + * | | |This must match the value programmed in the BL bit of the mode register to the SDRAM + * | | |BST (burst terminate) is not supported at present + * | | |u00B7 tWR: Write recovery time. This comes directly from the SDRAM specification + * | | |When the controller is operating in 1:2 frequency ratio mode, 1T mode, divide the previous value by 2 + * | | |No rounding up. + * | | |When the controller is operating in 1:2 frequency ratio mode, 2T mode, geardown mode, divide the previous value by 2 and round it up to the next integer value. + * | | |Note that, depending on the PHY, if using LRDIMM, it may be necessary to adjust the value of this parameter to compensate for the extra cycle of latency through the LRDIMM. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 1, Group 2, Group 4 + * @var UMCTL2_T::DRAMTMG1 + * Offset: 0x104 SDRAM Timing Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |t_rc |Minimum Time Between Activates to Same Bank (tRC) + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to (tRC/2) and round up to next integer value. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[13:8] |rd2pre |Minimum Time from Read to Precharge of Same Bank (tRTP) + * | | |u00B7 DDR2 - tAL + BL/2 + max(RoundUp(tRTP/tCK), 2) - 2 + * | | |u00B7 DDR3 - tAL + max (RoundUp(tRTP/tCK), 4) + * | | |When the controller is operating in 1:2 mode, 1T mode, divide the previous value by 2. No rounding up. + * | | |When the controller is operating in 1:2 mode, 2T mode, geardown mode, divide the previous value by 2 and round it up to the next integer value. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 1, Group 2, Group 4 + * |[20:16] |t_xp |Minimum Time after Power-Down Exit to Any Operation (tXP) + * | | |For DDR3, this must be programmed to tXPDLL if slow power down exit is selected in MR0[12]. + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to (tXP/2) and round it up to the next integer value. + * | | |Units: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * @var UMCTL2_T::DRAMTMG2 + * Offset: 0x108 SDRAM Timing Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |wr2rd |Minimum Time from Write Command to Read Command + * | | |This must include time for bus turn-around and all PHY and system requirements. + * | | |After the PHY has completed training, the value programmed may need to be increased + * | | |Please see the relevant PHY databook for details of what should be included here. + * | | |The following calculations are minimum values, and do not include the PHY/system requirements mentioned above: + * | | |DDR2/DDR3: CWL + BL/2 + tWTR + * | | |Where: + * | | |u00B7 CWL: CAS write latency + * | | |u00B7 WL: Write latency + * | | |u00B7 BL: Burst length + * | | |This must match the value programmed in the BL bit of the mode register to the SDRAM + * | | |u00B7 tWTR: Internal write to read command delay. This comes directly from the SDRAM specification + * | | |Add one extra cycle for LPDDR2/LPDDR3/LPDDR4 operation. + * | | |When the controller is operating in 1:2 mode, divide the value calculated using the previous equation by 2, and round it up to next integer. + * | | |If your configuration has RANKCTL1.wr2rd_dr, write to read bus turn-around between different physical ranks are controlled by RANKCTL1.wr2rd_dr. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 1, Group 2, Group 4 + * |[13:8] |rd2wr |Minimum Time from Read Command to Write Command + * | | |This must include time for bus turnaround (both within ranks and between ranks) and all PHY and system requirements. + * | | |After the PHY has completed training, the value programmed may need to be increased + * | | |Please see the relevant PHY databook for details of what should be included here. + * | | |The following calculations are minimum values, and do not include the PHY/system requirements mentioned above: + * | | |DDR2/3 : RL + BL/2 + 2 - WL + * | | |Where: + * | | |u00B7 WL: Write latency + * | | |u00B7 BL: Burst length + * | | |This must match the value programmed in the BL bit of the mode register to the SDRAM + * | | |u00B7 RL: Read latency = CAS latency + * | | |When the controller is operating in 1:2 frequency ratio mode, divide the value calculated using the previous equation by 2, and round it up to next integer. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 1, Group 2, Group 4 + * @var UMCTL2_T::DRAMTMG3 + * Offset: 0x10C SDRAM Timing Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |t_mod |Number of Cycles Between Load Mode Command and Following Non-Load Mode Command (tMOD) + * | | |Used only in DDR3. + * | | |Indicates the number of cycles between load mode command and following non-load mode command. + * | | |If CAL mode is enabled (DFITMG1.dfi_t_cmd_lat > 0), tCAL (=DFITMG1.dfi_cmd_lat) must be added to the previous calculations. + * | | |Set to tMOD if controller is operating in 1:1 frequency ratio mode, or tMOD/2 (rounded up to next integer) if controller is operating in 1:2 frequency ratio mode. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[17:12] |t_mrd |Number of Cycles to Wait after a Mode Register Write or Read (tMRD) + * | | |Depending on the connected SDRAM, tMRD represents: + * | | |u00B7 DDR2: Time from MRS to any command + * | | |u00B7 DDR3: Time from MRS to MRS command + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to (tMRD/2) and round it up to the next integer value. + * | | |If CAL mode is enabled (DFITMG1.dfi_t_cmd_lat > 0), tCAL (=DFITMG1.dfi_cmd_lat) must be added to the previous calculations. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * @var UMCTL2_T::DRAMTMG4 + * Offset: 0x110 SDRAM Timing Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |t_rp |Minimum Time from Single-Bank Precharge to Activate of Same Bank (tRP) + * | | |When the controller is operating in 1:1 frequency ratio mode, t_rp must be set to RoundUp(tRP/tCK). + * | | |When the controller is operating in 1:2 frequency ratio mode, t_rp must be set to RoundDown(RoundUp(tRP/tCK)/2) + 1. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[11:8] |t_rrd |Minimum Time Between Activates from Bank "a" to Bank "b" for Others (tRRD) + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to (tRRD/2) and round it up to the next integer value. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[19:16] |t_ccd |Minimum Time Between Two Reads or Two Writes for Others (tCCD) + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to (tCCD_L/2 or tCCD/2) and round it up to the next integer value. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[28:24] |t_rcd |Minimum Time from Activate to Read or Write Command to Same Bank (tRCD - tAL) + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to ((tRCD - tAL)/2) and round it up to the next integer value. + * | | |Minimum value allowed for this register is 1, which implies minimum (tRCD - tAL) value to be 2 when the controller is operating in 1:2 frequency ratio mode. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 1, Group 2, Group 4 + * @var UMCTL2_T::DRAMTMG5 + * Offset: 0x114 SDRAM Timing Register 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |t_cke |Minimum Number of Cycles of CKE HIGH/LOW During Power-Down and Self-Refresh. + * | | |u00B7 DDR2/DDR3: Set this to tCKE value + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to (value described above)/2 and round it up to the next integer value. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[13:8] |t_ckesr |Minimum CKE Low Width for Self-Refresh or Self-Refresh Power Down Entry to Exit Timing in Memory Clock Cycles. + * | | |Recommended settings: + * | | |u00B7 DDR2 : tCKE + * | | |u00B7 DDR3 : tCKE + 1 + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to recommended value divided by two and round it up to next integer. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[22:16] |t_cksre |Time After Self-Refresh Down Entry that CK is Maintained as a Valid Clock. + * | | |Specifies the clock disable delay after SRE. + * | | |Recommended settings: + * | | |u00B7 DDR2 : 1 + * | | |u00B7 DDR3 : Max (10 ns, 5 tCK) + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to recommended value divided by two and round it up to next integer. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[27:24] |t_cksrx |Time Before Self-Refresh Exit that CK is Maintained as a Valid Clock Before Issuing SRX. + * | | |Specifies the clock stable time before SRX. + * | | |Recommended settings: + * | | |u00B7 DDR2 : 1 + * | | |u00B7 DDR3 : tCKSRX + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to recommended value divided by two and round it up to next integer. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * @var UMCTL2_T::DRAMTMG8 + * Offset: 0x120 SDRAM Timing Register 8 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:0] |t_xs_x32 |Exit Self-Refresh to Commands Not Requiring a Locked DLL (tXS) + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to the previous value divided by 2 and round up to next integer value. + * | | |Note: Used only for DDR2 and DDR3 SDRAMs. + * | | |Unit: Multiples of 32 DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[14:8] |t_xs_dll_x32|Exit Self-Refresh to Commands Requiring a Locked DLL (tXSDLL) + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to the previous value divided by 2 and round up to next integer value. + * | | |Note: Used only for DDR2 and DDR3 SDRAMs. + * | | |Unit: Multiples of 32 DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * @var UMCTL2_T::DRAMTMG15 + * Offset: 0x13C SDRAM Timing Register 15 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |t_stab_x32|Stabilization time (tSTAB) + * | | |It is required in the following two cases for DDR3 RDIMM: + * | | |u00B7 When exiting power saving mode, if the clock is stopped, after re-enabling it the clock must be stable for a time specified by tSTAB + * | | |u00B7 After issuing control words that refers to clock timing (Specification: 6us for DDR3) + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to recommended value divided by two and round it up to next integer. + * | | |Unit: Multiples of 32 DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[31] |en_dfi_lp_t_stab|Enable Bit for Using tSTAB When Exiting DFI LP + * | | |u00B7 1 - Enable using tSTAB when exiting DFI LP + * | | |This must be set when the PHY is stopping the clock during DFI LP to save maximum power. + * | | |u00B7 0 - Disable using tSTAB when exiting DFI LP. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * @var UMCTL2_T::ZQCTL0 + * Offset: 0x180 ZQ Control Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |t_zq_short_nop|Number of DFI Clock Cycles of NOP Required After a ZQCS (ZQ Calibration Short)/MPC(ZQ Latch) Command is Issued to SDRAM + * | | |tZQCS for DDR3 + * | | |When the controller is operating in 1:2 frequency ratio mode, program this to tZQCS/2 and round it up to the next integer value. + * | | |This is only present for designs supporting DDR3 devices. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Static + * |[26:16] |t_zq_long_nop|Number of DFI Clock Cycles of NOP Required After a ZQCL (ZQ Calibration Long)/MPC (ZQ Start) Command is Issued to SDRAM + * | | |tZQoper for DDR3 + * | | |When the controller is operating in 1:2 frequency ratio mode: + * | | |DDR3: program this to tZQoper/2 and round it up to the next integer value. + * | | |This is only present for designs supporting DDR3 devices. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Static + * |[29] |zq_resistor_shared|ZQ Resistor Shared Between Ranks + * | | |u00B7 1 - Denotes that ZQ resistor is shared between ranks + * | | |Means ZQinit/ZQCL/ZQCS/MPC(ZQ calibration) commands are sent to one rank at a time with tZQinit/tZQCL/tZQCS/tZQCAL/tZQLAT timing met between commands so that commands to different ranks do not overlap + * | | |u00B7 0 - ZQ resistor is not shared + * | | |This is only present for designs supporting DDR3 devices. + * | | |Programming Mode: Static + * |[30] |dis_srx_zqcl|Disable Issuing of ZQCL/MPC(ZQ Calibration) Command at Self-Refresh/SR-Power Down Exit + * | | |u00B7 1 - Disable issuing of ZQCL/MPC(ZQ calibration) command at self-refresh/SR-Power down exit + * | | |Only applicable when run in DDR3 mode + * | | |u00B7 0 - Enable issuing of ZQCL/MPC(ZQ calibration) command at self-refresh/SR-Power down exit + * | | |Only applicable when run in DDR3 mode + * | | |This is only present for designs supporting DDR3 devices. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[31] |dis_auto_zq|Disable Auto Generation of ZQCS/MPC(ZQ Calibration) Command + * | | |u00B7 1 - Disable uMCTL2 generation of ZQCS/MPC(ZQ calibration) command + * | | |Register DBGCMD.zq_calib_short can be used instead to issue ZQ calibration request from APB module + * | | |u00B7 0 - Internally generate ZQCS/MPC(ZQ calibration) commands based on ZQCTL1.t_zq_short_interval_x1024 + * | | |This is only present for designs supporting DDR3 devices. + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::ZQCTL1 + * Offset: 0x184 ZQ Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[19:0] |t_zq_short_interval_x1024|Average Interval to Wait Between Automatically Issuing ZQCS + * | | |Average Interval to Wait Between Automatically Issuing ZQCS (ZQ Calibration Short)/MPC(ZQ Calibration) Commands to DDR3 Devices. + * | | |Meaningless, if ZQCTL0.dis_auto_zq=1. + * | | |This is only present for designs supporting DDR3 devices. + * | | |Unit: Multiples of 1024 DFI clock cycles. + * | | |Programming Mode: Static + * @var UMCTL2_T::DFITMG0 + * Offset: 0x190 DFI Timing Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |dfi_tphy_wrlat|Write latency + * | | |Number of clocks from the write command to write data enable (dfi_wrdata_en) + * | | |This corresponds to the DFI timing parameter tphy_wrlat. + * | | |Refer to PHY specification for correct value. + * | | |Unit: DFI clock cycles or DFI PHY clock cycles, depending on DFITMG0.dfi_wrdata_use_dfi_phy_clk. + * | | |Programming Mode: Quasi-dynamic Group 2, Group 4 + * |[13:8] |dfi_tphy_wrdata|Number of Clock Cycles Between When dfi_wrdata_en is Asserted to When the Associated Write Data is Driven on the dfi_wrdata Signal + * | | |This corresponds to the DFI timing parameter tphy_wrdata + * | | |For more information on correct value, see PHY specification + * | | |Note, maximum supported value is 8. + * | | |Unit: DFI clock cycles or DFI PHY clock cycles, depending on DFITMG0.dfi_wrdata_use_dfi_phy_clk. + * | | |Programming Mode: Quasi-dynamic Group 4 + * |[15] |dfi_wrdata_use_dfi_phy_clk|dfi_wrdata_en/dfi_wrdata/dfi_wrdata_mask is Generated Using HDR (DFI Clock) or SDR (DFI PHY Clock) Values + * | | |Selects whether value in DFITMG0.dfi_tphy_wrlat is in terms of HDR (DFI clock) or SDR (DFI PHY clock) cycles. + * | | |Selects whether value in DFITMG0.dfi_tphy_wrdata is in terms of HDR (DFI clock) or SDR (DFI PHY clock) cycles. + * | | |u00B7 0 in terms of HDR (DFI clock) cycles + * | | |Refer to PHY specification for correct value + * | | |If using a Synopsys DWC DDR3/2 PHY, this field must be set to 0. + * | | |Programming Mode: Static + * |[22:16] |dfi_t_rddata_en|Time from the Assertion of a Read Command on the DFI Interface to the Assertion of the dfi_rddata_en Signal + * | | |Refer to PHY specification for correct value. + * | | |This corresponds to the DFI parameter trddata_en. + * | | |Unit: DFI clock cycles or DFI PHY clock cycles, depending on DFITMG0.dfi_rddata_use_dfi_phy_clk. + * | | |Programming Mode: Quasi-dynamic Group 1, Group 4 + * |[23] |dfi_rddata_use_dfi_phy_clk|dfi_rddata_en/dfi_rddata/dfi_rddata_valid is Generated Using HDR (DFI Clock) or SDR (DFI PHY Clock) Values + * | | |Selects whether value in DFITMG0.dfi_t_rddata_en is in terms of HDR (DFI clock) or SDR (DFI PHY clock) cycles: + * | | |u00B7 0 in terms of HDR (DFI clock) cycles + * | | |Refer to PHY specification for correct value. + * | | |If using a Synopsys DWC DDR3/2 PHY, this field must be set to 0. + * | | |Programming Mode: Static + * |[28:24] |dfi_t_ctrl_delay|Number of DFI Clock Cycles After an Assertion or De-assertion of the DFI Control Signals that the Control Signals at the PHY-DRAM Interface Reflect the Assertion or De-assertion + * | | |If the DFI clock and the memory clock are not phase-aligned, this timing parameter must be rounded up to the next integer value. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 4 + * @var UMCTL2_T::DFITMG1 + * Offset: 0x194 DFI Timing Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |dfi_t_dram_clk_enable|Number of DFI Clock Cycles from the De-assertion of the dfi_dram_clk_disable Signal on the DFI Until the First Valid Rising Edge of the Clock to the DRAM Memory Devices, at the PHY-DRAM Boundary + * | | |If the DFI clock and the memory clock are not phase aligned, this timing parameter must be rounded up to the next integer value. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 4 + * |[12:8] |dfi_t_dram_clk_disable|Number of DFI Clock Cycles from the Assertion of the dfi_dram_clk_disable Signal on the DFI Until the Clock to the DRAM Memory Devices, at the PHY-DRAM Boundary, Maintains a Low Value + * | | |If the DFI clock and the memory clock are not phase aligned, this timing parameter must be rounded up to the next integer value. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 4 + * |[20:16] |dfi_t_wrdata_delay|Number of DFI Clock Cycles Between When the dfi_wrdata_en Signal is Asserted and When the Corresponding Write Data Transfer is Completed on the DRAM Bus + * | | |This corresponds to the DFI timing parameter twrdata_delay. + * | | |For more information on correct value, see PHY specification. + * | | |For DFI 2.1 PHY, set to tphy_wrdata + (delay of DFI write data to the DRAM). + * | | |Value to be programmed is in terms of DFI clocks, not PHY clocks. + * | | |In FREQ_RATIO=2, divide PHY's value by 2 and round up to next integer. + * | | |If using DFITMG0.dfi_wrdata_use_dfi_phy_clk=1, add 1 to the value. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 4 + * |[25:24] |dfi_t_parin_lat|Number of DFI PHY Clock Cycles Between When the dfi_cs signal is Asserted and When the Associated dfi_parity_in Signal is Driven + * | | |Unit: DFI PHY clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 4 + * @var UMCTL2_T::DFILPCFG0 + * Offset: 0x198 DFI Low Power Configuration Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |dfi_lp_en_pd|Enable Bit for DFI Low Power Interface Handshaking During Power Down Entry/Exit + * | | |u00B7 0 - Disabled + * | | |u00B7 1 - Enabled + * | | |Programming Mode: Static + * |[7:4] |dfi_lp_wakeup_pd|Value in DFI Clock Cycles to Drive on dfi_lp_wakeup Signal When Power-Down Mode is Entered + * | | |Determines the DFI's tlp_wakeup time: + * | | |u00B7 0x0 - 16 cycles + * | | |u00B7 0x1 - 32 cycles + * | | |u00B7 0x2 - 64 cycles + * | | |u00B7 0x3 - 128 cycles + * | | |u00B7 0x4 - 256 cycles + * | | |u00B7 0x5 - 512 cycles + * | | |u00B7 0x6 - 1024 cycles + * | | |u00B7 0x7 - 2048 cycles + * | | |u00B7 0x8 - 4096 cycles + * | | |u00B7 0x9 - 8192 cycles + * | | |u00B7 0xA - 16384 cycles + * | | |u00B7 0xB - 32768 cycles + * | | |u00B7 0xC - 65536 cycles + * | | |u00B7 0xD - 131072 cycles + * | | |u00B7 0xE - 262144 cycles + * | | |u00B7 0xF - Unlimited + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Static + * |[8] |dfi_lp_en_sr|Enable Bit for DFI Low Power Interface Handshaking During Self-Refresh Entry/Exit + * | | |u00B7 0 - Disabled + * | | |u00B7 1 - Enabled + * | | |Programming Mode: Static + * |[15:12] |dfi_lp_wakeup_sr|Value in DFI Clock Cycles to Drive on dfi_lp_wakeup Signal When Self-Refresh Mode is Entered + * | | |Determines the DFI's tlp_wakeup time: + * | | |u00B7 0x0 - 16 cycles + * | | |u00B7 0x1 - 32 cycles + * | | |u00B7 0x2 - 64 cycles + * | | |u00B7 0x3 - 128 cycles + * | | |u00B7 0x4 - 256 cycles + * | | |u00B7 0x5 - 512 cycles + * | | |u00B7 0x6 - 1024 cycles + * | | |u00B7 0x7 - 2048 cycles + * | | |u00B7 0x8 - 4096 cycles + * | | |u00B7 0x9 - 8192 cycles + * | | |u00B7 0xA - 16384 cycles + * | | |u00B7 0xB - 32768 cycles + * | | |u00B7 0xC - 65536 cycles + * | | |u00B7 0xD - 131072 cycles + * | | |u00B7 0xE - 262144 cycles + * | | |u00B7 0xF - Unlimited + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Static + * |[28:24] |dfi_tlp_resp|Setting in DFI Clock Cycles for DFI's tlp_resp Time + * | | |Same value is used for both Power Down, self-refresh, Deep Power Down and Maximum Power Saving modes. + * | | |For more information on recommended values, see PHY databook + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Static + * @var UMCTL2_T::DFIUPD0 + * Offset: 0x1A0 DFI Update Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |dfi_t_ctrlup_min|Minimum Number of DFI Clock Cycles that the dfi_ctrlupd_req Signal must be Asserted The uMCTL2 expects the PHY to respond within this time. If the PHY does not respond, the uMCTL2 de-asserts dfi_ctrlupd_req after dfi_t_ctrlup_min + 2 cycles. Lowest value to assign to this variable is 0x1. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Static + * |[25:16] |dfi_t_ctrlup_max|Maximum Number of DFI Clock Cycles that the dfi_ctrlupd_req Signal Can Assert + * | | |Lowest value to assign to this variable is 0x40. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Static + * |[29] |ctrlupd_pre_srx|dfi_ctrlupd_req Selection at SRX + * | | |u00B7 0 - Send ctrlupd after SRX + * | | |u00B7 1 - Send ctrlupd before SRX If DFIUPD0.dis_auto_ctrlupd_srx=1, this register has no impact, because no dfi_ctrlupd_req is issued when SRX. + * | | |Programming Mode: Static + * |[30] |dis_auto_ctrlupd_srx|Disable Bit for Automatic dfi_ctrlupd_req Generation by uMCTL2 at Self-Refresh Exit + * | | |When '1', disable the automatic dfi_ctrlupd_req generation by the uMCTL2 at self-refresh exit. + * | | |When '0', uMCTL2 issues a dfi_ctrlupd_req before or after exiting self-refresh, depending on DFIUPD0.ctrlupd_pre_srx. + * | | |Programming Mode: Static + * |[31] |dis_auto_ctrlupd|Disable Bit for Automatic dfi_ctrlupd_req Generation by uMCTL2 + * | | |When '1', disable the automatic dfi_ctrlupd_req generation by the uMCTL2. + * | | |The controller must issue the dfi_ctrlupd_req signal using register DBGCMD.ctrlupd. + * | | |When '0', uMCTL2 issues dfi_ctrlupd_req periodically. + * | | |Programming Mode: Quasi-dynamic Group 3 + * @var UMCTL2_T::DFIUPD1 + * Offset: 0x1A4 DFI Update Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |dfi_t_ctrlupd_interval_max_x1024|Maximum Amount of Time Between uMCTL2 Initiated DFI Update Requests + * | | |This timer resets with each update request; when the timer expires dfi_ctrlupd_req is sent and traffic is blocked until the dfi_ctrlupd_ackx is received. + * | | |PHY can use this idle time to recalibrate the delay lines to the DLLs + * | | |The DFI controller update is also used to reset PHY FIFO pointers in case of data capture errors. + * | | |Updates are required to maintain calibration over PVT, but frequent updates may impact performance + * | | |Minimum allowed value for this field is 1. + * | | |Note: Value programmed for DFIUPD1.dfi_t_ctrlupd_interval_max_x1024 must be greater than DFIUPD1.dfi_t_ctrlupd_interval_min_x1024. + * | | |Unit: Multiples of 1024 DFI clock cycles. + * | | |Programming Mode: Static + * |[23:16] |dfi_t_ctrlupd_interval_min_x1024|Minimum Amount of Time Between uMCTL2 Initiated DFI Update Requests (which is Executed whenever the uMCTL2 is Idle) + * | | |Set this number higher to reduce the frequency of update requests, which can have a small impact on the latency of the first read request when the uMCTL2 is idle. + * | | |The minimum allowed value for this field is 1. + * | | |Unit: Multiples of 1024 DFI clock cycles. + * | | |Programming Mode: Static + * @var UMCTL2_T::DFIUPD2 + * Offset: 0x1A8 DFI Update Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31] |dfi_phyupd_en|Enable Bit for Acknowledging PHY-Initiated Updates + * | | |u00B7 0 - Disabled + * | | |u00B7 1 - Enabled + * | | |Programming Mode: Static + * @var UMCTL2_T::DFIMISC + * Offset: 0x1B0 DFI Miscellaneous Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |dfi_init_complete_en|PHY Initialization Complete Enable Bit + * | | |When asserted the dfi_init_complete signal can be used to trigger SDRAM initialisation + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[4] |ctl_idle_en|Enable Bit for ctl_idle Signal + * | | |It is non-DFI related pin specific to certain Synopsys PHYs. + * | | |For more information on ctl_idle functionality, see signal description of ctl_idle signal. + * | | |Programming Mode: Static + * |[5] |dfi_init_start|PHY Initialization Start Request Signal + * | | |When asserted it triggers the PHY init start request. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[12:8] |dfi_frequency|Operating Frequency of System + * | | |The number of supported frequencies and the mapping of signal values to clock frequencies are defined by the PHY. + * | | |Programming Mode: Quasi-dynamic Group 1 + * @var UMCTL2_T::DFISTAT + * Offset: 0x1BC DFI Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |dfi_init_complete|Status flag when the DFI initialization has been completed + * | | |The DFI INIT triggered by dfi_init_start signal and then the dfi_init_complete flag is polled to know when the initialization is done. + * | | |Programming Mode: Dynamic + * |[1] |dfi_lp_ack|Value of the dfi_lp_ack to the controller + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::DFIPHYMSTR + * Offset: 0x1C4 DFI PHY Master + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |dfi_phymstr_en|PHY Master Interface Enable Bit + * | | |u00B7 0 - Disabled + * | | |u00B7 1 - Enabled + * | | |Programming Mode: Static + * @var UMCTL2_T::ADDRMAP0 + * Offset: 0x200 Address Map Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |addrmap_cs_bit0|HIF Address Bits for Rank Address Bit 0 + * | | |Valid Range: 0 to 29, and 31 + * | | |Internal Base: 6 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |If unused, set to 31 and then rank address bit 0 is set to 0. + * | | |Programming Mode: Static + * @var UMCTL2_T::ADDRMAP1 + * Offset: 0x204 Address Map Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |addrmap_bank_b0|HIF Address Bits for Bank Address Bit 0 + * | | |Valid Range: 0 to 32, and 63 + * | | |Internal Base: 2 + * | | |The selected HIF address bit for each of the bank address bits is determined by adding the internal base to the value of this field. + * | | |If unused, set to 63 and then bank address bit 0 is set to 0. + * | | |Programming Mode: Static + * |[13:8] |addrmap_bank_b1|HIF Address Bits for Bank Address Bit 1 + * | | |Valid Range: 0 to 32, and 63 + * | | |Internal Base: 3 + * | | |The selected HIF address bit for each of the bank address bits is determined by adding the internal base to the value of this field. + * | | |If unused, set to 63 and then bank address bit 1 is set to 0. + * | | |Programming Mode: Static + * |[21:16] |addrmap_bank_b2|HIF Address Bits for Bank Address Bit 2 + * | | |Valid Range: 0 to 31, and 63 + * | | |Internal Base: 4 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |If unused, set to 63 and then bank address bit 2 is set to 0. + * | | |Programming Mode: Static + * @var UMCTL2_T::ADDRMAP2 + * Offset: 0x208 Address Map Register 2 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |addrmap_col_b2|HIF Address Bit for Column Address Bit for Three Bus Width Modes + * | | |u00B7 Full bus width mode - Selects the HIF address bit used as column address bit 2 + * | | |u00B7 Half bus width mode - Selects the HIF address bit used as column address bit 3 + * | | |Valid Range: 0 to 7 + * | | |Internal Base: 2 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |In our chip, we configure hardware parameter "MEMC_BURST_LENGTH" to equal to 8 and Full Bus Width (MSTR.data_bus_width==00), it is recommended to program this to 0 so that HIF[2] maps to column address bit 2. + * | | |Programming Mode: Static + * |[12:8] |addrmap_col_b3|HIF Address Bit for Column Address Bit for Three Bus Width Modes + * | | |u00B7 Full bus width mode - Selects the HIF address bit used as column address bit 3 + * | | |u00B7 Half bus width mode - Selects the HIF address bit used as column address bit 4 + * | | |Valid Range: 0 to 7. + * | | |Internal Base: 3 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |Programming Mode: Static + * |[19:16] |addrmap_col_b4|HIF Address Bit for Column Address Bit for Three Bus Width Modes + * | | |u00B7 Full bus width mode - Selects the HIF address bit used as column address bit 4 + * | | |u00B7 Half bus width mode - Selects the HIF address bit used as column address bit 5 + * | | |Valid Range: 0 to 7, and 15 + * | | |Internal Base: 4 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |If unused, set to 15 and then this column address bit is set to 0. + * | | |Programming Mode: Static + * |[27:24] |addrmap_col_b5|HIF Address Bit for Column Address Bit for Three Bus Width Modes + * | | |u00B7 Full bus width mode - Selects the HIF address bit used as column address bit 5 + * | | |u00B7 Half bus width mode - Selects the HIF address bit used as column address bit 6 + * | | |Valid Range: 0 to 7, and 15 + * | | |Internal Base: 5 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |If unused, set to 15 and then this column address bit is set to 0. + * | | |Programming Mode: Static + * @var UMCTL2_T::ADDRMAP3 + * Offset: 0x20C Address Map Register 3 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |addrmap_col_b6|HIF Address Bit for Column Address Bit for Three Bus Width Modes + * | | |u00B7 Full bus width mode - Selects the HIF address bit used as column address bit 6. + * | | |u00B7 Half bus width mode - Selects the HIF address bit used as column address bit 7. + * | | |Valid Range: 0 to 7, and 31. + * | | |Internal Base: 6 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |If unused, set to 31 and then this column address bit is set to 0. + * | | |Programming Mode: Static + * |[12:8] |addrmap_col_b7|HIF Address Bit for Column Address Bit for Three Bus Width Modes + * | | |u00B7 Full bus width mode - Selects the HIF address bit used as column address bit 7 + * | | |u00B7 Half bus width mode - Selects the HIF address bit used as column address bit 8 + * | | |Valid Range: 0 to 7, and 31. + * | | |Internal Base: 7 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |If unused, set to 31 and then this column address bit is set to 0. + * | | |Programming Mode: Static + * |[20:16] |addrmap_col_b8|HIF Address Bit for Column Address Bit for Three Bus Width Modes + * | | |u00B7 Full bus width mode - Selects the HIF address bit used as column address bit 8 + * | | |u00B7 Half bus width mode - Selects the HIF address bit used as column address bit 9 + * | | |Valid Range: 0 to 7, and 31. + * | | |Internal Base: 8 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |Note: Per JEDEC DDR2/3 specification, column address bit 10 is reserved for indicating auto-precharge, and hence no source address bit can be mapped to column address bit 10. + * | | |If unused, set to 31 and then this column address bit is set to 0. + * | | |Programming Mode: Static + * |[28:24] |addrmap_col_b9|HIF Address Bit for Column Address Bit for Three Bus Width Modes + * | | |u00B7 Full bus width mode - Selects the HIF address bit used as column address bit 9 + * | | |u00B7 Half bus width mode - Selects the HIF address bit used as column address bit 11 + * | | |Valid Range: 0 to 7. + * | | |Internal Base: 9 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |Note: Per JEDEC DDR2/3 specification, column address bit 10 is reserved for indicating auto-precharge, and hence no source address bit can be mapped to column address bit 10. + * | | |If unused, set to 31 and then this column address bit is set to 0. + * | | |Programming Mode: Static + * @var UMCTL2_T::ADDRMAP4 + * Offset: 0x210 Address Map Register 4 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[4:0] |addrmap_col_b10|HIF Address Bit for Column Address Bit for Three Bus Width Modes + * | | |u00B7 Full bus width mode: Selects the HIF address bit used as column address bit 11 + * | | |u00B7 Half bus width mode: Selects the HIF address bit used as column address bit 13 + * | | |Valid Range: 0 to 7, and 31. + * | | |Internal Base: 10 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |Note: Per JEDEC DDR2/3 specification, column address bit 10 is reserved for indicating auto-precharge, and hence no source address bit can be mapped to column address bit 10. + * | | |If unused, set to 31 and then this column address bit is set to 0. + * | | |Programming Mode: Static + * |[12:8] |addrmap_col_b11|HIF Address Bit for Column Address Bit for Three Bus Width Modes + * | | |u00B7 Full bus width mode - Selects the HIF address bit used as column address bit 13 + * | | |u00B7 Half bus width mode - UNUSED + * | | |See later in this description for value you need to set to make it unused + * | | |Valid Range: 0 to 7, and 31. + * | | |Internal Base: 11 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |Note: Per JEDEC DDR2/3 specification, column address bit 10 is reserved for indicating auto-precharge, and hence no source address bit can be mapped to column address bit 10. + * | | |If unused, set to 31 and then this column address bit is set to 0. + * | | |Programming Mode: Static + * @var UMCTL2_T::ADDRMAP5 + * Offset: 0x214 Address Map Register 5 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |addrmap_row_b0|HIF Address Bits for Row Address Bit 0 + * | | |Valid Range: 0 to 11 + * | | |Internal Base: 6 + * | | |The selected HIF address bit for each of the row address bits is determined by adding the internal base to the value of this field. + * | | |Programming Mode: Static + * |[11:8] |addrmap_row_b1|HIF Address Bits for Row Address Bit 1 + * | | |Valid Range: 0 to 11 + * | | |Internal Base: 7 + * | | |The selected HIF address bit for each of the row address bits is determined by adding the internal base to the value of this field. + * | | |Programming Mode: Static + * |[19:16] |addrmap_row_b2_10|HIF Address Bits for Row Address Bits 2 to 10 + * | | |Valid Range: 0 to 11, and 15 + * | | |Internal Base: 8 (for row address bit 2), 9 (for row address bit 3), 10 (for row address bit 4) and so on, increasing to 16 (for row address bit 10) + * | | |The selected HIF address bit for each of the row address bits is determined by adding the internal base to the value of this field. + * | | |When set to 15, the values of row address bits 2 to 10 are defined by registers ADDRMAP9, ADDRMAP10, ADDRMAP11. + * | | |Programming Mode: Static + * |[27:24] |addrmap_row_b11|HIF Address Bits for Row Address Bit 11 + * | | |Valid Range: 0 to 11, and 15 + * | | |Internal Base: 17 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |If unused, set to 15 and then row address bit 11 is set to 0. + * | | |Programming Mode: Static + * @var UMCTL2_T::ADDRMAP6 + * Offset: 0x218 Address Map Register 6 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |addrmap_row_b12|HIF Address Bit for Row Address Bit 12 + * | | |Valid Range: 0 to 11, and 15 + * | | |Internal Base: 18 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |If unused, set to 15 and then row address bit 12 is set to 0. + * | | |Programming Mode: Static + * |[11:8] |addrmap_row_b13|HIF Address Bit for Row Address Bit 13 + * | | |Valid Range: 0 to 11, and 15 + * | | |Internal Base: 19 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |If unused, set to 15 and then row address bit 13 is set to 0. + * | | |Programming Mode: Static + * |[19:16] |addrmap_row_b14|HIF Address Bit for Row Address Bit 14 + * | | |Valid Range: 0 to 11, and 15 + * | | |Internal Base: 20 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |If unused, set to 15 and then row address bit 14 is set to 0. + * | | |Programming Mode: Static + * |[27:24] |addrmap_row_b15|HIF Address Bit for Row Address Bit 15 + * | | |Valid Range: 0 to 11, and 15 + * | | |Internal Base: 21 + * | | |The selected HIF address bit is determined by adding the internal base to the value of this field. + * | | |If unused, set to 15 and then row address bit 15 is set to 0. + * | | |Programming Mode: Static + * @var UMCTL2_T::ADDRMAP9 + * Offset: 0x224 Address Map Register 9 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |addrmap_row_b2|HIF Address Bits for Row Address Bit 2 + * | | |Valid Range: 0 to 11 + * | | |Internal Base: 8 + * | | |The selected HIF address bit for each of the row address bits is determined by adding the internal base to the value of this field + * | | |This register field is used only when ADDRMAP5.addrmap_row_b2_10 is set to value 15. + * | | |Programming Mode: Static + * |[11:8] |addrmap_row_b3|HIF Address Bits for Row Address Bit 3 + * | | |Valid Range: 0 to 11 + * | | |Internal Base: 9 + * | | |The selected HIF address bit for each of the row address bits is determined by adding the internal base to the value of this field + * | | |This register field is used only when ADDRMAP5.addrmap_row_b2_10 is set to value 15. + * | | |Programming Mode: Static + * |[19:16] |addrmap_row_b4|HIF Address Bits for Row Address Bit 4 + * | | |Valid Range: 0 to 11 + * | | |Internal Base: 10 + * | | |The selected HIF address bit for each of the row address bits is determined by adding the internal base to the value of this field + * | | |This register field is used only when ADDRMAP5.addrmap_row_b2_10 is set to value 15. + * | | |Programming Mode: Static + * |[27:24] |addrmap_row_b5|HIF Address Bits for Row Address Bit 5 + * | | |Valid Range: 0 to 11 + * | | |Internal Base: 11 + * | | |The selected HIF address bit for each of the row address bits is determined by adding the internal base to the value of this field + * | | |This register field is used only when ADDRMAP5.addrmap_row_b2_10 is set to value 15. + * | | |Programming Mode: Static + * @var UMCTL2_T::ADDRMAP10 + * Offset: 0x228 Address Map Register 10 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |addrmap_row_b6|HIF Address Bits for Row Address Bit 6 + * | | |Valid Range: 0 to 11 + * | | |Internal Base: 12 + * | | |The selected HIF address bit for each of the row address bits is determined by adding the internal base to the value of this field + * | | |This register field is used only when ADDRMAP5.addrmap_row_b2_10 is set to value 15. + * | | |Programming Mode: Static + * |[11:8] |addrmap_row_b7|HIF Address Bits for Row Address Bit 7 + * | | |Valid Range: 0 to 11 + * | | |Internal Base: 13 + * | | |The selected HIF address bit for each of the row address bits is determined by adding the internal base to the value of this field + * | | |This register field is used only when ADDRMAP5.addrmap_row_b2_10 is set to value 15. + * | | |Programming Mode: Static + * |[19:16] |addrmap_row_b8|HIF Address Bits for Row Address Bit 8 + * | | |Valid Range: 0 to 11 + * | | |Internal Base: 14 + * | | |The selected HIF address bit for each of the row address bits is determined by adding the internal base to the value of this field + * | | |This register field is used only when ADDRMAP5.addrmap_row_b2_10 is set to value 15. + * | | |Programming Mode: Static + * |[27:24] |addrmap_row_b9|HIF Address Bits for Row Address Bit 9 + * | | |Valid Range: 0 to 11 + * | | |Internal Base: 15 + * | | |The selected HIF address bit for each of the row address bits is determined by adding the internal base to the value of this field + * | | |This register field is used only when ADDRMAP5.addrmap_row_b2_10 is set to value 15. + * | | |Programming Mode: Static + * @var UMCTL2_T::ADDRMAP11 + * Offset: 0x22C Address Map Register 11 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |addrmap_row_b10|HIF Address Bits for Row Address Bit 10 + * | | |Valid Range: 0 to 11 + * | | |Internal Base: 16 + * | | |The selected HIF address bit for each of the row address bits is determined by adding the internal base to the value of this field + * | | |This register field is used only when ADDRMAP5.addrmap_row_b2_10 is set to value 15. + * | | |Programming Mode: Static + * @var UMCTL2_T::ODTCFG + * Offset: 0x240 ODT Configuration Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[6:2] |rd_odt_delay|Delay in DFI PHY Clock Cycles from Issuing a Read Command to Setting ODT Values Associated with that Command + * | | |ODT setting must remain constant for the entire time that DQS is driven by the uMCTL2. + * | | |Recommended values: + * | | |DDR2: + * | | |u00B7 CL + AL - 4 (not DDR2-1066), + * | | |u00B7 CL + AL - 5 (DDR2-1066) If (CL + AL - 4 < 0), uMCTL2 does not support ODT for read operation. + * | | |DDR3: + * | | |u00B7 CL - CWL + * | | |Unit: DFI PHY clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 1, Group 4 + * |[11:8] |rd_odt_hold|DFI PHY Clock Cycles to Hold ODT for a Read Command + * | | |The minimum supported value is 2. + * | | |Recommended values: + * | | |DDR2: + * | | |u00B7 BL8 - 0x6 (not DDR2-1066), 0x7 (DDR2-1066) + * | | |u00B7 BL4 - 0x4 (not DDR2-1066), 0x5 (DDR2-1066) + * | | |DDR3: + * | | |u00B7 BL8 - 0x6 + * | | |Unit: DFI PHY clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 1, Group 4 + * |[20:16] |wr_odt_delay|Delay in DFI PHY Clock Cycles from Issuing a Write Command to Setting ODT Values Associated with that Command + * | | |ODT setting must remain constant for the entire time that DQS is driven by the uMCTL2. + * | | |Recommended values: + * | | |DDR2: + * | | |u00B7 CWL + AL - 3 (DDR2-400/533/667), + * | | |u00B7 CWL + AL - 4 (DDR2-800), + * | | |u00B7 CWL + AL - 5 (DDR2-1066) If (CWL + AL - 3 < 0), uMCTL2 does not support ODT for write operation. + * | | |DDR3: + * | | |u00B7 0x0 + * | | |Unit: DFI PHY clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 1, Group 4 + * |[27:24] |wr_odt_hold|DFI PHY Clock Cycles to Hold ODT for a Write Command + * | | |The minimum supported value is 2. + * | | |Recommended values: + * | | |DDR2: + * | | |u00B7 BL8 - 0x5 (DDR2-400/533/667), 0x6 (DDR2-800), 0x7 (DDR2-1066) + * | | |u00B7 BL4 - 0x3 (DDR2-400/533/667), 0x4 (DDR2-800), 0x5 (DDR2-1066) + * | | |DDR3: + * | | |u00B7 BL8 - 0x6 + * | | |Unit: DFI PHY clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 1, Group 4 + * @var UMCTL2_T::ODTMAP + * Offset: 0x244 ODT/Rank Map Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |rank0_wr_odt|Remote ODTs Must be Turned on During a Write to Rank 0. + * | | |Each rank has a remote ODT (in the SDRAM) which can be turned on by setting the appropriate bit here. + * | | |Rank 0 is controlled by the LSB; rank 1 is controlled by bit next to the LSB, and so on. + * | | |For each rank, set its bit to 1 to enable its ODT. + * | | |Programming Mode: Static + * |[5:4] |rank0_rd_odt|Remote ODTs Must be Turned on During a Read from Rank 0 + * | | |Each rank has a remote ODT (in the SDRAM) which can be turned on by setting the appropriate bit here. + * | | |Rank 0 is controlled by the LSB; rank 1 is controlled by bit next to the LSB, and so on. + * | | |For each rank, set its bit to 1 to enable its ODT. + * | | |Programming Mode: Static + * |[9:8] |rank1_wr_odt|Remote ODTs Must be Turned on During a Write to Rank 1 + * | | |Each rank has a remote ODT (in the SDRAM) which can be turned on by setting the appropriate bit here. + * | | |Rank 0 is controlled by the LSB; rank 1 is controlled by bit next to the LSB, and so on. + * | | |For each rank, set its bit to 1 to enable its ODT. + * | | |Present only in configurations that have 2 or more ranks. + * | | |Programming Mode: Static + * |[13:12] |rank1_rd_odt|Remote ODTs Must be Turned on During a Read from Rank 1 + * | | |Each rank has a remote ODT (in the SDRAM) which can be turned on by setting the appropriate bit here. + * | | |Rank 0 is controlled by the LSB; rank 1 is controlled by bit next to the LSB, and so on. + * | | |For each rank, set its bit to 1 to enable its ODT. + * | | |Present only in configurations that have 2 or more ranks. + * | | |Programming Mode: Static + * @var UMCTL2_T::SCHED + * Offset: 0x250 Scheduler Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |prefer_write|Setting Bit for Bank Selector Prefers Writes over Reads + * | | |If set, then the bank selector prefers writes over reads. + * | | |FOR DEBUG ONLY. + * | | |Programming Mode: Static + * |[2] |Pageclose |Page Close Bit + * | | |If true, bank is kept open only while there are page hit transactions available in the CAM to that bank. + * | | |The last read or write command in the CAM with a bank and page hit is executed with auto-precharge if SCHED1.pageclose_timer=0. + * | | |Even if this register set to 1 and SCHED1.pageclose_timer is set to 0, explicit precharge (and not auto-precharge) may be issued in some cases where there is a mode switch between Write and Read or between LPR and HPR + * | | |The Read and Write commands that are executed as part of the ECC scrub requests are also executed without auto-precharge. + * | | |If false, the bank remains open until there is a need to close it (to open a different page, or for page timeout or refresh timeout) - also known as open page policy + * | | |The open page policy can be overridden by setting the per-command-autopre bit on the HIF interface (hif_cmd_autopre). + * | | |The pageclose feature provids a midway between Open and Close page policies. + * | | |FOR PERFORMANCE ONLY. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[12:8] |lpr_num_entries|Number of Entries in the Low Priority Transaction Store + * | | |It is this value + 1. + * | | |(MEMC_NO_OF_ENTRY (hardware configures to 32) - (SCHED.lpr_num_entries + 1)) is the number of entries available for the high priority transaction store. + * | | |Setting this to maximum value allocates all entries to low priority transaction store. + * | | |Setting this to 0 allocates 1 entry to low priority transaction store and the rest to high priority transaction store. + * | | |Programming Mode: Static + * |[23:16] |go2critical_hysteresis|UNUSED. + * | | |Programming Mode: Static + * |[30:24] |rdwr_idle_gap|Switch Clock Cycles Between Different Transaction Store + * | | |When the preferred transaction store is empty for these many clock cycles, switch to the alternate transaction store if it is non-empty. + * | | |The read transaction store (both high and low priority) is the default preferred transaction store and the write transaction store is the alternative store. + * | | |When prefer write over read is set this is reversed. + * | | |0x0 is a legal value for this register + * | | |When set to 0x0, the transaction store switching happens immediately when the switching conditions become true. + * | | |FOR PERFORMANCE ONLY. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Static + * @var UMCTL2_T::SCHED1 + * Offset: 0x254 Scheduler Control Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |pageclose_timer|Page Close Timer + * | | |This field works in conjunction with SCHED.pageclose + * | | |It only has meaning if SCHED.pageclose equals to 1. + * | | |If SCHED.pageclose==1 and pageclose_timer==0, then an auto-precharge may be scheduled for last read or write command in the CAM with a bank and page hit. + * | | |Note, sometimes an explicit precharge is scheduled instead of the auto-precharge + * | | |For more information, see SCHED.pageclose. + * | | |If SCHED.pageclose==1 and pageclose_timer>0, then an auto-precharge is not scheduled for last read or write command in the CAM with a bank and page hit. + * | | |Instead, a timer is started, with pageclose_timer as the initial value. + * | | |There is a timer on a per bank basis. + * | | |The timer decrements unless the next read or write in the CAM to a bank is a page hit. + * | | |It gets reset to pageclose_timer value if the next read or write in the CAM to a bank is a page hit. + * | | |Once the timer has reached zero, an explicit precharge is attempted to be scheduled. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Static + * @var UMCTL2_T::PERFHPR1 + * Offset: 0x25C High Priority Read CAM Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |hpr_max_starve|Number of DFI Clocks that the HPR Queue can be Starved Before It Goes Critical + * | | |Indicates the number of DFI clocks that the HPR queue can be starved before it goes critical. + * | | |The minimum valid functional value for this register is 0x1. + * | | |Programming it to 0x0 disables the starvation functionality. + * | | |During normal operation, this function must not be disabled as it causes excessive latencies. + * | | |FOR PERFORMANCE ONLY. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[31:24] |hpr_xact_run_length|Number of Transactions that are Serviced once the HPR Queue Goes Critical + * | | |Indicates the number of transactions that are serviced once the HPR queue goes critical is the smaller of: + * | | |u00B7 (a) This number + * | | |u00B7 (b) Number of transactions available + * | | |Unit: Transaction. + * | | |FOR PERFORMANCE ONLY. + * | | |Programming Mode: Quasi-dynamic Group 3 + * @var UMCTL2_T::PERFLPR1 + * Offset: 0x264 Low Priority Read CAM Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |lpr_max_starve|Number of DFI Clocks that the LPR Queue can be Starved Before It Goes Critical + * | | |Indicates the number of DFI clocks that the LPR queue can be starved before it goes critical. + * | | |The minimum valid functional value for this register is 0x1. + * | | |Programming it to 0x0 disables the starvation functionality. + * | | |During normal operation, this function must not be disabled as it causes excessive latencies. + * | | |FOR PERFORMANCE ONLY. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[31:24] |lpr_xact_run_length|Number of Transactions that are Serviced Once the LPR Queue Goes Critical + * | | |Indicates the number of transactions that are serviced once the LPR queue goes critical is the smaller of: + * | | |u00B7 (a) This number + * | | |u00B7 (b) Number of transactions available + * | | |Unit: Transaction. + * | | |FOR PERFORMANCE ONLY. + * | | |Programming Mode: Quasi-dynamic Group 3 + * @var UMCTL2_T::PERFWR1 + * Offset: 0x26C Write CAM Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |w_max_starve|Number of DFI Clocks that the WR Queue can be Starved Before It Goes Critical + * | | |Indicates the number of DFI clocks that the WR queue can be starved before it goes critical. + * | | |The minimum valid functional value for this register is 0x1. + * | | |Programming it to 0x0 disables the starvation functionality. + * | | |During normal operation, this function must not be disabled as it causes excessive latencies. + * | | |FOR PERFORMANCE ONLY. + * | | |Unit: DFI clock cycles. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[31:24] |w_xact_run_length|Number of Transactions that are Serviced Once the WR Queue Goes Critical + * | | |Indicates the number of transactions that are serviced once the WR queue goes critical is the smaller of: + * | | |u00B7 (a) This number + * | | |u00B7 (b) Number of transactions available + * | | |Unit: Transaction. + * | | |FOR PERFORMANCE ONLY. + * | | |Programming Mode: Quasi-dynamic Group 3 + * @var UMCTL2_T::DBG0 + * Offset: 0x300 Debug Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |dis_wc |Disable Bit for Write Combine + * | | |When 1, disable write combine. + * | | |FOR DEBUG ONLY. + * | | |Programming Mode: Static + * |[1] |dis_rd_bypass|Disable Bit for Bypass Path for High Priority Read Page Hits + * | | |Only present in designs supporting read bypass. + * | | |When 1, disable bypass path for high priority read page hits. + * | | |FOR DEBUG ONLY. + * | | |Programming Mode: Static + * |[2] |dis_act_bypass|Disable Bit for Bypass Path for High Priority Read Activates + * | | |Only present in designs supporting activate bypass. + * | | |When 1, disable bypass path for high priority read activates. + * | | |FOR DEBUG ONLY. + * | | |Programming Mode: Static + * |[4] |dis_collision_page_opt|Disable Bit for Collision Page Option + * | | |When this is set to '0', auto-precharge is disabled for the flushed command in a collision case. + * | | |Collision cases are write followed by read to same address, read followed by write to same address, or write followed by write to same address with DBG0.dis_wc bit = 1 (where same address comparisons exclude the two address bits representing critical word). + * | | |FOR DEBUG ONLY. + * | | |Programming Mode: Static + * |[6] |dis_max_rank_rd_opt|Disable Bit to Optimize max_rank_rd and max_logical_rank_rd + * | | |This register is for debug purpose only. + * | | |For normal operation, this register must be set to 0. + * | | |Programming Mode: Static + * |[7] |dis_max_rank_wr_opt|Disable Bit to Optimize max_rank_wr and max_logical_rank_wr + * | | |This register is for debug purpose only. + * | | |For normal operation, this register must be set to 0. + * | | |Programming Mode: Static + * @var UMCTL2_T::DBG1 + * Offset: 0x304 Debug Register 1 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |dis_dq |Disable Bit for De-queue Transactions + * | | |When 1, uMCTL2 does not de-queue any transactions from the CAM. + * | | |Bypass is also disabled. + * | | |All transactions are queued in the CAM + * | | |No reads or writes are issued to SDRAM as long as this is asserted. + * | | |This bit may be used to prevent reads or writes being issued by the uMCTL2, which makes it safe to modify certain register fields associated with reads and writes. + * | | |After setting this bit, it is strongly recommended to poll DBGCAM.wr_data_pipeline_empty and DBGCAM.rd_data_pipeline_empty, before making changes to any registers which affect reads and writes. + * | | |This ensures that the relevant logic in the DDRC is idle. + * | | |This bit is intended to be switched on-the-fly. + * | | |Programming Mode: Dynamic + * |[1] |dis_hif |Disable Bit for HIF Command + * | | |When 1, uMCTL2 asserts the HIF command signal hif_cmd_stall. + * | | |uMCTL2 ignores the hif_cmd_valid and all other associated request signals. + * | | |This bit is intended to be switched on-the-fly. + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::DBGCAM + * Offset: 0x308 CAM Debug Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |dbg_hpr_q_depth|High Priority Read Queue Depth + * | | |FOR DEBUG ONLY. + * | | |Programming Mode: Dynamic + * |[13:8] |dbg_lpr_q_depth|Low Priority Read Queue Depth + * | | |The last entry of LPR queue is reserved for ECC SCRUB operation + * | | |This entry is not included in the calculation of the queue depth. + * | | |FOR DEBUG ONLY + * | | |Programming Mode: Dynamic + * |[21:16] |dbg_w_q_depth|Write Queue Depth + * | | |The last entry of WR queue is reserved for ECC SCRUB operation + * | | |This entry is not included in the calculation of the queue depth. + * | | |FOR DEBUG ONLY + * | | |Programming Mode: Dynamic + * |[24] |dbg_stall |Command Queues and Data Buffers Stall + * | | |FOR DEBUG ONLY. + * | | |Programming Mode: Dynamic + * |[25] |dbg_rd_q_empty|Read Command Queues and Read Data Buffers Empty + * | | |When 1, all the Read command queues and Read data buffers inside DDRC are empty. + * | | |This register is to be used for debug purpose. + * | | |An example use-case scenario: When the controller enters self-refresh using the Low-Power entry sequence, controller is expected to have executed all the commands in its queues and the write and read data drained + * | | |Hence this register must be 1 at that time. + * | | |FOR DEBUG ONLY + * | | |Programming Mode: Dynamic + * |[26] |dbg_wr_q_empty|Write Command Queues and Write Data Buffers Empty + * | | |When 1, all the Write command queues and Write data buffers inside DDRC are empty. + * | | |This register is to be used for debug purpose. + * | | |An example use-case scenario: When the controller enters self-refresh using the Low-Power entry sequence, controller is expected to have executed all the commands in its queues and the write and read data drained + * | | |Hence this register must be 1 at that time. + * | | |FOR DEBUG ONLY + * | | |Programming Mode: Dynamic + * |[28] |rd_data_pipeline_empty|Read Data Pipeline Empty + * | | |This bit indicates that the read data pipeline on the DFI interface is empty. + * | | |This register is intended to be polled at least twice after setting DBG1.dis_dq, to ensure that all remaining commands/data have completed. + * | | |Programming Mode: Dynamic + * |[29] |wr_data_pipeline_empty|Write Data Pipeline Empty + * | | |This bit indicates that the write data pipeline on the DFI interface is empty. + * | | |This register is intended to be polled at least twice after setting DBG1.dis_dq, to ensure that all remaining commands/data have completed. + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::DBGCMD + * Offset: 0x30C Command Debug Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |rank0_refresh|Signal for uMCTL2 to Issue Refresh to Rank 0 + * | | |Setting this register bit to 1 indicates to the uMCTL2 to issue a refresh to rank 0. + * | | |Writing to this bit causes DBGSTAT.rank0_refresh_busy to be set. + * | | |When DBGSTAT.rank0_refresh_busy is cleared, the command has been stored in uMCTL2. + * | | |For 3DS configuration, refresh is sent to rank index 0. + * | | |This operation can be performed only when RFSHCTL3.dis_auto_refresh=1. + * | | |It is recommended NOT to set this register bit if in Init or Deep power-down operating modes or Maximum Power Saving Mode. + * | | |Testable: readOnly + * | | |Programming Mode: Dynamic + * |[1] |rank1_refresh|Signal for uMCTL2 to Issue Refresh to Rank 1 + * | | |Setting this register bit to 1 indicates to the uMCTL2 to issue a refresh to rank 1. + * | | |Writing to this bit causes DBGSTAT.rank1_refresh_busy to be set. + * | | |When DBGSTAT.rank1_refresh_busy is cleared, the command has been stored in uMCTL2. + * | | |For 3DS configuration, refresh is sent to rank index 1. + * | | |This operation can be performed only when RFSHCTL3.dis_auto_refresh=1. + * | | |It is recommended NOT to set this register bit if in Init or Deep power-down operating modes or Maximum Power Saving Mode. + * | | |Testable: readOnly + * | | |Programming Mode: Dynamic + * |[4] |zq_calib_short|Signal for uMCTL2 to Issue ZQCS to SDRAM + * | | |Setting this register bit to 1 indicates to the uMCTL2 to issue a ZQCS (ZQ calibration short)/MPC(ZQ calibration) command to the SDRAM. + * | | |When this request is stored in the uMCTL2, the bit is automatically cleared. + * | | |This operation can be performed only when ZQCTL0.dis_auto_zq=1. + * | | |It is recommended NOT to set this register bit if in Init, in self-refresh or Deep power-down operating modes or Maximum Power Saving Mode. + * | | |For Deep power down and Maximum Power Saving Mode, it is not scheduled, although DBGSTAT.zq_calib_short_busy is de-asserted. + * | | |Testable: readOnly + * | | |Programming Mode: Dynamic + * |[5] |ctrlupd |Signal for uMCTL2 to Issue dfi_ctrlupd_req to PHY + * | | |Setting this register bit to 1 indicates to the uMCTL2 to issue a dfi_ctrlupd_req to the PHY. + * | | |When this request is stored in the uMCTL2, the bit is automatically cleared. + * | | |This operation must only be performed when DFIUPD0.dis_auto_ctrlupd=1. + * | | |Testable: readOnly + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::DBGSTAT + * Offset: 0x310 Status Debug Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |rank0_refresh_busy|Rank0 Refresh Operation Busy + * | | |SoC might initiate a rank0_refresh operation (refresh operation to rank 0) only if this signal is low. + * | | |This signal goes high in the clock after DBGCMD.rank0_refresh is set to one + * | | |It goes low when the rank0_refresh operation is stored in the uMCTL2. + * | | |It is recommended not to perform rank0_refresh operations when this signal is high. + * | | |u00B7 0 - Indicates that the SoC can initiate a rank0_refresh operation + * | | |u00B7 1 - Indicates that rank0_refresh operation has not been stored yet in the uMCTL2 + * | | |Programming Mode: Dynamic + * |[1] |rank1_refresh_busy|Rank1 Refresh Operation Busy + * | | |SoC might initiate a rank1_refresh operation (refresh operation to rank 1) only if this signal is low. + * | | |This signal goes high in the clock after DBGCMD.rank1_refresh is set to one + * | | |It goes low when the rank1_refresh operation is stored in the uMCTL2. + * | | |It is recommended not to perform rank1_refresh operations when this signal is high. + * | | |u00B7 0 - Indicates that the SoC can initiate a rank1_refresh operation + * | | |u00B7 1 - Indicates that rank1_refresh operation has not been stored yet in the uMCTL2 + * | | |Programming Mode: Dynamic + * |[4] |zq_calib_short_busy|ZQCS Operation Busy State + * | | |SoC might initiate a ZQCS (ZQ calibration short) operation only if this signal is low. + * | | |This signal goes high in the clock after the uMCTL2 accepts the ZQCS request. + * | | |It goes low when the ZQCS operation is initiated in the uMCTL2 + * | | |It is recommended not to perform ZQCS operations when this signal is high. + * | | |u00B7 0 - Indicates that the SoC can initiate a ZQCS operation + * | | |u00B7 1 - Indicates that ZQCS operation has not been initiated yet in the uMCTL2 + * | | |Programming Mode: Dynamic + * |[5] |ctrlupd_busy|ctrlupd Operation Busy State + * | | |SoC might initiate a ctrlupd operation only if this signal is low. + * | | |This signal goes high in the clock after the uMCTL2 accepts the ctrlupd request. + * | | |It goes low when the ctrlupd operation is initiated in the uMCTL2. + * | | |It is recommended not to perform ctrlupd operations when this signal is high. + * | | |u00B7 0 - Indicates that the SoC can initiate a ctrlupd operation + * | | |u00B7 1 - Indicates that ctrlupd operation has not been initiated yet in the uMCTL2 + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::SWCTL + * Offset: 0x320 Software Register Programming Control Enable + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |sw_done |Quasi-Dynamic Register Programming Enable Bit + * | | |Enables quasi-dynamic register programming outside reset. + * | | |Program this register to 0 to enable quasi-dynamic programming. + * | | |Set back register to 1 once programming is done. + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::SWSTAT + * Offset: 0x324 Software Register Programming Control Status + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |sw_done_ack|Register Programming Done ACK + * | | |This register is the echo of SWCTL.sw_done. + * | | |Wait for sw_done value 1 to propagate to sw_done_ack at the end of the programming sequence to ensure that the correct registers values are propagated to the destination clock domains. + * | | |Testable: untestable + * | | |Programming Mode: Static + * @var UMCTL2_T::SWCTLSTATIC + * Offset: 0x328 Static Registers Write Enable + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |sw_static_unlock|Static Register Programming Unlock Bit + * | | |Enables static register programming outside reset. + * | | |Program this register to 1 to enable static register programming. + * | | |Set register back to 0 once programming is done. + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::POISONCFG + * Offset: 0x36C AXI Poison Configuration Register. Common for all AXI ports. + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |wr_poison_slverr_en|Write Transaction Poisoning SLVERR Response Enable Bit + * | | |If set to 1, enables SLVERR response for write transaction poisoning. + * | | |Programming Mode: Dynamic + * |[4] |wr_poison_intr_en|Write Transaction Poisoning Interrupt Enable Bit + * | | |If set to 1, enables interrupts for write transaction poisoning. + * | | |Programming Mode: Dynamic + * |[8] |wr_poison_intr_clr|Write Transaction Poisoning Interrupt Clear Bit + * | | |Interrupt clear for write transaction poisoning. + * | | |Allow 2/3 clock cycles for correct value to propagate to controller logic and clear the interrupts. + * | | |uMCTL2 automatically clears this bit. + * | | |Testable: readOnly + * | | |Programming Mode: Dynamic + * |[16] |rd_poison_slverr_en|Read Transaction Poisoning SLVERR Response Enable Bit + * | | |If set to 1, enables SLVERR response for read transaction poisoning. + * | | |Programming Mode: Dynamic + * |[20] |rd_poison_intr_en|Read Transaction Poisoning Interrupt Enable Bit + * | | |If set to 1, enables interrupts for read transaction poisoning. + * | | |Programming Mode: Dynamic + * |[24] |rd_poison_intr_clr|Read Transaction Poisoning Interrupt Clear Bit + * | | |Allow 2/3 clock cycles for correct value to propagate to controller logic and clear the interrupts. + * | | |uMCTL2 automatically clears this bit. + * | | |Testable: readOnly + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::POISONSTAT + * Offset: 0x370 AXI Poison Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |wr_poison_intr_0|Write Transaction Poisoning Error Interrupt for Port 0 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's write address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register wr_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[1] |wr_poison_intr_1|Write Transaction Poisoning Error Interrupt for Port 1 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's write address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register wr_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[2] |wr_poison_intr_2|Write Transaction Poisoning Error Interrupt for Port 2 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's write address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register wr_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[3] |wr_poison_intr_3|Write Transaction Poisoning Error Interrupt for Port 3 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's write address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register wr_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[4] |wr_poison_intr_4|Write Transaction Poisoning Error Interrupt for Port 4 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's write address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register wr_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[5] |wr_poison_intr_5|Write Transaction Poisoning Error Interrupt for Port 5 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's write address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register wr_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[6] |wr_poison_intr_6|Write Transaction Poisoning Error Interrupt for Port 6 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's write address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register wr_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[7] |wr_poison_intr_7|Write Transaction Poisoning Error Interrupt for Port 7 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's write address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register wr_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[16] |rd_poison_intr_0|Read Transaction Poisoning Error Interrupt for Port 0 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's read address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register rd_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[17] |rd_poison_intr_1|Read Transaction Poisoning Error Interrupt for Port 1 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's read address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register rd_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[18] |rd_poison_intr_2|Read Transaction Poisoning Error Interrupt for Port 2 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's read address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register rd_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[19] |rd_poison_intr_3|Read Transaction Poisoning Error Interrupt for Port 3 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's read address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register rd_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[20] |rd_poison_intr_4|Read Transaction Poisoning Error Interrupt for Port 4 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's read address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register rd_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[21] |rd_poison_intr_5|Read Transaction Poisoning Error Interrupt for Port 5 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's read address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register rd_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[22] |rd_poison_intr_6|Read Transaction Poisoning Error Interrupt for Port 6 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's read address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register rd_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * |[23] |rd_poison_intr_7|Read Transaction Poisoning Error Interrupt for Port 7 + * | | |This register is a APB clock copy (double register synchronizer) of the interrupt asserted when a transaction is poisoned on the corresponding AXI port's read address channel. + * | | |Bit 0 corresponds to Port 0, and so on + * | | |Interrupt is cleared by register rd_poison_intr_clr, then value propagated to APB clock. + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::PSTAT + * Offset: 0x3FC Port Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |rd_port_busy_0|Outstanding Reads for AXI Port 0 + * | | |Indicates if there are outstanding reads for AXI port 0. + * | | |Programming Mode: Dynamic + * |[1] |rd_port_busy_1|Outstanding Reads for AXI Port 1 + * | | |Indicates if there are outstanding reads for AXI port 1. + * | | |Programming Mode: Dynamic + * |[2] |rd_port_busy_2|Outstanding Reads for AXI Port 2 + * | | |Indicates if there are outstanding reads for AXI port 2. + * | | |Programming Mode: Dynamic + * |[3] |rd_port_busy_3|Outstanding Reads for AXI Port 3 + * | | |Indicates if there are outstanding reads for AXI port 3. + * | | |Programming Mode: Dynamic + * |[4] |rd_port_busy_4|Outstanding Reads for AXI Port 4 + * | | |Indicates if there are outstanding reads for AXI port 4. + * | | |Programming Mode: Dynamic + * |[5] |rd_port_busy_5|Outstanding Reads for AXI Port 5 + * | | |Indicates if there are outstanding reads for AXI port 5. + * | | |Programming Mode: Dynamic + * |[6] |rd_port_busy_6|Outstanding Reads for AXI Port 6 + * | | |Indicates if there are outstanding reads for AXI port 6. + * | | |Programming Mode: Dynamic + * |[7] |rd_port_busy_7|Outstanding Reads for AXI Port 7 + * | | |Indicates if there are outstanding reads for AXI port 7. + * | | |Programming Mode: Dynamic + * |[16] |wr_port_busy_0|Outstanding Writes for AXI Port 0 + * | | |Indicates if there are outstanding writes for AXI port 0. + * | | |Programming Mode: Dynamic + * |[17] |wr_port_busy_1|Outstanding Writes for AXI Port 1 + * | | |Indicates if there are outstanding writes for AXI port 1. + * | | |Programming Mode: Dynamic + * |[18] |wr_port_busy_2|Outstanding Writes for AXI Port 2 + * | | |Indicates if there are outstanding writes for AXI port 2. + * | | |Programming Mode: Dynamic + * |[19] |wr_port_busy_3|Outstanding Writes for AXI Port 3 + * | | |Indicates if there are outstanding writes for AXI port 3. + * | | |Programming Mode: Dynamic + * |[20] |wr_port_busy_4|Outstanding Writes for AXI Port 4 + * | | |Indicates if there are outstanding writes for AXI port 4. + * | | |Programming Mode: Dynamic + * |[21] |wr_port_busy_5|Outstanding Writes for AXI Port 5 + * | | |Indicates if there are outstanding writes for AXI port 5. + * | | |Programming Mode: Dynamic + * |[22] |wr_port_busy_6|Outstanding Writes for AXI Port 6 + * | | |Indicates if there are outstanding writes for AXI port 6. + * | | |Programming Mode: Dynamic + * |[23] |wr_port_busy_7|Outstanding Writes for AXI Port 7 + * | | |Indicates if there are outstanding writes for AXI port 7. + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::PCCFG + * Offset: 0x400 Port Common Configuration Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |go2critical_en|go2critical Function Enable Bit + * | | |If set to 1 (enabled), sets co_gs_go2critical_wr and co_gs_go2critical_lpr/co_gs_go2critical_hpr signals going to DDRC based on urgent input (awurgent, arurgent) coming from AXI master. + * | | |If set to 0 (disabled), co_gs_go2critical_wr and co_gs_go2critical_lpr/co_gs_go2critical_hpr signals at DDRC are driven to 1b'0. + * | | |For uPCTL2, this register field must be set to 0. + * | | |Programming Mode: Static + * |[4] |pagematch_limit|Page Match Four Limit + * | | |If set to 1, limits the number of consecutive same page DDRC transactions that can be granted by the Port Arbiter to four when Page Match feature is enabled. + * | | |If set to 0, there is no limit imposed on number of consecutive same page DDRC transactions. + * | | |Programming Mode: Static + * |[8] |bl_exp_mode|Burst Length Expansion Mode + * | | |By default, (that is, bl_exp_mode==0) XPI expands every AXI burst into multiple HIF commands, using the memory burst length as a unit + * | | |If set to 1, then XPI uses half of the memory burst length as a unit. + * | | |This applies to both reads and writes + * | | |When MSTR.data_bus_width==00, setting bl_exp_mode to 1 has no effect. + * | | |Functionality is also not supported if Data Channel Interleave is enabled. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCFGR_0 + * Offset: 0x404 Port n Configuration Read Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |rd_port_priority|Read Channel of Port Priority + * | | |Determines the initial load value of read aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted + * | | |The higher significant 5-bits of the read aging counter sets the priority of the read channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease. + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level (timeout condition - Priority0). + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (arqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |In this case, external dynamic priority input, arqos (for reads only) can still be used to set the DDRC read priority (2 priority levels: low priority read - LPR, high priority read - HPR) on a command by command basis. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |rd_port_aging_en|Read Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the read channel of the port. + * | | |Programming Mode: Static + * |[13] |rd_port_urgent_en|AXI Urgent Sideband Signal (arurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (arurgent) + * | | |When enabled and arurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_lpr/co_gs_go2critical_hpr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that arurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |rd_port_pagematch_en|Read Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * |[16] |rdwr_ordered_en|Read/Writes Ordered Enable Bit + * | | |If set to 1, preserves the ordering between read transaction and write transaction issued to the same address, on a given port. + * | | |In other words, the controller ensures that all same address read and write commands from the application port interface are transported to the DFI interface in the order of acceptance. + * | | |This feature is useful in cases where software coherency is desired for masters issuing back-to-back read/write transactions without waiting for write/read responses. + * | | |Note that this register has an effect only if necessary logic is instantiated through the UMCTL2_RDWR_ORDERED_n parameter. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCFGW_0 + * Offset: 0x408 Port n Configuration Write Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |wr_port_priority|Write Channel of Port Priority + * | | |Determines the initial load value of write aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted. + * | | |The higher significant 5-bits of the write aging counter sets the initial priority of the write channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level. + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (awqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |wr_port_aging_en|Write Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the write channel of the port. + * | | |Programming Mode: Static + * |[13] |wr_port_urgent_en|AXI Urgent Sideband Signal (awurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (awurgent). + * | | |When enabled and awurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_wr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that awurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |wr_port_pagematch_en|Write Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature. + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCTRL_0 + * Offset: 0x490 Port n Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |port_en |AXI Port n Enable Bit + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::PCFGQOS0_0 + * Offset: 0x494 Port n Read QoS Configuration Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |rqos_map_level1|End of Region0 Mapping + * | | |Separation level1 indicating the end of region0 mapping; start of region0 is 0 + * | | |Possible values for level1 are 0 to 13 (for dual RAQ) or 0 to 14 (for single RAQ) which corresponds to arqos. + * | | |Note that for PA, arqos values are used directly as port priorities, where the higher the value corresponds to higher port priority. + * | | |All of the map_level* registers must be set to distinct values. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[17:16] |rqos_map_region0|Traffic Class of Region 0 + * | | |This bit field indicates the traffic class of region 0. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region 0 maps to the blue address queue. + * | | |In this case, valid values are: + * | | |0: LPR and 1: VPR only. + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region0 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[21:20] |rqos_map_region1|Traffic Class of Region 1 + * | | |This bit field indicates the traffic class of region 1. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region1 maps to the blue address queue. + * | | |In this case, valid values are + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR only + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region 1 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * @var UMCTL2_T::PCFGR_1 + * Offset: 0x4B4 Port n Configuration Read Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |rd_port_priority|Read Channel of Port Priority + * | | |Determines the initial load value of read aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted + * | | |The higher significant 5-bits of the read aging counter sets the priority of the read channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease. + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level (timeout condition - Priority0). + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (arqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |In this case, external dynamic priority input, arqos (for reads only) can still be used to set the DDRC read priority (2 priority levels: low priority read - LPR, high priority read - HPR) on a command by command basis. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |rd_port_aging_en|Read Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the read channel of the port. + * | | |Programming Mode: Static + * |[13] |rd_port_urgent_en|AXI Urgent Sideband Signal (arurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (arurgent) + * | | |When enabled and arurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_lpr/co_gs_go2critical_hpr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that arurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |rd_port_pagematch_en|Read Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * |[16] |rdwr_ordered_en|Read/Writes Ordered Enable Bit + * | | |If set to 1, preserves the ordering between read transaction and write transaction issued to the same address, on a given port. + * | | |In other words, the controller ensures that all same address read and write commands from the application port interface are transported to the DFI interface in the order of acceptance. + * | | |This feature is useful in cases where software coherency is desired for masters issuing back-to-back read/write transactions without waiting for write/read responses. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCFGW_1 + * Offset: 0x4B8 Port n Configuration Write Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |wr_port_priority|Write Channel of Port Priority + * | | |Determines the initial load value of write aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted. + * | | |The higher significant 5-bits of the write aging counter sets the initial priority of the write channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level. + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (awqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |wr_port_aging_en|Write Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the write channel of the port. + * | | |Programming Mode: Static + * |[13] |wr_port_urgent_en|AXI Urgent Sideband Signal (awurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (awurgent). + * | | |When enabled and awurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_wr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that awurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |wr_port_pagematch_en|Write Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature. + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCTRL_1 + * Offset: 0x540 Port n Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |port_en |AXI Port n Enable Bit + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::PCFGQOS0_1 + * Offset: 0x544 Port n Read QoS Configuration Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |rqos_map_level1|End of Region0 Mapping + * | | |Separation level1 indicating the end of region0 mapping; start of region0 is 0 + * | | |Possible values for level1 are 0 to 13 (for dual RAQ) or 0 to 14 (for single RAQ) which corresponds to arqos. + * | | |Note that for PA, arqos values are used directly as port priorities, where the higher the value corresponds to higher port priority. + * | | |All of the map_level* registers must be set to distinct values. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[17:16] |rqos_map_region0|Traffic Class of Region 0 + * | | |This bit field indicates the traffic class of region 0. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region 0 maps to the blue address queue. + * | | |In this case, valid values are: + * | | |0: LPR and 1: VPR only. + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region0 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[21:20] |rqos_map_region1|Traffic Class of Region 1 + * | | |This bit field indicates the traffic class of region 1. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region1 maps to the blue address queue. + * | | |In this case, valid values are + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR only + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region 1 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * @var UMCTL2_T::PCFGR_2 + * Offset: 0x564 Port n Configuration Read Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |rd_port_priority|Read Channel of Port Priority + * | | |Determines the initial load value of read aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted + * | | |The higher significant 5-bits of the read aging counter sets the priority of the read channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease. + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level (timeout condition - Priority0). + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (arqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |In this case, external dynamic priority input, arqos (for reads only) can still be used to set the DDRC read priority (2 priority levels: low priority read - LPR, high priority read - HPR) on a command by command basis. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |rd_port_aging_en|Read Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the read channel of the port. + * | | |Programming Mode: Static + * |[13] |rd_port_urgent_en|AXI Urgent Sideband Signal (arurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (arurgent) + * | | |When enabled and arurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_lpr/co_gs_go2critical_hpr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that arurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |rd_port_pagematch_en|Read Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * |[16] |rdwr_ordered_en|Read/Writes Ordered Enable Bit + * | | |If set to 1, preserves the ordering between read transaction and write transaction issued to the same address, on a given port. + * | | |In other words, the controller ensures that all same address read and write commands from the application port interface are transported to the DFI interface in the order of acceptance. + * | | |This feature is useful in cases where software coherency is desired for masters issuing back-to-back read/write transactions without waiting for write/read responses. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCFGW_2 + * Offset: 0x568 Port n Configuration Write Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |wr_port_priority|Write Channel of Port Priority + * | | |Determines the initial load value of write aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted. + * | | |The higher significant 5-bits of the write aging counter sets the initial priority of the write channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level. + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (awqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |wr_port_aging_en|Write Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the write channel of the port. + * | | |Programming Mode: Static + * |[13] |wr_port_urgent_en|AXI Urgent Sideband Signal (awurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (awurgent). + * | | |When enabled and awurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_wr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that awurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |wr_port_pagematch_en|Write Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature. + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCTRL_2 + * Offset: 0x5F0 Port n Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |port_en |AXI Port n Enable Bit + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::PCFGQOS0_2 + * Offset: 0x5F4 Port n Read QoS Configuration Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |rqos_map_level1|End of Region0 Mapping + * | | |Separation level1 indicating the end of region0 mapping; start of region0 is 0 + * | | |Possible values for level1 are 0 to 13 (for dual RAQ) or 0 to 14 (for single RAQ) which corresponds to arqos. + * | | |Note that for PA, arqos values are used directly as port priorities, where the higher the value corresponds to higher port priority. + * | | |All of the map_level* registers must be set to distinct values. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[17:16] |rqos_map_region0|Traffic Class of Region 0 + * | | |This bit field indicates the traffic class of region 0. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region 0 maps to the blue address queue. + * | | |In this case, valid values are: + * | | |0: LPR and 1: VPR only. + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region0 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[21:20] |rqos_map_region1|Traffic Class of Region 1 + * | | |This bit field indicates the traffic class of region 1. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region1 maps to the blue address queue. + * | | |In this case, valid values are + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR only + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region 1 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * @var UMCTL2_T::PCFGR_3 + * Offset: 0x614 Port n Configuration Read Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |rd_port_priority|Read Channel of Port Priority + * | | |Determines the initial load value of read aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted + * | | |The higher significant 5-bits of the read aging counter sets the priority of the read channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease. + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level (timeout condition - Priority0). + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (arqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |In this case, external dynamic priority input, arqos (for reads only) can still be used to set the DDRC read priority (2 priority levels: low priority read - LPR, high priority read - HPR) on a command by command basis. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |rd_port_aging_en|Read Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the read channel of the port. + * | | |Programming Mode: Static + * |[13] |rd_port_urgent_en|AXI Urgent Sideband Signal (arurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (arurgent) + * | | |When enabled and arurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_lpr/co_gs_go2critical_hpr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that arurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |rd_port_pagematch_en|Read Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * |[16] |rdwr_ordered_en|Read/Writes Ordered Enable Bit + * | | |If set to 1, preserves the ordering between read transaction and write transaction issued to the same address, on a given port. + * | | |In other words, the controller ensures that all same address read and write commands from the application port interface are transported to the DFI interface in the order of acceptance. + * | | |This feature is useful in cases where software coherency is desired for masters issuing back-to-back read/write transactions without waiting for write/read responses. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCFGW_3 + * Offset: 0x618 Port n Configuration Write Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |wr_port_priority|Write Channel of Port Priority + * | | |Determines the initial load value of write aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted. + * | | |The higher significant 5-bits of the write aging counter sets the initial priority of the write channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level. + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (awqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |wr_port_aging_en|Write Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the write channel of the port. + * | | |Programming Mode: Static + * |[13] |wr_port_urgent_en|AXI Urgent Sideband Signal (awurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (awurgent). + * | | |When enabled and awurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_wr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that awurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |wr_port_pagematch_en|Write Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature. + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCTRL_3 + * Offset: 0x6A0 Port n Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |port_en |AXI Port n Enable Bit + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::PCFGQOS0_3 + * Offset: 0x6A4 Port n Read QoS Configuration Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |rqos_map_level1|End of Region0 Mapping + * | | |Separation level1 indicating the end of region0 mapping; start of region0 is 0 + * | | |Possible values for level1 are 0 to 13 (for dual RAQ) or 0 to 14 (for single RAQ) which corresponds to arqos. + * | | |Note that for PA, arqos values are used directly as port priorities, where the higher the value corresponds to higher port priority. + * | | |All of the map_level* registers must be set to distinct values. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[17:16] |rqos_map_region0|Traffic Class of Region 0 + * | | |This bit field indicates the traffic class of region 0. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region 0 maps to the blue address queue. + * | | |In this case, valid values are: + * | | |0: LPR and 1: VPR only. + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region0 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[21:20] |rqos_map_region1|Traffic Class of Region 1 + * | | |This bit field indicates the traffic class of region 1. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region1 maps to the blue address queue. + * | | |In this case, valid values are + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR only + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region 1 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * @var UMCTL2_T::PCFGR_4 + * Offset: 0x6C4 Port n Configuration Read Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |rd_port_priority|Read Channel of Port Priority + * | | |Determines the initial load value of read aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted + * | | |The higher significant 5-bits of the read aging counter sets the priority of the read channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease. + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level (timeout condition - Priority0). + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (arqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |In this case, external dynamic priority input, arqos (for reads only) can still be used to set the DDRC read priority (2 priority levels: low priority read - LPR, high priority read - HPR) on a command by command basis. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |rd_port_aging_en|Read Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the read channel of the port. + * | | |Programming Mode: Static + * |[13] |rd_port_urgent_en|AXI Urgent Sideband Signal (arurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (arurgent) + * | | |When enabled and arurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_lpr/co_gs_go2critical_hpr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that arurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |rd_port_pagematch_en|Read Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * |[16] |rdwr_ordered_en|Read/Writes Ordered Enable Bit + * | | |If set to 1, preserves the ordering between read transaction and write transaction issued to the same address, on a given port. + * | | |In other words, the controller ensures that all same address read and write commands from the application port interface are transported to the DFI interface in the order of acceptance. + * | | |This feature is useful in cases where software coherency is desired for masters issuing back-to-back read/write transactions without waiting for write/read responses. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCFGW_4 + * Offset: 0x6C8 Port n Configuration Write Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |wr_port_priority|Write Channel of Port Priority + * | | |Determines the initial load value of write aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted. + * | | |The higher significant 5-bits of the write aging counter sets the initial priority of the write channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level. + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (awqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |wr_port_aging_en|Write Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the write channel of the port. + * | | |Programming Mode: Static + * |[13] |wr_port_urgent_en|AXI Urgent Sideband Signal (awurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (awurgent). + * | | |When enabled and awurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_wr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that awurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |wr_port_pagematch_en|Write Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature. + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCTRL_4 + * Offset: 0x750 Port n Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |port_en |AXI Port n Enable Bit + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::PCFGQOS0_4 + * Offset: 0x754 Port n Read QoS Configuration Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |rqos_map_level1|End of Region0 Mapping + * | | |Separation level1 indicating the end of region0 mapping; start of region0 is 0 + * | | |Possible values for level1 are 0 to 13 (for dual RAQ) or 0 to 14 (for single RAQ) which corresponds to arqos. + * | | |Note that for PA, arqos values are used directly as port priorities, where the higher the value corresponds to higher port priority. + * | | |All of the map_level* registers must be set to distinct values. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[17:16] |rqos_map_region0|Traffic Class of Region 0 + * | | |This bit field indicates the traffic class of region 0. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region 0 maps to the blue address queue. + * | | |In this case, valid values are: + * | | |0: LPR and 1: VPR only. + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region0 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[21:20] |rqos_map_region1|Traffic Class of Region 1 + * | | |This bit field indicates the traffic class of region 1. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region1 maps to the blue address queue. + * | | |In this case, valid values are + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR only + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region 1 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * @var UMCTL2_T::PCFGR_5 + * Offset: 0x774 Port n Configuration Read Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |rd_port_priority|Read Channel of Port Priority + * | | |Determines the initial load value of read aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted + * | | |The higher significant 5-bits of the read aging counter sets the priority of the read channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease. + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level (timeout condition - Priority0). + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (arqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |In this case, external dynamic priority input, arqos (for reads only) can still be used to set the DDRC read priority (2 priority levels: low priority read - LPR, high priority read - HPR) on a command by command basis. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |rd_port_aging_en|Read Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the read channel of the port. + * | | |Programming Mode: Static + * |[13] |rd_port_urgent_en|AXI Urgent Sideband Signal (arurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (arurgent) + * | | |When enabled and arurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_lpr/co_gs_go2critical_hpr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that arurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |rd_port_pagematch_en|Read Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * |[16] |rdwr_ordered_en|Read/Writes Ordered Enable Bit + * | | |If set to 1, preserves the ordering between read transaction and write transaction issued to the same address, on a given port. + * | | |In other words, the controller ensures that all same address read and write commands from the application port interface are transported to the DFI interface in the order of acceptance. + * | | |This feature is useful in cases where software coherency is desired for masters issuing back-to-back read/write transactions without waiting for write/read responses. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCFGW_5 + * Offset: 0x778 Port n Configuration Write Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |wr_port_priority|Write Channel of Port Priority + * | | |Determines the initial load value of write aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted. + * | | |The higher significant 5-bits of the write aging counter sets the initial priority of the write channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level. + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (awqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |wr_port_aging_en|Write Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the write channel of the port. + * | | |Programming Mode: Static + * |[13] |wr_port_urgent_en|AXI Urgent Sideband Signal (awurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (awurgent). + * | | |When enabled and awurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_wr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that awurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |wr_port_pagematch_en|Write Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature. + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCTRL_5 + * Offset: 0x800 Port n Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |port_en |AXI Port n Enable Bit + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::PCFGQOS0_5 + * Offset: 0x804 Port n Read QoS Configuration Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |rqos_map_level1|End of Region0 Mapping + * | | |Separation level1 indicating the end of region0 mapping; start of region0 is 0 + * | | |Possible values for level1 are 0 to 13 (for dual RAQ) or 0 to 14 (for single RAQ) which corresponds to arqos. + * | | |Note that for PA, arqos values are used directly as port priorities, where the higher the value corresponds to higher port priority. + * | | |All of the map_level* registers must be set to distinct values. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[17:16] |rqos_map_region0|Traffic Class of Region 0 + * | | |This bit field indicates the traffic class of region 0. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region 0 maps to the blue address queue. + * | | |In this case, valid values are: + * | | |0: LPR and 1: VPR only. + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region0 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[21:20] |rqos_map_region1|Traffic Class of Region 1 + * | | |This bit field indicates the traffic class of region 1. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region1 maps to the blue address queue. + * | | |In this case, valid values are + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR only + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region 1 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * @var UMCTL2_T::PCFGR_6 + * Offset: 0x824 Port n Configuration Read Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |rd_port_priority|Read Channel of Port Priority + * | | |Determines the initial load value of read aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted + * | | |The higher significant 5-bits of the read aging counter sets the priority of the read channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease. + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level (timeout condition - Priority0). + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (arqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |In this case, external dynamic priority input, arqos (for reads only) can still be used to set the DDRC read priority (2 priority levels: low priority read - LPR, high priority read - HPR) on a command by command basis. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |rd_port_aging_en|Read Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the read channel of the port. + * | | |Programming Mode: Static + * |[13] |rd_port_urgent_en|AXI Urgent Sideband Signal (arurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (arurgent) + * | | |When enabled and arurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_lpr/co_gs_go2critical_hpr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that arurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |rd_port_pagematch_en|Read Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * |[16] |rdwr_ordered_en|Read/Writes Ordered Enable Bit + * | | |If set to 1, preserves the ordering between read transaction and write transaction issued to the same address, on a given port. + * | | |In other words, the controller ensures that all same address read and write commands from the application port interface are transported to the DFI interface in the order of acceptance. + * | | |This feature is useful in cases where software coherency is desired for masters issuing back-to-back read/write transactions without waiting for write/read responses. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCFGW_6 + * Offset: 0x828 Port n Configuration Write Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |wr_port_priority|Write Channel of Port Priority + * | | |Determines the initial load value of write aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted. + * | | |The higher significant 5-bits of the write aging counter sets the initial priority of the write channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level. + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (awqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |wr_port_aging_en|Write Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the write channel of the port. + * | | |Programming Mode: Static + * |[13] |wr_port_urgent_en|AXI Urgent Sideband Signal (awurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (awurgent). + * | | |When enabled and awurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_wr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that awurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |wr_port_pagematch_en|Write Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature. + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCTRL_6 + * Offset: 0x8B0 Port n Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |port_en |AXI Port n Enable Bit + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::PCFGQOS0_6 + * Offset: 0x8B4 Port n Read QoS Configuration Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |rqos_map_level1|End of Region0 Mapping + * | | |Separation level1 indicating the end of region0 mapping; start of region0 is 0 + * | | |Possible values for level1 are 0 to 13 (for dual RAQ) or 0 to 14 (for single RAQ) which corresponds to arqos. + * | | |Note that for PA, arqos values are used directly as port priorities, where the higher the value corresponds to higher port priority. + * | | |All of the map_level* registers must be set to distinct values. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[17:16] |rqos_map_region0|Traffic Class of Region 0 + * | | |This bit field indicates the traffic class of region 0. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region 0 maps to the blue address queue. + * | | |In this case, valid values are: + * | | |0: LPR and 1: VPR only. + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region0 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[21:20] |rqos_map_region1|Traffic Class of Region 1 + * | | |This bit field indicates the traffic class of region 1. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region1 maps to the blue address queue. + * | | |In this case, valid values are + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR only + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region 1 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * @var UMCTL2_T::PCFGR_7 + * Offset: 0x8D4 Port n Configuration Read Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |rd_port_priority|Read Channel of Port Priority + * | | |Determines the initial load value of read aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted + * | | |The higher significant 5-bits of the read aging counter sets the priority of the read channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease. + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level (timeout condition - Priority0). + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (arqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |In this case, external dynamic priority input, arqos (for reads only) can still be used to set the DDRC read priority (2 priority levels: low priority read - LPR, high priority read - HPR) on a command by command basis. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |rd_port_aging_en|Read Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the read channel of the port. + * | | |Programming Mode: Static + * |[13] |rd_port_urgent_en|AXI Urgent Sideband Signal (arurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (arurgent) + * | | |When enabled and arurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_lpr/co_gs_go2critical_hpr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that arurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |rd_port_pagematch_en|Read Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * |[16] |rdwr_ordered_en|Read/Writes Ordered Enable Bit + * | | |If set to 1, preserves the ordering between read transaction and write transaction issued to the same address, on a given port. + * | | |In other words, the controller ensures that all same address read and write commands from the application port interface are transported to the DFI interface in the order of acceptance. + * | | |This feature is useful in cases where software coherency is desired for masters issuing back-to-back read/write transactions without waiting for write/read responses. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCFGW_7 + * Offset: 0x8D8 Port n Configuration Write Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[9:0] |wr_port_priority|Write Channel of Port Priority + * | | |Determines the initial load value of write aging counters. + * | | |These counters are parallel loaded after reset, or after each grant to the corresponding port. + * | | |The aging counters down-count every clock cycle where the port is requesting but not granted. + * | | |The higher significant 5-bits of the write aging counter sets the initial priority of the write channel of a given port. + * | | |Port's priority increases as the higher significant 5-bits of the counter starts to decrease + * | | |When the aging counter becomes 0, the corresponding port channel has the highest priority level. + * | | |For multi-port configurations, the aging counters cannot be used to set port priorities when external dynamic priority inputs (awqos) are enabled (timeout is still applicable). + * | | |For single port configurations, the aging counters are only used when they timeout (become 0) to force read-write direction switching. + * | | |Note: The two LSBs of this register field are tied internally to 2'b00. + * | | |Programming Mode: Static + * |[12] |wr_port_aging_en|Write Channel of Port Aging Function Enable Bit + * | | |If set to 1, enables aging function for the write channel of the port. + * | | |Programming Mode: Static + * |[13] |wr_port_urgent_en|AXI Urgent Sideband Signal (awurgent) Enable Bit + * | | |If set to 1, enables the AXI urgent sideband signal (awurgent). + * | | |When enabled and awurgent is asserted by the master, that port becomes the highest priority and co_gs_go2critical_wr signal to DDRC is asserted if enabled in PCCFG.go2critical_en register. + * | | |Note that awurgent signal can be asserted anytime and as long as required which is independent of address handshaking (it is not associated with any particular command). + * | | |Programming Mode: Static + * |[14] |wr_port_pagematch_en|Write Page Match Enable Bit + * | | |If set to 1, enables the Page Match feature. + * | | |If enabled, once a requesting port is granted, the port is continued to be granted if the following immediate commands are to the same memory page (same rank, same bank and same row). + * | | |See also related PCCFG.pagematch_limit register. + * | | |Programming Mode: Static + * @var UMCTL2_T::PCTRL_7 + * Offset: 0x960 Port n Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |port_en |AXI Port n Enable Bit + * | | |Programming Mode: Dynamic + * @var UMCTL2_T::PCFGQOS0_7 + * Offset: 0x964 Port n Read QoS Configuration Register 0 + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[3:0] |rqos_map_level1|End of Region0 Mapping + * | | |Separation level1 indicating the end of region0 mapping; start of region0 is 0 + * | | |Possible values for level1 are 0 to 13 (for dual RAQ) or 0 to 14 (for single RAQ) which corresponds to arqos. + * | | |Note that for PA, arqos values are used directly as port priorities, where the higher the value corresponds to higher port priority. + * | | |All of the map_level* registers must be set to distinct values. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[17:16] |rqos_map_region0|Traffic Class of Region 0 + * | | |This bit field indicates the traffic class of region 0. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region 0 maps to the blue address queue. + * | | |In this case, valid values are: + * | | |0: LPR and 1: VPR only. + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region0 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * |[21:20] |rqos_map_region1|Traffic Class of Region 1 + * | | |This bit field indicates the traffic class of region 1. + * | | |Valid values are: + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR + * | | |u00B7 2 - HPR + * | | |For dual address queue configurations, region1 maps to the blue address queue. + * | | |In this case, valid values are + * | | |u00B7 0 - LPR + * | | |u00B7 1 - VPR only + * | | |When VPR support is disabled (UMCTL2_VPR_EN = 0) and traffic class of region 1 is set to 1 (VPR), VPR traffic is aliased to LPR traffic. + * | | |Programming Mode: Quasi-dynamic Group 3 + * @var UMCTL2_T::SARBASE0 + * Offset: 0xF04 SAR Base Address Register n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |base_addr |Base Address for Address Region n + * | | |Base address for address region n specified as awaddr[UMCTL2_A_ADDRW-1:x] and araddr[UMCTL2_A_ADDRW-1:x], + * | | |where x is determined by the minimum block size parameter UMCTL2_SARMINSIZE: (x=log2(block size)). + * | | |Programming Mode: Static + * @var UMCTL2_T::SARSIZE0 + * Offset: 0xF08 SAR Size Register n + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |nblocks |Number of Blocks for Address Region n. + * | | |This register determines the total size of the region in multiples of minimum block size as specified by the hardware parameter UMCTL2_SARMINSIZE + * | | |The register value is encoded as number of blocks = nblocks + 1 + * | | |For example, if register is programmed to 0, region can have 1 block. + * | | |Programming Mode: Static + * @var UMCTL2_T::VER_NUMBER + * Offset: 0xFF0 UMCTL2 Version Number Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ver_number|Device Version Number Value + * | | |This is in ASCII format, with each byte corresponding to a character of the version number + * | | |Programming Mode: Static + * @var UMCTL2_T::VER_TYPE + * Offset: 0xFF4 UMCTL2 Version Type Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |ver_type |Device Version Type Value + * | | |This is in ASCII format, with each byte corresponding to a character of the version type + * | | |Programming Mode: Static + */ + __IO uint32_t MSTR; /*!< [0x0000] Master Register0 */ + __I uint32_t STAT; /*!< [0x0004] Operating Mode Status Register */ + __I uint32_t RESERVE0[2]; + __IO uint32_t MRCTRL0; /*!< [0x0010] Mode Register Read/Write Control Register 0 */ + __IO uint32_t MRCTRL1; /*!< [0x0014] Mode Register Read/Write Control Register 1 */ + __I uint32_t MRSTAT; /*!< [0x0018] Mode Register Read/Write Status Register */ + __I uint32_t RESERVE1[5]; + __IO uint32_t PWRCTL; /*!< [0x0030] Low Power Control Register */ + __IO uint32_t PWRTMG; /*!< [0x0034] Low Power Timing Register */ + __IO uint32_t HWLPCTL; /*!< [0x0038] Hardware Low Power Control Register */ + __I uint32_t RESERVE2[5]; + __IO uint32_t RFSHCTL0; /*!< [0x0050] Refresh Control Register 0 */ + __IO uint32_t RFSHCTL1; /*!< [0x0054] Refresh Control Register 1 */ + __I uint32_t RESERVE3[2]; + __IO uint32_t RFSHCTL3; /*!< [0x0060] Refresh Control Register 3 */ + __IO uint32_t RFSHTMG; /*!< [0x0064] Refresh Timing Register */ + __I uint32_t RESERVE4[22]; + __IO uint32_t CRCPARCTL0; /*!< [0x00c0] CRC Parity Control Register0 */ + __I uint32_t RESERVE5[2]; + __I uint32_t CRCPARSTAT; /*!< [0x00cc] CRC Parity Status Register */ + __IO uint32_t INIT0; /*!< [0x00d0] SDRAM Initialization Register 0 */ + __IO uint32_t INIT1; /*!< [0x00d4] SDRAM Initialization Register 1 */ + __I uint32_t RESERVE6[1]; + __IO uint32_t INIT3; /*!< [0x00dc] SDRAM Initialization Register 3 */ + __IO uint32_t INIT4; /*!< [0x00e0] SDRAM Initialization Register 4 */ + __IO uint32_t INIT5; /*!< [0x00e4] SDRAM Initialization Register 5 */ + __I uint32_t RESERVE7[2]; + __IO uint32_t DIMMCTL; /*!< [0x00f0] DIMM Control Register */ + __IO uint32_t RANKCTL; /*!< [0x00f4] Rank Control Register */ + __I uint32_t RESERVE8[2]; + __IO uint32_t DRAMTMG0; /*!< [0x0100] SDRAM Timing Register 0 */ + __IO uint32_t DRAMTMG1; /*!< [0x0104] SDRAM Timing Register 1 */ + __IO uint32_t DRAMTMG2; /*!< [0x0108] SDRAM Timing Register 2 */ + __IO uint32_t DRAMTMG3; /*!< [0x010c] SDRAM Timing Register 3 */ + __IO uint32_t DRAMTMG4; /*!< [0x0110] SDRAM Timing Register 4 */ + __IO uint32_t DRAMTMG5; /*!< [0x0114] SDRAM Timing Register 5 */ + __I uint32_t RESERVE9[2]; + __IO uint32_t DRAMTMG8; /*!< [0x0120] SDRAM Timing Register 8 */ + __I uint32_t RESERVE10[6]; + __IO uint32_t DRAMTMG15; /*!< [0x013c] SDRAM Timing Register 15 */ + __I uint32_t RESERVE11[16]; + __IO uint32_t ZQCTL0; /*!< [0x0180] ZQ Control Register 0 */ + __IO uint32_t ZQCTL1; /*!< [0x0184] ZQ Control Register 1 */ + __I uint32_t RESERVE12[2]; + __IO uint32_t DFITMG0; /*!< [0x0190] DFI Timing Register 0 */ + __IO uint32_t DFITMG1; /*!< [0x0194] DFI Timing Register 1 */ + __IO uint32_t DFILPCFG0; /*!< [0x0198] DFI Low Power Configuration Register 0 */ + __I uint32_t RESERVE13[1]; + __IO uint32_t DFIUPD0; /*!< [0x01a0] DFI Update Register 0 */ + __IO uint32_t DFIUPD1; /*!< [0x01a4] DFI Update Register 1 */ + __IO uint32_t DFIUPD2; /*!< [0x01a8] DFI Update Register 2 */ + __I uint32_t RESERVE14[1]; + __IO uint32_t DFIMISC; /*!< [0x01b0] DFI Miscellaneous Control Register */ + __I uint32_t RESERVE15[2]; + __I uint32_t DFISTAT; /*!< [0x01bc] DFI Status Register */ + __I uint32_t RESERVE16[1]; + __IO uint32_t DFIPHYMSTR; /*!< [0x01c4] DFI PHY Master */ + __I uint32_t RESERVE17[14]; + __IO uint32_t ADDRMAP0; /*!< [0x0200] Address Map Register 0 */ + __IO uint32_t ADDRMAP1; /*!< [0x0204] Address Map Register 1 */ + __IO uint32_t ADDRMAP2; /*!< [0x0208] Address Map Register 2 */ + __IO uint32_t ADDRMAP3; /*!< [0x020c] Address Map Register 3 */ + __IO uint32_t ADDRMAP4; /*!< [0x0210] Address Map Register 4 */ + __IO uint32_t ADDRMAP5; /*!< [0x0214] Address Map Register 5 */ + __IO uint32_t ADDRMAP6; /*!< [0x0218] Address Map Register 6 */ + __I uint32_t RESERVE18[2]; + __IO uint32_t ADDRMAP9; /*!< [0x0224] Address Map Register 9 */ + __IO uint32_t ADDRMAP10; /*!< [0x0228] Address Map Register 10 */ + __IO uint32_t ADDRMAP11; /*!< [0x022c] Address Map Register 11 */ + __I uint32_t RESERVE19[4]; + __IO uint32_t ODTCFG; /*!< [0x0240] ODT Configuration Register */ + __IO uint32_t ODTMAP; /*!< [0x0244] ODT/Rank Map Register */ + __I uint32_t RESERVE20[2]; + __IO uint32_t SCHED; /*!< [0x0250] Scheduler Control Register */ + __IO uint32_t SCHED1; /*!< [0x0254] Scheduler Control Register 1 */ + __I uint32_t RESERVE21[1]; + __IO uint32_t PERFHPR1; /*!< [0x025c] High Priority Read CAM Register 1 */ + __I uint32_t RESERVE22[1]; + __IO uint32_t PERFLPR1; /*!< [0x0264] Low Priority Read CAM Register 1 */ + __I uint32_t RESERVE23[1]; + __IO uint32_t PERFWR1; /*!< [0x026c] Write CAM Register 1 */ + __I uint32_t RESERVE24[36]; + __IO uint32_t DBG0; /*!< [0x0300] Debug Register 0 */ + __IO uint32_t DBG1; /*!< [0x0304] Debug Register 1 */ + __I uint32_t DBGCAM; /*!< [0x0308] CAM Debug Register */ + __IO uint32_t DBGCMD; /*!< [0x030c] Command Debug Register */ + __I uint32_t DBGSTAT; /*!< [0x0310] Status Debug Register */ + __I uint32_t RESERVE25[3]; + __IO uint32_t SWCTL; /*!< [0x0320] Software Register Programming Control Enable */ + __I uint32_t SWSTAT; /*!< [0x0324] Software Register Programming Control Status */ + __IO uint32_t SWCTLSTATIC; /*!< [0x0328] Static Registers Write Enable */ + __I uint32_t RESERVE26[16]; + __IO uint32_t POISONCFG; /*!< [0x036c] AXI Poison Configuration Register. Common for all AXI ports. */ + __I uint32_t POISONSTAT; /*!< [0x0370] AXI Poison Status Register */ + __I uint32_t RESERVE27[34]; + __I uint32_t PSTAT; /*!< [0x03fc] Port Status Register */ + __IO uint32_t PCCFG; /*!< [0x0400] Port Common Configuration Register */ + __IO uint32_t PCFGR_0; /*!< [0x0404] Port n Configuration Read Register */ + __IO uint32_t PCFGW_0; /*!< [0x0408] Port n Configuration Write Register */ + __I uint32_t RESERVE28[33]; + __IO uint32_t PCTRL_0; /*!< [0x0490] Port n Control Register */ + __IO uint32_t PCFGQOS0_0; /*!< [0x0494] Port n Read QoS Configuration Register 0 */ + __I uint32_t RESERVE29[7]; + __IO uint32_t PCFGR_1; /*!< [0x04b4] Port n Configuration Read Register */ + __IO uint32_t PCFGW_1; /*!< [0x04b8] Port n Configuration Write Register */ + __I uint32_t RESERVE30[33]; + __IO uint32_t PCTRL_1; /*!< [0x0540] Port n Control Register */ + __IO uint32_t PCFGQOS0_1; /*!< [0x0544] Port n Read QoS Configuration Register 0 */ + __I uint32_t RESERVE31[7]; + __IO uint32_t PCFGR_2; /*!< [0x0564] Port n Configuration Read Register */ + __IO uint32_t PCFGW_2; /*!< [0x0568] Port n Configuration Write Register */ + __I uint32_t RESERVE32[33]; + __IO uint32_t PCTRL_2; /*!< [0x05f0] Port n Control Register */ + __IO uint32_t PCFGQOS0_2; /*!< [0x05f4] Port n Read QoS Configuration Register 0 */ + __I uint32_t RESERVE33[7]; + __IO uint32_t PCFGR_3; /*!< [0x0614] Port n Configuration Read Register */ + __IO uint32_t PCFGW_3; /*!< [0x0618] Port n Configuration Write Register */ + __I uint32_t RESERVE34[33]; + __IO uint32_t PCTRL_3; /*!< [0x06a0] Port n Control Register */ + __IO uint32_t PCFGQOS0_3; /*!< [0x06a4] Port n Read QoS Configuration Register 0 */ + __I uint32_t RESERVE35[7]; + __IO uint32_t PCFGR_4; /*!< [0x06c4] Port n Configuration Read Register */ + __IO uint32_t PCFGW_4; /*!< [0x06c8] Port n Configuration Write Register */ + __I uint32_t RESERVE36[33]; + __IO uint32_t PCTRL_4; /*!< [0x0750] Port n Control Register */ + __IO uint32_t PCFGQOS0_4; /*!< [0x0754] Port n Read QoS Configuration Register 0 */ + __I uint32_t RESERVE37[7]; + __IO uint32_t PCFGR_5; /*!< [0x0774] Port n Configuration Read Register */ + __IO uint32_t PCFGW_5; /*!< [0x0778] Port n Configuration Write Register */ + __I uint32_t RESERVE38[33]; + __IO uint32_t PCTRL_5; /*!< [0x0800] Port n Control Register */ + __IO uint32_t PCFGQOS0_5; /*!< [0x0804] Port n Read QoS Configuration Register 0 */ + __I uint32_t RESERVE39[7]; + __IO uint32_t PCFGR_6; /*!< [0x0824] Port n Configuration Read Register */ + __IO uint32_t PCFGW_6; /*!< [0x0828] Port n Configuration Write Register */ + __I uint32_t RESERVE40[33]; + __IO uint32_t PCTRL_6; /*!< [0x08b0] Port n Control Register */ + __IO uint32_t PCFGQOS0_6; /*!< [0x08b4] Port n Read QoS Configuration Register 0 */ + __I uint32_t RESERVE41[7]; + __IO uint32_t PCFGR_7; /*!< [0x08d4] Port n Configuration Read Register */ + __IO uint32_t PCFGW_7; /*!< [0x08d8] Port n Configuration Write Register */ + __I uint32_t RESERVE42[33]; + __IO uint32_t PCTRL_7; /*!< [0x0960] Port n Control Register */ + __IO uint32_t PCFGQOS0_7; /*!< [0x0964] Port n Read QoS Configuration Register 0 */ + __I uint32_t RESERVE43[359]; + __IO uint32_t SARBASE0; /*!< [0x0f04] SAR Base Address Register n */ + __IO uint32_t SARSIZE0; /*!< [0x0f08] SAR Size Register n */ + __I uint32_t RESERVE44[57]; + __I uint32_t VER_NUMBER; /*!< [0x0ff0] UMCTL2 Version Number Register */ + __I uint32_t VER_TYPE; /*!< [0x0ff4] UMCTL2 Version Type Register */ + +} UMCTL2_T; + +/** + @addtogroup UMCTL2_CONST UMCTL2 Bit Field Definition + Constant Definitions for UMCTL2 Controller +@{ */ + +#define UMCTL2_MSTR_ddr3_Pos (0) /*!< UMCTL2_T::MSTR: ddr3 Position */ +#define UMCTL2_MSTR_ddr3_Msk (0x1ul << UMCTL2_MSTR_ddr3_Pos) /*!< UMCTL2_T::MSTR: ddr3 Mask */ + +#define UMCTL2_MSTR_burstchop_Pos (9) /*!< UMCTL2_T::MSTR: burstchop Position */ +#define UMCTL2_MSTR_burstchop_Msk (0x1ul << UMCTL2_MSTR_burstchop_Pos) /*!< UMCTL2_T::MSTR: burstchop Mask */ + +#define UMCTL2_MSTR_en_2t_timing_mode_Pos (10) /*!< UMCTL2_T::MSTR: en_2t_timing_mode Position*/ +#define UMCTL2_MSTR_en_2t_timing_mode_Msk (0x1ul << UMCTL2_MSTR_en_2t_timing_mode_Pos) /*!< UMCTL2_T::MSTR: en_2t_timing_mode Mask */ + +#define UMCTL2_MSTR_data_bus_width_Pos (12) /*!< UMCTL2_T::MSTR: data_bus_width Position*/ +#define UMCTL2_MSTR_data_bus_width_Msk (0x3ul << UMCTL2_MSTR_data_bus_width_Pos) /*!< UMCTL2_T::MSTR: data_bus_width Mask */ + +#define UMCTL2_MSTR_dll_off_mode_Pos (15) /*!< UMCTL2_T::MSTR: dll_off_mode Position */ +#define UMCTL2_MSTR_dll_off_mode_Msk (0x1ul << UMCTL2_MSTR_dll_off_mode_Pos) /*!< UMCTL2_T::MSTR: dll_off_mode Mask */ + +#define UMCTL2_MSTR_burst_rdwr_Pos (16) /*!< UMCTL2_T::MSTR: burst_rdwr Position */ +#define UMCTL2_MSTR_burst_rdwr_Msk (0xful << UMCTL2_MSTR_burst_rdwr_Pos) /*!< UMCTL2_T::MSTR: burst_rdwr Mask */ + +#define UMCTL2_MSTR_active_ranks_Pos (24) /*!< UMCTL2_T::MSTR: active_ranks Position */ +#define UMCTL2_MSTR_active_ranks_Msk (0x3ul << UMCTL2_MSTR_active_ranks_Pos) /*!< UMCTL2_T::MSTR: active_ranks Mask */ + +#define UMCTL2_STAT_operating_mode_Pos (0) /*!< UMCTL2_T::STAT: operating_mode Position*/ +#define UMCTL2_STAT_operating_mode_Msk (0x3ul << UMCTL2_STAT_operating_mode_Pos) /*!< UMCTL2_T::STAT: operating_mode Mask */ + +#define UMCTL2_STAT_selfref_type_Pos (4) /*!< UMCTL2_T::STAT: selfref_type Position */ +#define UMCTL2_STAT_selfref_type_Msk (0x3ul << UMCTL2_STAT_selfref_type_Pos) /*!< UMCTL2_T::STAT: selfref_type Mask */ + +#define UMCTL2_STAT_selfref_cam_not_empty_Pos (12) /*!< UMCTL2_T::STAT: selfref_cam_not_empty Position*/ +#define UMCTL2_STAT_selfref_cam_not_empty_Msk (0x1ul << UMCTL2_STAT_selfref_cam_not_empty_Pos) /*!< UMCTL2_T::STAT: selfref_cam_not_empty Mask*/ + +#define UMCTL2_MRCTRL0_mr_rank_Pos (4) /*!< UMCTL2_T::MRCTRL0: mr_rank Position */ +#define UMCTL2_MRCTRL0_mr_rank_Msk (0x3ul << UMCTL2_MRCTRL0_mr_rank_Pos) /*!< UMCTL2_T::MRCTRL0: mr_rank Mask */ + +#define UMCTL2_MRCTRL0_mr_addr_Pos (12) /*!< UMCTL2_T::MRCTRL0: mr_addr Position */ +#define UMCTL2_MRCTRL0_mr_addr_Msk (0xful << UMCTL2_MRCTRL0_mr_addr_Pos) /*!< UMCTL2_T::MRCTRL0: mr_addr Mask */ + +#define UMCTL2_MRCTRL0_mr_wr_Pos (31) /*!< UMCTL2_T::MRCTRL0: mr_wr Position */ +#define UMCTL2_MRCTRL0_mr_wr_Msk (0x1ul << UMCTL2_MRCTRL0_mr_wr_Pos) /*!< UMCTL2_T::MRCTRL0: mr_wr Mask */ + +#define UMCTL2_MRCTRL1_mr_data_Pos (0) /*!< UMCTL2_T::MRCTRL1: mr_data Position */ +#define UMCTL2_MRCTRL1_mr_data_Msk (0xfffful << UMCTL2_MRCTRL1_mr_data_Pos) /*!< UMCTL2_T::MRCTRL1: mr_data Mask */ + +#define UMCTL2_MRSTAT_mr_wr_busy_Pos (0) /*!< UMCTL2_T::MRSTAT: mr_wr_busy Position */ +#define UMCTL2_MRSTAT_mr_wr_busy_Msk (0x1ul << UMCTL2_MRSTAT_mr_wr_busy_Pos) /*!< UMCTL2_T::MRSTAT: mr_wr_busy Mask */ + +#define UMCTL2_PWRCTL_selfref_en_Pos (0) /*!< UMCTL2_T::PWRCTL: selfref_en Position */ +#define UMCTL2_PWRCTL_selfref_en_Msk (0x1ul << UMCTL2_PWRCTL_selfref_en_Pos) /*!< UMCTL2_T::PWRCTL: selfref_en Mask */ + +#define UMCTL2_PWRCTL_powerdown_en_Pos (1) /*!< UMCTL2_T::PWRCTL: powerdown_en Position*/ +#define UMCTL2_PWRCTL_powerdown_en_Msk (0x1ul << UMCTL2_PWRCTL_powerdown_en_Pos) /*!< UMCTL2_T::PWRCTL: powerdown_en Mask */ + +#define UMCTL2_PWRCTL_en_dfi_dram_clk_disable_Pos (3) /*!< UMCTL2_T::PWRCTL: en_dfi_dram_clk_disable Position*/ +#define UMCTL2_PWRCTL_en_dfi_dram_clk_disable_Msk (0x1ul << UMCTL2_PWRCTL_en_dfi_dram_clk_disable_Pos) /*!< UMCTL2_T::PWRCTL: en_dfi_dram_clk_disable Mask*/ + +#define UMCTL2_PWRCTL_selfref_sw_Pos (5) /*!< UMCTL2_T::PWRCTL: selfref_sw Position */ +#define UMCTL2_PWRCTL_selfref_sw_Msk (0x1ul << UMCTL2_PWRCTL_selfref_sw_Pos) /*!< UMCTL2_T::PWRCTL: selfref_sw Mask */ + +#define UMCTL2_PWRCTL_dis_cam_drain_selfref_Pos (7) /*!< UMCTL2_T::PWRCTL: dis_cam_drain_selfref Position*/ +#define UMCTL2_PWRCTL_dis_cam_drain_selfref_Msk (0x1ul << UMCTL2_PWRCTL_dis_cam_drain_selfref_Pos) /*!< UMCTL2_T::PWRCTL: dis_cam_drain_selfref Mask*/ + +#define UMCTL2_PWRTMG_powerdown_to_x32_Pos (0) /*!< UMCTL2_T::PWRTMG: powerdown_to_x32 Position*/ +#define UMCTL2_PWRTMG_powerdown_to_x32_Msk (0x1ful << UMCTL2_PWRTMG_powerdown_to_x32_Pos) /*!< UMCTL2_T::PWRTMG: powerdown_to_x32 Mask*/ + +#define UMCTL2_PWRTMG_selfref_to_x32_Pos (16) /*!< UMCTL2_T::PWRTMG: selfref_to_x32 Position*/ +#define UMCTL2_PWRTMG_selfref_to_x32_Msk (0xfful << UMCTL2_PWRTMG_selfref_to_x32_Pos) /*!< UMCTL2_T::PWRTMG: selfref_to_x32 Mask */ + +#define UMCTL2_HWLPCTL_hw_lp_en_Pos (0) /*!< UMCTL2_T::HWLPCTL: hw_lp_en Position */ +#define UMCTL2_HWLPCTL_hw_lp_en_Msk (0x1ul << UMCTL2_HWLPCTL_hw_lp_en_Pos) /*!< UMCTL2_T::HWLPCTL: hw_lp_en Mask */ + +#define UMCTL2_HWLPCTL_hw_lp_exit_idle_en_Pos (1) /*!< UMCTL2_T::HWLPCTL: hw_lp_exit_idle_en Position*/ +#define UMCTL2_HWLPCTL_hw_lp_exit_idle_en_Msk (0x1ul << UMCTL2_HWLPCTL_hw_lp_exit_idle_en_Pos) /*!< UMCTL2_T::HWLPCTL: hw_lp_exit_idle_en Mask*/ + +#define UMCTL2_HWLPCTL_hw_lp_idle_x32_Pos (16) /*!< UMCTL2_T::HWLPCTL: hw_lp_idle_x32 Position*/ +#define UMCTL2_HWLPCTL_hw_lp_idle_x32_Msk (0xffful << UMCTL2_HWLPCTL_hw_lp_idle_x32_Pos) /*!< UMCTL2_T::HWLPCTL: hw_lp_idle_x32 Mask */ + +#define UMCTL2_RFSHCTL0_refresh_burst_Pos (4) /*!< UMCTL2_T::RFSHCTL0: refresh_burst Position*/ +#define UMCTL2_RFSHCTL0_refresh_burst_Msk (0x3ful << UMCTL2_RFSHCTL0_refresh_burst_Pos) /*!< UMCTL2_T::RFSHCTL0: refresh_burst Mask */ + +#define UMCTL2_RFSHCTL0_refresh_to_x1_x32_Pos (12) /*!< UMCTL2_T::RFSHCTL0: refresh_to_x1_x32 Position*/ +#define UMCTL2_RFSHCTL0_refresh_to_x1_x32_Msk (0x1ful << UMCTL2_RFSHCTL0_refresh_to_x1_x32_Pos) /*!< UMCTL2_T::RFSHCTL0: refresh_to_x1_x32 Mask*/ + +#define UMCTL2_RFSHCTL0_refresh_margin_Pos (20) /*!< UMCTL2_T::RFSHCTL0: refresh_margin Position*/ +#define UMCTL2_RFSHCTL0_refresh_margin_Msk (0xful << UMCTL2_RFSHCTL0_refresh_margin_Pos) /*!< UMCTL2_T::RFSHCTL0: refresh_margin Mask*/ + +#define UMCTL2_RFSHCTL1_refresh_timer0_start_value_x32_Pos (0) /*!< UMCTL2_T::RFSHCTL1: refresh_timer0_start_value_x32 Position*/ +#define UMCTL2_RFSHCTL1_refresh_timer0_start_value_x32_Msk (0xffful << UMCTL2_RFSHCTL1_refresh_timer0_start_value_x32_Pos) /*!< UMCTL2_T::RFSHCTL1: refresh_timer0_start_value_x32 Mask*/ + +#define UMCTL2_RFSHCTL1_refresh_timer1_start_value_x32_Pos (16) /*!< UMCTL2_T::RFSHCTL1: refresh_timer1_start_value_x32 Position*/ +#define UMCTL2_RFSHCTL1_refresh_timer1_start_value_x32_Msk (0xffful << UMCTL2_RFSHCTL1_refresh_timer1_start_value_x32_Pos) /*!< UMCTL2_T::RFSHCTL1: refresh_timer1_start_value_x32 Mask*/ + +#define UMCTL2_RFSHCTL3_dis_auto_refresh_Pos (0) /*!< UMCTL2_T::RFSHCTL3: dis_auto_refresh Position*/ +#define UMCTL2_RFSHCTL3_dis_auto_refresh_Msk (0x1ul << UMCTL2_RFSHCTL3_dis_auto_refresh_Pos) /*!< UMCTL2_T::RFSHCTL3: dis_auto_refresh Mask*/ + +#define UMCTL2_RFSHCTL3_refresh_update_level_Pos (1) /*!< UMCTL2_T::RFSHCTL3: refresh_update_level Position*/ +#define UMCTL2_RFSHCTL3_refresh_update_level_Msk (0x1ul << UMCTL2_RFSHCTL3_refresh_update_level_Pos) /*!< UMCTL2_T::RFSHCTL3: refresh_update_level Mask*/ + +#define UMCTL2_RFSHTMG_t_rfc_min_Pos (0) /*!< UMCTL2_T::RFSHTMG: t_rfc_min Position */ +#define UMCTL2_RFSHTMG_t_rfc_min_Msk (0x3fful << UMCTL2_RFSHTMG_t_rfc_min_Pos) /*!< UMCTL2_T::RFSHTMG: t_rfc_min Mask */ + +#define UMCTL2_RFSHTMG_t_rfc_nom_x1_x32_Pos (16) /*!< UMCTL2_T::RFSHTMG: t_rfc_nom_x1_x32 Position*/ +#define UMCTL2_RFSHTMG_t_rfc_nom_x1_x32_Msk (0xffful << UMCTL2_RFSHTMG_t_rfc_nom_x1_x32_Pos) /*!< UMCTL2_T::RFSHTMG: t_rfc_nom_x1_x32 Mask*/ + +#define UMCTL2_CRCPARCTL0_dfi_alert_err_int_en_Pos (0) /*!< UMCTL2_T::CRCPARCTL0: dfi_alert_err_int_en Position*/ +#define UMCTL2_CRCPARCTL0_dfi_alert_err_int_en_Msk (0x1ul << UMCTL2_CRCPARCTL0_dfi_alert_err_int_en_Pos) /*!< UMCTL2_T::CRCPARCTL0: dfi_alert_err_int_en Mask*/ + +#define UMCTL2_CRCPARCTL0_dfi_alert_err_int_clr_Pos (1) /*!< UMCTL2_T::CRCPARCTL0: dfi_alert_err_int_clr Position*/ +#define UMCTL2_CRCPARCTL0_dfi_alert_err_int_clr_Msk (0x1ul << UMCTL2_CRCPARCTL0_dfi_alert_err_int_clr_Pos) /*!< UMCTL2_T::CRCPARCTL0: dfi_alert_err_int_clr Mask*/ + +#define UMCTL2_CRCPARCTL0_dfi_alert_err_cnt_clr_Pos (2) /*!< UMCTL2_T::CRCPARCTL0: dfi_alert_err_cnt_clr Position*/ +#define UMCTL2_CRCPARCTL0_dfi_alert_err_cnt_clr_Msk (0x1ul << UMCTL2_CRCPARCTL0_dfi_alert_err_cnt_clr_Pos) /*!< UMCTL2_T::CRCPARCTL0: dfi_alert_err_cnt_clr Mask*/ + +#define UMCTL2_CRCPARSTAT_dfi_alert_err_cnt_Pos (0) /*!< UMCTL2_T::CRCPARSTAT: dfi_alert_err_cnt Position*/ +#define UMCTL2_CRCPARSTAT_dfi_alert_err_cnt_Msk (0xfffful << UMCTL2_CRCPARSTAT_dfi_alert_err_cnt_Pos) /*!< UMCTL2_T::CRCPARSTAT: dfi_alert_err_cnt Mask*/ + +#define UMCTL2_CRCPARSTAT_dfi_alert_err_int_Pos (16) /*!< UMCTL2_T::CRCPARSTAT: dfi_alert_err_int Position*/ +#define UMCTL2_CRCPARSTAT_dfi_alert_err_int_Msk (0x1ul << UMCTL2_CRCPARSTAT_dfi_alert_err_int_Pos) /*!< UMCTL2_T::CRCPARSTAT: dfi_alert_err_int Mask*/ + +#define UMCTL2_INIT0_pre_cke_x1024_Pos (0) /*!< UMCTL2_T::INIT0: pre_cke_x1024 Position*/ +#define UMCTL2_INIT0_pre_cke_x1024_Msk (0xffful << UMCTL2_INIT0_pre_cke_x1024_Pos) /*!< UMCTL2_T::INIT0: pre_cke_x1024 Mask */ + +#define UMCTL2_INIT0_post_cke_x1024_Pos (16) /*!< UMCTL2_T::INIT0: post_cke_x1024 Position*/ +#define UMCTL2_INIT0_post_cke_x1024_Msk (0x3fful << UMCTL2_INIT0_post_cke_x1024_Pos) /*!< UMCTL2_T::INIT0: post_cke_x1024 Mask */ + +#define UMCTL2_INIT0_skip_dram_init_Pos (30) /*!< UMCTL2_T::INIT0: skip_dram_init Position*/ +#define UMCTL2_INIT0_skip_dram_init_Msk (0x3ul << UMCTL2_INIT0_skip_dram_init_Pos) /*!< UMCTL2_T::INIT0: skip_dram_init Mask */ + +#define UMCTL2_INIT1_pre_ocd_x32_Pos (0) /*!< UMCTL2_T::INIT1: pre_ocd_x32 Position */ +#define UMCTL2_INIT1_pre_ocd_x32_Msk (0xful << UMCTL2_INIT1_pre_ocd_x32_Pos) /*!< UMCTL2_T::INIT1: pre_ocd_x32 Mask */ + +#define UMCTL2_INIT1_dram_rstn_x1024_Pos (16) /*!< UMCTL2_T::INIT1: dram_rstn_x1024 Position*/ +#define UMCTL2_INIT1_dram_rstn_x1024_Msk (0x1fful << UMCTL2_INIT1_dram_rstn_x1024_Pos) /*!< UMCTL2_T::INIT1: dram_rstn_x1024 Mask */ + +#define UMCTL2_INIT3_emr_Pos (0) /*!< UMCTL2_T::INIT3: emr Position */ +#define UMCTL2_INIT3_emr_Msk (0xfffful << UMCTL2_INIT3_emr_Pos) /*!< UMCTL2_T::INIT3: emr Mask */ + +#define UMCTL2_INIT3_mr_Pos (16) /*!< UMCTL2_T::INIT3: mr Position */ +#define UMCTL2_INIT3_mr_Msk (0xfffful << UMCTL2_INIT3_mr_Pos) /*!< UMCTL2_T::INIT3: mr Mask */ + +#define UMCTL2_INIT4_emr3_Pos (0) /*!< UMCTL2_T::INIT4: emr3 Position */ +#define UMCTL2_INIT4_emr3_Msk (0xfffful << UMCTL2_INIT4_emr3_Pos) /*!< UMCTL2_T::INIT4: emr3 Mask */ + +#define UMCTL2_INIT4_emr2_Pos (16) /*!< UMCTL2_T::INIT4: emr2 Position */ +#define UMCTL2_INIT4_emr2_Msk (0xfffful << UMCTL2_INIT4_emr2_Pos) /*!< UMCTL2_T::INIT4: emr2 Mask */ + +#define UMCTL2_INIT5_dev_zqinit_x32_Pos (16) /*!< UMCTL2_T::INIT5: dev_zqinit_x32 Position*/ +#define UMCTL2_INIT5_dev_zqinit_x32_Msk (0xfful << UMCTL2_INIT5_dev_zqinit_x32_Pos) /*!< UMCTL2_T::INIT5: dev_zqinit_x32 Mask */ + +#define UMCTL2_DIMMCTL_dimm_stagger_cs_en_Pos (0) /*!< UMCTL2_T::DIMMCTL: dimm_stagger_cs_en Position*/ +#define UMCTL2_DIMMCTL_dimm_stagger_cs_en_Msk (0x1ul << UMCTL2_DIMMCTL_dimm_stagger_cs_en_Pos) /*!< UMCTL2_T::DIMMCTL: dimm_stagger_cs_en Mask*/ + +#define UMCTL2_DIMMCTL_dimm_addr_mirr_en_Pos (1) /*!< UMCTL2_T::DIMMCTL: dimm_addr_mirr_en Position*/ +#define UMCTL2_DIMMCTL_dimm_addr_mirr_en_Msk (0x1ul << UMCTL2_DIMMCTL_dimm_addr_mirr_en_Pos) /*!< UMCTL2_T::DIMMCTL: dimm_addr_mirr_en Mask*/ + +#define UMCTL2_RANKCTL_max_rank_rd_Pos (0) /*!< UMCTL2_T::RANKCTL: max_rank_rd Position*/ +#define UMCTL2_RANKCTL_max_rank_rd_Msk (0xful << UMCTL2_RANKCTL_max_rank_rd_Pos) /*!< UMCTL2_T::RANKCTL: max_rank_rd Mask */ + +#define UMCTL2_RANKCTL_diff_rank_rd_gap_Pos (4) /*!< UMCTL2_T::RANKCTL: diff_rank_rd_gap Position*/ +#define UMCTL2_RANKCTL_diff_rank_rd_gap_Msk (0xful << UMCTL2_RANKCTL_diff_rank_rd_gap_Pos) /*!< UMCTL2_T::RANKCTL: diff_rank_rd_gap Mask*/ + +#define UMCTL2_RANKCTL_diff_rank_wr_gap_Pos (8) /*!< UMCTL2_T::RANKCTL: diff_rank_wr_gap Position*/ +#define UMCTL2_RANKCTL_diff_rank_wr_gap_Msk (0xful << UMCTL2_RANKCTL_diff_rank_wr_gap_Pos) /*!< UMCTL2_T::RANKCTL: diff_rank_wr_gap Mask*/ + +#define UMCTL2_RANKCTL_max_rank_wr_Pos (12) /*!< UMCTL2_T::RANKCTL: max_rank_wr Position*/ +#define UMCTL2_RANKCTL_max_rank_wr_Msk (0xful << UMCTL2_RANKCTL_max_rank_wr_Pos) /*!< UMCTL2_T::RANKCTL: max_rank_wr Mask */ + +#define UMCTL2_RANKCTL_diff_rank_rd_gap_msb_Pos (24) /*!< UMCTL2_T::RANKCTL: diff_rank_rd_gap_msb Position*/ +#define UMCTL2_RANKCTL_diff_rank_rd_gap_msb_Msk (0x1ul << UMCTL2_RANKCTL_diff_rank_rd_gap_msb_Pos) /*!< UMCTL2_T::RANKCTL: diff_rank_rd_gap_msb Mask*/ + +#define UMCTL2_RANKCTL_diff_rank_wr_gap_msb_Pos (26) /*!< UMCTL2_T::RANKCTL: diff_rank_wr_gap_msb Position*/ +#define UMCTL2_RANKCTL_diff_rank_wr_gap_msb_Msk (0x1ul << UMCTL2_RANKCTL_diff_rank_wr_gap_msb_Pos) /*!< UMCTL2_T::RANKCTL: diff_rank_wr_gap_msb Mask*/ + +#define UMCTL2_DRAMTMG0_t_ras_min_Pos (0) /*!< UMCTL2_T::DRAMTMG0: t_ras_min Position */ +#define UMCTL2_DRAMTMG0_t_ras_min_Msk (0x3ful << UMCTL2_DRAMTMG0_t_ras_min_Pos) /*!< UMCTL2_T::DRAMTMG0: t_ras_min Mask */ + +#define UMCTL2_DRAMTMG0_t_ras_max_Pos (8) /*!< UMCTL2_T::DRAMTMG0: t_ras_max Position */ +#define UMCTL2_DRAMTMG0_t_ras_max_Msk (0x7ful << UMCTL2_DRAMTMG0_t_ras_max_Pos) /*!< UMCTL2_T::DRAMTMG0: t_ras_max Mask */ + +#define UMCTL2_DRAMTMG0_t_faw_Pos (16) /*!< UMCTL2_T::DRAMTMG0: t_faw Position */ +#define UMCTL2_DRAMTMG0_t_faw_Msk (0x3ful << UMCTL2_DRAMTMG0_t_faw_Pos) /*!< UMCTL2_T::DRAMTMG0: t_faw Mask */ + +#define UMCTL2_DRAMTMG0_wr2pre_Pos (24) /*!< UMCTL2_T::DRAMTMG0: wr2pre Position */ +#define UMCTL2_DRAMTMG0_wr2pre_Msk (0x7ful << UMCTL2_DRAMTMG0_wr2pre_Pos) /*!< UMCTL2_T::DRAMTMG0: wr2pre Mask */ + +#define UMCTL2_DRAMTMG1_t_rc_Pos (0) /*!< UMCTL2_T::DRAMTMG1: t_rc Position */ +#define UMCTL2_DRAMTMG1_t_rc_Msk (0x7ful << UMCTL2_DRAMTMG1_t_rc_Pos) /*!< UMCTL2_T::DRAMTMG1: t_rc Mask */ + +#define UMCTL2_DRAMTMG1_rd2pre_Pos (8) /*!< UMCTL2_T::DRAMTMG1: rd2pre Position */ +#define UMCTL2_DRAMTMG1_rd2pre_Msk (0x3ful << UMCTL2_DRAMTMG1_rd2pre_Pos) /*!< UMCTL2_T::DRAMTMG1: rd2pre Mask */ + +#define UMCTL2_DRAMTMG1_t_xp_Pos (16) /*!< UMCTL2_T::DRAMTMG1: t_xp Position */ +#define UMCTL2_DRAMTMG1_t_xp_Msk (0x1ful << UMCTL2_DRAMTMG1_t_xp_Pos) /*!< UMCTL2_T::DRAMTMG1: t_xp Mask */ + +#define UMCTL2_DRAMTMG2_wr2rd_Pos (0) /*!< UMCTL2_T::DRAMTMG2: wr2rd Position */ +#define UMCTL2_DRAMTMG2_wr2rd_Msk (0x3ful << UMCTL2_DRAMTMG2_wr2rd_Pos) /*!< UMCTL2_T::DRAMTMG2: wr2rd Mask */ + +#define UMCTL2_DRAMTMG2_rd2wr_Pos (8) /*!< UMCTL2_T::DRAMTMG2: rd2wr Position */ +#define UMCTL2_DRAMTMG2_rd2wr_Msk (0x3ful << UMCTL2_DRAMTMG2_rd2wr_Pos) /*!< UMCTL2_T::DRAMTMG2: rd2wr Mask */ + +#define UMCTL2_DRAMTMG3_t_mod_Pos (0) /*!< UMCTL2_T::DRAMTMG3: t_mod Position */ +#define UMCTL2_DRAMTMG3_t_mod_Msk (0x3fful << UMCTL2_DRAMTMG3_t_mod_Pos) /*!< UMCTL2_T::DRAMTMG3: t_mod Mask */ + +#define UMCTL2_DRAMTMG3_t_mrd_Pos (12) /*!< UMCTL2_T::DRAMTMG3: t_mrd Position */ +#define UMCTL2_DRAMTMG3_t_mrd_Msk (0x3ful << UMCTL2_DRAMTMG3_t_mrd_Pos) /*!< UMCTL2_T::DRAMTMG3: t_mrd Mask */ + +#define UMCTL2_DRAMTMG4_t_rp_Pos (0) /*!< UMCTL2_T::DRAMTMG4: t_rp Position */ +#define UMCTL2_DRAMTMG4_t_rp_Msk (0x1ful << UMCTL2_DRAMTMG4_t_rp_Pos) /*!< UMCTL2_T::DRAMTMG4: t_rp Mask */ + +#define UMCTL2_DRAMTMG4_t_rrd_Pos (8) /*!< UMCTL2_T::DRAMTMG4: t_rrd Position */ +#define UMCTL2_DRAMTMG4_t_rrd_Msk (0xful << UMCTL2_DRAMTMG4_t_rrd_Pos) /*!< UMCTL2_T::DRAMTMG4: t_rrd Mask */ + +#define UMCTL2_DRAMTMG4_t_ccd_Pos (16) /*!< UMCTL2_T::DRAMTMG4: t_ccd Position */ +#define UMCTL2_DRAMTMG4_t_ccd_Msk (0xful << UMCTL2_DRAMTMG4_t_ccd_Pos) /*!< UMCTL2_T::DRAMTMG4: t_ccd Mask */ + +#define UMCTL2_DRAMTMG4_t_rcd_Pos (24) /*!< UMCTL2_T::DRAMTMG4: t_rcd Position */ +#define UMCTL2_DRAMTMG4_t_rcd_Msk (0x1ful << UMCTL2_DRAMTMG4_t_rcd_Pos) /*!< UMCTL2_T::DRAMTMG4: t_rcd Mask */ + +#define UMCTL2_DRAMTMG5_t_cke_Pos (0) /*!< UMCTL2_T::DRAMTMG5: t_cke Position */ +#define UMCTL2_DRAMTMG5_t_cke_Msk (0x1ful << UMCTL2_DRAMTMG5_t_cke_Pos) /*!< UMCTL2_T::DRAMTMG5: t_cke Mask */ + +#define UMCTL2_DRAMTMG5_t_ckesr_Pos (8) /*!< UMCTL2_T::DRAMTMG5: t_ckesr Position */ +#define UMCTL2_DRAMTMG5_t_ckesr_Msk (0x3ful << UMCTL2_DRAMTMG5_t_ckesr_Pos) /*!< UMCTL2_T::DRAMTMG5: t_ckesr Mask */ + +#define UMCTL2_DRAMTMG5_t_cksre_Pos (16) /*!< UMCTL2_T::DRAMTMG5: t_cksre Position */ +#define UMCTL2_DRAMTMG5_t_cksre_Msk (0x7ful << UMCTL2_DRAMTMG5_t_cksre_Pos) /*!< UMCTL2_T::DRAMTMG5: t_cksre Mask */ + +#define UMCTL2_DRAMTMG5_t_cksrx_Pos (24) /*!< UMCTL2_T::DRAMTMG5: t_cksrx Position */ +#define UMCTL2_DRAMTMG5_t_cksrx_Msk (0xful << UMCTL2_DRAMTMG5_t_cksrx_Pos) /*!< UMCTL2_T::DRAMTMG5: t_cksrx Mask */ + +#define UMCTL2_DRAMTMG8_t_xs_x32_Pos (0) /*!< UMCTL2_T::DRAMTMG8: t_xs_x32 Position */ +#define UMCTL2_DRAMTMG8_t_xs_x32_Msk (0x7ful << UMCTL2_DRAMTMG8_t_xs_x32_Pos) /*!< UMCTL2_T::DRAMTMG8: t_xs_x32 Mask */ + +#define UMCTL2_DRAMTMG8_t_xs_dll_x32_Pos (8) /*!< UMCTL2_T::DRAMTMG8: t_xs_dll_x32 Position*/ +#define UMCTL2_DRAMTMG8_t_xs_dll_x32_Msk (0x7ful << UMCTL2_DRAMTMG8_t_xs_dll_x32_Pos) /*!< UMCTL2_T::DRAMTMG8: t_xs_dll_x32 Mask */ + +#define UMCTL2_DRAMTMG15_t_stab_x32_Pos (0) /*!< UMCTL2_T::DRAMTMG15: t_stab_x32 Position*/ +#define UMCTL2_DRAMTMG15_t_stab_x32_Msk (0xfful << UMCTL2_DRAMTMG15_t_stab_x32_Pos) /*!< UMCTL2_T::DRAMTMG15: t_stab_x32 Mask */ + +#define UMCTL2_DRAMTMG15_en_dfi_lp_t_stab_Pos (31) /*!< UMCTL2_T::DRAMTMG15: en_dfi_lp_t_stab Position*/ +#define UMCTL2_DRAMTMG15_en_dfi_lp_t_stab_Msk (0x1ul << UMCTL2_DRAMTMG15_en_dfi_lp_t_stab_Pos) /*!< UMCTL2_T::DRAMTMG15: en_dfi_lp_t_stab Mask*/ + +#define UMCTL2_ZQCTL0_t_zq_short_nop_Pos (0) /*!< UMCTL2_T::ZQCTL0: t_zq_short_nop Position*/ +#define UMCTL2_ZQCTL0_t_zq_short_nop_Msk (0x3fful << UMCTL2_ZQCTL0_t_zq_short_nop_Pos) /*!< UMCTL2_T::ZQCTL0: t_zq_short_nop Mask */ + +#define UMCTL2_ZQCTL0_t_zq_long_nop_Pos (16) /*!< UMCTL2_T::ZQCTL0: t_zq_long_nop Position*/ +#define UMCTL2_ZQCTL0_t_zq_long_nop_Msk (0x7fful << UMCTL2_ZQCTL0_t_zq_long_nop_Pos) /*!< UMCTL2_T::ZQCTL0: t_zq_long_nop Mask */ + +#define UMCTL2_ZQCTL0_zq_resistor_shared_Pos (29) /*!< UMCTL2_T::ZQCTL0: zq_resistor_shared Position*/ +#define UMCTL2_ZQCTL0_zq_resistor_shared_Msk (0x1ul << UMCTL2_ZQCTL0_zq_resistor_shared_Pos) /*!< UMCTL2_T::ZQCTL0: zq_resistor_shared Mask*/ + +#define UMCTL2_ZQCTL0_dis_srx_zqcl_Pos (30) /*!< UMCTL2_T::ZQCTL0: dis_srx_zqcl Position*/ +#define UMCTL2_ZQCTL0_dis_srx_zqcl_Msk (0x1ul << UMCTL2_ZQCTL0_dis_srx_zqcl_Pos) /*!< UMCTL2_T::ZQCTL0: dis_srx_zqcl Mask */ + +#define UMCTL2_ZQCTL0_dis_auto_zq_Pos (31) /*!< UMCTL2_T::ZQCTL0: dis_auto_zq Position */ +#define UMCTL2_ZQCTL0_dis_auto_zq_Msk (0x1ul << UMCTL2_ZQCTL0_dis_auto_zq_Pos) /*!< UMCTL2_T::ZQCTL0: dis_auto_zq Mask */ + +#define UMCTL2_ZQCTL1_t_zq_short_interval_x1024_Pos (0) /*!< UMCTL2_T::ZQCTL1: t_zq_short_interval_x1024 Position*/ +#define UMCTL2_ZQCTL1_t_zq_short_interval_x1024_Msk (0xffffful << UMCTL2_ZQCTL1_t_zq_short_interval_x1024_Pos) /*!< UMCTL2_T::ZQCTL1: t_zq_short_interval_x1024 Mask*/ + +#define UMCTL2_DFITMG0_dfi_tphy_wrlat_Pos (0) /*!< UMCTL2_T::DFITMG0: dfi_tphy_wrlat Position*/ +#define UMCTL2_DFITMG0_dfi_tphy_wrlat_Msk (0x3ful << UMCTL2_DFITMG0_dfi_tphy_wrlat_Pos) /*!< UMCTL2_T::DFITMG0: dfi_tphy_wrlat Mask */ + +#define UMCTL2_DFITMG0_dfi_tphy_wrdata_Pos (8) /*!< UMCTL2_T::DFITMG0: dfi_tphy_wrdata Position*/ +#define UMCTL2_DFITMG0_dfi_tphy_wrdata_Msk (0x3ful << UMCTL2_DFITMG0_dfi_tphy_wrdata_Pos) /*!< UMCTL2_T::DFITMG0: dfi_tphy_wrdata Mask*/ + +#define UMCTL2_DFITMG0_dfi_wrdata_use_dfi_phy_clk_Pos (15) /*!< UMCTL2_T::DFITMG0: dfi_wrdata_use_dfi_phy_clk Position*/ +#define UMCTL2_DFITMG0_dfi_wrdata_use_dfi_phy_clk_Msk (0x1ul << UMCTL2_DFITMG0_dfi_wrdata_use_dfi_phy_clk_Pos) /*!< UMCTL2_T::DFITMG0: dfi_wrdata_use_dfi_phy_clk Mask*/ + +#define UMCTL2_DFITMG0_dfi_t_rddata_en_Pos (16) /*!< UMCTL2_T::DFITMG0: dfi_t_rddata_en Position*/ +#define UMCTL2_DFITMG0_dfi_t_rddata_en_Msk (0x7ful << UMCTL2_DFITMG0_dfi_t_rddata_en_Pos) /*!< UMCTL2_T::DFITMG0: dfi_t_rddata_en Mask*/ + +#define UMCTL2_DFITMG0_dfi_rddata_use_dfi_phy_clk_Pos (23) /*!< UMCTL2_T::DFITMG0: dfi_rddata_use_dfi_phy_clk Position*/ +#define UMCTL2_DFITMG0_dfi_rddata_use_dfi_phy_clk_Msk (0x1ul << UMCTL2_DFITMG0_dfi_rddata_use_dfi_phy_clk_Pos) /*!< UMCTL2_T::DFITMG0: dfi_rddata_use_dfi_phy_clk Mask*/ + +#define UMCTL2_DFITMG0_dfi_t_ctrl_delay_Pos (24) /*!< UMCTL2_T::DFITMG0: dfi_t_ctrl_delay Position*/ +#define UMCTL2_DFITMG0_dfi_t_ctrl_delay_Msk (0x1ful << UMCTL2_DFITMG0_dfi_t_ctrl_delay_Pos) /*!< UMCTL2_T::DFITMG0: dfi_t_ctrl_delay Mask*/ + +#define UMCTL2_DFITMG1_dfi_t_dram_clk_enable_Pos (0) /*!< UMCTL2_T::DFITMG1: dfi_t_dram_clk_enable Position*/ +#define UMCTL2_DFITMG1_dfi_t_dram_clk_enable_Msk (0x1ful << UMCTL2_DFITMG1_dfi_t_dram_clk_enable_Pos) /*!< UMCTL2_T::DFITMG1: dfi_t_dram_clk_enable Mask*/ + +#define UMCTL2_DFITMG1_dfi_t_dram_clk_disable_Pos (8) /*!< UMCTL2_T::DFITMG1: dfi_t_dram_clk_disable Position*/ +#define UMCTL2_DFITMG1_dfi_t_dram_clk_disable_Msk (0x1ful << UMCTL2_DFITMG1_dfi_t_dram_clk_disable_Pos) /*!< UMCTL2_T::DFITMG1: dfi_t_dram_clk_disable Mask*/ + +#define UMCTL2_DFITMG1_dfi_t_wrdata_delay_Pos (16) /*!< UMCTL2_T::DFITMG1: dfi_t_wrdata_delay Position*/ +#define UMCTL2_DFITMG1_dfi_t_wrdata_delay_Msk (0x1ful << UMCTL2_DFITMG1_dfi_t_wrdata_delay_Pos) /*!< UMCTL2_T::DFITMG1: dfi_t_wrdata_delay Mask*/ + +#define UMCTL2_DFITMG1_dfi_t_parin_lat_Pos (24) /*!< UMCTL2_T::DFITMG1: dfi_t_parin_lat Position*/ +#define UMCTL2_DFITMG1_dfi_t_parin_lat_Msk (0x3ul << UMCTL2_DFITMG1_dfi_t_parin_lat_Pos) /*!< UMCTL2_T::DFITMG1: dfi_t_parin_lat Mask*/ + +#define UMCTL2_DFILPCFG0_dfi_lp_en_pd_Pos (0) /*!< UMCTL2_T::DFILPCFG0: dfi_lp_en_pd Position*/ +#define UMCTL2_DFILPCFG0_dfi_lp_en_pd_Msk (0x1ul << UMCTL2_DFILPCFG0_dfi_lp_en_pd_Pos) /*!< UMCTL2_T::DFILPCFG0: dfi_lp_en_pd Mask */ + +#define UMCTL2_DFILPCFG0_dfi_lp_wakeup_pd_Pos (4) /*!< UMCTL2_T::DFILPCFG0: dfi_lp_wakeup_pd Position*/ +#define UMCTL2_DFILPCFG0_dfi_lp_wakeup_pd_Msk (0xful << UMCTL2_DFILPCFG0_dfi_lp_wakeup_pd_Pos) /*!< UMCTL2_T::DFILPCFG0: dfi_lp_wakeup_pd Mask*/ + +#define UMCTL2_DFILPCFG0_dfi_lp_en_sr_Pos (8) /*!< UMCTL2_T::DFILPCFG0: dfi_lp_en_sr Position*/ +#define UMCTL2_DFILPCFG0_dfi_lp_en_sr_Msk (0x1ul << UMCTL2_DFILPCFG0_dfi_lp_en_sr_Pos) /*!< UMCTL2_T::DFILPCFG0: dfi_lp_en_sr Mask */ + +#define UMCTL2_DFILPCFG0_dfi_lp_wakeup_sr_Pos (12) /*!< UMCTL2_T::DFILPCFG0: dfi_lp_wakeup_sr Position*/ +#define UMCTL2_DFILPCFG0_dfi_lp_wakeup_sr_Msk (0xful << UMCTL2_DFILPCFG0_dfi_lp_wakeup_sr_Pos) /*!< UMCTL2_T::DFILPCFG0: dfi_lp_wakeup_sr Mask*/ + +#define UMCTL2_DFILPCFG0_dfi_tlp_resp_Pos (24) /*!< UMCTL2_T::DFILPCFG0: dfi_tlp_resp Position*/ +#define UMCTL2_DFILPCFG0_dfi_tlp_resp_Msk (0x1ful << UMCTL2_DFILPCFG0_dfi_tlp_resp_Pos) /*!< UMCTL2_T::DFILPCFG0: dfi_tlp_resp Mask */ + +#define UMCTL2_DFIUPD0_dfi_t_ctrlup_min_Pos (0) /*!< UMCTL2_T::DFIUPD0: dfi_t_ctrlup_min Position*/ +#define UMCTL2_DFIUPD0_dfi_t_ctrlup_min_Msk (0x3fful << UMCTL2_DFIUPD0_dfi_t_ctrlup_min_Pos) /*!< UMCTL2_T::DFIUPD0: dfi_t_ctrlup_min Mask*/ + +#define UMCTL2_DFIUPD0_dfi_t_ctrlup_max_Pos (16) /*!< UMCTL2_T::DFIUPD0: dfi_t_ctrlup_max Position*/ +#define UMCTL2_DFIUPD0_dfi_t_ctrlup_max_Msk (0x3fful << UMCTL2_DFIUPD0_dfi_t_ctrlup_max_Pos) /*!< UMCTL2_T::DFIUPD0: dfi_t_ctrlup_max Mask*/ + +#define UMCTL2_DFIUPD0_ctrlupd_pre_srx_Pos (29) /*!< UMCTL2_T::DFIUPD0: ctrlupd_pre_srx Position*/ +#define UMCTL2_DFIUPD0_ctrlupd_pre_srx_Msk (0x1ul << UMCTL2_DFIUPD0_ctrlupd_pre_srx_Pos) /*!< UMCTL2_T::DFIUPD0: ctrlupd_pre_srx Mask*/ + +#define UMCTL2_DFIUPD0_dis_auto_ctrlupd_srx_Pos (30) /*!< UMCTL2_T::DFIUPD0: dis_auto_ctrlupd_srx Position*/ +#define UMCTL2_DFIUPD0_dis_auto_ctrlupd_srx_Msk (0x1ul << UMCTL2_DFIUPD0_dis_auto_ctrlupd_srx_Pos) /*!< UMCTL2_T::DFIUPD0: dis_auto_ctrlupd_srx Mask*/ + +#define UMCTL2_DFIUPD0_dis_auto_ctrlupd_Pos (31) /*!< UMCTL2_T::DFIUPD0: dis_auto_ctrlupd Position*/ +#define UMCTL2_DFIUPD0_dis_auto_ctrlupd_Msk (0x1ul << UMCTL2_DFIUPD0_dis_auto_ctrlupd_Pos) /*!< UMCTL2_T::DFIUPD0: dis_auto_ctrlupd Mask*/ + +#define UMCTL2_DFIUPD1_dfi_t_ctrlupd_interval_max_x1024_Pos (0) /*!< UMCTL2_T::DFIUPD1: dfi_t_ctrlupd_interval_max_x1024 Position*/ +#define UMCTL2_DFIUPD1_dfi_t_ctrlupd_interval_max_x1024_Msk (0xfful << UMCTL2_DFIUPD1_dfi_t_ctrlupd_interval_max_x1024_Pos) /*!< UMCTL2_T::DFIUPD1: dfi_t_ctrlupd_interval_max_x1024 Mask*/ + +#define UMCTL2_DFIUPD1_dfi_t_ctrlupd_interval_min_x1024_Pos (16) /*!< UMCTL2_T::DFIUPD1: dfi_t_ctrlupd_interval_min_x1024 Position*/ +#define UMCTL2_DFIUPD1_dfi_t_ctrlupd_interval_min_x1024_Msk (0xfful << UMCTL2_DFIUPD1_dfi_t_ctrlupd_interval_min_x1024_Pos) /*!< UMCTL2_T::DFIUPD1: dfi_t_ctrlupd_interval_min_x1024 Mask*/ + +#define UMCTL2_DFIUPD2_dfi_phyupd_en_Pos (31) /*!< UMCTL2_T::DFIUPD2: dfi_phyupd_en Position*/ +#define UMCTL2_DFIUPD2_dfi_phyupd_en_Msk (0x1ul << UMCTL2_DFIUPD2_dfi_phyupd_en_Pos) /*!< UMCTL2_T::DFIUPD2: dfi_phyupd_en Mask */ + +#define UMCTL2_DFIMISC_dfi_init_complete_en_Pos (0) /*!< UMCTL2_T::DFIMISC: dfi_init_complete_en Position*/ +#define UMCTL2_DFIMISC_dfi_init_complete_en_Msk (0x1ul << UMCTL2_DFIMISC_dfi_init_complete_en_Pos) /*!< UMCTL2_T::DFIMISC: dfi_init_complete_en Mask*/ + +#define UMCTL2_DFIMISC_ctl_idle_en_Pos (4) /*!< UMCTL2_T::DFIMISC: ctl_idle_en Position*/ +#define UMCTL2_DFIMISC_ctl_idle_en_Msk (0x1ul << UMCTL2_DFIMISC_ctl_idle_en_Pos) /*!< UMCTL2_T::DFIMISC: ctl_idle_en Mask */ + +#define UMCTL2_DFIMISC_dfi_init_start_Pos (5) /*!< UMCTL2_T::DFIMISC: dfi_init_start Position*/ +#define UMCTL2_DFIMISC_dfi_init_start_Msk (0x1ul << UMCTL2_DFIMISC_dfi_init_start_Pos) /*!< UMCTL2_T::DFIMISC: dfi_init_start Mask */ + +#define UMCTL2_DFIMISC_dfi_frequency_Pos (8) /*!< UMCTL2_T::DFIMISC: dfi_frequency Position*/ +#define UMCTL2_DFIMISC_dfi_frequency_Msk (0x1ful << UMCTL2_DFIMISC_dfi_frequency_Pos) /*!< UMCTL2_T::DFIMISC: dfi_frequency Mask */ + +#define UMCTL2_DFISTAT_dfi_init_complete_Pos (0) /*!< UMCTL2_T::DFISTAT: dfi_init_complete Position*/ +#define UMCTL2_DFISTAT_dfi_init_complete_Msk (0x1ul << UMCTL2_DFISTAT_dfi_init_complete_Pos) /*!< UMCTL2_T::DFISTAT: dfi_init_complete Mask*/ + +#define UMCTL2_DFISTAT_dfi_lp_ack_Pos (1) /*!< UMCTL2_T::DFISTAT: dfi_lp_ack Position */ +#define UMCTL2_DFISTAT_dfi_lp_ack_Msk (0x1ul << UMCTL2_DFISTAT_dfi_lp_ack_Pos) /*!< UMCTL2_T::DFISTAT: dfi_lp_ack Mask */ + +#define UMCTL2_DFIPHYMSTR_dfi_phymstr_en_Pos (0) /*!< UMCTL2_T::DFIPHYMSTR: dfi_phymstr_en Position*/ +#define UMCTL2_DFIPHYMSTR_dfi_phymstr_en_Msk (0x1ul << UMCTL2_DFIPHYMSTR_dfi_phymstr_en_Pos) /*!< UMCTL2_T::DFIPHYMSTR: dfi_phymstr_en Mask*/ + +#define UMCTL2_ADDRMAP0_addrmap_cs_bit0_Pos (0) /*!< UMCTL2_T::ADDRMAP0: addrmap_cs_bit0 Position*/ +#define UMCTL2_ADDRMAP0_addrmap_cs_bit0_Msk (0x1ful << UMCTL2_ADDRMAP0_addrmap_cs_bit0_Pos) /*!< UMCTL2_T::ADDRMAP0: addrmap_cs_bit0 Mask*/ + +#define UMCTL2_ADDRMAP1_addrmap_bank_b0_Pos (0) /*!< UMCTL2_T::ADDRMAP1: addrmap_bank_b0 Position*/ +#define UMCTL2_ADDRMAP1_addrmap_bank_b0_Msk (0x3ful << UMCTL2_ADDRMAP1_addrmap_bank_b0_Pos) /*!< UMCTL2_T::ADDRMAP1: addrmap_bank_b0 Mask*/ + +#define UMCTL2_ADDRMAP1_addrmap_bank_b1_Pos (8) /*!< UMCTL2_T::ADDRMAP1: addrmap_bank_b1 Position*/ +#define UMCTL2_ADDRMAP1_addrmap_bank_b1_Msk (0x3ful << UMCTL2_ADDRMAP1_addrmap_bank_b1_Pos) /*!< UMCTL2_T::ADDRMAP1: addrmap_bank_b1 Mask*/ + +#define UMCTL2_ADDRMAP1_addrmap_bank_b2_Pos (16) /*!< UMCTL2_T::ADDRMAP1: addrmap_bank_b2 Position*/ +#define UMCTL2_ADDRMAP1_addrmap_bank_b2_Msk (0x3ful << UMCTL2_ADDRMAP1_addrmap_bank_b2_Pos) /*!< UMCTL2_T::ADDRMAP1: addrmap_bank_b2 Mask*/ + +#define UMCTL2_ADDRMAP2_addrmap_col_b2_Pos (0) /*!< UMCTL2_T::ADDRMAP2: addrmap_col_b2 Position*/ +#define UMCTL2_ADDRMAP2_addrmap_col_b2_Msk (0xful << UMCTL2_ADDRMAP2_addrmap_col_b2_Pos) /*!< UMCTL2_T::ADDRMAP2: addrmap_col_b2 Mask*/ + +#define UMCTL2_ADDRMAP2_addrmap_col_b3_Pos (8) /*!< UMCTL2_T::ADDRMAP2: addrmap_col_b3 Position*/ +#define UMCTL2_ADDRMAP2_addrmap_col_b3_Msk (0x1ful << UMCTL2_ADDRMAP2_addrmap_col_b3_Pos) /*!< UMCTL2_T::ADDRMAP2: addrmap_col_b3 Mask*/ + +#define UMCTL2_ADDRMAP2_addrmap_col_b4_Pos (16) /*!< UMCTL2_T::ADDRMAP2: addrmap_col_b4 Position*/ +#define UMCTL2_ADDRMAP2_addrmap_col_b4_Msk (0xful << UMCTL2_ADDRMAP2_addrmap_col_b4_Pos) /*!< UMCTL2_T::ADDRMAP2: addrmap_col_b4 Mask*/ + +#define UMCTL2_ADDRMAP2_addrmap_col_b5_Pos (24) /*!< UMCTL2_T::ADDRMAP2: addrmap_col_b5 Position*/ +#define UMCTL2_ADDRMAP2_addrmap_col_b5_Msk (0xful << UMCTL2_ADDRMAP2_addrmap_col_b5_Pos) /*!< UMCTL2_T::ADDRMAP2: addrmap_col_b5 Mask*/ + +#define UMCTL2_ADDRMAP3_addrmap_col_b6_Pos (0) /*!< UMCTL2_T::ADDRMAP3: addrmap_col_b6 Position*/ +#define UMCTL2_ADDRMAP3_addrmap_col_b6_Msk (0x1ful << UMCTL2_ADDRMAP3_addrmap_col_b6_Pos) /*!< UMCTL2_T::ADDRMAP3: addrmap_col_b6 Mask*/ + +#define UMCTL2_ADDRMAP3_addrmap_col_b7_Pos (8) /*!< UMCTL2_T::ADDRMAP3: addrmap_col_b7 Position*/ +#define UMCTL2_ADDRMAP3_addrmap_col_b7_Msk (0x1ful << UMCTL2_ADDRMAP3_addrmap_col_b7_Pos) /*!< UMCTL2_T::ADDRMAP3: addrmap_col_b7 Mask*/ + +#define UMCTL2_ADDRMAP3_addrmap_col_b8_Pos (16) /*!< UMCTL2_T::ADDRMAP3: addrmap_col_b8 Position*/ +#define UMCTL2_ADDRMAP3_addrmap_col_b8_Msk (0x1ful << UMCTL2_ADDRMAP3_addrmap_col_b8_Pos) /*!< UMCTL2_T::ADDRMAP3: addrmap_col_b8 Mask*/ + +#define UMCTL2_ADDRMAP3_addrmap_col_b9_Pos (24) /*!< UMCTL2_T::ADDRMAP3: addrmap_col_b9 Position*/ +#define UMCTL2_ADDRMAP3_addrmap_col_b9_Msk (0x1ful << UMCTL2_ADDRMAP3_addrmap_col_b9_Pos) /*!< UMCTL2_T::ADDRMAP3: addrmap_col_b9 Mask*/ + +#define UMCTL2_ADDRMAP4_addrmap_col_b10_Pos (0) /*!< UMCTL2_T::ADDRMAP4: addrmap_col_b10 Position*/ +#define UMCTL2_ADDRMAP4_addrmap_col_b10_Msk (0x1ful << UMCTL2_ADDRMAP4_addrmap_col_b10_Pos) /*!< UMCTL2_T::ADDRMAP4: addrmap_col_b10 Mask*/ + +#define UMCTL2_ADDRMAP4_addrmap_col_b11_Pos (8) /*!< UMCTL2_T::ADDRMAP4: addrmap_col_b11 Position*/ +#define UMCTL2_ADDRMAP4_addrmap_col_b11_Msk (0x1ful << UMCTL2_ADDRMAP4_addrmap_col_b11_Pos) /*!< UMCTL2_T::ADDRMAP4: addrmap_col_b11 Mask*/ + +#define UMCTL2_ADDRMAP5_addrmap_row_b0_Pos (0) /*!< UMCTL2_T::ADDRMAP5: addrmap_row_b0 Position*/ +#define UMCTL2_ADDRMAP5_addrmap_row_b0_Msk (0xful << UMCTL2_ADDRMAP5_addrmap_row_b0_Pos) /*!< UMCTL2_T::ADDRMAP5: addrmap_row_b0 Mask*/ + +#define UMCTL2_ADDRMAP5_addrmap_row_b1_Pos (8) /*!< UMCTL2_T::ADDRMAP5: addrmap_row_b1 Position*/ +#define UMCTL2_ADDRMAP5_addrmap_row_b1_Msk (0xful << UMCTL2_ADDRMAP5_addrmap_row_b1_Pos) /*!< UMCTL2_T::ADDRMAP5: addrmap_row_b1 Mask*/ + +#define UMCTL2_ADDRMAP5_addrmap_row_b2_10_Pos (16) /*!< UMCTL2_T::ADDRMAP5: addrmap_row_b2_10 Position*/ +#define UMCTL2_ADDRMAP5_addrmap_row_b2_10_Msk (0xful << UMCTL2_ADDRMAP5_addrmap_row_b2_10_Pos) /*!< UMCTL2_T::ADDRMAP5: addrmap_row_b2_10 Mask*/ + +#define UMCTL2_ADDRMAP5_addrmap_row_b11_Pos (24) /*!< UMCTL2_T::ADDRMAP5: addrmap_row_b11 Position*/ +#define UMCTL2_ADDRMAP5_addrmap_row_b11_Msk (0xful << UMCTL2_ADDRMAP5_addrmap_row_b11_Pos) /*!< UMCTL2_T::ADDRMAP5: addrmap_row_b11 Mask*/ + +#define UMCTL2_ADDRMAP6_addrmap_row_b12_Pos (0) /*!< UMCTL2_T::ADDRMAP6: addrmap_row_b12 Position*/ +#define UMCTL2_ADDRMAP6_addrmap_row_b12_Msk (0xful << UMCTL2_ADDRMAP6_addrmap_row_b12_Pos) /*!< UMCTL2_T::ADDRMAP6: addrmap_row_b12 Mask*/ + +#define UMCTL2_ADDRMAP6_addrmap_row_b13_Pos (8) /*!< UMCTL2_T::ADDRMAP6: addrmap_row_b13 Position*/ +#define UMCTL2_ADDRMAP6_addrmap_row_b13_Msk (0xful << UMCTL2_ADDRMAP6_addrmap_row_b13_Pos) /*!< UMCTL2_T::ADDRMAP6: addrmap_row_b13 Mask*/ + +#define UMCTL2_ADDRMAP6_addrmap_row_b14_Pos (16) /*!< UMCTL2_T::ADDRMAP6: addrmap_row_b14 Position*/ +#define UMCTL2_ADDRMAP6_addrmap_row_b14_Msk (0xful << UMCTL2_ADDRMAP6_addrmap_row_b14_Pos) /*!< UMCTL2_T::ADDRMAP6: addrmap_row_b14 Mask*/ + +#define UMCTL2_ADDRMAP6_addrmap_row_b15_Pos (24) /*!< UMCTL2_T::ADDRMAP6: addrmap_row_b15 Position*/ +#define UMCTL2_ADDRMAP6_addrmap_row_b15_Msk (0xful << UMCTL2_ADDRMAP6_addrmap_row_b15_Pos) /*!< UMCTL2_T::ADDRMAP6: addrmap_row_b15 Mask*/ + +#define UMCTL2_ADDRMAP9_addrmap_row_b2_Pos (0) /*!< UMCTL2_T::ADDRMAP9: addrmap_row_b2 Position*/ +#define UMCTL2_ADDRMAP9_addrmap_row_b2_Msk (0xful << UMCTL2_ADDRMAP9_addrmap_row_b2_Pos) /*!< UMCTL2_T::ADDRMAP9: addrmap_row_b2 Mask*/ + +#define UMCTL2_ADDRMAP9_addrmap_row_b3_Pos (8) /*!< UMCTL2_T::ADDRMAP9: addrmap_row_b3 Position*/ +#define UMCTL2_ADDRMAP9_addrmap_row_b3_Msk (0xful << UMCTL2_ADDRMAP9_addrmap_row_b3_Pos) /*!< UMCTL2_T::ADDRMAP9: addrmap_row_b3 Mask*/ + +#define UMCTL2_ADDRMAP9_addrmap_row_b4_Pos (16) /*!< UMCTL2_T::ADDRMAP9: addrmap_row_b4 Position*/ +#define UMCTL2_ADDRMAP9_addrmap_row_b4_Msk (0xful << UMCTL2_ADDRMAP9_addrmap_row_b4_Pos) /*!< UMCTL2_T::ADDRMAP9: addrmap_row_b4 Mask*/ + +#define UMCTL2_ADDRMAP9_addrmap_row_b5_Pos (24) /*!< UMCTL2_T::ADDRMAP9: addrmap_row_b5 Position*/ +#define UMCTL2_ADDRMAP9_addrmap_row_b5_Msk (0xful << UMCTL2_ADDRMAP9_addrmap_row_b5_Pos) /*!< UMCTL2_T::ADDRMAP9: addrmap_row_b5 Mask*/ + +#define UMCTL2_ADDRMAP10_addrmap_row_b6_Pos (0) /*!< UMCTL2_T::ADDRMAP10: addrmap_row_b6 Position*/ +#define UMCTL2_ADDRMAP10_addrmap_row_b6_Msk (0xful << UMCTL2_ADDRMAP10_addrmap_row_b6_Pos) /*!< UMCTL2_T::ADDRMAP10: addrmap_row_b6 Mask*/ + +#define UMCTL2_ADDRMAP10_addrmap_row_b7_Pos (8) /*!< UMCTL2_T::ADDRMAP10: addrmap_row_b7 Position*/ +#define UMCTL2_ADDRMAP10_addrmap_row_b7_Msk (0xful << UMCTL2_ADDRMAP10_addrmap_row_b7_Pos) /*!< UMCTL2_T::ADDRMAP10: addrmap_row_b7 Mask*/ + +#define UMCTL2_ADDRMAP10_addrmap_row_b8_Pos (16) /*!< UMCTL2_T::ADDRMAP10: addrmap_row_b8 Position*/ +#define UMCTL2_ADDRMAP10_addrmap_row_b8_Msk (0xful << UMCTL2_ADDRMAP10_addrmap_row_b8_Pos) /*!< UMCTL2_T::ADDRMAP10: addrmap_row_b8 Mask*/ + +#define UMCTL2_ADDRMAP10_addrmap_row_b9_Pos (24) /*!< UMCTL2_T::ADDRMAP10: addrmap_row_b9 Position*/ +#define UMCTL2_ADDRMAP10_addrmap_row_b9_Msk (0xful << UMCTL2_ADDRMAP10_addrmap_row_b9_Pos) /*!< UMCTL2_T::ADDRMAP10: addrmap_row_b9 Mask*/ + +#define UMCTL2_ADDRMAP11_addrmap_row_b10_Pos (0) /*!< UMCTL2_T::ADDRMAP11: addrmap_row_b10 Position*/ +#define UMCTL2_ADDRMAP11_addrmap_row_b10_Msk (0xful << UMCTL2_ADDRMAP11_addrmap_row_b10_Pos) /*!< UMCTL2_T::ADDRMAP11: addrmap_row_b10 Mask*/ + +#define UMCTL2_ODTCFG_rd_odt_delay_Pos (2) /*!< UMCTL2_T::ODTCFG: rd_odt_delay Position*/ +#define UMCTL2_ODTCFG_rd_odt_delay_Msk (0x1ful << UMCTL2_ODTCFG_rd_odt_delay_Pos) /*!< UMCTL2_T::ODTCFG: rd_odt_delay Mask */ + +#define UMCTL2_ODTCFG_rd_odt_hold_Pos (8) /*!< UMCTL2_T::ODTCFG: rd_odt_hold Position */ +#define UMCTL2_ODTCFG_rd_odt_hold_Msk (0xful << UMCTL2_ODTCFG_rd_odt_hold_Pos) /*!< UMCTL2_T::ODTCFG: rd_odt_hold Mask */ + +#define UMCTL2_ODTCFG_wr_odt_delay_Pos (16) /*!< UMCTL2_T::ODTCFG: wr_odt_delay Position*/ +#define UMCTL2_ODTCFG_wr_odt_delay_Msk (0x1ful << UMCTL2_ODTCFG_wr_odt_delay_Pos) /*!< UMCTL2_T::ODTCFG: wr_odt_delay Mask */ + +#define UMCTL2_ODTCFG_wr_odt_hold_Pos (24) /*!< UMCTL2_T::ODTCFG: wr_odt_hold Position */ +#define UMCTL2_ODTCFG_wr_odt_hold_Msk (0xful << UMCTL2_ODTCFG_wr_odt_hold_Pos) /*!< UMCTL2_T::ODTCFG: wr_odt_hold Mask */ + +#define UMCTL2_ODTMAP_rank0_wr_odt_Pos (0) /*!< UMCTL2_T::ODTMAP: rank0_wr_odt Position*/ +#define UMCTL2_ODTMAP_rank0_wr_odt_Msk (0x3ul << UMCTL2_ODTMAP_rank0_wr_odt_Pos) /*!< UMCTL2_T::ODTMAP: rank0_wr_odt Mask */ + +#define UMCTL2_ODTMAP_rank0_rd_odt_Pos (4) /*!< UMCTL2_T::ODTMAP: rank0_rd_odt Position*/ +#define UMCTL2_ODTMAP_rank0_rd_odt_Msk (0x3ul << UMCTL2_ODTMAP_rank0_rd_odt_Pos) /*!< UMCTL2_T::ODTMAP: rank0_rd_odt Mask */ + +#define UMCTL2_ODTMAP_rank1_wr_odt_Pos (8) /*!< UMCTL2_T::ODTMAP: rank1_wr_odt Position*/ +#define UMCTL2_ODTMAP_rank1_wr_odt_Msk (0x3ul << UMCTL2_ODTMAP_rank1_wr_odt_Pos) /*!< UMCTL2_T::ODTMAP: rank1_wr_odt Mask */ + +#define UMCTL2_ODTMAP_rank1_rd_odt_Pos (12) /*!< UMCTL2_T::ODTMAP: rank1_rd_odt Position*/ +#define UMCTL2_ODTMAP_rank1_rd_odt_Msk (0x3ul << UMCTL2_ODTMAP_rank1_rd_odt_Pos) /*!< UMCTL2_T::ODTMAP: rank1_rd_odt Mask */ + +#define UMCTL2_SCHED_prefer_write_Pos (1) /*!< UMCTL2_T::SCHED: prefer_write Position */ +#define UMCTL2_SCHED_prefer_write_Msk (0x1ul << UMCTL2_SCHED_prefer_write_Pos) /*!< UMCTL2_T::SCHED: prefer_write Mask */ + +#define UMCTL2_SCHED_Pageclose_Pos (2) /*!< UMCTL2_T::SCHED: Pageclose Position */ +#define UMCTL2_SCHED_Pageclose_Msk (0x1ul << UMCTL2_SCHED_Pageclose_Pos) /*!< UMCTL2_T::SCHED: Pageclose Mask */ + +#define UMCTL2_SCHED_lpr_num_entries_Pos (8) /*!< UMCTL2_T::SCHED: lpr_num_entries Position*/ +#define UMCTL2_SCHED_lpr_num_entries_Msk (0x1ful << UMCTL2_SCHED_lpr_num_entries_Pos) /*!< UMCTL2_T::SCHED: lpr_num_entries Mask */ + +#define UMCTL2_SCHED_go2critical_hysteresis_Pos (16) /*!< UMCTL2_T::SCHED: go2critical_hysteresis Position*/ +#define UMCTL2_SCHED_go2critical_hysteresis_Msk (0xfful << UMCTL2_SCHED_go2critical_hysteresis_Pos) /*!< UMCTL2_T::SCHED: go2critical_hysteresis Mask*/ + +#define UMCTL2_SCHED_rdwr_idle_gap_Pos (24) /*!< UMCTL2_T::SCHED: rdwr_idle_gap Position*/ +#define UMCTL2_SCHED_rdwr_idle_gap_Msk (0x7ful << UMCTL2_SCHED_rdwr_idle_gap_Pos) /*!< UMCTL2_T::SCHED: rdwr_idle_gap Mask */ + +#define UMCTL2_SCHED1_pageclose_timer_Pos (0) /*!< UMCTL2_T::SCHED1: pageclose_timer Position*/ +#define UMCTL2_SCHED1_pageclose_timer_Msk (0xfful << UMCTL2_SCHED1_pageclose_timer_Pos) /*!< UMCTL2_T::SCHED1: pageclose_timer Mask */ + +#define UMCTL2_PERFHPR1_hpr_max_starve_Pos (0) /*!< UMCTL2_T::PERFHPR1: hpr_max_starve Position*/ +#define UMCTL2_PERFHPR1_hpr_max_starve_Msk (0xfffful << UMCTL2_PERFHPR1_hpr_max_starve_Pos) /*!< UMCTL2_T::PERFHPR1: hpr_max_starve Mask*/ + +#define UMCTL2_PERFHPR1_hpr_xact_run_length_Pos (24) /*!< UMCTL2_T::PERFHPR1: hpr_xact_run_length Position*/ +#define UMCTL2_PERFHPR1_hpr_xact_run_length_Msk (0xfful << UMCTL2_PERFHPR1_hpr_xact_run_length_Pos) /*!< UMCTL2_T::PERFHPR1: hpr_xact_run_length Mask*/ + +#define UMCTL2_PERFLPR1_lpr_max_starve_Pos (0) /*!< UMCTL2_T::PERFLPR1: lpr_max_starve Position*/ +#define UMCTL2_PERFLPR1_lpr_max_starve_Msk (0xfffful << UMCTL2_PERFLPR1_lpr_max_starve_Pos) /*!< UMCTL2_T::PERFLPR1: lpr_max_starve Mask*/ + +#define UMCTL2_PERFLPR1_lpr_xact_run_length_Pos (24) /*!< UMCTL2_T::PERFLPR1: lpr_xact_run_length Position*/ +#define UMCTL2_PERFLPR1_lpr_xact_run_length_Msk (0xfful << UMCTL2_PERFLPR1_lpr_xact_run_length_Pos) /*!< UMCTL2_T::PERFLPR1: lpr_xact_run_length Mask*/ + +#define UMCTL2_PERFWR1_w_max_starve_Pos (0) /*!< UMCTL2_T::PERFWR1: w_max_starve Position*/ +#define UMCTL2_PERFWR1_w_max_starve_Msk (0xfffful << UMCTL2_PERFWR1_w_max_starve_Pos) /*!< UMCTL2_T::PERFWR1: w_max_starve Mask */ + +#define UMCTL2_PERFWR1_w_xact_run_length_Pos (24) /*!< UMCTL2_T::PERFWR1: w_xact_run_length Position*/ +#define UMCTL2_PERFWR1_w_xact_run_length_Msk (0xfful << UMCTL2_PERFWR1_w_xact_run_length_Pos) /*!< UMCTL2_T::PERFWR1: w_xact_run_length Mask*/ + +#define UMCTL2_DBG0_dis_wc_Pos (0) /*!< UMCTL2_T::DBG0: dis_wc Position */ +#define UMCTL2_DBG0_dis_wc_Msk (0x1ul << UMCTL2_DBG0_dis_wc_Pos) /*!< UMCTL2_T::DBG0: dis_wc Mask */ + +#define UMCTL2_DBG0_dis_rd_bypass_Pos (1) /*!< UMCTL2_T::DBG0: dis_rd_bypass Position */ +#define UMCTL2_DBG0_dis_rd_bypass_Msk (0x1ul << UMCTL2_DBG0_dis_rd_bypass_Pos) /*!< UMCTL2_T::DBG0: dis_rd_bypass Mask */ + +#define UMCTL2_DBG0_dis_act_bypass_Pos (2) /*!< UMCTL2_T::DBG0: dis_act_bypass Position*/ +#define UMCTL2_DBG0_dis_act_bypass_Msk (0x1ul << UMCTL2_DBG0_dis_act_bypass_Pos) /*!< UMCTL2_T::DBG0: dis_act_bypass Mask */ + +#define UMCTL2_DBG0_dis_collision_page_opt_Pos (4) /*!< UMCTL2_T::DBG0: dis_collision_page_opt Position*/ +#define UMCTL2_DBG0_dis_collision_page_opt_Msk (0x1ul << UMCTL2_DBG0_dis_collision_page_opt_Pos) /*!< UMCTL2_T::DBG0: dis_collision_page_opt Mask*/ + +#define UMCTL2_DBG0_dis_max_rank_rd_opt_Pos (6) /*!< UMCTL2_T::DBG0: dis_max_rank_rd_opt Position*/ +#define UMCTL2_DBG0_dis_max_rank_rd_opt_Msk (0x1ul << UMCTL2_DBG0_dis_max_rank_rd_opt_Pos) /*!< UMCTL2_T::DBG0: dis_max_rank_rd_opt Mask*/ + +#define UMCTL2_DBG0_dis_max_rank_wr_opt_Pos (7) /*!< UMCTL2_T::DBG0: dis_max_rank_wr_opt Position*/ +#define UMCTL2_DBG0_dis_max_rank_wr_opt_Msk (0x1ul << UMCTL2_DBG0_dis_max_rank_wr_opt_Pos) /*!< UMCTL2_T::DBG0: dis_max_rank_wr_opt Mask*/ + +#define UMCTL2_DBG1_dis_dq_Pos (0) /*!< UMCTL2_T::DBG1: dis_dq Position */ +#define UMCTL2_DBG1_dis_dq_Msk (0x1ul << UMCTL2_DBG1_dis_dq_Pos) /*!< UMCTL2_T::DBG1: dis_dq Mask */ + +#define UMCTL2_DBG1_dis_hif_Pos (1) /*!< UMCTL2_T::DBG1: dis_hif Position */ +#define UMCTL2_DBG1_dis_hif_Msk (0x1ul << UMCTL2_DBG1_dis_hif_Pos) /*!< UMCTL2_T::DBG1: dis_hif Mask */ + +#define UMCTL2_DBGCAM_dbg_hpr_q_depth_Pos (0) /*!< UMCTL2_T::DBGCAM: dbg_hpr_q_depth Position*/ +#define UMCTL2_DBGCAM_dbg_hpr_q_depth_Msk (0x3ful << UMCTL2_DBGCAM_dbg_hpr_q_depth_Pos) /*!< UMCTL2_T::DBGCAM: dbg_hpr_q_depth Mask */ + +#define UMCTL2_DBGCAM_dbg_lpr_q_depth_Pos (8) /*!< UMCTL2_T::DBGCAM: dbg_lpr_q_depth Position*/ +#define UMCTL2_DBGCAM_dbg_lpr_q_depth_Msk (0x3ful << UMCTL2_DBGCAM_dbg_lpr_q_depth_Pos) /*!< UMCTL2_T::DBGCAM: dbg_lpr_q_depth Mask */ + +#define UMCTL2_DBGCAM_dbg_w_q_depth_Pos (16) /*!< UMCTL2_T::DBGCAM: dbg_w_q_depth Position*/ +#define UMCTL2_DBGCAM_dbg_w_q_depth_Msk (0x3ful << UMCTL2_DBGCAM_dbg_w_q_depth_Pos) /*!< UMCTL2_T::DBGCAM: dbg_w_q_depth Mask */ + +#define UMCTL2_DBGCAM_dbg_stall_Pos (24) /*!< UMCTL2_T::DBGCAM: dbg_stall Position */ +#define UMCTL2_DBGCAM_dbg_stall_Msk (0x1ul << UMCTL2_DBGCAM_dbg_stall_Pos) /*!< UMCTL2_T::DBGCAM: dbg_stall Mask */ + +#define UMCTL2_DBGCAM_dbg_rd_q_empty_Pos (25) /*!< UMCTL2_T::DBGCAM: dbg_rd_q_empty Position*/ +#define UMCTL2_DBGCAM_dbg_rd_q_empty_Msk (0x1ul << UMCTL2_DBGCAM_dbg_rd_q_empty_Pos) /*!< UMCTL2_T::DBGCAM: dbg_rd_q_empty Mask */ + +#define UMCTL2_DBGCAM_dbg_wr_q_empty_Pos (26) /*!< UMCTL2_T::DBGCAM: dbg_wr_q_empty Position*/ +#define UMCTL2_DBGCAM_dbg_wr_q_empty_Msk (0x1ul << UMCTL2_DBGCAM_dbg_wr_q_empty_Pos) /*!< UMCTL2_T::DBGCAM: dbg_wr_q_empty Mask */ + +#define UMCTL2_DBGCAM_rd_data_pipeline_empty_Pos (28) /*!< UMCTL2_T::DBGCAM: rd_data_pipeline_empty Position*/ +#define UMCTL2_DBGCAM_rd_data_pipeline_empty_Msk (0x1ul << UMCTL2_DBGCAM_rd_data_pipeline_empty_Pos) /*!< UMCTL2_T::DBGCAM: rd_data_pipeline_empty Mask*/ + +#define UMCTL2_DBGCAM_wr_data_pipeline_empty_Pos (29) /*!< UMCTL2_T::DBGCAM: wr_data_pipeline_empty Position*/ +#define UMCTL2_DBGCAM_wr_data_pipeline_empty_Msk (0x1ul << UMCTL2_DBGCAM_wr_data_pipeline_empty_Pos) /*!< UMCTL2_T::DBGCAM: wr_data_pipeline_empty Mask*/ + +#define UMCTL2_DBGCMD_rank0_refresh_Pos (0) /*!< UMCTL2_T::DBGCMD: rank0_refresh Position*/ +#define UMCTL2_DBGCMD_rank0_refresh_Msk (0x1ul << UMCTL2_DBGCMD_rank0_refresh_Pos) /*!< UMCTL2_T::DBGCMD: rank0_refresh Mask */ + +#define UMCTL2_DBGCMD_rank1_refresh_Pos (1) /*!< UMCTL2_T::DBGCMD: rank1_refresh Position*/ +#define UMCTL2_DBGCMD_rank1_refresh_Msk (0x1ul << UMCTL2_DBGCMD_rank1_refresh_Pos) /*!< UMCTL2_T::DBGCMD: rank1_refresh Mask */ + +#define UMCTL2_DBGCMD_zq_calib_short_Pos (4) /*!< UMCTL2_T::DBGCMD: zq_calib_short Position*/ +#define UMCTL2_DBGCMD_zq_calib_short_Msk (0x1ul << UMCTL2_DBGCMD_zq_calib_short_Pos) /*!< UMCTL2_T::DBGCMD: zq_calib_short Mask */ + +#define UMCTL2_DBGCMD_ctrlupd_Pos (5) /*!< UMCTL2_T::DBGCMD: ctrlupd Position */ +#define UMCTL2_DBGCMD_ctrlupd_Msk (0x1ul << UMCTL2_DBGCMD_ctrlupd_Pos) /*!< UMCTL2_T::DBGCMD: ctrlupd Mask */ + +#define UMCTL2_DBGSTAT_rank0_refresh_busy_Pos (0) /*!< UMCTL2_T::DBGSTAT: rank0_refresh_busy Position*/ +#define UMCTL2_DBGSTAT_rank0_refresh_busy_Msk (0x1ul << UMCTL2_DBGSTAT_rank0_refresh_busy_Pos) /*!< UMCTL2_T::DBGSTAT: rank0_refresh_busy Mask*/ + +#define UMCTL2_DBGSTAT_rank1_refresh_busy_Pos (1) /*!< UMCTL2_T::DBGSTAT: rank1_refresh_busy Position*/ +#define UMCTL2_DBGSTAT_rank1_refresh_busy_Msk (0x1ul << UMCTL2_DBGSTAT_rank1_refresh_busy_Pos) /*!< UMCTL2_T::DBGSTAT: rank1_refresh_busy Mask*/ + +#define UMCTL2_DBGSTAT_zq_calib_short_busy_Pos (4) /*!< UMCTL2_T::DBGSTAT: zq_calib_short_busy Position*/ +#define UMCTL2_DBGSTAT_zq_calib_short_busy_Msk (0x1ul << UMCTL2_DBGSTAT_zq_calib_short_busy_Pos) /*!< UMCTL2_T::DBGSTAT: zq_calib_short_busy Mask*/ + +#define UMCTL2_DBGSTAT_ctrlupd_busy_Pos (5) /*!< UMCTL2_T::DBGSTAT: ctrlupd_busy Position*/ +#define UMCTL2_DBGSTAT_ctrlupd_busy_Msk (0x1ul << UMCTL2_DBGSTAT_ctrlupd_busy_Pos) /*!< UMCTL2_T::DBGSTAT: ctrlupd_busy Mask */ + +#define UMCTL2_SWCTL_sw_done_Pos (0) /*!< UMCTL2_T::SWCTL: sw_done Position */ +#define UMCTL2_SWCTL_sw_done_Msk (0x1ul << UMCTL2_SWCTL_sw_done_Pos) /*!< UMCTL2_T::SWCTL: sw_done Mask */ + +#define UMCTL2_SWSTAT_sw_done_ack_Pos (0) /*!< UMCTL2_T::SWSTAT: sw_done_ack Position */ +#define UMCTL2_SWSTAT_sw_done_ack_Msk (0x1ul << UMCTL2_SWSTAT_sw_done_ack_Pos) /*!< UMCTL2_T::SWSTAT: sw_done_ack Mask */ + +#define UMCTL2_SWCTLSTATIC_sw_static_unlock_Pos (0) /*!< UMCTL2_T::SWCTLSTATIC: sw_static_unlock Position*/ +#define UMCTL2_SWCTLSTATIC_sw_static_unlock_Msk (0x1ul << UMCTL2_SWCTLSTATIC_sw_static_unlock_Pos) /*!< UMCTL2_T::SWCTLSTATIC: sw_static_unlock Mask*/ + +#define UMCTL2_POISONCFG_wr_poison_slverr_en_Pos (0) /*!< UMCTL2_T::POISONCFG: wr_poison_slverr_en Position*/ +#define UMCTL2_POISONCFG_wr_poison_slverr_en_Msk (0x1ul << UMCTL2_POISONCFG_wr_poison_slverr_en_Pos) /*!< UMCTL2_T::POISONCFG: wr_poison_slverr_en Mask*/ + +#define UMCTL2_POISONCFG_wr_poison_intr_en_Pos (4) /*!< UMCTL2_T::POISONCFG: wr_poison_intr_en Position*/ +#define UMCTL2_POISONCFG_wr_poison_intr_en_Msk (0x1ul << UMCTL2_POISONCFG_wr_poison_intr_en_Pos) /*!< UMCTL2_T::POISONCFG: wr_poison_intr_en Mask*/ + +#define UMCTL2_POISONCFG_wr_poison_intr_clr_Pos (8) /*!< UMCTL2_T::POISONCFG: wr_poison_intr_clr Position*/ +#define UMCTL2_POISONCFG_wr_poison_intr_clr_Msk (0x1ul << UMCTL2_POISONCFG_wr_poison_intr_clr_Pos) /*!< UMCTL2_T::POISONCFG: wr_poison_intr_clr Mask*/ + +#define UMCTL2_POISONCFG_rd_poison_slverr_en_Pos (16) /*!< UMCTL2_T::POISONCFG: rd_poison_slverr_en Position*/ +#define UMCTL2_POISONCFG_rd_poison_slverr_en_Msk (0x1ul << UMCTL2_POISONCFG_rd_poison_slverr_en_Pos) /*!< UMCTL2_T::POISONCFG: rd_poison_slverr_en Mask*/ + +#define UMCTL2_POISONCFG_rd_poison_intr_en_Pos (20) /*!< UMCTL2_T::POISONCFG: rd_poison_intr_en Position*/ +#define UMCTL2_POISONCFG_rd_poison_intr_en_Msk (0x1ul << UMCTL2_POISONCFG_rd_poison_intr_en_Pos) /*!< UMCTL2_T::POISONCFG: rd_poison_intr_en Mask*/ + +#define UMCTL2_POISONCFG_rd_poison_intr_clr_Pos (24) /*!< UMCTL2_T::POISONCFG: rd_poison_intr_clr Position*/ +#define UMCTL2_POISONCFG_rd_poison_intr_clr_Msk (0x1ul << UMCTL2_POISONCFG_rd_poison_intr_clr_Pos) /*!< UMCTL2_T::POISONCFG: rd_poison_intr_clr Mask*/ + +#define UMCTL2_POISONSTAT_wr_poison_intr_0_Pos (0) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_0 Position*/ +#define UMCTL2_POISONSTAT_wr_poison_intr_0_Msk (0x1ul << UMCTL2_POISONSTAT_wr_poison_intr_0_Pos) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_0 Mask*/ + +#define UMCTL2_POISONSTAT_wr_poison_intr_1_Pos (1) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_1 Position*/ +#define UMCTL2_POISONSTAT_wr_poison_intr_1_Msk (0x1ul << UMCTL2_POISONSTAT_wr_poison_intr_1_Pos) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_1 Mask*/ + +#define UMCTL2_POISONSTAT_wr_poison_intr_2_Pos (2) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_2 Position*/ +#define UMCTL2_POISONSTAT_wr_poison_intr_2_Msk (0x1ul << UMCTL2_POISONSTAT_wr_poison_intr_2_Pos) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_2 Mask*/ + +#define UMCTL2_POISONSTAT_wr_poison_intr_3_Pos (3) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_3 Position*/ +#define UMCTL2_POISONSTAT_wr_poison_intr_3_Msk (0x1ul << UMCTL2_POISONSTAT_wr_poison_intr_3_Pos) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_3 Mask*/ + +#define UMCTL2_POISONSTAT_wr_poison_intr_4_Pos (4) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_4 Position*/ +#define UMCTL2_POISONSTAT_wr_poison_intr_4_Msk (0x1ul << UMCTL2_POISONSTAT_wr_poison_intr_4_Pos) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_4 Mask*/ + +#define UMCTL2_POISONSTAT_wr_poison_intr_5_Pos (5) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_5 Position*/ +#define UMCTL2_POISONSTAT_wr_poison_intr_5_Msk (0x1ul << UMCTL2_POISONSTAT_wr_poison_intr_5_Pos) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_5 Mask*/ + +#define UMCTL2_POISONSTAT_wr_poison_intr_6_Pos (6) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_6 Position*/ +#define UMCTL2_POISONSTAT_wr_poison_intr_6_Msk (0x1ul << UMCTL2_POISONSTAT_wr_poison_intr_6_Pos) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_6 Mask*/ + +#define UMCTL2_POISONSTAT_wr_poison_intr_7_Pos (7) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_7 Position*/ +#define UMCTL2_POISONSTAT_wr_poison_intr_7_Msk (0x1ul << UMCTL2_POISONSTAT_wr_poison_intr_7_Pos) /*!< UMCTL2_T::POISONSTAT: wr_poison_intr_7 Mask*/ + +#define UMCTL2_POISONSTAT_rd_poison_intr_0_Pos (16) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_0 Position*/ +#define UMCTL2_POISONSTAT_rd_poison_intr_0_Msk (0x1ul << UMCTL2_POISONSTAT_rd_poison_intr_0_Pos) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_0 Mask*/ + +#define UMCTL2_POISONSTAT_rd_poison_intr_1_Pos (17) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_1 Position*/ +#define UMCTL2_POISONSTAT_rd_poison_intr_1_Msk (0x1ul << UMCTL2_POISONSTAT_rd_poison_intr_1_Pos) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_1 Mask*/ + +#define UMCTL2_POISONSTAT_rd_poison_intr_2_Pos (18) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_2 Position*/ +#define UMCTL2_POISONSTAT_rd_poison_intr_2_Msk (0x1ul << UMCTL2_POISONSTAT_rd_poison_intr_2_Pos) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_2 Mask*/ + +#define UMCTL2_POISONSTAT_rd_poison_intr_3_Pos (19) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_3 Position*/ +#define UMCTL2_POISONSTAT_rd_poison_intr_3_Msk (0x1ul << UMCTL2_POISONSTAT_rd_poison_intr_3_Pos) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_3 Mask*/ + +#define UMCTL2_POISONSTAT_rd_poison_intr_4_Pos (20) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_4 Position*/ +#define UMCTL2_POISONSTAT_rd_poison_intr_4_Msk (0x1ul << UMCTL2_POISONSTAT_rd_poison_intr_4_Pos) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_4 Mask*/ + +#define UMCTL2_POISONSTAT_rd_poison_intr_5_Pos (21) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_5 Position*/ +#define UMCTL2_POISONSTAT_rd_poison_intr_5_Msk (0x1ul << UMCTL2_POISONSTAT_rd_poison_intr_5_Pos) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_5 Mask*/ + +#define UMCTL2_POISONSTAT_rd_poison_intr_6_Pos (22) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_6 Position*/ +#define UMCTL2_POISONSTAT_rd_poison_intr_6_Msk (0x1ul << UMCTL2_POISONSTAT_rd_poison_intr_6_Pos) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_6 Mask*/ + +#define UMCTL2_POISONSTAT_rd_poison_intr_7_Pos (23) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_7 Position*/ +#define UMCTL2_POISONSTAT_rd_poison_intr_7_Msk (0x1ul << UMCTL2_POISONSTAT_rd_poison_intr_7_Pos) /*!< UMCTL2_T::POISONSTAT: rd_poison_intr_7 Mask*/ + +#define UMCTL2_PSTAT_rd_port_busy_0_Pos (0) /*!< UMCTL2_T::PSTAT: rd_port_busy_0 Position*/ +#define UMCTL2_PSTAT_rd_port_busy_0_Msk (0x1ul << UMCTL2_PSTAT_rd_port_busy_0_Pos) /*!< UMCTL2_T::PSTAT: rd_port_busy_0 Mask */ + +#define UMCTL2_PSTAT_rd_port_busy_1_Pos (1) /*!< UMCTL2_T::PSTAT: rd_port_busy_1 Position*/ +#define UMCTL2_PSTAT_rd_port_busy_1_Msk (0x1ul << UMCTL2_PSTAT_rd_port_busy_1_Pos) /*!< UMCTL2_T::PSTAT: rd_port_busy_1 Mask */ + +#define UMCTL2_PSTAT_rd_port_busy_2_Pos (2) /*!< UMCTL2_T::PSTAT: rd_port_busy_2 Position*/ +#define UMCTL2_PSTAT_rd_port_busy_2_Msk (0x1ul << UMCTL2_PSTAT_rd_port_busy_2_Pos) /*!< UMCTL2_T::PSTAT: rd_port_busy_2 Mask */ + +#define UMCTL2_PSTAT_rd_port_busy_3_Pos (3) /*!< UMCTL2_T::PSTAT: rd_port_busy_3 Position*/ +#define UMCTL2_PSTAT_rd_port_busy_3_Msk (0x1ul << UMCTL2_PSTAT_rd_port_busy_3_Pos) /*!< UMCTL2_T::PSTAT: rd_port_busy_3 Mask */ + +#define UMCTL2_PSTAT_rd_port_busy_4_Pos (4) /*!< UMCTL2_T::PSTAT: rd_port_busy_4 Position*/ +#define UMCTL2_PSTAT_rd_port_busy_4_Msk (0x1ul << UMCTL2_PSTAT_rd_port_busy_4_Pos) /*!< UMCTL2_T::PSTAT: rd_port_busy_4 Mask */ + +#define UMCTL2_PSTAT_rd_port_busy_5_Pos (5) /*!< UMCTL2_T::PSTAT: rd_port_busy_5 Position*/ +#define UMCTL2_PSTAT_rd_port_busy_5_Msk (0x1ul << UMCTL2_PSTAT_rd_port_busy_5_Pos) /*!< UMCTL2_T::PSTAT: rd_port_busy_5 Mask */ + +#define UMCTL2_PSTAT_rd_port_busy_6_Pos (6) /*!< UMCTL2_T::PSTAT: rd_port_busy_6 Position*/ +#define UMCTL2_PSTAT_rd_port_busy_6_Msk (0x1ul << UMCTL2_PSTAT_rd_port_busy_6_Pos) /*!< UMCTL2_T::PSTAT: rd_port_busy_6 Mask */ + +#define UMCTL2_PSTAT_rd_port_busy_7_Pos (7) /*!< UMCTL2_T::PSTAT: rd_port_busy_7 Position*/ +#define UMCTL2_PSTAT_rd_port_busy_7_Msk (0x1ul << UMCTL2_PSTAT_rd_port_busy_7_Pos) /*!< UMCTL2_T::PSTAT: rd_port_busy_7 Mask */ + +#define UMCTL2_PSTAT_wr_port_busy_0_Pos (16) /*!< UMCTL2_T::PSTAT: wr_port_busy_0 Position*/ +#define UMCTL2_PSTAT_wr_port_busy_0_Msk (0x1ul << UMCTL2_PSTAT_wr_port_busy_0_Pos) /*!< UMCTL2_T::PSTAT: wr_port_busy_0 Mask */ + +#define UMCTL2_PSTAT_wr_port_busy_1_Pos (17) /*!< UMCTL2_T::PSTAT: wr_port_busy_1 Position*/ +#define UMCTL2_PSTAT_wr_port_busy_1_Msk (0x1ul << UMCTL2_PSTAT_wr_port_busy_1_Pos) /*!< UMCTL2_T::PSTAT: wr_port_busy_1 Mask */ + +#define UMCTL2_PSTAT_wr_port_busy_2_Pos (18) /*!< UMCTL2_T::PSTAT: wr_port_busy_2 Position*/ +#define UMCTL2_PSTAT_wr_port_busy_2_Msk (0x1ul << UMCTL2_PSTAT_wr_port_busy_2_Pos) /*!< UMCTL2_T::PSTAT: wr_port_busy_2 Mask */ + +#define UMCTL2_PSTAT_wr_port_busy_3_Pos (19) /*!< UMCTL2_T::PSTAT: wr_port_busy_3 Position*/ +#define UMCTL2_PSTAT_wr_port_busy_3_Msk (0x1ul << UMCTL2_PSTAT_wr_port_busy_3_Pos) /*!< UMCTL2_T::PSTAT: wr_port_busy_3 Mask */ + +#define UMCTL2_PSTAT_wr_port_busy_4_Pos (20) /*!< UMCTL2_T::PSTAT: wr_port_busy_4 Position*/ +#define UMCTL2_PSTAT_wr_port_busy_4_Msk (0x1ul << UMCTL2_PSTAT_wr_port_busy_4_Pos) /*!< UMCTL2_T::PSTAT: wr_port_busy_4 Mask */ + +#define UMCTL2_PSTAT_wr_port_busy_5_Pos (21) /*!< UMCTL2_T::PSTAT: wr_port_busy_5 Position*/ +#define UMCTL2_PSTAT_wr_port_busy_5_Msk (0x1ul << UMCTL2_PSTAT_wr_port_busy_5_Pos) /*!< UMCTL2_T::PSTAT: wr_port_busy_5 Mask */ + +#define UMCTL2_PSTAT_wr_port_busy_6_Pos (22) /*!< UMCTL2_T::PSTAT: wr_port_busy_6 Position*/ +#define UMCTL2_PSTAT_wr_port_busy_6_Msk (0x1ul << UMCTL2_PSTAT_wr_port_busy_6_Pos) /*!< UMCTL2_T::PSTAT: wr_port_busy_6 Mask */ + +#define UMCTL2_PSTAT_wr_port_busy_7_Pos (23) /*!< UMCTL2_T::PSTAT: wr_port_busy_7 Position*/ +#define UMCTL2_PSTAT_wr_port_busy_7_Msk (0x1ul << UMCTL2_PSTAT_wr_port_busy_7_Pos) /*!< UMCTL2_T::PSTAT: wr_port_busy_7 Mask */ + +#define UMCTL2_PCCFG_go2critical_en_Pos (0) /*!< UMCTL2_T::PCCFG: go2critical_en Position*/ +#define UMCTL2_PCCFG_go2critical_en_Msk (0x1ul << UMCTL2_PCCFG_go2critical_en_Pos) /*!< UMCTL2_T::PCCFG: go2critical_en Mask */ + +#define UMCTL2_PCCFG_pagematch_limit_Pos (4) /*!< UMCTL2_T::PCCFG: pagematch_limit Position*/ +#define UMCTL2_PCCFG_pagematch_limit_Msk (0x1ul << UMCTL2_PCCFG_pagematch_limit_Pos) /*!< UMCTL2_T::PCCFG: pagematch_limit Mask */ + +#define UMCTL2_PCCFG_bl_exp_mode_Pos (8) /*!< UMCTL2_T::PCCFG: bl_exp_mode Position */ +#define UMCTL2_PCCFG_bl_exp_mode_Msk (0x1ul << UMCTL2_PCCFG_bl_exp_mode_Pos) /*!< UMCTL2_T::PCCFG: bl_exp_mode Mask */ + +#define UMCTL2_PCFGR_0_rd_port_priority_Pos (0) /*!< UMCTL2_T::PCFGR_0: rd_port_priority Position */ +#define UMCTL2_PCFGR_0_rd_port_priority_Msk (0x3fful << UMCTL2_PCFGR_0_rd_port_priority_Pos) /*!< UMCTL2_T::PCFGR_0: rd_port_priority Mask */ + +#define UMCTL2_PCFGR_0_rd_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGR_0: rd_port_aging_en Position */ +#define UMCTL2_PCFGR_0_rd_port_aging_en_Msk (0x1ul << UMCTL2_PCFGR_0_rd_port_aging_en_Pos) /*!< UMCTL2_T::PCFGR_0: rd_port_aging_en Mask */ + +#define UMCTL2_PCFGR_0_rd_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGR_0: rd_port_urgent_en Position*/ +#define UMCTL2_PCFGR_0_rd_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGR_0_rd_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGR_0: rd_port_urgent_en Mask */ + +#define UMCTL2_PCFGR_0_rd_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGR_0: rd_port_pagematch_en Position*/ +#define UMCTL2_PCFGR_0_rd_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGR_0_rd_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGR_0: rd_port_pagematch_en Mask */ + +#define UMCTL2_PCFGR_0_rdwr_ordered_en_Pos (16) /*!< UMCTL2_T::PCFGR_0: rdwr_ordered_en Position */ +#define UMCTL2_PCFGR_00_rdwr_ordered_en_Msk (0x1ul << UMCTL2_PCFGR_0_rdwr_ordered_en_Pos) /*!< UMCTL2_T::PCFGR_0: rdwr_ordered_en Mask */ + +#define UMCTL2_PCFGW_0_wr_port_priority_Pos (0) /*!< UMCTL2_T::PCFGW_0: wr_port_priority Position */ +#define UMCTL2_PCFGW_0_wr_port_priority_Msk (0x3fful << UMCTL2_PCFGW_0_wr_port_priority_Pos) /*!< UMCTL2_T::PCFGW_0: wr_port_priority Mask */ + +#define UMCTL2_PCFGW_0_wr_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGW_0: wr_port_aging_en Position */ +#define UMCTL2_PCFGW_0_wr_port_aging_en_Msk (0x1ul << UMCTL2_PCFGW_0_wr_port_aging_en_Pos) /*!< UMCTL2_T::PCFGW_0: wr_port_aging_en Mask */ + +#define UMCTL2_PCFGW_0_wr_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGW_0: wr_port_urgent_en Position*/ +#define UMCTL2_PCFGW_0_wr_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGW_0_wr_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGW_0: wr_port_urgent_en Mask */ + +#define UMCTL2_PCFGW_0_wr_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGW_0: wr_port_pagematch_en Position*/ +#define UMCTL2_PCFGW_0_wr_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGW_0_wr_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGW_0: wr_port_pagematch_en Mask */ + +#define UMCTL2_PCTRL_0_port_en_Pos (0) /*!< UMCTL2_T::PCTRL_0: port_en Position */ +#define UMCTL2_PCTRL_0_port_en_Msk (0x1ul << UMCTL2_PCTRL_0_port_en_Pos) /*!< UMCTL2_T::PCTRL_0: port_en Mask */ + +#define UMCTL2_PCFGQOS0_0_rqos_map_level1_Pos (0) /*!< UMCTL2_T::PCFGQOS0_0: rqos_map_level1 Position */ +#define UMCTL2_PCFGQOS0_0_rqos_map_level1_Msk (0xful << UMCTL2_PCFGQOS0_0_rqos_map_level1_Pos) /*!< UMCTL2_T::PCFGQOS0_0: rqos_map_level1 Mask */ + +#define UMCTL2_PCFGQOS0_0_rqos_map_region0_Pos (16) /*!< UMCTL2_T::PCFGQOS0_0: rqos_map_region0 Position */ +#define UMCTL2_PCFGQOS0_0_rqos_map_region0_Msk (0x3ul << UMCTL2_PCFGQOS0_0_rqos_map_region0_Pos) /*!< UMCTL2_T::PCFGQOS0_0: rqos_map_region0 Mask */ + +#define UMCTL2_PCFGQOS0_0_rqos_map_region1_Pos (20) /*!< UMCTL2_T::0: rqos_map_region1 Position */ +#define UMCTL2_PCFGQOS0_0_rqos_map_region1_Msk (0x3ul << UMCTL2_PCFGQOS0_0_rqos_map_region1_Pos) /*!< UMCTL2_T::0: rqos_map_region1 Mask */ + +#define UMCTL2_PCFGR_1_rd_port_priority_Pos (0) /*!< UMCTL2_T::PCFGR_1: rd_port_priority Position */ +#define UMCTL2_PCFGR_1_rd_port_priority_Msk (0x3fful << UMCTL2_PCFGR_1_rd_port_priority_Pos) /*!< UMCTL2_T::PCFGR_1: rd_port_priority Mask */ + +#define UMCTL2_PCFGR_1_rd_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGR_1: rd_port_aging_en Position */ +#define UMCTL2_PCFGR_1_rd_port_aging_en_Msk (0x1ul << UMCTL2_PCFGR_1_rd_port_aging_en_Pos) /*!< UMCTL2_T::PCFGR_1: rd_port_aging_en Mask */ + +#define UMCTL2_PCFGR_1_rd_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGR_1: rd_port_urgent_en Position*/ +#define UMCTL2_PCFGR_1_rd_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGR_1_rd_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGR_1: rd_port_urgent_en Mask */ + +#define UMCTL2_PCFGR_1_rd_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGR_1: rd_port_pagematch_en Position*/ +#define UMCTL2_PCFGR_1_rd_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGR_1_rd_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGR_1: rd_port_pagematch_en Mask */ + +#define UMCTL2_PCFGR_1_rdwr_ordered_en_Pos (16) /*!< UMCTL2_T::PCFGR_1: rdwr_ordered_en Position */ +#define UMCTL2_PCFGR_1_rdwr_ordered_en_Msk (0x1ul << UMCTL2_PCFGR_1_rdwr_ordered_en_Pos) /*!< UMCTL2_T::PCFGR_1: rdwr_ordered_en Mask */ + +#define UMCTL2_PCFGW_1_wr_port_priority_Pos (0) /*!< UMCTL2_T::PCFGW_1: wr_port_priority Position */ +#define UMCTL2_PCFGW_1_wr_port_priority_Msk (0x3fful << UMCTL2_PCFGW_1_wr_port_priority_Pos) /*!< UMCTL2_T::PCFGW_1: wr_port_priority Mask */ + +#define UMCTL2_PCFGW_1_wr_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGW_1: wr_port_aging_en Position */ +#define UMCTL2_PCFGW_1_wr_port_aging_en_Msk (0x1ul << UMCTL2_PCFGW_1_wr_port_aging_en_Pos) /*!< UMCTL2_T::PCFGW_1: wr_port_aging_en Mask */ + +#define UMCTL2_PCFGW_1_wr_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGW_1: wr_port_urgent_en Position*/ +#define UMCTL2_PCFGW_1_wr_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGW_1_wr_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGW_1: wr_port_urgent_en Mask */ + +#define UMCTL2_PCFGW_1_wr_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGW_1: wr_port_pagematch_en Position*/ +#define UMCTL2_PCFGW_1_wr_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGW_1_wr_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGW_1: wr_port_pagematch_en Mask */ + +#define UMCTL2_PCTRL_1_port_en_Pos (0) /*!< UMCTL2_T::PCTRL_1: port_en Position */ +#define UMCTL2_PCTRL_1_port_en_Msk (0x1ul << UMCTL2_PCTRL_1_port_en_Pos) /*!< UMCTL2_T::PCTRL_1: port_en Mask */ + +#define UMCTL2_PCFGQOS0_1_rqos_map_level1_Pos (0) /*!< UMCTL2_T::PCFGQOS0_1: rqos_map_level1 Position */ +#define UMCTL2_PCFGQOS0_1_rqos_map_level1_Msk (0xful << UMCTL2_PCFGQOS0_1_rqos_map_level1_Pos) /*!< UMCTL2_T::PCFGQOS0_1: rqos_map_level1 Mask */ + +#define UMCTL2_PCFGQOS0_1_rqos_map_region0_Pos (16) /*!< UMCTL2_T::PCFGQOS0_1: rqos_map_region0 Position */ +#define UMCTL2_PCFGQOS0_1_rqos_map_region0_Msk (0x3ul << UMCTL2_PCFGQOS0_1_rqos_map_region0_Pos) /*!< UMCTL2_T::PCFGQOS0_1: rqos_map_region0 Mask */ + +#define UMCTL2_PCFGQOS0_1_rqos_map_region1_Pos (20) /*!< UMCTL2_T::PCFGQOS0_1: rqos_map_region1 Position */ +#define UMCTL2_PCFGQOS0_1_rqos_map_region1_Msk (0x3ul << UMCTL2_PCFGQOS0_1_rqos_map_region1_Pos) /*!< UMCTL2_T::PCFGQOS0_1: rqos_map_region1 Mask */ + +#define UMCTL2_PCFGR_2_rd_port_priority_Pos (0) /*!< UMCTL2_T::PCFGR_2: rd_port_priority Position */ +#define UMCTL2_PCFGR_2_rd_port_priority_Msk (0x3fful << UMCTL2_PCFGR_2_rd_port_priority_Pos) /*!< UMCTL2_T::PCFGR_2: rd_port_priority Mask */ + +#define UMCTL2_PCFGR_2_rd_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGR_2: rd_port_aging_en Position */ +#define UMCTL2_PCFGR_2_rd_port_aging_en_Msk (0x1ul << UMCTL2_PCFGR_2_rd_port_aging_en_Pos) /*!< UMCTL2_T::PCFGR_2: rd_port_aging_en Mask */ + +#define UMCTL2_PCFGR_2_rd_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGR_2: rd_port_urgent_en Position*/ +#define UMCTL2_PCFGR_2_rd_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGR_2_rd_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGR_2: rd_port_urgent_en Mask */ + +#define UMCTL2_PCFGR_2_rd_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGR_2: rd_port_pagematch_en Position*/ +#define UMCTL2_PCFGR_2_rd_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGR_2_rd_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGR_2: rd_port_pagematch_en Mask */ + +#define UMCTL2_PCFGR_2_rdwr_ordered_en_Pos (16) /*!< UMCTL2_T::2: rdwr_ordered_en Position */ +#define UMCTL2_PCFGR_2_rdwr_ordered_en_Msk (0x1ul << UMCTL2_PCFGR_2_rdwr_ordered_en_Pos) /*!< UMCTL2_T::2: rdwr_ordered_en Mask */ + +#define UMCTL2_PCFGW_2_wr_port_priority_Pos (0) /*!< UMCTL2_T::PCFGW_2: wr_port_priority Position */ +#define UMCTL2_PCFGW_2_wr_port_priority_Msk (0x3fful << UMCTL2_PCFGW_2_wr_port_priority_Pos) /*!< UMCTL2_T::PCFGW_2: wr_port_priority Mask */ + +#define UMCTL2_PCFGW_2_wr_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGW_2: wr_port_aging_en Position */ +#define UMCTL2_PCFGW_2_wr_port_aging_en_Msk (0x1ul << UMCTL2_PCFGW_2_wr_port_aging_en_Pos) /*!< UMCTL2_T::PCFGW_2: wr_port_aging_en Mask */ + +#define UMCTL2_PCFGW_2_wr_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGW_2: wr_port_urgent_en Position*/ +#define UMCTL2_PCFGW_2_wr_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGW_2_wr_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGW_2: wr_port_urgent_en Mask */ + +#define UMCTL2_PCFGW_2_wr_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGW_2: wr_port_pagematch_en Position*/ +#define UMCTL2_PCFGW_2_wr_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGW_2_wr_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGW_2: wr_port_pagematch_en Mask */ + +#define UMCTL2_PCTRL_2_port_en_Pos (0) /*!< UMCTL2_T::PCTRL_2: port_en Position */ +#define UMCTL2_PCTRL_2_port_en_Msk (0x1ul << UMCTL2_PCTRL_2_port_en_Pos) /*!< UMCTL2_T::PCTRL_2: port_en Mask */ + +#define UMCTL2_PCFGQOS0_2_rqos_map_level1_Pos (0) /*!< UMCTL2_T::PCFGQOS0_2: rqos_map_level1 Position */ +#define UMCTL2_PCFGQOS0_2_rqos_map_level1_Msk (0xful << UMCTL2_PCFGQOS0_2_rqos_map_level1_Pos) /*!< UMCTL2_T::PCFGQOS0_2: rqos_map_level1 Mask */ + +#define UMCTL2_PCFGQOS0_2_rqos_map_region0_Pos (16) /*!< UMCTL2_T::PCFGQOS0_2: rqos_map_region0 Position */ +#define UMCTL2_PCFGQOS0_2_rqos_map_region0_Msk (0x3ul << UMCTL2_PCFGQOS0_2_rqos_map_region0_Pos) /*!< UMCTL2_T::PCFGQOS0_2: rqos_map_region0 Mask */ + +#define UMCTL2_PCFGQOS0_2_rqos_map_region1_Pos (20) /*!< UMCTL2_T::PCFGQOS0_2: rqos_map_region1 Position */ +#define UMCTL2_PCFGQOS0_2_rqos_map_region1_Msk (0x3ul << UMCTL2_PCFGQOS0_2_rqos_map_region1_Pos) /*!< UMCTL2_T::PCFGQOS0_2: rqos_map_region1 Mask */ + +#define UMCTL2_PCFGR_3_rd_port_priority_Pos (0) /*!< UMCTL2_T::PCFGR_3: rd_port_priority Position */ +#define UMCTL2_PCFGR_3_rd_port_priority_Msk (0x3fful << UMCTL2_PCFGR_3_rd_port_priority_Pos) /*!< UMCTL2_T::PCFGR_3: rd_port_priority Mask */ + +#define UMCTL2_PCFGR_3_rd_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGR_3: rd_port_aging_en Position */ +#define UMCTL2_PCFGR_3_rd_port_aging_en_Msk (0x1ul << UMCTL2_PCFGR_3_rd_port_aging_en_Pos) /*!< UMCTL2_T::PCFGR_3: rd_port_aging_en Mask */ + +#define UMCTL2_PCFGR_3_rd_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGR_3: rd_port_urgent_en Position*/ +#define UMCTL2_PCFGR_3_rd_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGR_3_rd_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGR_3: rd_port_urgent_en Mask */ + +#define UMCTL2_PCFGR_3_rd_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGR_3: rd_port_pagematch_en Position*/ +#define UMCTL2_PCFGR_3_rd_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGR_3_rd_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGR_3: rd_port_pagematch_en Mask */ + +#define UMCTL2_PCFGR_3_rdwr_ordered_en_Pos (16) /*!< UMCTL2_T::PCFGR_3: rdwr_ordered_en Position */ +#define UMCTL2_PCFGR_3_rdwr_ordered_en_Msk (0x1ul << UMCTL2_PCFGR_3_rdwr_ordered_en_Pos) /*!< UMCTL2_T::PCFGR_3: rdwr_ordered_en Mask */ + +#define UMCTL2_PCFGW_3_wr_port_priority_Pos (0) /*!< UMCTL2_T::PCFGW_3: wr_port_priority Position */ +#define UMCTL2_PCFGW_3_wr_port_priority_Msk (0x3fful << UMCTL2_PCFGW_3_wr_port_priority_Pos) /*!< UMCTL2_T::PCFGW_3: wr_port_priority Mask */ + +#define UMCTL2_PCFGW_3_wr_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGW_3: wr_port_aging_en Position */ +#define UMCTL2_PCFGW_3_wr_port_aging_en_Msk (0x1ul << UMCTL2_PCFGW_3_wr_port_aging_en_Pos) /*!< UMCTL2_T::PCFGW_3: wr_port_aging_en Mask */ + +#define UMCTL2_PCFGW_3_wr_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGW_3: wr_port_urgent_en Position*/ +#define UMCTL2_PCFGW_3_wr_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGW_3_wr_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGW_3: wr_port_urgent_en Mask */ + +#define UMCTL2_PCFGW_3_wr_port_pagematch_en_Pos (14) /*!< UMCTL2_T::3: wr_port_pagematch_en Position*/ +#define UMCTL2_PCFGW_3_wr_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGW_3_wr_port_pagematch_en_Pos) /*!< UMCTL2_T::3: wr_port_pagematch_en Mask */ + +#define UMCTL2_PCTRL_3_port_en_Pos (0) /*!< UMCTL2_T::PCTRL_3: port_en Position */ +#define UMCTL2_PCTRL_3_port_en_Msk (0x1ul << UMCTL2_PCTRL_3_port_en_Pos) /*!< UMCTL2_T::PCTRL_3: port_en Mask */ + +#define UMCTL2_PCFGQOS0_3_rqos_map_level1_Pos (0) /*!< UMCTL2_T::PCFGQOS0_3: rqos_map_level1 Position */ +#define UMCTL2_PCFGQOS0_3_rqos_map_level1_Msk (0xful << UMCTL2_PCFGQOS0_3_rqos_map_level1_Pos) /*!< UMCTL2_T::PCFGQOS0_3: rqos_map_level1 Mask */ + +#define UMCTL2_PCFGQOS0_3_rqos_map_region0_Pos (16) /*!< UMCTL2_T::PCFGQOS0_3: rqos_map_region0 Position */ +#define UMCTL2_PCFGQOS0_3_rqos_map_region0_Msk (0x3ul << UMCTL2_PCFGQOS0_3_rqos_map_region0_Pos) /*!< UMCTL2_T::PCFGQOS0_3: rqos_map_region0 Mask */ + +#define UMCTL2_PCFGQOS0_3_rqos_map_region1_Pos (20) /*!< UMCTL2_T::PCFGQOS0_3: rqos_map_region1 Position */ +#define UMCTL2_PCFGQOS0_3_rqos_map_region1_Msk (0x3ul << UMCTL2_PCFGQOS0_3_rqos_map_region1_Pos) /*!< UMCTL2_T::PCFGQOS0_3: rqos_map_region1 Mask */ + +#define UMCTL2_PCFGR_4_rd_port_priority_Pos (0) /*!< UMCTL2_T::PCFGR_4: rd_port_priority Position */ +#define UMCTL2_PCFGR_4_rd_port_priority_Msk (0x3fful << UMCTL2_PCFGR_4_rd_port_priority_Pos) /*!< UMCTL2_T::PCFGR_4: rd_port_priority Mask */ + +#define UMCTL2_PCFGR_4_rd_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGR_4: rd_port_aging_en Position */ +#define UMCTL2_PCFGR_4_rd_port_aging_en_Msk (0x1ul << UMCTL2_PCFGR_4_rd_port_aging_en_Pos) /*!< UMCTL2_T::PCFGR_4: rd_port_aging_en Mask */ + +#define UMCTL2_PCFGR_4_rd_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGR_4: rd_port_urgent_en Position*/ +#define UMCTL2_PCFGR_4_rd_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGR_4_rd_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGR_4: rd_port_urgent_en Mask */ + +#define UMCTL2_PCFGR_4_rd_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGR_4: rd_port_pagematch_en Position*/ +#define UMCTL2_PCFGR_4_rd_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGR_4_rd_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGR_4: rd_port_pagematch_en Mask */ + +#define UMCTL2_PCFGR_4_rdwr_ordered_en_Pos (16) /*!< UMCTL2_T::PCFGR_4: rdwr_ordered_en Position */ +#define UMCTL2_PCFGR_4_rdwr_ordered_en_Msk (0x1ul << UMCTL2_PCFGR_4_rdwr_ordered_en_Pos) /*!< UMCTL2_T::PCFGR_4: rdwr_ordered_en Mask */ + +#define UMCTL2_PCFGW_4_wr_port_priority_Pos (0) /*!< UMCTL2_T::PCFGW_4: wr_port_priority Position */ +#define UMCTL2_PCFGW_4_wr_port_priority_Msk (0x3fful << UMCTL2_PCFGW_4_wr_port_priority_Pos) /*!< UMCTL2_T::PCFGW_4: wr_port_priority Mask */ + +#define UMCTL2_PCFGW_4_wr_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGW_4: wr_port_aging_en Position */ +#define UMCTL2_PCFGW_4_wr_port_aging_en_Msk (0x1ul << UMCTL2_PCFGW_4_wr_port_aging_en_Pos) /*!< UMCTL2_T::PCFGW_4: wr_port_aging_en Mask */ + +#define UMCTL2_PCFGW_4_wr_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGW_4: wr_port_urgent_en Position*/ +#define UMCTL2_PCFGW_4_wr_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGW_4_wr_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGW_4: wr_port_urgent_en Mask */ + +#define UMCTL2_PCFGW_4_wr_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGW_4: wr_port_pagematch_en Position*/ +#define UMCTL2_PCFGW_4_wr_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGW_4_wr_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGW_4: wr_port_pagematch_en Mask */ + +#define UMCTL2_PCTRL_4_port_en_Pos (0) /*!< UMCTL2_T::PCTRL_4: port_en Position */ +#define UMCTL2_PCTRL_4_port_en_Msk (0x1ul << UMCTL2_PCTRL_4_port_en_Pos) /*!< UMCTL2_T::PCTRL_4: port_en Mask */ + +#define UMCTL2_PCFGQOS0_4_rqos_map_level1_Pos (0) /*!< UMCTL2_T::PCFGQOS0_4: rqos_map_level1 Position */ +#define UMCTL2_PCFGQOS0_4_rqos_map_level1_Msk (0xful << UMCTL2_PCFGQOS0_4_rqos_map_level1_Pos) /*!< UMCTL2_T::PCFGQOS0_4: rqos_map_level1 Mask */ + +#define UMCTL2_PCFGQOS0_4_rqos_map_region0_Pos (16) /*!< UMCTL2_T::PCFGQOS0_4: rqos_map_region0 Position */ +#define UMCTL2_PCFGQOS0_4_rqos_map_region0_Msk (0x3ul << UMCTL2_PCFGQOS0_4_rqos_map_region0_Pos) /*!< UMCTL2_T::PCFGQOS0_4: rqos_map_region0 Mask */ + +#define UMCTL2_PCFGQOS0_4_rqos_map_region1_Pos (20) /*!< UMCTL2_T::PCFGQOS0_4: rqos_map_region1 Position */ +#define UMCTL2_PCFGQOS0_4_rqos_map_region1_Msk (0x3ul << UMCTL2_PCFGQOS0_4_rqos_map_region1_Pos) /*!< UMCTL2_T::PCFGQOS0_4: rqos_map_region1 Mask */ + +#define UMCTL2_PCFGR_5_rd_port_priority_Pos (0) /*!< UMCTL2_T::PCFGR_5: rd_port_priority Position */ +#define UMCTL2_PCFGR_5_rd_port_priority_Msk (0x3fful << UMCTL2_PCFGR_5_rd_port_priority_Pos) /*!< UMCTL2_T::PCFGR_5: rd_port_priority Mask */ + +#define UMCTL2_PCFGR_5_rd_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGR_5: rd_port_aging_en Position */ +#define UMCTL2_PCFGR_5_rd_port_aging_en_Msk (0x1ul << UMCTL2_PCFGR_5_rd_port_aging_en_Pos) /*!< UMCTL2_T::PCFGR_5: rd_port_aging_en Mask */ + +#define UMCTL2_PCFGR_5_rd_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGR_5: rd_port_urgent_en Position*/ +#define UMCTL2_PCFGR_5_rd_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGR_5_rd_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGR_5: rd_port_urgent_en Mask */ + +#define UMCTL2_PCFGR_5_rd_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGR_5: rd_port_pagematch_en Position*/ +#define UMCTL2_PCFGR_5_rd_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGR_5_rd_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGR_5: rd_port_pagematch_en Mask */ + +#define UMCTL2_PCFGR_5_rdwr_ordered_en_Pos (16) /*!< UMCTL2_T::5: rdwr_ordered_en Position */ +#define UMCTL2_PCFGR_5_rdwr_ordered_en_Msk (0x1ul << UMCTL2_PCFGR_5_rdwr_ordered_en_Pos) /*!< UMCTL2_T::5: rdwr_ordered_en Mask */ + +#define UMCTL2_PCFGW_5_wr_port_priority_Pos (0) /*!< UMCTL2_T::PCFGW_5: wr_port_priority Position */ +#define UMCTL2_PCFGW_5_wr_port_priority_Msk (0x3fful << UMCTL2_PCFGW_5_wr_port_priority_Pos) /*!< UMCTL2_T::PCFGW_5: wr_port_priority Mask */ + +#define UMCTL2_PCFGW_5_wr_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGW_5: wr_port_aging_en Position */ +#define UMCTL2_PCFGW_5_wr_port_aging_en_Msk (0x1ul << UMCTL2_PCFGW_5_wr_port_aging_en_Pos) /*!< UMCTL2_T::PCFGW_5: wr_port_aging_en Mask */ + +#define UMCTL2_PCFGW_5_wr_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGW_5: wr_port_urgent_en Position*/ +#define UMCTL2_PCFGW_5_wr_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGW_5_wr_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGW_5: wr_port_urgent_en Mask */ + +#define UMCTL2_PCFGW_5_wr_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGW_5: wr_port_pagematch_en Position*/ +#define UMCTL2_PCFGW_5_wr_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGW_5_wr_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGW_5: wr_port_pagematch_en Mask */ + +#define UMCTL2_PCTRL_5_port_en_Pos (0) /*!< UMCTL2_T::PCTRL_5: port_en Position */ +#define UMCTL2_PCTRL_5_port_en_Msk (0x1ul << UMCTL2_PCTRL_5_port_en_Pos) /*!< UMCTL2_T::PCTRL_5: port_en Mask */ + +#define UMCTL2_PCFGQOS0_5_rqos_map_level1_Pos (0) /*!< UMCTL2_T::PCFGQOS0_5: rqos_map_level1 Position */ +#define UMCTL2_PCFGQOS0_5_rqos_map_level1_Msk (0xful << UMCTL2_PCFGQOS0_5_rqos_map_level1_Pos) /*!< UMCTL2_T::PCFGQOS0_5: rqos_map_level1 Mask */ + +#define UMCTL2_PCFGQOS0_5_rqos_map_region0_Pos (16) /*!< UMCTL2_T::PCFGQOS0_5: rqos_map_region0 Position */ +#define UMCTL2_PCFGQOS0_5_rqos_map_region0_Msk (0x3ul << UMCTL2_PCFGQOS0_5_rqos_map_region0_Pos) /*!< UMCTL2_T::PCFGQOS0_5: rqos_map_region0 Mask */ + +#define UMCTL2_PCFGQOS0_5_rqos_map_region1_Pos (20) /*!< UMCTL2_T::PCFGQOS0_5: rqos_map_region1 Position */ +#define UMCTL2_PCFGQOS0_5_rqos_map_region1_Msk (0x3ul << UMCTL2_PCFGQOS0_5_rqos_map_region1_Pos) /*!< UMCTL2_T::PCFGQOS0_5: rqos_map_region1 Mask */ + +#define UMCTL2_PCFGR_6_rd_port_priority_Pos (0) /*!< UMCTL2_T::PCFGR_6: rd_port_priority Position */ +#define UMCTL2_PCFGR_6_rd_port_priority_Msk (0x3fful << UMCTL2_PCFGR_6_rd_port_priority_Pos) /*!< UMCTL2_T::PCFGR_6: rd_port_priority Mask */ + +#define UMCTL2_PCFGR_6_rd_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGR_6: rd_port_aging_en Position */ +#define UMCTL2_PCFGR_6_rd_port_aging_en_Msk (0x1ul << UMCTL2_PCFGR_6_rd_port_aging_en_Pos) /*!< UMCTL2_T::PCFGR_6: rd_port_aging_en Mask */ + +#define UMCTL2_PCFGR_6_rd_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGR_6: rd_port_urgent_en Position*/ +#define UMCTL2_PCFGR_6_rd_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGR_6_rd_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGR_6: rd_port_urgent_en Mask */ + +#define UMCTL2_PCFGR_6_rd_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGR_6: rd_port_pagematch_en Position*/ +#define UMCTL2_PCFGR_6_rd_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGR_6_rd_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGR_6: rd_port_pagematch_en Mask */ + +#define UMCTL2_PCFGR_6_rdwr_ordered_en_Pos (16) /*!< UMCTL2_T::PCFGR_6: rdwr_ordered_en Position */ +#define UMCTL2_PCFGR_6_rdwr_ordered_en_Msk (0x1ul << UMCTL2_PCFGR_6_rdwr_ordered_en_Pos) /*!< UMCTL2_T::PCFGR_6: rdwr_ordered_en Mask */ + +#define UMCTL2_PCFGW_6_wr_port_priority_Pos (0) /*!< UMCTL2_T::PCFGW_6: wr_port_priority Position */ +#define UMCTL2_PCFGW_6_wr_port_priority_Msk (0x3fful << UMCTL2_PCFGW_6_wr_port_priority_Pos) /*!< UMCTL2_T::PCFGW_6: wr_port_priority Mask */ + +#define UMCTL2_PCFGW_6_wr_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGW_6: wr_port_aging_en Position */ +#define UMCTL2_PCFGW_6_wr_port_aging_en_Msk (0x1ul << UMCTL2_PCFGW_6_wr_port_aging_en_Pos) /*!< UMCTL2_T::PCFGW_6: wr_port_aging_en Mask */ + +#define UMCTL2_PCFGW_6_wr_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGW_6: wr_port_urgent_en Position*/ +#define UMCTL2_PCFGW_6_wr_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGW_6_wr_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGW_6: wr_port_urgent_en Mask */ + +#define UMCTL2_PCFGW_6_wr_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGW_6: wr_port_pagematch_en Position*/ +#define UMCTL2_PCFGW_6_wr_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGW_6_wr_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGW_6: wr_port_pagematch_en Mask */ + +#define UMCTL2_PCTRL_6_port_en_Pos (0) /*!< UMCTL2_T::PCTRL_6: port_en Position */ +#define UMCTL2_PCTRL_6_port_en_Msk (0x1ul << UMCTL2_PCTRL_6_port_en_Pos) /*!< UMCTL2_T::PCTRL_6: port_en Mask */ + +#define UMCTL2_PCFGQOS0_6_rqos_map_level1_Pos (0) /*!< UMCTL2_T::PCFGQOS0_6: rqos_map_level1 Position */ +#define UMCTL2_PCFGQOS0_6_rqos_map_level1_Msk (0xful << UMCTL2_PCFGQOS0_6_rqos_map_level1_Pos) /*!< UMCTL2_T::PCFGQOS0_6: rqos_map_level1 Mask */ + +#define UMCTL2_PCFGQOS0_6_rqos_map_region0_Pos (16) /*!< UMCTL2_T::PCFGQOS0_6: rqos_map_region0 Position */ +#define UMCTL2_PCFGQOS0_6_rqos_map_region0_Msk (0x3ul << UMCTL2_PCFGQOS0_6_rqos_map_region0_Pos) /*!< UMCTL2_T::PCFGQOS0_6: rqos_map_region0 Mask */ + +#define UMCTL2_PCFGQOS0_6_rqos_map_region1_Pos (20) /*!< UMCTL2_T::PCFGQOS0_6: rqos_map_region1 Position */ +#define UMCTL2_PCFGQOS0_6_rqos_map_region1_Msk (0x3ul << UMCTL2_PCFGQOS0_6_rqos_map_region1_Pos) /*!< UMCTL2_T::PCFGQOS0_6: rqos_map_region1 Mask */ + +#define UMCTL2_PCFGR_7_rd_port_priority_Pos (0) /*!< UMCTL2_T::PCFGR_7: rd_port_priority Position */ +#define UMCTL2_PCFGR_7_rd_port_priority_Msk (0x3fful << UMCTL2_PCFGR_7_rd_port_priority_Pos) /*!< UMCTL2_T::PCFGR_7: rd_port_priority Mask */ + +#define UMCTL2_PCFGR_7_rd_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGR_7: rd_port_aging_en Position */ +#define UMCTL2_PCFGR_7_rd_port_aging_en_Msk (0x1ul << UMCTL2_PCFGR_7_rd_port_aging_en_Pos) /*!< UMCTL2_T::PCFGR_7: rd_port_aging_en Mask */ + +#define UMCTL2_PCFGR_7_rd_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGR_7: rd_port_urgent_en Position*/ +#define UMCTL2_PCFGR_7_rd_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGR_7_rd_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGR_7: rd_port_urgent_en Mask */ + +#define UMCTL2_PCFGR_7_rd_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGR_7: rd_port_pagematch_en Position*/ +#define UMCTL2_PCFGR_7_rd_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGR_7_rd_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGR_7: rd_port_pagematch_en Mask */ + +#define UMCTL2_PCFGR_7_rdwr_ordered_en_Pos (16) /*!< UMCTL2_T::PCFGR_7: rdwr_ordered_en Position */ +#define UMCTL2_PCFGR_7_rdwr_ordered_en_Msk (0x1ul << UMCTL2_PCFGR_7_rdwr_ordered_en_Pos) /*!< UMCTL2_T::PCFGR_7: rdwr_ordered_en Mask */ + +#define UMCTL2_PCFGW_7_wr_port_priority_Pos (0) /*!< UMCTL2_T::PCFGW_7: wr_port_priority Position */ +#define UMCTL2_PCFGW_7_wr_port_priority_Msk (0x3fful << UMCTL2_PCFGW_7_wr_port_priority_Pos) /*!< UMCTL2_T::PCFGW_7: wr_port_priority Mask */ + +#define UMCTL2_PCFGW_7_wr_port_aging_en_Pos (12) /*!< UMCTL2_T::PCFGW_7: wr_port_aging_en Position */ +#define UMCTL2_PCFGW_7_wr_port_aging_en_Msk (0x1ul << UMCTL2_PCFGW_7_wr_port_aging_en_Pos) /*!< UMCTL2_T::PCFGW_7: wr_port_aging_en Mask */ + +#define UMCTL2_PCFGW_7_wr_port_urgent_en_Pos (13) /*!< UMCTL2_T::PCFGW_7: wr_port_urgent_en Position*/ +#define UMCTL2_PCFGW_7_wr_port_urgent_en_Msk (0x1ul << UMCTL2_PCFGW_7_wr_port_urgent_en_Pos) /*!< UMCTL2_T::PCFGW_7: wr_port_urgent_en Mask */ + +#define UMCTL2_PCFGW_7_wr_port_pagematch_en_Pos (14) /*!< UMCTL2_T::PCFGW_7: wr_port_pagematch_en Position*/ +#define UMCTL2_PCFGW_7_wr_port_pagematch_en_Msk (0x1ul << UMCTL2_PCFGW_7_wr_port_pagematch_en_Pos) /*!< UMCTL2_T::PCFGW_7: wr_port_pagematch_en Mask */ + +#define UMCTL2_PCTRL_7_port_en_Pos (0) /*!< UMCTL2_T::PCTRL_7: port_en Position */ +#define UMCTL2_PCTRL_7_port_en_Msk (0x1ul << UMCTL2_PCTRL_7_port_en_Pos) /*!< UMCTL2_T::PCTRL_7: port_en Mask */ + +#define UMCTL2_PCFGQOS0_7_rqos_map_level1_Pos (0) /*!< UMCTL2_T::PCFGQOS0_7: rqos_map_level1 Position */ +#define UMCTL2_PCFGQOS0_7_rqos_map_level1_Msk (0xful << UMCTL2_PCFGQOS0_7_rqos_map_level1_Pos) /*!< UMCTL2_T::PCFGQOS0_7: rqos_map_level1 Mask */ + +#define UMCTL2_PCFGQOS0_7_rqos_map_region0_Pos (16) /*!< UMCTL2_T::PCFGQOS0_7: rqos_map_region0 Position */ +#define UMCTL2_PCFGQOS0_7_rqos_map_region0_Msk (0x3ul << UMCTL2_PCFGQOS0_7_rqos_map_region0_Pos) /*!< UMCTL2_T::PCFGQOS0_7: rqos_map_region0 Mask */ + +#define UMCTL2_PCFGQOS0_7_rqos_map_region1_Pos (20) /*!< UMCTL2_T::PCFGQOS0_7: rqos_map_region1 Position */ +#define UMCTL2_PCFGQOS0_7_rqos_map_region1_Msk (0x3ul << UMCTL2_PCFGQOS0_7_rqos_map_region1_Pos) /*!< UMCTL2_T::PCFGQOS0_7: rqos_map_region1 Mask */ + +#define UMCTL2_SARBASE0_base_addr_Pos (0) /*!< UMCTL2_T::SARBASE0: base_addr Position */ +#define UMCTL2_SARBASE0_base_addr_Msk (0x3ul << UMCTL2_SARBASE0_base_addr_Pos) /*!< UMCTL2_T::SARBASE0: base_addr Mask */ + +#define UMCTL2_SARSIZE0_nblocks_Pos (0) /*!< UMCTL2_T::SARSIZE0: nblocks Position */ +#define UMCTL2_SARSIZE0_nblocks_Msk (0xfful << UMCTL2_SARSIZE0_nblocks_Pos) /*!< UMCTL2_T::SARSIZE0: nblocks Mask */ + +#define UMCTL2_VER_NUMBER_ver_number_Pos (0) /*!< UMCTL2_T::VER_NUMBER: ver_number Position*/ +#define UMCTL2_VER_NUMBER_ver_number_Msk (0xfffffffful << UMCTL2_VER_NUMBER_ver_number_Pos) /*!< UMCTL2_T::VER_NUMBER: ver_number Mask */ + +#define UMCTL2_VER_TYPE_ver_type_Pos (0) /*!< UMCTL2_T::VER_TYPE: ver_type Position */ +#define UMCTL2_VER_TYPE_ver_type_Msk (0xfffffffful << UMCTL2_VER_TYPE_ver_type_Pos) /*!< UMCTL2_T::VER_TYPE: ver_type Mask */ + +/**@}*/ /* UMCTL2_CONST */ +/**@}*/ /* end of UMCTL2 register group */ + + +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __UMCTL2_REG_H__ */ + + diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/usbh_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/usbh_reg.h new file mode 100644 index 0000000000..368cdc2fb1 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/usbh_reg.h @@ -0,0 +1,796 @@ +/**************************************************************************//** + * @file usbh_reg.h + * @brief USBH register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __USBH_REG_H__ +#define __USBH_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup USBH USB Host Controller(USBH) + Memory Mapped Structure for USBH Controller +@{ */ + +typedef struct +{ + + + /** + * @var USBH_T::HcRevision + * Offset: 0x00 Host Controller Revision Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |REV |Revision Number + * | | |Indicates the Open HCI Specification revision number implemented by the Hardware + * | | |Host Controller supports 1.1 specification. + * | | |(X.Y = XYh). + * @var USBH_T::HcControl + * Offset: 0x04 Host Controller Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |CBSR |Control Bulk Service Ratio + * | | |This specifies the service ratio between Control and Bulk EDs + * | | |Before processing any of the non-periodic lists, HC must compare the ratio specified with its internal count on how many nonempty Control EDs have been processed, in determining whether to continue serving another Control ED or switching to Bulk EDs + * | | |The internal count will be retained when crossing the frame boundary + * | | |In case of reset, HCD is responsible for restoring this value. + * | | |00 = Number of Control EDs over Bulk EDs served is 1:1. + * | | |01 = Number of Control EDs over Bulk EDs served is 2:1. + * | | |10 = Number of Control EDs over Bulk EDs served is 3:1. + * | | |11 = Number of Control EDs over Bulk EDs served is 4:1. + * |[2] |PLE |Periodic List Enable Bit + * | | |When set, this bit enables processing of the Periodic (interrupt and isochronous) list + * | | |The Host Controller checks this bit prior to attempting any periodic transfers in a frame. + * | | |0 = Processing of the Periodic (Interrupt and Isochronous) list after next SOF (Start-Of-Frame) Disabled. + * | | |1 = Processing of the Periodic (Interrupt and Isochronous) list in the next frame Enabled. + * | | |Note: To enable the processing of the Isochronous list, user has to set both PLE and IE (HcControl[3]) high. + * |[3] |IE |Isochronous List Enable Bit + * | | |Both ISOEn and PLE (HcControl[2]) high enables Host Controller to process the Isochronous list + * | | |Either ISOEn or PLE (HcControl[2]) is low disables Host Controller to process the Isochronous list. + * | | |0 = Processing of the Isochronous list after next SOF (Start-Of-Frame) Disabled. + * | | |1 = Processing of the Isochronous list in the next frame Enabled, if the PLE (HcControl[2]) is high, too. + * |[4] |CLE |Control List Enable Bit + * | | |0 = Processing of the Control list after next SOF (Start-Of-Frame) Disabled. + * | | |1 = Processing of the Control list in the next frame Enabled. + * |[5] |BLE |Bulk List Enable Bit + * | | |0 = Processing of the Bulk list after next SOF (Start-Of-Frame) Disabled. + * | | |1 = Processing of the Bulk list in the next frame Enabled. + * |[7:6] |HCFS |Host Controller Functional State + * | | |This field sets the Host Controller state + * | | |The Controller may force a state change from USBSUSPEND to USBRESUME after detecting resume signaling from a downstream port + * | | |States are: + * | | |00 = USBSUSPEND. + * | | |01 = USBOPERATIONAL. + * | | |10 = USBRESUME. + * | | |11 = USBRESET. + * @var USBH_T::HcCommandStatus + * Offset: 0x08 Host Controller Command Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |HCR |Host Controller Reset + * | | |This bit is set to initiate the software reset of Host Controller + * | | |This bit is cleared by the Host Controller, upon completed of the reset operation. + * | | |This bit, when set, didn't reset the Root Hub and no subsequent reset signaling be asserted to its downstream ports. + * | | |0 = Host Controller is not in software reset state. + * | | |1 = Host Controller is in software reset state. + * |[1] |CLF |Control List Filled + * | | |Set high to indicate there is an active TD on the Control List + * | | |It may be set by either software or the Host Controller and cleared by the Host Controller each time it begins processing the head of the Control List. + * | | |0 = No active TD found or Host Controller begins to process the head of the Control list. + * | | |1 = An active TD added or found on the Control list. + * |[2] |BLF |Bulk List Filled + * | | |Set high to indicate there is an active TD on the Bulk list + * | | |This bit may be set by either software or the Host Controller and cleared by the Host Controller each time it begins processing the head of the Bulk list. + * | | |0 = No active TD found or Host Controller begins to process the head of the Bulk list. + * | | |1 = An active TD added or found on the Bulk list. + * |[17:16] |SOC |Schedule Overrun Count (Read Only) + * | | |These bits are incremented on each scheduling overrun error + * | | |It is initialized to 00b and wraps around at 11b + * | | |This will be incremented when a scheduling overrun is detected even if SO (HcInterruptStatus[0]) has already been set. + * @var USBH_T::HcInterruptStatus + * Offset: 0x0C Host Controller Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SO |Scheduling Overrun + * | | |Set when the List Processor determines a Schedule Overrun has occurred. + * | | |0 = Schedule Overrun didn't occur. + * | | |1 = Schedule Overrun has occurred. + * | | |Note: This bit is cleared by writing 1 to it. + * |[1] |WDH |Write Back Done Head + * | | |Set after the Host Controller has written HcDoneHead to HccaDoneHead + * | | |Further updates of the HccaDoneHead will not occur until this bit has been cleared. + * | | |0 = Host Controller didn't update HccaDoneHead. + * | | |1 = Host Controller has written HcDoneHead to HccaDoneHead. + * | | |Note: This bit is cleared by writing 1 to it. + * |[2] |SF |Start of Frame + * | | |Set when the Frame Management functional block signals a 'Start of Frame' event + * | | |Host Control generates a SOF token at the same time. + * | | |0 = Not the start of a frame. + * | | |1 = Indicate the start of a frame and Host Controller generates a SOF token. + * | | |Note: This bit is cleared by writing 1 to it. + * |[3] |RD |Resume Detected + * | | |Set when Host Controller detects resume signaling on a downstream port. + * | | |0 = No resume signaling detected on a downstream port. + * | | |1 = Resume signaling detected on a downstream port. + * | | |Note: This bit is cleared by writing 1 to it. + * |[5] |FNO |Frame Number Overflow + * | | |This bit is set when bit 15 of Frame Number changes from 1 to 0 or from 0 to 1. + * | | |0 = The bit 15 of Frame Number didn't change. + * | | |1 = The bit 15 of Frame Number changes from 1 to 0 or from 0 to 1. + * | | |Note: This bit is cleared by writing 1 to it. + * |[6] |RHSC |Root Hub Status Change + * | | |This bit is set when the content of HcRhStatus or the content of HcRhPortStatus register has changed. + * | | |0 = The content of HcRhStatus and the content of HcRhPortStatus register didn't change. + * | | |1 = The content of HcRhStatus or the content of HcRhPortStatus register has changed. + * | | |Note: This bit is cleared by writing h'1f to HcRhPortStatus6[20:16]. + * @var USBH_T::HcInterruptEnable + * Offset: 0x10 Host Controller Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SO |Scheduling Overrun Enable Bit + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to SO (HcInterruptStatus[0]) Enabled. + * | | |Read Operation: + * | | |0 = Interrupt generation due to SO (HcInterruptStatus[0]) Disabled. + * | | |1 = Interrupt generation due to SO (HcInterruptStatus[0]) Enabled. + * |[1] |WDH |Write Back Done Head Enable Bit + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to WDH (HcInterruptStatus[1]) Enabled. + * | | |Read Operation: + * | | |0 = Interrupt generation due to WDH (HcInterruptStatus[1]) Disabled. + * | | |1 = Interrupt generation due to WDH (HcInterruptStatus[1]) Enabled. + * |[2] |SF |Start of Frame Enable Bit + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to SF (HcInterruptStatus[2]) Enabled. + * | | |Read Operation: + * | | |0 = Interrupt generation due to SF (HcInterruptStatus[2]) Disabled. + * | | |1 = Interrupt generation due to SF (HcInterruptStatus[2]) Enabled. + * |[3] |RD |Resume Detected Enable Bit + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to RD (HcInterruptStatus[3]) Enabled. + * | | |Read Operation: + * | | |0 = Interrupt generation due to RD (HcInterruptStatus[3]) Disabled. + * | | |1 = Interrupt generation due to RD (HcInterruptStatus[3]) Enabled. + * |[5] |FNO |Frame Number Overflow Enable Bit + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to FNO (HcInterruptStatus[5]) Enabled. + * | | |Read Operation: + * | | |0 = Interrupt generation due to FNO (HcInterruptStatus[5]) Disabled. + * | | |1 = Interrupt generation due to FNO (HcInterruptStatus[5]) Enabled. + * |[6] |RHSC |Root Hub Status Change Enable Bit + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to RHSC (HcInterruptStatus[6]) Enabled. + * | | |Read Operation: + * | | |0 = Interrupt generation due to RHSC (HcInterruptStatus[6]) Disabled. + * | | |1 = Interrupt generation due to RHSC (HcInterruptStatus[6]) Enabled. + * |[31] |MIE |Master Interrupt Enable Bit + * | | |This bit is a global interrupt enable + * | | |A write of '1' allows interrupts to be enabled via the specific enable bits listed above. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to RHSC (HcInterruptStatus[6]), FNO (HcInterruptStatus[5]), RD (HcInterruptStatus[3]), SF (HcInterruptStatus[2]), WDH (HcInterruptStatus[1]) or SO (HcInterruptStatus[0]) Enabled if the corresponding bit in HcInterruptEnable is high. + * | | |Read Operation: + * | | |0 = Interrupt generation due to RHSC (HcInterruptStatus[6]), FNO (HcInterruptStatus[5]), RD (HcInterruptStatus[3]), SF (HcInterruptStatus[2]), WDH (HcInterruptStatus[1]) or SO (HcInterruptStatus[0]) Disabled even if the corresponding bit in HcInterruptEnable is high. + * | | |1 = Interrupt generation due to RHSC (HcInterruptStatus[6]), FNO (HcInterruptStatus[5]), RD (HcInterruptStatus[3]), SF (HcInterruptStatus[2]), WDH (HcInterruptStatus[1]) or SO (HcInterruptStatus[0]) Enabled if the corresponding bit in HcInterruptEnable is high. + * @var USBH_T::HcInterruptDisable + * Offset: 0x14 Host Controller Interrupt Disable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |SO |Scheduling Overrun Disable Bit + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to SO (HcInterruptStatus[0]) Disabled. + * | | |Read Operation: + * | | |0 = Interrupt generation due to SO (HcInterruptStatus[0]) Disabled. + * | | |1 = Interrupt generation due to SO (HcInterruptStatus[0]) Enabled. + * |[1] |WDH |Write Back Done Head Disable Bit + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to WDH (HcInterruptStatus[1]) Disabled. + * | | |Read Operation: + * | | |0 = Interrupt generation due to WDH (HcInterruptStatus[1]) Disabled. + * | | |1 = Interrupt generation due to WDH (HcInterruptStatus[1]) Enabled. + * |[2] |SF |Start of Frame Disable Bit + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to SF (HcInterruptStatus[2]) Disabled. + * | | |Read Operation: + * | | |0 = Interrupt generation due to SF (HcInterruptStatus[2]) Disabled. + * | | |1 = Interrupt generation due to SF (HcInterruptStatus[2]) Enabled. + * |[3] |RD |Resume Detected Disable Bit + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to RD (HcInterruptStatus[3]) Disabled. + * | | |Read Operation: + * | | |0 = Interrupt generation due to RD (HcInterruptStatus[3]) Disabled. + * | | |1 = Interrupt generation due to RD (HcInterruptStatus[3]) Enabled. + * |[5] |FNO |Frame Number Overflow Disable Bit + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to FNO (HcInterruptStatus[5]) Disabled. + * | | |Read Operation: + * | | |0 = Interrupt generation due to FNO (HcInterruptStatus[5]) Disabled. + * | | |1 = Interrupt generation due to FNO (HcInterruptStatus[5]) Enabled. + * |[6] |RHSC |Root Hub Status Change Disable Bit + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to RHSC (HcInterruptStatus[6]) Disabled. + * | | |Read Operation: + * | | |0 = Interrupt generation due to RHSC (HcInterruptStatus[6]) Disabled. + * | | |1 = Interrupt generation due to RHSC (HcInterruptStatus[6]) Enabled. + * |[31] |MIE |Master Interrupt Disable Bit + * | | |Global interrupt disable. Writing '1' to disable all interrupts. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Interrupt generation due to RHSC (HcInterruptStatus[6]), FNO (HcInterruptStatus[5]), RD (HcInterruptStatus[3]), SF (HcInterruptStatus[2]), WDH (HcInterruptStatus[1]) or SO (HcInterruptStatus[0]) Disabled if the corresponding bit in HcInterruptEnable is high. + * | | |Read Operation: + * | | |0 = Interrupt generation due to RHSC (HcInterruptStatus[6]), FNO (HcInterruptStatus[5]), RD (HcInterruptStatus[3]), SF (HcInterruptStatus[2]), WDH (HcInterruptStatus[1]) or SO (HcInterruptStatus[0]) Disabled even if the corresponding bit in HcInterruptEnable is high. + * | | |1 = Interrupt generation due to RHSC (HcInterruptStatus[6]), FNO (HcInterruptStatus[5]), RD (HcInterruptStatus[3]), SF (HcInterruptStatus[2]), WDH (HcInterruptStatus[1]) or SO (HcInterruptStatus[0]) Enabled if the corresponding bit in HcInterruptEnable is high. + * @var USBH_T::HcHCCA + * Offset: 0x18 Host Controller Communication Area Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:8] |HCCA |Host Controller Communication Area + * | | |Pointer to indicate base address of the Host Controller Communication Area (HCCA). + * @var USBH_T::HcPeriodCurrentED + * Offset: 0x1C Host Controller Period Current ED Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:4] |PCED |Periodic Current ED + * | | |Pointer to indicate physical address of the current Isochronous or Interrupt Endpoint Descriptor. + * @var USBH_T::HcControlHeadED + * Offset: 0x20 Host Controller Control Head ED Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:4] |CHED |Control Head ED + * | | |Pointer to indicate physical address of the first Endpoint Descriptor of the Control list. + * @var USBH_T::HcControlCurrentED + * Offset: 0x24 Host Controller Control Current ED Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:4] |CCED |Control Current Head ED + * | | |Pointer to indicate the physical address of the current Endpoint Descriptor of the Control list. + * @var USBH_T::HcBulkHeadED + * Offset: 0x28 Host Controller Bulk Head ED Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:4] |BHED |Bulk Head ED + * | | |Pointer to indicate the physical address of the first Endpoint Descriptor of the Bulk list. + * @var USBH_T::HcBulkCurrentED + * Offset: 0x2C Host Controller Bulk Current ED Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:4] |BCED |Bulk Current Head ED + * | | |Pointer to indicate the physical address of the current endpoint of the Bulk list. + * @var USBH_T::HcDoneHead + * Offset: 0x30 Host Controller Done Head Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:4] |DH |Done Head + * | | |Pointer to indicate the physical address of the last completed Transfer Descriptor that was added to the Done queue. + * @var USBH_T::HcFmInterval + * Offset: 0x34 Host Controller Frame Interval Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[13:0] |FI |Frame Interval + * | | |This field specifies the length of a frame as (bit times - 1) + * | | |For 12,000 bit times in a frame, a value of 11,999 is stored here. + * |[29:16] |FSMPS |FS Largest Data Packet + * | | |This field specifies a value that is loaded into the Largest Data Packet Counter at the beginning of each frame. + * |[31] |FIT |Frame Interval Toggle + * | | |This bit is toggled by Host Controller Driver when it loads a new value into FI (HcFmInterval[13:0]). + * | | |0 = Host Controller Driver didn't load new value into FI (HcFmInterval[13:0]). + * | | |1 = Host Controller Driver loads a new value into FI (HcFmInterval[13:0]). + * @var USBH_T::HcFmRemaining + * Offset: 0x38 Host Controller Frame Remaining Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[13:0] |FR |Frame Remaining + * | | |When the Host Controller is in the USBOPERATIONAL state, this 14-bit field decrements each 12 MHz clock period + * | | |When the count reaches 0, (end of frame) the counter reloads with Frame Interval + * | | |In addition, the counter loads when the Host Controller transitions into USBOPERATIONAL. + * |[31] |FRT |Frame Remaining Toggle + * | | |This bit is loaded from the FIT (HcFmInterval[31]) whenever FR (HcFmRemaining[13:0]) reaches 0. + * @var USBH_T::HcFmNumber + * Offset: 0x3C Host Controller Frame Number Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[15:0] |FN |Frame Number + * | | |This 16-bit incrementing counter field is incremented coincident with the re-load of FR (HcFmRemaining[13:0]) + * | | |The count rolls over from 'FFFFh' to '0h.' + * @var USBH_T::HcPeriodicStart + * Offset: 0x40 Host Controller Periodic Start Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[13:0] |PS |Periodic Start + * | | |This field contains a value used by the List Processor to determine where in a frame the Periodic List processing must begin. + * @var USBH_T::HcLSThreshold + * Offset: 0x44 Host Controller Low-speed Threshold Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[11:0] |LST |Low-speed Threshold + * | | |This field contains a value which is compared to the FR (HcFmRemaining[13:0]) field prior to initiating a Low-speed transaction + * | | |The transaction is started only if FR (HcFmRemaining[13:0]) >= this field + * | | |The value is calculated by Host Controller Driver with the consideration of transmission and setup overhead. + * @var USBH_T::HcRhDescriptorA + * Offset: 0x48 Host Controller Root Hub Descriptor A Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[7:0] |NDP |Number Downstream Ports + * | | |USB host control supports two downstream ports and only one port is available in this series of chip. + * | | |Note: NDP = 6 in this series of chip. + * |[8] |PSM |Power Switching Mode + * | | |This bit is used to specify how the power switching of the Root Hub ports is controlled. + * | | |0 = Global switching. + * | | |1 = Individual switching. + * |[11] |OCPM |Overcurrent Protection Mode + * | | |This bit describes how the overcurrent status for the Root Hub ports reported + * | | |This bit is only valid when NOCP (HcRhDescriptorA[12]) is cleared. + * | | |0 = Global overcurrent. + * | | |1 = Individual overcurrent. + * |[12] |NOCP |No overcurrent Protection + * | | |This bit describes how the overcurrent status for the Root Hub ports reported. + * | | |0 = Overcurrent status is reported. + * | | |1 = Overcurrent status is not reported. + * @var USBH_T::HcRhDescriptorB + * Offset: 0x4C Host Controller Root Hub Descriptor B Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:16] |PPCM |Port Power Control Mask + * | | |Global power switching + * | | |This field is only valid if PowerSwitchingMode is set (individual port switching) + * | | |When set, the port only responds to individual port power switching commands (Set/Clear Port Power) + * | | |When cleared, the port only responds to global power switching commands (Set/Clear Global Power). + * | | |0 = Port power controlled by global power switching. + * | | |1 = Port power controlled by port power switching. + * | | |Note: PPCM[15:2] and PPCM[0] are reserved. + * @var USBH_T::HcRhStatus + * Offset: 0x50 Host Controller Root Hub Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |LPS |Clear Global Power + * | | |In global power mode (PSM (HcRhDescriptorA[8]) = 0), this bit is written to one to clear all ports' power. + * | | |This bit always read as zero. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Clear global power. + * |[1] |OCI |Overcurrent Indicator (Read Only) + * | | |This bit reflects the state of the overcurrent status pin + * | | |This field is only valid if NOCP (HcRhDescriptorA[12]) and OCPM (HcRhDescriptorA[11]) are cleared. + * | | |0 = No overcurrent condition. + * | | |1 = Overcurrent condition. + * |[15] |DRWE |Device Remote Wakeup Enable Bit + * | | |This bit controls if port's Connect Status Change as a remote wake-up event. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Connect Status Change as a remote wake-up event Enabled. + * | | |Read Operation: + * | | |0 = Connect Status Change as a remote wake-up event Disabled. + * | | |1 = Connect Status Change as a remote wake-up event Enabled. + * |[16] |LPSC |Set Global Power + * | | |In global power mode (PSM (HcRhDescriptorA[8]) = 0), this bit is written to one to enable power to all ports. + * | | |This bit always read as zero. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Set global power. + * |[17] |OCIC |Overcurrent Indicator Change + * | | |This bit is set by hardware when a change has occurred in OCI (HcRhStatus[1]). + * | | |Write 1 to clear this bit to zero. + * | | |0 = OCI (HcRhStatus[1]) didn't change. + * | | |1 = OCI (HcRhStatus[1]) change. + * |[31] |CRWE |Clear Remote Wake-up Enable Bit + * | | |This bit is use to clear DRWE (HcRhStatus[15]). + * | | |This bit always read as zero. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Clear DRWE (HcRhStatus[15]). + * @var USBH_T::HcRhPortStatus + * Offset: 0x54 Host Controller Root Hub Port Status + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CCS |Current Connect Status or Clear Port Enable + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Clear port enable. + * | | |Read Operation: + * | | |0 = No device connected. + * | | |1 = Device connected. + * |[1] |PES |Port Enable Status or Set Port Enable + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Set port enable. + * | | |Read Operation: + * | | |0 = Port Disabled. + * | | |1 = Port Enabled. + * |[2] |PSS |Port Suspend Status or Set Port Suspend + * | | |This bit indicates the port is suspended + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Set port suspend. + * | | |Read Operation: + * | | |0 = Port is not suspended. + * | | |1 = Port is selectively suspended. + * |[3] |POCI |Port overcurrent Indicator or Clear Port Suspend + * | | |This bit reflects the state of the overcurrent status pin dedicated to this port + * | | |This field is only valid if NOCP (HcRhDescriptorA[12]) is cleared and OCPM (HcRhDescriptorA[11]) is set. + * | | |This bit is also used to initiate the selective result sequence for the port. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Clear port suspend. + * | | |Read Operation: + * | | |0 = No overcurrent condition. + * | | |1 = Overcurrent condition. + * |[4] |PRS |Port Reset Status or Set Port Reset + * | | |This bit reflects the reset state of the port. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Set port reset. + * | | |Read Operation + * | | |0 = Port reset signal is not active. + * | | |1 = Port reset signal is active. + * |[8] |PPS |Port Power Status or Set Port Power + * | | |This bit reflects the power state of the port regardless of the power switching mode. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Port Power Enabled. + * | | |Read Operation: + * | | |0 = Port power is Disabled. + * | | |1 = Port power is Enabled. + * |[9] |LSDA |Low Speed Device Attached or Clear Port Power + * | | |This bit defines the speed (and bus idle) of the attached device + * | | |It is only valid when CCS (HcRhPortStatus[0]) is set. + * | | |This bit is also used to clear port power. + * | | |Write Operation: + * | | |0 = No effect. + * | | |1 = Clear PPS (HcRhPortStatus[8]). + * | | |Read Operation: + * | | |0 = Full Speed device. + * | | |1 = Low-speed device. + * |[16] |CSC |Connect Status Change + * | | |This bit indicates connect or disconnect event has been detected (CCS (HcRhPortStatus[0]) changed). + * | | |Write 1 to clear this bit to zero. + * | | |0 = No connect/disconnect event (CCS (HcRhPortStatus[0]) didn't change). + * | | |1 = Hardware detection of connect/disconnect event (CCS (HcRhPortStatus[0]) changed). + * |[17] |PESC |Port Enable Status Change + * | | |This bit indicates that the port has been disabled (PES (HcRhPortStatus6[1]) cleared) due to a hardware event. + * | | |Write 1 to clear this bit to zero. + * | | |0 = PES (HcRhPortStatus[1]) didn't change. + * | | |1 = PES (HcRhPortStatus[1]) changed. + * |[18] |PSSC |Port Suspend Status Change + * | | |This bit indicates the completion of the selective resume sequence for the port. + * | | |Write 1 to clear this bit to zero. + * | | |0 = Port resume is not completed. + * | | |1 = Port resume completed. + * |[19] |OCIC |Port overcurrent Indicator Change + * | | |This bit is set when POCI (HcRhPortStatus[3]) changes. + * | | |Write 1 to clear this bit to zero. + * | | |0 = POCI (HcRhPortStatus[3]) didn't change. + * | | |1 = POCI (HcRhPortStatus[3]) changes. + * |[20] |PRSC |Port Reset Status Change + * | | |This bit indicates that the port reset signal has completed. + * | | |Write 1 to clear this bit to zero. + * | | |0 = Port reset is not complete. + * | | |1 = Port reset is complete. + * @var USBH_T::HcPhyControl + * Offset: 0x200 Host Controller PHY Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |ABORT |AHB Bus ERROR Response + * | | |This bit indicates there is an ERROR response received in AHB bus. + * | | |0 = No ERROR response received. + * | | |1 = ERROR response received. + * | | |Note: This bit is cleared by writing 1 to it. + * |[3] |OCAL |Overcurrent Active Low + * | | |This bit controls the polarity of overcurrent flag from external power IC. + * | | |0 = Overcurrent flag is high active. + * | | |1 = Overcurrent flag is low active. + * |[4] |PPCAL |Port Power Control Active Low + * | | |This bit controls the polarity of port power control to external power IC. + * | | |0 = Port power control is high active. + * | | |1 = Port power control is low active. + * |[16] |DPRT1 |Disable Port 1 + * | | |This bit controls if the connection between USB host controller and transceiver of port 1 is disabled + * | | |If the connection is disabled, the USB host controller will not recognize any event of USB bus. + * | | |Set this bit high, the transceiver of port 1 will also be forced into the standby mode no matter what USB host controller operation is. + * | | |0 = The connection between USB host controller and transceiver of port 1 Enabled. + * | | |1 = The connection between USB host controller and transceiver of port 1 Disabled and the transceiver of port 1 will also be forced into the standby mode. + */ + __I uint32_t HcRevision; /*!< [0x0000] Host Controller Revision Register */ + __IO uint32_t HcControl; /*!< [0x0004] Host Controller Control Register */ + __IO uint32_t HcCommandStatus; /*!< [0x0008] Host Controller Command Status Register */ + __IO uint32_t HcInterruptStatus; /*!< [0x000c] Host Controller Interrupt Status Register */ + __IO uint32_t HcInterruptEnable; /*!< [0x0010] Host Controller Interrupt Enable Register */ + __IO uint32_t HcInterruptDisable; /*!< [0x0014] Host Controller Interrupt Disable Register */ + __IO uint32_t HcHCCA; /*!< [0x0018] Host Controller Communication Area Register */ + __IO uint32_t HcPeriodCurrentED; /*!< [0x001c] Host Controller Period Current ED Register */ + __IO uint32_t HcControlHeadED; /*!< [0x0020] Host Controller Control Head ED Register */ + __IO uint32_t HcControlCurrentED; /*!< [0x0024] Host Controller Control Current ED Register */ + __IO uint32_t HcBulkHeadED; /*!< [0x0028] Host Controller Bulk Head ED Register */ + __IO uint32_t HcBulkCurrentED; /*!< [0x002c] Host Controller Bulk Current ED Register */ + __IO uint32_t HcDoneHead; /*!< [0x0030] Host Controller Done Head Register */ + __IO uint32_t HcFmInterval; /*!< [0x0034] Host Controller Frame Interval Register */ + __I uint32_t HcFmRemaining; /*!< [0x0038] Host Controller Frame Remaining Register */ + __I uint32_t HcFmNumber; /*!< [0x003c] Host Controller Frame Number Register */ + __IO uint32_t HcPeriodicStart; /*!< [0x0040] Host Controller Periodic Start Register */ + __IO uint32_t HcLSThreshold; /*!< [0x0044] Host Controller Low-speed Threshold Register */ + __IO uint32_t HcRhDescriptorA; /*!< [0x0048] Host Controller Root Hub Descriptor A Register */ + __IO uint32_t HcRhDescriptorB; /*!< [0x004c] Host Controller Root Hub Descriptor B Register */ + __IO uint32_t HcRhStatus; /*!< [0x0050] Host Controller Root Hub Status Register */ + __IO uint32_t HcRhPortStatus[1]; /*!< [0x0054] Host Controller Root Hub Port Status */ + __I uint32_t RESERVE0[106]; + __IO uint32_t HcPhyControl; /*!< [0x0200] Host Controller PHY Control Register */ + +} USBH_T; + +/** + @addtogroup USBH_CONST USBH Bit Field Definition + Constant Definitions for USBH Controller +@{ */ + +#define USBH_HcRevision_REV_Pos (0) /*!< USBH_T::HcRevision: REV Position */ +#define USBH_HcRevision_REV_Msk (0xfful << USBH_HcRevision_REV_Pos) /*!< USBH_T::HcRevision: REV Mask */ + +#define USBH_HcControl_CBSR_Pos (0) /*!< USBH_T::HcControl: CBSR Position */ +#define USBH_HcControl_CBSR_Msk (0x3ul << USBH_HcControl_CBSR_Pos) /*!< USBH_T::HcControl: CBSR Mask */ + +#define USBH_HcControl_PLE_Pos (2) /*!< USBH_T::HcControl: PLE Position */ +#define USBH_HcControl_PLE_Msk (0x1ul << USBH_HcControl_PLE_Pos) /*!< USBH_T::HcControl: PLE Mask */ + +#define USBH_HcControl_IE_Pos (3) /*!< USBH_T::HcControl: IE Position */ +#define USBH_HcControl_IE_Msk (0x1ul << USBH_HcControl_IE_Pos) /*!< USBH_T::HcControl: IE Mask */ + +#define USBH_HcControl_CLE_Pos (4) /*!< USBH_T::HcControl: CLE Position */ +#define USBH_HcControl_CLE_Msk (0x1ul << USBH_HcControl_CLE_Pos) /*!< USBH_T::HcControl: CLE Mask */ + +#define USBH_HcControl_BLE_Pos (5) /*!< USBH_T::HcControl: BLE Position */ +#define USBH_HcControl_BLE_Msk (0x1ul << USBH_HcControl_BLE_Pos) /*!< USBH_T::HcControl: BLE Mask */ + +#define USBH_HcControl_HCFS_Pos (6) /*!< USBH_T::HcControl: HCFS Position */ +#define USBH_HcControl_HCFS_Msk (0x3ul << USBH_HcControl_HCFS_Pos) /*!< USBH_T::HcControl: HCFS Mask */ + +#define USBH_HcCommandStatus_HCR_Pos (0) /*!< USBH_T::HcCommandStatus: HCR Position*/ +#define USBH_HcCommandStatus_HCR_Msk (0x1ul << USBH_HcCommandStatus_HCR_Pos) /*!< USBH_T::HcCommandStatus: HCR Mask */ + +#define USBH_HcCommandStatus_CLF_Pos (1) /*!< USBH_T::HcCommandStatus: CLF Position*/ +#define USBH_HcCommandStatus_CLF_Msk (0x1ul << USBH_HcCommandStatus_CLF_Pos) /*!< USBH_T::HcCommandStatus: CLF Mask */ + +#define USBH_HcCommandStatus_BLF_Pos (2) /*!< USBH_T::HcCommandStatus: BLF Position*/ +#define USBH_HcCommandStatus_BLF_Msk (0x1ul << USBH_HcCommandStatus_BLF_Pos) /*!< USBH_T::HcCommandStatus: BLF Mask */ + +#define USBH_HcCommandStatus_SOC_Pos (16) /*!< USBH_T::HcCommandStatus: SOC Position*/ +#define USBH_HcCommandStatus_SOC_Msk (0x3ul << USBH_HcCommandStatus_SOC_Pos) /*!< USBH_T::HcCommandStatus: SOC Mask */ + +#define USBH_HcInterruptStatus_SO_Pos (0) /*!< USBH_T::HcInterruptStatus: SO Position*/ +#define USBH_HcInterruptStatus_SO_Msk (0x1ul << USBH_HcInterruptStatus_SO_Pos) /*!< USBH_T::HcInterruptStatus: SO Mask */ + +#define USBH_HcInterruptStatus_WDH_Pos (1) /*!< USBH_T::HcInterruptStatus: WDH Position*/ +#define USBH_HcInterruptStatus_WDH_Msk (0x1ul << USBH_HcInterruptStatus_WDH_Pos) /*!< USBH_T::HcInterruptStatus: WDH Mask */ + +#define USBH_HcInterruptStatus_SF_Pos (2) /*!< USBH_T::HcInterruptStatus: SF Position*/ +#define USBH_HcInterruptStatus_SF_Msk (0x1ul << USBH_HcInterruptStatus_SF_Pos) /*!< USBH_T::HcInterruptStatus: SF Mask */ + +#define USBH_HcInterruptStatus_RD_Pos (3) /*!< USBH_T::HcInterruptStatus: RD Position*/ +#define USBH_HcInterruptStatus_RD_Msk (0x1ul << USBH_HcInterruptStatus_RD_Pos) /*!< USBH_T::HcInterruptStatus: RD Mask */ + +#define USBH_HcInterruptStatus_FNO_Pos (5) /*!< USBH_T::HcInterruptStatus: FNO Position*/ +#define USBH_HcInterruptStatus_FNO_Msk (0x1ul << USBH_HcInterruptStatus_FNO_Pos) /*!< USBH_T::HcInterruptStatus: FNO Mask */ + +#define USBH_HcInterruptStatus_RHSC_Pos (6) /*!< USBH_T::HcInterruptStatus: RHSC Position*/ +#define USBH_HcInterruptStatus_RHSC_Msk (0x1ul << USBH_HcInterruptStatus_RHSC_Pos) /*!< USBH_T::HcInterruptStatus: RHSC Mask */ + +#define USBH_HcInterruptEnable_SO_Pos (0) /*!< USBH_T::HcInterruptEnable: SO Position*/ +#define USBH_HcInterruptEnable_SO_Msk (0x1ul << USBH_HcInterruptEnable_SO_Pos) /*!< USBH_T::HcInterruptEnable: SO Mask */ + +#define USBH_HcInterruptEnable_WDH_Pos (1) /*!< USBH_T::HcInterruptEnable: WDH Position*/ +#define USBH_HcInterruptEnable_WDH_Msk (0x1ul << USBH_HcInterruptEnable_WDH_Pos) /*!< USBH_T::HcInterruptEnable: WDH Mask */ + +#define USBH_HcInterruptEnable_SF_Pos (2) /*!< USBH_T::HcInterruptEnable: SF Position*/ +#define USBH_HcInterruptEnable_SF_Msk (0x1ul << USBH_HcInterruptEnable_SF_Pos) /*!< USBH_T::HcInterruptEnable: SF Mask */ + +#define USBH_HcInterruptEnable_RD_Pos (3) /*!< USBH_T::HcInterruptEnable: RD Position*/ +#define USBH_HcInterruptEnable_RD_Msk (0x1ul << USBH_HcInterruptEnable_RD_Pos) /*!< USBH_T::HcInterruptEnable: RD Mask */ + +#define USBH_HcInterruptEnable_FNO_Pos (5) /*!< USBH_T::HcInterruptEnable: FNO Position*/ +#define USBH_HcInterruptEnable_FNO_Msk (0x1ul << USBH_HcInterruptEnable_FNO_Pos) /*!< USBH_T::HcInterruptEnable: FNO Mask */ + +#define USBH_HcInterruptEnable_RHSC_Pos (6) /*!< USBH_T::HcInterruptEnable: RHSC Position*/ +#define USBH_HcInterruptEnable_RHSC_Msk (0x1ul << USBH_HcInterruptEnable_RHSC_Pos) /*!< USBH_T::HcInterruptEnable: RHSC Mask */ + +#define USBH_HcInterruptEnable_MIE_Pos (31) /*!< USBH_T::HcInterruptEnable: MIE Position*/ +#define USBH_HcInterruptEnable_MIE_Msk (0x1ul << USBH_HcInterruptEnable_MIE_Pos) /*!< USBH_T::HcInterruptEnable: MIE Mask */ + +#define USBH_HcInterruptDisable_SO_Pos (0) /*!< USBH_T::HcInterruptDisable: SO Position*/ +#define USBH_HcInterruptDisable_SO_Msk (0x1ul << USBH_HcInterruptDisable_SO_Pos) /*!< USBH_T::HcInterruptDisable: SO Mask */ + +#define USBH_HcInterruptDisable_WDH_Pos (1) /*!< USBH_T::HcInterruptDisable: WDH Position*/ +#define USBH_HcInterruptDisable_WDH_Msk (0x1ul << USBH_HcInterruptDisable_WDH_Pos) /*!< USBH_T::HcInterruptDisable: WDH Mask */ + +#define USBH_HcInterruptDisable_SF_Pos (2) /*!< USBH_T::HcInterruptDisable: SF Position*/ +#define USBH_HcInterruptDisable_SF_Msk (0x1ul << USBH_HcInterruptDisable_SF_Pos) /*!< USBH_T::HcInterruptDisable: SF Mask */ + +#define USBH_HcInterruptDisable_RD_Pos (3) /*!< USBH_T::HcInterruptDisable: RD Position*/ +#define USBH_HcInterruptDisable_RD_Msk (0x1ul << USBH_HcInterruptDisable_RD_Pos) /*!< USBH_T::HcInterruptDisable: RD Mask */ + +#define USBH_HcInterruptDisable_FNO_Pos (5) /*!< USBH_T::HcInterruptDisable: FNO Position*/ +#define USBH_HcInterruptDisable_FNO_Msk (0x1ul << USBH_HcInterruptDisable_FNO_Pos) /*!< USBH_T::HcInterruptDisable: FNO Mask */ + +#define USBH_HcInterruptDisable_RHSC_Pos (6) /*!< USBH_T::HcInterruptDisable: RHSC Position*/ +#define USBH_HcInterruptDisable_RHSC_Msk (0x1ul << USBH_HcInterruptDisable_RHSC_Pos) /*!< USBH_T::HcInterruptDisable: RHSC Mask*/ + +#define USBH_HcInterruptDisable_MIE_Pos (31) /*!< USBH_T::HcInterruptDisable: MIE Position*/ +#define USBH_HcInterruptDisable_MIE_Msk (0x1ul << USBH_HcInterruptDisable_MIE_Pos) /*!< USBH_T::HcInterruptDisable: MIE Mask */ + +#define USBH_HcHCCA_HCCA_Pos (8) /*!< USBH_T::HcHCCA: HCCA Position */ +#define USBH_HcHCCA_HCCA_Msk (0xfffffful << USBH_HcHCCA_HCCA_Pos) /*!< USBH_T::HcHCCA: HCCA Mask */ + +#define USBH_HcPeriodCurrentED_PCED_Pos (4) /*!< USBH_T::HcPeriodCurrentED: PCED Position*/ +#define USBH_HcPeriodCurrentED_PCED_Msk (0xffffffful << USBH_HcPeriodCurrentED_PCED_Pos) /*!< USBH_T::HcPeriodCurrentED: PCED Mask */ + +#define USBH_HcControlHeadED_CHED_Pos (4) /*!< USBH_T::HcControlHeadED: CHED Position*/ +#define USBH_HcControlHeadED_CHED_Msk (0xffffffful << USBH_HcControlHeadED_CHED_Pos) /*!< USBH_T::HcControlHeadED: CHED Mask */ + +#define USBH_HcControlCurrentED_CCED_Pos (4) /*!< USBH_T::HcControlCurrentED: CCED Position*/ +#define USBH_HcControlCurrentED_CCED_Msk (0xffffffful << USBH_HcControlCurrentED_CCED_Pos) /*!< USBH_T::HcControlCurrentED: CCED Mask*/ + +#define USBH_HcBulkHeadED_BHED_Pos (4) /*!< USBH_T::HcBulkHeadED: BHED Position */ +#define USBH_HcBulkHeadED_BHED_Msk (0xffffffful << USBH_HcBulkHeadED_BHED_Pos) /*!< USBH_T::HcBulkHeadED: BHED Mask */ + +#define USBH_HcBulkCurrentED_BCED_Pos (4) /*!< USBH_T::HcBulkCurrentED: BCED Position*/ +#define USBH_HcBulkCurrentED_BCED_Msk (0xffffffful << USBH_HcBulkCurrentED_BCED_Pos) /*!< USBH_T::HcBulkCurrentED: BCED Mask */ + +#define USBH_HcDoneHead_DH_Pos (4) /*!< USBH_T::HcDoneHead: DH Position */ +#define USBH_HcDoneHead_DH_Msk (0xffffffful << USBH_HcDoneHead_DH_Pos) /*!< USBH_T::HcDoneHead: DH Mask */ + +#define USBH_HcFmInterval_FI_Pos (0) /*!< USBH_T::HcFmInterval: FI Position */ +#define USBH_HcFmInterval_FI_Msk (0x3ffful << USBH_HcFmInterval_FI_Pos) /*!< USBH_T::HcFmInterval: FI Mask */ + +#define USBH_HcFmInterval_FSMPS_Pos (16) /*!< USBH_T::HcFmInterval: FSMPS Position */ +#define USBH_HcFmInterval_FSMPS_Msk (0x3ffful << USBH_HcFmInterval_FSMPS_Pos) /*!< USBH_T::HcFmInterval: FSMPS Mask */ + +#define USBH_HcFmInterval_FIT_Pos (31) /*!< USBH_T::HcFmInterval: FIT Position */ +#define USBH_HcFmInterval_FIT_Msk (0x1ul << USBH_HcFmInterval_FIT_Pos) /*!< USBH_T::HcFmInterval: FIT Mask */ + +#define USBH_HcFmRemaining_FR_Pos (0) /*!< USBH_T::HcFmRemaining: FR Position */ +#define USBH_HcFmRemaining_FR_Msk (0x3ffful << USBH_HcFmRemaining_FR_Pos) /*!< USBH_T::HcFmRemaining: FR Mask */ + +#define USBH_HcFmRemaining_FRT_Pos (31) /*!< USBH_T::HcFmRemaining: FRT Position */ +#define USBH_HcFmRemaining_FRT_Msk (0x1ul << USBH_HcFmRemaining_FRT_Pos) /*!< USBH_T::HcFmRemaining: FRT Mask */ + +#define USBH_HcFmNumber_FN_Pos (0) /*!< USBH_T::HcFmNumber: FN Position */ +#define USBH_HcFmNumber_FN_Msk (0xfffful << USBH_HcFmNumber_FN_Pos) /*!< USBH_T::HcFmNumber: FN Mask */ + +#define USBH_HcPeriodicStart_PS_Pos (0) /*!< USBH_T::HcPeriodicStart: PS Position */ +#define USBH_HcPeriodicStart_PS_Msk (0x3ffful << USBH_HcPeriodicStart_PS_Pos) /*!< USBH_T::HcPeriodicStart: PS Mask */ + +#define USBH_HcLSThreshold_LST_Pos (0) /*!< USBH_T::HcLSThreshold: LST Position */ +#define USBH_HcLSThreshold_LST_Msk (0xffful << USBH_HcLSThreshold_LST_Pos) /*!< USBH_T::HcLSThreshold: LST Mask */ + +#define USBH_HcRhDescriptorA_NDP_Pos (0) /*!< USBH_T::HcRhDescriptorA: NDP Position*/ +#define USBH_HcRhDescriptorA_NDP_Msk (0xfful << USBH_HcRhDescriptorA_NDP_Pos) /*!< USBH_T::HcRhDescriptorA: NDP Mask */ + +#define USBH_HcRhDescriptorA_PSM_Pos (8) /*!< USBH_T::HcRhDescriptorA: PSM Position*/ +#define USBH_HcRhDescriptorA_PSM_Msk (0x1ul << USBH_HcRhDescriptorA_PSM_Pos) /*!< USBH_T::HcRhDescriptorA: PSM Mask */ + +#define USBH_HcRhDescriptorA_OCPM_Pos (11) /*!< USBH_T::HcRhDescriptorA: OCPM Position*/ +#define USBH_HcRhDescriptorA_OCPM_Msk (0x1ul << USBH_HcRhDescriptorA_OCPM_Pos) /*!< USBH_T::HcRhDescriptorA: OCPM Mask */ + +#define USBH_HcRhDescriptorA_NOCP_Pos (12) /*!< USBH_T::HcRhDescriptorA: NOCP Position*/ +#define USBH_HcRhDescriptorA_NOCP_Msk (0x1ul << USBH_HcRhDescriptorA_NOCP_Pos) /*!< USBH_T::HcRhDescriptorA: NOCP Mask */ + +#define USBH_HcRhDescriptorB_PPCM_Pos (16) /*!< USBH_T::HcRhDescriptorB: PPCM Position*/ +#define USBH_HcRhDescriptorB_PPCM_Msk (0xfffful << USBH_HcRhDescriptorB_PPCM_Pos) /*!< USBH_T::HcRhDescriptorB: PPCM Mask */ + +#define USBH_HcRhStatus_LPS_Pos (0) /*!< USBH_T::HcRhStatus: LPS Position */ +#define USBH_HcRhStatus_LPS_Msk (0x1ul << USBH_HcRhStatus_LPS_Pos) /*!< USBH_T::HcRhStatus: LPS Mask */ + +#define USBH_HcRhStatus_OCI_Pos (1) /*!< USBH_T::HcRhStatus: OCI Position */ +#define USBH_HcRhStatus_OCI_Msk (0x1ul << USBH_HcRhStatus_OCI_Pos) /*!< USBH_T::HcRhStatus: OCI Mask */ + +#define USBH_HcRhStatus_DRWE_Pos (15) /*!< USBH_T::HcRhStatus: DRWE Position */ +#define USBH_HcRhStatus_DRWE_Msk (0x1ul << USBH_HcRhStatus_DRWE_Pos) /*!< USBH_T::HcRhStatus: DRWE Mask */ + +#define USBH_HcRhStatus_LPSC_Pos (16) /*!< USBH_T::HcRhStatus: LPSC Position */ +#define USBH_HcRhStatus_LPSC_Msk (0x1ul << USBH_HcRhStatus_LPSC_Pos) /*!< USBH_T::HcRhStatus: LPSC Mask */ + +#define USBH_HcRhStatus_OCIC_Pos (17) /*!< USBH_T::HcRhStatus: OCIC Position */ +#define USBH_HcRhStatus_OCIC_Msk (0x1ul << USBH_HcRhStatus_OCIC_Pos) /*!< USBH_T::HcRhStatus: OCIC Mask */ + +#define USBH_HcRhStatus_CRWE_Pos (31) /*!< USBH_T::HcRhStatus: CRWE Position */ +#define USBH_HcRhStatus_CRWE_Msk (0x1ul << USBH_HcRhStatus_CRWE_Pos) /*!< USBH_T::HcRhStatus: CRWE Mask */ + +#define USBH_HcRhPortStatus_CCS_Pos (0) /*!< USBH_T::HcRhPortStatus: CCS Position */ +#define USBH_HcRhPortStatus_CCS_Msk (0x1ul << USBH_HcRhPortStatus_CCS_Pos) /*!< USBH_T::HcRhPortStatus: CCS Mask */ + +#define USBH_HcRhPortStatus_PES_Pos (1) /*!< USBH_T::HcRhPortStatus: PES Position */ +#define USBH_HcRhPortStatus_PES_Msk (0x1ul << USBH_HcRhPortStatus_PES_Pos) /*!< USBH_T::HcRhPortStatus: PES Mask */ + +#define USBH_HcRhPortStatus_PSS_Pos (2) /*!< USBH_T::HcRhPortStatus: PSS Position */ +#define USBH_HcRhPortStatus_PSS_Msk (0x1ul << USBH_HcRhPortStatus_PSS_Pos) /*!< USBH_T::HcRhPortStatus: PSS Mask */ + +#define USBH_HcRhPortStatus_POCI_Pos (3) /*!< USBH_T::HcRhPortStatus: POCI Position*/ +#define USBH_HcRhPortStatus_POCI_Msk (0x1ul << USBH_HcRhPortStatus_POCI_Pos) /*!< USBH_T::HcRhPortStatus: POCI Mask */ + +#define USBH_HcRhPortStatus_PRS_Pos (4) /*!< USBH_T::HcRhPortStatus: PRS Position */ +#define USBH_HcRhPortStatus_PRS_Msk (0x1ul << USBH_HcRhPortStatus_PRS_Pos) /*!< USBH_T::HcRhPortStatus: PRS Mask */ + +#define USBH_HcRhPortStatus_PPS_Pos (8) /*!< USBH_T::HcRhPortStatus: PPS Position */ +#define USBH_HcRhPortStatus_PPS_Msk (0x1ul << USBH_HcRhPortStatus_PPS_Pos) /*!< USBH_T::HcRhPortStatus: PPS Mask */ + +#define USBH_HcRhPortStatus_LSDA_Pos (9) /*!< USBH_T::HcRhPortStatus: LSDA Position*/ +#define USBH_HcRhPortStatus_LSDA_Msk (0x1ul << USBH_HcRhPortStatus_LSDA_Pos) /*!< USBH_T::HcRhPortStatus: LSDA Mask */ + +#define USBH_HcRhPortStatus_CSC_Pos (16) /*!< USBH_T::HcRhPortStatus: CSC Position */ +#define USBH_HcRhPortStatus_CSC_Msk (0x1ul << USBH_HcRhPortStatus_CSC_Pos) /*!< USBH_T::HcRhPortStatus: CSC Mask */ + +#define USBH_HcRhPortStatus_PESC_Pos (17) /*!< USBH_T::HcRhPortStatus: PESC Position*/ +#define USBH_HcRhPortStatus_PESC_Msk (0x1ul << USBH_HcRhPortStatus_PESC_Pos) /*!< USBH_T::HcRhPortStatus: PESC Mask */ + +#define USBH_HcRhPortStatus_PSSC_Pos (18) /*!< USBH_T::HcRhPortStatus: PSSC Position*/ +#define USBH_HcRhPortStatus_PSSC_Msk (0x1ul << USBH_HcRhPortStatus_PSSC_Pos) /*!< USBH_T::HcRhPortStatus: PSSC Mask */ + +#define USBH_HcRhPortStatus_OCIC_Pos (19) /*!< USBH_T::HcRhPortStatus: OCIC Position*/ +#define USBH_HcRhPortStatus_OCIC_Msk (0x1ul << USBH_HcRhPortStatus_OCIC_Pos) /*!< USBH_T::HcRhPortStatus: OCIC Mask */ + +#define USBH_HcRhPortStatus_PRSC_Pos (20) /*!< USBH_T::HcRhPortStatus: PRSC Position*/ +#define USBH_HcRhPortStatus_PRSC_Msk (0x1ul << USBH_HcRhPortStatus_PRSC_Pos) /*!< USBH_T::HcRhPortStatus: PRSC Mask */ + +#define USBH_HcPhyControl_ABORT_Pos (1) /*!< USBH_T::HcPhyControl: ABORT Position */ +#define USBH_HcPhyControl_ABORT_Msk (0x1ul << USBH_HcPhyControl_ABORT_Pos) /*!< USBH_T::HcPhyControl: ABORT Mask */ + +#define USBH_HcPhyControl_OCAL_Pos (3) /*!< USBH_T::HcPhyControl: OCAL Position */ +#define USBH_HcPhyControl_OCAL_Msk (0x1ul << USBH_HcPhyControl_OCAL_Pos) /*!< USBH_T::HcPhyControl: OCAL Mask */ + +#define USBH_HcPhyControl_PPCAL_Pos (4) /*!< USBH_T::HcPhyControl: PPCAL Position */ +#define USBH_HcPhyControl_PPCAL_Msk (0x1ul << USBH_HcPhyControl_PPCAL_Pos) /*!< USBH_T::HcPhyControl: PPCAL Mask */ + +#define USBH_HcPhyControl_DPRT1_Pos (16) /*!< USBH_T::HcPhyControl: DPRT1 Position */ +#define USBH_HcPhyControl_DPRT1_Msk (0x1ul << USBH_HcPhyControl_DPRT1_Pos) /*!< USBH_T::HcPhyControl: DPRT1 Mask */ + +/**@}*/ /* USBH_CONST */ +/**@}*/ /* end of USBH register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __USBH_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/wdt_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/wdt_reg.h new file mode 100644 index 0000000000..e621d5c7fe --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/wdt_reg.h @@ -0,0 +1,179 @@ +/**************************************************************************//** + * @file wdt_reg.h + * @brief WDT register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __WDT_REG_H__ +#define __WDT_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup WDT Watch Dog Timer Controller(WDT) + Memory Mapped Structure for WDT Controller +@{ */ + +typedef struct +{ + + + /** + * @var WDT_T::CTL + * Offset: 0x00 WDT Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1] |RSTEN |WDT Time-out Reset Enable Bit (Write Protect) + * | | |Setting this bit will enable the WDT time-out reset function if the WDT up counter value has not been cleared after the specific WDT reset delay period expires. + * | | |0 = WDT time-out reset function Disabled. + * | | |1 = WDT time-out reset function Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[2] |RSTF |WDT Time-out Reset Flag + * | | |This bit indicates the system has been reset by WDT time-out reset or not. + * | | |0 = WDT time-out reset did not occur. + * | | |1 = WDT time-out reset occurred. + * | | |Note: This bit is cleared by writing 1 to it. + * |[3] |IF |WDT Time-out Interrupt Flag + * | | |This bit will be set to 1 while WDT up counter value reaches the selected WDT time-out interval. + * | | |0 = WDT time-out interrupt did not occur. + * | | |1 = WDT time-out interrupt occurred. + * | | |Note: This bit is cleared by writing 1 to it. + * |[4] |WKEN |WDT Time-out Wake-up Function Control (Write Protect) + * | | |If this bit is set to 1, while WDT time-out interrupt flag IF (WDT_CTL[3]) is generated to 1 and interrupt enable bit INTEN (WDT_CTL[6]) is enabled, the WDT time-out interrupt signal will generate a wake-up trigger event to chip. + * | | |0 = Wake-up trigger event Disabled if WDT time-out interrupt signal generated. + * | | |1 = Wake-up trigger event Enabled if WDT time-out interrupt signal generated. + * | | |Note 1: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * | | |Note 2: Chip can be woken up by WDT time-out interrupt signal generated only if WDT clock source is selected to 32 kHz internal low speed RC oscillator (LIRC) or LXT. + * |[5] |WKF |WDT Time-out Wake-up Flag + * | | |This bit indicates the interrupt wake-up flag status of WDT + * | | |0 = WDT does not cause chip wake-up. + * | | |1 = Chip wake-up from Idle or Power-down mode if WDT time-out interrupt signal generated. + * | | |Note: This bit is cleared by writing 1 to it. + * |[6] |INTEN |WDT Time-out Interrupt Enable Bit (Write Protect) + * | | |If this bit is enabled, the WDT time-out interrupt signal is generated and inform to CPU. + * | | |0 = WDT time-out interrupt Disabled. + * | | |1 = WDT time-out interrupt Enabled. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[7] |WDTEN |WDT Enable Bit (Write Protect) + * | | |0 = WDT Disabled (This action will reset the internal up counter value). + * | | |1 = WDT Enabled. + * | | |Note 1: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * | | |Note 2: If CWDTEN[2:0] (combined by Config0[31] and Config0[4:3]) bits is not configured to 111, this bit is forced as 1 and user cannot change this bit to 0. + * |[11:8] |TOUTSEL |WDT Time-out Interval Selection (Write Protect) + * | | |These three bits select the time-out interval period for the WDT. + * | | |0000 = 24 * WDT_CLK. + * | | |0001 = 26 * WDT_CLK. + * | | |0010 = 28 * WDT_CLK. + * | | |0011 = 210 * WDT_CLK. + * | | |0100= 212 * WDT_CLK. + * | | |0101 = 214 * WDT_CLK. + * | | |0110 = 216 * WDT_CLK. + * | | |0111 = 218 * WDT_CLK. + * | | |1000 = 220 * WDT_CLK. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * |[30] |SYNC |WDT Enable Control SYNC Flag Indicator (Read Only) + * | | |If user executes enable/disable WDTEN (WDT_CTL[7]), this flag can be indicated enable/disable WDTEN function is completed or not. + * | | |0 = Set WDTEN bit is completed. + * | | |1 = Set WDTEN bit is synchronizing and not become active yet. + * | | |Note: Performing enable or disable WDTEN bit needs 2 * WDT_CLK period to become active. + * |[31] |ICEDEBUG |ICE Debug Mode Acknowledge Disable Bit (Write Protect) + * | | |0 = ICE debug mode acknowledgement affects WDT counting. + * | | |WDT up counter will be held while CPU is held by ICE. + * | | |1 = ICE debug mode acknowledgement Disabled. + * | | |WDT up counter will keep going no matter CPU is held by ICE or not. + * | | |Note: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register + * @var WDT_T::ALTCTL + * Offset: 0x04 WDT Alternative Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[1:0] |RSTDSEL |WDT Reset Delay Selection (Write Protect) + * | | |When WDT time-out happened, user has a time named WDT Reset Delay Period to clear WDT counter by programming 0x5AA5 to RSTCNT to prevent WDT time-out reset happened. + * | | |User can select a suitable setting of RSTDSEL for different WDT Reset Delay Period. + * | | |00 = WDT Reset Delay Period is 1026 * WDT_CLK. + * | | |01 = WDT Reset Delay Period is 130 * WDT_CLK. + * | | |10 = WDT Reset Delay Period is 18 * WDT_CLK. + * | | |11 = WDT Reset Delay Period is 3 * WDT_CLK. + * | | |Note 1: This bit is write protected + * | | |Refer to the SYS_RLKTZS register or SYS_RLKTZNS register or SYS_RLKSUBM register. + * | | |Note 2: This register will be reset to 0 if WDT time-out reset happened. + * @var WDT_T::RSTCNT + * Offset: 0x08 WDT Reset Counter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |RSTCNT |WDT Reset Counter Register + * | | |Writing 0x00005AA5 to this field will reset the internal 20-bit WDT up counter value to 0. + * | | |Note: Performing RSTCNT to reset counter needs 2 * WDT_CLK period to become active. + */ + __IO uint32_t CTL; /*!< [0x0000] WDT Control Register */ + __IO uint32_t ALTCTL; /*!< [0x0004] WDT Alternative Control Register */ + __O uint32_t RSTCNT; /*!< [0x0008] WDT Reset Counter Register */ + +} WDT_T; + +/** + @addtogroup WDT_CONST WDT Bit Field Definition + Constant Definitions for WDT Controller +@{ */ + +#define WDT_CTL_RSTEN_Pos (1) /*!< WDT_T::CTL: RSTEN Position */ +#define WDT_CTL_RSTEN_Msk (0x1ul << WDT_CTL_RSTEN_Pos) /*!< WDT_T::CTL: RSTEN Mask */ + +#define WDT_CTL_RSTF_Pos (2) /*!< WDT_T::CTL: RSTF Position */ +#define WDT_CTL_RSTF_Msk (0x1ul << WDT_CTL_RSTF_Pos) /*!< WDT_T::CTL: RSTF Mask */ + +#define WDT_CTL_IF_Pos (3) /*!< WDT_T::CTL: IF Position */ +#define WDT_CTL_IF_Msk (0x1ul << WDT_CTL_IF_Pos) /*!< WDT_T::CTL: IF Mask */ + +#define WDT_CTL_WKEN_Pos (4) /*!< WDT_T::CTL: WKEN Position */ +#define WDT_CTL_WKEN_Msk (0x1ul << WDT_CTL_WKEN_Pos) /*!< WDT_T::CTL: WKEN Mask */ + +#define WDT_CTL_WKF_Pos (5) /*!< WDT_T::CTL: WKF Position */ +#define WDT_CTL_WKF_Msk (0x1ul << WDT_CTL_WKF_Pos) /*!< WDT_T::CTL: WKF Mask */ + +#define WDT_CTL_INTEN_Pos (6) /*!< WDT_T::CTL: INTEN Position */ +#define WDT_CTL_INTEN_Msk (0x1ul << WDT_CTL_INTEN_Pos) /*!< WDT_T::CTL: INTEN Mask */ + +#define WDT_CTL_WDTEN_Pos (7) /*!< WDT_T::CTL: WDTEN Position */ +#define WDT_CTL_WDTEN_Msk (0x1ul << WDT_CTL_WDTEN_Pos) /*!< WDT_T::CTL: WDTEN Mask */ + +#define WDT_CTL_TOUTSEL_Pos (8) /*!< WDT_T::CTL: TOUTSEL Position */ +#define WDT_CTL_TOUTSEL_Msk (0xful << WDT_CTL_TOUTSEL_Pos) /*!< WDT_T::CTL: TOUTSEL Mask */ + +#define WDT_CTL_SYNC_Pos (30) /*!< WDT_T::CTL: SYNC Position */ +#define WDT_CTL_SYNC_Msk (0x1ul << WDT_CTL_SYNC_Pos) /*!< WDT_T::CTL: SYNC Mask */ + +#define WDT_CTL_ICEDEBUG_Pos (31) /*!< WDT_T::CTL: ICEDEBUG Position */ +#define WDT_CTL_ICEDEBUG_Msk (0x1ul << WDT_CTL_ICEDEBUG_Pos) /*!< WDT_T::CTL: ICEDEBUG Mask */ + +#define WDT_ALTCTL_RSTDSEL_Pos (0) /*!< WDT_T::ALTCTL: RSTDSEL Position */ +#define WDT_ALTCTL_RSTDSEL_Msk (0x3ul << WDT_ALTCTL_RSTDSEL_Pos) /*!< WDT_T::ALTCTL: RSTDSEL Mask */ + +#define WDT_RSTCNT_RSTCNT_Pos (0) /*!< WDT_T::RSTCNT: RSTCNT Position */ +#define WDT_RSTCNT_RSTCNT_Msk (0xfffffffful << WDT_RSTCNT_RSTCNT_Pos) /*!< WDT_T::RSTCNT: RSTCNT Mask */ + +/**@}*/ /* WDT_CONST */ +/**@}*/ /* end of WDT register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __WDT_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/whc_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/whc_reg.h new file mode 100644 index 0000000000..8a3cdf5131 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/whc_reg.h @@ -0,0 +1,1034 @@ +/**************************************************************************//** + * @file whc_reg.h + * @brief Wormhole controller register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020~2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __WHC_REG_H__ +#define __WHC_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ +/** + @addtogroup WHC Wormhole Controller (WHC) + Memory Mapped Structure for WHC Controller +@{ */ + +typedef struct +{ + + + /** + * @var WHC_T::WKCTL + * Offset: 0x00 WHC Wakeup Event Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RST0WKEN |Counterpart First Core Reset Interrupt Wake-up Enable Bit + * | | |Counterpart reset event interrupt wake-up trigger event enable. + * | | |0 = Counterpart reset event interrupt wake-up trigger event Disabled. + * | | |1 = Counterpart reset event interrupt wake-up trigger event Enabled. + * |[1] |POFF0WKEN |Counterpart First Core Power Off State Interrupt Wake-up Enable Bit + * | | |Counterpart power off interrupt wake-up trigger event enable. + * | | |0 = Counterpart power off interrupt wake-up trigger event Disabled. + * | | |1 = Counterpart power off interrupt wake-up trigger event Enabled. + * |[2] |PD0WKEN |Counterpart First Core Power Down State Interrupt Wake-up Enable Bit + * | | |Counterpart power down interrupt wake-up trigger event enable. + * | | |0 = Counterpart power down interrupt wake-up trigger event Disabled. + * | | |1 = Counterpart power down interrupt wake-up trigger event Enabled. + * |[3] |RST1WKEN |A35 Second Core Reset Interrupt Wake-up Enable Bit + * | | |Counterpart reset event interrupt wake-up trigger event enable. + * | | |0 = Counterpart reset event interrupt wake-up trigger event Disabled. + * | | |1 = Counterpart reset event interrupt wake-up trigger event Enabled. + * | | |Note: This bit which indicates the second A35 core is only available for M4 side. + * |[4] |POFF1WKEN |A35 Second Core Power Off State Interrupt Wake-up Enable Bit + * | | |Counterpart power off interrupt wake-up trigger event enable. + * | | |0 = Counterpart power off interrupt wake-up trigger event Disabled. + * | | |1 = Counterpart power off interrupt wake-up trigger event Enabled. + * | | |Note: This bit which indicates the second A35 core is only available for M4 side. + * |[5] |PD1WKEN |A35 Second Core Power Down State Interrupt Wake-up Enable Bit + * | | |Counterpart power down interrupt wake-up trigger event enable. + * | | |0 = Counterpart power down interrupt wake-up trigger event Disabled. + * | | |1 = Counterpart power down interrupt wake-up trigger event Enabled. + * | | |Note: This bit which indicates the second A35 core is only available for M4 side. + * |[8] |GI0WKEN |General Interrupt 0 Wake-up Enable + * | | |If this bit is set to 1, while general interrupt flag is set to 1 and interrupt enable bit is enabled, the general interrupt signal will generate a wake-up trigger event to chip. + * | | |0 = Wake-up trigger event disabled if general interrupt 0 signal generated. + * | | |1 = Wake-up trigger event enabled if general interrupt 0 signal generated. + * |[9] |GI1WKEN |General Interrupt 1 Wake-up Enable + * | | |If this bit is set to 1, while general interrupt flag is set to 1 and interrupt enable bit is enabled, the general interrupt signal will generate a wake-up trigger event to chip. + * | | |0 = Wake-up trigger event disabled if general interrupt 1 signal generated. + * | | |1 = Wake-up trigger event enabled if general interrupt 1 signal generated. + * |[10] |GI2WKEN |General Interrupt 2 Wake-up Enable + * | | |If this bit is set to 1, while general interrupt flag is set to 1 and interrupt enable bit is enabled, the general interrupt signal will generate a wake-up trigger event to chip. + * | | |0 = Wake-up trigger event disabled if general interrupt 2 signal generated. + * | | |1 = Wake-up trigger event enabled if general interrupt 2 signal generated. + * |[11] |GI3WKEN |General Interrupt 3 Wake-up Enable + * | | |If this bit is set to 1, while general interrupt flag is set to 1 and interrupt enable bit is enabled, the general interrupt signal will generate a wake-up trigger event to chip. + * | | |0 = Wake-up trigger event disabled if general interrupt 3 signal generated. + * | | |1 = Wake-up trigger event enabled if general interrupt 3 signal generated. + * |[16] |TX0WKEN |TX Message Channel 0 Interrupt Wake-up Enable Bit + * | | |TX message channel 0 interrupt wake-up trigger event enable. + * | | |0 = Channel 0 interrupt wake-up trigger event Disabled. + * | | |1 = Channel 0 interrupt wake-up trigger event Enabled. + * |[17] |TX1WKEN |TX Message Channel 1 Interrupt Wake-up Enable Bit + * | | |TX message channel 1 interrupt wake-up trigger event enable. + * | | |0 = Channel 1 interrupt wake-up trigger event Disabled. + * | | |1 = Channel 1 interrupt wake-up trigger event Enabled. + * |[18] |TX2WKEN |TX Message Channel 2 Interrupt Wake-up Enable Bit + * | | |TX message channel 2 interrupt wake-up trigger event enable. + * | | |0 = Channel 2 interrupt wake-up trigger event Disabled. + * | | |1 = Channel 2 interrupt wake-up trigger event Enabled. + * |[19] |TX3WKEN |TX Message Channel 3 Interrupt Wake-up Enable Bit + * | | |TX message channel 3 interrupt wake-up trigger event enable. + * | | |0 = Channel 3 interrupt wake-up trigger event Disabled. + * | | |1 = Channel 3 interrupt wake-up trigger event Enabled. + * |[24] |RX0WKEN |RX Message Channel 0 Interrupt Wake-up Enable Bit + * | | |RX message channel 0 interrupt wake-up trigger event enable. + * | | |0 = Channel 0 interrupt wake-up trigger event Disabled. + * | | |1 = Channel 0 interrupt wake-up trigger event Enabled. + * |[25] |RX1WKEN |RX Message Channel 1 Interrupt Wake-up Enable Bit + * | | |RX message channel 1 interrupt wake-up trigger event enable. + * | | |0 = Channel 1 interrupt wake-up trigger event Disabled. + * | | |1 = Channel 1 interrupt wake-up trigger event Enabled. + * |[26] |RX2WKEN |RX Message Channel 2 Interrupt Wake-up Enable Bit + * | | |RX message Channel 2 interrupt wake-up trigger event enable. + * | | |0 = Channel 2 interrupt wake-up trigger event Disabled. + * | | |1 = Channel 2 interrupt wake-up trigger event Enabled. + * |[27] |RX3WKEN |RX Message Channel 3 Interrupt Wake-up Enable Bit + * | | |RX message channel 3 interrupt wake-up trigger event enable. + * | | |0 = Channel 3 interrupt wake-up trigger event Disabled. + * | | |1 = Channel 3 interrupt wake-up trigger event Enabled. + * @var WHC_T::INTEN + * Offset: 0x04 WHC Interrupt Enable Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RST0IEN |Counterpart First Core Reset Event Interrupt Enable Bit + * | | |Counterpart reset event interrupt enable. + * | | |0 = Counterpart status change interrupt Disabled. + * | | |1 = Counterpart status change interrupt Enabled. + * |[1] |POFF0IEN |Counterpart First Core Enter/Exit Power Off Mode Interrupt Enable Bit + * | | |Counterpart Enter/Exit Power Off Mode Interrupt Enable + * | | |0 = Counterpart power Off status change interrupt Disabled. + * | | |1 = Counterpart power Off status change interrupt Enabled. + * |[2] |PD0IEN |Counterpart First Core Enter/Exit Power-down mode Interrupt Enable Bit + * | | |Counterpart Enter/Exit Power-down mode Interrupt Enable + * | | |0 = Counterpart power down status change interrupt Disabled. + * | | |1 = Counterpart power down status change interrupt Enabled. + * |[3] |RST1IEN |A35 Second Core Reset Event Interrupt Enable Bit + * | | |Counterpart reset event interrupt enable. + * | | |0 = Counterpart status change interrupt Disabled. + * | | |1 = Counterpart status change interrupt Enabled. + * | | |Note: This bit which indicates the second A35 core is only available for M4 side. + * |[4] |POFF1IEN |A35 Second Core Enter/Exit Power Off Mode Interrupt Enable Bit + * | | |Counterpart Enter/Exit Power Off Mode Interrupt Enable + * | | |0 = Counterpart power Off status change interrupt Disabled. + * | | |1 = Counterpart power Off status change interrupt Enabled. + * | | |Note: This bit which indicates the second A35 core is only available for M4 side. + * |[5] |PD1IEN |A35 Second Core Enter/Exit Power-down mode Interrupt Enable Bit + * | | |Counterpart Enter/Exit Power-down mode Interrupt Enable + * | | |0 = Counterpart power down status change interrupt Disabled. + * | | |1 = Counterpart power down status change interrupt Enabled. + * | | |Note: This bit which indicates the second A35 core is only available for M4 side. + * |[8] |GI0IEN |General Interrupt 0 Enable Bit + * | | |General interrupt 0 interrupt enable. + * | | |0 = General interrupt 0 interrupt Disabled. + * | | |1 = General interrupt 0 interrupt Enabled. + * |[9] |GI1IEN |General Interrupt 1 Enable Bit + * | | |General interrupt 1 interrupt enable. + * | | |0 = General interrupt 1 interrupt Disabled. + * | | |1 = General interrupt 1 interrupt Enabled. + * |[10] |GI2IEN |General Interrupt 2 Enable Bit + * | | |General interrupt 2 interrupt enable. + * | | |0 = General interrupt 2 interrupt Disabled. + * | | |1 = General interrupt 2 interrupt Enabled. + * |[11] |GI3IEN |General Interrupt 3 Enable Bit + * | | |General interrupt 3 interrupt enable. + * | | |0 = General interrupt 3 interrupt Disabled. + * | | |1 = General interrupt 3 interrupt Enabled. + * |[16] |TX0IEN |TX Message Channel 0 Interrupt Enable Bit + * | | |TX message channel 0 ACK interrupt enable + * | | |0 = Channel 0 ACK interrupt Disabled. + * | | |1 = Channel 0 ACK interrupt Enabled. + * |[17] |TX1IEN |TX Message Channel 1 Interrupt Enable Bit + * | | |TX message channel 1 ACK interrupt enable. + * | | |0 = Channel 1 ACK interrupt Disabled. + * | | |1 = Channel 1 ACK interrupt Enabled. + * |[18] |TX2IEN |TX Message Channel 2 Interrupt Enable Bit + * | | |TX message channel 2 ACK interrupt enable. + * | | |0 = Channel 2 ACK interrupt Disabled. + * | | |1 = Channel 2 ACK interrupt Enabled. + * |[19] |TX3IEN |TX Message Channel 3 Interrupt Enable Bit + * | | |TX message channel 3 ACK interrupt enable + * | | |0 = Channel 3 ACK interrupt Disabled. + * | | |1 = Channel 3 ACK interrupt Enabled. + * |[24] |RX0IEN |RX Message Channel 0 Interrupt Enable Bit + * | | |RX message channel 0 arrive or recall interrupt enable + * | | |0 = Channel 0 arrive or recall interrupt Disabled. + * | | |1 = Channel 0 arrive or recall interrupt Enabled. + * |[25] |RX1IEN |RX Message Channel 1 Interrupt Enable Bit + * | | |RX message channel 1 arrive or recall interrupt enable. + * | | |0 = Channel 1 arrive or recall interrupt Disabled. + * | | |1 = Channel 1 arrive or recall interrupt Enabled. + * |[26] |RX2IEN |RX Message Channel 2 Interrupt Enable Bit + * | | |RX message channel 2 arrive or recall interrupt enable. + * | | |0 = Channel 2 arrive or recall interrupt Disabled. + * | | |1 = Channel 2 arrive or recall interrupt Enabled. + * |[27] |RX3IEN |RX Message Channel 3 Interrupt Enable Bit + * | | |RX message channel 3 arrive or recall interrupt enable + * | | |0 = Channel 3 arrive or recall interrupt Disabled. + * | | |1 = Channel 3 arrive or recall interrupt Enabled. + * @var WHC_T::INTSTS + * Offset: 0x08 WHC Interrupt Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |RST0IF |Counterpart First Core Reset Event Interrupt Flag + * | | |Counterpart reset event interrupt flag. + * | | |0 = No counterpart reset status change interrupt generated. + * | | |1 = Counterpart reset status change interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[1] |POFF0IF |Counterpart First Core Enter/Exit Power Off Mode Interrupt Flag + * | | |Counterpart Enter/Exit Power Off Mode Interrupt Flag + * | | |0 = No counterpart power off mode status change interrupt generated. + * | | |1 = Counterpart power off mode status change interrupt generated. + * | | |Note: Write 1 to clear this bit to 0.. + * |[2] |PD0IF |Counterpart First Core Enter/Exit Power-down mode Interrupt Flag + * | | |Counterpart Enter/Exit Power-down mode Interrupt Flag + * | | |0 = No counterpart Power-down mode status change interrupt generated. + * | | |1 = Counterpart Power-down mode status change interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[3] |RST1IF |A35 Second Core Reset Event Interrupt Flag + * | | |Counterpart reset event interrupt flag. + * | | |0 = No counterpart reset status change interrupt generated. + * | | |1 = Counterpart reset status change interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * | | |Note: This bit which indicates the second A35 core is only available for M4 side. + * |[4] |POFF1IF |A35 Second Core Enter/Exit Power Off Mode Interrupt Flag + * | | |Counterpart Enter/Exit Power Off Mode Interrupt Flag + * | | |0 = No counterpart power off mode status change interrupt generated. + * | | |1 = Counterpart power off mode status change interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * | | |Note: This bit which indicates the second A35 core is only available for M4 side. + * |[5] |PD1IF |A35 Second Core Enter/Exit Power-down mode Interrupt Flag + * | | |Counterpart Enter/Exit Power-down mode Interrupt Flag + * | | |0 = No counterpart Power-down mode status change interrupt generated. + * | | |1 = Counterpart Power-down mode status change interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * | | |Note: This bit which indicates the second A35 core is only available for M4 side. + * |[8] |GI0IF |General Event 0 Flag + * | | |General event 0 interrupt flag. + * | | |0 = No general event 0 interrupt generated. + * | | |1 = General event 0 interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[9] |GI1IF |General Event 1 Flag + * | | |General event 1 interrupt flag. + * | | |0 = No general event 1 interrupt generated. + * | | |1 = General event 1 interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[10] |GI2IF |General Event 2 Flag + * | | |General event 2 interrupt flag. + * | | |0 = No general event 2 interrupt generated. + * | | |1 = General event 2 interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[11] |GI3IF |General Event 3 Flag + * | | |General event 3 interrupt flag. + * | | |0 = No general event 3 interrupt generated. + * | | |1 = General event 3 interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[16] |TX0IF |TX Message Channel 0 Interrupt Flag + * | | |Tx message channel 0 ACK interrupt flag. + * | | |0 = No channel 0 ACK interrupt generated. + * | | |1 = Channel 0 ACK interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[17] |TX1IF |TX Message Channel 1 Interrupt Flag + * | | |Tx message channel 1 ACK interrupt flag. + * | | |0 = No channel 1 ACK interrupt generated. + * | | |1 = Channel 1 ACK interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[18] |TX2IF |TX Message Channel 2 Interrupt Flag + * | | |Tx message channel 2 ACK interrupt flag. + * | | |0 = No channel 2 ACK interrupt generated. + * | | |1 = Channel 2 ACK interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[19] |TX3IF |TX Message Channel 3 Interrupt Flag + * | | |Tx message channel 3 ACK interrupt flag. + * | | |0 = No channel 3 ACK interrupt generated. + * | | |1 = Channel 3 ACK interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[24] |RX0IF |RX Message Channel 0 Interrupt Flag + * | | |Short message channel 0 arrive or recall interrupt flag. + * | | |0 = No channel 0 arrive or recall interrupt generated. + * | | |1 = Channel 0 arrive or recall interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[25] |RX1IF |RX Message Channel 1 Interrupt Flag + * | | |Short message channel 1 arrive or recall interrupt flag. + * | | |0 = No channel 1 arrive or recall interrupt generated. + * | | |1 = Channel 1 arrive or recall interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[26] |RX2IF |RX Message Channel 2 Interrupt Flag + * | | |Short message channel 2 arrive or recall interrupt flag. + * | | |0 = No channel 2 arrive or recall interrupt generated. + * | | |1 = Channel 2 arrive or recall interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * |[27] |RX3IF |RX Message Channel 3 Interrupt Flag + * | | |RX message channel 3 arrive or recall interrupt flag. + * | | |0 = No channel 3 arrive or recall interrupt generated. + * | | |1 = Channel 3 arrive or recall interrupt generated. + * | | |Note: Write 1 to clear this bit to 0. + * @var WHC_T::CPSTS + * Offset: 0x40 WHC Counterpart Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[2] |WDTRF |WDT Reset Flag + * | | |The WDT reset flag is set by the Reset Signal from the Watchdog Timer or Window Watchdog Timer to indicate the previous reset source. + * | | |0 = No reset from watchdog timer or window watchdog timer. + * | | |1 = The watchdog timer or window watchdog timer had issued the reset signal to reset the system. + * | | |Note 1: Read only, write 1 to clear this bit to 0. + * | | |Note 2: Watchdog Timer register RSTF(WDT_CTL[2]) bit is set if the system has been reset by WDT time-out reset + * | | |Window Watchdog Timer register WWDTRF(WWDT_STATUS[1]) bit is set if the system has been reset by WWDT time-out reset. + * |[5] |SYSRF |System Reset Flag + * | | |The system reset flag is set by the Reset Signal from the Cortex-M4 Core to indicate the previous reset source. + * | | |0 = No reset from Cortex-M4. + * | | |1 = The Cortex-M4 had issued the reset signal to reset the system by writing 1 to the bit SYSRESETREQ(AIRCR[2], Application Interrupt and Reset Control Register, address = 0xE000ED0C) in system control registers of Cortex-M4 core. + * | | |Note: Read only, write 1 to clear this bit to 0. + * |[7] |CPURF |CPU Reset Flag + * | | |The CPU reset flag is set by hardware if software writes CPURST (SYS_IPRST0[1]) 1 to reset Cortex-M4 Core and Flash Memory Controller (FMC). + * | | |0 = No reset from CPU. + * | | |1 = The Cortex-M4 Core and FMC are reset by software setting CPURST to 1. + * | | |Note: Read only, write 1 to clear this bit to 0. + * |[8] |CPULKRF |CPU Lockup Reset Flag + * | | |0 = No reset from CPU lockup happened. + * | | |1 = The Cortex-M4 lockup happened and chip is reset. + * | | |Note 1: Read only, write 1 to clear this bit to 0. + * | | |Note 2: When CPU lockup happened under ICE is connected, This flag will set to 1 but chip will not reset. + * |[27:24] |OPMODE0 |Operating Mode of Other Side Core 0, Representing A35/M4 Core 0 (Read Only) + * | | |This bit field indicates the operating mode of the core 0 of the other side. + * | | |0000 = Run mode. + * | | |0001 = Power off mode. + * | | |0010 = Power-down mode. + * | | |Others = Reserved. + * |[31:28] |OPMODE1 |Operating Mode of Other Side Core 1, Representing A35 Core 1 (Read Only) + * | | |This bit field indicates the operating mode of the core 1 of the other side. + * | | |0000 = Run mode. + * | | |0001 = Power off mode. + * | | |0010 = Power-down mode. + * | | |Others = Reserved. + * | | |Note 1: This field can only be accessed by M4 side. + * @var WHC_T::GINTTRG + * Offset: 0x80 WHC General Interrupt Trigger Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |TRGGI0 |Trigger General Interrupt 0 + * | | |Write this bit 1 to trigger general interrupt 0. + * |[1] |TRGGI1 |Trigger General Interrupt 1 + * | | |Write this bit 1 to trigger general interrupt 1. + * |[2] |TRGGI2 |Trigger General Interrupt 2 + * | | |Write this bit 1 to trigger general interrupt 2. + * |[3] |TRGGI3 |Trigger General Interrupt 3 + * | | |Write this bit 1 to trigger general interrupt 3. + * @var WHC_T::TXCTL + * Offset: 0xC0 WHC TX Message Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CH0SND |Send Channel 0 Message + * | | |Write 1 to this bit to send TX channel 0 message + * | | |Before write 1 to this bit, sender should check the corresponding CHxRDY bit in TXSTS is 1 or not + * | | |Otherwise, the receiver may get unpredictable data. + * | | |Note: Write 0 to this bit has no effect + * | | |Write 1 to SND and RC bits of the same channel simultaneously will yield unpredictable result. + * |[1] |CH1SND |Send Channel 1 Message + * | | |Write 1 to this bit to send TX channel 1 message + * | | |Before write 1 to this bit, sender should check the corresponding CHxRDY bit in TXSTS is 1 or not + * | | |Otherwise, the receiver may get unpredictable data. + * | | |Note: Write 0 to this bit has no effect + * | | |Write 1 to SND and RC bits of the same channel simultaneously will yield unpredictable result. + * |[2] |CH2SND |Send Channel 2 Message + * | | |Write 1 to this bit to send TX channel 2 message + * | | |Before write 1 to this bit, sender should check the corresponding CHxRDY bit in TXSTS is 1 or not + * | | |Otherwise, the receiver may get unpredictable data. + * | | |Note: Write 0 to this bit has no effect + * | | |Write 1 to SND and RC bits of the same channel simultaneously will yield unpredictable result. + * |[3] |CH3SND |Send Channel 3 Message + * | | |Write 1 to this bit to send TX channel 3 message + * | | |Before write 1 to this bit, sender should check the corresponding CHxRDY bit in TXSTS is 1 or not + * | | |Otherwise, the receiver may get unpredictable data. + * | | |Note: Write 0 to this bit has no effect + * | | |Write 1 to SND and RC bits of the same channel simultaneously will yield unpredictable result. + * |[16] |CH0RC |Recall Channel 1 Message + * | | |Write 1 to this bit to recall TX channel 1 message + * | | |Before write 1 to this bit, sender should check the corresponding CHxRDY bit in TXSTS is 0 or not. + * | | |Note: Write 0 to this bit has no effect + * | | |Write 1 to SND and RC bits of the same channel simultaneously will yield unpredictable result. + * |[17] |CH1RC |Recall Channel 1 Message + * | | |Write 1 to this bit to recall TX channel 1 message + * | | |Before write 1 to this bit, sender should check the corresponding CHxRDY bit in TXSTS is 0 or not. + * | | |Note: Write 0 to this bit has no effect + * | | |Write 1 to SND and RC bits of the same channel simultaneously will yield unpredictable result. + * |[18] |CH2RC |Recall Channel 2 Message + * | | |Write 1 to this bit to recall TX channel 2 message + * | | |Before write 1 to this bit, sender should check the corresponding CHxRDY bit in TXSTS is 0 or not. + * | | |Note: Write 0 to this bit has no effect + * | | |Write 1 to SND and RC bits of the same channel simultaneously will yield unpredictable result. + * |[19] |CH3RC |Recall Channel 3 Message + * | | |Write 1 to this bit to recall TX channel 3 message + * | | |Before write 1 to this bit, sender should check the corresponding CHxRDY bit in TXSTS is 0 or not. + * | | |Note: Write 0 to this bit has no effect + * | | |Write 1 to SND and RC bits of the same channel simultaneously will yield unpredictable result. + * @var WHC_T::TXSTS + * Offset: 0xC4 WHC TX Message Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CH0RDY |Channel 0 Message Ready + * | | |0 = No recall event. + * | | |1 = Message channel is available to send new data. + * | | |This bit automatically cleared to 0 after write 1 to CH0SND + * | | |Automatically set to 1 after recall complete or receiver notify message read. + * |[1] |CH1RDY |Channel 1 Message Ready + * | | |0 = No recall event. + * | | |1 = Message channel is available to send new data. + * | | |This bit automatically cleared to 0 after write 1 to CH1SND + * | | |Automatically set to 1 after recall complete or receiver notify message read. + * |[2] |CH2RDY |Channel 2 Message Ready + * | | |0 = No recall event. + * | | |1 = Message channel is available to send new data. + * | | |This bit automatically cleared to 0 after write 1 to CH2SND + * | | |Automatically set to 1 after recall complete or receiver notify message read. + * |[3] |CH3RDY |Channel 3 Message Ready + * | | |0 = No recall event. + * | | |1 = Message channel is available to send new data. + * | | |This bit automatically cleared to 0 after write 1 to CH3SND + * | | |Automatically set to 1 after recall complete or receiver notify message read. + * @var WHC_T::RXCTL + * Offset: 0xC8 WHC RX Message Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CH0ACK |RX Message Channel 0 ACK + * | | |Write 1 to notify sender that channel 0 message has been read. Write 0 to this bit has no effect. + * | | |Write 1 will clear CH0RDY. + * |[1] |CH1ACK |RX Message Channel 1 ACK + * | | |Write 1 to notify sender that channel 1 message has been read. Write 0 to this bit has no effect. + * | | |Write 1 will clear CH1RDY. + * |[2] |CH2ACK |RX Message Channel 2 ACK + * | | |Write 1 to notify sender that channel 2 message has been read. Write 0 to this bit has no effect. + * | | |Write 1 will clear CH2RDY. + * |[3] |CH3ACK |RX Message Channel 3 ACK + * | | |Write 1 to notify sender that channel 3 message has been read. Write 0 to this bit has no effect. + * | | |Write 1 will clear CH3RDY. + * @var WHC_T::RXSTS + * Offset: 0xCC WHC RX Message Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |CH0RDY |RX Channel 0 Message Ready + * | | |0 = RX channel 0 message data is not ready. + * | | |1 = RX channel 0 message data is ready. + * | | |Note: This bit is automatically set to 1 after sender writes 1 to CH0SND + * | | |It is automatically cleared to 0 after recall complete or write 1 to CH0ACK. + * |[1] |CH1RDY |RX Channel 1 Message Ready + * | | |0 = RX channel 1 message data is not ready. + * | | |1 = RX channel 1 message data is ready. + * | | |Note: This bit is automatically set to 1 after sender writes 1 to CH1SND + * | | |It is automatically cleared to 0 after recall complete or write 1 to CH1ACK. + * |[2] |CH2RDY |RX Channel 2 Message Ready + * | | |0 = RX channel 2 message data is not ready. + * | | |1 = RX channel 2 message data is ready. + * | | |Note: This bit is automatically set to 1 after sender writes 1 to CH2SND + * | | |It is automatically cleared to 0 after recall complete or write 1 to CH2ACK. + * |[3] |CH3RDY |RX Channel 3 Message Ready + * | | |0 = RX channel 3 message data is not ready. + * | | |1 = RX channel 3 message data is ready. + * | | |Note: This bit is automatically set to 1 after sender writes 1 to CH3SND + * | | |It is automatically cleared to 0 after recall complete or write 1 to CH3ACK. + * @var WHC_T::TM0DAT0 + * Offset: 0x100 WHC TX Message Channel 0 Data 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM0DAT1 + * Offset: 0x104 WHC TX Message Channel 0 Data 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM0DAT2 + * Offset: 0x108 WHC TX Message Channel 0 Data 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM0DAT3 + * Offset: 0x10C WHC TX Message Channel 0 Data 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM1DAT0 + * Offset: 0x110 WHC TX Message Channel 1 Data 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM1DAT1 + * Offset: 0x114 WHC TX Message Channel 1 Data 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM1DAT2 + * Offset: 0x118 WHC TX Message Channel 1 Data 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM1DAT3 + * Offset: 0x11C WHC TX Message Channel 1 Data 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM2DAT0 + * Offset: 0x120 WHC TX Message Channel 2 Data 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM2DAT1 + * Offset: 0x124 WHC TX Message Channel 2 Data 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM2DAT2 + * Offset: 0x128 WHC TX Message Channel 2 Data 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM2DAT3 + * Offset: 0x12C WHC TX Message Channel 2 Data 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM3DAT0 + * Offset: 0x130 WHC TX Message Channel 3 Data 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM3DAT1 + * Offset: 0x134 WHC TX Message Channel 3 Data 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM3DAT2 + * Offset: 0x138 WHC TX Message Channel 3 Data 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::TM3DAT3 + * Offset: 0x13C WHC TX Message Channel 3 Data 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |TX Message Data + * | | |This field contains the TX message data field + * | | |Sender should only write these registers while ready bit in TXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM0DAT0 + * Offset: 0x200 WHC RX Message Channel 0 Data 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM0DAT1 + * Offset: 0x204 WHC RX Message Channel 0 Data 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM0DAT2 + * Offset: 0x208 WHC RX Message Channel 0 Data 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM0DAT3 + * Offset: 0x20C WHC RX Message Channel 0 Data 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM1DAT0 + * Offset: 0x210 WHC RX Message Channel 1 Data 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM1DAT1 + * Offset: 0x214 WHC RX Message Channel 1 Data 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM1DAT2 + * Offset: 0x218 WHC RX Message Channel 1 Data 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM1DAT3 + * Offset: 0x21C WHC RX Message Channel 1 Data 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM2DAT0 + * Offset: 0x220 WHC RX Message Channel 2 Data 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM2DAT1 + * Offset: 0x224 WHC RX Message Channel 2 Data 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM2DAT2 + * Offset: 0x228 WHC RX Message Channel 2 Data 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM2DAT3 + * Offset: 0x22C WHC RX Message Channel 2 Data 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM3DAT0 + * Offset: 0x230 WHC RX Message Channel 3 Data 0 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM3DAT1 + * Offset: 0x234 WHC RX Message Channel 3 Data 1 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM3DAT2 + * Offset: 0x238 WHC RX Message Channel 3 Data 2 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + * @var WHC_T::RM3DAT3 + * Offset: 0x23C WHC RX Message Channel 3 Data 3 Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |DATA |RX Message Data + * | | |This field contains the RX message data field + * | | |Receiver should only read these registers while ready bit in RXSTS register is 1 + * | | |Otherwise, the receiver can read unpredictable data. + */ + __IO uint32_t WKCTL; /*!< [0x0000] WHC Wakeup Event Control Register */ + __IO uint32_t INTEN; /*!< [0x0004] WHC Interrupt Enable Register */ + __IO uint32_t INTSTS; /*!< [0x0008] WHC Interrupt Status Register */ + __I uint32_t RESERVE0[13]; + __IO uint32_t CPSTS; /*!< [0x0040] WHC Counterpart Status Register */ + __I uint32_t RESERVE1[15]; + __O uint32_t GINTTRG; /*!< [0x0080] WHC General Interrupt Trigger Register */ + __I uint32_t RESERVE2[15]; + __O uint32_t TXCTL; /*!< [0x00c0] WHC TX Message Control Register */ + __I uint32_t TXSTS; /*!< [0x00c4] WHC TX Message Status Register */ + __O uint32_t RXCTL; /*!< [0x00c8] WHC RX Message Control Register */ + __I uint32_t RXSTS; /*!< [0x00cc] WHC RX Message Status Register */ + __I uint32_t RESERVE3[12]; + __O uint32_t TMDAT[4][4]; /*!< [0x0100~0x013C] WHC TX Message Data Register */ + __I uint32_t RESERVE4[48]; + __I uint32_t RMDAT[4][4]; /*!< [0x0200~0x023C] WHC RX Message Data Register */ +} WHC_T; + +/** + @addtogroup WHC_CONST WHC Bit Field Definition + Constant Definitions for WHC Controller +@{ */ + +#define WHC_WKCTL_RST0WKEN_Pos (0) /*!< WHC_T::WKCTL: RST0WKEN Position */ +#define WHC_WKCTL_RST0WKEN_Msk (0x1ul << WHC_WKCTL_RST0WKEN_Pos) /*!< WHC_T::WKCTL: RST0WKEN Mask */ + +#define WHC_WKCTL_POFF0WKEN_Pos (1) /*!< WHC_T::WKCTL: POFF0WKEN Position */ +#define WHC_WKCTL_POFF0WKEN_Msk (0x1ul << WHC_WKCTL_POFF0WKEN_Pos) /*!< WHC_T::WKCTL: POFF0WKEN Mask */ + +#define WHC_WKCTL_PD0WKEN_Pos (2) /*!< WHC_T::WKCTL: PD0WKEN Position */ +#define WHC_WKCTL_PD0WKEN_Msk (0x1ul << WHC_WKCTL_PD0WKEN_Pos) /*!< WHC_T::WKCTL: PD0WKEN Mask */ + +#define WHC_WKCTL_RST1WKEN_Pos (3) /*!< WHC_T::WKCTL: RST1WKEN Position */ +#define WHC_WKCTL_RST1WKEN_Msk (0x1ul << WHC_WKCTL_RST1WKEN_Pos) /*!< WHC_T::WKCTL: RST1WKEN Mask */ + +#define WHC_WKCTL_POFF1WKEN_Pos (4) /*!< WHC_T::WKCTL: POFF1WKEN Position */ +#define WHC_WKCTL_POFF1WKEN_Msk (0x1ul << WHC_WKCTL_POFF1WKEN_Pos) /*!< WHC_T::WKCTL: POFF1WKEN Mask */ + +#define WHC_WKCTL_PD1WKEN_Pos (5) /*!< WHC_T::WKCTL: PD1WKEN Position */ +#define WHC_WKCTL_PD1WKEN_Msk (0x1ul << WHC_WKCTL_PD1WKEN_Pos) /*!< WHC_T::WKCTL: PD1WKEN Mask */ + +#define WHC_WKCTL_GI0WKEN_Pos (8) /*!< WHC_T::WKCTL: GI0WKEN Position */ +#define WHC_WKCTL_GI0WKEN_Msk (0x1ul << WHC_WKCTL_GI0WKEN_Pos) /*!< WHC_T::WKCTL: GI0WKEN Mask */ + +#define WHC_WKCTL_GI1WKEN_Pos (9) /*!< WHC_T::WKCTL: GI1WKEN Position */ +#define WHC_WKCTL_GI1WKEN_Msk (0x1ul << WHC_WKCTL_GI1WKEN_Pos) /*!< WHC_T::WKCTL: GI1WKEN Mask */ + +#define WHC_WKCTL_GI2WKEN_Pos (10) /*!< WHC_T::WKCTL: GI2WKEN Position */ +#define WHC_WKCTL_GI2WKEN_Msk (0x1ul << WHC_WKCTL_GI2WKEN_Pos) /*!< WHC_T::WKCTL: GI2WKEN Mask */ + +#define WHC_WKCTL_GI3WKEN_Pos (11) /*!< WHC_T::WKCTL: GI3WKEN Position */ +#define WHC_WKCTL_GI3WKEN_Msk (0x1ul << WHC_WKCTL_GI3WKEN_Pos) /*!< WHC_T::WKCTL: GI3WKEN Mask */ + +#define WHC_WKCTL_TX0WKEN_Pos (16) /*!< WHC_T::WKCTL: TX0WKEN Position */ +#define WHC_WKCTL_TX0WKEN_Msk (0x1ul << WHC_WKCTL_TX0WKEN_Pos) /*!< WHC_T::WKCTL: TX0WKEN Mask */ + +#define WHC_WKCTL_TX1WKEN_Pos (17) /*!< WHC_T::WKCTL: TX1WKEN Position */ +#define WHC_WKCTL_TX1WKEN_Msk (0x1ul << WHC_WKCTL_TX1WKEN_Pos) /*!< WHC_T::WKCTL: TX1WKEN Mask */ + +#define WHC_WKCTL_TX2WKEN_Pos (18) /*!< WHC_T::WKCTL: TX2WKEN Position */ +#define WHC_WKCTL_TX2WKEN_Msk (0x1ul << WHC_WKCTL_TX2WKEN_Pos) /*!< WHC_T::WKCTL: TX2WKEN Mask */ + +#define WHC_WKCTL_TX3WKEN_Pos (19) /*!< WHC_T::WKCTL: TX3WKEN Position */ +#define WHC_WKCTL_TX3WKEN_Msk (0x1ul << WHC_WKCTL_TX3WKEN_Pos) /*!< WHC_T::WKCTL: TX3WKEN Mask */ + +#define WHC_WKCTL_RX0WKEN_Pos (24) /*!< WHC_T::WKCTL: RX0WKEN Position */ +#define WHC_WKCTL_RX0WKEN_Msk (0x1ul << WHC_WKCTL_RX0WKEN_Pos) /*!< WHC_T::WKCTL: RX0WKEN Mask */ + +#define WHC_WKCTL_RX1WKEN_Pos (25) /*!< WHC_T::WKCTL: RX1WKEN Position */ +#define WHC_WKCTL_RX1WKEN_Msk (0x1ul << WHC_WKCTL_RX1WKEN_Pos) /*!< WHC_T::WKCTL: RX1WKEN Mask */ + +#define WHC_WKCTL_RX2WKEN_Pos (26) /*!< WHC_T::WKCTL: RX2WKEN Position */ +#define WHC_WKCTL_RX2WKEN_Msk (0x1ul << WHC_WKCTL_RX2WKEN_Pos) /*!< WHC_T::WKCTL: RX2WKEN Mask */ + +#define WHC_WKCTL_RX3WKEN_Pos (27) /*!< WHC_T::WKCTL: RX3WKEN Position */ +#define WHC_WKCTL_RX3WKEN_Msk (0x1ul << WHC_WKCTL_RX3WKEN_Pos) /*!< WHC_T::WKCTL: RX3WKEN Mask */ + +#define WHC_INTEN_RST0IEN_Pos (0) /*!< WHC_T::INTEN: RST0IEN Position */ +#define WHC_INTEN_RST0IEN_Msk (0x1ul << WHC_INTEN_RST0IEN_Pos) /*!< WHC_T::INTEN: RST0IEN Mask */ + +#define WHC_INTEN_POFF0IEN_Pos (1) /*!< WHC_T::INTEN: POFF0IEN Position */ +#define WHC_INTEN_POFF0IEN_Msk (0x1ul << WHC_INTEN_POFF0IEN_Pos) /*!< WHC_T::INTEN: POFF0IEN Mask */ + +#define WHC_INTEN_PD0IEN_Pos (2) /*!< WHC_T::INTEN: PD0IEN Position */ +#define WHC_INTEN_PD0IEN_Msk (0x1ul << WHC_INTEN_PD0IEN_Pos) /*!< WHC_T::INTEN: PD0IEN Mask */ + +#define WHC_INTEN_RST1IEN_Pos (3) /*!< WHC_T::INTEN: RST1IEN Position */ +#define WHC_INTEN_RST1IEN_Msk (0x1ul << WHC_INTEN_RST1IEN_Pos) /*!< WHC_T::INTEN: RST1IEN Mask */ + +#define WHC_INTEN_POFF1IEN_Pos (4) /*!< WHC_T::INTEN: POFF1IEN Position */ +#define WHC_INTEN_POFF1IEN_Msk (0x1ul << WHC_INTEN_POFF1IEN_Pos) /*!< WHC_T::INTEN: POFF1IEN Mask */ + +#define WHC_INTEN_PD1IEN_Pos (5) /*!< WHC_T::INTEN: PD1IEN Position */ +#define WHC_INTEN_PD1IEN_Msk (0x1ul << WHC_INTEN_PD1IEN_Pos) /*!< WHC_T::INTEN: PD1IEN Mask */ + +#define WHC_INTEN_GI0IEN_Pos (8) /*!< WHC_T::INTEN: GI0IEN Position */ +#define WHC_INTEN_GI0IEN_Msk (0x1ul << WHC_INTEN_GI0IEN_Pos) /*!< WHC_T::INTEN: GI0IEN Mask */ + +#define WHC_INTEN_GI1IEN_Pos (9) /*!< WHC_T::INTEN: GI1IEN Position */ +#define WHC_INTEN_GI1IEN_Msk (0x1ul << WHC_INTEN_GI1IEN_Pos) /*!< WHC_T::INTEN: GI1IEN Mask */ + +#define WHC_INTEN_GI2IEN_Pos (10) /*!< WHC_T::INTEN: GI2IEN Position */ +#define WHC_INTEN_GI2IEN_Msk (0x1ul << WHC_INTEN_GI2IEN_Pos) /*!< WHC_T::INTEN: GI2IEN Mask */ + +#define WHC_INTEN_GI3IEN_Pos (11) /*!< WHC_T::INTEN: GI3IEN Position */ +#define WHC_INTEN_GI3IEN_Msk (0x1ul << WHC_INTEN_GI3IEN_Pos) /*!< WHC_T::INTEN: GI3IEN Mask */ + +#define WHC_INTEN_TX0IEN_Pos (16) /*!< WHC_T::INTEN: TX0IEN Position */ +#define WHC_INTEN_TX0IEN_Msk (0x1ul << WHC_INTEN_TX0IEN_Pos) /*!< WHC_T::INTEN: TX0IEN Mask */ + +#define WHC_INTEN_TX1IEN_Pos (17) /*!< WHC_T::INTEN: TX1IEN Position */ +#define WHC_INTEN_TX1IEN_Msk (0x1ul << WHC_INTEN_TX1IEN_Pos) /*!< WHC_T::INTEN: TX1IEN Mask */ + +#define WHC_INTEN_TX2IEN_Pos (18) /*!< WHC_T::INTEN: TX2IEN Position */ +#define WHC_INTEN_TX2IEN_Msk (0x1ul << WHC_INTEN_TX2IEN_Pos) /*!< WHC_T::INTEN: TX2IEN Mask */ + +#define WHC_INTEN_TX3IEN_Pos (19) /*!< WHC_T::INTEN: TX3IEN Position */ +#define WHC_INTEN_TX3IEN_Msk (0x1ul << WHC_INTEN_TX3IEN_Pos) /*!< WHC_T::INTEN: TX3IEN Mask */ + +#define WHC_INTEN_RX0IEN_Pos (24) /*!< WHC_T::INTEN: RX0IEN Position */ +#define WHC_INTEN_RX0IEN_Msk (0x1ul << WHC_INTEN_RX0IEN_Pos) /*!< WHC_T::INTEN: RX0IEN Mask */ + +#define WHC_INTEN_RX1IEN_Pos (25) /*!< WHC_T::INTEN: RX1IEN Position */ +#define WHC_INTEN_RX1IEN_Msk (0x1ul << WHC_INTEN_RX1IEN_Pos) /*!< WHC_T::INTEN: RX1IEN Mask */ + +#define WHC_INTEN_RX2IEN_Pos (26) /*!< WHC_T::INTEN: RX2IEN Position */ +#define WHC_INTEN_RX2IEN_Msk (0x1ul << WHC_INTEN_RX2IEN_Pos) /*!< WHC_T::INTEN: RX2IEN Mask */ + +#define WHC_INTEN_RX3IEN_Pos (27) /*!< WHC_T::INTEN: RX3IEN Position */ +#define WHC_INTEN_RX3IEN_Msk (0x1ul << WHC_INTEN_RX3IEN_Pos) /*!< WHC_T::INTEN: RX3IEN Mask */ + +#define WHC_INTSTS_RST0IF_Pos (0) /*!< WHC_T::INTSTS: RST0IF Position */ +#define WHC_INTSTS_RST0IF_Msk (0x1ul << WHC_INTSTS_RST0IF_Pos) /*!< WHC_T::INTSTS: RST0IF Mask */ + +#define WHC_INTSTS_POFF0IF_Pos (1) /*!< WHC_T::INTSTS: POFF0IF Position */ +#define WHC_INTSTS_POFF0IF_Msk (0x1ul << WHC_INTSTS_POFF0IF_Pos) /*!< WHC_T::INTSTS: POFF0IF Mask */ + +#define WHC_INTSTS_PD0IF_Pos (2) /*!< WHC_T::INTSTS: PD0IF Position */ +#define WHC_INTSTS_PD0IF_Msk (0x1ul << WHC_INTSTS_PD0IF_Pos) /*!< WHC_T::INTSTS: PD0IF Mask */ + +#define WHC_INTSTS_RST1IF_Pos (3) /*!< WHC_T::INTSTS: RST1IF Position */ +#define WHC_INTSTS_RST1IF_Msk (0x1ul << WHC_INTSTS_RST1IF_Pos) /*!< WHC_T::INTSTS: RST1IF Mask */ + +#define WHC_INTSTS_POFF1IF_Pos (4) /*!< WHC_T::INTSTS: POFF1IF Position */ +#define WHC_INTSTS_POFF1IF_Msk (0x1ul << WHC_INTSTS_POFF1IF_Pos) /*!< WHC_T::INTSTS: POFF1IF Mask */ + +#define WHC_INTSTS_PD1IF_Pos (5) /*!< WHC_T::INTSTS: PD1IF Position */ +#define WHC_INTSTS_PD1IF_Msk (0x1ul << WHC_INTSTS_PD1IF_Pos) /*!< WHC_T::INTSTS: PD1IF Mask */ + +#define WHC_INTSTS_GI0IF_Pos (8) /*!< WHC_T::INTSTS: GI0IF Position */ +#define WHC_INTSTS_GI0IF_Msk (0x1ul << WHC_INTSTS_GI0IF_Pos) /*!< WHC_T::INTSTS: GI0IF Mask */ + +#define WHC_INTSTS_GI1IF_Pos (9) /*!< WHC_T::INTSTS: GI1IF Position */ +#define WHC_INTSTS_GI1IF_Msk (0x1ul << WHC_INTSTS_GI1IF_Pos) /*!< WHC_T::INTSTS: GI1IF Mask */ + +#define WHC_INTSTS_GI2IF_Pos (10) /*!< WHC_T::INTSTS: GI2IF Position */ +#define WHC_INTSTS_GI2IF_Msk (0x1ul << WHC_INTSTS_GI2IF_Pos) /*!< WHC_T::INTSTS: GI2IF Mask */ + +#define WHC_INTSTS_GI3IF_Pos (11) /*!< WHC_T::INTSTS: GI3IF Position */ +#define WHC_INTSTS_GI3IF_Msk (0x1ul << WHC_INTSTS_GI3IF_Pos) /*!< WHC_T::INTSTS: GI3IF Mask */ + +#define WHC_INTSTS_TX0IF_Pos (16) /*!< WHC_T::INTSTS: TX0IF Position */ +#define WHC_INTSTS_TX0IF_Msk (0x1ul << WHC_INTSTS_TX0IF_Pos) /*!< WHC_T::INTSTS: TX0IF Mask */ + +#define WHC_INTSTS_TX1IF_Pos (17) /*!< WHC_T::INTSTS: TX1IF Position */ +#define WHC_INTSTS_TX1IF_Msk (0x1ul << WHC_INTSTS_TX1IF_Pos) /*!< WHC_T::INTSTS: TX1IF Mask */ + +#define WHC_INTSTS_TX2IF_Pos (18) /*!< WHC_T::INTSTS: TX2IF Position */ +#define WHC_INTSTS_TX2IF_Msk (0x1ul << WHC_INTSTS_TX2IF_Pos) /*!< WHC_T::INTSTS: TX2IF Mask */ + +#define WHC_INTSTS_TX3IF_Pos (19) /*!< WHC_T::INTSTS: TX3IF Position */ +#define WHC_INTSTS_TX3IF_Msk (0x1ul << WHC_INTSTS_TX3IF_Pos) /*!< WHC_T::INTSTS: TX3IF Mask */ + +#define WHC_INTSTS_RX0IF_Pos (24) /*!< WHC_T::INTSTS: RX0IF Position */ +#define WHC_INTSTS_RX0IF_Msk (0x1ul << WHC_INTSTS_RX0IF_Pos) /*!< WHC_T::INTSTS: RX0IF Mask */ + +#define WHC_INTSTS_RX1IF_Pos (25) /*!< WHC_T::INTSTS: RX1IF Position */ +#define WHC_INTSTS_RX1IF_Msk (0x1ul << WHC_INTSTS_RX1IF_Pos) /*!< WHC_T::INTSTS: RX1IF Mask */ + +#define WHC_INTSTS_RX2IF_Pos (26) /*!< WHC_T::INTSTS: RX2IF Position */ +#define WHC_INTSTS_RX2IF_Msk (0x1ul << WHC_INTSTS_RX2IF_Pos) /*!< WHC_T::INTSTS: RX2IF Mask */ + +#define WHC_INTSTS_RX3IF_Pos (27) /*!< WHC_T::INTSTS: RX3IF Position */ +#define WHC_INTSTS_RX3IF_Msk (0x1ul << WHC_INTSTS_RX3IF_Pos) /*!< WHC_T::INTSTS: RX3IF Mask */ + +#define WHC_CPSTS_WDTRF_Pos (2) /*!< WHC_T::CPSTS: WDTRF Position */ +#define WHC_CPSTS_WDTRF_Msk (0x1ul << WHC_CPSTS_WDTRF_Pos) /*!< WHC_T::CPSTS: WDTRF Mask */ + +#define WHC_CPSTS_SYSRF_Pos (5) /*!< WHC_T::CPSTS: SYSRF Position */ +#define WHC_CPSTS_SYSRF_Msk (0x1ul << WHC_CPSTS_SYSRF_Pos) /*!< WHC_T::CPSTS: SYSRF Mask */ + +#define WHC_CPSTS_CPURF_Pos (7) /*!< WHC_T::CPSTS: CPURF Position */ +#define WHC_CPSTS_CPURF_Msk (0x1ul << WHC_CPSTS_CPURF_Pos) /*!< WHC_T::CPSTS: CPURF Mask */ + +#define WHC_CPSTS_CPULKRF_Pos (8) /*!< WHC_T::CPSTS: CPULKRF Position */ +#define WHC_CPSTS_CPULKRF_Msk (0x1ul << WHC_CPSTS_CPULKRF_Pos) /*!< WHC_T::CPSTS: CPULKRF Mask */ + +#define WHC_CPSTS_OPMODE0_Pos (24) /*!< WHC_T::CPSTS: OPMODE0 Position */ +#define WHC_CPSTS_OPMODE0_Msk (0xful << WHC_CPSTS_OPMODE0_Pos) /*!< WHC_T::CPSTS: OPMODE0 Mask */ + +#define WHC_CPSTS_OPMODE1_Pos (28) /*!< WHC_T::CPSTS: OPMODE1 Position */ +#define WHC_CPSTS_OPMODE1_Msk (0xful << WHC_CPSTS_OPMODE1_Pos) /*!< WHC_T::CPSTS: OPMODE1 Mask */ + +#define WHC_GINTTRG_TRGGI0_Pos (0) /*!< WHC_T::GINTTRG: TRGGI0 Position */ +#define WHC_GINTTRG_TRGGI0_Msk (0x1ul << WHC_GINTTRG_TRGGI0_Pos) /*!< WHC_T::GINTTRG: TRGGI0 Mask */ + +#define WHC_GINTTRG_TRGGI1_Pos (1) /*!< WHC_T::GINTTRG: TRGGI1 Position */ +#define WHC_GINTTRG_TRGGI1_Msk (0x1ul << WHC_GINTTRG_TRGGI1_Pos) /*!< WHC_T::GINTTRG: TRGGI1 Mask */ + +#define WHC_GINTTRG_TRGGI2_Pos (2) /*!< WHC_T::GINTTRG: TRGGI2 Position */ +#define WHC_GINTTRG_TRGGI2_Msk (0x1ul << WHC_GINTTRG_TRGGI2_Pos) /*!< WHC_T::GINTTRG: TRGGI2 Mask */ + +#define WHC_GINTTRG_TRGGI3_Pos (3) /*!< WHC_T::GINTTRG: TRGGI3 Position */ +#define WHC_GINTTRG_TRGGI3_Msk (0x1ul << WHC_GINTTRG_TRGGI3_Pos) /*!< WHC_T::GINTTRG: TRGGI3 Mask */ + +#define WHC_TXCTL_CH0SND_Pos (0) /*!< WHC_T::TXCTL: CH0SND Position */ +#define WHC_TXCTL_CH0SND_Msk (0x1ul << WHC_TXCTL_CH0SND_Pos) /*!< WHC_T::TXCTL: CH0SND Mask */ + +#define WHC_TXCTL_CH1SND_Pos (1) /*!< WHC_T::TXCTL: CH1SND Position */ +#define WHC_TXCTL_CH1SND_Msk (0x1ul << WHC_TXCTL_CH1SND_Pos) /*!< WHC_T::TXCTL: CH1SND Mask */ + +#define WHC_TXCTL_CH2SND_Pos (2) /*!< WHC_T::TXCTL: CH2SND Position */ +#define WHC_TXCTL_CH2SND_Msk (0x1ul << WHC_TXCTL_CH2SND_Pos) /*!< WHC_T::TXCTL: CH2SND Mask */ + +#define WHC_TXCTL_CH3SND_Pos (3) /*!< WHC_T::TXCTL: CH3SND Position */ +#define WHC_TXCTL_CH3SND_Msk (0x1ul << WHC_TXCTL_CH3SND_Pos) /*!< WHC_T::TXCTL: CH3SND Mask */ + +#define WHC_TXCTL_CH0RC_Pos (16) /*!< WHC_T::TXCTL: CH0RC Position */ +#define WHC_TXCTL_CH0RC_Msk (0x1ul << WHC_TXCTL_CH0RC_Pos) /*!< WHC_T::TXCTL: CH0RC Mask */ + +#define WHC_TXCTL_CH1RC_Pos (17) /*!< WHC_T::TXCTL: CH1RC Position */ +#define WHC_TXCTL_CH1RC_Msk (0x1ul << WHC_TXCTL_CH1RC_Pos) /*!< WHC_T::TXCTL: CH1RC Mask */ + +#define WHC_TXCTL_CH2RC_Pos (18) /*!< WHC_T::TXCTL: CH2RC Position */ +#define WHC_TXCTL_CH2RC_Msk (0x1ul << WHC_TXCTL_CH2RC_Pos) /*!< WHC_T::TXCTL: CH2RC Mask */ + +#define WHC_TXCTL_CH3RC_Pos (19) /*!< WHC_T::TXCTL: CH3RC Position */ +#define WHC_TXCTL_CH3RC_Msk (0x1ul << WHC_TXCTL_CH3RC_Pos) /*!< WHC_T::TXCTL: CH3RC Mask */ + +#define WHC_TXSTS_CH0RDY_Pos (0) /*!< WHC_T::TXSTS: CH0RDY Position */ +#define WHC_TXSTS_CH0RDY_Msk (0x1ul << WHC_TXSTS_CH0RDY_Pos) /*!< WHC_T::TXSTS: CH0RDY Mask */ + +#define WHC_TXSTS_CH1RDY_Pos (1) /*!< WHC_T::TXSTS: CH1RDY Position */ +#define WHC_TXSTS_CH1RDY_Msk (0x1ul << WHC_TXSTS_CH1RDY_Pos) /*!< WHC_T::TXSTS: CH1RDY Mask */ + +#define WHC_TXSTS_CH2RDY_Pos (2) /*!< WHC_T::TXSTS: CH2RDY Position */ +#define WHC_TXSTS_CH2RDY_Msk (0x1ul << WHC_TXSTS_CH2RDY_Pos) /*!< WHC_T::TXSTS: CH2RDY Mask */ + +#define WHC_TXSTS_CH3RDY_Pos (3) /*!< WHC_T::TXSTS: CH3RDY Position */ +#define WHC_TXSTS_CH3RDY_Msk (0x1ul << WHC_TXSTS_CH3RDY_Pos) /*!< WHC_T::TXSTS: CH3RDY Mask */ + +#define WHC_RXCTL_CH0ACK_Pos (0) /*!< WHC_T::RXCTL: CH0ACK Position */ +#define WHC_RXCTL_CH0ACK_Msk (0x1ul << WHC_RXCTL_CH0ACK_Pos) /*!< WHC_T::RXCTL: CH0ACK Mask */ + +#define WHC_RXCTL_CH1ACK_Pos (1) /*!< WHC_T::RXCTL: CH1ACK Position */ +#define WHC_RXCTL_CH1ACK_Msk (0x1ul << WHC_RXCTL_CH1ACK_Pos) /*!< WHC_T::RXCTL: CH1ACK Mask */ + +#define WHC_RXCTL_CH2ACK_Pos (2) /*!< WHC_T::RXCTL: CH2ACK Position */ +#define WHC_RXCTL_CH2ACK_Msk (0x1ul << WHC_RXCTL_CH2ACK_Pos) /*!< WHC_T::RXCTL: CH2ACK Mask */ + +#define WHC_RXCTL_CH3ACK_Pos (3) /*!< WHC_T::RXCTL: CH3ACK Position */ +#define WHC_RXCTL_CH3ACK_Msk (0x1ul << WHC_RXCTL_CH3ACK_Pos) /*!< WHC_T::RXCTL: CH3ACK Mask */ + +#define WHC_RXSTS_CH0RDY_Pos (0) /*!< WHC_T::RXSTS: CH0RDY Position */ +#define WHC_RXSTS_CH0RDY_Msk (0x1ul << WHC_RXSTS_CH0RDY_Pos) /*!< WHC_T::RXSTS: CH0RDY Mask */ + +#define WHC_RXSTS_CH1RDY_Pos (1) /*!< WHC_T::RXSTS: CH1RDY Position */ +#define WHC_RXSTS_CH1RDY_Msk (0x1ul << WHC_RXSTS_CH1RDY_Pos) /*!< WHC_T::RXSTS: CH1RDY Mask */ + +#define WHC_RXSTS_CH2RDY_Pos (2) /*!< WHC_T::RXSTS: CH2RDY Position */ +#define WHC_RXSTS_CH2RDY_Msk (0x1ul << WHC_RXSTS_CH2RDY_Pos) /*!< WHC_T::RXSTS: CH2RDY Mask */ + +#define WHC_RXSTS_CH3RDY_Pos (3) /*!< WHC_T::RXSTS: CH3RDY Position */ +#define WHC_RXSTS_CH3RDY_Msk (0x1ul << WHC_RXSTS_CH3RDY_Pos) /*!< WHC_T::RXSTS: CH3RDY Mask */ + +#define WHC_TMDAT_DAT_Pos (0) /*!< WHC_T::TMDAT: DATA Position */ +#define WHC_TMDAT_DAT_Msk (0xfffffffful << WHC_TMDAT_DAT_Pos) /*!< WHC_T::TMDAT: DATA Mask */ + +#define WHC_RMDAT_DAT_Pos (0) /*!< WHC_T::RMDAT: DATA Position */ +#define WHC_RMDAT_DAT_Msk (0xfffffffful << WHC_RMDAT_DAT_Pos) /*!< WHC_T::RMDAT: DATA Mask */ + +/**@}*/ /* WHC_CONST */ +/**@}*/ /* end of WHC register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __WHC_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/wwdt_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/wwdt_reg.h new file mode 100644 index 0000000000..d87c7e534e --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/wwdt_reg.h @@ -0,0 +1,147 @@ +/**************************************************************************//** + * @file wwdt_reg.h + * @brief WWDT register definition header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __WWDT_REG_H__ +#define __WWDT_REG_H__ + +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + +/** + @addtogroup REGISTER Control Register + @{ +*/ + +/** + @addtogroup WWDT Window Watchdog Timer(WWDT) + Memory Mapped Structure for WWDT Controller +@{ */ + +typedef struct +{ + + + /** + * @var WWDT_T::RLDCNT + * Offset: 0x00 WWDT Reload Counter Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[31:0] |RLDCNT |WWDT Reload Counter Register + * | | |Writing 0x00005AA5 to this register will reload the WWDT counter value to 0x3F. + * | | |Note: User can only write WWDT_RLDCNT register to reload WWDT counter value when current WWDT counter value between 0 and CMPDAT (WWDT_CTL[21:16]) + * | | |If user writes WWDT_RLDCNT when current WWDT counter value is larger than CMPDAT, WWDT reset signal will be generated. + * @var WWDT_T::CTL + * Offset: 0x04 WWDT Control Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WWDTEN |WWDT Enable Bit + * | | |0 = WWDT counter is stopped. + * | | |1 = WWDT counter starts counting. + * |[1] |INTEN |WWDT Interrupt Enable Bit + * | | |If this bit is enabled, the WWDT counter compare match interrupt signal is generated and inform to CPU. + * | | |0 = WWDT counter compare match interrupt Disabled. + * | | |1 = WWDT counter compare match interrupt Enabled. + * |[11:8] |PSCSEL |WWDT Counter Prescale Period Selection + * | | |0000 = Pre-scale is 1; Max time-out period is 1 * 64 * WWDT_CLK. + * | | |0001 = Pre-scale is 2; Max time-out period is 2 * 64 * WWDT_CLK. + * | | |0010 = Pre-scale is 4; Max time-out period is 4 * 64 * WWDT_CLK. + * | | |0011 = Pre-scale is 8; Max time-out period is 8 * 64 * WWDT_CLK. + * | | |0100 = Pre-scale is 16; Max time-out period is 16 * 64 * WWDT_CLK. + * | | |0101 = Pre-scale is 32; Max time-out period is 32 * 64 * WWDT_CLK. + * | | |0110 = Pre-scale is 64; Max time-out period is 64 * 64 * WWDT_CLK. + * | | |0111 = Pre-scale is 128; Max time-out period is 128 * 64 * WWDT_CLK. + * | | |1000 = Pre-scale is 192; Max time-out period is 192 * 64 * WWDT_CLK. + * | | |1001 = Pre-scale is 256; Max time-out period is 256 * 64 * WWDT_CLK. + * | | |1010 = Pre-scale is 384; Max time-out period is 384 * 64 * WWDT_CLK. + * | | |1011 = Pre-scale is 512; Max time-out period is 512 * 64 * WWDT_CLK. + * | | |1100 = Pre-scale is 768; Max time-out period is 768 * 64 * WWDT_CLK. + * | | |1101 = Pre-scale is 1024; Max time-out period is 1024 * 64 * WWDT_CLK. + * | | |1110 = Pre-scale is 1536; Max time-out period is 1536 * 64 * WWDT_CLK. + * | | |1111 = Pre-scale is 2048; Max time-out period is 2048 * 64 * WWDT_CLK. + * |[21:16] |CMPDAT |WWDT Window Compare Register + * | | |Set this register to adjust the valid reload window. + * | | |Note: User can only write WWDT_RLDCNT register to reload WWDT counter value when current WWDT counter value between 0 and CMPDAT + * | | |If user writes WWDT_RLDCNT register when current WWDT counter value larger than CMPDAT, WWDT reset signal will generate. + * |[31] |ICEDEBUG |ICE Debug Mode Acknowledge Disable Bit + * | | |0 = ICE debug mode acknowledgement effects WWDT counting. + * | | |WWDT down counter will be held while CPU is held by ICE. + * | | |1 = ICE debug mode acknowledgement Disabled. + * | | |Note: WWDT down counter will keep going no matter CPU is held by ICE or not. + * @var WWDT_T::STATUS + * Offset: 0x08 WWDT Status Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[0] |WWDTIF |WWDT Compare Match Interrupt Flag + * | | |This bit indicates the interrupt flag status of WWDT while WWDT counter value matches CMPDAT (WWDT_CTL[21:16]). + * | | |0 = No effect. + * | | |1 = WWDT counter value matches CMPDAT. + * | | |Note: This bit is cleared by writing 1 to it. + * |[1] |WWDTRF |WWDT Timer-out Reset Flag + * | | |This bit indicates the system has been reset by WWDT time-out reset or not. + * | | |0 = WWDT time-out reset did not occur. + * | | |1 = WWDT time-out reset occurred. + * | | |Note: This bit is cleared by writing 1 to it. + * @var WWDT_T::CNT + * Offset: 0x0C WWDT Counter Value Register + * --------------------------------------------------------------------------------------------------- + * |Bits |Field |Descriptions + * | :----: | :----: | :---- | + * |[5:0] |CNTDAT |WWDT Counter Value + * | | |CNTDAT will be updated continuously to monitor 6-bit WWDT down counter value. + */ + __O uint32_t RLDCNT; /*!< [0x0000] WWDT Reload Counter Register */ + __IO uint32_t CTL; /*!< [0x0004] WWDT Control Register */ + __IO uint32_t STATUS; /*!< [0x0008] WWDT Status Register */ + __I uint32_t CNT; /*!< [0x000c] WWDT Counter Value Register */ + +} WWDT_T; + +/** + @addtogroup WWDT_CONST WWDT Bit Field Definition + Constant Definitions for WWDT Controller +@{ */ + +#define WWDT_RLDCNT_RLDCNT_Pos (0) /*!< WWDT_T::RLDCNT: RLDCNT Position */ +#define WWDT_RLDCNT_RLDCNT_Msk (0xfffffffful << WWDT_RLDCNT_RLDCNT_Pos) /*!< WWDT_T::RLDCNT: RLDCNT Mask */ + +#define WWDT_CTL_WWDTEN_Pos (0) /*!< WWDT_T::CTL: WWDTEN Position */ +#define WWDT_CTL_WWDTEN_Msk (0x1ul << WWDT_CTL_WWDTEN_Pos) /*!< WWDT_T::CTL: WWDTEN Mask */ + +#define WWDT_CTL_INTEN_Pos (1) /*!< WWDT_T::CTL: INTEN Position */ +#define WWDT_CTL_INTEN_Msk (0x1ul << WWDT_CTL_INTEN_Pos) /*!< WWDT_T::CTL: INTEN Mask */ + +#define WWDT_CTL_PSCSEL_Pos (8) /*!< WWDT_T::CTL: PSCSEL Position */ +#define WWDT_CTL_PSCSEL_Msk (0xful << WWDT_CTL_PSCSEL_Pos) /*!< WWDT_T::CTL: PSCSEL Mask */ + +#define WWDT_CTL_CMPDAT_Pos (16) /*!< WWDT_T::CTL: CMPDAT Position */ +#define WWDT_CTL_CMPDAT_Msk (0x3ful << WWDT_CTL_CMPDAT_Pos) /*!< WWDT_T::CTL: CMPDAT Mask */ + +#define WWDT_CTL_ICEDEBUG_Pos (31) /*!< WWDT_T::CTL: ICEDEBUG Position */ +#define WWDT_CTL_ICEDEBUG_Msk (0x1ul << WWDT_CTL_ICEDEBUG_Pos) /*!< WWDT_T::CTL: ICEDEBUG Mask */ + +#define WWDT_STATUS_WWDTIF_Pos (0) /*!< WWDT_T::STATUS: WWDTIF Position */ +#define WWDT_STATUS_WWDTIF_Msk (0x1ul << WWDT_STATUS_WWDTIF_Pos) /*!< WWDT_T::STATUS: WWDTIF Mask */ + +#define WWDT_STATUS_WWDTRF_Pos (1) /*!< WWDT_T::STATUS: WWDTRF Position */ +#define WWDT_STATUS_WWDTRF_Msk (0x1ul << WWDT_STATUS_WWDTRF_Pos) /*!< WWDT_T::STATUS: WWDTRF Mask */ + +#define WWDT_CNT_CNTDAT_Pos (0) /*!< WWDT_T::CNT: CNTDAT Position */ +#define WWDT_CNT_CNTDAT_Msk (0x3ful << WWDT_CNT_CNTDAT_Pos) /*!< WWDT_T::CNT: CNTDAT Mask */ + +/**@}*/ /* WWDT_CONST */ +/**@}*/ /* end of WWDT register group */ +/**@}*/ /* end of REGISTER group */ + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __WWDT_REG_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/ARM/startup_ma35d1_subm.s b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/ARM/startup_ma35d1_subm.s new file mode 100644 index 0000000000..a8e1659dff --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/ARM/startup_ma35d1_subm.s @@ -0,0 +1,488 @@ +;/****************************************************************************** +; * @file startup_ma35d1_subm.s +; * @brief CMSIS Cortex-M4 Core Device Startup File +; * +; * SPDX-License-Identifier: Apache-2.0 +; * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +;*****************************************************************************/ +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + + IF :LNOT: :DEF: Stack_Size +Stack_Size EQU 0x00001000 + ENDIF + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size + EXPORT __initial_sp +__initial_sp + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + + IF :LNOT: :DEF: Heap_Size +Heap_Size EQU 0x00000100 + ENDIF + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + 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 + DCD LVD_IRQHandler ; 0 + DCD Default_Handler ; 1 + DCD PWRWU_IRQHandler ; 2 + DCD HWSEM0_IRQHandler ; 3 + DCD CKFAIL_IRQHandler ; 4 + DCD WHC0_IRQHandler ; 5 + DCD RTC_IRQHandler ; 6 + DCD TAMPER_IRQHandler ; 7 + DCD WDT2_IRQHandler ; 8 + DCD WWDT2_IRQHandler ; 9 + DCD EINT0_IRQHandler ; 10 + DCD EINT1_IRQHandler ; 11 + DCD EINT2_IRQHandler ; 12 + DCD EINT3_IRQHandler ; 13 + DCD Default_Handler ; 14 + DCD Default_Handler ; 15 + DCD GPA_IRQHandler ; 16 + DCD GPB_IRQHandler ; 17 + DCD GPC_IRQHandler ; 18 + DCD GPD_IRQHandler ; 19 + DCD Default_Handler ; 20 + DCD Default_Handler ; 21 + DCD TMR2_IRQHandler ; 22 + DCD TMR3_IRQHandler ; 23 + DCD BRAKE0_IRQHandler ; 24 + DCD EPWM0P0_IRQHandler ; 25 + DCD EPWM0P1_IRQHandler ; 26 + DCD EPWM0P2_IRQHandler ; 27 + DCD QEI0_IRQHandler ; 28 + DCD ECAP0_IRQHandler ; 29 + DCD Default_Handler ; 30 + DCD QSPI1_IRQHandler ; 31 + DCD Default_Handler ; 32 + DCD Default_Handler ; 33 + DCD Default_Handler ; 34 + DCD UART1_IRQHandler ; 35 + DCD UART2_IRQHandler ; 36 + DCD UART3_IRQHandler ; 37 + DCD UART4_IRQHandler ; 38 + DCD UART5_IRQHandler ; 39 + DCD EADC00_IRQHandler ; 40 + DCD EADC01_IRQHandler ; 41 + DCD EADC02_IRQHandler ; 42 + DCD EADC03_IRQHandler ; 43 + DCD Default_Handler ; 44 + DCD I2C1_IRQHandler ; 45 + DCD I2S0_IRQHandler ; 46 + DCD CANFD00_IRQHandler ; 47 + DCD SC0_IRQHandler ; 48 + DCD GPE_IRQHandler ; 49 + DCD GPF_IRQHandler ; 50 + DCD GPG_IRQHandler ; 51 + DCD GPH_IRQHandler ; 52 + DCD GPI_IRQHandler ; 53 + DCD GPJ_IRQHandler ; 54 + DCD TMR4_IRQHandler ; 55 + DCD TMR5_IRQHandler ; 56 + DCD TMR6_IRQHandler ; 57 + DCD TMR7_IRQHandler ; 58 + DCD BRAKE1_IRQHandler ; 59 + DCD EPWM1P0_IRQHandler ; 60 + DCD EPWM1P1_IRQHandler ; 61 + DCD EPWM1P2_IRQHandler ; 62 + DCD QEI1_IRQHandler ; 63 + DCD ECAP1_IRQHandler ; 64 + DCD SPI0_IRQHandler ; 65 + DCD SPI1_IRQHandler ; 66 + DCD PDMA2_IRQHandler ; 67 + DCD PDMA3_IRQHandler ; 68 + DCD UART6_IRQHandler ; 69 + DCD UART7_IRQHandler ; 70 + DCD UART8_IRQHandler ; 71 + DCD UART9_IRQHandler ; 72 + DCD UART10_IRQHandler ; 73 + DCD UART11_IRQHandler ; 74 + DCD I2C2_IRQHandler ; 75 + DCD I2C3_IRQHandler ; 76 + DCD I2S1_IRQHandler ; 77 + DCD CANFD10_IRQHandler ; 78 + DCD SC1_IRQHandler ; 79 + DCD GPK_IRQHandler ; 80 + DCD GPL_IRQHandler ; 81 + DCD GPM_IRQHandler ; 82 + DCD GPN_IRQHandler ; 83 + DCD TMR8_IRQHandler ; 84 + DCD TMR9_IRQHandler ; 85 + DCD TMR10_IRQHandler ; 86 + DCD TMR11_IRQHandler ; 87 + DCD BRAKE2_IRQHandler ; 88 + DCD EPWM2P0_IRQHandle ; 89 + DCD EPWM2P1_IRQHandle ; 90 + DCD EPWM2P2_IRQHandle ; 91 + DCD QEI2_IRQHandler ; 92 + DCD ECAP2_IRQHandler ; 93 + DCD SPI2_IRQHandler ; 94 + DCD SPI3_IRQHandler ; 95 + DCD UART12_IRQHandler ; 96 + DCD UART13_IRQHandler ; 97 + DCD UART14_IRQHandler ; 98 + DCD UART15_IRQHandler ; 99 + DCD UART16_IRQHandler ; 100 + DCD I2C4_IRQHandler ; 101 + DCD I2C5_IRQHandler ; 102 + DCD CANFD20_IRQHandler ; 103 + DCD CANFD30_IRQHandler ; 104 + DCD KPI_IRQHandler ; 105 + DCD CANFD01_IRQHandler ; 106 + DCD CANFD11_IRQHandler ; 107 + DCD CANFD21_IRQHandler ; 108 + DCD CANFD31_IRQHandler ; 109 + DCD ADC0_IRQHandler ; 110 +__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 + + LDR R0, =SystemInit + BLX R0 + + LDR R0, =__main + BX R0 + + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +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 + + EXPORT LVD_IRQHandler [WEAK] + EXPORT PWRWU_IRQHandler [WEAK] + EXPORT HWSEM0_IRQHandler [WEAK] + EXPORT CKFAIL_IRQHandler [WEAK] + EXPORT WHC0_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT WDT2_IRQHandler [WEAK] + EXPORT WWDT2_IRQHandler [WEAK] + EXPORT EINT0_IRQHandler [WEAK] + EXPORT EINT1_IRQHandler [WEAK] + EXPORT EINT2_IRQHandler [WEAK] + EXPORT EINT3_IRQHandler [WEAK] + EXPORT GPA_IRQHandler [WEAK] + EXPORT GPB_IRQHandler [WEAK] + EXPORT GPC_IRQHandler [WEAK] + EXPORT GPD_IRQHandler [WEAK] + EXPORT TMR2_IRQHandler [WEAK] + EXPORT TMR3_IRQHandler [WEAK] + EXPORT BRAKE0_IRQHandler [WEAK] + EXPORT EPWM0P0_IRQHandler [WEAK] + EXPORT EPWM0P1_IRQHandler [WEAK] + EXPORT EPWM0P2_IRQHandler [WEAK] + EXPORT QEI0_IRQHandler [WEAK] + EXPORT ECAP0_IRQHandler [WEAK] + EXPORT QSPI1_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT UART5_IRQHandler [WEAK] + EXPORT EADC00_IRQHandler [WEAK] + EXPORT EADC01_IRQHandler [WEAK] + EXPORT EADC02_IRQHandler [WEAK] + EXPORT EADC03_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT I2S0_IRQHandler [WEAK] + EXPORT CANFD00_IRQHandler [WEAK] + EXPORT SC0_IRQHandler [WEAK] + EXPORT GPE_IRQHandler [WEAK] + EXPORT GPF_IRQHandler [WEAK] + EXPORT GPG_IRQHandler [WEAK] + EXPORT GPH_IRQHandler [WEAK] + EXPORT GPI_IRQHandler [WEAK] + EXPORT GPJ_IRQHandler [WEAK] + EXPORT TMR4_IRQHandler [WEAK] + EXPORT TMR5_IRQHandler [WEAK] + EXPORT TMR6_IRQHandler [WEAK] + EXPORT TMR7_IRQHandler [WEAK] + EXPORT BRAKE1_IRQHandler [WEAK] + EXPORT EPWM1P0_IRQHandler [WEAK] + EXPORT EPWM1P1_IRQHandler [WEAK] + EXPORT EPWM1P2_IRQHandler [WEAK] + EXPORT QEI1_IRQHandler [WEAK] + EXPORT ECAP1_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT PDMA2_IRQHandler [WEAK] + EXPORT PDMA3_IRQHandler [WEAK] + EXPORT UART6_IRQHandler [WEAK] + EXPORT UART7_IRQHandler [WEAK] + EXPORT UART8_IRQHandler [WEAK] + EXPORT UART9_IRQHandler [WEAK] + EXPORT UART10_IRQHandler [WEAK] + EXPORT UART11_IRQHandler [WEAK] + EXPORT I2C2_IRQHandler [WEAK] + EXPORT I2C3_IRQHandler [WEAK] + EXPORT I2S1_IRQHandler [WEAK] + EXPORT CANFD10_IRQHandler [WEAK] + EXPORT SC1_IRQHandler [WEAK] + EXPORT GPK_IRQHandler [WEAK] + EXPORT GPL_IRQHandler [WEAK] + EXPORT GPM_IRQHandler [WEAK] + EXPORT GPN_IRQHandler [WEAK] + EXPORT TMR8_IRQHandler [WEAK] + EXPORT TMR9_IRQHandler [WEAK] + EXPORT TMR10_IRQHandler [WEAK] + EXPORT TMR11_IRQHandler [WEAK] + EXPORT BRAKE2_IRQHandler [WEAK] + EXPORT EPWM2P0_IRQHandle [WEAK] + EXPORT EPWM2P1_IRQHandle [WEAK] + EXPORT EPWM2P2_IRQHandle [WEAK] + EXPORT QEI2_IRQHandler [WEAK] + EXPORT ECAP2_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT UART12_IRQHandler [WEAK] + EXPORT UART13_IRQHandler [WEAK] + EXPORT UART14_IRQHandler [WEAK] + EXPORT UART15_IRQHandler [WEAK] + EXPORT UART16_IRQHandler [WEAK] + EXPORT I2C4_IRQHandler [WEAK] + EXPORT I2C5_IRQHandler [WEAK] + EXPORT CANFD20_IRQHandler [WEAK] + EXPORT CANFD30_IRQHandler [WEAK] + EXPORT KPI_IRQHandler [WEAK] + EXPORT CANFD01_IRQHandler [WEAK] + EXPORT CANFD11_IRQHandler [WEAK] + EXPORT CANFD21_IRQHandler [WEAK] + EXPORT CANFD31_IRQHandler [WEAK] + EXPORT ADC0_IRQHandler [WEAK] + +LVD_IRQHandler +PWRWU_IRQHandler +HWSEM0_IRQHandler +CKFAIL_IRQHandler +WHC0_IRQHandler +RTC_IRQHandler +TAMPER_IRQHandler +WDT2_IRQHandler +WWDT2_IRQHandler +EINT0_IRQHandler +EINT1_IRQHandler +EINT2_IRQHandler +EINT3_IRQHandler +GPA_IRQHandler +GPB_IRQHandler +GPC_IRQHandler +GPD_IRQHandler +TMR2_IRQHandler +TMR3_IRQHandler +BRAKE0_IRQHandler +EPWM0P0_IRQHandler +EPWM0P1_IRQHandler +EPWM0P2_IRQHandler +QEI0_IRQHandler +ECAP0_IRQHandler +QSPI1_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +UART5_IRQHandler +EADC00_IRQHandler +EADC01_IRQHandler +EADC02_IRQHandler +EADC03_IRQHandler +I2C1_IRQHandler +I2S0_IRQHandler +CANFD00_IRQHandler +SC0_IRQHandler +GPE_IRQHandler +GPF_IRQHandler +GPG_IRQHandler +GPH_IRQHandler +GPI_IRQHandler +GPJ_IRQHandler +TMR4_IRQHandler +TMR5_IRQHandler +TMR6_IRQHandler +TMR7_IRQHandler +BRAKE1_IRQHandler +EPWM1P0_IRQHandler +EPWM1P1_IRQHandler +EPWM1P2_IRQHandler +QEI1_IRQHandler +ECAP1_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +PDMA2_IRQHandler +PDMA3_IRQHandler +UART6_IRQHandler +UART7_IRQHandler +UART8_IRQHandler +UART9_IRQHandler +UART10_IRQHandler +UART11_IRQHandler +I2C2_IRQHandler +I2C3_IRQHandler +I2S1_IRQHandler +CANFD10_IRQHandler +SC1_IRQHandler +GPK_IRQHandler +GPL_IRQHandler +GPM_IRQHandler +GPN_IRQHandler +TMR8_IRQHandler +TMR9_IRQHandler +TMR10_IRQHandler +TMR11_IRQHandler +BRAKE2_IRQHandler +EPWM2P0_IRQHandle +EPWM2P1_IRQHandle +EPWM2P2_IRQHandle +QEI2_IRQHandler +ECAP2_IRQHandler +SPI2_IRQHandler +SPI3_IRQHandler +UART12_IRQHandler +UART13_IRQHandler +UART14_IRQHandler +UART15_IRQHandler +UART16_IRQHandler +I2C4_IRQHandler +I2C5_IRQHandler +CANFD20_IRQHandler +CANFD30_IRQHandler +KPI_IRQHandler +CANFD01_IRQHandler +CANFD11_IRQHandler +CANFD21_IRQHandler +CANFD31_IRQHandler +ADC0_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/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/GCC/startup_ma35d1_subm.S b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/GCC/startup_ma35d1_subm.S new file mode 100644 index 0000000000..c6fdf676f3 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/GCC/startup_ma35d1_subm.S @@ -0,0 +1,352 @@ +/****************************************************************************//** + * @file startup_ma35d1_subm.S + * @brief CMSIS Cortex-M4 Core Device Startup File + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + .syntax unified + .cpu cortex-m4 + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the application's entry point.*/ + bl entry + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M4. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + +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 */ + .word LVD_IRQHandler /* 0 */ + .word 0 /* 1 */ + .word PWRWU_IRQHandler /* 2 */ + .word HWSEM0_IRQHandler /* 3 */ + .word CKFAIL_IRQHandler /* 4 */ + .word WHC0_IRQHandler /* 5 */ + .word RTC_IRQHandler /* 6 */ + .word TAMPER_IRQHandler /* 7 */ + .word WDT2_IRQHandler /* 8 */ + .word WWDT2_IRQHandler /* 9 */ + .word EINT0_IRQHandler /* 10 */ + .word EINT1_IRQHandler /* 11 */ + .word EINT2_IRQHandler /* 12 */ + .word EINT3_IRQHandler /* 13 */ + .word 0 /* 14 */ + .word 0 /* 15 */ + .word GPA_IRQHandler /* 16 */ + .word GPB_IRQHandler /* 17 */ + .word GPC_IRQHandler /* 18 */ + .word GPD_IRQHandler /* 19 */ + .word 0 /* 20 */ + .word 0 /* 21 */ + .word TMR2_IRQHandler /* 22 */ + .word TMR3_IRQHandler /* 23 */ + .word BRAKE0_IRQHandler /* 24 */ + .word EPWM0P0_IRQHandler /* 25 */ + .word EPWM0P1_IRQHandler /* 26 */ + .word EPWM0P2_IRQHandler /* 27 */ + .word QEI0_IRQHandler /* 28 */ + .word ECAP0_IRQHandler /* 29 */ + .word 0 /* 30 */ + .word QSPI1_IRQHandler /* 31 */ + .word 0 /* 32 */ + .word 0 /* 33 */ + .word 0 /* 34 */ + .word UART1_IRQHandler /* 35 */ + .word UART2_IRQHandler /* 36 */ + .word UART3_IRQHandler /* 37 */ + .word UART4_IRQHandler /* 38 */ + .word UART5_IRQHandler /* 39 */ + .word EADC00_IRQHandler /* 40 */ + .word EADC01_IRQHandler /* 41 */ + .word EADC02_IRQHandler /* 42 */ + .word EADC03_IRQHandler /* 43 */ + .word 0 /* 44 */ + .word I2C1_IRQHandler /* 45 */ + .word I2S0_IRQHandler /* 46 */ + .word MCAN00_IRQHandler /* 47 */ + .word SC0_IRQHandler /* 48 */ + .word GPE_IRQHandler /* 49 */ + .word GPF_IRQHandler /* 50 */ + .word GPG_IRQHandler /* 51 */ + .word GPH_IRQHandler /* 52 */ + .word GPI_IRQHandler /* 53 */ + .word GPJ_IRQHandler /* 54 */ + .word TMR4_IRQHandler /* 55 */ + .word TMR5_IRQHandler /* 56 */ + .word TMR6_IRQHandler /* 57 */ + .word TMR7_IRQHandler /* 58 */ + .word BRAKE1_IRQHandler /* 59 */ + .word EPWM1P0_IRQHandler /* 60 */ + .word EPWM1P1_IRQHandler /* 61 */ + .word EPWM1P2_IRQHandler /* 62 */ + .word QEI1_IRQHandler /* 63 */ + .word ECAP1_IRQHandler /* 64 */ + .word SPI0_IRQHandler /* 65 */ + .word SPI1_IRQHandler /* 66 */ + .word PDMA2_IRQHandler /* 67 */ + .word PDMA3_IRQHandler /* 68 */ + .word UART6_IRQHandler /* 69 */ + .word UART7_IRQHandler /* 70 */ + .word UART8_IRQHandler /* 71 */ + .word UART9_IRQHandler /* 72 */ + .word UART10_IRQHandler /* 73 */ + .word UART11_IRQHandler /* 74 */ + .word I2C2_IRQHandler /* 75 */ + .word I2C3_IRQHandler /* 76 */ + .word I2S1_IRQHandler /* 77 */ + .word MACN10_IRQHandler /* 78 */ + .word SC1_IRQHandler /* 79 */ + .word GPK_IRQHandler /* 80 */ + .word GPL_IRQHandler /* 81 */ + .word GPM_IRQHandler /* 82 */ + .word GPN_IRQHandler /* 83 */ + .word TMR8_IRQHandler /* 84 */ + .word TMR9_IRQHandler /* 85 */ + .word TMR10_IRQHandler /* 86 */ + .word TMR11_IRQHandler /* 87 */ + .word BRAKE2_IRQHandler /* 88 */ + .word EPWM2P0_IRQHandler /* 89 */ + .word EPWM2P1_IRQHandler /* 90 */ + .word EPWM2P2_IRQHandler /* 91 */ + .word QEI2_IRQHandler /* 92 */ + .word ECAP2_IRQHandler /* 93 */ + .word SPI2_IRQHandler /* 94 */ + .word SPI3_IRQHandler /* 95 */ + .word UART12_IRQHandler /* 96 */ + .word UART13_IRQHandler /* 97 */ + .word UART14_IRQHandler /* 98 */ + .word UART15_IRQHandler /* 99 */ + .word UART16_IRQHandler /* 100 */ + .word I2C4_IRQHandler /* 101 */ + .word I2C5_IRQHandler /* 102 */ + .word MCAN20_IRQHandler /* 103 */ + .word MCAN30_IRQHandler /* 104 */ + .word KPI_IRQHandler /* 105 */ + .word MCAN01_IRQHandler /* 106 */ + .word MCAN11_IRQHandler /* 107 */ + .word MCAN21_IRQHandler /* 108 */ + .word MCAN31_IRQHandler /* 109 */ + .word ADC0_IRQHandler /* 110 */ + + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler LVD_IRQHandler + def_irq_handler PWRWU_IRQHandler + def_irq_handler HWSEM0_IRQHandler + def_irq_handler CKFAIL_IRQHandler + def_irq_handler WHC0_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler TAMPER_IRQHandler + def_irq_handler WDT2_IRQHandler + def_irq_handler WWDT2_IRQHandler + def_irq_handler EINT0_IRQHandler + def_irq_handler EINT1_IRQHandler + def_irq_handler EINT2_IRQHandler + def_irq_handler EINT3_IRQHandler + def_irq_handler GPA_IRQHandler + def_irq_handler GPB_IRQHandler + def_irq_handler GPC_IRQHandler + def_irq_handler GPD_IRQHandler + def_irq_handler TMR2_IRQHandler + def_irq_handler TMR3_IRQHandler + def_irq_handler BRAKE0_IRQHandler + def_irq_handler EPWM0P0_IRQHandler + def_irq_handler EPWM0P1_IRQHandler + def_irq_handler EPWM0P2_IRQHandler + def_irq_handler QEI0_IRQHandler + def_irq_handler ECAP0_IRQHandler + def_irq_handler QSPI1_IRQHandler + def_irq_handler UART1_IRQHandler + def_irq_handler UART2_IRQHandler + def_irq_handler UART3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler UART5_IRQHandler + def_irq_handler EADC00_IRQHandler + def_irq_handler EADC01_IRQHandler + def_irq_handler EADC02_IRQHandler + def_irq_handler EADC03_IRQHandler + def_irq_handler I2C1_IRQHandler + def_irq_handler I2S0_IRQHandler + def_irq_handler MCAN00_IRQHandler + def_irq_handler SC0_IRQHandler + def_irq_handler GPE_IRQHandler + def_irq_handler GPF_IRQHandler + def_irq_handler GPG_IRQHandler + def_irq_handler GPH_IRQHandler + def_irq_handler GPI_IRQHandler + def_irq_handler GPJ_IRQHandler + def_irq_handler TMR4_IRQHandler + def_irq_handler TMR5_IRQHandler + def_irq_handler TMR6_IRQHandler + def_irq_handler TMR7_IRQHandler + def_irq_handler BRAKE1_IRQHandler + def_irq_handler EPWM1P0_IRQHandler + def_irq_handler EPWM1P1_IRQHandler + def_irq_handler EPWM1P2_IRQHandler + def_irq_handler QEI1_IRQHandler + def_irq_handler ECAP1_IRQHandler + def_irq_handler SPI0_IRQHandler + def_irq_handler SPI1_IRQHandler + def_irq_handler PDMA2_IRQHandler + def_irq_handler PDMA3_IRQHandler + def_irq_handler UART6_IRQHandler + def_irq_handler UART7_IRQHandler + def_irq_handler UART8_IRQHandler + def_irq_handler UART9_IRQHandler + def_irq_handler UART10_IRQHandler + def_irq_handler UART11_IRQHandler + def_irq_handler I2C2_IRQHandler + def_irq_handler I2C3_IRQHandler + def_irq_handler I2S1_IRQHandler + def_irq_handler MACN10_IRQHandler + def_irq_handler SC1_IRQHandler + def_irq_handler GPK_IRQHandler + def_irq_handler GPL_IRQHandler + def_irq_handler GPM_IRQHandler + def_irq_handler GPN_IRQHandler + def_irq_handler TMR8_IRQHandler + def_irq_handler TMR9_IRQHandler + def_irq_handler TMR10_IRQHandler + def_irq_handler TMR11_IRQHandler + def_irq_handler BRAKE2_IRQHandler + def_irq_handler EPWM2P0_IRQHandler + def_irq_handler EPWM2P1_IRQHandler + def_irq_handler EPWM2P2_IRQHandler + def_irq_handler QEI2_IRQHandler + def_irq_handler ECAP2_IRQHandler + def_irq_handler SPI2_IRQHandler + def_irq_handler SPI3_IRQHandler + def_irq_handler UART12_IRQHandler + def_irq_handler UART13_IRQHandler + def_irq_handler UART14_IRQHandler + def_irq_handler UART15_IRQHandler + def_irq_handler UART16_IRQHandler + def_irq_handler I2C4_IRQHandler + def_irq_handler I2C5_IRQHandler + def_irq_handler MCAN20_IRQHandler + def_irq_handler MCAN30_IRQHandler + def_irq_handler KPI_IRQHandler + def_irq_handler MCAN01_IRQHandler + def_irq_handler MCAN11_IRQHandler + def_irq_handler MCAN21_IRQHandler + def_irq_handler MCAN31_IRQHandler + def_irq_handler ADC0_IRQHandler + .end diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/IAR/startup_ma35d1_subm.s b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/IAR/startup_ma35d1_subm.s new file mode 100644 index 0000000000..486e6fa384 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/IAR/startup_ma35d1_subm.s @@ -0,0 +1,430 @@ +;/****************************************************************************** +; * @file startup_subm.s +; * @brief CMSIS Cortex-M4 Core Device Startup File +; * +; * SPDX-License-Identifier: Apache-2.0 +; * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +;*****************************************************************************/ + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN HardFault_Handler + EXTERN SystemInit + PUBLIC __vector_table + PUBLIC __vector_table_0x1c + PUBLIC __Vectors + PUBLIC __Vectors_End + PUBLIC __Vectors_Size + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler + + DCD NMI_Handler + DCD HardFault_Handler + DCD MemManage_Handler + DCD BusFault_Handler + DCD UsageFault_Handler +__vector_table_0x1c + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD DebugMon_Handler + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + + ; External Interrupts + DCD LVD_IRQHandler ; 0 + DCD Default_Handler ; 1 + DCD PWRWU_IRQHandler ; 2 + DCD HWSEM0_IRQHandler ; 3 + DCD CKFAIL_IRQHandler ; 4 + DCD WHC0_IRQHandler ; 5 + DCD RTC_IRQHandler ; 6 + DCD TAMPER_IRQHandler ; 7 + DCD WDT2_IRQHandler ; 8 + DCD WWDT2_IRQHandler ; 9 + DCD EINT0_IRQHandler ; 10 + DCD EINT1_IRQHandler ; 11 + DCD EINT2_IRQHandler ; 12 + DCD EINT3_IRQHandler ; 13 + DCD Default_Handler ; 14 + DCD Default_Handler ; 15 + DCD GPA_IRQHandler ; 16 + DCD GPB_IRQHandler ; 17 + DCD GPC_IRQHandler ; 18 + DCD GPD_IRQHandler ; 19 + DCD Default_Handler ; 20 + DCD Default_Handler ; 21 + DCD TMR2_IRQHandler ; 22 + DCD TMR3_IRQHandler ; 23 + DCD BRAKE0_IRQHandler ; 24 + DCD EPWM0P0_IRQHandler ; 25 + DCD EPWM0P1_IRQHandler ; 26 + DCD EPWM0P2_IRQHandler ; 27 + DCD QEI0_IRQHandler ; 28 + DCD ECAP0_IRQHandler ; 29 + DCD Default_Handler ; 30 + DCD QSPI1_IRQHandler ; 31 + DCD Default_Handler ; 32 + DCD Default_Handler ; 33 + DCD Default_Handler ; 34 + DCD UART1_IRQHandler ; 35 + DCD UART2_IRQHandler ; 36 + DCD UART3_IRQHandler ; 37 + DCD UART4_IRQHandler ; 38 + DCD UART5_IRQHandler ; 39 + DCD EADC00_IRQHandler ; 40 + DCD EADC01_IRQHandler ; 41 + DCD EADC02_IRQHandler ; 42 + DCD EADC03_IRQHandler ; 43 + DCD Default_Handler ; 44 + DCD I2C1_IRQHandler ; 45 + DCD I2S0_IRQHandler ; 46 + DCD MCAN00_IRQHandler ; 47 + DCD SC0_IRQHandler ; 48 + DCD GPE_IRQHandler ; 49 + DCD GPF_IRQHandler ; 50 + DCD GPG_IRQHandler ; 51 + DCD GPH_IRQHandler ; 52 + DCD GPI_IRQHandler ; 53 + DCD GPJ_IRQHandler ; 54 + DCD TMR4_IRQHandler ; 55 + DCD TMR5_IRQHandler ; 56 + DCD TMR6_IRQHandler ; 57 + DCD TMR7_IRQHandler ; 58 + DCD BRAKE1_IRQHandler ; 59 + DCD EPWM1P0_IRQHandler ; 60 + DCD EPWM1P1_IRQHandler ; 61 + DCD EPWM1P2_IRQHandler ; 62 + DCD QEI1_IRQHandler ; 63 + DCD ECAP1_IRQHandler ; 64 + DCD SPI0_IRQHandler ; 65 + DCD SPI1_IRQHandler ; 66 + DCD PDMA2_IRQHandler ; 67 + DCD PDMA3_IRQHandler ; 68 + DCD UART6_IRQHandler ; 69 + DCD UART7_IRQHandler ; 70 + DCD UART8_IRQHandler ; 71 + DCD UART9_IRQHandler ; 72 + DCD UART10_IRQHandler ; 73 + DCD UART11_IRQHandler ; 74 + DCD I2C2_IRQHandler ; 75 + DCD I2C3_IRQHandler ; 76 + DCD I2S1_IRQHandler ; 77 + DCD MACN10_IRQHandler ; 78 + DCD SC1_IRQHandler ; 79 + DCD GPK_IRQHandler ; 80 + DCD GPL_IRQHandler ; 81 + DCD GPM_IRQHandler ; 82 + DCD GPN_IRQHandler ; 83 + DCD TMR8_IRQHandler ; 84 + DCD TMR9_IRQHandler ; 85 + DCD TMR10_IRQHandler ; 86 + DCD TMR11_IRQHandler ; 87 + DCD BRAKE2_IRQHandler ; 88 + DCD EPWM2P0_IRQHandle ; 89 + DCD EPWM2P1_IRQHandle ; 90 + DCD EPWM2P2_IRQHandle ; 91 + DCD QEI2_IRQHandler ; 92 + DCD ECAP2_IRQHandler ; 93 + DCD SPI2_IRQHandler ; 94 + DCD SPI3_IRQHandler ; 95 + DCD UART12_IRQHandler ; 96 + DCD UART13_IRQHandler ; 97 + DCD UART14_IRQHandler ; 98 + DCD UART15_IRQHandler ; 99 + DCD UART16_IRQHandler ; 100 + DCD I2C4_IRQHandler ; 101 + DCD I2C5_IRQHandler ; 102 + DCD MCAN20_IRQHandler ; 103 + DCD MCAN30_IRQHandler ; 104 + DCD KPI_IRQHandler ; 105 + DCD MCAN01_IRQHandler ; 106 + DCD MCAN11_IRQHandler ; 107 + DCD MCAN21_IRQHandler ; 108 + DCD MCAN31_IRQHandler ; 109 + DCD ADC0_IRQHandler ; 110 +__Vectors_End + +__Vectors EQU __vector_table +__Vectors_Size EQU __Vectors_End - __Vectors + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Reset_Handler + + LDR R0, =SystemInit + BLX R0 + + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler + B NMI_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK LVD_IRQHandler + PUBWEAK PWRWU_IRQHandler + PUBWEAK HWSEM0_IRQHandler + PUBWEAK CKFAIL_IRQHandler + PUBWEAK WHC0_IRQHandler + PUBWEAK RTC_IRQHandler + PUBWEAK TAMPER_IRQHandler + PUBWEAK WDT2_IRQHandler + PUBWEAK WWDT2_IRQHandler + PUBWEAK EINT0_IRQHandler + PUBWEAK EINT1_IRQHandler + PUBWEAK EINT2_IRQHandler + PUBWEAK EINT3_IRQHandler + PUBWEAK GPA_IRQHandler + PUBWEAK GPB_IRQHandler + PUBWEAK GPC_IRQHandler + PUBWEAK GPD_IRQHandler + PUBWEAK TMR2_IRQHandler + PUBWEAK TMR3_IRQHandler + PUBWEAK BRAKE0_IRQHandler + PUBWEAK EPWM0P0_IRQHandler + PUBWEAK EPWM0P1_IRQHandler + PUBWEAK EPWM0P2_IRQHandler + PUBWEAK QEI0_IRQHandler + PUBWEAK ECAP0_IRQHandler + PUBWEAK QSPI1_IRQHandler + PUBWEAK UART1_IRQHandler + PUBWEAK UART2_IRQHandler + PUBWEAK UART3_IRQHandler + PUBWEAK UART4_IRQHandler + PUBWEAK UART5_IRQHandler + PUBWEAK EADC00_IRQHandler + PUBWEAK EADC01_IRQHandler + PUBWEAK EADC02_IRQHandler + PUBWEAK EADC03_IRQHandler + PUBWEAK I2C1_IRQHandler + PUBWEAK I2S0_IRQHandler + PUBWEAK MCAN00_IRQHandler + PUBWEAK SC0_IRQHandler + PUBWEAK GPE_IRQHandler + PUBWEAK GPF_IRQHandler + PUBWEAK GPG_IRQHandler + PUBWEAK GPH_IRQHandler + PUBWEAK GPI_IRQHandler + PUBWEAK GPJ_IRQHandler + PUBWEAK TMR4_IRQHandler + PUBWEAK TMR5_IRQHandler + PUBWEAK TMR6_IRQHandler + PUBWEAK TMR7_IRQHandler + PUBWEAK BRAKE1_IRQHandler + PUBWEAK EPWM1P0_IRQHandler + PUBWEAK EPWM1P1_IRQHandler + PUBWEAK EPWM1P2_IRQHandler + PUBWEAK QEI1_IRQHandler + PUBWEAK ECAP1_IRQHandler + PUBWEAK SPI0_IRQHandler + PUBWEAK SPI1_IRQHandler + PUBWEAK PDMA2_IRQHandler + PUBWEAK PDMA3_IRQHandler + PUBWEAK UART6_IRQHandler + PUBWEAK UART7_IRQHandler + PUBWEAK UART8_IRQHandler + PUBWEAK UART9_IRQHandler + PUBWEAK UART10_IRQHandler + PUBWEAK UART11_IRQHandler + PUBWEAK I2C2_IRQHandler + PUBWEAK I2C3_IRQHandler + PUBWEAK I2S1_IRQHandler + PUBWEAK MACN10_IRQHandler + PUBWEAK SC1_IRQHandler + PUBWEAK GPK_IRQHandler + PUBWEAK GPL_IRQHandler + PUBWEAK GPM_IRQHandler + PUBWEAK GPN_IRQHandler + PUBWEAK TMR8_IRQHandler + PUBWEAK TMR9_IRQHandler + PUBWEAK TMR10_IRQHandler + PUBWEAK TMR11_IRQHandler + PUBWEAK BRAKE2_IRQHandler + PUBWEAK EPWM2P0_IRQHandle + PUBWEAK EPWM2P1_IRQHandle + PUBWEAK EPWM2P2_IRQHandle + PUBWEAK QEI2_IRQHandler + PUBWEAK ECAP2_IRQHandler + PUBWEAK SPI2_IRQHandler + PUBWEAK SPI3_IRQHandler + PUBWEAK UART12_IRQHandler + PUBWEAK UART13_IRQHandler + PUBWEAK UART14_IRQHandler + PUBWEAK UART15_IRQHandler + PUBWEAK UART16_IRQHandler + PUBWEAK I2C4_IRQHandler + PUBWEAK I2C5_IRQHandler + PUBWEAK MCAN20_IRQHandler + PUBWEAK MCAN30_IRQHandler + PUBWEAK KPI_IRQHandler + PUBWEAK MCAN01_IRQHandler + PUBWEAK MCAN11_IRQHandler + PUBWEAK MCAN21_IRQHandler + PUBWEAK MCAN31_IRQHandler + PUBWEAK ADC0_IRQHandler + + SECTION .text:CODE:REORDER:NOROOT(1) + +LVD_IRQHandler +PWRWU_IRQHandler +HWSEM0_IRQHandler +CKFAIL_IRQHandler +WHC0_IRQHandler +RTC_IRQHandler +TAMPER_IRQHandler +WDT2_IRQHandler +WWDT2_IRQHandler +EINT0_IRQHandler +EINT1_IRQHandler +EINT2_IRQHandler +EINT3_IRQHandler +GPA_IRQHandler +GPB_IRQHandler +GPC_IRQHandler +GPD_IRQHandler +TMR2_IRQHandler +TMR3_IRQHandler +BRAKE0_IRQHandler +EPWM0P0_IRQHandler +EPWM0P1_IRQHandler +EPWM0P2_IRQHandler +QEI0_IRQHandler +ECAP0_IRQHandler +QSPI1_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +UART5_IRQHandler +EADC00_IRQHandler +EADC01_IRQHandler +EADC02_IRQHandler +EADC03_IRQHandler +I2C1_IRQHandler +I2S0_IRQHandler +MCAN00_IRQHandler +SC0_IRQHandler +GPE_IRQHandler +GPF_IRQHandler +GPG_IRQHandler +GPH_IRQHandler +GPI_IRQHandler +GPJ_IRQHandler +TMR4_IRQHandler +TMR5_IRQHandler +TMR6_IRQHandler +TMR7_IRQHandler +BRAKE1_IRQHandler +EPWM1P0_IRQHandler +EPWM1P1_IRQHandler +EPWM1P2_IRQHandler +QEI1_IRQHandler +ECAP1_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +PDMA2_IRQHandler +PDMA3_IRQHandler +UART6_IRQHandler +UART7_IRQHandler +UART8_IRQHandler +UART9_IRQHandler +UART10_IRQHandler +UART11_IRQHandler +I2C2_IRQHandler +I2C3_IRQHandler +I2S1_IRQHandler +MACN10_IRQHandler +SC1_IRQHandler +GPK_IRQHandler +GPL_IRQHandler +GPM_IRQHandler +GPN_IRQHandler +TMR8_IRQHandler +TMR9_IRQHandler +TMR10_IRQHandler +TMR11_IRQHandler +BRAKE2_IRQHandler +EPWM2P0_IRQHandle +EPWM2P1_IRQHandle +EPWM2P2_IRQHandle +QEI2_IRQHandler +ECAP2_IRQHandler +SPI2_IRQHandler +SPI3_IRQHandler +UART12_IRQHandler +UART13_IRQHandler +UART14_IRQHandler +UART15_IRQHandler +UART16_IRQHandler +I2C4_IRQHandler +I2C5_IRQHandler +MCAN20_IRQHandler +MCAN30_IRQHandler +KPI_IRQHandler +MCAN01_IRQHandler +MCAN11_IRQHandler +MCAN21_IRQHandler +MCAN31_IRQHandler +ADC0_IRQHandler +Default_Handler + B Default_Handler + + END + diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/system_ma35d1_subm.c b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/system_ma35d1_subm.c new file mode 100644 index 0000000000..1e27bee553 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Source/system_ma35d1_subm.c @@ -0,0 +1,67 @@ +/**************************************************************************//** + * @file startup_subm.c + * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Source File + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#include "NuMicro.h" + + +/*---------------------------------------------------------------------------- + DEFINES + *----------------------------------------------------------------------------*/ + + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = __SYSTEM_CLOCK; /*!< System Clock Frequency (Core Clock)*/ +uint32_t CyclesPerUs = (__HSI / 1000000UL); /* Cycles per micro second */ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate(void) /* Get Core Clock Frequency */ +{ + + /* Update System Core Clock */ + SystemCoreClock = 180000000; + CyclesPerUs = (SystemCoreClock + 500000UL) / 1000000UL; + +} + +/** + * @brief Set PF.2 and PF.3 to input mode + * @param None + * @return None + * @details GPIO default state could be configured as input or quasi through user config. + * To use HXT, PF.2 and PF.3 must not set as quasi mode. This function changes + * PF.2 and PF.3 to input mode no matter which mode they are working at. + */ + + +/** + * @brief Initialize the System + * + * @param none + * @return none + */ +void SystemInit(void) +{ + /* Add your system initialize code here. + Do not use global variables because this function is called before + reaching pre-main. RW section maybe overwritten afterwards. */ + + + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) + SCB->CPACR |= ((3UL << 10 * 2) | /* set CP10 Full Access */ + (3UL << 11 * 2)); /* set CP11 Full Access */ +#endif + + +} + diff --git a/bsp/nuvoton/libraries/ma35/Device/SConscript b/bsp/nuvoton/libraries/ma35/Device/SConscript new file mode 100644 index 0000000000..dadef0e3b0 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/Device/SConscript @@ -0,0 +1,22 @@ +import rtconfig +Import('RTT_ROOT') +from building import * + +# get current directory +cwd = GetCurrentDir() +src = [] + +if GetDepend('USE_MA35D1_SUBM'): + src += ['Nuvoton/MA35D1/Source/system_ma35d1_subm.c'] + if rtconfig.CROSS_TOOL == 'gcc': + src = src + ['Nuvoton/MA35D1/Source/GCC/startup_ma35d1_subm.S'] + elif rtconfig.CROSS_TOOL == 'keil': + src = src + ['Nuvoton/MA35D1/Source/ARM/startup_ma35d1_subm.s'] + elif rtconfig.CROSS_TOOL == 'iar': + src = src + ['Nuvoton/MA35D1/Source/IAR/startup_ma35d1_subm.s'] + +path = [cwd + '/Nuvoton/MA35D1/Include',] + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path) + +Return('group') diff --git a/bsp/nuvoton/libraries/ma35/README.md b/bsp/nuvoton/libraries/ma35/README.md new file mode 100644 index 0000000000..2d80b4c86b --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/README.md @@ -0,0 +1,38 @@ +# MA35 Series + +## MA35D1 Series Supported drivers + +| Peripheral | rt_device_class_type | Device name | +| ------ | ---- | :------: | +| ADC_TOUCH | RT_Device_Class_Touch | ***adc_touch*** | +| CANFD | RT_Device_Class_CAN | ***canfd[0-3]*** | +| CCAP | RT_Device_Class_Miscellaneous | ***ccap[0-1]*** | +| DISP | RT_Device_Class_Grapnis () | ***dac[0-1]*** | +| EADC | RT_Device_Class_Miscellaneous (ADC) | ***eadc[0-1]*** | +| ECAP | RT_Device_Class_Miscellaneous (Input capture) | ***ecap[0-1]i[0-2]*** | +| GMAC | RT_Device_Class_NetIf | ***e[0-1]*** | +| EPWM | RT_Device_Class_Miscellaneous (PWM) | ***epwm[0-1]*** | +| EPWM (Capture function) | RT_Device_Class_Miscellaneous (Input capture) | ***epwm[0-1]i[0-5]*** | +| GPIO | RT_Device_Class_Miscellaneous (Pin) | ***gpio*** | +| GPIO | RT_Device_Class_I2CBUS | ***softi2c0[0-1]*** | +| I2C | RT_Device_Class_I2CBUS | ***i2c[0-4]*** | +| I2S | RT_Device_Class_Sound/RT_Device_Class_Pipe | ***sound[0, 1]*** | +| PDMA | N/A | ***N/A*** | +| QEI | RT_Device_Class_Miscellaneous (Pulse encoder) | ***qei[0-1]*** | +| QSPI | RT_Device_Class_SPIBUS | ***qspi[0-1]*** | +| RTC | RT_Device_Class_RTC | ***rtc*** | +| RTP | N/A | N/A | +| SC (UART function) | RT_Device_Class_Char | ***scuart[0-2]*** | +| SDIO | RT_Device_Class_Sdio | ***sdio[0-1]*** | +| SPI | RT_Device_Class_SPIBUS | ***spi[0-10]*** | +| SPI (I2S function) | RT_Device_Class_Sound/RT_Device_Class_Pipe | ***spii2s[0-10]*** | +| TIMER | RT_Device_Class_Timer | ***timer[0-3]*** | +| TIMER (PWM function) | RT_Device_Class_Miscellaneous (PWM) | ***tpwm[0-3]*** | +| UART | RT_Device_Class_Char | ***uart[0-7]*** | +| USBH, HSUSBH | RT_Device_Class_USBHost | ***usbh*** | +| WDT | RT_Device_Class_Miscellaneous (Watchdog) | ***wdt*** | + +## Resources +* [Download MA35D1 TRM][1] + + [1]: diff --git a/bsp/nuvoton/libraries/ma35/SConscript b/bsp/nuvoton/libraries/ma35/SConscript new file mode 100644 index 0000000000..4c815c49b8 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/SConscript @@ -0,0 +1,15 @@ +# RT-Thread building script for bridge + +import os +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/nuvoton/libraries/ma35/StdDriver/SConscript b/bsp/nuvoton/libraries/ma35/StdDriver/SConscript new file mode 100644 index 0000000000..9431744b64 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/SConscript @@ -0,0 +1,13 @@ +# RT-Thread building script for component +Import('rtconfig') +from building import * + +cwd = GetCurrentDir() +libs = [] +src = Glob('*src/*.c') + Glob('src/*.cpp') +cpppath = [cwd + '/inc'] +libpath = [cwd + '/lib'] + +group = DefineGroup('Libraries', src, depend = [''], CPPPATH = cpppath) + +Return('group') diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_adc.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_adc.h new file mode 100644 index 0000000000..7d57468d13 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_adc.h @@ -0,0 +1,287 @@ +/**************************************************************************//** + * @file nu_adc.h + * @brief ADC driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright(C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_ADC_H__ +#define __NU_ADC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup ADC_Driver ADC Driver + @{ +*/ + +/** @addtogroup ADC_EXPORTED_CONSTANTS ADC Exported Constants + @{ +*/ + +#include "adc_reg.h" + +#define ADC_CH_0_MASK (1UL << 0) /*!< ADC channel 0 mask \hideinitializer */ +#define ADC_CH_1_MASK (1UL << 1) /*!< ADC channel 1 mask \hideinitializer */ +#define ADC_CH_2_MASK (1UL << 2) /*!< ADC channel 2 mask \hideinitializer */ +#define ADC_CH_3_MASK (1UL << 3) /*!< ADC channel 3 mask \hideinitializer */ +#define ADC_CH_4_MASK (1UL << 4) /*!< ADC channel 4 mask \hideinitializer */ +#define ADC_CH_5_MASK (1UL << 5) /*!< ADC channel 5 mask \hideinitializer */ +#define ADC_CH_6_MASK (1UL << 6) /*!< ADC channel 6 mask \hideinitializer */ +#define ADC_CH_7_MASK (1UL << 7) /*!< ADC channel 7 mask \hideinitializer */ +#define ADC_CH_NUM 8 /*!< Total Channel number \hideinitializer */ +#define ADC_HIGH_SPEED_MODE ADC_CONF_SPEED_Msk /*!< ADC working in high speed mode (3.2MHz <= ECLK <= 16MHz) \hideinitializer */ +#define ADC_NORMAL_SPEED_MODE 0 /*!< ADC working in normal speed mode (ECLK < 3.2MHz) \hideinitializer */ +#define ADC_REFSEL_VREF 0 /*!< ADC reference voltage source selection set to VREF \hideinitializer */ +#define ADC_REFSEL_AVDD (3UL << ADC_CONF_REFSEL_Pos) /*!< ADC reference voltage source selection set to AVDD \hideinitializer */ + +#define ADC_INPUT_MODE_NORMAL_CONV 0 /*!< ADC works in normal conversion mode \hideinitializer */ +#define ADC_INPUT_MODE_4WIRE_TOUCH 1 /*!< ADC works in 4-wire touch screen mode \hideinitializer */ +#define ADC_INPUT_MODE_5WIRE_TOUCH 2 /*!< ADC works in 5-wire touch screen mode \hideinitializer */ + +/*@}*/ /* end of group ADC_EXPORTED_CONSTANTS */ + + +/** @addtogroup ADC_EXPORTED_FUNCTIONS ADC Exported Functions + @{ +*/ + +/** + * @brief Get the latest ADC conversion data + * @param[in] adc Base address of ADC module + * @param[in] u32ChNum Currently not used + * @return Latest ADC conversion data + * \hideinitializer + */ +#define ADC_GET_CONVERSION_DATA(adc, u32ChNum) ((adc)->DATA) + +/** + * @brief Get the latest ADC conversion X data + * @param[in] adc Base address of ADC module + * @return Latest ADC conversion X data + * \hideinitializer + */ +#define ADC_GET_CONVERSION_XDATA(adc) ((adc)->XYDATA & ADC_XYDATA_XDATA_Msk) + +/** + * @brief Get the latest ADC conversion Y data + * @param[in] adc Base address of ADC module + * @return Latest ADC conversion Y data + * \hideinitializer + */ +#define ADC_GET_CONVERSION_YDATA(adc) ((adc)->XYDATA >> ADC_XYDATA_YDATA_Pos) + +/** + * @brief Get the latest ADC conversion Z1 data + * @param[in] adc Base address of ADC module + * @return Latest ADC conversion Z1 data + * \hideinitializer + */ +#define ADC_GET_CONVERSION_Z1DATA(adc) ((adc)->ZDATA & ADC_ZDATA_Z1DATA_Msk) + +/** + * @brief Get the latest ADC conversion Z2 data + * @param[in] adc Base address of ADC module + * @return Latest ADC conversion Z2 data + * \hideinitializer + */ +#define ADC_GET_CONVERSION_Z2DATA(adc) ((adc)->ZDATA >> ADC_ZDATA_Z2DATA_Pos) + +/** + * @brief Return the user-specified interrupt flags + * @param[in] adc Base address of ADC module + * @param[in] u32Mask Could be \ref ADC_IER_MIEN_Msk + * @return User specified interrupt flags + * \hideinitializer + */ +#define ADC_GET_INT_FLAG(adc, u32Mask) ((adc)->ISR & (u32Mask)) + +/** + * @brief This macro clear the selected interrupt status bits + * @param[in] adc Base address of ADC module + * @param[in] u32Mask Could be \ref ADC_IER_MIEN_Msk + * @return None + * \hideinitializer + */ +#define ADC_CLR_INT_FLAG(adc, u32Mask) ((adc)->ISR = (u32Mask)) + +/** + * @brief Return the user-specified interrupt flags + * @param[in] adc Base address of ADC module + * @param[in] u32Mask Could be \ref ADC_IER_MIEN_Msk + * @return User specified interrupt flags + * \hideinitializer + */ +#define ADC_GET_WKINT_FLAG(adc, u32Mask) ((adc)->WKISR & (u32Mask)) + +/** + * @brief Enable the interrupt(s) selected by u32Mask parameter. + * @param[in] adc Base address of ADC module + * @param[in] u32Mask Could be \ref ADC_IER_MIEN_Msk + * @return None + */ +#define ADC_ENABLE_INT(adc, u32Mask) ((adc)->IER |= u32Mask) + +/** + * @brief Disable the interrupt(s) selected by u32Mask parameter. + * @param[in] adc Base address of ADC module + * @param[in] u32Mask Could be \ref ADC_IER_MIEN_Msk + * @return None + */ +#define ADC_DISABLE_INT(adc, u32Mask) ((adc)->IER &= ~u32Mask) + +/** + * @brief Power down ADC module + * @param[in] adc Base address of ADC module + * @return None + * \hideinitializer + */ +#define ADC_POWER_DOWN(adc) ((adc)->CTL &= ~ADC_CTL_ADEN_Msk) + +/** + * @brief Power on ADC module + * @param[in] adc Base address of ADC module + * @return None + * \hideinitializer + */ +#define ADC_POWER_ON(adc) ((adc)->CTL |= ADC_CTL_ADEN_Msk) + + +/** + * @brief Set ADC input channel. Enabled channel will be converted while ADC starts. + * @param[in] adc Base address of ADC module + * @param[in] u32Mask Channel enable bit. Each bit corresponds to a input channel. Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @note ADC can only convert 1 channel at a time. If more than 1 channels are enabled, only channel + * with smallest number will be convert. + * \hideinitializer + */ +#define ADC_SET_INPUT_CHANNEL(adc, u32Mask) do {uint32_t u32Ch = 0, i;\ + for(i = 0; i < ADC_CH_NUM; i++) {\ + if((u32Mask) & (1 << i)) {\ + u32Ch = i;\ + break;\ + }\ + }\ + (adc)->CONF = ((adc)->CONF & ~ADC_CONF_CHSEL_Msk) | (u32Ch << ADC_CONF_CHSEL_Pos);\ + }while(0) + +/** + * @brief Start the A/D conversion. + * @param[in] adc Base address of ADC module + * @return None + * \hideinitializer + */ +#define ADC_START_CONV(adc) ((adc)->CTL |= ADC_CTL_MST_Msk) + +/** + * @brief Set the reference voltage selection. + * @param[in] adc Base address of ADC module + * @param[in] u32Ref The reference voltage selection. Valid values are: + * - \ref ADC_REFSEL_VREF + * - \ref ADC_REFSEL_AVDD + * @return None + * \hideinitializer + */ +#define ADC_SET_REF_VOLTAGE(adc, u32Ref) ((adc)->CONF = ((adc)->CONF & ~ADC_CONF_REFSEL_Msk) | (u32Ref)) + +/** + * @brief Set ADC to convert X/Y coordinate + * @param[in] adc Base address of ADC module + * @return None + * \hideinitializer + */ +#define ADC_CONVERT_XY_MODE(adc) do {(adc)->CTL &= ~ADC_CTL_PEDEEN_Msk;\ + (adc)->CONF |= ADC_CONF_TEN_Msk | ADC_CONF_ZEN_Msk;} while(0) + +/** + * @brief Set ADC to detect pen down event + * @param[in] adc Base address of ADC module + * @return None + * \hideinitializer + */ +#define ADC_DETECT_PD_MODE(adc) do {(adc)->CONF &= ~(ADC_CONF_TEN_Msk | ADC_CONF_ZEN_Msk);\ + (adc)->CTL |= ADC_CTL_PEDEEN_Msk;} while(0) + + +#define ADC_CONF_REFSEL_VREF (0<PSR & CANFD_PSR_ACT_Msk) >> CANFD_PSR_ACT_Pos) + + +/* CAN FD frame data field size. */ +typedef enum +{ + eCANFD_BYTE8 = 0, /*!< 8 byte data field. */ + eCANFD_BYTE12 = 1, /*!< 12 byte data field. */ + eCANFD_BYTE16 = 2, /*!< 16 byte data field. */ + eCANFD_BYTE20 = 3, /*!< 20 byte data field. */ + eCANFD_BYTE24 = 4, /*!< 24 byte data field. */ + eCANFD_BYTE32 = 5, /*!< 32 byte data field. */ + eCANFD_BYTE48 = 6, /*!< 48 byte data field. */ + eCANFD_BYTE64 = 7 /*!< 64 byte data field. */ +} E_CANFD_DATA_FIELD_SIZE; + +/* CAN FD Tx FIFO/Queue Mode. */ +typedef enum +{ + eCANFD_QUEUE_MODE = 0, /*!< Tx FIFO operation. */ + eCANFD_FIFO_MODE = 1 /*!< Tx Queue operation. */ +} E_CANFD_MODE; + +/* CAN FD Test & Bus monitor Mode. */ +typedef enum +{ + eCANFD_NORMAL = 0, /*!< None, Normal mode. */ + + /* + Support: + (1) to receive data frames + (2) to receive remote frames + (3) to give acknowledge to valid frames + Not support: + (1) data frames sending + (2) remote frames sending + (3) active error frames or overload frames sending + */ + eCANFD_RESTRICTED_OPERATION, /*!< Receive external RX frame and always keep recessive state or send dominate bit on ACK bit on TX pin. */ + + /* + Support: + (1) to receive valid data frames + (2) to receive valid remote frames + Not support: + (1) transmission start + (2) acknowledge to valid frames + */ + eCANFD_BUS_MONITOR, /*!< Receive external RX frame and always keep recessive state on TX pin. */ + + /* + Support: + (1) Loopback + (2) Also send out frames + Not support: + (1) to receive external frame + */ + eCANFD_LOOPBACK_EXTERNAL, /*!< Won't receive external RX frame. */ + /* + Support: + (1) Loopback + Not support: + (1) to receive external frame + (2) transmission start + */ + eCANFD_LOOPBACK_INTERNAL /*!< Won't receive external RX frame and always keep recessive state on TX pin */ +} E_CANFD_TEST_MODE; + +/* TX Buffer Configuration Parameters */ +typedef struct +{ + E_CANFD_DATA_FIELD_SIZE eDataFieldSize; /*!< TX Buffer Data Field Size (8byte .. 64byte) */ + E_CANFD_MODE eModeSel; /*!< select: CANFD_QUEUE_MODE/CANFD_FIFO_MODE */ + uint32_t u32ElemCnt; /*!< Elements in FIFO/Queue */ + uint32_t u32DBufNumber; /*!< Number of dedicated TX buffers */ +} CANFD_TX_BUF_CONFIG_T; + + +/* Nominal Bit Timing Parameters */ +typedef struct +{ + uint32_t u32BitRate; /*!< Transceiver baud rate in bps */ + uint16_t u16TDCOffset; /*!< Transceiver Delay Compensation Offset */ + uint16_t u16TDCFltrWin; /*!< Transceiver Delay Compensation Filter Window Length */ + uint8_t u8TDC; /*!< Transceiver Delay Compensation (1:Yes, 0:No) */ +} CANFD_NBT_CONFIG_T; + + +/* Data Bit Timing Parameters */ +typedef struct +{ + uint32_t u32BitRate; /*!< Transceiver baud rate in bps */ + uint16_t u16TDCOffset; /*!< Transceiver Delay Compensation Offset */ + uint16_t u16TDCFltrWin; /*!< Transceiver Delay Compensation Filter Window Length */ + uint8_t u8TDC; /*!< Transceiver Delay Compensation (1:Yes, 0:No) */ +} CANFD_DBT_CONFIG_T; + +/*! CAN FD protocol timing characteristic configuration structure. */ +typedef struct +{ + uint8_t u8PreDivider; /*!< Global Clock Division Factor. */ + uint16_t u16NominalPrescaler; /*!< Nominal clock prescaler. */ + uint8_t u8NominalRJumpwidth; /*!< Nominal Re-sync Jump Width. */ + uint8_t u8NominalPhaseSeg1; /*!< Nominal Phase Segment 1. */ + uint8_t u8NominalPhaseSeg2; /*!< Nominal Phase Segment 2. */ + uint8_t u8NominalPropSeg; /*!< Nominal Propagation Segment. */ + uint8_t u8DataPrescaler; /*!< Data clock prescaler. */ + uint8_t u8DataRJumpwidth; /*!< Data Re-sync Jump Width. */ + uint8_t u8DataPhaseSeg1; /*!< Data Phase Segment 1. */ + uint8_t u8DataPhaseSeg2; /*!< Data Phase Segment 2. */ + uint8_t u8DataPropSeg; /*!< Data Propagation Segment. */ + +} CANFD_TIMEING_CONFIG_T; + +/* CAN FD module configuration structure. */ +typedef struct +{ + CANFD_NBT_CONFIG_T sNormBitRate; /*!< Normal bit rate. */ + CANFD_DBT_CONFIG_T sDataBitRate; /*!< Data bit rate. */ + CANFD_TIMEING_CONFIG_T sConfigBitTing; /*!< Bit timing config*/ + uint8_t bFDEn; /*!< 1 == FD Operation enabled. */ + uint8_t bBitRateSwitch; /*!< 1 == Bit Rate Switch enabled (only evaluated in HW, if FD operation enabled). */ + E_CANFD_TEST_MODE evTestMode; /*!< See E_CANFD_TEST_MODE declaration. */ +} CANFD_FD_BT_CONFIG_T; + +/* CAN FD Message RAM Partitioning - i.e. Start Addresses (BYTE) */ +typedef struct +{ + uint32_t u32SIDFC_FLSSA; /*! EFID1), XIDAM not applied */ +} E_CANFD_XID_FLTR_ELEM_TYPE; + +/* Filter Element Configuration - Can be used for SFEC(Standard Id filter configuration) and EFEC(Extended Id filter configuration) */ +typedef enum +{ + eCANFD_FLTR_ELEM_DIS = 0x0, /*!< Filter Element Disable */ + eCANFD_FLTR_ELEM_STO_FIFO0 = 0x1, /*!< Filter Element Store In Fifo0 */ + eCANFD_FLTR_ELEM_STO_FIFO1 = 0x2, /*!< Filter Element Store In Fifo1 */ + eCANFD_FLTR_ELEM_REJ_ID = 0x3, /*!< Filter Element RejectId */ + eCANFD_FLTR_ELEM_SET_PRI = 0x4, /*!< Filter Element Set Priority */ + eCANFD_FLTR_ELEM_SET_PRI_STO_FIFO0 = 0x5, /*!< Filter Element Set Priority And Store In Fifo0 */ + eCANFD_FLTR_ELEM_SET_PRI_STO_FIFO1 = 0x6, /*!< Filter Element Set Priority And Store In Fifo1 */ + eCANFD_FLTR_ELEM_STO_RX_BUF_OR_DBG_MSG = 0x7 /*!< Filter Element Store In Rx Buf Or Debug Msg */ +} E_CANFD_FLTR_CONFIG; + +/* TX Event FIFO Element Struct */ +typedef struct +{ + E_CANFD_ID_TYPE eIdType; /*!< Standard ID or Extended ID */ + uint32_t u32Id; /*!< Standard ID (11bits) or Extended ID (29bits) */ + uint32_t u32DLC; /*!< Data Length Code used in the frame on the bus */ + uint32_t u32TxTs; /*!< Tx Timestamp */ + uint32_t u32MsgMarker; /*!< Message marker */ + uint8_t bErrStaInd; /*!< Error State Indicator */ + uint8_t bRemote; /*!< Remote transmission request */ + uint8_t bFDFormat; /*!< FD Format */ + uint8_t bBitRateSwitch; /*!< Bit Rate Switch */ +} CANFD_TX_EVNT_ELEM_T; + +#define CANFD_TIMEOUT 1000000 /* 1 second time-out */ +#define CANFD_OK ( 0L) /*!< CANFD operation OK */ +#define CANFD_ERR_FAIL (-1L) /*!< CANFD operation failed */ +#define CANFD_ERR_TIMEOUT (-2L) /*!< CANFD operation abort due to timeout error */ +#define CANFD_READ_REG_TIMEOUT (48UL) /*!< CANFD read register time-out count */ + +void CANFD_Open(CANFD_T *canfd, CANFD_FD_T *psCanfdStr); +void CANFD_Close(CANFD_T *canfd); +void CANFD_EnableInt(CANFD_T *canfd, uint32_t u32IntLine0, uint32_t u32IntLine1, uint32_t u32TXBTIE, uint32_t u32TXBCIE); +void CANFD_DisableInt(CANFD_T *canfd, uint32_t u32IntLine0, uint32_t u32IntLine1, uint32_t u32TXBTIE, uint32_t u32TXBCIE); +uint32_t CANFD_TransmitTxMsg(CANFD_T *canfd, uint32_t u32TxBufIdx, CANFD_FD_MSG_T *psTxMsg); +uint32_t CANFD_TransmitDMsg(CANFD_T *canfd, uint32_t u32TxBufIdx, CANFD_FD_MSG_T *psTxMsg); +void CANFD_SetGFC(CANFD_T *canfd, E_CANFD_ACC_NON_MATCH_FRM eNMStdFrm, E_CANFD_ACC_NON_MATCH_FRM eEMExtFrm, uint32_t u32RejRmtStdFrm, uint32_t u32RejRmtExtFrm); +void CANFD_SetSIDFltr(CANFD_T *canfd, uint32_t u32FltrIdx, uint32_t u32Filter); +void CANFD_SetXIDFltr(CANFD_T *canfd, uint32_t u32FltrIdx, uint32_t u32FilterLow, uint32_t u32FilterHigh); +uint32_t CANFD_ReadRxBufMsg(CANFD_T *canfd, uint8_t u8MbIdx, CANFD_FD_MSG_T *psMsgBuf); +uint32_t CANFD_ReadRxFifoMsg(CANFD_T *canfd, uint8_t u8FifoIdx, CANFD_FD_MSG_T *psMsgBuf); +void CANFD_CopyDBufToMsgBuf(CANFD_BUF_T *psRxBuffer, CANFD_FD_MSG_T *psMsgBuf); +void CANFD_CopyRxFifoToMsgBuf(CANFD_BUF_T *psRxBuf, CANFD_FD_MSG_T *psMsgBuf); +uint32_t CANFD_GetRxFifoWaterLvl(CANFD_T *canfd, uint32_t u32RxFifoNum); +void CANFD_TxBufCancelReq(CANFD_T *canfd, uint32_t u32TxBufIdx); +uint32_t CANFD_IsTxBufCancelFin(CANFD_T *canfd, uint32_t u32TxBufIdx); +uint32_t CANFD_IsTxBufTransmitOccur(CANFD_T *canfd, uint32_t u32TxBufIdx); +uint32_t CANFD_GetTxEvntFifoWaterLvl(CANFD_T *canfd); +void CANFD_CopyTxEvntFifoToUsrBuf(CANFD_T *canfd, uint32_t u32TxEvntNum, CANFD_TX_EVNT_ELEM_T *psTxEvntElem); +void CANFD_GetBusErrCount(CANFD_T *canfd, uint8_t *pu8TxErrBuf, uint8_t *pu8RxErrBuf); +int32_t CANFD_RunToNormal(CANFD_T *canfd, uint8_t u8Enable); +void CANFD_GetDefaultConfig(CANFD_FD_T *psConfig, uint8_t u8OpMode); +void CANFD_ClearStatusFlag(CANFD_T *canfd, uint32_t u32InterruptFlag); +uint32_t CANFD_GetStatusFlag(CANFD_T *canfd, uint32_t u32IntTypeFlag); +uint32_t CANFD_ReadReg(__I uint32_t *pu32RegAddr); + +/*@}*/ /* end of group CANFD_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group CANFD_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + +#endif /* __NU_CANFD_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ccap.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ccap.h new file mode 100644 index 0000000000..5b885b77d7 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ccap.h @@ -0,0 +1,175 @@ +/**************************************************************************//** + * @file nu_ccap.h + * @version V3.00 + * @brief M460 Series CCAP Driver Header File + * + * @copyright SPDX-License-Identifier: Apache-2.0 + * @copyright Copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + ******************************************************************************/ +#ifndef __NU_CCAP_H__ +#define __NU_CCAP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup CCAP_Driver CCAP Driver + @{ +*/ + +/** @addtogroup CCAP_EXPORTED_CONSTANTS CCAP Exported Constants + @{ +*/ + +/*---------------------------------------------------------------------------------------------------------*/ +/* CTL constant definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define CCAP_CTL_CCAPEN (1ul<CTL & CCAP_CTL_CCAPEN_Msk)?0:1) + +/** + * @brief Clear CCAP flag + * + * @param[in] u32IntMask interrupt flags settings. It could be + * - \ref CCAP_INT_VINTF_Msk + * - \ref CCAP_INT_MEINTF_Msk + * - \ref CCAP_INT_ADDRMINTF_Msk + * - \ref CCAP_INT_MDINTF_Msk + * + * @return None + * + * @details Clear Camera Capture Interface interrupt flag + * \hideinitializer + */ +#define CCAP_CLR_INT_FLAG(ccap, u32IntMask) (ccap->INT |= (u32IntMask)) + +/** + * @brief Get CCAP Interrupt status + * + * @param None + * + * @return CCAP Interrupt Register + * + * @details Get Camera Capture Interface interrupt status. + * \hideinitializer + */ +#define CCAP_GET_INT_STS(ccap) (ccap->INT) + +#define CCAP_SET_CTL(ccap, u32IntMask) (ccap->CTL |= u32IntMask) +#define CCAP_CLR_CTL(ccap, u32IntMask) (ccap->CTL &= ~u32IntMask) + +void CCAP_Open(CCAP_T *ccap, uint32_t u32InFormat, uint32_t u32OutFormat); +void CCAP_SetCroppingWindow(CCAP_T *ccap, uint32_t u32VStart, uint32_t u32HStart, uint32_t u32Height, uint32_t u32Width); +void CCAP_SetPacketBuf(CCAP_T *ccap, uint32_t u32Address); +void CCAP_Close(CCAP_T *ccap); +void CCAP_EnableInt(CCAP_T *ccap, uint32_t u32IntMask); +void CCAP_DisableInt(CCAP_T *ccap, uint32_t u32IntMask); +void CCAP_Start(CCAP_T *ccap); +void CCAP_Stop(CCAP_T *ccap, uint32_t u32FrameComplete); +void CCAP_SetPacketScaling(CCAP_T *ccap, uint32_t u32VNumerator, uint32_t u32VDenominator, uint32_t u32HNumerator, uint32_t u32HDenominator); +void CCAP_SetPacketStride(CCAP_T *ccap, uint32_t u32Stride); +void CCAP_EnableMono(CCAP_T *ccap, uint32_t u32Interface); +void CCAP_DisableMono(CCAP_T *ccap); +void CCAP_EnableLumaYOne(CCAP_T *ccap, uint32_t u32th); +void CCAP_DisableLumaYOne(CCAP_T *ccap); + +void CCAP_SetPlanarYBuf(CCAP_T *ccap, uint32_t u32Address); +void CCAP_SetPlanarUBuf(CCAP_T *ccap, uint32_t u32Address); +void CCAP_SetPlanarVBuf(CCAP_T *ccap, uint32_t u32Address); +void CCAP_SetPlanarScaling(CCAP_T *ccap, uint32_t u32VNumerator, uint32_t u32VDenominator, uint32_t u32HNumerator, uint32_t u32HDenominator); +void CCAP_SetPlanarStride(CCAP_T *ccap, uint32_t u32Stride); + + +/*@}*/ /* end of group CCAP_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group CCAP_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif //__NU_CCAP_H__ diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_clk.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_clk.h new file mode 100644 index 0000000000..07cffd0bf3 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_clk.h @@ -0,0 +1,622 @@ +/**************************************************************************//** + * @file CLK.h + * @brief CLK Driver Header File + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + ******************************************************************************/ +#ifndef __NU_CLK_H__ +#define __NU_CLK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup CLK_Driver CLK Driver + @{ +*/ + +/** @addtogroup CLK_EXPORTED_CONSTANTS CLK Exported Constants + @{ +*/ + + +#define FREQ_180MHZ 180000000UL /*!< 180 MHz \hideinitializer */ + +#define CAPLL (0x0UL) +#define SYSPLL (0x1UL) +#define DDRPLL (0x2UL) +#define APLL (0x3UL) +#define EPLL (0x4UL) +#define VPLL (0x5UL) + +#define PLL_OPMODE_INTEGER (0x0UL) +#define PLL_OPMODE_FRACTIONAL (0x1UL) +#define PLL_OPMODE_SPREAD_SPECTRUM (0x2UL) +/*---------------------------------------------------------------------------------------------------------*/ +/* CLKSEL0 constant definitions. (Write-protection) */ +/*---------------------------------------------------------------------------------------------------------*/ +#define CLK_CLKSEL0_CA35CKSEL_HXT (0x0UL<>29) & 0x7UL) /*!< Calculate SYSCLK/APBCLK offset on MODULE index, 0x0:SYSCLK0, 0x1:SYSCLK1, 0x2:APBCLK0, 0x3:APBCLK1, 0x4:APBCLK2 \hideinitializer */ +#define MODULE_CLKSEL(x) (((x) >>26) & 0x7UL) /*!< Calculate CLKSEL offset on MODULE index, 0x0:CLKSEL0, 0x1:CLKSEL1, 0x2:CLKSEL2, 0x3:CLKSEL3, 0x4:CLKSEL4 \hideinitializer */ +#define MODULE_CLKSEL_Msk(x) (((x) >>22) & 0xfUL) /*!< Calculate CLKSEL mask offset on MODULE index \hideinitializer */ +#define MODULE_CLKSEL_Pos(x) (((x) >>17) & 0x1fUL) /*!< Calculate CLKSEL position offset on MODULE index \hideinitializer */ +#define MODULE_CLKDIV(x) (((x) >>14) & 0x7UL) /*!< Calculate APBCLK CLKDIV on MODULE index, 0x0:CLKDIV0, 0x1:CLKDIV1, 0x2:CLKDIV2, 0x3:CLKDIV3, 0x4:CLKDIV4 \hideinitializer */ +#define MODULE_CLKDIV_Msk(x) (((x) >>10) & 0xfUL) /*!< Calculate CLKDIV mask offset on MODULE index \hideinitializer */ +#define MODULE_CLKDIV_Pos(x) (((x) >>5 ) & 0x1fUL) /*!< Calculate CLKDIV position offset on MODULE index \hideinitializer */ +#define MODULE_IP_EN_Pos(x) (((x) >>0 ) & 0x1fUL) /*!< Calculate APBCLK offset on MODULE index \hideinitializer */ +#define MODULE_NoMsk 0x0UL /*!< Not mask on MODULE index \hideinitializer */ +#define NA MODULE_NoMsk /*!< Not Available \hideinitializer */ + +#define MODULE_APBCLK_ENC(x) (((x) & 0x07UL) << 29) /*!< MODULE index, 0x0:SYSCLK0, 0x1:SYSCLK1, 0x2:APBCLK0, 0x3:APBCLK1, 0x4:APBCLK2 \hideinitializer */ +#define MODULE_CLKSEL_ENC(x) (((x) & 0x07UL) << 26) /*!< CLKSEL offset on MODULE index, 0x0:CLKSEL0, 0x1:CLKSEL1, 0x2:CLKSEL2, 0x3:CLKSEL3, 0x4:CLKSEL4 \hideinitializer */ +#define MODULE_CLKSEL_Msk_ENC(x) (((x) & 0x0fUL) << 22) /*!< CLKSEL mask offset on MODULE index \hideinitializer */ +#define MODULE_CLKSEL_Pos_ENC(x) (((x) & 0x1fUL) << 17) /*!< CLKSEL position offset on MODULE index \hideinitializer */ +#define MODULE_CLKDIV_ENC(x) (((x) & 0x07UL) << 14) /*!< APBCLK CLKDIV on MODULE index, 0x0:CLKDIV0, 0x1:CLKDIV1, 0x2:CLKDIV2, 0x3:CLKDIV3, 0x4:CLKDIV4 \hideinitializer */ +#define MODULE_CLKDIV_Msk_ENC(x) (((x) & 0x0fUL) << 10) /*!< CLKDIV mask offset on MODULE index \hideinitializer */ +#define MODULE_CLKDIV_Pos_ENC(x) (((x) & 0x1fUL) << 5 ) /*!< CLKDIV position offset on MODULE index \hideinitializer */ +#define MODULE_IP_EN_Pos_ENC(x) (((x) & 0x1fUL) << 0 ) /*!< AHBCLK/APBCLK offset on MODULE index \hideinitializer */ + +#define PDMA0_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(0UL<<0)) /*!< PDMA0 Module \hideinitializer */ +#define PDMA1_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(1UL<<0)) /*!< PDMA1 Module \hideinitializer */ +#define PDMA2_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(2UL<<0)) /*!< PDMA2 Module \hideinitializer */ +#define PDMA3_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(3UL<<0)) /*!< PDMA3 Module \hideinitializer */ +#define WH0_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(4UL<<0)) /*!< WH0 Module \hideinitializer */ +#define WH1_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(5UL<<0)) /*!< WH1 Module \hideinitializer */ +#define HWS_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(6UL<<0)) /*!< HWS Module \hideinitializer */ +#define EBI_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(7UL<<0)) /*!< EBI Module \hideinitializer */ +#define SRAM0_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(8UL<<0)) /*!< SRAM0 Module \hideinitializer */ +#define SRAM1_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(9UL<<0)) /*!< SRAM1 Module \hideinitializer */ +#define ROM_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(10UL<<0)) /*!< ROM Module \hideinitializer */ +#define TRA_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(11UL<<0)) /*!< TRA Module \hideinitializer */ +#define DBG_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(12UL<<0)) /*!< DBG Module \hideinitializer */ +#define CLKO_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(13UL<<0)) /*!< CLKO Module \hideinitializer */ +#define GTMR_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(14UL<<0)) /*!< GTMR Module \hideinitializer */ +#define GPA_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(16UL<<0)) /*!< GPA Module \hideinitializer */ +#define GPB_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(17UL<<0)) /*!< GPB Module \hideinitializer */ +#define GPC_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(18UL<<0)) /*!< GPC Module \hideinitializer */ +#define GPD_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(19UL<<0)) /*!< GPD Module \hideinitializer */ +#define GPE_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(20UL<<0)) /*!< GPE Module \hideinitializer */ +#define GPF_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(21UL<<0)) /*!< GPF Module \hideinitializer */ +#define GPG_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(22UL<<0)) /*!< GPG Module \hideinitializer */ +#define GPH_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(23UL<<0)) /*!< GPH Module \hideinitializer */ +#define GPI_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(24UL<<0)) /*!< GPI Module \hideinitializer */ +#define GPJ_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(25UL<<0)) /*!< GPJ Module \hideinitializer */ +#define GPK_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(26UL<<0)) /*!< GPK Module \hideinitializer */ +#define GPL_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(27UL<<0)) /*!< GPL Module \hideinitializer */ +#define GPM_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(28UL<<0)) /*!< GPM Module \hideinitializer */ +#define GPN_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(29UL<<0)) /*!< GPN Module \hideinitializer */ +#define CA35_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(0UL<<0)) /*!< CA35 Module \hideinitializer */ +#define RTP_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(1UL<<0)) /*!< RTP Module \hideinitializer */ +#define TAHB_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(2UL<<0)) /*!< TAHB Module \hideinitializer */ +#define LVRDB_MODULE ((0UL<<29)|(0UL<<26) |(0x1UL<<22) |(3UL<<17) |(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(3UL<<0)) /*!< LVRDB Module \hideinitializer */ +#define DDR0_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(4UL<<0)) /*!< DDR0 Module \hideinitializer */ +#define DDR6_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(5UL<<0)) /*!< DDR6 Module \hideinitializer */ +#define CANFD0_MODULE ((0UL<<29)|(4<<26)|(1<<22)|(16<<17)|(0<<14)|(7<<10)|(0<<5)|(8UL<<0)) /*!< CANFD0 Module \hideinitializer */ +#define CANFD1_MODULE ((0UL<<29)|(4<<26)|(1<<22)|(17<<17)|(0<<14)|(7<<10)|(4<<5)|(9UL<<0)) /*!< CANFD1 Module \hideinitializer */ +#define CANFD2_MODULE ((0UL<<29)|(4<<26)|(1<<22)|(18<<17)|(0<<14)|(7<<10)|(8<<5)|(10UL<<0)) /*!< CANFD2 Module \hideinitializer */ +#define CANFD3_MODULE ((0UL<<29)|(4<<26)|(1<<22)|(19<<17)|(0<<14)|(7<<10)|(12<<5)|(11UL<<0)) /*!< CANFD3 Module \hideinitializer */ +#define SDH0_MODULE ((0UL<<29)|(0UL<<26) |(0x3UL<<22) |(0x10UL<<17) |(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(16UL<<0)) /*!< SDH0 Module */ +#define SDH1_MODULE ((0UL<<29)|(0UL<<26) |(0x3UL<<22) |(0x12UL<<17) |(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(17UL<<0)) /*!< SDH1 Module */ +#define NAND_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(18UL<<0)) /*!< NAND Module \hideinitializer */ +#define USBD_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(19UL<<0)) /*!< USBD Module \hideinitializer */ +#define USBH_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(20UL<<0)) /*!< USBH Module \hideinitializer */ +#define HUSBH0_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(21UL<<0)) /*!< HUSBH0 Module \hideinitializer */ +#define HUSBH1_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(22UL<<0)) /*!< HUSBH1 Module \hideinitializer */ +#define GFX_MODULE ((0UL<<29)|(0UL<<26) |(0x1UL<<22) |(26UL<<17) |(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(24UL<<0)) /*!< GFX Module \hideinitializer */ +#define VDEC_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(25UL<<0)) /*!< VDEC Module \hideinitializer */ +#define DCU_MODULE ((0UL<<29)|(0UL<<26) |(0x1UL<<22) |(24UL<<17) |(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(26UL<<0)) /*!< DCU Module \hideinitializer */ +#define GMAC0_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(0UL<<14) |(0x3UL<<10) |(28UL<<5) |(27UL<<0)) /*!< GMAC0 Module \hideinitializer */ +#define GMAC1_MODULE ((0UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(0UL<<14) |(0x3UL<<10) |(30UL<<5) |(28UL<<0)) /*!< GMAC1 Module \hideinitializer */ +#define CCAP0_MODULE ((0UL<<29)|(0UL<<26) |(0x3UL<<22) |(12UL<<17) |(1UL<<14) |(0xFUL<<10) |(8UL<<5) |(29UL<<0)) /*!< CCAP0 Module \hideinitializer */ +#define CCAP1_MODULE ((0UL<<29)|(0UL<<26) |(0x3UL<<22) |(14UL<<17) |(1UL<<14) |(0xFUL<<10) |(12UL<<5) |(30UL<<0)) /*!< CCAP1 Module \hideinitializer */ +#define TMR0_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(0UL<<0)) /*!< TMR0 Module \hideinitializer */ +#define TMR1_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(1UL<<0)) /*!< TMR1 Module \hideinitializer */ +#define TMR2_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(2UL<<0)) /*!< TMR2 Module \hideinitializer */ +#define TMR3_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(3UL<<0)) /*!< TMR3 Module \hideinitializer */ +#define TMR4_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(4UL<<0)) /*!< TMR4 Module \hideinitializer */ +#define TMR5_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(5UL<<0)) /*!< TMR5 Module \hideinitializer */ +#define TMR6_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(6UL<<0)) /*!< TMR6 Module \hideinitializer */ +#define TMR7_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(7UL<<0)) /*!< TMR7 Module \hideinitializer */ +#define TMR8_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(8UL<<0)) /*!< TMR8 Module \hideinitializer */ +#define TMR9_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(9UL<<0)) /*!< TMR9 Module \hideinitializer */ +#define TMR10_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(10UL<<0)) /*!< TMR10 Module \hideinitializer */ +#define TMR11_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(11UL<<0)) /*!< TMR11 Module \hideinitializer */ +#define UART0_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(12UL<<0)) /*!< UART0 Module \hideinitializer */ +#define UART1_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(13UL<<0)) /*!< UART1 Module \hideinitializer */ +#define UART2_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(14UL<<0)) /*!< UART2 Module \hideinitializer */ +#define UART3_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(15UL<<0)) /*!< UART3 Module \hideinitializer */ +#define UART4_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(16UL<<0)) /*!< UART4 Module \hideinitializer */ +#define UART5_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(17UL<<0)) /*!< UART5 Module \hideinitializer */ +#define UART6_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(18UL<<0)) /*!< UART6 Module \hideinitializer */ +#define UART7_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(19UL<<0)) /*!< UART7 Module \hideinitializer */ +#define UART8_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(20UL<<0)) /*!< UART8 Module \hideinitializer */ +#define UART9_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(21UL<<0)) /*!< UART9 Module \hideinitializer */ +#define UART10_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(22UL<<0)) /*!< UART10 Module \hideinitializer */ +#define UART11_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(23UL<<0)) /*!< UART11 Module \hideinitializer */ +#define UART12_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(24UL<<0)) /*!< UART12 Module \hideinitializer */ +#define UART13_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(25UL<<0)) /*!< UART13 Module \hideinitializer */ +#define UART14_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(26UL<<0)) /*!< UART14 Module \hideinitializer */ +#define UART15_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(27UL<<0)) /*!< UART15 Module \hideinitializer */ +#define UART16_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(28UL<<0)) /*!< UART16 Module \hideinitializer */ +#define RTC_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(29UL<<0)) /*!< RTC Module \hideinitializer */ +#define DDRP_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(30UL<<0)) /*!< DDRP Module \hideinitializer */ +#define KPI_MODULE ((2UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(31UL<<0)) /*!< KPI Module \hideinitializer */ +#define I2C0_MODULE ((3UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(0UL<<0)) /*!< I2C0 Module \hideinitializer */ +#define I2C1_MODULE ((3UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(1UL<<0)) /*!< I2C1 Module \hideinitializer */ +#define I2C2_MODULE ((3UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(2UL<<0)) /*!< I2C2 Module \hideinitializer */ +#define I2C3_MODULE ((3UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(3UL<<0)) /*!< I2C3 Module \hideinitializer */ +#define I2C4_MODULE ((3UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(4UL<<0)) /*!< I2C4 Module \hideinitializer */ +#define I2C5_MODULE ((3UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(5UL<<0)) /*!< I2C5 Module \hideinitializer */ +#define QSPI0_MODULE ((3UL<<29)|(4UL<<26) |(0x3UL<<22) |(8UL<<17) |(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(6UL<<0)) /*!< QSPI0 Module \hideinitializer */ +#define QSPI1_MODULE ((3UL<<29)|(4UL<<26) |(0x3UL<<22) |(10UL<<17) |(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(7UL<<0)) /*!< QSPI1 Module \hideinitializer */ +#define SC0_MODULE ((3UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(12UL<<0)) /*!< SC0 Module \hideinitializer */ +#define SC1_MODULE ((3UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(13UL<<0)) /*!< SC1 Module \hideinitializer */ +#define WDT0_MODULE ((3UL<<29)|(3UL<<26) |(0x3UL<<22) |(20UL<<17) |(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(16UL<<0)) /*!< WDT0 Module \hideinitializer */ +#define WDT1_MODULE ((3UL<<29)|(3UL<<26) |(0x3UL<<22) |(24UL<<17) |(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(17UL<<0)) /*!< WDT1 Module \hideinitializer */ +#define WDT2_MODULE ((3UL<<29)|(3UL<<26) |(0x3UL<<22) |(28UL<<17) |(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(18UL<<0)) /*!< WDT2 Module \hideinitializer */ +#define EPWM0_MODULE ((3UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(24UL<<0)) /*!< EPWM0 Module \hideinitializer */ +#define EPWM1_MODULE ((3UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(25UL<<0)) /*!< EPWM1 Module \hideinitializer */ +#define EPWM2_MODULE ((3UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(26UL<<0)) /*!< EPWM2 Module \hideinitializer */ +#define I2S0_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(0UL<<0)) /*!< I2S0 Module \hideinitializer */ +#define I2S1_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(1UL<<0)) /*!< I2S1 Module \hideinitializer */ +#define SSMCC_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(2UL<<0)) /*!< SSMCC Module \hideinitializer */ +#define SSPCC_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(3UL<<0)) /*!< SSPCC Module \hideinitializer */ +#define SPI0_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(4UL<<0)) /*!< SPI0 Module \hideinitializer */ +#define SPI1_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(5UL<<0)) /*!< SPI1 Module \hideinitializer */ +#define SPI2_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(6UL<<0)) /*!< SPI2 Module \hideinitializer */ +#define SPI3_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(7UL<<0)) /*!< SPI3 Module \hideinitializer */ +#define ECAP0_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(8UL<<0)) /*!< ECAP0 Module \hideinitializer */ +#define ECAP1_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(9UL<<0)) /*!< ECAP1 Module \hideinitializer */ +#define ECAP2_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(10UL<<0)) /*!< ECAP2 Module \hideinitializer */ +#define QEI0_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(12UL<<0)) /*!< QEI0 Module \hideinitializer */ +#define QEI1_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(13UL<<0)) /*!< QEI1 Module \hideinitializer */ +#define QEI2_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(14UL<<0)) /*!< QEI2 Module \hideinitializer */ +#define ADC_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(24UL<<0)) /*!< ADCModule \hideinitializer */ +#define EADC0_MODULE ((4UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(25UL<<0)) /*!< EADC0 Module \hideinitializer */ + +/*@}*/ /* end of group CLK_EXPORTED_CONSTANTS */ + +/** @addtogroup CLK_EXPORTED_FUNCTIONS CLK Exported Functions + @{ +*/ + + +#if defined (USE_MA35D1_SUBM) +/*---------------------------------------------------------------------------------------------------------*/ +/* static inline functions */ +/*---------------------------------------------------------------------------------------------------------*/ +/* Declare these inline functions here to avoid MISRA C 2004 rule 8.1 error */ +__STATIC_INLINE void CLK_SysTickDelay(uint32_t us); +__STATIC_INLINE void CLK_SysTickLongDelay(uint32_t us); + +/** + * @brief This function execute delay function. + * @param[in] us Delay time. The Max value is 2^24 / CPU Clock(MHz). Ex: + * 72MHz => 233016us, 50MHz => 335544us, + * 48MHz => 349525us, 28MHz => 699050us ... + * @return None + * @details Use the SysTick to generate the delay time and the unit is in us. + * The SysTick clock source is from HCLK, i.e the same as system core clock. + */ +__STATIC_INLINE void CLK_SysTickDelay(uint32_t us) +{ + SysTick->LOAD = us * CyclesPerUs; + SysTick->VAL = 0x0UL; + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; + + /* Waiting for down-count to zero */ + while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0UL) + { + } + + /* Disable SysTick counter */ + SysTick->CTRL = 0UL; +} + +/** + * @brief This function execute long delay function. + * @param[in] us Delay time. + * @return None + * @details Use the SysTick to generate the long delay time and the UNIT is in us. + * The SysTick clock source is from HCLK, i.e the same as system core clock. + * User can use SystemCoreClockUpdate() to calculate CyclesPerUs automatically before using this function. + */ +__STATIC_INLINE void CLK_SysTickLongDelay(uint32_t us) +{ + uint32_t delay; + + /* It should <= 349525us for each delay loop */ + delay = 349525UL; + + do + { + if (us > delay) + { + us -= delay; + } + else + { + delay = us; + us = 0UL; + } + + SysTick->LOAD = delay * CyclesPerUs; + SysTick->VAL = (0x0UL); + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; + + /* Waiting for down-count to zero */ + while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0UL); + + /* Disable SysTick counter */ + SysTick->CTRL = 0UL; + + } + while (us > 0UL); + +} +#else +void SystemCoreClockUpdate(void); +#endif + +__STATIC_INLINE void CLK_SetPLLPowerDown(uint32_t u32PllIdx) +{ + CLK->PLL[u32PllIdx].CTL1 |= CLK_PLLnCTL1_PD_Msk; +} + +void CLK_DisableCKO(void); +void CLK_EnableCKO(uint32_t u32ClkSrc, uint32_t u32ClkDiv, uint32_t u32ClkDivBy1En); +void CLK_PowerDown(void); +uint32_t CLK_GetHXTFreq(void); +uint32_t CLK_GetLXTFreq(void); +uint32_t CLK_GetSYSCLK0Freq(void); +uint32_t CLK_GetSYSCLK1Freq(void); +uint32_t CLK_GetPCLK3Freq(void); +uint32_t CLK_GetCPUFreq(void); +uint32_t CLK_SetCoreClock(uint32_t u32Hclk); +void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv); +void CLK_SetSysTickClockSrc(uint32_t u32ClkSrc); +void CLK_EnableXtalRC(uint32_t u32ClkMask); +void CLK_DisableXtalRC(uint32_t u32ClkMask); +void CLK_EnableModuleClock(uint32_t u32ModuleIdx); +void CLK_DisableModuleClock(uint32_t u32ModuleIdx); +void CLK_DisablePLL(uint32_t u32PllIdx); +uint32_t CLK_WaitClockReady(uint32_t u32ClkMask); +void CLK_EnableSysTick(uint32_t u32ClkSrc, uint32_t u32Count); +void CLK_DisableSysTick(void); +uint32_t CLK_GetCAPLLClockFreq(void); +uint32_t CLK_GetPLLClockFreq(uint32_t u32PllIdx); +uint32_t CLK_GetModuleClockSource(uint32_t u32ModuleIdx); +uint32_t CLK_GetModuleClockDivider(uint32_t u32ModuleIdx); +uint32_t CLK_GetCAPLLClockFreq(void); +uint64_t CLK_SetPLLFreq(uint32_t u32PllIdx, uint32_t u32OpMode, uint64_t PllSrcClk, uint64_t u64PllFreq); +uint32_t CLK_GetPLLClockFreq(uint32_t u32PllIdx); +uint32_t CLK_GetPLLOpMode(uint32_t u32PllIdx); + +#define CLK_GetPCLK0Freq() CLK_GetSYSCLK1Freq() +#define CLK_GetPCLK1Freq() CLK_GetSYSCLK1Freq() +#define CLK_GetPCLK2Freq() CLK_GetSYSCLK1Freq() +#define CLK_GetPCLK3Freq() (CLK_GetSYSCLK1Freq() / 2) +#define CLK_GetPCLK4Freq() (CLK_GetSYSCLK1Freq() / 2) + +#define CLK_GetHCLK0Freq() CLK_GetSYSCLK1Freq() +#define CLK_GetHCLK1Freq() CLK_GetSYSCLK1Freq() +#define CLK_GetHCLK2Freq() CLK_GetSYSCLK1Freq() +#define CLK_GetHCLK3Freq() (CLK_GetSYSCLK1Freq() / 2) + +#define CLK_GetCA35CPUFreq CLK_GetCAPLLClockFreq + +/*@}*/ /* end of group CLK_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group CLK_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_CLK_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_disp.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_disp.h new file mode 100644 index 0000000000..5bd63f9060 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_disp.h @@ -0,0 +1,205 @@ +/**************************************************************************//** + * @file nu_disp.h + * @brief DISP driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_DISP_H__ +#define __NU_DISP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup DISP_Driver DISP Driver + @{ +*/ + +/** @addtogroup DISP_EXPORTED_CONSTANTS DISP Exported Constants + @{ +*/ + +typedef enum +{ + eDispLcd_1024x600 = 0, + eDispLcd_800x480 = 1, + eDispLcd_1920x1080 = 2, + eDispLcd_Cnt +} E_DISP_LCD; + + +typedef enum +{ + ePolarity_Disable = -1, + ePolarity_Positive = 0, + ePolarity_Negative = 1 +} E_POLARITY; + +typedef enum +{ + eDPIFmt_D16CFG1, + eDPIFmt_D16CFG2, + eDPIFmt_D16CFG3, + eDPIFmt_D18CFG1, + eDPIFmt_D18CFG2, + eDPIFmt_D24 +} E_DPI_DATA_FMT; + +typedef enum +{ + eLayer_Video = 0, + eLayer_Overlay = 1, + eLayer_Cnt +} E_DISP_LAYER; + +typedef enum +{ + eYUV_709_BT709 = 1, + eYUV_2020_BT2020 = 3, +} E_YUV_STANDARD; + +typedef enum +{ + eFBFmt_X4R4G4B4 = 0, + eFBFmt_A4R4G4B4 = 1, + eFBFmt_X1R5G5B5 = 2, + eFBFmt_A1R5G5B5 = 3, + eFBFmt_R5G6B5 = 4, + eFBFmt_X8R8G8B8 = 5, + eFBFmt_A8R8G8B8 = 6, + eFBFmt_YUY2 = 7, + eFBFmt_UYVY = 8, + eFBFmt_INDEX8 = 9, + eFBFmt_MONOCHROME = 10, + eFBFmt_YV12 = 15, + eFBFmt_A8 = 16, + eFBFmt_NV12 = 17, + eFBFmt_NV16 = 18, + eFBFmt_RG16 = 19, + eFBFmt_R8 = 20, + eFBFmt_NV12_10BIT = 21, + eFBFmt_A2R10G10B10 = 22, + eFBFmt_NV16_10BIT = 23, + eFBFmt_INDEX1 = 24, + eFBFmt_INDEX2 = 25, + eFBFmt_INDEX4 = 26, + eFBFmt_P010 = 27, + eFBFmt_NV12_10BIT_L1 = 28, + eFBFmt_NV16_10BIT_L1 = 29 +} E_FB_FMT; + +typedef enum +{ + eOPAQUE, + eMASK, + eKEY +} E_TRANSPARENCY_MODE; + +typedef enum +{ + DC_BLEND_MODE_CLEAR, + DC_BLEND_MODE_SRC, + DC_BLEND_MODE_DST, + DC_BLEND_MODE_SRC_OVER, + DC_BLEND_MODE_DST_OVER, + DC_BLEND_MODE_SRC_IN, + DC_BLEND_MODE_DST_IN, + DC_BLEND_MODE_SRC_OUT +} E_DC_BLEND_MODE; + +typedef enum +{ + eGloAM_NORMAL, + eGloAM_GLOBAL, + eGloAM_SCALED +} E_GLOBAL_ALPHA_MODE; + + +typedef enum +{ + eBM_ZERO, + eBM_ONE, + eBM_NORMAL, + eBM_INVERSED, + eBM_COLOR, + eBM_COLOR_INVERSED, + eBM_SATURATED_ALPHA, + eBM_SATURATED_DEST_ALPHA +} E_BLENDING_MODE; + +typedef struct +{ + /* + htotal: u32HA + u32HBP + u32HFP + u32HSL + vtotal: u32VA + u32VBP + u32VFP + u32VSL + clock-frequency: htotal * vtotal * fps + */ + uint32_t u32PCF; // Pixel Clock Frequency + + uint32_t u32HA; // Horizontal Active + uint32_t u32HSL; // Horizontal Sync Length + uint32_t u32HFP; // Horizontal Front Porch + uint32_t u32HBP; // Horizontal Back Porch + uint32_t u32VA; // Vertical Active + uint32_t u32VSL; // Vertical Sync Len + uint32_t u32VFP; // Vertical Front Porch + uint32_t u32VBP; // Vertical Back Porch + + E_POLARITY eHSPP; // HSync Pulse Polarity + E_POLARITY eVSPP; // VSync Pulse Polarity + +} DISP_LCD_TIMING; + +typedef struct +{ + E_DPI_DATA_FMT eDpiFmt; // DPI Data Format + E_POLARITY eDEP; // DE Polarity + E_POLARITY eDP; // DATA Polarity + E_POLARITY eCP; // CLOCK Polarity +} DISP_PANEL_CONF; + +typedef struct +{ + uint32_t u32ResolutionWidth; + uint32_t u32ResolutionHeight; + DISP_LCD_TIMING sLcdTiming; + DISP_PANEL_CONF sPanelConf; +} DISP_LCD_INFO; + +#define DISP_ENABLE_INT() (DISP->DisplayIntrEnable |= DISP_DisplayIntrEnable_DISP0_Msk) +#define DISP_DISABLE_INT() (DISP->DisplayIntrEnable &= ~DISP_DisplayIntrEnable_DISP0_Msk) +#define DISP_GET_INTSTS() (DISP->DisplayIntr & DISP_DisplayIntr_DISP0_Msk) + +const DISP_LCD_INFO *DISP_GetLCDInst(E_DISP_LCD eDispLcd); +int32_t DISP_LCDInit(const DISP_LCD_INFO *psLCDInfo); +int32_t DISP_LCDDeinit(void); +int DISP_SetFBConfig(E_DISP_LAYER eLayer, E_FB_FMT eFbFmt, uint32_t u32ResWidth, uint32_t u32ResHeight, uint32_t u32DMAFBStartAddr); +void DISP_SetPanelConf(DISP_PANEL_CONF *psPanelConf); +void DISP_SetTiming(DISP_LCD_TIMING *psLCDTiming); +int DISP_Trigger(E_DISP_LAYER eLayer, uint32_t u32Action); +int DISP_SetTransparencyMode(E_DISP_LAYER eLayer, E_TRANSPARENCY_MODE eTM); +int DISP_SetBlendOpMode(E_DC_BLEND_MODE eDCBM, E_GLOBAL_ALPHA_MODE eGloAM_Src, E_GLOBAL_ALPHA_MODE eGloAM_Dst); +void DISP_SetBlendValue(uint32_t u32GloAV_Src, uint32_t u32GloAV_Dst); +void DISP_SetColorKeyValue(uint32_t u32ColorKeyLow, uint32_t u32ColorKeyHigh); +int DISP_SetFBAddr(E_DISP_LAYER eLayer, uint32_t u32DMAFBStartAddr); +int DISP_SetFBFmt(E_DISP_LAYER eLayer, E_FB_FMT eFbFmt, uint32_t u32Pitch); + +/*@}*/ /* end of group DISP_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group DISP_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_DISP_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_eadc.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_eadc.h new file mode 100644 index 0000000000..a25919e2d1 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_eadc.h @@ -0,0 +1,630 @@ +/**************************************************************************//** + * @file nu_eadc.h + * @brief EADC driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_EADC_H__ +#define __NU_EADC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup EADC_Driver EADC Driver + @{ +*/ + +/** @addtogroup EADC_EXPORTED_CONSTANTS EADC Exported Constants + @{ +*/ + +/*---------------------------------------------------------------------------------------------------------*/ +/* EADC_CTL Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define EADC_CTL_DIFFEN_SINGLE_END (0UL<CTL |= EADC_CTL_ADCRST_Msk) + +/** + * @brief Enable PDMA transfer. + * @param[in] eadc The pointer of the specified EADC module. + * @return None + * @details When A/D conversion is completed, the converted data is loaded into EADC_DATn (n: 0 ~ 18) register, + * user can enable this bit to generate a PDMA data transfer request. + * @note When set PDMAEN bit (EADC_CTL[11]), user must set ADINTENn (EADC_CTL[5:2], n=0~3) = 0 to disable interrupt. + * \hideinitializer + */ +#define EADC_ENABLE_PDMA(eadc) ((eadc)->CTL |= EADC_CTL_PDMAEN_Msk) + +/** + * @brief Disable PDMA transfer. + * @param[in] eadc The pointer of the specified EADC module. + * @return None + * @details This macro is used to disable PDMA transfer. + * \hideinitializer + */ +#define EADC_DISABLE_PDMA(eadc) ((eadc)->CTL &= (~EADC_CTL_PDMAEN_Msk)) + +/** + * @brief Enable Sample Module PDMA transfer. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleMask the combination of sample module interrupt status bits. Each bit corresponds to a sample module interrupt status. + * This parameter decides which sample module interrupts will be disabled, valid range are between 1~0x7FFFF. + * @return None + * @details When A/D conversion is completed, the converted data is loaded into EADC_DATn (n: 0 ~ 18) register, + * user can enable this bit to generate a PDMA data transfer request. + * \hideinitializer + */ +#define EADC_ENABLE_SAMPLE_MODULE_PDMA(eadc, u32ModuleMask) ((eadc)->PDMACTL |= u32ModuleMask) + +/** + * @brief Disable Sample Module PDMA transfer. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleMask the combination of sample module interrupt status bits. Each bit corresponds to a sample module interrupt status. + * This parameter decides which sample module interrupts will be disabled, valid range are between 1~0x7FFFF. + * @return None + * @details This macro is used to disable sample module PDMA transfer. + * \hideinitializer + */ +#define EADC_DISABLE_SAMPLE_MODULE_PDMA(eadc, u32ModuleMask) ((eadc)->PDMACTL &= (~u32ModuleMask)) + +/** + * @brief Enable double buffer mode. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum Decides the sample module number, valid value are from 0 to 3. + * @return None + * @details The ADC controller supports a double buffer mode in sample module 0~3. + * If user enable DBMEN (EADC_SCTLn[23], n=0~3), the double buffer mode will enable. + * \hideinitializer + */ +#define EADC_ENABLE_DOUBLE_BUFFER(eadc, u32ModuleNum) ((eadc)->SCTL[(u32ModuleNum)] |= EADC_SCTL_DBMEN_Msk) + +/** + * @brief Disable double buffer mode. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum Decides the sample module number, valid value are from 0 to 3. + * @return None + * @details Sample has one sample result register. + * \hideinitializer + */ +#define EADC_DISABLE_DOUBLE_BUFFER(eadc, u32ModuleNum) ((eadc)->SCTL[(u32ModuleNum)] &= ~EADC_SCTL_DBMEN_Msk) + +/** + * @brief Set ADIFn at A/D end of conversion. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum Decides the sample module number, valid value are from 0 to 15. + * @return None + * @details The A/D converter generates ADIFn (EADC_STATUS2[3:0], n=0~3) at the start of conversion. + * \hideinitializer + */ +#define EADC_ENABLE_INT_POSITION(eadc, u32ModuleNum) ((eadc)->SCTL[(u32ModuleNum)] |= EADC_SCTL_INTPOS_Msk) + +/** + * @brief Set ADIFn at A/D start of conversion. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum Decides the sample module number, valid value are from 0 to 15. + * @return None + * @details The A/D converter generates ADIFn (EADC_STATUS2[3:0], n=0~3) at the end of conversion. + * \hideinitializer + */ +#define EADC_DISABLE_INT_POSITION(eadc, u32ModuleNum) ((eadc)->SCTL[(u32ModuleNum)] &= ~EADC_SCTL_INTPOS_Msk) + +/** + * @brief Enable the interrupt. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32Mask Decides the combination of interrupt status bits. Each bit corresponds to a interrupt status. + * This parameter decides which interrupts will be enabled. Bit 0 is ADCIEN0, bit 1 is ADCIEN1..., bit 3 is ADCIEN3. + * @return None + * @details The A/D converter generates a conversion end ADIFn (EADC_STATUS2[n]) upon the end of specific sample module A/D conversion. + * If ADCIENn bit (EADC_CTL[n+2]) is set then conversion end interrupt request ADINTn is generated (n=0~3). + * \hideinitializer + */ +#define EADC_ENABLE_INT(eadc, u32Mask) ((eadc)->CTL |= ((u32Mask) << EADC_CTL_ADCIEN0_Pos)) + +/** + * @brief Disable the interrupt. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32Mask Decides the combination of interrupt status bits. Each bit corresponds to a interrupt status. + * This parameter decides which interrupts will be disabled. Bit 0 is ADCIEN0, bit 1 is ADCIEN1..., bit 3 is ADCIEN3. + * @return None + * @details Specific sample module A/D ADINT0 interrupt function Disabled. + * \hideinitializer + */ +#define EADC_DISABLE_INT(eadc, u32Mask) ((eadc)->CTL &= ~((u32Mask) << EADC_CTL_ADCIEN0_Pos)) + +/** + * @brief Enable the sample module interrupt. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32IntSel Decides which interrupt source will be used, valid value are from 0 to 3. + * @param[in] u32ModuleMask the combination of sample module interrupt status bits. Each bit corresponds to a sample module interrupt status. + * This parameter decides which sample module interrupts will be enabled, valid range are between 1~0x7FFFF. + * @return None + * @details There are 4 ADC interrupts ADINT0~3, and each of these interrupts has its own interrupt vector address. + * \hideinitializer + */ +#define EADC_ENABLE_SAMPLE_MODULE_INT(eadc, u32IntSel, u32ModuleMask) ((eadc)->INTSRC[(u32IntSel)] |= (u32ModuleMask)) + +/** + * @brief Disable the sample module interrupt. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32IntSel Decides which interrupt source will be used, valid value are from 0 to 3. + * @param[in] u32ModuleMask the combination of sample module interrupt status bits. Each bit corresponds to a sample module interrupt status. + * This parameter decides which sample module interrupts will be disabled, valid range are between 1~0x7FFFF. + * @return None + * @details There are 4 ADC interrupts ADINT0~3, and each of these interrupts has its own interrupt vector address. + * \hideinitializer + */ +#define EADC_DISABLE_SAMPLE_MODULE_INT(eadc, u32IntSel, u32ModuleMask) ((eadc)->INTSRC[(u32IntSel)] &= ~(u32ModuleMask)) + +/** + * @brief Set the input mode output format. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32Format Decides the output format. Valid values are: + * - EADC_CTL_DMOF_STRAIGHT_BINARY :Select the straight binary format as the output format of the conversion result. + * - EADC_CTL_DMOF_TWOS_COMPLEMENT :Select the 2's complement format as the output format of the conversion result. + * @return None + * @details The macro is used to set A/D input mode output format. + * \hideinitializer + */ +#define EADC_SET_DMOF(eadc, u32Format) ((eadc)->CTL = ((eadc)->CTL & ~EADC_CTL_DMOF_Msk) | (u32Format)) + +/** + * @brief Start the A/D conversion. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleMask The combination of sample module. Each bit corresponds to a sample module. + * This parameter decides which sample module will be conversion, valid range are between 1~0x7FFFF. + * Bit 0 is sample module 0, bit 1 is sample module 1..., bit 18 is sample module 18. + * @return None + * @details After write EADC_SWTRG register to start ADC conversion, the EADC_PENDSTS register will show which SAMPLE will conversion. + * \hideinitializer + */ +#define EADC_START_CONV(eadc, u32ModuleMask) ((eadc)->SWTRG = (u32ModuleMask)) + +/** + * @brief Cancel the conversion for sample module. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleMask The combination of sample module. Each bit corresponds to a sample module. + * This parameter decides which sample module will stop the conversion, valid range are between 1~0x7FFFF. + * Bit 0 is sample module 0, bit 1 is sample module 1..., bit 18 is sample module18. + * @return None + * @details If user want to disable the conversion of the sample module, user can write EADC_PENDSTS register to clear it. + * \hideinitializer + */ +#define EADC_STOP_CONV(eadc, u32ModuleMask) ((eadc)->PENDSTS = (u32ModuleMask)) + +/** + * @brief Get the conversion pending flag. + * @param[in] eadc The pointer of the specified EADC module. + * @return Return the conversion pending sample module. + * @details This STPFn(EADC_PENDSTS[18:0]) bit remains 1 during pending state, when the respective ADC conversion is end, + * the STPFn (n=0~18) bit is automatically cleared to 0. + * \hideinitializer + */ +#define EADC_GET_PENDING_CONV(eadc) ((eadc)->PENDSTS) + +/** + * @brief Get the conversion data of the user-specified sample module. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum Decides the sample module number, valid value are from 0 to 18. + * @return Return the conversion data of the user-specified sample module. + * @details This macro is used to read RESULT bit (EADC_DATn[15:0], n=0~18) field to get conversion data. + * \hideinitializer + */ +#define EADC_GET_CONV_DATA(eadc, u32ModuleNum) ((eadc)->DAT[(u32ModuleNum)] & EADC_DAT_RESULT_Msk) + +/** + * @brief Get the data overrun flag of the user-specified sample module. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleMask The combination of data overrun status bits. Each bit corresponds to a data overrun status, valid range are between 1~0x7FFFF. + * @return Return the data overrun flag of the user-specified sample module. + * @details This macro is used to read OV bit (EADC_STATUS0[31:16], EADC_STATUS1[18:16]) field to get data overrun status. + * \hideinitializer + */ +#define EADC_GET_DATA_OVERRUN_FLAG(eadc, u32ModuleMask) ((((eadc)->STATUS0 >> EADC_STATUS0_OV_Pos) | ((eadc)->STATUS1 & EADC_STATUS1_OV_Msk)) & (u32ModuleMask)) + +/** + * @brief Get the data valid flag of the user-specified sample module. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleMask The combination of data valid status bits. Each bit corresponds to a data valid status, valid range are between 1~0x7FFFF. + * @return Return the data valid flag of the user-specified sample module. + * @details This macro is used to read VALID bit (EADC_STATUS0[15:0], EADC_STATUS1[2:0]) field to get data valid status. + * \hideinitializer + */ +#define EADC_GET_DATA_VALID_FLAG(eadc, u32ModuleMask) ((((eadc)->STATUS0 & EADC_STATUS0_VALID_Msk) | (((eadc)->STATUS1 & EADC_STATUS1_VALID_Msk) << 16)) & (u32ModuleMask)) + +/** + * @brief Get the double data of the user-specified sample module. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum Decides the sample module number, valid value are from 0 to 18. + * @return Return the double data of the user-specified sample module. + * @details This macro is used to read RESULT bit (EADC_DDATn[15:0], n=0~3) field to get conversion data. + * \hideinitializer + */ +#define EADC_GET_DOUBLE_DATA(eadc, u32ModuleNum) ((eadc)->DDAT[(u32ModuleNum)] & EADC_DDAT0_RESULT_Msk) + +/** + * @brief Get the user-specified interrupt flags. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32Mask The combination of interrupt status bits. Each bit corresponds to a interrupt status. + * Bit 0 is ADIF0, bit 1 is ADIF1..., bit 3 is ADIF3. + * Bit 4 is ADCMPF0, bit 5 is ADCMPF1..., bit 7 is ADCMPF3. + * @return Return the user-specified interrupt flags. + * @details This macro is used to get the user-specified interrupt flags. + * \hideinitializer + */ +#define EADC_GET_INT_FLAG(eadc, u32Mask) ((eadc)->STATUS2 & (u32Mask)) + +/** + * @brief Get the user-specified sample module overrun flags. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleMask The combination of sample module overrun status bits. Each bit corresponds to a sample module overrun status, valid range are between 1~0x7FFFF. + * @return Return the user-specified sample module overrun flags. + * @details This macro is used to get the user-specified sample module overrun flags. + * \hideinitializer + */ +#define EADC_GET_SAMPLE_MODULE_OV_FLAG(eadc, u32ModuleMask) ((eadc)->OVSTS & (u32ModuleMask)) + +/** + * @brief Clear the selected interrupt status bits. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32Mask The combination of compare interrupt status bits. Each bit corresponds to a compare interrupt status. + * Bit 0 is ADIF0, bit 1 is ADIF1..., bit 3 is ADIF3. + * Bit 4 is ADCMPF0, bit 5 is ADCMPF1..., bit 7 is ADCMPF3. + * @return None + * @details This macro is used to clear clear the selected interrupt status bits. + * \hideinitializer + */ +#define EADC_CLR_INT_FLAG(eadc, u32Mask) ((eadc)->STATUS2 = (u32Mask)) + +/** + * @brief Clear the selected sample module overrun status bits. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleMask The combination of sample module overrun status bits. Each bit corresponds to a sample module overrun status. + * Bit 0 is SPOVF0, bit 1 is SPOVF1..., bit 18 is SPOVF18. + * @return None + * @details This macro is used to clear the selected sample module overrun status bits. + * \hideinitializer + */ +#define EADC_CLR_SAMPLE_MODULE_OV_FLAG(eadc, u32ModuleMask) ((eadc)->OVSTS = (u32ModuleMask)) + +/** + * @brief Check all sample module A/D result data register overrun flags. + * @param[in] eadc The pointer of the specified EADC module. + * @retval 0 None of sample module data register overrun flag is set to 1. + * @retval 1 Any one of sample module data register overrun flag is set to 1. + * @details The AOV bit (EADC_STATUS2[27]) will keep 1 when any one of sample module data register overrun flag OVn (EADC_DATn[16]) is set to 1. + * \hideinitializer + */ +#define EADC_IS_DATA_OV(eadc) (((eadc)->STATUS2 & EADC_STATUS2_AOV_Msk) >> EADC_STATUS2_AOV_Pos) + +/** + * @brief Check all sample module A/D result data register valid flags. + * @param[in] eadc The pointer of the specified EADC module. + * @retval 0 None of sample module data register valid flag is set to 1. + * @retval 1 Any one of sample module data register valid flag is set to 1. + * @details The AVALID bit (EADC_STATUS2[26]) will keep 1 when any one of sample module data register valid flag VALIDn (EADC_DATn[17]) is set to 1. + * \hideinitializer + */ +#define EADC_IS_DATA_VALID(eadc) (((eadc)->STATUS2 & EADC_STATUS2_AVALID_Msk) >> EADC_STATUS2_AVALID_Pos) + +/** + * @brief Check all A/D sample module start of conversion overrun flags. + * @param[in] eadc The pointer of the specified EADC module. + * @retval 0 None of sample module event overrun flag is set to 1. + * @retval 1 Any one of sample module event overrun flag is set to 1. + * @details The STOVF bit (EADC_STATUS2[25]) will keep 1 when any one of sample module event overrun flag SPOVFn (EADC_OVSTS[n]) is set to 1. + * \hideinitializer + */ +#define EADC_IS_SAMPLE_MODULE_OV(eadc) (((eadc)->STATUS2 & EADC_STATUS2_STOVF_Msk) >> EADC_STATUS2_STOVF_Pos) + +/** + * @brief Check all A/D interrupt flag overrun bits. + * @param[in] eadc The pointer of the specified EADC module. + * @retval 0 None of ADINT interrupt flag is overwritten to 1. + * @retval 1 Any one of ADINT interrupt flag is overwritten to 1. + * @details The ADOVIF bit (EADC_STATUS2[24]) will keep 1 when any one of ADINT interrupt flag ADOVIFn (EADC_STATUS2[11:8]) is overwritten to 1. + * \hideinitializer + */ +#define EADC_IS_INT_FLAG_OV(eadc) (((eadc)->STATUS2 & EADC_STATUS2_ADOVIF_Msk) >> EADC_STATUS2_ADOVIF_Pos) + +/** + * @brief Get the busy state of EADC. + * @param[in] eadc The pointer of the specified EADC module. + * @retval 0 Idle state. + * @retval 1 Busy state. + * @details This macro is used to read BUSY bit (EADC_STATUS2[23]) to get busy state. + * \hideinitializer + */ +#define EADC_IS_BUSY(eadc) (((eadc)->STATUS2 & EADC_STATUS2_BUSY_Msk) >> EADC_STATUS2_BUSY_Pos) + +/** + * @brief Configure the comparator 0 and enable it. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum specifies the compare sample module, valid value are from 0 to 18. + * @param[in] u32Condition specifies the compare condition. Valid values are: + * - \ref EADC_CMP_CMPCOND_LESS_THAN :The compare condition is "less than the compare value" + * - \ref EADC_CMP_CMPCOND_GREATER_OR_EQUAL :The compare condition is "greater than or equal to the compare value + * @param[in] u16CMPData specifies the compare value, valid range are between 0~0xFFF. + * @param[in] u32MatchCount specifies the match count setting, valid range are between 0~0xF. + * @return None + * @details For example, ADC_ENABLE_CMP0(EADC, 5, ADC_ADCMPR_CMPCOND_GREATER_OR_EQUAL, 0x800, 10, EADC_CMP_CMPWEN_DISABLE, EADC_CMP_ADCMPIE_ENABLE); + * Means EADC will assert comparator 0 flag if sample module 5 conversion result is greater or + * equal to 0x800 for 10 times continuously, and a compare interrupt request is generated. + * \hideinitializer + */ +#define EADC_ENABLE_CMP0(eadc,\ + u32ModuleNum,\ + u32Condition,\ + u16CMPData,\ + u32MatchCount) ((eadc)->CMP[0] = (((eadc)->CMP[0] & ~(EADC_CMP_CMPSPL_Msk|EADC_CMP_CMPCOND_Msk|EADC_CMP_CMPDAT_Msk|EADC_CMP_CMPMCNT_Msk))|\ + (((u32ModuleNum) << EADC_CMP_CMPSPL_Pos)|\ + (u32Condition) |\ + ((u16CMPData) << EADC_CMP_CMPDAT_Pos)| \ + (((u32MatchCount) - 1) << EADC_CMP_CMPMCNT_Pos)|\ + EADC_CMP_ADCMPEN_Msk))) + +/** + * @brief Configure the comparator 1 and enable it. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum specifies the compare sample module, valid value are from 0 to 18. + * @param[in] u32Condition specifies the compare condition. Valid values are: + * - \ref EADC_CMP_CMPCOND_LESS_THAN :The compare condition is "less than the compare value" + * - \ref EADC_CMP_CMPCOND_GREATER_OR_EQUAL :The compare condition is "greater than or equal to the compare value + * @param[in] u16CMPData specifies the compare value, valid range are between 0~0xFFF. + * @param[in] u32MatchCount specifies the match count setting, valid range are between 0~0xF. + * @return None + * @details For example, ADC_ENABLE_CMP1(EADC, 5, ADC_ADCMPR_CMPCOND_GREATER_OR_EQUAL, 0x800, 10, EADC_CMP_ADCMPIE_ENABLE); + * Means EADC will assert comparator 1 flag if sample module 5 conversion result is greater or + * equal to 0x800 for 10 times continuously, and a compare interrupt request is generated. + * \hideinitializer + */ +#define EADC_ENABLE_CMP1(eadc,\ + u32ModuleNum,\ + u32Condition,\ + u16CMPData,\ + u32MatchCount) ((eadc)->CMP[1] = (((eadc)->CMP[1] & ~(EADC_CMP_CMPSPL_Msk|EADC_CMP_CMPCOND_Msk|EADC_CMP_CMPDAT_Msk|EADC_CMP_CMPMCNT_Msk))|\ + (((u32ModuleNum) << EADC_CMP_CMPSPL_Pos)|\ + (u32Condition) |\ + ((u16CMPData) << EADC_CMP_CMPDAT_Pos)| \ + (((u32MatchCount) - 1) << EADC_CMP_CMPMCNT_Pos)|\ + EADC_CMP_ADCMPEN_Msk))) + +/** + * @brief Configure the comparator 2 and enable it. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum specifies the compare sample module, valid value are from 0 to 18. + * @param[in] u32Condition specifies the compare condition. Valid values are: + * - \ref EADC_CMP_CMPCOND_LESS_THAN :The compare condition is "less than the compare value" + * - \ref EADC_CMP_CMPCOND_GREATER_OR_EQUAL :The compare condition is "greater than or equal to the compare value + * @param[in] u16CMPData specifies the compare value, valid range are between 0~0xFFF. + * @param[in] u32MatchCount specifies the match count setting, valid range are between 0~0xF. + * @return None + * @details For example, ADC_ENABLE_CMP2(EADC, 5, ADC_ADCMPR_CMPCOND_GREATER_OR_EQUAL, 0x800, 10, EADC_CMP_CMPWEN_DISABLE, EADC_CMP_ADCMPIE_ENABLE); + * Means EADC will assert comparator 2 flag if sample module 5 conversion result is greater or + * equal to 0x800 for 10 times continuously, and a compare interrupt request is generated. + * \hideinitializer + */ +#define EADC_ENABLE_CMP2(eadc,\ + u32ModuleNum,\ + u32Condition,\ + u16CMPData,\ + u32MatchCount) ((eadc)->CMP[2] = (((eadc)->CMP[2] & ~(EADC_CMP_CMPSPL_Msk|EADC_CMP_CMPCOND_Msk|EADC_CMP_CMPDAT_Msk|EADC_CMP_CMPMCNT_Msk))|\ + (((u32ModuleNum) << EADC_CMP_CMPSPL_Pos)|\ + (u32Condition) |\ + ((u16CMPData) << EADC_CMP_CMPDAT_Pos)| \ + (((u32MatchCount) - 1) << EADC_CMP_CMPMCNT_Pos)|\ + EADC_CMP_ADCMPEN_Msk))) + +/** + * @brief Configure the comparator 3 and enable it. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum specifies the compare sample module, valid value are from 0 to 18. + * @param[in] u32Condition specifies the compare condition. Valid values are: + * - \ref EADC_CMP_CMPCOND_LESS_THAN :The compare condition is "less than the compare value" + * - \ref EADC_CMP_CMPCOND_GREATER_OR_EQUAL :The compare condition is "greater than or equal to the compare value + * @param[in] u16CMPData specifies the compare value, valid range are between 0~0xFFF. + * @param[in] u32MatchCount specifies the match count setting, valid range are between 1~0xF. + * @return None + * @details For example, ADC_ENABLE_CMP3(EADC, 5, ADC_ADCMPR_CMPCOND_GREATER_OR_EQUAL, 0x800, 10, EADC_CMP_ADCMPIE_ENABLE); + * Means EADC will assert comparator 3 flag if sample module 5 conversion result is greater or + * equal to 0x800 for 10 times continuously, and a compare interrupt request is generated. + * \hideinitializer + */ +#define EADC_ENABLE_CMP3(eadc,\ + u32ModuleNum,\ + u32Condition,\ + u16CMPData,\ + u32MatchCount) ((eadc)->CMP[3] = (((eadc)->CMP[3] & ~(EADC_CMP_CMPSPL_Msk|EADC_CMP_CMPCOND_Msk|EADC_CMP_CMPDAT_Msk|EADC_CMP_CMPMCNT_Msk))|\ + (((u32ModuleNum) << EADC_CMP_CMPSPL_Pos)|\ + (u32Condition) |\ + ((u16CMPData) << EADC_CMP_CMPDAT_Pos)| \ + (((u32MatchCount) - 1) << EADC_CMP_CMPMCNT_Pos)|\ + EADC_CMP_ADCMPEN_Msk))) + +/** + * @brief Enable the compare window mode. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32CMP Specifies the compare register, valid value are 0 and 2. + * @return None + * @details ADCMPF0 (EADC_STATUS2[4]) will be set when both EADC_CMP0 and EADC_CMP1 compared condition matched. + * \hideinitializer + */ +#define EADC_ENABLE_CMP_WINDOW_MODE(eadc, u32CMP) ((eadc)->CMP[(u32CMP)] |= EADC_CMP_CMPWEN_Msk) + +/** + * @brief Disable the compare window mode. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32CMP Specifies the compare register, valid value are 0 and 2. + * @return None + * @details ADCMPF2 (EADC_STATUS2[6]) will be set when both EADC_CMP2 and EADC_CMP3 compared condition matched. + * \hideinitializer + */ +#define EADC_DISABLE_CMP_WINDOW_MODE(eadc, u32CMP) ((eadc)->CMP[(u32CMP)] &= ~EADC_CMP_CMPWEN_Msk) + +/** + * @brief Enable the compare interrupt. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32CMP Specifies the compare register, valid value are from 0 to 3. + * @return None + * @details If the compare function is enabled and the compare condition matches the setting of CMPCOND (EADC_CMPn[2], n=0~3) + * and CMPMCNT (EADC_CMPn[11:8], n=0~3), ADCMPFn (EADC_STATUS2[7:4], n=0~3) will be asserted, in the meanwhile, + * if ADCMPIE is set to 1, a compare interrupt request is generated. + * \hideinitializer + */ +#define EADC_ENABLE_CMP_INT(eadc, u32CMP) ((eadc)->CMP[(u32CMP)] |= EADC_CMP_ADCMPIE_Msk) + +/** + * @brief Disable the compare interrupt. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32CMP Specifies the compare register, valid value are from 0 to 3. + * @return None + * @details This macro is used to disable the compare interrupt. + * \hideinitializer + */ +#define EADC_DISABLE_CMP_INT(eadc, u32CMP) ((eadc)->CMP[(u32CMP)] &= ~EADC_CMP_ADCMPIE_Msk) + +/** + * @brief Disable comparator 0. + * @param[in] eadc The pointer of the specified EADC module. + * @return None + * @details This macro is used to disable comparator 0. + * \hideinitializer + */ +#define EADC_DISABLE_CMP0(eadc) ((eadc)->CMP[0] = 0) + +/** + * @brief Disable comparator 1. + * @param[in] eadc The pointer of the specified EADC module. + * @return None + * @details This macro is used to disable comparator 1. + * \hideinitializer + */ +#define EADC_DISABLE_CMP1(eadc) ((eadc)->CMP[1] = 0) + +/** + * @brief Disable comparator 2. + * @param[in] eadc The pointer of the specified EADC module. + * @return None + * @details This macro is used to disable comparator 2. + * \hideinitializer + */ +#define EADC_DISABLE_CMP2(eadc) ((eadc)->CMP[2] = 0) + +/** + * @brief Disable comparator 3. + * @param[in] eadc The pointer of the specified EADC module. + * @return None + * @details This macro is used to disable comparator 3. + * \hideinitializer + */ +#define EADC_DISABLE_CMP3(eadc) ((eadc)->CMP[3] = 0) + +/*---------------------------------------------------------------------------------------------------------*/ +/* Define EADC functions prototype */ +/*---------------------------------------------------------------------------------------------------------*/ +void EADC_Open(EADC_T *eadc, uint32_t u32InputMode); +void EADC_Close(EADC_T *eadc); +void EADC_ConfigSampleModule(EADC_T *eadc, uint32_t u32ModuleNum, uint32_t u32TriggerSrc, uint32_t u32Channel); +void EADC_SetTriggerDelayTime(EADC_T *eadc, uint32_t u32ModuleNum, uint32_t u32TriggerDelayTime, uint32_t u32DelayClockDivider); +void EADC_SetExtendSampleTime(EADC_T *eadc, uint32_t u32ModuleNum, uint32_t u32ExtendSampleTime); + +/*@}*/ /* end of group EADC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group EADC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_EADC_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ebi.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ebi.h new file mode 100644 index 0000000000..83b6a68687 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ebi.h @@ -0,0 +1,350 @@ +/**************************************************************************//** + * @file nu_ebi.h + * @brief External Bus Interface(EBI) driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_EBI_H__ +#define __NU_EBI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup EBI_Driver EBI Driver + @{ +*/ + +/** @addtogroup EBI_EXPORTED_CONSTANTS EBI Exported Constants + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* Miscellaneous Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define EBI_BANK0_BASE_ADDR 0x68000000UL /*!< EBI bank0 base address \hideinitializer */ +#define EBI_BANK1_BASE_ADDR 0x68100000UL /*!< EBI bank1 base address \hideinitializer */ +#define EBI_BANK2_BASE_ADDR 0x68200000UL /*!< EBI bank2 base address \hideinitializer */ +#define EBI_MAX_SIZE 0x00100000UL /*!< Maximum EBI size for each bank is 1 MB \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Constants for EBI bank number */ +/*---------------------------------------------------------------------------------------------------------*/ +#define EBI_BANK0 0UL /*!< EBI bank 0 \hideinitializer */ +#define EBI_BANK1 1UL /*!< EBI bank 1 \hideinitializer */ +#define EBI_BANK2 2UL /*!< EBI bank 2 \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Constants for EBI data bus width */ +/*---------------------------------------------------------------------------------------------------------*/ +#define EBI_BUSWIDTH_8BIT 8UL /*!< EBI bus width is 8-bit \hideinitializer */ +#define EBI_BUSWIDTH_16BIT 16UL /*!< EBI bus width is 16-bit \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Constants for EBI CS Active Level */ +/*---------------------------------------------------------------------------------------------------------*/ +#define EBI_CS_ACTIVE_LOW 0UL /*!< EBI CS active level is low \hideinitializer */ +#define EBI_CS_ACTIVE_HIGH 1UL /*!< EBI CS active level is high \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Constants for EBI MCLK divider and Timing */ +/*---------------------------------------------------------------------------------------------------------*/ +#define EBI_MCLKDIV_1 0x0UL /*!< EBI output clock(MCLK) is HCLK/1 \hideinitializer */ +#define EBI_MCLKDIV_2 0x1UL /*!< EBI output clock(MCLK) is HCLK/2 \hideinitializer */ +#define EBI_MCLKDIV_4 0x2UL /*!< EBI output clock(MCLK) is HCLK/4 \hideinitializer */ +#define EBI_MCLKDIV_8 0x3UL /*!< EBI output clock(MCLK) is HCLK/8 \hideinitializer */ +#define EBI_MCLKDIV_16 0x4UL /*!< EBI output clock(MCLK) is HCLK/16 \hideinitializer */ +#define EBI_MCLKDIV_32 0x5UL /*!< EBI output clock(MCLK) is HCLK/32 \hideinitializer */ +#define EBI_MCLKDIV_64 0x6UL /*!< EBI output clock(MCLK) is HCLK/64 \hideinitializer */ +#define EBI_MCLKDIV_128 0x7UL /*!< EBI output clock(MCLK) is HCLK/128 \hideinitializer */ + +#define EBI_TIMING_FASTEST 0x0UL /*!< EBI timing is the fastest \hideinitializer */ +#define EBI_TIMING_VERYFAST 0x1UL /*!< EBI timing is very fast \hideinitializer */ +#define EBI_TIMING_FAST 0x2UL /*!< EBI timing is fast \hideinitializer */ +#define EBI_TIMING_NORMAL 0x3UL /*!< EBI timing is normal \hideinitializer */ +#define EBI_TIMING_SLOW 0x4UL /*!< EBI timing is slow \hideinitializer */ +#define EBI_TIMING_VERYSLOW 0x5UL /*!< EBI timing is very slow \hideinitializer */ +#define EBI_TIMING_SLOWEST 0x6UL /*!< EBI timing is the slowest \hideinitializer */ + +#define EBI_OPMODE_NORMAL 0x0UL /*!< EBI bus operate in normal mode \hideinitializer */ +#define EBI_OPMODE_CACCESS (EBI_CTL_CACCESS_Msk) /*!< EBI bus operate in Continuous Data Access mode \hideinitializer */ +#define EBI_OPMODE_ADSEPARATE (EBI_CTL_ADSEPEN_Msk) /*!< EBI bus operate in AD Separate mode \hideinitializer */ + +/*@}*/ /* end of group EBI_EXPORTED_CONSTANTS */ + + +/** @addtogroup EBI_EXPORTED_FUNCTIONS EBI Exported Functions + @{ +*/ + +/** + * @brief Read 8-bit data on EBI bank0 + * + * @param[in] u32Addr The data address on EBI bank0. + * + * @return 8-bit Data + * + * @details This macro is used to read 8-bit data from specify address on EBI bank0. + * \hideinitializer + */ +#define EBI0_READ_DATA8(u32Addr) (*((volatile unsigned char *)(EBI_BANK0_BASE_ADDR+(u32Addr)))) + +/** + * @brief Write 8-bit data to EBI bank0 + * + * @param[in] u32Addr The data address on EBI bank0. + * @param[in] u32Data Specify data to be written. + * + * @return None + * + * @details This macro is used to write 8-bit data to specify address on EBI bank0. + * \hideinitializer + */ +#define EBI0_WRITE_DATA8(u32Addr, u32Data) (*((volatile unsigned char *)(EBI_BANK0_BASE_ADDR+(u32Addr))) = (u32Data)) + +/** + * @brief Read 16-bit data on EBI bank0 + * + * @param[in] u32Addr The data address on EBI bank0. + * + * @return 16-bit Data + * + * @details This macro is used to read 16-bit data from specify address on EBI bank0. + * \hideinitializer + */ +#define EBI0_READ_DATA16(u32Addr) (*((volatile unsigned short *)(EBI_BANK0_BASE_ADDR+(u32Addr)))) + +/** + * @brief Write 16-bit data to EBI bank0 + * + * @param[in] u32Addr The data address on EBI bank0. + * @param[in] u32Data Specify data to be written. + * + * @return None + * + * @details This macro is used to write 16-bit data to specify address on EBI bank0. + * \hideinitializer + */ +#define EBI0_WRITE_DATA16(u32Addr, u32Data) (*((volatile unsigned short *)(EBI_BANK0_BASE_ADDR+(u32Addr))) = (u32Data)) + +/** + * @brief Read 32-bit data on EBI bank0 + * + * @param[in] u32Addr The data address on EBI bank0. + * + * @return 32-bit Data + * + * @details This macro is used to read 32-bit data from specify address on EBI bank0. + * \hideinitializer + */ +#define EBI0_READ_DATA32(u32Addr) (*((volatile unsigned int *)(EBI_BANK0_BASE_ADDR+(u32Addr)))) + +/** + * @brief Write 32-bit data to EBI bank0 + * + * @param[in] u32Addr The data address on EBI bank0. + * @param[in] u32Data Specify data to be written. + * + * @return None + * + * @details This macro is used to write 32-bit data to specify address on EBI bank0. + * \hideinitializer + */ +#define EBI0_WRITE_DATA32(u32Addr, u32Data) (*((volatile unsigned int *)(EBI_BANK0_BASE_ADDR+(u32Addr))) = (u32Data)) + +/** + * @brief Read 8-bit data on EBI bank1 + * + * @param[in] u32Addr The data address on EBI bank1. + * + * @return 8-bit Data + * + * @details This macro is used to read 8-bit data from specify address on EBI bank1. + * \hideinitializer + */ +#define EBI1_READ_DATA8(u32Addr) (*((volatile unsigned char *)(EBI_BANK1_BASE_ADDR+(u32Addr)))) + +/** + * @brief Write 8-bit data to EBI bank1 + * + * @param[in] u32Addr The data address on EBI bank1. + * @param[in] u32Data Specify data to be written. + * + * @return None + * + * @details This macro is used to write 8-bit data to specify address on EBI bank1. + * \hideinitializer + */ +#define EBI1_WRITE_DATA8(u32Addr, u32Data) (*((volatile unsigned char *)(EBI_BANK1_BASE_ADDR+(u32Addr))) = (u32Data)) + +/** + * @brief Read 16-bit data on EBI bank1 + * + * @param[in] u32Addr The data address on EBI bank1. + * + * @return 16-bit Data + * + * @details This macro is used to read 16-bit data from specify address on EBI bank1. + * \hideinitializer + */ +#define EBI1_READ_DATA16(u32Addr) (*((volatile unsigned short *)(EBI_BANK1_BASE_ADDR+(u32Addr)))) + +/** + * @brief Write 16-bit data to EBI bank1 + * + * @param[in] u32Addr The data address on EBI bank1. + * @param[in] u32Data Specify data to be written. + * + * @return None + * + * @details This macro is used to write 16-bit data to specify address on EBI bank1. + * \hideinitializer + */ +#define EBI1_WRITE_DATA16(u32Addr, u32Data) (*((volatile unsigned short *)(EBI_BANK1_BASE_ADDR+(u32Addr))) = (u32Data)) + +/** + * @brief Read 32-bit data on EBI bank1 + * + * @param[in] u32Addr The data address on EBI bank1. + * + * @return 32-bit Data + * + * @details This macro is used to read 32-bit data from specify address on EBI bank1. + * \hideinitializer + */ +#define EBI1_READ_DATA32(u32Addr) (*((volatile unsigned int *)(EBI_BANK1_BASE_ADDR+(u32Addr)))) + +/** + * @brief Write 32-bit data to EBI bank1 + * + * @param[in] u32Addr The data address on EBI bank1. + * @param[in] u32Data Specify data to be written. + * + * @return None + * + * @details This macro is used to write 32-bit data to specify address on EBI bank1. + * \hideinitializer + */ +#define EBI1_WRITE_DATA32(u32Addr, u32Data) (*((volatile unsigned int *)(EBI_BANK1_BASE_ADDR+(u32Addr))) = (u32Data)) + +/** + * @brief Read 8-bit data on EBI bank2 + * + * @param[in] u32Addr The data address on EBI bank2. + * + * @return 8-bit Data + * + * @details This macro is used to read 8-bit data from specify address on EBI bank2. + * \hideinitializer + */ +#define EBI2_READ_DATA8(u32Addr) (*((volatile unsigned char *)(EBI_BANK2_BASE_ADDR+(u32Addr)))) + +/** + * @brief Write 8-bit data to EBI bank2 + * + * @param[in] u32Addr The data address on EBI bank2. + * @param[in] u32Data Specify data to be written. + * + * @return None + * + * @details This macro is used to write 8-bit data to specify address on EBI bank2. + * \hideinitializer + */ +#define EBI2_WRITE_DATA8(u32Addr, u32Data) (*((volatile unsigned char *)(EBI_BANK2_BASE_ADDR+(u32Addr))) = (u32Data)) + +/** + * @brief Read 16-bit data on EBI bank2 + * + * @param[in] u32Addr The data address on EBI bank2. + * + * @return 16-bit Data + * + * @details This macro is used to read 16-bit data from specify address on EBI bank2. + * \hideinitializer + */ +#define EBI2_READ_DATA16(u32Addr) (*((volatile unsigned short *)(EBI_BANK2_BASE_ADDR+(u32Addr)))) + +/** + * @brief Write 16-bit data to EBI bank2 + * + * @param[in] u32Addr The data address on EBI bank2. + * @param[in] u32Data Specify data to be written. + * + * @return None + * + * @details This macro is used to write 16-bit data to specify address on EBI bank2. + * \hideinitializer + */ +#define EBI2_WRITE_DATA16(u32Addr, u32Data) (*((volatile unsigned short *)(EBI_BANK2_BASE_ADDR+(u32Addr))) = (u32Data)) + +/** + * @brief Read 32-bit data on EBI bank2 + * + * @param[in] u32Addr The data address on EBI bank2. + * + * @return 32-bit Data + * + * @details This macro is used to read 32-bit data from specify address on EBI bank2. + * \hideinitializer + */ +#define EBI2_READ_DATA32(u32Addr) (*((volatile unsigned int *)(EBI_BANK2_BASE_ADDR+(u32Addr)))) + +/** + * @brief Write 32-bit data to EBI bank2 + * + * @param[in] u32Addr The data address on EBI bank2. + * @param[in] u32Data Specify data to be written. + * + * @return None + * + * @details This macro is used to write 32-bit data to specify address on EBI bank2. + * \hideinitializer + */ +#define EBI2_WRITE_DATA32(u32Addr, u32Data) (*((volatile unsigned int *)(EBI_BANK2_BASE_ADDR+(u32Addr))) = (u32Data)) + +/** + * @brief Enable EBI Write Buffer + * + * @param None + * + * @return None + * + * @details This macro is used to improve EBI write operation for all EBI banks. + * \hideinitializer + */ +#define EBI_ENABLE_WRITE_BUFFER() (EBI->CTL0 |= EBI_CTL_WBUFEN_Msk); + +/** + * @brief Disable EBI Write Buffer + * + * @param None + * + * @return None + * + * @details This macro is used to disable EBI write buffer function. + * \hideinitializer + */ +#define EBI_DISABLE_WRITE_BUFFER() (EBI->CTL0 &= ~EBI_CTL_WBUFEN_Msk); + +void EBI_Open(uint32_t u32Bank, uint32_t u32DataWidth, uint32_t u32TimingClass, uint32_t u32BusMode, uint32_t u32CSActiveLevel); +void EBI_Close(uint32_t u32Bank); +void EBI_SetBusTiming(uint32_t u32Bank, uint32_t u32TimingConfig, uint32_t u32MclkDiv); + +/*@}*/ /* end of group EBI_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group EBI_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ecap.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ecap.h new file mode 100644 index 0000000000..a17981ceec --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_ecap.h @@ -0,0 +1,453 @@ +/**************************************************************************//** + * @file nu_ecap.h + * @brief EnHanced Input Capture Timer(ECAP) driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_ECAP_H__ +#define __NU_ECAP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup ECAP_Driver ECAP Driver + @{ +*/ + +/** @addtogroup ECAP_EXPORTED_CONSTANTS ECAP Exported Constants + @{ +*/ + +#define ECAP_IC0 (0UL) /*!< ECAP IC0 Unit \hideinitializer */ +#define ECAP_IC1 (1UL) /*!< ECAP IC1 Unit \hideinitializer */ +#define ECAP_IC2 (2UL) /*!< ECAP IC2 Unit \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* ECAP CTL0 constant definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define ECAP_NOISE_FILTER_CLKDIV_1 (0UL<CTL0 = ((ecap)->CTL0 & ~ECAP_CTL0_NFCLKSEL_Msk)|(u32ClkSel)) + +/** + * @brief This macro is used to disable noise filter + * @param[in] ecap Specify ECAP port + * @return None + * @details This macro will disable the noise filter of input capture. + * \hideinitializer + */ +#define ECAP_NOISE_FILTER_DISABLE(ecap) ((ecap)->CTL0 |= ECAP_CTL0_CAPNFDIS_Msk) + +/** + * @brief This macro is used to enable noise filter + * @param[in] ecap Specify ECAP port + * @param[in] u32ClkSel Select noise filter clock divide number + * - \ref ECAP_NOISE_FILTER_CLKDIV_1 + * - \ref ECAP_NOISE_FILTER_CLKDIV_2 + * - \ref ECAP_NOISE_FILTER_CLKDIV_4 + * - \ref ECAP_NOISE_FILTER_CLKDIV_16 + * - \ref ECAP_NOISE_FILTER_CLKDIV_32 + * - \ref ECAP_NOISE_FILTER_CLKDIV_64 + * @return None + * @details This macro will enable the noise filter of input capture and set noise filter clock divide. + * \hideinitializer + */ +#define ECAP_NOISE_FILTER_ENABLE(ecap, u32ClkSel) ((ecap)->CTL0 = ((ecap)->CTL0 & ~(ECAP_CTL0_CAPNFDIS_Msk|ECAP_CTL0_NFCLKSEL_Msk))|(u32ClkSel)) + +/** + * @brief This macro is used to enable input channel unit + * @param[in] ecap Specify ECAP port + * @param[in] u32Mask The input channel mask + * - \ref ECAP_CTL0_IC0EN_Msk + * - \ref ECAP_CTL0_IC1EN_Msk + * - \ref ECAP_CTL0_IC2EN_Msk + * @return None + * @details This macro will enable the input channel_n to input capture. + * \hideinitializer + */ +#define ECAP_ENABLE_INPUT_CHANNEL(ecap, u32Mask) ((ecap)->CTL0 |= (u32Mask)) + +/** + * @brief This macro is used to disable input channel unit + * @param[in] ecap Specify ECAP port + * @param[in] u32Mask The input channel mask + * - \ref ECAP_CTL0_IC0EN_Msk + * - \ref ECAP_CTL0_IC1EN_Msk + * - \ref ECAP_CTL0_IC2EN_Msk + * @return None + * @details This macro will disable the input channel_n to input capture. + * \hideinitializer + */ +#define ECAP_DISABLE_INPUT_CHANNEL(ecap, u32Mask) ((ecap)->CTL0 &= ~(u32Mask)) + +/** + * @brief This macro is used to select input channel source + * @param[in] ecap Specify ECAP port + * @param[in] u32Index The input channel number + * - \ref ECAP_IC0 + * - \ref ECAP_IC1 + * - \ref ECAP_IC2 + * @param[in] u32Src The input source + * - \ref ECAP_CAP_INPUT_SRC_FROM_IC + * - \ref ECAP_CAP_INPUT_SRC_FROM_CH + * @return None + * @details This macro will select the input source from ICx, CHx. + * \hideinitializer + */ +#define ECAP_SEL_INPUT_SRC(ecap, u32Index, u32Src) ((ecap)->CTL0 = ((ecap)->CTL0 & ~(ECAP_CTL0_CAPSEL0_Msk<<((u32Index)<<1)))|(((u32Src)<CTL0 |= (u32Mask)) + +/** + * @brief This macro is used to disable input channel interrupt + * @param[in] ecap Specify ECAP port + * @param[in] u32Mask The input channel mask + * - \ref ECAP_IC0 + * - \ref ECAP_IC1 + * - \ref ECAP_IC2 + * @return None + * @details This macro will disable the input channel_n interrupt. + * \hideinitializer + */ +#define ECAP_DISABLE_INT(ecap, u32Mask) ((ecap)->CTL0 &= ~(u32Mask)) + +/** + * @brief This macro is used to enable input channel overflow interrupt + * @param[in] ecap Specify ECAP port + * @return None + * @details This macro will enable the input channel overflow interrupt. + * \hideinitializer + */ +#define ECAP_ENABLE_OVF_INT(ecap) ((ecap)->CTL0 |= ECAP_CTL0_OVIEN_Msk) + +/** + * @brief This macro is used to disable input channel overflow interrupt + * @param[in] ecap Specify ECAP port + * @return None + * @details This macro will disable the input channel overflow interrupt. + * \hideinitializer + */ +#define ECAP_DISABLE_OVF_INT(ecap) ((ecap)->CTL0 &= ~ECAP_CTL0_OVIEN_Msk) + +/** + * @brief This macro is used to enable input channel compare-match interrupt + * @param[in] ecap Specify ECAP port + * @return None + * @details This macro will enable the input channel compare-match interrupt. + * \hideinitializer + */ +#define ECAP_ENABLE_CMP_MATCH_INT(ecap) ((ecap)->CTL0 |= ECAP_CTL0_CMPIEN_Msk) + +/** + * @brief This macro is used to disable input channel compare-match interrupt + * @param[in] ecap Specify ECAP port + * @return None + * @details This macro will disable the input channel compare-match interrupt. + * \hideinitializer + */ +#define ECAP_DISABLE_CMP_MATCH_INT(ecap) ((ecap)->CTL0 &= ~ECAP_CTL0_CMPIEN_Msk) + +/** + * @brief This macro is used to start capture counter + * @param[in] ecap Specify ECAP port + * @return None + * @details This macro will start capture counter up-counting. + * \hideinitializer + */ +#define ECAP_CNT_START(ecap) ((ecap)->CTL0 |= ECAP_CTL0_CNTEN_Msk) + +/** + * @brief This macro is used to stop capture counter + * @param[in] ecap Specify ECAP port + * @return None + * @details This macro will stop capture counter up-counting. + * \hideinitializer + */ +#define ECAP_CNT_STOP(ecap) ((ecap)->CTL0 &= ~ECAP_CTL0_CNTEN_Msk) + +/** + * @brief This macro is used to set event to clear capture counter + * @param[in] ecap Specify ECAP port + * @param[in] u32Event The input channel number + * - \ref ECAP_CTL1_CAP0CLREN_Msk + * - \ref ECAP_CTL1_CAP1CLREN_Msk + * - \ref ECAP_CTL1_CAP2CLREN_Msk + * @return None + * @details This macro will enable and select compare or capture event that can clear capture counter. + * \hideinitializer + */ +#define ECAP_SET_CNT_CLEAR_EVENT(ecap, u32Event) do{ \ + if((u32Event) & ECAP_CTL0_CMPCLREN_Msk) \ + (ecap)->CTL0 |= ECAP_CTL0_CMPCLREN_Msk; \ + else \ + (ecap)->CTL0 &= ~ECAP_CTL0_CMPCLREN_Msk; \ + (ecap)->CTL1 = ((ecap)->CTL1 &~0x700000) | ((u32Event) & 0x700000); \ + }while(0); + +/** + * @brief This macro is used to enable compare function + * @param[in] ecap Specify ECAP port + * @return None + * @details This macro will enable the compare function. + * \hideinitializer + */ +#define ECAP_ENABLE_CMP(ecap) ((ecap)->CTL0 |= ECAP_CTL0_CMPEN_Msk) + +/** + * @brief This macro is used to disable compare function + * @param[in] ecap Specify ECAP port + * @return None + * @details This macro will disable the compare function. + * \hideinitializer + */ +#define ECAP_DISABLE_CMP(ecap) ((ecap)->CTL0 &= ~ECAP_CTL0_CMPEN_Msk) + +/** + * @brief This macro is used to enable input capture function. + * @param[in] ecap Specify ECAP port + * @return None + * @details This macro will enable input capture timer/counter. + * \hideinitializer + */ +#define ECAP_ENABLE_CNT(ecap) ((ecap)->CTL0 |= ECAP_CTL0_CAPEN_Msk) + +/** + * @brief This macro is used to disable input capture function. + * @param[in] ecap Specify ECAP port + * @return None + * @details This macro will disable input capture timer/counter. + * \hideinitializer + */ +#define ECAP_DISABLE_CNT(ecap) ((ecap)->CTL0 &= ~ECAP_CTL0_CAPEN_Msk) + +/** + * @brief This macro is used to select input channel edge detection + * @param[in] ecap Specify ECAP port + * @param[in] u32Index The input channel number + * - \ref ECAP_IC0 + * - \ref ECAP_IC1 + * - \ref ECAP_IC2 + * @param[in] u32Edge The input source + * - \ref ECAP_RISING_EDGE + * - \ref ECAP_FALLING_EDGE + * - \ref ECAP_RISING_FALLING_EDGE + * @return None + * @details This macro will select input capture can detect falling edge, rising edge or either rising or falling edge change. + * \hideinitializer + */ +#define ECAP_SEL_CAPTURE_EDGE(ecap, u32Index, u32Edge) ((ecap)->CTL1 = ((ecap)->CTL1 & ~(ECAP_CTL1_EDGESEL0_Msk<<((u32Index)<<1)))|((u32Edge)<<((u32Index)<<1))) + +/** + * @brief This macro is used to select ECAP counter reload trigger source + * @param[in] ecap Specify ECAP port + * @param[in] u32TrigSrc The input source + * - \ref ECAP_CTL1_CAP0RLDEN_Msk + * - \ref ECAP_CTL1_CAP1RLDEN_Msk + * - \ref ECAP_CTL1_CAP2RLDEN_Msk + * - \ref ECAP_CTL1_OVRLDEN_Msk + * @return None + * @details This macro will select capture counter reload trigger source. + * \hideinitializer + */ +#define ECAP_SEL_RELOAD_TRIG_SRC(ecap, u32TrigSrc) ((ecap)->CTL1 = ((ecap)->CTL1 & ~0xF00)|(u32TrigSrc)) + +/** + * @brief This macro is used to select capture timer clock divide. + * @param[in] ecap Specify ECAP port + * @param[in] u32Clkdiv The input source + * - \ref ECAP_CAPTURE_TIMER_CLKDIV_1 + * - \ref ECAP_CAPTURE_TIMER_CLKDIV_4 + * - \ref ECAP_CAPTURE_TIMER_CLKDIV_16 + * - \ref ECAP_CAPTURE_TIMER_CLKDIV_32 + * - \ref ECAP_CAPTURE_TIMER_CLKDIV_64 + * - \ref ECAP_CAPTURE_TIMER_CLKDIV_96 + * - \ref ECAP_CAPTURE_TIMER_CLKDIV_112 + * - \ref ECAP_CAPTURE_TIMER_CLKDIV_128 + * @return None + * @details This macro will select capture timer clock has a pre-divider with eight divided option. + * \hideinitializer + */ +#define ECAP_SEL_TIMER_CLK_DIV(ecap, u32Clkdiv) ((ecap)->CTL1 = ((ecap)->CTL1 & ~ECAP_CTL1_CLKSEL_Msk)|(u32Clkdiv)) + +/** + * @brief This macro is used to select capture timer/counter clock source + * @param[in] ecap Specify ECAP port + * @param[in] u32ClkSrc The input source + * - \ref ECAP_CAPTURE_TIMER_CLK_SRC_CAP_CLK + * - \ref ECAP_CAPTURE_TIMER_CLK_SRC_CAP0 + * - \ref ECAP_CAPTURE_TIMER_CLK_SRC_CAP1 + * - \ref ECAP_CAPTURE_TIMER_CLK_SRC_CAP2 + * @return None + * @details This macro will select capture timer/clock clock source. + * \hideinitializer + */ +#define ECAP_SEL_TIMER_CLK_SRC(ecap, u32ClkSrc) ((ecap)->CTL1 = ((ecap)->CTL1 & ~ECAP_CTL1_CNTSRCSEL_Msk)|(u32ClkSrc)) + +/** + * @brief This macro is used to read input capture status + * @param[in] ecap Specify ECAP port + * @return Input capture status flags + * @details This macro will get the input capture interrupt status. + * \hideinitializer + */ +#define ECAP_GET_INT_STATUS(ecap) ((ecap)->STATUS) + +/** + * @brief This macro is used to get input channel interrupt flag + * @param[in] ecap Specify ECAP port + * @param[in] u32Mask The input channel mask + * - \ref ECAP_STATUS_CAPTF0_Msk + * - \ref ECAP_STATUS_CAPTF1_Msk + * - \ref ECAP_STATUS_CAPTF2_Msk + * - \ref ECAP_STATUS_CAPOVF_Msk + * - \ref ECAP_STATUS_CAPCMPF_Msk + * @return None + * @details This macro will write 1 to get the input channel_n interrupt flag. + * \hideinitializer + */ +#define ECAP_GET_CAPTURE_FLAG(ecap, u32Mask) (((ecap)->STATUS & (u32Mask))?1:0) + +/** + * @brief This macro is used to clear input channel interrupt flag + * @param[in] ecap Specify ECAP port + * @param[in] u32Mask The input channel mask + * - \ref ECAP_STATUS_CAPTF0_Msk + * - \ref ECAP_STATUS_CAPTF1_Msk + * - \ref ECAP_STATUS_CAPTF2_Msk + * - \ref ECAP_STATUS_CAPOVF_Msk + * - \ref ECAP_STATUS_CAPCMPF_Msk + * @return None + * @details This macro will write 1 to clear the input channel_n interrupt flag. + * \hideinitializer + */ +#define ECAP_CLR_CAPTURE_FLAG(ecap, u32Mask) ((ecap)->STATUS = (u32Mask)) + +/** + * @brief This macro is used to set input capture counter value + * @param[in] ecap Specify ECAP port + * @param[in] u32Val Counter value + * @return None + * @details This macro will set a counter value of input capture. + * \hideinitializer + */ +#define ECAP_SET_CNT_VALUE(ecap, u32Val) ((ecap)->CNT = (u32Val)) + +/** + * @brief This macro is used to get input capture counter value + * @param[in] ecap Specify ECAP port + * @return Capture counter value + * @details This macro will get a counter value of input capture. + * \hideinitializer + */ +#define ECAP_GET_CNT_VALUE(ecap) ((ecap)->CNT) + +/** + * @brief This macro is used to get input capture counter hold value + * @param[in] ecap Specify ECAP port + * @param[in] u32Index The input channel number + * - \ref ECAP_IC0 + * - \ref ECAP_IC1 + * - \ref ECAP_IC2 + * @return Capture counter hold value + * @details This macro will get a hold value of input capture channel_n. + * \hideinitializer + */ +#define ECAP_GET_CNT_HOLD_VALUE(ecap, u32Index) (*(__IO uint32_t *) (&((ecap)->HLD0) + (u32Index))) + +/** + * @brief This macro is used to set input capture counter compare value + * @param[in] ecap Specify ECAP port + * @param[in] u32Val Input capture compare value + * @return None + * @details This macro will set a compare value of input capture counter. + * \hideinitializer + */ +#define ECAP_SET_CNT_CMP(ecap, u32Val) ((ecap)->CNTCMP = (u32Val)) + +void ECAP_Open(ECAP_T *ecap, uint32_t u32FuncMask); +void ECAP_Close(ECAP_T *ecap); +void ECAP_EnableINT(ECAP_T *ecap, uint32_t u32Mask); +void ECAP_DisableINT(ECAP_T *ecap, uint32_t u32Mask); +/*@}*/ /* end of group ECAP_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group ECAP_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_ECAP_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_epwm.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_epwm.h new file mode 100644 index 0000000000..261ec688e3 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_epwm.h @@ -0,0 +1,643 @@ +/**************************************************************************//** + * @file nu_epwm.h + * @brief EPWM driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_EPWM_H__ +#define __NU_EPWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup EPWM_Driver EPWM Driver + @{ +*/ + +/** @addtogroup EPWM_EXPORTED_CONSTANTS EPWM Exported Constants + @{ +*/ +#define EPWM_CHANNEL_NUM (6U) /*!< EPWM channel number \hideinitializer */ +#define EPWM_CH_0_MASK (0x1U) /*!< EPWM channel 0 mask \hideinitializer */ +#define EPWM_CH_1_MASK (0x2U) /*!< EPWM channel 1 mask \hideinitializer */ +#define EPWM_CH_2_MASK (0x4U) /*!< EPWM channel 2 mask \hideinitializer */ +#define EPWM_CH_3_MASK (0x8U) /*!< EPWM channel 3 mask \hideinitializer */ +#define EPWM_CH_4_MASK (0x10U) /*!< EPWM channel 4 mask \hideinitializer */ +#define EPWM_CH_5_MASK (0x20U) /*!< EPWM channel 5 mask \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Counter Type Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define EPWM_UP_COUNTER (0U) /*!< Up counter type \hideinitializer */ +#define EPWM_DOWN_COUNTER (1U) /*!< Down counter type \hideinitializer */ +#define EPWM_UP_DOWN_COUNTER (2U) /*!< Up-Down counter type \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Aligned Type Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define EPWM_EDGE_ALIGNED (1U) /*!< EPWM working in edge aligned type(down count) \hideinitializer */ +#define EPWM_CENTER_ALIGNED (2U) /*!< EPWM working in center aligned type \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Output Level Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define EPWM_OUTPUT_NOTHING (0U) /*!< EPWM output nothing \hideinitializer */ +#define EPWM_OUTPUT_LOW (1U) /*!< EPWM output low \hideinitializer */ +#define EPWM_OUTPUT_HIGH (2U) /*!< EPWM output high \hideinitializer */ +#define EPWM_OUTPUT_TOGGLE (3U) /*!< EPWM output toggle \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Synchronous Start Function Control Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define EPWM_SSCTL_SSRC_EPWM0 (0U<CTL1 = (epwm)->CTL1 | (0x7ul<CTL1 = (epwm)->CTL1 & ~(0x7ul<CTL0 = (epwm)->CTL0 | EPWM_CTL0_GROUPEN_Msk) + +/** + * @brief This macro disable group mode + * @param[in] epwm The pointer of the specified EPWM module + * @return None + * @details This macro is used to disable group mode of EPWM module. + * \hideinitializer + */ +#define EPWM_DISABLE_GROUP_MODE(epwm) ((epwm)->CTL0 = (epwm)->CTL0 & ~EPWM_CTL0_GROUPEN_Msk) + +/** + * @brief Enable timer synchronous start counting function of specified channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Bit 0 represents channel 0, bit 1 represents channel 1... + * @param[in] u32SyncSrc Synchronous start source selection, valid values are: + * - \ref EPWM_SSCTL_SSRC_EPWM0 + * - \ref EPWM_SSCTL_SSRC_EPWM1 + * - \ref EPWM_SSCTL_SSRC_BPWM0 + * - \ref EPWM_SSCTL_SSRC_BPWM1 + * @return None + * @details This macro is used to enable timer synchronous start counting function of specified channel(s). + * \hideinitializer + */ +#define EPWM_ENABLE_TIMER_SYNC(epwm, u32ChannelMask, u32SyncSrc) ((epwm)->SSCTL = ((epwm)->SSCTL & ~EPWM_SSCTL_SSRC_Msk) | (u32SyncSrc) | (u32ChannelMask)) + +/** + * @brief Disable timer synchronous start counting function of specified channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Bit 0 represents channel 0, bit 1 represents channel 1... + * @return None + * @details This macro is used to disable timer synchronous start counting function of specified channel(s). + * \hideinitializer + */ +#define EPWM_DISABLE_TIMER_SYNC(epwm, u32ChannelMask) \ + do{ \ + int i;\ + for(i = 0; i < 6; i++) { \ + if((u32ChannelMask) & (1 << i)) \ + (epwm)->SSCTL &= ~(1UL << i); \ + } \ + }while(0) + +/** + * @brief This macro enable EPWM counter synchronous start counting function. + * @param[in] epwm The pointer of the specified EPWM module + * @return None + * @details This macro is used to make selected EPWM0 and EPWM1 channel(s) start counting at the same time. + * To configure synchronous start counting channel(s) by EPWM_ENABLE_TIMER_SYNC() and EPWM_DISABLE_TIMER_SYNC(). + * \hideinitializer + */ +#define EPWM_TRIGGER_SYNC_START(epwm) ((epwm)->SSTRG = EPWM_SSTRG_CNTSEN_Msk) + +/** + * @brief This macro enable output inverter of specified channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Bit 0 represents channel 0, bit 1 represents channel 1... + * @return None + * @details This macro is used to enable output inverter of specified channel(s). + * \hideinitializer + */ +#define EPWM_ENABLE_OUTPUT_INVERTER(epwm, u32ChannelMask) ((epwm)->POLCTL = (u32ChannelMask)) + +/** + * @brief This macro get captured rising data + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This macro is used to get captured rising data of specified channel. + * \hideinitializer + */ +#define EPWM_GET_CAPTURE_RISING_DATA(epwm, u32ChannelNum) ((epwm)->CAPDAT[(u32ChannelNum)].RCAPDAT) + +/** + * @brief This macro get captured falling data + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This macro is used to get captured falling data of specified channel. + * \hideinitializer + */ +#define EPWM_GET_CAPTURE_FALLING_DATA(epwm, u32ChannelNum) ((epwm)->CAPDAT[(u32ChannelNum)].FCAPDAT) + +/** + * @brief This macro mask output logic to high or low + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Bit 0 represents channel 0, bit 1 represents channel 1... + * @param[in] u32LevelMask Output logic to high or low + * @return None + * @details This macro is used to mask output logic to high or low of specified channel(s). + * @note If u32ChannelMask parameter is 0, then mask function will be disabled. + * \hideinitializer + */ +#define EPWM_MASK_OUTPUT(epwm, u32ChannelMask, u32LevelMask) \ + { \ + (epwm)->MSKEN = (u32ChannelMask); \ + (epwm)->MSK = (u32LevelMask); \ + } + +/** + * @brief This macro set the prescaler of the selected channel + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32Prescaler Clock prescaler of specified channel. Valid values are between 0 ~ 0xFFF + * @return None + * @details This macro is used to set the prescaler of specified channel. + * @note Every even channel N, and channel (N + 1) share a prescaler. So if channel 0 prescaler changed, channel 1 will also be affected. + * The clock of EPWM counter is divided by (u32Prescaler + 1). + * \hideinitializer + */ +#define EPWM_SET_PRESCALER(epwm, u32ChannelNum, u32Prescaler) ((epwm)->CLKPSC[(u32ChannelNum) >> 1] = (u32Prescaler)) + +/** + * @brief This macro get the prescaler of the selected channel + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return Return Clock prescaler of specified channel. Valid values are between 0 ~ 0xFFF + * @details This macro is used to get the prescaler of specified channel. + * @note Every even channel N, and channel (N + 1) share a prescaler. So if channel 0 prescaler changed, channel 1 will also be affected. + * The clock of EPWM counter is divided by (u32Prescaler + 1). + * \hideinitializer + */ +#define EPWM_GET_PRESCALER(epwm, u32ChannelNum) ((epwm)->CLKPSC[(u32ChannelNum) >> 1U]) + +/** + * @brief This macro set the comparator of the selected channel + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32CMR Comparator of specified channel. Valid values are between 0~0xFFFF + * @return None + * @details This macro is used to set the comparator of specified channel. + * @note This new setting will take effect on next EPWM period. + * \hideinitializer + */ +#define EPWM_SET_CMR(epwm, u32ChannelNum, u32CMR) ((epwm)->CMPDAT[(u32ChannelNum)]= (u32CMR)) + +/** + * @brief This macro get the comparator of the selected channel + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return Return the comparator of specified channel. Valid values are between 0~0xFFFF + * @details This macro is used to get the comparator of specified channel. + * \hideinitializer + */ +#define EPWM_GET_CMR(epwm, u32ChannelNum) ((epwm)->CMPDAT[(u32ChannelNum)]) + +/** + * @brief This macro set the free trigger comparator of the selected channel + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32FTCMR Free trigger comparator of specified channel. Valid values are between 0~0xFFFF + * @return None + * @details This macro is used to set the free trigger comparator of specified channel. + * @note This new setting will take effect on next EPWM period. + * \hideinitializer + */ +#define EPWM_SET_FTCMR(epwm, u32ChannelNum, u32FTCMR) (((epwm)->FTCMPDAT[((u32ChannelNum) >> 1U)]) = (u32FTCMR)) + +/** + * @brief This macro set the period of the selected channel + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32CNR Period of specified channel. Valid values are between 0~0xFFFF + * @return None + * @details This macro is used to set the period of specified channel. + * @note This new setting will take effect on next EPWM period. + * @note EPWM counter will stop if period length set to 0. + * \hideinitializer + */ +#define EPWM_SET_CNR(epwm, u32ChannelNum, u32CNR) ((epwm)->PERIOD[(u32ChannelNum)] = (u32CNR)) + +/** + * @brief This macro get the period of the selected channel + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return Return the period of specified channel. Valid values are between 0~0xFFFF + * @details This macro is used to get the period of specified channel. + * \hideinitializer + */ +#define EPWM_GET_CNR(epwm, u32ChannelNum) ((epwm)->PERIOD[(u32ChannelNum)]) + +/** + * @brief This macro set the EPWM aligned type + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Bit 0 represents channel 0, bit 1 represents channel 1... + * @param[in] u32AlignedType EPWM aligned type, valid values are: + * - \ref EPWM_EDGE_ALIGNED + * - \ref EPWM_CENTER_ALIGNED + * @return None + * @details This macro is used to set the EPWM aligned type of specified channel(s). + * \hideinitializer + */ +#define EPWM_SET_ALIGNED_TYPE(epwm, u32ChannelMask, u32AlignedType) \ + do{ \ + int i; \ + for(i = 0; i < 6; i++) { \ + if((u32ChannelMask) & (1 << i)) \ + (epwm)->CTL1 = (((epwm)->CTL1 & ~(3UL << (i << 1))) | ((u32AlignedType) << (i << 1))); \ + } \ + }while(0) + +/** + * @brief Set load window of window loading mode for specified channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Bit 0 represents channel 0, bit 1 represents channel 1... + * @return None + * @details This macro is used to set load window of window loading mode for specified channel(s). + * \hideinitializer + */ +#define EPWM_SET_LOAD_WINDOW(epwm, u32ChannelMask) ((epwm)->LOAD |= (u32ChannelMask)) + +/** + * @brief Trigger synchronous event from specified channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelNum EPWM channel number. Valid values are 0, 2, 4 + * Bit 0 represents channel 0, bit 1 represents channel 2 and bit 2 represents channel 4 + * @return None + * @details This macro is used to trigger synchronous event from specified channel(s). + * \hideinitializer + */ +#define EPWM_TRIGGER_SYNC(epwm, u32ChannelNum) ((epwm)->SWSYNC |= (1 << ((u32ChannelNum) >> 1))) + +/** + * @brief Clear counter of specified channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Bit 0 represents channel 0, bit 1 represents channel 1... + * @return None + * @details This macro is used to clear counter of specified channel(s). + * \hideinitializer + */ +#define EPWM_CLR_COUNTER(epwm, u32ChannelMask) ((epwm)->CNTCLR |= (u32ChannelMask)) + +/** + * @brief Set output level at zero, compare up, period(center) and compare down of specified channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Bit 0 represents channel 0, bit 1 represents channel 1... + * @param[in] u32ZeroLevel output level at zero point, valid values are: + * - \ref EPWM_OUTPUT_NOTHING + * - \ref EPWM_OUTPUT_LOW + * - \ref EPWM_OUTPUT_HIGH + * - \ref EPWM_OUTPUT_TOGGLE + * @param[in] u32CmpUpLevel output level at compare up point, valid values are: + * - \ref EPWM_OUTPUT_NOTHING + * - \ref EPWM_OUTPUT_LOW + * - \ref EPWM_OUTPUT_HIGH + * - \ref EPWM_OUTPUT_TOGGLE + * @param[in] u32PeriodLevel output level at period(center) point, valid values are: + * - \ref EPWM_OUTPUT_NOTHING + * - \ref EPWM_OUTPUT_LOW + * - \ref EPWM_OUTPUT_HIGH + * - \ref EPWM_OUTPUT_TOGGLE + * @param[in] u32CmpDownLevel output level at compare down point, valid values are: + * - \ref EPWM_OUTPUT_NOTHING + * - \ref EPWM_OUTPUT_LOW + * - \ref EPWM_OUTPUT_HIGH + * - \ref EPWM_OUTPUT_TOGGLE + * @return None + * @details This macro is used to Set output level at zero, compare up, period(center) and compare down of specified channel(s). + * \hideinitializer + */ +#define EPWM_SET_OUTPUT_LEVEL(epwm, u32ChannelMask, u32ZeroLevel, u32CmpUpLevel, u32PeriodLevel, u32CmpDownLevel) \ + do{ \ + int i; \ + for(i = 0; i < 6; i++) { \ + if((u32ChannelMask) & (1 << i)) { \ + (epwm)->WGCTL0 = (((epwm)->WGCTL0 & ~(3UL << (i << 1))) | ((u32ZeroLevel) << (i << 1))); \ + (epwm)->WGCTL0 = (((epwm)->WGCTL0 & ~(3UL << (EPWM_WGCTL0_PRDPCTL0_Pos + (i << 1)))) | ((u32PeriodLevel) << (EPWM_WGCTL0_PRDPCTL0_Pos + (i << 1)))); \ + (epwm)->WGCTL1 = (((epwm)->WGCTL1 & ~(3UL << (i << 1))) | ((u32CmpUpLevel) << (i << 1))); \ + (epwm)->WGCTL1 = (((epwm)->WGCTL1 & ~(3UL << (EPWM_WGCTL1_CMPDCTL0_Pos + (i << 1)))) | ((u32CmpDownLevel) << (EPWM_WGCTL1_CMPDCTL0_Pos + (i << 1)))); \ + } \ + } \ + }while(0) + +/** + * @brief Trigger brake event from specified channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Bit 0 represents channel 0, bit 1 represents channel 2 and bit 2 represents channel 4 + * @param[in] u32BrakeType Type of brake trigger. + * - \ref EPWM_FB_EDGE + * - \ref EPWM_FB_LEVEL + * @return None + * @details This macro is used to trigger brake event from specified channel(s). + * \hideinitializer + */ +#define EPWM_TRIGGER_BRAKE(epwm, u32ChannelMask, u32BrakeType) ((epwm)->SWBRK |= ((u32ChannelMask) << (u32BrakeType))) + +/** + * @brief Set Dead zone clock source + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32AfterPrescaler Dead zone clock source is from prescaler output. Valid values are TRUE (after prescaler) or FALSE (before prescaler). + * @return None + * @details This macro is used to set Dead zone clock source. Every two channels share the same setting. + * @note The write-protection function should be disabled before using this function. + * \hideinitializer + */ +#define EPWM_SET_DEADZONE_CLK_SRC(epwm, u32ChannelNum, u32AfterPrescaler) \ + ((epwm)->DTCTL[(u32ChannelNum) >> 1] = (((epwm)->DTCTL[(u32ChannelNum) >> 1] & ~EPWM_DTCTL0_1_DTCKSEL_Msk) | \ + ((u32AfterPrescaler) << EPWM_DTCTL0_1_DTCKSEL_Pos))) + +/*---------------------------------------------------------------------------------------------------------*/ +/* Define EPWM functions prototype */ +/*---------------------------------------------------------------------------------------------------------*/ +uint32_t EPWM_ConfigCaptureChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32UnitTimeNsec, uint32_t u32CaptureEdge); +uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32DutyCycle); +void EPWM_Start(EPWM_T *epwm, uint32_t u32ChannelMask); +void EPWM_Stop(EPWM_T *epwm, uint32_t u32ChannelMask); +void EPWM_ForceStop(EPWM_T *epwm, uint32_t u32ChannelMask); +void EPWM_EnableADCTrigger(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Condition); +void EPWM_DisableADCTrigger(EPWM_T *epwm, uint32_t u32ChannelNum); +int32_t EPWM_EnableADCTriggerPrescale(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Prescale, uint32_t u32PrescaleCnt); +void EPWM_DisableADCTriggerPrescale(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_ClearADCTriggerFlag(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Condition); +uint32_t EPWM_GetADCTriggerFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableDACTrigger(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Condition); +void EPWM_DisableDACTrigger(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_ClearDACTriggerFlag(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Condition); +uint32_t EPWM_GetDACTriggerFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableFaultBrake(EPWM_T *epwm, uint32_t u32ChannelMask, uint32_t u32LevelMask, uint32_t u32BrakeSource); +void EPWM_EnableCapture(EPWM_T *epwm, uint32_t u32ChannelMask); +void EPWM_DisableCapture(EPWM_T *epwm, uint32_t u32ChannelMask); +void EPWM_EnableOutput(EPWM_T *epwm, uint32_t u32ChannelMask); +void EPWM_DisableOutput(EPWM_T *epwm, uint32_t u32ChannelMask); +void EPWM_EnablePDMA(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32RisingFirst, uint32_t u32Mode); +void EPWM_DisablePDMA(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableDeadZone(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Duration); +void EPWM_DisableDeadZone(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableCaptureInt(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Edge); +void EPWM_DisableCaptureInt(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Edge); +void EPWM_ClearCaptureIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Edge); +uint32_t EPWM_GetCaptureIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableDutyInt(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32IntDutyType); +void EPWM_DisableDutyInt(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_ClearDutyIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +uint32_t EPWM_GetDutyIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableFaultBrakeInt(EPWM_T *epwm, uint32_t u32BrakeSource); +void EPWM_DisableFaultBrakeInt(EPWM_T *epwm, uint32_t u32BrakeSource); +void EPWM_ClearFaultBrakeIntFlag(EPWM_T *epwm, uint32_t u32BrakeSource); +uint32_t EPWM_GetFaultBrakeIntFlag(EPWM_T *epwm, uint32_t u32BrakeSource); +void EPWM_EnablePeriodInt(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32IntPeriodType); +void EPWM_DisablePeriodInt(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_ClearPeriodIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +uint32_t EPWM_GetPeriodIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableZeroInt(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_DisableZeroInt(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_ClearZeroIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +uint32_t EPWM_GetZeroIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableAcc(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32IntFlagCnt, uint32_t u32IntAccSrc); +void EPWM_DisableAcc(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableAccInt(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_DisableAccInt(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_ClearAccInt(EPWM_T *epwm, uint32_t u32ChannelNum); +uint32_t EPWM_GetAccInt(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableAccPDMA(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_DisableAccPDMA(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableAccStopMode(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_DisableAccStopMode(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_ClearFTDutyIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +uint32_t EPWM_GetFTDutyIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableLoadMode(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32LoadMode); +void EPWM_DisableLoadMode(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32LoadMode); +void EPWM_ConfigSyncPhase(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32SyncSrc, uint32_t u32Direction, uint32_t u32StartPhase); +void EPWM_EnableSyncPhase(EPWM_T *epwm, uint32_t u32ChannelMask); +void EPWM_DisableSyncPhase(EPWM_T *epwm, uint32_t u32ChannelMask); +void EPWM_EnableSyncNoiseFilter(EPWM_T *epwm, uint32_t u32ClkCnt, uint32_t u32ClkDivSel); +void EPWM_DisableSyncNoiseFilter(EPWM_T *epwm); +void EPWM_EnableSyncPinInverse(EPWM_T *epwm); +void EPWM_DisableSyncPinInverse(EPWM_T *epwm); +void EPWM_SetClockSource(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32ClkSrcSel); +void EPWM_EnableBrakeNoiseFilter(EPWM_T *epwm, uint32_t u32BrakePinNum, uint32_t u32ClkCnt, uint32_t u32ClkDivSel); +void EPWM_DisableBrakeNoiseFilter(EPWM_T *epwm, uint32_t u32BrakePinNum); +void EPWM_EnableBrakePinInverse(EPWM_T *epwm, uint32_t u32BrakePinNum); +void EPWM_DisableBrakePinInverse(EPWM_T *epwm, uint32_t u32BrakePinNum); +void EPWM_SetBrakePinSource(EPWM_T *epwm, uint32_t u32BrakePinNum, uint32_t u32SelAnotherModule); +void EPWM_SetLeadingEdgeBlanking(EPWM_T *epwm, uint32_t u32TrigSrcSel, uint32_t u32TrigType, uint32_t u32BlankingCnt, uint32_t u32BlankingEnable); +uint32_t EPWM_GetWrapAroundFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_ClearWrapAroundFlag(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableFaultDetect(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32AfterPrescaler, uint32_t u32ClkSel); +void EPWM_DisableFaultDetect(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableFaultDetectOutput(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_DisableFaultDetectOutput(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableFaultDetectDeglitch(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32DeglitchSmpCycle); +void EPWM_DisableFaultDetectDeglitch(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableFaultDetectMask(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32MaskCnt); +void EPWM_DisableFaultDetectMask(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_EnableFaultDetectInt(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_DisableFaultDetectInt(EPWM_T *epwm, uint32_t u32ChannelNum); +void EPWM_ClearFaultDetectInt(EPWM_T *epwm, uint32_t u32ChannelNum); +uint32_t EPWM_GetFaultDetectInt(EPWM_T *epwm, uint32_t u32ChannelNum); + +/*@}*/ /* end of group EPWM_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group EPWM_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_EPWM_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_gpio.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_gpio.h new file mode 100644 index 0000000000..ad033cb432 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_gpio.h @@ -0,0 +1,600 @@ +/**************************************************************************//** + * @file GPIO.h + * @brief GPIO driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + ******************************************************************************/ +#ifndef __NU_GPIO_H__ +#define __NU_GPIO_H__ + + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup GPIO_Driver GPIO Driver + @{ +*/ + +/** @addtogroup GPIO_EXPORTED_CONSTANTS GPIO Exported Constants + @{ +*/ + + +#define GPIO_PIN_MAX 16UL /*!< Specify Maximum Pins of Each GPIO Port \hideinitializer */ + + +/*---------------------------------------------------------------------------------------------------------*/ +/* GPIO_MODE Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define GPIO_MODE_INPUT 0x0UL /*!< Input Mode \hideinitializer */ +#define GPIO_MODE_OUTPUT 0x1UL /*!< Output Mode \hideinitializer */ +#define GPIO_MODE_OPEN_DRAIN 0x2UL /*!< Open-Drain Mode \hideinitializer */ +#define GPIO_MODE_QUASI 0x3UL /*!< Quasi-bidirectional Mode \hideinitializer */ + + +/*---------------------------------------------------------------------------------------------------------*/ +/* GPIO Interrupt Type Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define GPIO_INT_RISING 0x00010000UL /*!< Interrupt enable by Input Rising Edge \hideinitializer */ +#define GPIO_INT_FALLING 0x00000001UL /*!< Interrupt enable by Input Falling Edge \hideinitializer */ +#define GPIO_INT_BOTH_EDGE 0x00010001UL /*!< Interrupt enable by both Rising Edge and Falling Edge \hideinitializer */ +#define GPIO_INT_HIGH 0x01010000UL /*!< Interrupt enable by Level-High \hideinitializer */ +#define GPIO_INT_LOW 0x01000001UL /*!< Interrupt enable by Level-Level \hideinitializer */ + + +/*---------------------------------------------------------------------------------------------------------*/ +/* GPIO_INTTYPE Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define GPIO_INTTYPE_EDGE 0UL /*!< GPIO_INTTYPE Setting for Edge Trigger Mode \hideinitializer */ +#define GPIO_INTTYPE_LEVEL 1UL /*!< GPIO_INTTYPE Setting for Edge Level Mode \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* GPIO Slew Rate Type Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define GPIO_SLEWCTL_NORMAL 0x0UL /*!< GPIO slew setting for normal Mode \hideinitializer */ +#define GPIO_SLEWCTL_HIGH 0x1UL /*!< GPIO slew setting for high Mode \hideinitializer */ +#define GPIO_SLEWCTL_FAST 0x2UL /*!< GPIO slew setting for fast Mode \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* GPIO Pull-up And Pull-down Type Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define GPIO_PUSEL_DISABLE 0x0UL /*!< GPIO PUSEL setting for Disable Mode \hideinitializer */ +#define GPIO_PUSEL_PULL_UP 0x1UL /*!< GPIO PUSEL setting for Pull-up Mode \hideinitializer */ +#define GPIO_PUSEL_PULL_DOWN 0x2UL /*!< GPIO PUSEL setting for Pull-down Mode \hideinitializer */ + + +/*---------------------------------------------------------------------------------------------------------*/ +/* GPIO_DBCTL Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define GPIO_DBCTL_ICLK_ON 0x00000020UL /*!< GPIO_DBCTL setting for all IO pins edge detection circuit is always active after reset \hideinitializer */ +#define GPIO_DBCTL_ICLK_OFF 0x00000000UL /*!< GPIO_DBCTL setting for edge detection circuit is active only if IO pin corresponding GPIOx_IEN bit is set to 1 \hideinitializer */ + +#define GPIO_DBCTL_DBCLKSRC_LIRC 0x00000010UL /*!< GPIO_DBCTL setting for de-bounce counter clock source is the internal 10 kHz \hideinitializer */ +#define GPIO_DBCTL_DBCLKSRC_HXT 0x00000000UL /*!< GPIO_DBCTL setting for de-bounce counter clock source is the HCLK \hideinitializer */ + +#define GPIO_DBCTL_DBCLKSEL_1 0x00000000UL /*!< GPIO_DBCTL setting for sampling cycle = 1 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_2 0x00000001UL /*!< GPIO_DBCTL setting for sampling cycle = 2 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_4 0x00000002UL /*!< GPIO_DBCTL setting for sampling cycle = 4 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_8 0x00000003UL /*!< GPIO_DBCTL setting for sampling cycle = 8 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_16 0x00000004UL /*!< GPIO_DBCTL setting for sampling cycle = 16 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_32 0x00000005UL /*!< GPIO_DBCTL setting for sampling cycle = 32 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_64 0x00000006UL /*!< GPIO_DBCTL setting for sampling cycle = 64 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_128 0x00000007UL /*!< GPIO_DBCTL setting for sampling cycle = 128 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_256 0x00000008UL /*!< GPIO_DBCTL setting for sampling cycle = 256 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_512 0x00000009UL /*!< GPIO_DBCTL setting for sampling cycle = 512 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_1024 0x0000000AUL /*!< GPIO_DBCTL setting for sampling cycle = 1024 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_2048 0x0000000BUL /*!< GPIO_DBCTL setting for sampling cycle = 2048 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_4096 0x0000000CUL /*!< GPIO_DBCTL setting for sampling cycle = 4096 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_8192 0x0000000DUL /*!< GPIO_DBCTL setting for sampling cycle = 8192 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_16384 0x0000000EUL /*!< GPIO_DBCTL setting for sampling cycle = 16384 clocks \hideinitializer */ +#define GPIO_DBCTL_DBCLKSEL_32768 0x0000000FUL /*!< GPIO_DBCTL setting for sampling cycle = 32768 clocks \hideinitializer */ + + +/* Define GPIO Pin Data Input/Output. It could be used to control each I/O pin by pin address mapping. + Example 1: + + PA0 = 1; + + It is used to set GPIO PA.0 to high; + + Example 2: + + if (PA0) + PA0 = 0; + + If GPIO PA.0 pin status is high, then set GPIO PA.0 data output to low. + */ +#define GPIO_PIN_DATA(port, pin) (*((volatile uint32_t *)((GPIO_PIN_DATA_BASE+(0x40*(port))) + ((pin)<<2)))) /*!< Pin Data Input/Output \hideinitializer */ +#define PA0 GPIO_PIN_DATA(0, 0 ) /*!< Specify PA.0 Pin Data Input/Output \hideinitializer */ +#define PA1 GPIO_PIN_DATA(0, 1 ) /*!< Specify PA.1 Pin Data Input/Output \hideinitializer */ +#define PA2 GPIO_PIN_DATA(0, 2 ) /*!< Specify PA.2 Pin Data Input/Output \hideinitializer */ +#define PA3 GPIO_PIN_DATA(0, 3 ) /*!< Specify PA.3 Pin Data Input/Output \hideinitializer */ +#define PA4 GPIO_PIN_DATA(0, 4 ) /*!< Specify PA.4 Pin Data Input/Output \hideinitializer */ +#define PA5 GPIO_PIN_DATA(0, 5 ) /*!< Specify PA.5 Pin Data Input/Output \hideinitializer */ +#define PA6 GPIO_PIN_DATA(0, 6 ) /*!< Specify PA.6 Pin Data Input/Output \hideinitializer */ +#define PA7 GPIO_PIN_DATA(0, 7 ) /*!< Specify PA.7 Pin Data Input/Output \hideinitializer */ +#define PA8 GPIO_PIN_DATA(0, 8 ) /*!< Specify PA.8 Pin Data Input/Output \hideinitializer */ +#define PA9 GPIO_PIN_DATA(0, 9 ) /*!< Specify PA.9 Pin Data Input/Output \hideinitializer */ +#define PA10 GPIO_PIN_DATA(0, 10) /*!< Specify PA.10 Pin Data Input/Output \hideinitializer */ +#define PA11 GPIO_PIN_DATA(0, 11) /*!< Specify PA.11 Pin Data Input/Output \hideinitializer */ +#define PA12 GPIO_PIN_DATA(0, 12) /*!< Specify PA.12 Pin Data Input/Output \hideinitializer */ +#define PA13 GPIO_PIN_DATA(0, 13) /*!< Specify PA.13 Pin Data Input/Output \hideinitializer */ +#define PA14 GPIO_PIN_DATA(0, 14) /*!< Specify PA.14 Pin Data Input/Output \hideinitializer */ +#define PA15 GPIO_PIN_DATA(0, 15) /*!< Specify PA.15 Pin Data Input/Output \hideinitializer */ +#define PB0 GPIO_PIN_DATA(1, 0 ) /*!< Specify PB.0 Pin Data Input/Output \hideinitializer */ +#define PB1 GPIO_PIN_DATA(1, 1 ) /*!< Specify PB.1 Pin Data Input/Output \hideinitializer */ +#define PB2 GPIO_PIN_DATA(1, 2 ) /*!< Specify PB.2 Pin Data Input/Output \hideinitializer */ +#define PB3 GPIO_PIN_DATA(1, 3 ) /*!< Specify PB.3 Pin Data Input/Output \hideinitializer */ +#define PB4 GPIO_PIN_DATA(1, 4 ) /*!< Specify PB.4 Pin Data Input/Output \hideinitializer */ +#define PB5 GPIO_PIN_DATA(1, 5 ) /*!< Specify PB.5 Pin Data Input/Output \hideinitializer */ +#define PB6 GPIO_PIN_DATA(1, 6 ) /*!< Specify PB.6 Pin Data Input/Output \hideinitializer */ +#define PB7 GPIO_PIN_DATA(1, 7 ) /*!< Specify PB.7 Pin Data Input/Output \hideinitializer */ +#define PB8 GPIO_PIN_DATA(1, 8 ) /*!< Specify PB.8 Pin Data Input/Output \hideinitializer */ +#define PB9 GPIO_PIN_DATA(1, 9 ) /*!< Specify PB.9 Pin Data Input/Output \hideinitializer */ +#define PB10 GPIO_PIN_DATA(1, 10) /*!< Specify PB.10 Pin Data Input/Output \hideinitializer */ +#define PB11 GPIO_PIN_DATA(1, 11) /*!< Specify PB.11 Pin Data Input/Output \hideinitializer */ +#define PB12 GPIO_PIN_DATA(1, 12) /*!< Specify PB.12 Pin Data Input/Output \hideinitializer */ +#define PB13 GPIO_PIN_DATA(1, 13) /*!< Specify PB.13 Pin Data Input/Output \hideinitializer */ +#define PB14 GPIO_PIN_DATA(1, 14) /*!< Specify PB.14 Pin Data Input/Output \hideinitializer */ +#define PB15 GPIO_PIN_DATA(1, 15) /*!< Specify PB.15 Pin Data Input/Output \hideinitializer */ +#define PC0 GPIO_PIN_DATA(2, 0 ) /*!< Specify PC.0 Pin Data Input/Output \hideinitializer */ +#define PC1 GPIO_PIN_DATA(2, 1 ) /*!< Specify PC.1 Pin Data Input/Output \hideinitializer */ +#define PC2 GPIO_PIN_DATA(2, 2 ) /*!< Specify PC.2 Pin Data Input/Output \hideinitializer */ +#define PC3 GPIO_PIN_DATA(2, 3 ) /*!< Specify PC.3 Pin Data Input/Output \hideinitializer */ +#define PC4 GPIO_PIN_DATA(2, 4 ) /*!< Specify PC.4 Pin Data Input/Output \hideinitializer */ +#define PC5 GPIO_PIN_DATA(2, 5 ) /*!< Specify PC.5 Pin Data Input/Output \hideinitializer */ +#define PC6 GPIO_PIN_DATA(2, 6 ) /*!< Specify PC.6 Pin Data Input/Output \hideinitializer */ +#define PC7 GPIO_PIN_DATA(2, 7 ) /*!< Specify PC.7 Pin Data Input/Output \hideinitializer */ +#define PC8 GPIO_PIN_DATA(2, 8 ) /*!< Specify PC.8 Pin Data Input/Output \hideinitializer */ +#define PC9 GPIO_PIN_DATA(2, 9 ) /*!< Specify PC.9 Pin Data Input/Output \hideinitializer */ +#define PC10 GPIO_PIN_DATA(2, 10) /*!< Specify PC.10 Pin Data Input/Output \hideinitializer */ +#define PC11 GPIO_PIN_DATA(2, 11) /*!< Specify PC.11 Pin Data Input/Output \hideinitializer */ +#define PC12 GPIO_PIN_DATA(2, 12) /*!< Specify PC.12 Pin Data Input/Output \hideinitializer */ +#define PC13 GPIO_PIN_DATA(2, 13) /*!< Specify PC.13 Pin Data Input/Output \hideinitializer */ +#define PC14 GPIO_PIN_DATA(2, 14) /*!< Specify PC.14 Pin Data Input/Output \hideinitializer */ +#define PD0 GPIO_PIN_DATA(3, 0 ) /*!< Specify PD.0 Pin Data Input/Output \hideinitializer */ +#define PD1 GPIO_PIN_DATA(3, 1 ) /*!< Specify PD.1 Pin Data Input/Output \hideinitializer */ +#define PD2 GPIO_PIN_DATA(3, 2 ) /*!< Specify PD.2 Pin Data Input/Output \hideinitializer */ +#define PD3 GPIO_PIN_DATA(3, 3 ) /*!< Specify PD.3 Pin Data Input/Output \hideinitializer */ +#define PD4 GPIO_PIN_DATA(3, 4 ) /*!< Specify PD.4 Pin Data Input/Output \hideinitializer */ +#define PD5 GPIO_PIN_DATA(3, 5 ) /*!< Specify PD.5 Pin Data Input/Output \hideinitializer */ +#define PD6 GPIO_PIN_DATA(3, 6 ) /*!< Specify PD.6 Pin Data Input/Output \hideinitializer */ +#define PD7 GPIO_PIN_DATA(3, 7 ) /*!< Specify PD.7 Pin Data Input/Output \hideinitializer */ +#define PD8 GPIO_PIN_DATA(3, 8 ) /*!< Specify PD.8 Pin Data Input/Output \hideinitializer */ +#define PD9 GPIO_PIN_DATA(3, 9 ) /*!< Specify PD.9 Pin Data Input/Output \hideinitializer */ +#define PD10 GPIO_PIN_DATA(3, 10) /*!< Specify PD.10 Pin Data Input/Output \hideinitializer */ +#define PD11 GPIO_PIN_DATA(3, 11) /*!< Specify PD.11 Pin Data Input/Output \hideinitializer */ +#define PD12 GPIO_PIN_DATA(3, 12) /*!< Specify PD.12 Pin Data Input/Output \hideinitializer */ +#define PD13 GPIO_PIN_DATA(3, 13) /*!< Specify PD.13 Pin Data Input/Output \hideinitializer */ +#define PD14 GPIO_PIN_DATA(3, 14) /*!< Specify PD.14 Pin Data Input/Output \hideinitializer */ +#define PE0 GPIO_PIN_DATA(4, 0 ) /*!< Specify PE.0 Pin Data Input/Output \hideinitializer */ +#define PE1 GPIO_PIN_DATA(4, 1 ) /*!< Specify PE.1 Pin Data Input/Output \hideinitializer */ +#define PE2 GPIO_PIN_DATA(4, 2 ) /*!< Specify PE.2 Pin Data Input/Output \hideinitializer */ +#define PE3 GPIO_PIN_DATA(4, 3 ) /*!< Specify PE.3 Pin Data Input/Output \hideinitializer */ +#define PE4 GPIO_PIN_DATA(4, 4 ) /*!< Specify PE.4 Pin Data Input/Output \hideinitializer */ +#define PE5 GPIO_PIN_DATA(4, 5 ) /*!< Specify PE.5 Pin Data Input/Output \hideinitializer */ +#define PE6 GPIO_PIN_DATA(4, 6 ) /*!< Specify PE.6 Pin Data Input/Output \hideinitializer */ +#define PE7 GPIO_PIN_DATA(4, 7 ) /*!< Specify PE.7 Pin Data Input/Output \hideinitializer */ +#define PE8 GPIO_PIN_DATA(4, 8 ) /*!< Specify PE.8 Pin Data Input/Output \hideinitializer */ +#define PE9 GPIO_PIN_DATA(4, 9 ) /*!< Specify PE.9 Pin Data Input/Output \hideinitializer */ +#define PE10 GPIO_PIN_DATA(4, 10) /*!< Specify PE.10 Pin Data Input/Output \hideinitializer */ +#define PE11 GPIO_PIN_DATA(4, 11) /*!< Specify PE.11 Pin Data Input/Output \hideinitializer */ +#define PE12 GPIO_PIN_DATA(4, 12) /*!< Specify PE.12 Pin Data Input/Output \hideinitializer */ +#define PE13 GPIO_PIN_DATA(4, 13) /*!< Specify PE.13 Pin Data Input/Output \hideinitializer */ +#define PE14 GPIO_PIN_DATA(4, 14) /*!< Specify PE.14 Pin Data Input/Output \hideinitializer */ +#define PE15 GPIO_PIN_DATA(4, 15) /*!< Specify PE.15 Pin Data Input/Output \hideinitializer */ +#define PF0 GPIO_PIN_DATA(5, 0 ) /*!< Specify PF.0 Pin Data Input/Output \hideinitializer */ +#define PF1 GPIO_PIN_DATA(5, 1 ) /*!< Specify PF.1 Pin Data Input/Output \hideinitializer */ +#define PF2 GPIO_PIN_DATA(5, 2 ) /*!< Specify PF.2 Pin Data Input/Output \hideinitializer */ +#define PF3 GPIO_PIN_DATA(5, 3 ) /*!< Specify PF.3 Pin Data Input/Output \hideinitializer */ +#define PF4 GPIO_PIN_DATA(5, 4 ) /*!< Specify PF.4 Pin Data Input/Output \hideinitializer */ +#define PF5 GPIO_PIN_DATA(5, 5 ) /*!< Specify PF.5 Pin Data Input/Output \hideinitializer */ +#define PF6 GPIO_PIN_DATA(5, 6 ) /*!< Specify PF.6 Pin Data Input/Output \hideinitializer */ +#define PF7 GPIO_PIN_DATA(5, 7 ) /*!< Specify PF.7 Pin Data Input/Output \hideinitializer */ +#define PF8 GPIO_PIN_DATA(5, 8 ) /*!< Specify PF.8 Pin Data Input/Output \hideinitializer */ +#define PF9 GPIO_PIN_DATA(5, 9 ) /*!< Specify PF.9 Pin Data Input/Output \hideinitializer */ +#define PF10 GPIO_PIN_DATA(5, 10) /*!< Specify PF.10 Pin Data Input/Output \hideinitializer */ +#define PF11 GPIO_PIN_DATA(5, 11) /*!< Specify PF.11 Pin Data Input/Output \hideinitializer */ +#define PG0 GPIO_PIN_DATA(6, 0 ) /*!< Specify PG.0 Pin Data Input/Output \hideinitializer */ +#define PG1 GPIO_PIN_DATA(6, 1 ) /*!< Specify PG.1 Pin Data Input/Output \hideinitializer */ +#define PG2 GPIO_PIN_DATA(6, 2 ) /*!< Specify PG.2 Pin Data Input/Output \hideinitializer */ +#define PG3 GPIO_PIN_DATA(6, 3 ) /*!< Specify PG.3 Pin Data Input/Output \hideinitializer */ +#define PG4 GPIO_PIN_DATA(6, 4 ) /*!< Specify PG.4 Pin Data Input/Output \hideinitializer */ +#define PG5 GPIO_PIN_DATA(6, 5 ) /*!< Specify PG.5 Pin Data Input/Output \hideinitializer */ +#define PG6 GPIO_PIN_DATA(6, 6 ) /*!< Specify PG.6 Pin Data Input/Output \hideinitializer */ +#define PG7 GPIO_PIN_DATA(6, 7 ) /*!< Specify PG.7 Pin Data Input/Output \hideinitializer */ +#define PG8 GPIO_PIN_DATA(6, 8 ) /*!< Specify PG.8 Pin Data Input/Output \hideinitializer */ +#define PG9 GPIO_PIN_DATA(6, 9 ) /*!< Specify PG.9 Pin Data Input/Output \hideinitializer */ +#define PG10 GPIO_PIN_DATA(6, 10) /*!< Specify PG.10 Pin Data Input/Output \hideinitializer */ +#define PG11 GPIO_PIN_DATA(6, 11) /*!< Specify PG.11 Pin Data Input/Output \hideinitializer */ +#define PG12 GPIO_PIN_DATA(6, 12) /*!< Specify PG.12 Pin Data Input/Output \hideinitializer */ +#define PG13 GPIO_PIN_DATA(6, 13) /*!< Specify PG.13 Pin Data Input/Output \hideinitializer */ +#define PG14 GPIO_PIN_DATA(6, 14) /*!< Specify PG.14 Pin Data Input/Output \hideinitializer */ +#define PG15 GPIO_PIN_DATA(6, 15) /*!< Specify PG.15 Pin Data Input/Output \hideinitializer */ +#define PH0 GPIO_PIN_DATA(7, 0 ) /*!< Specify PH.0 Pin Data Input/Output \hideinitializer */ +#define PH1 GPIO_PIN_DATA(7, 1 ) /*!< Specify PH.1 Pin Data Input/Output \hideinitializer */ +#define PH2 GPIO_PIN_DATA(7, 2 ) /*!< Specify PH.2 Pin Data Input/Output \hideinitializer */ +#define PH3 GPIO_PIN_DATA(7, 3 ) /*!< Specify PH.3 Pin Data Input/Output \hideinitializer */ +#define PH4 GPIO_PIN_DATA(7, 4 ) /*!< Specify PH.4 Pin Data Input/Output \hideinitializer */ +#define PH5 GPIO_PIN_DATA(7, 5 ) /*!< Specify PH.5 Pin Data Input/Output \hideinitializer */ +#define PH6 GPIO_PIN_DATA(7, 6 ) /*!< Specify PH.6 Pin Data Input/Output \hideinitializer */ +#define PH7 GPIO_PIN_DATA(7, 7 ) /*!< Specify PH.7 Pin Data Input/Output \hideinitializer */ +#define PH8 GPIO_PIN_DATA(7, 8 ) /*!< Specify PH.8 Pin Data Input/Output \hideinitializer */ +#define PH9 GPIO_PIN_DATA(7, 9 ) /*!< Specify PH.9 Pin Data Input/Output \hideinitializer */ +#define PH10 GPIO_PIN_DATA(7, 10) /*!< Specify PH.10 Pin Data Input/Output \hideinitializer */ +#define PH11 GPIO_PIN_DATA(7, 11) /*!< Specify PH.11 Pin Data Input/Output \hideinitializer */ +#define PH12 GPIO_PIN_DATA(7, 12) /*!< Specify PH.12 Pin Data Input/Output \hideinitializer */ +#define PH13 GPIO_PIN_DATA(7, 13) /*!< Specify PH.13 Pin Data Input/Output \hideinitializer */ +#define PH14 GPIO_PIN_DATA(7, 14) /*!< Specify PH.14 Pin Data Input/Output \hideinitializer */ +#define PH15 GPIO_PIN_DATA(7, 15) /*!< Specify PH.15 Pin Data Input/Output \hideinitializer */ +#define PI0 GPIO_PIN_DATA(8, 0 ) /*!< Specify PI.0 Pin Data Input/Output \hideinitializer */ +#define PI1 GPIO_PIN_DATA(8, 1 ) /*!< Specify PI.1 Pin Data Input/Output \hideinitializer */ +#define PI2 GPIO_PIN_DATA(8, 2 ) /*!< Specify PI.2 Pin Data Input/Output \hideinitializer */ +#define PI3 GPIO_PIN_DATA(8, 3 ) /*!< Specify PI.3 Pin Data Input/Output \hideinitializer */ +#define PI4 GPIO_PIN_DATA(8, 4 ) /*!< Specify PI.4 Pin Data Input/Output \hideinitializer */ +#define PI5 GPIO_PIN_DATA(8, 5 ) /*!< Specify PI.5 Pin Data Input/Output \hideinitializer */ +#define PI6 GPIO_PIN_DATA(8, 6 ) /*!< Specify PI.6 Pin Data Input/Output \hideinitializer */ +#define PI7 GPIO_PIN_DATA(8, 7 ) /*!< Specify PI.7 Pin Data Input/Output \hideinitializer */ +#define PI8 GPIO_PIN_DATA(8, 8 ) /*!< Specify PI.8 Pin Data Input/Output \hideinitializer */ +#define PI9 GPIO_PIN_DATA(8, 9 ) /*!< Specify PI.9 Pin Data Input/Output \hideinitializer */ +#define PI10 GPIO_PIN_DATA(8, 10) /*!< Specify PI.10 Pin Data Input/Output \hideinitializer */ +#define PI11 GPIO_PIN_DATA(8, 11) /*!< Specify PI.11 Pin Data Input/Output \hideinitializer */ +#define PI12 GPIO_PIN_DATA(8, 12) /*!< Specify PI.12 Pin Data Input/Output \hideinitializer */ +#define PI13 GPIO_PIN_DATA(8, 13) /*!< Specify PI.13 Pin Data Input/Output \hideinitializer */ +#define PI14 GPIO_PIN_DATA(8, 14) /*!< Specify PI.14 Pin Data Input/Output \hideinitializer */ +#define PI15 GPIO_PIN_DATA(8, 15) /*!< Specify PI.15 Pin Data Input/Output \hideinitializer */ +#define PJ0 GPIO_PIN_DATA(9, 0 ) /*!< Specify PJ.0 Pin Data Input/Output \hideinitializer */ +#define PJ1 GPIO_PIN_DATA(9, 1 ) /*!< Specify PJ.1 Pin Data Input/Output \hideinitializer */ +#define PJ2 GPIO_PIN_DATA(9, 2 ) /*!< Specify PJ.2 Pin Data Input/Output \hideinitializer */ +#define PJ3 GPIO_PIN_DATA(9, 3 ) /*!< Specify PJ.3 Pin Data Input/Output \hideinitializer */ +#define PJ4 GPIO_PIN_DATA(9, 4 ) /*!< Specify PJ.4 Pin Data Input/Output \hideinitializer */ +#define PJ5 GPIO_PIN_DATA(9, 5 ) /*!< Specify PJ.5 Pin Data Input/Output \hideinitializer */ +#define PJ6 GPIO_PIN_DATA(9, 6 ) /*!< Specify PJ.6 Pin Data Input/Output \hideinitializer */ +#define PJ7 GPIO_PIN_DATA(9, 7 ) /*!< Specify PJ.7 Pin Data Input/Output \hideinitializer */ +#define PJ8 GPIO_PIN_DATA(9, 8 ) /*!< Specify PJ.8 Pin Data Input/Output \hideinitializer */ +#define PJ9 GPIO_PIN_DATA(9, 9 ) /*!< Specify PJ.9 Pin Data Input/Output \hideinitializer */ +#define PJ10 GPIO_PIN_DATA(9, 10) /*!< Specify PJ.10 Pin Data Input/Output \hideinitializer */ +#define PJ11 GPIO_PIN_DATA(9, 11) /*!< Specify PJ.11 Pin Data Input/Output \hideinitializer */ +#define PJ12 GPIO_PIN_DATA(9, 12) /*!< Specify PJ.12 Pin Data Input/Output \hideinitializer */ +#define PJ13 GPIO_PIN_DATA(9, 13) /*!< Specify PJ.13 Pin Data Input/Output \hideinitializer */ +#define PJ14 GPIO_PIN_DATA(9, 14) /*!< Specify PJ.14 Pin Data Input/Output \hideinitializer */ +#define PJ15 GPIO_PIN_DATA(9, 15) /*!< Specify PJ.15 Pin Data Input/Output \hideinitializer */ +#define PK0 GPIO_PIN_DATA(10 , 0 ) /*!< Specify PK.0 Pin Data Input/Output \hideinitializer */ +#define PK1 GPIO_PIN_DATA(10 , 1 ) /*!< Specify PK.1 Pin Data Input/Output \hideinitializer */ +#define PK2 GPIO_PIN_DATA(10 , 2 ) /*!< Specify PK.2 Pin Data Input/Output \hideinitializer */ +#define PK3 GPIO_PIN_DATA(10 , 3 ) /*!< Specify PK.3 Pin Data Input/Output \hideinitializer */ +#define PK4 GPIO_PIN_DATA(10 , 4 ) /*!< Specify PK.4 Pin Data Input/Output \hideinitializer */ +#define PK5 GPIO_PIN_DATA(10 , 5 ) /*!< Specify PK.5 Pin Data Input/Output \hideinitializer */ +#define PK6 GPIO_PIN_DATA(10 , 6 ) /*!< Specify PK.6 Pin Data Input/Output \hideinitializer */ +#define PK7 GPIO_PIN_DATA(10 , 7 ) /*!< Specify PK.7 Pin Data Input/Output \hideinitializer */ +#define PK8 GPIO_PIN_DATA(10 , 8 ) /*!< Specify PK.8 Pin Data Input/Output \hideinitializer */ +#define PK9 GPIO_PIN_DATA(10 , 9 ) /*!< Specify PK.9 Pin Data Input/Output \hideinitializer */ +#define PK10 GPIO_PIN_DATA(10 , 10) /*!< Specify PK.10 Pin Data Input/Output \hideinitializer */ +#define PK11 GPIO_PIN_DATA(10 , 11) /*!< Specify PK.11 Pin Data Input/Output \hideinitializer */ +#define PK12 GPIO_PIN_DATA(10 , 12) /*!< Specify PK.12 Pin Data Input/Output \hideinitializer */ +#define PK13 GPIO_PIN_DATA(10 , 13) /*!< Specify PK.13 Pin Data Input/Output \hideinitializer */ +#define PK14 GPIO_PIN_DATA(10 , 14) /*!< Specify PK.14 Pin Data Input/Output \hideinitializer */ +#define PK15 GPIO_PIN_DATA(10 , 15) /*!< Specify PK.15 Pin Data Input/Output \hideinitializer */ +#define PL0 GPIO_PIN_DATA(11, 0 ) /*!< Specify PL.0 Pin Data Input/Output \hideinitializer */ +#define PL1 GPIO_PIN_DATA(11, 1 ) /*!< Specify PL.1 Pin Data Input/Output \hideinitializer */ +#define PL2 GPIO_PIN_DATA(11, 2 ) /*!< Specify PL.2 Pin Data Input/Output \hideinitializer */ +#define PL3 GPIO_PIN_DATA(11, 3 ) /*!< Specify PL.3 Pin Data Input/Output \hideinitializer */ +#define PL4 GPIO_PIN_DATA(11, 4 ) /*!< Specify PL.4 Pin Data Input/Output \hideinitializer */ +#define PL5 GPIO_PIN_DATA(11, 5 ) /*!< Specify PL.5 Pin Data Input/Output \hideinitializer */ +#define PL6 GPIO_PIN_DATA(11, 6 ) /*!< Specify PL.6 Pin Data Input/Output \hideinitializer */ +#define PL7 GPIO_PIN_DATA(11, 7 ) /*!< Specify PL.7 Pin Data Input/Output \hideinitializer */ +#define PL8 GPIO_PIN_DATA(11, 8 ) /*!< Specify PL.8 Pin Data Input/Output \hideinitializer */ +#define PL9 GPIO_PIN_DATA(11, 9 ) /*!< Specify PL.9 Pin Data Input/Output \hideinitializer */ +#define PL10 GPIO_PIN_DATA(11, 10) /*!< Specify PL.10 Pin Data Input/Output \hideinitializer */ +#define PL11 GPIO_PIN_DATA(11, 11) /*!< Specify PL.11 Pin Data Input/Output \hideinitializer */ +#define PL12 GPIO_PIN_DATA(11, 12) /*!< Specify PL.12 Pin Data Input/Output \hideinitializer */ +#define PL13 GPIO_PIN_DATA(11, 13) /*!< Specify PL.13 Pin Data Input/Output \hideinitializer */ +#define PL14 GPIO_PIN_DATA(11, 14) /*!< Specify PL.14 Pin Data Input/Output \hideinitializer */ +#define PL15 GPIO_PIN_DATA(11, 15) /*!< Specify PL.15 Pin Data Input/Output \hideinitializer */ +#define PM0 GPIO_PIN_DATA(12, 0 ) /*!< Specify PH.0 Pin Data Input/Output \hideinitializer */ +#define PM1 GPIO_PIN_DATA(12, 1 ) /*!< Specify PH.1 Pin Data Input/Output \hideinitializer */ +#define PM2 GPIO_PIN_DATA(12, 2 ) /*!< Specify PH.2 Pin Data Input/Output \hideinitializer */ +#define PM3 GPIO_PIN_DATA(12, 3 ) /*!< Specify PH.3 Pin Data Input/Output \hideinitializer */ +#define PM4 GPIO_PIN_DATA(12, 4 ) /*!< Specify PH.4 Pin Data Input/Output \hideinitializer */ +#define PM5 GPIO_PIN_DATA(12, 5 ) /*!< Specify PH.5 Pin Data Input/Output \hideinitializer */ +#define PM6 GPIO_PIN_DATA(12, 6 ) /*!< Specify PH.6 Pin Data Input/Output \hideinitializer */ +#define PM7 GPIO_PIN_DATA(12, 7 ) /*!< Specify PH.7 Pin Data Input/Output \hideinitializer */ +#define PM8 GPIO_PIN_DATA(12, 8 ) /*!< Specify PH.8 Pin Data Input/Output \hideinitializer */ +#define PM9 GPIO_PIN_DATA(12, 9 ) /*!< Specify PH.9 Pin Data Input/Output \hideinitializer */ +#define PM10 GPIO_PIN_DATA(12, 10) /*!< Specify PH.10 Pin Data Input/Output \hideinitializer */ +#define PM11 GPIO_PIN_DATA(12, 11) /*!< Specify PH.11 Pin Data Input/Output \hideinitializer */ +#define PM12 GPIO_PIN_DATA(12, 12) /*!< Specify PH.12 Pin Data Input/Output \hideinitializer */ +#define PM13 GPIO_PIN_DATA(12, 13) /*!< Specify PH.13 Pin Data Input/Output \hideinitializer */ +#define PM14 GPIO_PIN_DATA(12, 14) /*!< Specify PH.14 Pin Data Input/Output \hideinitializer */ +#define PM15 GPIO_PIN_DATA(12, 15) /*!< Specify PH.15 Pin Data Input/Output \hideinitializer */ +#define PN0 GPIO_PIN_DATA(13, 0 ) /*!< Specify PH.0 Pin Data Input/Output \hideinitializer */ +#define PN1 GPIO_PIN_DATA(13, 1 ) /*!< Specify PH.1 Pin Data Input/Output \hideinitializer */ +#define PN2 GPIO_PIN_DATA(13, 2 ) /*!< Specify PH.2 Pin Data Input/Output \hideinitializer */ +#define PN3 GPIO_PIN_DATA(13, 3 ) /*!< Specify PH.3 Pin Data Input/Output \hideinitializer */ +#define PN4 GPIO_PIN_DATA(13, 4 ) /*!< Specify PH.4 Pin Data Input/Output \hideinitializer */ +#define PN5 GPIO_PIN_DATA(13, 5 ) /*!< Specify PH.5 Pin Data Input/Output \hideinitializer */ +#define PN6 GPIO_PIN_DATA(13, 6 ) /*!< Specify PH.6 Pin Data Input/Output \hideinitializer */ +#define PN7 GPIO_PIN_DATA(13, 7 ) /*!< Specify PH.7 Pin Data Input/Output \hideinitializer */ +#define PN8 GPIO_PIN_DATA(13, 8 ) /*!< Specify PH.8 Pin Data Input/Output \hideinitializer */ +#define PN9 GPIO_PIN_DATA(13, 9 ) /*!< Specify PH.9 Pin Data Input/Output \hideinitializer */ +#define PN10 GPIO_PIN_DATA(13, 10) /*!< Specify PH.10 Pin Data Input/Output \hideinitializer */ +#define PN11 GPIO_PIN_DATA(13, 11) /*!< Specify PH.11 Pin Data Input/Output \hideinitializer */ +#define PN12 GPIO_PIN_DATA(13, 12) /*!< Specify PH.12 Pin Data Input/Output \hideinitializer */ +#define PN13 GPIO_PIN_DATA(13, 13) /*!< Specify PH.13 Pin Data Input/Output \hideinitializer */ +#define PN14 GPIO_PIN_DATA(13, 14) /*!< Specify PH.14 Pin Data Input/Output \hideinitializer */ +#define PN15 GPIO_PIN_DATA(13, 15) /*!< Specify PH.15 Pin Data Input/Output \hideinitializer */ + +/*@}*/ /* end of group GPIO_EXPORTED_CONSTANTS */ + + +/** @addtogroup GPIO_EXPORTED_FUNCTIONS GPIO Exported Functions + @{ +*/ + +/** + * @brief Clear GPIO Pin Interrupt Flag + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG, PH, PI, PJ, PK,PL, PM and PN. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. + * It could be BIT0 ~ BIT15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be BIT0 ~ BIT13 for PE GPIO port. + * It could be BIT0 ~ BIT11 for PG GPIO port. + * + * @return None + * + * @details Clear the interrupt status of specified GPIO pin. + * \hideinitializer + */ +#define GPIO_CLR_INT_FLAG(port, u32PinMask) ((port)->INTSRC = (u32PinMask)) + +/** + * @brief Disable Pin De-bounce Function + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG, PH, PI, PJ, PK,PL, PM and PN. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. + * It could be BIT0 ~ BIT15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be BIT0 ~ BIT13 for PE GPIO port. + * It could be BIT0 ~ BIT11 for PG GPIO port. + * + * @return None + * + * @details Disable the interrupt de-bounce function of specified GPIO pin. + * \hideinitializer + */ +#define GPIO_DISABLE_DEBOUNCE(port, u32PinMask) ((port)->DBEN &= ~(u32PinMask)) + +/** + * @brief Enable Pin De-bounce Function + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG or PH. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. + * It could be BIT0 ~ BIT15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be BIT0 ~ BIT13 for PE GPIO port. + * It could be BIT0 ~ BIT11 for PG GPIO port. + * @return None + * + * @details Enable the interrupt de-bounce function of specified GPIO pin. + * \hideinitializer + */ +#define GPIO_ENABLE_DEBOUNCE(port, u32PinMask) ((port)->DBEN |= (u32PinMask)) + +/** + * @brief Disable I/O Digital Input Path + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG, PH, PI, PJ, PK,PL, PM and PN. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. + * It could be BIT0 ~ BIT15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be BIT0 ~ BIT13 for PE GPIO port. + * It could be BIT0 ~ BIT11 for PG GPIO port. + * + * @return None + * + * @details Disable I/O digital input path of specified GPIO pin. + * \hideinitializer + */ +#define GPIO_DISABLE_DIGITAL_PATH(port, u32PinMask) ((port)->DINOFF |= ((u32PinMask)<<16)) + +/** + * @brief Enable I/O Digital Input Path + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG or PH. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. + * It could be BIT0 ~ BIT15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be BIT0 ~ BIT13 for PE GPIO port. + * It could be BIT0 ~ BIT11 for PG GPIO port. + * + * @return None + * + * @details Enable I/O digital input path of specified GPIO pin. + * \hideinitializer + */ +#define GPIO_ENABLE_DIGITAL_PATH(port, u32PinMask) ((port)->DINOFF &= ~((u32PinMask)<<16)) + +/** + * @brief Disable I/O DOUT mask + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG, PH, PI, PJ, PK,PL, PM and PN. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. + * It could be BIT0 ~ BIT15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be BIT0 ~ BIT13 for PE GPIO port. + * It could be BIT0 ~ BIT11 for PG GPIO port. + * + * @return None + * + * @details Disable I/O DOUT mask of specified GPIO pin. + * \hideinitializer + */ +#define GPIO_DISABLE_DOUT_MASK(port, u32PinMask) ((port)->DATMSK &= ~(u32PinMask)) + +/** + * @brief Enable I/O DOUT mask + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG or PH. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. + * It could be BIT0 ~ BIT15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be BIT0 ~ BIT13 for PE GPIO port. + * It could be BIT0 ~ BIT11 for PG GPIO port. + * + * @return None + * + * @details Enable I/O DOUT mask of specified GPIO pin. + * \hideinitializer + */ +#define GPIO_ENABLE_DOUT_MASK(port, u32PinMask) ((port)->DATMSK |= (u32PinMask)) + +/** + * @brief Get GPIO Pin Interrupt Flag + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG, PH, PI, PJ, PK,PL, PM and PN. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. + * It could be BIT0 ~ BIT15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be BIT0 ~ BIT13 for PE GPIO port. + * It could be BIT0 ~ BIT11 for PG GPIO port. + * + * @retval 0 No interrupt at specified GPIO pin + * @retval 1 The specified GPIO pin generate an interrupt + * + * @details Get the interrupt status of specified GPIO pin. + * \hideinitializer + */ +#define GPIO_GET_INT_FLAG(port, u32PinMask) ((port)->INTSRC & (u32PinMask)) + +/** + * @brief Set De-bounce Sampling Cycle Time + * + * @param[in] u32Port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG, PH, PI, PJ, PK,PL, PM and PN. + * @param[in] u32ClkSrc The de-bounce counter clock source. It could be GPIO_DBCTL_DBCLKSRC_HXT or GPIO_DBCTL_DBCLKSRC_LIRC. + * @param[in] u32ClkSel The de-bounce sampling cycle selection. It could be + * - \ref GPIO_DBCTL_DBCLKSEL_1 + * - \ref GPIO_DBCTL_DBCLKSEL_2 + * - \ref GPIO_DBCTL_DBCLKSEL_4 + * - \ref GPIO_DBCTL_DBCLKSEL_8 + * - \ref GPIO_DBCTL_DBCLKSEL_16 + * - \ref GPIO_DBCTL_DBCLKSEL_32 + * - \ref GPIO_DBCTL_DBCLKSEL_64 + * - \ref GPIO_DBCTL_DBCLKSEL_128 + * - \ref GPIO_DBCTL_DBCLKSEL_256 + * - \ref GPIO_DBCTL_DBCLKSEL_512 + * - \ref GPIO_DBCTL_DBCLKSEL_1024 + * - \ref GPIO_DBCTL_DBCLKSEL_2048 + * - \ref GPIO_DBCTL_DBCLKSEL_4096 + * - \ref GPIO_DBCTL_DBCLKSEL_8192 + * - \ref GPIO_DBCTL_DBCLKSEL_16384 + * - \ref GPIO_DBCTL_DBCLKSEL_32768 + * + * @return None + * + * @details Set the interrupt de-bounce sampling cycle time based on the debounce counter clock source. \n + * Example: _GPIO_SET_DEBOUNCE_TIME(GPIO_DBCTL_DBCLKSRC_LIRC, GPIO_DBCTL_DBCLKSEL_4). \n + * It's meaning the De-debounce counter clock source is internal 10 KHz and sampling cycle selection is 4. \n + * Then the target de-bounce sampling cycle time is (4)*(1/(10*1000)) s = 4*0.0001 s = 400 us, + * and system will sampling interrupt input once per 00 us. + * \hideinitializer + */ +#define GPIO_SET_DEBOUNCE_TIME(u32Port, u32ClkSrc, u32ClkSel) (u32Port->DBCTL = (GPIO_DBCTL_ICLKON_Msk | (u32ClkSrc) | (u32ClkSel))) + +/** + * @brief Get GPIO Port IN Data + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG, PH, PI, PJ, PK,PL, PM and PN. + * + * @return The specified port data + * + * @details Get the PIN register of specified GPIO port. + * \hideinitializer + */ +#define GPIO_GET_IN_DATA(port) ((port)->PIN) + +/** + * @brief Set GPIO Port OUT Data + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG, PH, PI, PJ, PK,PL, PM and PN. + * @param[in] u32Data GPIO port data. + * + * @return None + * + * @details Set the Data into specified GPIO port. + * \hideinitializer + */ +#define GPIO_SET_OUT_DATA(port, u32Data) ((port)->DOUT = (u32Data)) + +/** + * @brief Toggle Specified GPIO pin + * + * @param[in] u32Pin Pxy + * + * @return None + * + * @details Toggle the specified GPIO pint. + * \hideinitializer + */ +#define GPIO_TOGGLE(u32Pin) ((u32Pin) ^= 1) + + +/** + * @brief Enable External GPIO interrupt + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG, PH, PI, PJ, PK,PL, PM and PN. + * @param[in] u32Pin The pin of specified GPIO port. + * It could be 0 ~ 15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be 0 ~ 13 for PE GPIO port. + * It could be 0 ~ 11 for PG GPIO port. + * @param[in] u32IntAttribs The interrupt attribute of specified GPIO pin. It could be \n + * GPIO_INT_RISING, GPIO_INT_FALLING, GPIO_INT_BOTH_EDGE, GPIO_INT_HIGH, GPIO_INT_LOW. + * + * @return None + * + * @details This function is used to enable specified GPIO pin interrupt. + * \hideinitializer + */ +#define GPIO_EnableEINT GPIO_EnableInt + +/** + * @brief Disable External GPIO interrupt + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG, PH, PI, PJ, PK,PL, PM and PN. + * @param[in] u32Pin The pin of specified GPIO port. + * It could be 0 ~ 15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be 0 ~ 13 for PE GPIO port. + * It could be 0 ~ 11 for PG GPIO port. + * + * @return None + * + * @details This function is used to enable specified GPIO pin interrupt. + * \hideinitializer + */ +#define GPIO_DisableEINT GPIO_DisableInt + + +void GPIO_SetMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode); +void GPIO_EnableInt(GPIO_T *port, uint32_t u32Pin, uint32_t u32IntAttribs); +void GPIO_DisableInt(GPIO_T *port, uint32_t u32Pin); +void GPIO_SetSlewCtl(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode); +void GPIO_SetPullCtl(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode); +void GPIO_SetDrivingCtl(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Driving); +void GPIO_SetSchmittTriggere(GPIO_T *port, uint32_t u32PinMask, uint32_t u32SchmittTrigger); +void GPIO_SetPowerMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32PowerMode); +uint32_t GPIO_GetPowerMode(GPIO_T *port, uint32_t u32PinNo); +uint32_t GPIO_GetSchmittTriggere(GPIO_T *port, uint32_t u32PinNo); +uint32_t GPIO_GetDrivingCtl(GPIO_T *port, uint32_t u32PinNo); + + +/*@}*/ /* end of group GPIO_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group GPIO_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __GPIO_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_hwsem.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_hwsem.h new file mode 100644 index 0000000000..551df1471d --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_hwsem.h @@ -0,0 +1,174 @@ +/**************************************************************************//** + * @file nu_hwsem.h + * @brief HWSEM driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_HWSEM_H__ +#define __NU_HWSEM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup HWSEM_Driver HWSEM Driver + @{ +*/ + +/** @addtogroup HWSEM_EXPORTED_CONSTANTS HWSEM Exported Constants + @{ +*/ +#define HWSEM_CNT 8ul /*!CTL |= (HWSEM_CTL_SEM0RST_Msk << (u32Num))) + +/** + * @brief + * + * @param[in] hwsem The pointer of the specified HWSEM module. + * @param[in] u32Num HWSEM number, valid values are between 0~7 + * + * @retval 0 The specified semaphore is not locked. + * Otherwise The specified semaphore is locked. + * \hideinitializer + */ +#define HWSEM_IS_LOCKED(hwsem, u32Num) ((hwsem)->SEM[(u32Num)] & (HWSEM_SEM_ID_Msk)) + +/** + * @brief Enable specified HWSEM interrupt + * + * @param[in] hwsem The pointer of the specified HWSEM module. + * @param[in] u32Num HWSEM number, valid values are between 0~7 + * + * + * \hideinitializer + */ +#define HWSEM_ENABLE_INT(hwsem, u32Num) ((hwsem)->INTENM4 |= (HWSEM_INTENM4_SEM0IEN_Msk << (u32Num))) + + +/** + * @brief Disable specified HWSEM interrupt + * + * @param[in] hwsem The pointer of the specified HWSEM module. + * @param[in] u32Num HWSEM number, valid values are between 0~7 + * + * + * \hideinitializer + */ +#define HWSEM_DISABLE_INT(hwsem, u32Num) ((hwsem)->INTENM4 &= ~(HWSEM_INTENM4_SEM0IEN_Msk << (u32Num))) + +/** + * @brief Get specified interrupt flag + * + * @param[in] hwsem The pointer of the specified HWSEM module. + * @param[in] u32Num HWSEM number, valid values are between 0~7 + * + * @retval 0 The specified interrupt is not happened. + * Otherwise The specified interrupt is happened. + * \hideinitializer + */ +#define HWSEM_GET_INT_FLAG(hwsem, u32Num) ((hwsem)->INTSTSM4 & (HWSEM_INTSTSM4_SEM0IF_Msk << (u32Num))) + + +/** + * @brief Clear specified interrupt flag + * + * @param[in] hwsem The pointer of the specified HWSEM module. + * @param[in] u32Num HWSEM number, valid values are between 0~7 + * + * \hideinitializer + */ +#define HWSEM_CLR_INT_FLAG(hwsem, u32Num) ((hwsem)->INTSTSM4 = (HWSEM_INTSTSM4_SEM0IF_Msk << (u32Num))) + + +/** + * @brief Unlock specified semaphore + * + * @param[in] hwsem The pointer of the specified HWSEM module. + * @param[in] u32Num HWSEM number, valid values are between 0~7 + * @param[in] u8Key HWSEM channel key + * + * \hideinitializer + */ +#define HWSEM_UNLOCK(hwsem, u32Num, u8Key) ((hwsem)->SEM[(u32Num)] = ((u8Key) << HWSEM_SEM_KEY_Pos) & HWSEM_SEM_KEY_Msk) + +/* Declare these inline functions here to avoid MISRA C 2004 rule 8.1 error */ +__STATIC_INLINE int32_t HWSEM_Try_Lock(HWSEM_T *hwsem, uint32_t u32Num, uint8_t u8Key); +__STATIC_INLINE void HWSEM_Spin_Lock(HWSEM_T *hwsem, uint32_t u32Num, uint8_t u8Key); + +/** + * @brief Try to lock specified semaphore + * + * @param[in] hwsem The pointer of the specified HWSEM module. + * @param[in] u32Num HWSEM number, valid values are between 0~7 + * @param[in] u8Key HWSEM channel key + * @retval 0 Successfully acquire semaphore + * @retval -1 Failed to acquire semaphore + * \hideinitializer + */ +__STATIC_INLINE int32_t HWSEM_Try_Lock(HWSEM_T *hwsem, uint32_t u32Num, uint8_t u8Key) +{ + hwsem->SEM[u32Num] = (u8Key << HWSEM_SEM_KEY_Pos); + if ((hwsem->SEM[u32Num] & HWSEM_SEM_ID_Msk) == HWSEM_LOCK_BY_M4 && + (hwsem->SEM[u32Num] & HWSEM_SEM_KEY_Msk) == (u8Key << HWSEM_SEM_KEY_Pos)) + return 0; + else + return -1; +} + +/** + * @brief Spin until lock specified semaphore + * + * @param[in] hwsem The pointer of the specified HWSEM module. + * @param[in] u32Num HWSEM number, valid values are between 0~7 + * @param[in] u8Key HWSEM channel key + * + * \hideinitializer + */ +__STATIC_INLINE void HWSEM_Spin_Lock(HWSEM_T *hwsem, uint32_t u32Num, uint8_t u8Key) +{ + while (1) + { + hwsem->SEM[u32Num] = (u8Key << HWSEM_SEM_KEY_Pos); + if ((hwsem->SEM[u32Num] & HWSEM_SEM_ID_Msk) == HWSEM_LOCK_BY_M4 && + (hwsem->SEM[u32Num] & HWSEM_SEM_KEY_Msk) == (u8Key << HWSEM_SEM_KEY_Pos)) + break; + } +} + +/*@}*/ /* end of group HWSEM_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group HWSEM_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_i2c.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_i2c.h new file mode 100644 index 0000000000..373b02d8c7 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_i2c.h @@ -0,0 +1,296 @@ +/****************************************************************************//** + * @file nu_i2c.h + * @brief I2C driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_I2C_H__ +#define __NU_I2C_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup I2C_Driver I2C Driver + @{ +*/ + +/** @addtogroup I2C_EXPORTED_CONSTANTS I2C Exported Constants + @{ +*/ + +/*---------------------------------------------------------------------------------------------------------*/ +/* I2C_CTL constant definitions. */ +/*---------------------------------------------------------------------------------------------------------*/ +#define I2C_CTL_STA_SI 0x28UL /*!< I2C_CTL setting for I2C control bits. It would set STA and SI bits \hideinitializer */ +#define I2C_CTL_STA_SI_AA 0x2CUL /*!< I2C_CTL setting for I2C control bits. It would set STA, SI and AA bits \hideinitializer */ +#define I2C_CTL_STO_SI 0x18UL /*!< I2C_CTL setting for I2C control bits. It would set STO and SI bits \hideinitializer */ +#define I2C_CTL_STO_SI_AA 0x1CUL /*!< I2C_CTL setting for I2C control bits. It would set STO, SI and AA bits \hideinitializer */ +#define I2C_CTL_SI 0x08UL /*!< I2C_CTL setting for I2C control bits. It would set SI bit \hideinitializer */ +#define I2C_CTL_SI_AA 0x0CUL /*!< I2C_CTL setting for I2C control bits. It would set SI and AA bits \hideinitializer */ +#define I2C_CTL_STA 0x20UL /*!< I2C_CTL setting for I2C control bits. It would set STA bit \hideinitializer */ +#define I2C_CTL_STO 0x10UL /*!< I2C_CTL setting for I2C control bits. It would set STO bit \hideinitializer */ +#define I2C_CTL_AA 0x04UL /*!< I2C_CTL setting for I2C control bits. It would set AA bit \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* I2C GCMode constant definitions. */ +/*---------------------------------------------------------------------------------------------------------*/ +#define I2C_GCMODE_ENABLE 1 /*!< Enable I2C GC Mode \hideinitializer */ +#define I2C_GCMODE_DISABLE 0 /*!< Disable I2C GC Mode \hideinitializer */ + +/*@}*/ /* end of group I2C_EXPORTED_CONSTANTS */ + +/** @addtogroup I2C_EXPORTED_FUNCTIONS I2C Exported Functions + @{ +*/ +/** + * @brief The macro is used to set I2C bus condition at One Time + * + * @param[in] i2c Specify I2C port + * @param[in] u8Ctrl A byte writes to I2C control register + * + * @return None + * + * @details Set I2C_CTL register to control I2C bus conditions of START, STOP, SI, ACK. + * \hideinitializer + */ +#define I2C_SET_CONTROL_REG(i2c, u8Ctrl) ((i2c)->CTL0 = ((i2c)->CTL0 & ~0x3c) | (u8Ctrl)) + +/** + * @brief The macro is used to set START condition of I2C Bus + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details Set the I2C bus START condition in I2C_CTL register. + * \hideinitializer + */ +#define I2C_START(i2c) ((i2c)->CTL0 = ((i2c)->CTL0 & ~I2C_CTL0_SI_Msk) | I2C_CTL0_STA_Msk) + +/** + * @brief The macro is used to wait I2C bus status get ready + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details When a new status is presented of I2C bus, the SI flag will be set in I2C_CTL register. + * \hideinitializer + */ +#define I2C_WAIT_READY(i2c) while(!((i2c)->CTL0 & I2C_CTL0_SI_Msk)) + +/** + * @brief The macro is used to Read I2C Bus Data Register + * + * @param[in] i2c Specify I2C port + * + * @return A byte of I2C data register + * + * @details I2C controller read data from bus and save it in I2CDAT register. + * \hideinitializer + */ +#define I2C_GET_DATA(i2c) ((i2c)->DAT) + +/** + * @brief Write a Data to I2C Data Register + * + * @param[in] i2c Specify I2C port + * @param[in] u8Data A byte that writes to data register + * + * @return None + * + * @details When write a data to I2C_DAT register, the I2C controller will shift it to I2C bus. + * \hideinitializer + */ +#define I2C_SET_DATA(i2c, u8Data) ((i2c)->DAT = (u8Data)) + +/** + * @brief Get I2C Bus status code + * + * @param[in] i2c Specify I2C port + * + * @return I2C status code + * + * @details To get this status code to monitor I2C bus event. + * \hideinitializer + */ +#define I2C_GET_STATUS(i2c) ((i2c)->STATUS0) + +/** + * @brief Get Time-out flag from I2C Bus + * + * @param[in] i2c Specify I2C port + * + * @retval 0 I2C Bus time-out is not happened + * @retval 1 I2C Bus time-out is happened + * + * @details When I2C bus occurs time-out event, the time-out flag will be set. + * \hideinitializer + */ +#define I2C_GET_TIMEOUT_FLAG(i2c) ( ((i2c)->TOCTL & I2C_TOCTL_TOIF_Msk) == I2C_TOCTL_TOIF_Msk ? 1:0 ) + +/** + * @brief To get wake-up flag from I2C Bus + * + * @param[in] i2c Specify I2C port + * + * @retval 0 Chip is not woken-up from power-down mode + * @retval 1 Chip is woken-up from power-down mode + * + * @details I2C bus occurs wake-up event, wake-up flag will be set. + * \hideinitializer + */ +#define I2C_GET_WAKEUP_FLAG(i2c) ( ((i2c)->WKSTS & I2C_WKSTS_WKIF_Msk) == I2C_WKSTS_WKIF_Msk ? 1:0 ) + +/** + * @brief To clear wake-up flag + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details If wake-up flag is set, use this macro to clear it. + * \hideinitializer + */ +#define I2C_CLEAR_WAKEUP_FLAG(i2c) ((i2c)->WKSTS = I2C_WKSTS_WKIF_Msk) + +/** + * @brief Enable RX PDMA function. + * @param[in] i2c The pointer of the specified I2C module. + * @return None. + * @details Set RXPDMAEN bit of I2C_CTL1 register to enable RX PDMA transfer function. + * \hideinitializer + */ +#define I2C_ENABLE_RX_PDMA(i2c) ((i2c)->CTL1 |= I2C_CTL1_RXPDMAEN_Msk) + +/** + * @brief Enable TX PDMA function. + * @param[in] i2c The pointer of the specified I2C module. + * @return None. + * @details Set TXPDMAEN bit of I2C_CTL1 register to enable TX PDMA transfer function. + * \hideinitializer + */ +#define I2C_ENABLE_TX_PDMA(i2c) ((i2c)->CTL1 |= I2C_CTL1_TXPDMAEN_Msk) + +/** + * @brief Disable RX PDMA transfer. + * @param[in] i2c The pointer of the specified I2C module. + * @return None. + * @details Clear RXPDMAEN bit of I2C_CTL1 register to disable RX PDMA transfer function. + * \hideinitializer + */ +#define I2C_DISABLE_RX_PDMA(i2c) ((i2c)->CTL1 &= ~I2C_CTL1_RXPDMAEN_Msk) + +/** + * @brief Disable TX PDMA transfer. + * @param[in] i2c The pointer of the specified I2C module. + * @return None. + * @details Clear TXPDMAEN bit of I2C_CTL1 register to disable TX PDMA transfer function. + * \hideinitializer + */ +#define I2C_DISABLE_TX_PDMA(i2c) ((i2c)->CTL1 &= ~I2C_CTL1_TXPDMAEN_Msk) + +/** + * @brief Enable PDMA stretch function. + * @param[in] i2c The pointer of the specified I2C module. + * @return None. + * @details Enable this function is to stretch bus by hardware after PDMA transfer is done if SI is not cleared. + * \hideinitializer + */ +#define I2C_ENABLE_PDMA_STRETCH(i2c) ((i2c)->CTL1 |= I2C_CTL1_PDMASTR_Msk) + +/** + * @brief Disable PDMA stretch function. + * @param[in] i2c The pointer of the specified I2C module. + * @return None. + * @details I2C will send STOP after PDMA transfers done automatically. + * \hideinitializer + */ +#define I2C_DISABLE_PDMA_STRETCH(i2c) ((i2c)->CTL1 &= ~I2C_CTL1_PDMASTR_Msk) + +/** + * @brief Reset PDMA function. + * @param[in] i2c The pointer of the specified I2C module. + * @return None. + * @details I2C PDMA engine will be reset after this function is called. + * \hideinitializer + */ +#define I2C_DISABLE_RST_PDMA(i2c) ((i2c)->CTL1 |= I2C_CTL1_PDMARST_Msk) + +/*---------------------------------------------------------------------------------------------------------*/ +/* inline functions */ +/*---------------------------------------------------------------------------------------------------------*/ + +/* Declare these inline functions here to avoid MISRA C 2004 rule 8.1 error */ +__STATIC_INLINE void I2C_STOP(I2C_T *i2c); + +/** + * @brief The macro is used to set STOP condition of I2C Bus + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details Set the I2C bus STOP condition in I2C_CTL register. + */ +__STATIC_INLINE void I2C_STOP(I2C_T *i2c) +{ + + (i2c)->CTL0 |= (I2C_CTL0_SI_Msk | I2C_CTL0_STO_Msk); + while (i2c->CTL0 & I2C_CTL0_STO_Msk) + { + } +} + +void I2C_ClearTimeoutFlag(I2C_T *i2c); +void I2C_Close(I2C_T *i2c); +void I2C_Trigger(I2C_T *i2c, uint8_t u8Start, uint8_t u8Stop, uint8_t u8Si, uint8_t u8Ack); +void I2C_DisableInt(I2C_T *i2c); +void I2C_EnableInt(I2C_T *i2c); +uint32_t I2C_GetBusClockFreq(I2C_T *i2c); +uint32_t I2C_GetIntFlag(I2C_T *i2c); +uint32_t I2C_GetStatus(I2C_T *i2c); +uint32_t I2C_Open(I2C_T *i2c, uint32_t u32BusClock); +uint8_t I2C_GetData(I2C_T *i2c); +void I2C_SetSlaveAddr(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddr, uint8_t u8GCMode); +void I2C_SetSlaveAddrMask(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddrMask); +uint32_t I2C_SetBusClockFreq(I2C_T *i2c, uint32_t u32BusClock); +void I2C_EnableTimeout(I2C_T *i2c, uint8_t u8LongTimeout); +void I2C_DisableTimeout(I2C_T *i2c); +void I2C_EnableWakeup(I2C_T *i2c); +void I2C_DisableWakeup(I2C_T *i2c); +void I2C_SetData(I2C_T *i2c, uint8_t u8Data); +uint8_t I2C_WriteByte(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t data); +uint32_t I2C_WriteMultiBytes(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t data[], uint32_t u32wLen); +uint8_t I2C_WriteByteOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t data); +uint32_t I2C_WriteMultiBytesOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t data[], uint32_t u32wLen); +uint8_t I2C_WriteByteTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t data); +uint32_t I2C_WriteMultiBytesTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t data[], uint32_t u32wLen); +uint8_t I2C_ReadByte(I2C_T *i2c, uint8_t u8SlaveAddr); +uint32_t I2C_ReadMultiBytes(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t rdata[], uint32_t u32rLen); +uint8_t I2C_ReadByteOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr); +uint32_t I2C_ReadMultiBytesOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t rdata[], uint32_t u32rLen); +uint8_t I2C_ReadByteTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr); +uint32_t I2C_ReadMultiBytesTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t rdata[], uint32_t u32rLen); + +/*@}*/ /* end of group I2C_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group I2C_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_i2s.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_i2s.h new file mode 100644 index 0000000000..b5ac0b597a --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_i2s.h @@ -0,0 +1,351 @@ +/****************************************************************************//** + * @file nu_i2s.h + * @brief I2S driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_I2S_H__ +#define __NU_I2S_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup I2S_Driver I2S Driver + @{ +*/ + +/** @addtogroup I2S_EXPORTED_CONSTANTS I2S Exported Constants + @{ +*/ +#define I2S_DATABIT_8 (0U << I2S_CTL0_DATWIDTH_Pos) /*!< I2S data width is 8-bit \hideinitializer */ +#define I2S_DATABIT_16 (1U << I2S_CTL0_DATWIDTH_Pos) /*!< I2S data width is 16-bit \hideinitializer */ +#define I2S_DATABIT_24 (2U << I2S_CTL0_DATWIDTH_Pos) /*!< I2S data width is 24-bit \hideinitializer */ +#define I2S_DATABIT_32 (3U << I2S_CTL0_DATWIDTH_Pos) /*!< I2S data width is 32-bit \hideinitializer */ + +/* Audio Format */ +#define I2S_ENABLE_MONO I2S_CTL0_MONO_Msk /*!< Mono channel \hideinitializer */ +#define I2S_DISABLE_MONO (0U) /*!< Stereo channel \hideinitializer */ + +/* I2S Data Format */ +#define I2S_FORMAT_I2S (0U << I2S_CTL0_FORMAT_Pos) /*!< I2S data format \hideinitializer */ +#define I2S_FORMAT_I2S_MSB (1U << I2S_CTL0_FORMAT_Pos) /*!< I2S MSB data format \hideinitializer */ +#define I2S_FORMAT_I2S_LSB (2U << I2S_CTL0_FORMAT_Pos) /*!< I2S LSB data format \hideinitializer */ +#define I2S_FORMAT_PCM (4U << I2S_CTL0_FORMAT_Pos) /*!< PCM data format \hideinitializer */ +#define I2S_FORMAT_PCM_MSB (5U << I2S_CTL0_FORMAT_Pos) /*!< PCM MSB data format \hideinitializer */ +#define I2S_FORMAT_PCM_LSB (6U << I2S_CTL0_FORMAT_Pos) /*!< PCM LSB data format \hideinitializer */ + +/* I2S Data Format */ +#define I2S_ORDER_AT_MSB (0U) /*!< Channel data is at MSB \hideinitializer */ +#define I2S_ORDER_AT_LSB I2S_CTL0_ORDER_Msk /*!< Channel data is at LSB \hideinitializer */ + +/* I2S TDM Channel Number */ +#define I2S_TDM_2CH 0U /*!< Use TDM 2 channel \hideinitializer */ +#define I2S_TDM_4CH 1U /*!< Use TDM 4 channel \hideinitializer */ +#define I2S_TDM_6CH 2U /*!< Use TDM 6 channel \hideinitializer */ +#define I2S_TDM_8CH 3U /*!< Use TDM 8 channel \hideinitializer */ + +/* I2S TDM Channel Width */ +#define I2S_TDM_WIDTH_8BIT 0U /*!< TDM channel witch is 8-bit \hideinitializer */ +#define I2S_TDM_WIDTH_16BIT 1U /*!< TDM channel witch is 16-bit \hideinitializer */ +#define I2S_TDM_WIDTH_24BIT 2U /*!< TDM channel witch is 24-bit \hideinitializer */ +#define I2S_TDM_WIDTH_32BIT 3U /*!< TDM channel witch is 32-bit \hideinitializer */ + +/* I2S TDM Sync Width */ +#define I2S_TDM_SYNC_ONE_BCLK 0U /*!< TDM sync widht is one BLCK period \hideinitializer */ +#define I2S_TDM_SYNC_ONE_CHANNEL 1U /*!< TDM sync widht is one channel period \hideinitializer */ + +/* I2S Operation mode */ +#define I2S_MODE_SLAVE I2S_CTL0_SLAVE_Msk /*!< As slave mode \hideinitializer */ +#define I2S_MODE_MASTER (0u) /*!< As master mode \hideinitializer */ + +/* I2S FIFO Threshold */ +#define I2S_FIFO_TX_LEVEL_WORD_0 (0U) /*!< TX threshold is 0 word \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_1 (1U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 1 word \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_2 (2U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 2 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_3 (3U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 3 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_4 (4U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 4 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_5 (5U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 5 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_6 (6U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 6 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_7 (7U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 7 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_8 (8U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 8 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_9 (9U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 9 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_10 (10U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 10 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_11 (11U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 11 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_12 (12U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 12 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_13 (13U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 13 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_14 (14U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 14 words \hideinitializer */ +#define I2S_FIFO_TX_LEVEL_WORD_15 (15U << I2S_CTL1_TXTH_Pos) /*!< TX threshold is 15 words \hideinitializer */ + +#define I2S_FIFO_RX_LEVEL_WORD_1 (0U) /*!< RX threshold is 1 word \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_2 (1U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 2 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_3 (2U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 3 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_4 (3U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 4 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_5 (4U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 5 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_6 (5U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 6 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_7 (6U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 7 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_8 (7U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 8 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_9 (8U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 9 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_10 (9U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 10 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_11 (10U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 11 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_12 (11U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 12 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_13 (12U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 13 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_14 (13U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 14 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_15 (14U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 15 words \hideinitializer */ +#define I2S_FIFO_RX_LEVEL_WORD_16 (15U << I2S_CTL1_RXTH_Pos) /*!< RX threshold is 16 words \hideinitializer */ + +/* I2S Record Channel */ +#define I2S_MONO_RIGHT (0U) /*!< Record mono right channel \hideinitializer */ +#define I2S_MONO_LEFT I2S_CTL0_RXLCH_Msk /*!< Record mono left channel \hideinitializer */ + +/* I2S Channel */ +#define I2S_RIGHT (0U) /*!< Select right channel \hideinitializer */ +#define I2S_LEFT (1U) /*!< Select left channel \hideinitializer */ + +/*@}*/ /* end of group I2S_EXPORTED_CONSTANTS */ + +/** @addtogroup I2S_EXPORTED_FUNCTIONS I2S Exported Functions + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* inline functions */ +/*---------------------------------------------------------------------------------------------------------*/ +/** + * @brief Enable zero cross detect function. + * @param[in] i2s is the base address of I2S module. + * @param[in] u32ChMask is the mask for channel number (valid value is from (1~8). + * @return none + * \hideinitializer + */ +__STATIC_INLINE void I2S_ENABLE_TX_ZCD(I2S_T *i2s, uint32_t u32ChMask) +{ + if ((u32ChMask > 0U) && (u32ChMask < 9U)) + { + i2s->CTL1 |= ((uint32_t)1U << (u32ChMask - 1U)); + } +} + +/** + * @brief Disable zero cross detect function. + * @param[in] i2s is the base address of I2S module. + * @param[in] u32ChMask is the mask for channel number (valid value is from (1~8). + * @return none + * \hideinitializer + */ +__STATIC_INLINE void I2S_DISABLE_TX_ZCD(I2S_T *i2s, uint32_t u32ChMask) +{ + if ((u32ChMask > 0U) && (u32ChMask < 9U)) + { + i2s->CTL1 &= ~((uint32_t)1U << (u32ChMask - 1U)); + } +} + +/** + * @brief Enable I2S Tx DMA function. I2S requests DMA to transfer data to Tx FIFO. + * @param[in] i2s is the base address of I2S module. + * @return none + * \hideinitializer + */ +#define I2S_ENABLE_TXDMA(i2s) ( (i2s)->CTL0 |= I2S_CTL0_TXPDMAEN_Msk ) + +/** + * @brief Disable I2S Tx DMA function. I2S requests DMA to transfer data to Tx FIFO. + * @param[in] i2s is the base address of I2S module. + * @return none + * \hideinitializer + */ +#define I2S_DISABLE_TXDMA(i2s) ( (i2s)->CTL0 &= ~I2S_CTL0_TXPDMAEN_Msk ) + +/** + * @brief Enable I2S Rx DMA function. I2S requests DMA to transfer data from Rx FIFO. + * @param[in] i2s is the base address of I2S module. + * @return none + * \hideinitializer + */ +#define I2S_ENABLE_RXDMA(i2s) ( (i2s)->CTL0 |= I2S_CTL0_RXPDMAEN_Msk ) + +/** + * @brief Disable I2S Rx DMA function. I2S requests DMA to transfer data from Rx FIFO. + * @param[in] i2s is the base address of I2S module. + * @return none + * \hideinitializer + */ +#define I2S_DISABLE_RXDMA(i2s) ( (i2s)->CTL0 &= ~I2S_CTL0_RXPDMAEN_Msk ) + +/** + * @brief Enable I2S Tx function . + * @param[in] i2s is the base address of I2S module. + * @return none + * \hideinitializer + */ +#define I2S_ENABLE_TX(i2s) ( (i2s)->CTL0 |= I2S_CTL0_TXEN_Msk ) + +/** + * @brief Disable I2S Tx function . + * @param[in] i2s is the base address of I2S module. + * @return none + * \hideinitializer + */ +#define I2S_DISABLE_TX(i2s) ( (i2s)->CTL0 &= ~I2S_CTL0_TXEN_Msk ) + +/** + * @brief Enable I2S Rx function . + * @param[in] i2s is the base address of I2S module. + * @return none + * \hideinitializer + */ +#define I2S_ENABLE_RX(i2s) ( (i2s)->CTL0 |= I2S_CTL0_RXEN_Msk ) + +/** + * @brief Disable I2S Rx function . + * @param[in] i2s is the base address of I2S module. + * @return none + * \hideinitializer + */ +#define I2S_DISABLE_RX(i2s) ( (i2s)->CTL0 &= ~I2S_CTL0_RXEN_Msk ) + +/** + * @brief Enable Tx Mute function . + * @param[in] i2s is the base address of I2S module. + * @return none + * \hideinitializer + */ +#define I2S_ENABLE_TX_MUTE(i2s) ( (i2s)->CTL0 |= I2S_CTL0_MUTE_Msk ) + +/** + * @brief Disable Tx Mute function . + * @param[in] i2s is the base address of I2S module. + * @return none + * \hideinitializer + */ +#define I2S_DISABLE_TX_MUTE(i2s) ( (i2s)->CTL0 &= ~I2S_CTL0_MUTE_Msk ) + +/** + * @brief Clear Tx FIFO. Internal pointer is reset to FIFO start point. + * @param[in] i2s is the base address of I2S module. + * @return none + * \hideinitializer + */ +#define I2S_CLR_TX_FIFO(i2s) ( (i2s)->CTL0 |= I2S_CTL0_TXFBCLR_Msk ) + +/** + * @brief Clear Rx FIFO. Internal pointer is reset to FIFO start point. + * @param[in] i2s is the base address of I2S module. + * @return none + * \hideinitializer + */ +#define I2S_CLR_RX_FIFO(i2s) ( (i2s)->CTL0 |= I2S_CTL0_RXFBCLR_Msk ) + +/** + * @brief This function sets the recording source channel when mono mode is used. + * @param[in] i2s is the base address of I2S module. + * @param[in] u32Ch left or right channel. Valid values are: + * - \ref I2S_MONO_LEFT + * - \ref I2S_MONO_RIGHT + * @return none + * \hideinitializer + */ +__STATIC_INLINE void I2S_SET_MONO_RX_CHANNEL(I2S_T *i2s, uint32_t u32Ch) +{ + u32Ch == I2S_MONO_LEFT ? + (i2s->CTL0 |= I2S_CTL0_RXLCH_Msk) : + (i2s->CTL0 &= ~I2S_CTL0_RXLCH_Msk); +} + +/** + * @brief Write data to I2S Tx FIFO. + * @param[in] i2s is the base address of I2S module. + * @param[in] u32Data: The data written to FIFO. + * @return none + * \hideinitializer + */ +#define I2S_WRITE_TX_FIFO(i2s, u32Data) ( (i2s)->TXFIFO = (u32Data) ) + +/** + * @brief Read Rx FIFO. + * @param[in] i2s is the base address of I2S module. + * @return Data in Rx FIFO. + * \hideinitializer + */ +#define I2S_READ_RX_FIFO(i2s) ( (i2s)->RXFIFO ) + +/** + * @brief This function gets the interrupt flag according to the mask parameter. + * @param[in] i2s is the base address of I2S module. + * @param[in] u32Mask is the mask for the all interrupt flags. + * @return The masked bit value of interrupt flag. + * \hideinitializer + */ +#define I2S_GET_INT_FLAG(i2s, u32Mask) ( (i2s)->STATUS0 & (u32Mask) ) + +/** + * @brief This function clears the interrupt flag according to the mask parameter. + * @param[in] i2s is the base address of I2S module. + * @param[in] u32Mask is the mask for the all interrupt flags. + * @return none + * \hideinitializer + */ +#define I2S_CLR_INT_FLAG(i2s, u32Mask) ( (i2s)->STATUS0 |= (u32Mask) ) + +/** + * @brief This function gets the zero crossing interrupt flag according to the mask parameter. + * @param[in] i2s is the base address of I2S module. + * @param[in] u32Mask is the mask for the all interrupt flags. + * @return The masked bit value of interrupt flag. + * \hideinitializer + */ +#define I2S_GET_ZC_INT_FLAG(i2s, u32Mask) ( (i2s)->STATUS1 & (u32Mask) ) + +/** + * @brief This function clears the zero crossing interrupt flag according to the mask parameter. + * @param[in] i2s is the base address of I2S module. + * @param[in] u32Mask is the mask for the all interrupt flags. + * @return none + * \hideinitializer + */ +#define I2S_CLR_ZC_INT_FLAG(i2s, u32Mask) ( (i2s)->STATUS1 |= (u32Mask) ) + +/** + * @brief Get transmit FIFO level + * @param[in] i2s is the base address of I2S module. + * @return FIFO level + * \hideinitializer + */ +#define I2S_GET_TX_FIFO_LEVEL(i2s) ( (((i2s)->STATUS1 & I2S_STATUS1_TXCNT_Msk) >> I2S_STATUS1_TXCNT_Pos) & 0xF ) + +/** + * @brief Get receive FIFO level + * @param[in] i2s is the base address of I2S module. + * @return FIFO level + * \hideinitializer + */ +#define I2S_GET_RX_FIFO_LEVEL(i2s) ( (((i2s)->STATUS1 & I2S_STATUS1_RXCNT_Msk) >> I2S_STATUS1_RXCNT_Pos) & 0xF ) + +void I2S_Close(I2S_T *i2s); +void I2S_EnableInt(I2S_T *i2s, uint32_t u32Mask); +void I2S_DisableInt(I2S_T *i2s, uint32_t u32Mask); +uint32_t I2S_EnableMCLK(I2S_T *i2s, uint32_t u32BusClock); +void I2S_DisableMCLK(I2S_T *i2s); +void I2S_SetFIFO(I2S_T *i2s, uint32_t u32TxThreshold, uint32_t u32RxThreshold); +void I2S_ConfigureTDM(I2S_T *i2s, uint32_t u32ChannelWidth, uint32_t u32ChannelNum, uint32_t u32SyncWidth); +uint32_t I2S_Open(I2S_T *i2s, uint32_t u32MasterSlave, uint32_t u32SampleRate, uint32_t u32WordWidth, uint32_t u32MonoData, uint32_t u32DataFormat); + +/*@}*/ /* end of group I2S_EXPORTED_FUNCTIONS */ + + +/*@}*/ /* end of group I2S_Driver */ + +/*@}*/ /* end of group Standard_Driver */ +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_kpi.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_kpi.h new file mode 100644 index 0000000000..ff7fbdcbc1 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_kpi.h @@ -0,0 +1,169 @@ +/**************************************************************************//** + * @file nu_kpi.h + * @brief KPI driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_KPI_H__ +#define __NU_KPI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup KPI_Driver KPI Driver + @{ +*/ + +/** @addtogroup KPI_EXPORTED_CONSTANTS KPI Exported Constants + @{ +*/ + +#define KPI_ROW_SCAN_DELAY4CLK (0x0 << KPI_KPICONF_SCANROWD_Pos) /*!< Delay cycle when row change */ +#define KPI_ROW_SCAN_DELAY8CLK (0x1 << KPI_KPICONF_SCANROWD_Pos) /*!< Delay cycle when row change */ +#define KPI_ROW_SCAN_DELAY16CLK (0x2 << KPI_KPICONF_SCANROWD_Pos) /*!< Delay cycle when row change */ +#define KPI_ROW_SCAN_DELAY32CLK (0x3 << KPI_KPICONF_SCANROWD_Pos) /*!< Delay cycle when row change */ + +#define KPI_KEY00 (KPI_KPIKEST0_KEST00_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY01 (KPI_KPIKEST0_KEST01_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY02 (KPI_KPIKEST0_KEST02_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY03 (KPI_KPIKEST0_KEST03_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY04 (KPI_KPIKEST0_KEST04_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY05 (KPI_KPIKEST0_KEST05_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY06 (KPI_KPIKEST0_KEST06_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY07 (KPI_KPIKEST0_KEST07_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY10 (KPI_KPIKEST0_KEST10_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY11 (KPI_KPIKEST0_KEST11_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY12 (KPI_KPIKEST0_KEST12_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY13 (KPI_KPIKEST0_KEST13_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY14 (KPI_KPIKEST0_KEST14_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY15 (KPI_KPIKEST0_KEST15_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY16 (KPI_KPIKEST0_KEST16_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY17 (KPI_KPIKEST0_KEST17_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY20 (KPI_KPIKEST0_KEST20_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY21 (KPI_KPIKEST0_KEST21_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY22 (KPI_KPIKEST0_KEST22_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY23 (KPI_KPIKEST0_KEST23_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY24 (KPI_KPIKEST0_KEST24_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY25 (KPI_KPIKEST0_KEST25_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY26 (KPI_KPIKEST0_KEST26_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY27 (KPI_KPIKEST0_KEST27_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY30 (KPI_KPIKEST0_KEST30_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY31 (KPI_KPIKEST0_KEST31_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY32 (KPI_KPIKEST0_KEST32_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY33 (KPI_KPIKEST0_KEST33_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY34 (KPI_KPIKEST0_KEST34_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY35 (KPI_KPIKEST0_KEST35_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY36 (KPI_KPIKEST0_KEST36_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY37 (KPI_KPIKEST0_KEST37_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY40 (KPI_KPIKEST0_KEST40_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY41 (KPI_KPIKEST0_KEST41_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY42 (KPI_KPIKEST0_KEST42_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY43 (KPI_KPIKEST0_KEST43_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY44 (KPI_KPIKEST0_KEST44_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY45 (KPI_KPIKEST0_KEST45_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY46 (KPI_KPIKEST0_KEST46_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY47 (KPI_KPIKEST0_KEST47_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY50 (KPI_KPIKEST0_KEST50_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY51 (KPI_KPIKEST0_KEST51_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY52 (KPI_KPIKEST0_KEST52_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY53 (KPI_KPIKEST0_KEST53_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY54 (KPI_KPIKEST0_KEST54_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY55 (KPI_KPIKEST0_KEST55_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY56 (KPI_KPIKEST0_KEST56_Msk) /*!< Press / Release Key Indicator */ +#define KPI_KEY57 (KPI_KPIKEST0_KEST57_Msk) /*!< Press / Release Key Indicator */ + +#define KPI_GET_KEY_STA_REG0(kpi) (kpi->KPIKEST0) /*!< Get Keypad State Register 0 */ +#define KPI_GET_KEY_STA_REG1(kpi) (kpi->KPIKEST1) /*!< Get Keypad State Register 1 */ +#define KPI_GET_PRESS_KEY_REG0(kpi) (kpi->KPIKPE0) /*!< Get Lower 32 Key Press Event Indicator */ +#define KPI_GET_PRESS_KEY_REG1(kpi) (kpi->KPIKPE1) /*!< Get Upper 32 Key Press Event Indicator */ +#define KPI_GET_RELEASE_KEY_REG0(kpi) (kpi->KPIKRE0) /*!< Get Lower 32 Key Release Event Indicator */ +#define KPI_GET_RELEASE_KEY_REG1(kpi) (kpi->KPIKRE1) /*!< Get Upper 32 Key Release Event Indicator */ + +#define KPI_EN_WAKEUP(kpi) (kpi->KPICONF |= KPI_KPICONF_WAKEUP_Msk) /*!< Enable Lower Power Wakeup */ +#define KPI_DIS_WAKEUP(kpi) (kpi->KPICONF &= ~KPI_KPICONF_WAKEUP_Msk) /*!< Disable Lower Power Wakeup */ + +/** + * @brief Enable KPI specified interrupt + * + * @param[in] u32InterruptFlag The specified interrupt of KPI module. + * - \ref KPI_KPICONF_PKINTEN_Msk : Press Key Interrupt Enable + * - \ref KPI_KPICONF_RKINTEN_Msk : Release Key Interrupt + * - \ref KPI_KPICONF_INTEN_Msk : Key Interrupt Enable + * + * @return None + * + * @details The function is used to enable KPI specified interrupt. + * \hideinitializer + */ +#define KPI_ENABLE_INT(kpi,u32InterruptFlag) (kpi->KPICONF |= u32InterruptFlag) + +/** + * @brief Disable KPI specified interrupt + * + * @param[in] u32InterruptFlag The specified interrupt of KPI module. + * - \ref KPI_KPICONF_PKINTEN_Msk : Press Key Interrupt Enable + * - \ref KPI_KPICONF_RKINTEN_Msk : Release Key Interrupt + * - \ref KPI_KPICONF_INTEN_Msk : Key Interrupt Enable + * + * @return None + * + * @details The function is used to enable KPI specified interrupt. + * \hideinitializer + */ +#define KPI_DISABLE_INT(kpi,u32InterruptFlag) (kpi->KPICONF &= ~u32IntSel) + +/** + * @brief Disable 3Key Reset + * + * @return None + * + * @details The function is used to disable 3key Reset. + * \hideinitializer + */ +#define KPI_DISABLE_3KEY_RESET(kpi) (kpi->KPI3KCONF &= ~KPI_KPI3KCONF_EN3KYRST_Msk) + +/** + * @brief Get interrupt flag + * + * @return \ref KPI_KPISTATUS_PDWAKE_Msk + * \ref KPI_KPISTATUS_RST3KEY_Msk + * \ref KPI_KPISTATUS_KEYINT_Msk + * \ref KPI_KPISTATUS_RKEYINT_Msk + * \ref KPI_KPISTATUS_PKEYINT_Msk + * + * @details The function is used to disable 3key Reset. + * \hideinitializer + */ +#define KPI_GET_INT_FLAG(kpi) (kpi->KPISTATUS) + +void KPI_Open(KPI_T *kpi, uint32_t u32Row, uint32_t u32Col); +void KPI_Close(KPI_T *kpi); +void KPI_ConfigKeyScanTiming(KPI_T *kpi, uint32_t u32PreScale, uint32_t u32Debounce, uint32_t u32ScanDelay); +void KPI_Set3KeyReset(KPI_T *kpi, uint32_t u32Key1, uint32_t u32Key2, uint32_t u32Key3, uint32_t u32RstCnt); + + +/*@}*/ /* end of group KPI_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group KPI_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /*__NU_KPI_H__*/ + + + + + + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_pdma.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_pdma.h new file mode 100644 index 0000000000..d50726a8bf --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_pdma.h @@ -0,0 +1,421 @@ +/**************************************************************************//** + * @file nu_pdma.h + * @brief PDMA driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_PDMA_H__ +#define __NU_PDMA_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup PDMA_Driver PDMA Driver + @{ +*/ + +/** @addtogroup PDMA_EXPORTED_CONSTANTS PDMA Exported Constants + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* Operation Mode Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define PDMA_OP_STOP 0x00000000UL /*!INTSTS)) + +/** + * @brief Get Transfer Done Interrupt Status + * + * @param[in] pdma The pointer of the specified PDMA module + * + * @return None + * + * @details Get the transfer done Interrupt status. + * \hideinitializer + */ +#define PDMA_GET_TD_STS(pdma) ((uint32_t)(pdma->TDSTS)) + +/** + * @brief Clear Transfer Done Interrupt Status + * + * @param[in] pdma The pointer of the specified PDMA module + * + * @param[in] u32Mask The channel mask + * + * @return None + * + * @details Clear the transfer done Interrupt status. + * \hideinitializer + */ +#define PDMA_CLR_TD_FLAG(pdma,u32Mask) ((uint32_t)(pdma->TDSTS = (u32Mask))) + +/** + * @brief Get Target Abort Interrupt Status + * + * @param[in] pdma The pointer of the specified PDMA module + * + * @return None + * + * @details Get the target abort Interrupt status. + * \hideinitializer + */ +#define PDMA_GET_ABORT_STS(pdma) ((uint32_t)(pdma->ABTSTS)) + +/** + * @brief Clear Target Abort Interrupt Status + * + * @param[in] pdma The pointer of the specified PDMA module + * + * @param[in] u32Mask The channel mask + * + * @return None + * + * @details Clear the target abort Interrupt status. + * \hideinitializer + */ +#define PDMA_CLR_ABORT_FLAG(pdma,u32Mask) ((uint32_t)(pdma->ABTSTS = (u32Mask))) + +/** + * @brief Get Alignment Interrupt Status + * + * @param[in] pdma The pointer of the specified PDMA module + * + * @return None + * + * @details Get Alignment Interrupt status. + * \hideinitializer + */ +#define PDMA_GET_ALIGN_STS(pdma) ((uint32_t)(PDMA->ALIGN)) + +/** + * @brief Clear Alignment Interrupt Status + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Mask The channel mask + * + * @return None + * + * @details Clear the Alignment Interrupt status. + * \hideinitializer + */ +#define PDMA_CLR_ALIGN_FLAG(pdma,u32Mask) ((uint32_t)(pdma->ALIGN = (u32Mask))) + +/** + * @brief Clear Timeout Interrupt Status + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * + * @return None + * + * @details Clear the selected channel timeout interrupt status. + * \hideinitializer + */ +#define PDMA_CLR_TMOUT_FLAG(pdma,u32Ch) ((uint32_t)(pdma->INTSTS = (1 << ((u32Ch) + 8)))) + +/** + * @brief Check Channel Status + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * + * @retval 0 Idle state + * @retval 1 Busy state + * + * @details Check the selected channel is busy or not. + * \hideinitializer + */ +#define PDMA_IS_CH_BUSY(pdma,u32Ch) ((uint32_t)(pdma->TRGSTS & (1 << (u32Ch)))? 1 : 0) + +/** + * @brief Set Source Address + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * @param[in] u32Addr The selected address + * + * @return None + * + * @details This macro set the selected channel source address. + * \hideinitializer + */ +#define PDMA_SET_SRC_ADDR(pdma,u32Ch, u32Addr) ((uint32_t)(pdma->DSCT[(u32Ch)].SA = (u32Addr))) + +/** + * @brief Set Destination Address + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * @param[in] u32Addr The selected address + * + * @return None + * + * @details This macro set the selected channel destination address. + * \hideinitializer + */ +#define PDMA_SET_DST_ADDR(pdma,u32Ch, u32Addr) ((uint32_t)(pdma->DSCT[(u32Ch)].DA = (u32Addr))) + +/** + * @brief Set Transfer Count + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * @param[in] u32TransCount Transfer Count + * + * @return None + * + * @details This macro set the selected channel transfer count. + * \hideinitializer + */ +#define PDMA_SET_TRANS_CNT(pdma,u32Ch, u32TransCount) ((uint32_t)(pdma->DSCT[(u32Ch)].CTL=(pdma->DSCT[(u32Ch)].CTL&~PDMA_DSCT_CTL_TXCNT_Msk)|(((u32TransCount)-1) << PDMA_DSCT_CTL_TXCNT_Pos))) + +/** + * @brief Set Scatter-gather descriptor Address + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * @param[in] u32Addr The descriptor address + * + * @return None + * + * @details This macro set the selected channel scatter-gather descriptor address. + * \hideinitializer + */ +#define PDMA_SET_SCATTER_DESC(pdma,u32Ch, u32Addr) ((uint32_t)(pdma->DSCT[(u32Ch)].NEXT = (u32Addr) - (pdma->SCATBA))) + +/** + * @brief Stop the channel + * + * @param[in] pdma The pointer of the specified PDMA module + * + * @param[in] u32Ch The selected channel + * + * @return None + * + * @details This macro stop the selected channel. + * \hideinitializer + */ +#define PDMA_STOP(pdma,u32Ch) ((uint32_t)(pdma->PAUSE = (1 << (u32Ch)))) + +/** + * @brief Pause the channel + * + * @param[in] pdma The pointer of the specified PDMA module + * + * @param[in] u32Ch The selected channel + * + * @return None + * + * @details This macro pause the selected channel. + * \hideinitializer + */ +#define PDMA_PAUSE(pdma,u32Ch) ((uint32_t)(pdma->PAUSE = (1 << (u32Ch)))) + +/*---------------------------------------------------------------------------------------------------------*/ +/* Define PDMA functions prototype */ +/*---------------------------------------------------------------------------------------------------------*/ +void PDMA_Open(PDMA_T *pdma, uint32_t u32Mask); +void PDMA_Close(PDMA_T *pdma); +void PDMA_SetTransferCnt(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32Width, uint32_t u32TransCount); +void PDMA_SetTransferAddr(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32SrcAddr, uint32_t u32SrcCtrl, uint32_t u32DstAddr, uint32_t u32DstCtrl); +void PDMA_SetTransferMode(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32Peripheral, uint32_t u32ScatterEn, uint32_t u32DescAddr); +void PDMA_SetBurstType(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32BurstType, uint32_t u32BurstSize); +void PDMA_EnableTimeout(PDMA_T *pdma, uint32_t u32Mask); +void PDMA_DisableTimeout(PDMA_T *pdma, uint32_t u32Mask); +void PDMA_SetTimeOut(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32OnOff, uint32_t u32TimeOutCnt); +void PDMA_Trigger(PDMA_T *pdma, uint32_t u32Ch); +void PDMA_EnableInt(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32Mask); +void PDMA_DisableInt(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32Mask); +void PDMA_SetStride(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32DestLen, uint32_t u32SrcLen, uint32_t u32TransCount); +void PDMA_SetRepeat(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32DestInterval, uint32_t u32SrcInterval, uint32_t u32RepeatCount); + + +/*@}*/ /* end of group PDMA_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group PDMA_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __PDMA_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_qei.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_qei.h new file mode 100644 index 0000000000..4707e192a4 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_qei.h @@ -0,0 +1,388 @@ +/**************************************************************************//** + * @file nu_qei.h + * @brief Quadrature Encoder Interface (QEI) driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_QEI_H__ +#define __NU_QEI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup QEI_Driver QEI Driver + @{ +*/ + +/** @addtogroup QEI_EXPORTED_CONSTANTS QEI Exported Constants + @{ +*/ + +/*---------------------------------------------------------------------------------------------------------*/ +/* QEI counting mode selection constants definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define QEI_CTL_X4_FREE_COUNTING_MODE (0x0<CTL &= (~QEI_CTL_CMPEN_Msk)) + +/** + * @brief Enable QEI compare function + * @param[in] qei The pointer of the specified QEI module. + * @return None + * @details This macro enable QEI counter compare function. + * \hideinitializer + */ +#define QEI_ENABLE_CNT_CMP(qei) ((qei)->CTL |= QEI_CTL_CMPEN_Msk) + +/** + * @brief Disable QEI index latch function + * @param[in] qei The pointer of the specified QEI module. + * @return None + * @details This macro disable QEI index trigger counter latch function. + * \hideinitializer + */ +#define QEI_DISABLE_INDEX_LATCH(qei) ((qei)->CTL &= (~QEI_CTL_IDXLATEN_Msk)) + +/** + * @brief Enable QEI index latch function + * @param[in] qei The pointer of the specified QEI module. + * @return None + * @details This macro enable QEI index trigger counter latch function. + * \hideinitializer + */ +#define QEI_ENABLE_INDEX_LATCH(qei) ((qei)->CTL |= QEI_CTL_IDXLATEN_Msk) + +/** + * @brief Disable QEI index reload function + * @param[in] qei The pointer of the specified QEI module. + * @return None + * @details This macro disable QEI index trigger counter reload function. + * \hideinitializer + */ +#define QEI_DISABLE_INDEX_RELOAD(qei) ((qei)->CTL &= (~QEI_CTL_IDXRLDEN_Msk)) + +/** + * @brief Enable QEI index reload function + * @param[in] qei The pointer of the specified QEI module. + * @return None + * @details This macro enable QEI index trigger counter reload function. + * \hideinitializer + */ +#define QEI_ENABLE_INDEX_RELOAD(qei) ((qei)->CTL |= QEI_CTL_IDXRLDEN_Msk) + +/** + * @brief Disable QEI input + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32InputType Input signal type. + * - \ref QEI_CTL_CHAEN_Msk : QEA input + * - \ref QEI_CTL_CHAEN_Msk : QEB input + * - \ref QEI_CTL_IDXEN_Msk : IDX input + * @return None + * @details This macro disable specified QEI signal input. + * \hideinitializer + */ +#define QEI_DISABLE_INPUT(qei, u32InputType) ((qei)->CTL &= ~(u32InputType)) + +/** + * @brief Enable QEI input + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32InputType Input signal type . + * - \ref QEI_CTL_CHAEN_Msk : QEA input + * - \ref QEI_CTL_CHBEN_Msk : QEB input + * - \ref QEI_CTL_IDXEN_Msk : IDX input + * @return None + * @details This macro enable specified QEI signal input. + * \hideinitializer + */ +#define QEI_ENABLE_INPUT(qei, u32InputType) ((qei)->CTL |= (u32InputType)) + +/** + * @brief Disable inverted input polarity + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32InputType Input signal type . + * - \ref QEI_CTL_CHAINV_Msk : QEA Input + * - \ref QEI_CTL_CHBINV_Msk : QEB Input + * - \ref QEI_CTL_IDXINV_Msk : IDX Input + * @return None + * @details This macro disable specified QEI signal inverted input polarity. + * \hideinitializer + */ +#define QEI_DISABLE_INPUT_INV(qei, u32InputType) ((qei)->CTL &= ~(u32InputType)) + +/** + * @brief Enable inverted input polarity + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32InputType Input signal type. + * - \ref QEI_CTL_CHAINV_Msk : QEA Input + * - \ref QEI_CTL_CHBINV_Msk : QEB Input + * - \ref QEI_CTL_IDXINV_Msk : IDX Input + * @return None + * @details This macro inverse specified QEI signal input polarity. + * \hideinitializer + */ +#define QEI_ENABLE_INPUT_INV(qei, u32InputType) ((qei)->CTL |= (u32InputType)) + +/** + * @brief Disable QEI interrupt + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32IntSel Interrupt type selection. + * - \ref QEI_CTL_DIRIEN_Msk : Direction change interrupt + * - \ref QEI_CTL_OVUNIEN_Msk : Counter overflow or underflow interrupt + * - \ref QEI_CTL_CMPIEN_Msk : Compare-match interrupt + * - \ref QEI_CTL_IDXIEN_Msk : Index detected interrupt + * @return None + * @details This macro disable specified QEI interrupt. + * \hideinitializer + */ +#define QEI_DISABLE_INT(qei, u32IntSel) ((qei)->CTL &= ~(u32IntSel)) + +/** + * @brief Enable QEI interrupt + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32IntSel Interrupt type selection. + * - \ref QEI_CTL_DIRIEN_Msk : Direction change interrupt + * - \ref QEI_CTL_OVUNIEN_Msk : Counter overflow or underflow interrupt + * - \ref QEI_CTL_CMPIEN_Msk : Compare-match interrupt + * - \ref QEI_CTL_IDXIEN_Msk : Index detected interrupt + * @return None + * @details This macro enable specified QEI interrupt. + * \hideinitializer + */ +#define QEI_ENABLE_INT(qei, u32IntSel) ((qei)->CTL |= (u32IntSel)) + +/** + * @brief Disable QEI noise filter + * @param[in] qei The pointer of the specified QEI module. + * @return None + * @details This macro disable QEI noise filter function. + * \hideinitializer + */ +#define QEI_DISABLE_NOISE_FILTER(qei) ((qei)->CTL |= QEI_CTL_NFDIS_Msk) + +/** + * @brief Enable QEI noise filter + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32ClkSel The sampling frequency of the noise filter clock. + * - \ref QEI_CTL_NFCLKSEL_DIV1 + * - \ref QEI_CTL_NFCLKSEL_DIV2 + * - \ref QEI_CTL_NFCLKSEL_DIV4 + * - \ref QEI_CTL_NFCLKSEL_DIV16 + * - \ref QEI_CTL_NFCLKSEL_DIV32 + * - \ref QEI_CTL_NFCLKSEL_DIV64 + * @return None + * @details This macro enable QEI noise filter function and select noise filter clock. + * \hideinitializer + */ +#define QEI_ENABLE_NOISE_FILTER(qei, u32ClkSel) ((qei)->CTL = ((qei)->CTL & (~(QEI_CTL_NFDIS_Msk|QEI_CTL_NFCLKSEL_Msk))) | (u32ClkSel)) + +/** + * @brief Get QEI counter value + * @param[in] qei The pointer of the specified QEI module. + * @return QEI pulse counter register value. + * @details This macro get QEI pulse counter value. + * \hideinitializer + */ +#define QEI_GET_CNT_VALUE(qei) ((qei)->CNT) + +/** + * @brief Get QEI counting direction + * @param[in] qei The pointer of the specified QEI module. + * @retval 0 QEI counter is in down-counting. + * @retval 1 QEI counter is in up-counting. + * @details This macro get QEI counting direction. + * \hideinitializer + */ +#define QEI_GET_DIR(qei) (((qei)->STATUS & (QEI_STATUS_DIRF_Msk))?1:0) + +/** + * @brief Get QEI counter hold value + * @param[in] qei The pointer of the specified QEI module. + * @return QEI pulse counter hold register value. + * @details This macro get QEI pulse counter hold value, which is updated with counter value in hold counter value control. + * \hideinitializer + */ +#define QEI_GET_HOLD_VALUE(qei) ((qei)->CNTHOLD) + +/** + * @brief Get QEI counter index latch value + * @param[in] qei The pointer of the specified QEI module. + * @return QEI pulse counter index latch value + * @details This macro get QEI pulse counter index latch value, which is updated with counter value when the index is detected. + * \hideinitializer + */ +#define QEI_GET_INDEX_LATCH_VALUE(qei) ((qei)->CNTLATCH) + +/** + * @brief Set QEI counter index latch value + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32Val The latch value. + * @return QEI pulse counter index latch value + * @details This macro set QEI pulse counter index latch value, which is updated with counter value when the index is detected. + * \hideinitializer + */ +#define QEI_SET_INDEX_LATCH_VALUE(qei,u32Val) ((qei)->CNTLATCH = (u32Val)) + +/** + * @brief Get QEI interrupt flag status + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32IntSel Interrupt type selection. +* - \ref QEI_STATUS_DIRF_Msk : Counting direction flag + * - \ref QEI_STATUS_DIRCHGF_Msk : Direction change flag + * - \ref QEI_STATUS_OVUNF_Msk : Counter overflow or underflow flag + * - \ref QEI_STATUS_CMPF_Msk : Compare-match flag + * - \ref QEI_STATUS_IDXF_Msk : Index detected flag + * @retval 0 QEI specified interrupt flag is not set. + * @retval 1 QEI specified interrupt flag is set. + * @details This macro get QEI specified interrupt flag status. + * \hideinitializer + */ +#define QEI_GET_INT_FLAG(qei, u32IntSel) (((qei)->STATUS & (u32IntSel))?1:0) + + +/** + * @brief Clear QEI interrupt flag + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32IntSel Interrupt type selection. + * - \ref QEI_STATUS_DIRCHGF_Msk : Direction change flag + * - \ref QEI_STATUS_OVUNF_Msk : Counter overflow or underflow flag + * - \ref QEI_STATUS_CMPF_Msk : Compare-match flag + * - \ref QEI_STATUS_IDXF_Msk : Index detected flag + * @return None + * @details This macro clear QEI specified interrupt flag. + * \hideinitializer + */ +#define QEI_CLR_INT_FLAG(qei, u32IntSel) ((qei)->STATUS = (u32IntSel)) + +/** + * @brief Set QEI counter compare value + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32Value The counter compare value. + * @return None + * @details This macro set QEI pulse counter compare value. + * \hideinitializer + */ +#define QEI_SET_CNT_CMP(qei, u32Value) ((qei)->CNTCMP = (u32Value)) + +/** + * @brief Set QEI counter value + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32Value The counter compare value. + * @return None + * @details This macro set QEI pulse counter value. + * \hideinitializer + */ +#define QEI_SET_CNT_VALUE(qei, u32Value) ((qei)->CNT = (u32Value)) + +/** + * @brief Enable QEI counter hold mode + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32Type The triggered type. + * - \ref QEI_CTL_HOLDCNT_Msk : Hold QEI_CNT control + * - \ref QEI_CTL_HOLDTMR0_Msk : Hold QEI_CNT by Timer0 + * - \ref QEI_CTL_HOLDTMR1_Msk : Hold QEI_CNT by Timer1 + * - \ref QEI_CTL_HOLDTMR2_Msk : Hold QEI_CNT by Timer2 + * - \ref QEI_CTL_HOLDTMR3_Msk : Hold QEI_CNT by Timer3 + * @return None + * @details This macro enable QEI counter hold mode. + * \hideinitializer + */ +#define QEI_ENABLE_HOLD_TRG_SRC(qei, u32Type) ((qei)->CTL |= (u32Type)) + +/** + * @brief Disable QEI counter hold mode + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32Type The triggered type. + * - \ref QEI_CTL_HOLDCNT_Msk : Hold QEI_CNT control + * - \ref QEI_CTL_HOLDTMR0_Msk : Hold QEI_CNT by Timer0 + * - \ref QEI_CTL_HOLDTMR1_Msk : Hold QEI_CNT by Timer1 + * - \ref QEI_CTL_HOLDTMR2_Msk : Hold QEI_CNT by Timer2 + * - \ref QEI_CTL_HOLDTMR3_Msk : Hold QEI_CNT by Timer3 + * @return None + * @details This macro disable QEI counter hold mode. + * \hideinitializer + */ +#define QEI_DISABLE_HOLD_TRG_SRC(qei, u32Type) ((qei)->CTL &= ~(u32Type)) + +/** + * @brief Set QEI maximum count value + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32Value The counter maximum value. + * @return QEI maximum count value + * @details This macro set QEI maximum count value. + * \hideinitializer + */ +#define QEI_SET_CNT_MAX(qei, u32Value) ((qei)->CNTMAX = (u32Value)) + +/** + * @brief Set QEI counting mode + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32Mode QEI counting mode. + * - \ref QEI_CTL_X4_FREE_COUNTING_MODE + * - \ref QEI_CTL_X2_FREE_COUNTING_MODE + * - \ref QEI_CTL_X4_COMPARE_COUNTING_MODE + * - \ref QEI_CTL_X2_COMPARE_COUNTING_MODE + * @return None + * @details This macro set QEI counting mode. + * \hideinitializer + */ +#define QEI_SET_CNT_MODE(qei, u32Mode) ((qei)->CTL = ((qei)->CTL & (~QEI_CTL_MODE_Msk)) | (u32Mode)) + + +void QEI_Close(QEI_T *qei); +void QEI_DisableInt(QEI_T *qei, uint32_t u32IntSel); +void QEI_EnableInt(QEI_T *qei, uint32_t u32IntSel); +void QEI_Open(QEI_T *qei, uint32_t u32Mode, uint32_t u32Value); +void QEI_Start(QEI_T *qei); +void QEI_Stop(QEI_T *qei); + + +/*@}*/ /* end of group QEI_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group QEI_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_QEI_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_qspi.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_qspi.h new file mode 100644 index 0000000000..28f5fe67c9 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_qspi.h @@ -0,0 +1,379 @@ +/**************************************************************************//** + * @file nu_qspi.h + * @brief QSPI driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_QSPI_H__ +#define __NU_QSPI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup QSPI_Driver QSPI Driver + @{ +*/ + +/** @addtogroup QSPI_EXPORTED_CONSTANTS QSPI Exported Constants + @{ +*/ + +#define QSPI_MODE_0 (QSPI_CTL_TXNEG_Msk) /*!< CLKPOL=0; RXNEG=0; TXNEG=1 \hideinitializer */ +#define QSPI_MODE_1 (QSPI_CTL_RXNEG_Msk) /*!< CLKPOL=0; RXNEG=1; TXNEG=0 \hideinitializer */ +#define QSPI_MODE_2 (QSPI_CTL_CLKPOL_Msk | QSPI_CTL_RXNEG_Msk) /*!< CLKPOL=1; RXNEG=1; TXNEG=0 \hideinitializer */ +#define QSPI_MODE_3 (QSPI_CTL_CLKPOL_Msk | QSPI_CTL_TXNEG_Msk) /*!< CLKPOL=1; RXNEG=0; TXNEG=1 \hideinitializer */ + +#define QSPI_SLAVE (QSPI_CTL_SLAVE_Msk) /*!< Set as slave \hideinitializer */ +#define QSPI_MASTER (0x0U) /*!< Set as master \hideinitializer */ + +#define QSPI_SS (QSPI_SSCTL_SS_Msk) /*!< Set SS \hideinitializer */ +#define QSPI_SS_ACTIVE_HIGH (QSPI_SSCTL_SSACTPOL_Msk) /*!< SS active high \hideinitializer */ +#define QSPI_SS_ACTIVE_LOW (0x0U) /*!< SS active low \hideinitializer */ + +/* QSPI Interrupt Mask */ +#define QSPI_UNIT_INT_MASK (0x001U) /*!< Unit transfer interrupt mask \hideinitializer */ +#define QSPI_SSACT_INT_MASK (0x002U) /*!< Slave selection signal active interrupt mask \hideinitializer */ +#define QSPI_SSINACT_INT_MASK (0x004U) /*!< Slave selection signal inactive interrupt mask \hideinitializer */ +#define QSPI_SLVUR_INT_MASK (0x008U) /*!< Slave under run interrupt mask \hideinitializer */ +#define QSPI_SLVBE_INT_MASK (0x010U) /*!< Slave bit count error interrupt mask \hideinitializer */ +#define QSPI_TXUF_INT_MASK (0x040U) /*!< Slave TX underflow interrupt mask \hideinitializer */ +#define QSPI_FIFO_TXTH_INT_MASK (0x080U) /*!< FIFO TX threshold interrupt mask \hideinitializer */ +#define QSPI_FIFO_RXTH_INT_MASK (0x100U) /*!< FIFO RX threshold interrupt mask \hideinitializer */ +#define QSPI_FIFO_RXOV_INT_MASK (0x200U) /*!< FIFO RX overrun interrupt mask \hideinitializer */ +#define QSPI_FIFO_RXTO_INT_MASK (0x400U) /*!< FIFO RX time-out interrupt mask \hideinitializer */ + +/* QSPI Status Mask */ +#define QSPI_BUSY_MASK (0x01U) /*!< Busy status mask \hideinitializer */ +#define QSPI_RX_EMPTY_MASK (0x02U) /*!< RX empty status mask \hideinitializer */ +#define QSPI_RX_FULL_MASK (0x04U) /*!< RX full status mask \hideinitializer */ +#define QSPI_TX_EMPTY_MASK (0x08U) /*!< TX empty status mask \hideinitializer */ +#define QSPI_TX_FULL_MASK (0x10U) /*!< TX full status mask \hideinitializer */ +#define QSPI_TXRX_RESET_MASK (0x20U) /*!< TX or RX reset status mask \hideinitializer */ +#define QSPI_QSPIEN_STS_MASK (0x40U) /*!< QSPIEN status mask \hideinitializer */ +#define QSPI_SSLINE_STS_MASK (0x80U) /*!< QSPIx_SS line status mask \hideinitializer */ + +/*@}*/ /* end of group QSPI_EXPORTED_CONSTANTS */ + + +/** @addtogroup QSPI_EXPORTED_FUNCTIONS QSPI Exported Functions + @{ +*/ + +/** + * @brief Clear the unit transfer interrupt flag. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Write 1 to UNITIF bit of QSPI_STATUS register to clear the unit transfer interrupt flag. + * \hideinitializer + */ +#define QSPI_CLR_UNIT_TRANS_INT_FLAG(qspi) ((qspi)->STATUS = QSPI_STATUS_UNITIF_Msk) + +/** + * @brief Trigger RX PDMA function. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Set RXPDMAEN bit of QSPI_PDMACTL register to enable RX PDMA transfer function. + * \hideinitializer + */ +#define QSPI_TRIGGER_RX_PDMA(qspi) ((qspi)->PDMACTL |= QSPI_PDMACTL_RXPDMAEN_Msk) + +/** + * @brief Trigger TX PDMA function. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Set TXPDMAEN bit of QSPI_PDMACTL register to enable TX PDMA transfer function. + * \hideinitializer + */ +#define QSPI_TRIGGER_TX_PDMA(qspi) ((qspi)->PDMACTL |= QSPI_PDMACTL_TXPDMAEN_Msk) + +/** + * @brief Trigger TX and RX PDMA function. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Set TXPDMAEN bit and RXPDMAEN bit of QSPI_PDMACTL register to enable TX and RX PDMA transfer function. + * \hideinitializer + */ +#define QSPI_TRIGGER_TX_RX_PDMA(qspi) ((qspi)->PDMACTL |= (QSPI_PDMACTL_TXPDMAEN_Msk | QSPI_PDMACTL_RXPDMAEN_Msk)) + +/** + * @brief Disable RX PDMA transfer. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Clear RXPDMAEN bit of QSPI_PDMACTL register to disable RX PDMA transfer function. + * \hideinitializer + */ +#define QSPI_DISABLE_RX_PDMA(qspi) ( (qspi)->PDMACTL &= ~QSPI_PDMACTL_RXPDMAEN_Msk ) + +/** + * @brief Disable TX PDMA transfer. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Clear TXPDMAEN bit of QSPI_PDMACTL register to disable TX PDMA transfer function. + * \hideinitializer + */ +#define QSPI_DISABLE_TX_PDMA(qspi) ( (qspi)->PDMACTL &= ~QSPI_PDMACTL_TXPDMAEN_Msk ) + +/** + * @brief Disable TX and RX PDMA transfer. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Clear TXPDMAEN bit and RXPDMAEN bit of QSPI_PDMACTL register to disable TX and RX PDMA transfer function. + * \hideinitializer + */ +#define QSPI_DISABLE_TX_RX_PDMA(qspi) ( (qspi)->PDMACTL &= ~(QSPI_PDMACTL_TXPDMAEN_Msk | QSPI_PDMACTL_RXPDMAEN_Msk) ) + +/** + * @brief Get the count of available data in RX FIFO. + * @param[in] qspi The pointer of the specified QSPI module. + * @return The count of available data in RX FIFO. + * @details Read RXCNT (QSPI_STATUS[27:24]) to get the count of available data in RX FIFO. + * \hideinitializer + */ +#define QSPI_GET_RX_FIFO_COUNT(qspi) (((qspi)->STATUS & QSPI_STATUS_RXCNT_Msk) >> QSPI_STATUS_RXCNT_Pos) + +/** + * @brief Get the RX FIFO empty flag. + * @param[in] qspi The pointer of the specified QSPI module. + * @retval 0 RX FIFO is not empty. + * @retval 1 RX FIFO is empty. + * @details Read RXEMPTY bit of QSPI_STATUS register to get the RX FIFO empty flag. + * \hideinitializer + */ +#define QSPI_GET_RX_FIFO_EMPTY_FLAG(qspi) (((qspi)->STATUS & QSPI_STATUS_RXEMPTY_Msk)>>QSPI_STATUS_RXEMPTY_Pos) + +/** + * @brief Get the TX FIFO empty flag. + * @param[in] qspi The pointer of the specified QSPI module. + * @retval 0 TX FIFO is not empty. + * @retval 1 TX FIFO is empty. + * @details Read TXEMPTY bit of QSPI_STATUS register to get the TX FIFO empty flag. + * \hideinitializer + */ +#define QSPI_GET_TX_FIFO_EMPTY_FLAG(qspi) (((qspi)->STATUS & QSPI_STATUS_TXEMPTY_Msk)>>QSPI_STATUS_TXEMPTY_Pos) + +/** + * @brief Get the TX FIFO full flag. + * @param[in] qspi The pointer of the specified QSPI module. + * @retval 0 TX FIFO is not full. + * @retval 1 TX FIFO is full. + * @details Read TXFULL bit of QSPI_STATUS register to get the TX FIFO full flag. + * \hideinitializer + */ +#define QSPI_GET_TX_FIFO_FULL_FLAG(qspi) (((qspi)->STATUS & QSPI_STATUS_TXFULL_Msk)>>QSPI_STATUS_TXFULL_Pos) + +/** + * @brief Get the datum read from RX register. + * @param[in] qspi The pointer of the specified QSPI module. + * @return Data in RX register. + * @details Read QSPI_RX register to get the received datum. + * \hideinitializer + */ +#define QSPI_READ_RX(qspi) ((qspi)->RX) + +/** + * @brief Write datum to TX register. + * @param[in] qspi The pointer of the specified QSPI module. + * @param[in] u32TxData The datum which user attempt to transfer through QSPI bus. + * @return None. + * @details Write u32TxData to QSPI_TX register. + * \hideinitializer + */ +#define QSPI_WRITE_TX(qspi, u32TxData) ((qspi)->TX = (u32TxData)) + +/** + * @brief Set QSPIx_SS pin to high state. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Disable automatic slave selection function and set QSPIx_SS pin to high state. + * \hideinitializer + */ +#define QSPI_SET_SS_HIGH(qspi) ((qspi)->SSCTL = ((qspi)->SSCTL & (~QSPI_SSCTL_AUTOSS_Msk)) | (QSPI_SSCTL_SSACTPOL_Msk | QSPI_SSCTL_SS_Msk)) + +/** + * @brief Set QSPIx_SS pin to low state. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Disable automatic slave selection function and set QSPIx_SS pin to low state. + * \hideinitializer + */ +#define QSPI_SET_SS_LOW(qspi) ((qspi)->SSCTL = ((qspi)->SSCTL & (~(QSPI_SSCTL_AUTOSS_Msk | QSPI_SSCTL_SSACTPOL_Msk))) | QSPI_SSCTL_SS_Msk) + +/** + * @brief Enable Byte Reorder function. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Enable Byte Reorder function. The suspend interval depends on the setting of SUSPITV (QSPI_CTL[7:4]). + * \hideinitializer + */ +#define QSPI_ENABLE_BYTE_REORDER(qspi) ((qspi)->CTL |= QSPI_CTL_REORDER_Msk) + +/** + * @brief Disable Byte Reorder function. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Clear REORDER bit field of QSPI_CTL register to disable Byte Reorder function. + * \hideinitializer + */ +#define QSPI_DISABLE_BYTE_REORDER(qspi) ((qspi)->CTL &= ~QSPI_CTL_REORDER_Msk) + +/** + * @brief Set the length of suspend interval. + * @param[in] qspi The pointer of the specified QSPI module. + * @param[in] u32SuspCycle Decides the length of suspend interval. It could be 0 ~ 15. + * @return None. + * @details Set the length of suspend interval according to u32SuspCycle. + * The length of suspend interval is ((u32SuspCycle + 0.5) * the length of one QSPI bus clock cycle). + * \hideinitializer + */ +#define QSPI_SET_SUSPEND_CYCLE(qspi, u32SuspCycle) ((qspi)->CTL = ((qspi)->CTL & ~QSPI_CTL_SUSPITV_Msk) | ((u32SuspCycle) << QSPI_CTL_SUSPITV_Pos)) + +/** + * @brief Set the QSPI transfer sequence with LSB first. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Set LSB bit of QSPI_CTL register to set the QSPI transfer sequence with LSB first. + * \hideinitializer + */ +#define QSPI_SET_LSB_FIRST(qspi) ((qspi)->CTL |= QSPI_CTL_LSB_Msk) + +/** + * @brief Set the QSPI transfer sequence with MSB first. + * @param[in] qspi The pointer of the specified SPI module. + * @return None. + * @details Clear LSB bit of QSPI_CTL register to set the QSPI transfer sequence with MSB first. + * \hideinitializer + */ +#define QSPI_SET_MSB_FIRST(qspi) ((qspi)->CTL &= ~QSPI_CTL_LSB_Msk) + +/** + * @brief Set the data width of a QSPI transaction. + * @param[in] qspi The pointer of the specified QSPI module. + * @param[in] u32Width The bit width of one transaction. + * @return None. + * @details The data width can be 8 ~ 32 bits. + * \hideinitializer + */ +#define QSPI_SET_DATA_WIDTH(qspi, u32Width) ((qspi)->CTL = ((qspi)->CTL & ~QSPI_CTL_DWIDTH_Msk) | (((u32Width)&0x1F) << QSPI_CTL_DWIDTH_Pos)) + +/** + * @brief Get the QSPI busy state. + * @param[in] qspi The pointer of the specified QSPI module. + * @retval 0 QSPI controller is not busy. + * @retval 1 QSPI controller is busy. + * @details This macro will return the busy state of QSPI controller. + * \hideinitializer + */ +#define QSPI_IS_BUSY(qspi) ( ((qspi)->STATUS & QSPI_STATUS_BUSY_Msk)>>QSPI_STATUS_BUSY_Pos ) + +/** + * @brief Enable QSPI controller. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Set QSPIEN (QSPI_CTL[0]) to enable QSPI controller. + * \hideinitializer + */ +#define QSPI_ENABLE(qspi) ((qspi)->CTL |= QSPI_CTL_QSPIEN_Msk) + +/** + * @brief Disable QSPI controller. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + * @details Clear QSPIEN (QSPI_CTL[0]) to disable QSPI controller. + * \hideinitializer + */ +#define QSPI_DISABLE(qspi) ((qspi)->CTL &= ~QSPI_CTL_QSPIEN_Msk) + +/** + * @brief Disable QSPI Dual IO function. + * @param[in] qspi is the base address of QSPI module. + * @return none + * \hideinitializer + */ +#define QSPI_DISABLE_DUAL_MODE(qspi) ( (qspi)->CTL &= ~QSPI_CTL_DUALIOEN_Msk ) + +/** + * @brief Enable Dual IO function and set QSPI Dual IO direction to input. + * @param[in] qspi is the base address of QSPI module. + * @return none + * \hideinitializer + */ +#define QSPI_ENABLE_DUAL_INPUT_MODE(qspi) ( (qspi)->CTL = ((qspi)->CTL & ~QSPI_CTL_DATDIR_Msk) | QSPI_CTL_DUALIOEN_Msk ) + +/** + * @brief Enable Dual IO function and set QSPI Dual IO direction to output. + * @param[in] qspi is the base address of QSPI module. + * @return none + * \hideinitializer + */ +#define QSPI_ENABLE_DUAL_OUTPUT_MODE(qspi) ( (qspi)->CTL |= QSPI_CTL_DATDIR_Msk | QSPI_CTL_DUALIOEN_Msk ) + +/** + * @brief Disable QSPI Dual IO function. + * @param[in] qspi is the base address of QSPI module. + * @return none + * \hideinitializer + */ +#define QSPI_DISABLE_QUAD_MODE(qspi) ( (qspi)->CTL &= ~QSPI_CTL_QUADIOEN_Msk ) + +/** + * @brief Set QSPI Quad IO direction to input. + * @param[in] qspi is the base address of QSPI module. + * @return none + * \hideinitializer + */ +#define QSPI_ENABLE_QUAD_INPUT_MODE(qspi) ( (qspi)->CTL = ((qspi)->CTL & ~QSPI_CTL_DATDIR_Msk) | QSPI_CTL_QUADIOEN_Msk ) + +/** + * @brief Set QSPI Quad IO direction to output. + * @param[in] qspi is the base address of QSPI module. + * @return none + * \hideinitializer + */ +#define QSPI_ENABLE_QUAD_OUTPUT_MODE(qspi) ( (qspi)->CTL |= QSPI_CTL_DATDIR_Msk | QSPI_CTL_QUADIOEN_Msk ) + +/** + * @brief Set QSPI Master Receive Phase. + * @param[in] qspi is the base address of QSPI module. + * @param[in] rxdly is the clock cycle of delay for rx phase. + * @return none + * \hideinitializer + */ +#define QSPI_SET_MRXPHASE(qspi, rxdly) ( (qspi)->INTERNAL = ((qspi)->INTERNAL & ~QSPI_INTERNAL_MRXPHASE_Msk) | (rxdly<TALM_M +#define REG_RTC_CALM RTC->CALM_M +#define REG_RTC_INTEN RTC->INTEN_M +#define REG_RTC_INTSTS RTC->INTSTS_M +#define REG_RTC_TICK RTC->TICK_M +#define REG_RTC_TAMSK RTC->TAMSK_M +#define REG_RTC_CAMSK RTC->CAMSK_M +#else +#define REG_RTC_TALM RTC->TALM +#define REG_RTC_CALM RTC->CALM +#define REG_RTC_INTEN RTC->INTEN +#define REG_RTC_INTSTS RTC->INTSTS +#define REG_RTC_TICK RTC->TICK +#define REG_RTC_TAMSK RTC->TAMSK +#define REG_RTC_CAMSK RTC->CAMSK +#endif + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup RTC_Driver RTC Driver + @{ +*/ + +/** @addtogroup RTC_EXPORTED_CONSTANTS RTC Exported Constants + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* RTC Initial Keyword Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define RTC_INIT_KEY 0xA5EB1357UL /*!< RTC Initiation Key to make RTC leaving reset state \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* RTC Time Attribute Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define RTC_CLOCK_12 0UL /*!< RTC as 12-hour time scale with AM and PM indication \hideinitializer */ +#define RTC_CLOCK_24 1UL /*!< RTC as 24-hour time scale \hideinitializer */ +#define RTC_AM 1UL /*!< RTC as AM indication \hideinitializer */ +#define RTC_PM 2UL /*!< RTC as PM indication \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* RTC Tick Period Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define RTC_TICK_1_SEC 0x0UL /*!< RTC time tick period is 1 second \hideinitializer */ +#define RTC_TICK_1_2_SEC 0x1UL /*!< RTC time tick period is 1/2 second \hideinitializer */ +#define RTC_TICK_1_4_SEC 0x2UL /*!< RTC time tick period is 1/4 second \hideinitializer */ +#define RTC_TICK_1_8_SEC 0x3UL /*!< RTC time tick period is 1/8 second \hideinitializer */ +#define RTC_TICK_1_16_SEC 0x4UL /*!< RTC time tick period is 1/16 second \hideinitializer */ +#define RTC_TICK_1_32_SEC 0x5UL /*!< RTC time tick period is 1/32 second \hideinitializer */ +#define RTC_TICK_1_64_SEC 0x6UL /*!< RTC time tick period is 1/64 second \hideinitializer */ +#define RTC_TICK_1_128_SEC 0x7UL /*!< RTC time tick period is 1/128 second \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* RTC Day of Week Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define RTC_SUNDAY 0x0UL /*!< Day of the Week is Sunday \hideinitializer */ +#define RTC_MONDAY 0x1UL /*!< Day of the Week is Monday \hideinitializer */ +#define RTC_TUESDAY 0x2UL /*!< Day of the Week is Tuesday \hideinitializer */ +#define RTC_WEDNESDAY 0x3UL /*!< Day of the Week is Wednesday \hideinitializer */ +#define RTC_THURSDAY 0x4UL /*!< Day of the Week is Thursday \hideinitializer */ +#define RTC_FRIDAY 0x5UL /*!< Day of the Week is Friday \hideinitializer */ +#define RTC_SATURDAY 0x6UL /*!< Day of the Week is Saturday \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* RTC Miscellaneous Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define RTC_WAIT_COUNT 0xFFFFFFFFUL /*!< Initial Time-out Value \hideinitializer */ +#define RTC_YEAR2000 2000UL /*!< RTC Reference for compute year data \hideinitializer */ + +/*@}*/ /* end of group RTC_EXPORTED_CONSTANTS */ + + +/** @addtogroup RTC_EXPORTED_STRUCTS RTC Exported Structs + @{ +*/ +/** + * @details RTC define Time Data Struct + */ +typedef struct +{ + uint32_t u32Year; /*!< Year value */ + uint32_t u32Month; /*!< Month value */ + uint32_t u32Day; /*!< Day value */ + uint32_t u32DayOfWeek; /*!< Day of week value */ + uint32_t u32Hour; /*!< Hour value */ + uint32_t u32Minute; /*!< Minute value */ + uint32_t u32Second; /*!< Second value */ + uint32_t u32TimeScale; /*!< 12-Hour, 24-Hour */ + uint32_t u32AmPm; /*!< Only Time Scale select 12-hr used */ +} S_RTC_TIME_DATA_T; + +/*@}*/ /* end of group RTC_EXPORTED_STRUCTS */ + + +/** @addtogroup RTC_EXPORTED_FUNCTIONS RTC Exported Functions + @{ +*/ + +/** + * @brief Indicate is Leap Year or not + * + * @param None + * + * @retval 0 This year is not a leap year + * @retval 1 This year is a leap year + * + * @details According to current date, return this year is leap year or not. + * \hideinitializer + */ +#define RTC_IS_LEAP_YEAR() (RTC->LEAPYEAR & RTC_LEAPYEAR_LEAPYEAR_Msk ? 1:0) + +/** + * @brief Clear RTC Alarm Interrupt Flag + * + * @param None + * + * @return None + * + * @details This macro is used to clear RTC alarm interrupt flag. + * \hideinitializer + */ +#define RTC_CLEAR_ALARM_INT_FLAG() (REG_RTC_INTSTS = RTC_INTSTS_ALMIF_Msk) + +/** + * @brief Clear RTC Tick Interrupt Flag + * + * @param None + * + * @return None + * + * @details This macro is used to clear RTC tick interrupt flag. + * \hideinitializer + */ +#define RTC_CLEAR_TICK_INT_FLAG() (REG_RTC_INTSTS = RTC_INTSTS_TICKIF_Msk) + +/** + * @brief Get RTC Alarm Interrupt Flag + * + * @param None + * + * @retval 0 RTC alarm interrupt did not occur + * @retval 1 RTC alarm interrupt occurred + * + * @details This macro indicates RTC alarm interrupt occurred or not. + * \hideinitializer + */ +#define RTC_GET_ALARM_INT_FLAG() ((REG_RTC_INTSTS & RTC_INTSTS_ALMIF_Msk)? 1:0) + +/** + * @brief Get RTC Time Tick Interrupt Flag + * + * @param None + * + * @retval 0 RTC time tick interrupt did not occur + * @retval 1 RTC time tick interrupt occurred + * + * @details This macro indicates RTC time tick interrupt occurred or not. + * \hideinitializer + */ +#define RTC_GET_TICK_INT_FLAG() ((REG_RTC_INTSTS & RTC_INTSTS_TICKIF_Msk)? 1:0) + +/** + * @brief Read Spare Register + * + * @param[in] u32RegNum The spare register number, 0~19. + * + * @return Spare register content + * + * @details Read the specify spare register content. + * @note The returned value is valid only when SPRRDY(SPRCTL[7] SPR Register Ready) bit is set. \n + * And its controlled by RTC Access Enable Register. + * \hideinitializer + */ +#define RTC_READ_SPARE_REGISTER(u32RegNum) (RTC->SPR[(u32RegNum)]) + +int32_t RTC_Open(S_RTC_TIME_DATA_T *sPt); +void RTC_Close(void); + +void RTC_GetDateAndTime(S_RTC_TIME_DATA_T *sPt); +void RTC_GetAlarmDateAndTime(S_RTC_TIME_DATA_T *sPt); +void RTC_SetDateAndTime(S_RTC_TIME_DATA_T *sPt); +void RTC_SetAlarmDateAndTime(S_RTC_TIME_DATA_T *sPt); +void RTC_SetDate(uint32_t u32Year, uint32_t u32Month, uint32_t u32Day, uint32_t u32DayOfWeek); +void RTC_SetTime(uint32_t u32Hour, uint32_t u32Minute, uint32_t u32Second, uint32_t u32TimeMode, uint32_t u32AmPm); +void RTC_SetAlarmDate(uint32_t u32Year, uint32_t u32Month, uint32_t u32Day); +void RTC_SetAlarmTime(uint32_t u32Hour, uint32_t u32Minute, uint32_t u32Second, uint32_t u32TimeMode, uint32_t u32AmPm); +void RTC_SetAlarmDateMask(uint8_t u8IsTenYMsk, uint8_t u8IsYMsk, uint8_t u8IsTenMMsk, uint8_t u8IsMMsk, uint8_t u8IsTenDMsk, uint8_t u8IsDMsk); +void RTC_SetAlarmTimeMask(uint8_t u8IsTenHMsk, uint8_t u8IsHMsk, uint8_t u8IsTenMMsk, uint8_t u8IsMMsk, uint8_t u8IsTenSMsk, uint8_t u8IsSMsk); +uint32_t RTC_GetDayOfWeek(void); +void RTC_SetTickPeriod(uint32_t u32TickSelection); +void RTC_EnableInt(uint32_t u32IntFlagMask); +void RTC_DisableInt(uint32_t u32IntFlagMask); + +/*@}*/ /* end of group RTC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group RTC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_RTC_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sc.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sc.h new file mode 100644 index 0000000000..6ebb7bddc5 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sc.h @@ -0,0 +1,266 @@ +/**************************************************************************//** + * @file nu_sc.h + * @brief Smartcard (SC) driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_SC_H__ +#define __NU_SC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup SC_Driver SC Driver + @{ +*/ + +/** @addtogroup SC_EXPORTED_CONSTANTS SC Exported Constants + @{ +*/ +#define SC_INTERFACE_NUM 2 /*!< Smartcard interface numbers \hideinitializer */ +#define SC_PIN_STATE_HIGH 1 /*!< Smartcard pin status high \hideinitializer */ +#define SC_PIN_STATE_LOW 0 /*!< Smartcard pin status low \hideinitializer */ +#define SC_PIN_STATE_IGNORE 0xFFFFFFFF /*!< Ignore pin status \hideinitializer */ +#define SC_CLK_ON 1 /*!< Smartcard clock on \hideinitializer */ +#define SC_CLK_OFF 0 /*!< Smartcard clock off \hideinitializer */ + +#define SC_TMR_MODE_0 (0ul << SC_TMRCTL0_OPMODE_Pos) /*!INTEN |= (u32Mask)) + +/** + * @brief This macro disable smartcard interrupt + * @param[in] sc Base address of smartcard module + * @param[in] u32Mask Interrupt mask to be disabled. A combination of + * - \ref SC_INTEN_ACERRIEN_Msk + * - \ref SC_INTEN_RXTOIEN_Msk + * - \ref SC_INTEN_INITIEN_Msk + * - \ref SC_INTEN_CDIEN_Msk + * - \ref SC_INTEN_BGTIEN_Msk + * - \ref SC_INTEN_TMR2IEN_Msk + * - \ref SC_INTEN_TMR1IEN_Msk + * - \ref SC_INTEN_TMR0IEN_Msk + * - \ref SC_INTEN_TERRIEN_Msk + * - \ref SC_INTEN_TBEIEN_Msk + * - \ref SC_INTEN_RDAIEN_Msk + * @return None + * \hideinitializer + */ +#define SC_DISABLE_INT(sc, u32Mask) ((sc)->INTEN &= ~(u32Mask)) + +/** + * @brief This macro set VCC pin state of smartcard interface + * @param[in] sc Base address of smartcard module + * @param[in] u32State Pin state of VCC pin, valid parameters are \ref SC_PIN_STATE_HIGH and \ref SC_PIN_STATE_LOW + * @return None + * \hideinitializer + */ +#define SC_SET_VCC_PIN(sc, u32State) \ + do {\ + while((sc)->PINCTL & SC_PINCTL_SYNC_Msk);\ + if(u32State)\ + (sc)->PINCTL |= SC_PINCTL_PWREN_Msk;\ + else\ + (sc)->PINCTL &= ~SC_PINCTL_PWREN_Msk;\ + }while(0) + + +/** + * @brief This macro turns CLK output on or off + * @param[in] sc Base address of smartcard module + * @param[in] u32OnOff Clock on or off for selected smartcard module, valid values are \ref SC_CLK_ON and \ref SC_CLK_OFF + * @return None + * \hideinitializer + */ +#define SC_SET_CLK_PIN(sc, u32OnOff)\ + do {\ + while((sc)->PINCTL & SC_PINCTL_SYNC_Msk);\ + if(u32OnOff)\ + (sc)->PINCTL |= SC_PINCTL_CLKKEEP_Msk;\ + else\ + (sc)->PINCTL &= ~(SC_PINCTL_CLKKEEP_Msk);\ + }while(0) + +/** + * @brief This macro set I/O pin state of smartcard interface + * @param[in] sc Base address of smartcard module + * @param[in] u32State Pin state of I/O pin, valid parameters are \ref SC_PIN_STATE_HIGH and \ref SC_PIN_STATE_LOW + * @return None + * \hideinitializer + */ +#define SC_SET_IO_PIN(sc, u32State)\ + do {\ + while((sc)->PINCTL & SC_PINCTL_SYNC_Msk);\ + if(u32State)\ + (sc)->PINCTL |= SC_PINCTL_SCDATA_Msk;\ + else\ + (sc)->PINCTL &= ~SC_PINCTL_SCDATA_Msk;\ + }while(0) + +/** + * @brief This macro set RST pin state of smartcard interface + * @param[in] sc Base address of smartcard module + * @param[in] u32State Pin state of RST pin, valid parameters are \ref SC_PIN_STATE_HIGH and \ref SC_PIN_STATE_LOW + * @return None + * \hideinitializer + */ +#define SC_SET_RST_PIN(sc, u32State)\ + do {\ + while((sc)->PINCTL & SC_PINCTL_SYNC_Msk);\ + if(u32State)\ + (sc)->PINCTL |= SC_PINCTL_RSTEN_Msk;\ + else\ + (sc)->PINCTL &= ~SC_PINCTL_RSTEN_Msk;\ + }while(0) + +/** + * @brief This macro read one byte from smartcard module receive FIFO + * @param[in] sc Base address of smartcard module + * @return One byte read from receive FIFO + * \hideinitializer + */ +#define SC_READ(sc) ((char)((sc)->DAT)) + +/** + * @brief This macro write one byte to smartcard module transmit FIFO + * @param[in] sc Base address of smartcard module + * @param[in] u8Data Data to write to transmit FIFO + * @return None + * \hideinitializer + */ +#define SC_WRITE(sc, u8Data) ((sc)->DAT = (u8Data)) + +/** + * @brief This macro set smartcard stop bit length + * @param[in] sc Base address of smartcard module + * @param[in] u32Len Stop bit length, ether 1 or 2. + * @return None + * @details Stop bit length must be 1 for T = 1 protocol and 2 for T = 0 protocol. + * \hideinitializer + */ +#define SC_SET_STOP_BIT_LEN(sc, u32Len) ((sc)->CTL = ((sc)->CTL & ~SC_CTL_NSB_Msk) | ((u32Len) == 1 ? SC_CTL_NSB_Msk : 0)) + +/* Declare these inline functions here to avoid MISRA C 2004 rule 8.1 error */ +__STATIC_INLINE void SC_SetTxRetry(SC_T *sc, uint32_t u32Count); +__STATIC_INLINE void SC_SetRxRetry(SC_T *sc, uint32_t u32Count); + +/** + * @brief Enable/Disable Tx error retry, and set Tx error retry count + * @param[in] sc Base address of smartcard module + * @param[in] u32Count The number of times of Tx error retry count, between 0~8. 0 means disable Tx error retry + * @return None + */ +__STATIC_INLINE void SC_SetTxRetry(SC_T *sc, uint32_t u32Count) +{ + while ((sc)->CTL & SC_CTL_SYNC_Msk) + { + ; + } + /* Retry count must set while enable bit disabled, so disable it first */ + (sc)->CTL &= ~(SC_CTL_TXRTY_Msk | SC_CTL_TXRTYEN_Msk); + + if ((u32Count) != 0UL) + { + while ((sc)->CTL & SC_CTL_SYNC_Msk) + { + ; + } + (sc)->CTL |= (((u32Count) - 1UL) << SC_CTL_TXRTY_Pos) | SC_CTL_TXRTYEN_Msk; + } +} + +/** + * @brief Enable/Disable Rx error retry, and set Rx error retry count + * @param[in] sc Base address of smartcard module + * @param[in] u32Count The number of times of Rx error retry count, between 0~8. 0 means disable Rx error retry + * @return None + */ +__STATIC_INLINE void SC_SetRxRetry(SC_T *sc, uint32_t u32Count) +{ + while ((sc)->CTL & SC_CTL_SYNC_Msk) + { + ; + } + /* Retry count must set while enable bit disabled, so disable it first */ + (sc)->CTL &= ~(SC_CTL_RXRTY_Msk | SC_CTL_RXRTYEN_Msk); + + if ((u32Count) != 0UL) + { + while ((sc)->CTL & SC_CTL_SYNC_Msk) + { + ; + } + (sc)->CTL |= (((u32Count) - 1UL) << SC_CTL_RXRTY_Pos) | SC_CTL_RXRTYEN_Msk; + } + +} + + +uint32_t SC_IsCardInserted(SC_T *sc); +void SC_ClearFIFO(SC_T *sc); +void SC_Close(SC_T *sc); +void SC_Open(SC_T *sc, uint32_t u32CardDet, uint32_t u32PWR); +void SC_ResetReader(SC_T *sc); +void SC_SetBlockGuardTime(SC_T *sc, uint32_t u32BGT); +void SC_SetCharGuardTime(SC_T *sc, uint32_t u32CGT); +void SC_StopAllTimer(SC_T *sc); +void SC_StartTimer(SC_T *sc, uint32_t u32TimerNum, uint32_t u32Mode, uint32_t u32ETUCount); +void SC_StopTimer(SC_T *sc, uint32_t u32TimerNum); +uint32_t SC_GetInterfaceClock(SC_T *sc); + + +/*@}*/ /* end of group SC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group SC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_SC_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_scuart.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_scuart.h new file mode 100644 index 0000000000..1224df48ed --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_scuart.h @@ -0,0 +1,265 @@ +/**************************************************************************//** + * @file nu_scuart.h + * @brief Smartcard UART mode (SCUART) driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_SCUART_H__ +#define __NU_SCUART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup SCUART_Driver SCUART Driver + @{ +*/ + +/** @addtogroup SCUART_EXPORTED_CONSTANTS SCUART Exported Constants + @{ +*/ +#define SCUART_CHAR_LEN_5 (0x3ul << SC_UARTCTL_WLS_Pos) /*!< Set SCUART word length to 5 bits \hideinitializer */ +#define SCUART_CHAR_LEN_6 (0x2ul << SC_UARTCTL_WLS_Pos) /*!< Set SCUART word length to 6 bits \hideinitializer */ +#define SCUART_CHAR_LEN_7 (0x1ul << SC_UARTCTL_WLS_Pos) /*!< Set SCUART word length to 7 bits \hideinitializer */ +#define SCUART_CHAR_LEN_8 (0UL) /*!< Set SCUART word length to 8 bits \hideinitializer */ + +#define SCUART_PARITY_NONE (SC_UARTCTL_PBOFF_Msk) /*!< Set SCUART transfer with no parity \hideinitializer */ +#define SCUART_PARITY_ODD (SC_UARTCTL_OPE_Msk) /*!< Set SCUART transfer with odd parity \hideinitializer */ +#define SCUART_PARITY_EVEN (0UL) /*!< Set SCUART transfer with even parity \hideinitializer */ + +#define SCUART_STOP_BIT_1 (SC_CTL_NSB_Msk) /*!< Set SCUART transfer with one stop bit \hideinitializer */ +#define SCUART_STOP_BIT_2 (0UL) /*!< Set SCUART transfer with two stop bits \hideinitializer */ + + +/*@}*/ /* end of group SCUART_EXPORTED_CONSTANTS */ + + +/** @addtogroup SCUART_EXPORTED_FUNCTIONS SCUART Exported Functions + @{ +*/ + +/* TX Macros */ +/** + * @brief Write Data to Tx data register + * @param[in] sc The base address of smartcard module. + * @param[in] u8Data Data byte to transmit + * @return None + * \hideinitializer + */ +#define SCUART_WRITE(sc, u8Data) ((sc)->DAT = (u8Data)) + +/** + * @brief Get TX FIFO empty flag status from register + * @param[in] sc The base address of smartcard module + * @return Transmit FIFO empty status + * @retval 0 Transmit FIFO is not empty + * @retval SC_STATUS_TXEMPTY_Msk Transmit FIFO is empty + * \hideinitializer + */ +#define SCUART_GET_TX_EMPTY(sc) ((sc)->STATUS & SC_STATUS_TXEMPTY_Msk) + +/** + * @brief Get TX FIFO full flag status from register + * @param[in] sc The base address of smartcard module + * @return Transmit FIFO full status + * @retval 0 Transmit FIFO is not full + * @retval SC_STATUS_TXFULL_Msk Transmit FIFO is full + * \hideinitializer + */ +#define SCUART_GET_TX_FULL(sc) ((sc)->STATUS & SC_STATUS_TXFULL_Msk) + +/** + * @brief Wait specified smartcard port transmission complete + * @param[in] sc The base address of smartcard module + * @return None + * @note This Macro blocks until transmit complete. + * \hideinitializer + */ +#define SCUART_WAIT_TX_EMPTY(sc) while((sc)->STATUS & SC_STATUS_TXACT_Msk) + +/** + * @brief Check specified smartcard port transmit FIFO is full or not + * @param[in] sc The base address of smartcard module + * @return Transmit FIFO full status + * @retval 0 Transmit FIFO is not full + * @retval 1 Transmit FIFO is full + * \hideinitializer + */ +#define SCUART_IS_TX_FULL(sc) ((sc)->STATUS & SC_STATUS_TXFULL_Msk ? 1 : 0) + +/** + * @brief Check specified smartcard port transmission is over + * @param[in] sc The base address of smartcard module + * @return Transmit complete status + * @retval 0 Transmit is not complete + * @retval 1 Transmit complete + * \hideinitializer + */ +#define SCUART_IS_TX_EMPTY(sc) ((sc)->STATUS & SC_STATUS_TXACT_Msk ? 0 : 1) + +/** + * @brief Check specified Smartcard port Transmission Status + * @param[in] sc The pointer of smartcard module. + * @retval 0 Transmit is completed + * @retval 1 Transmit is active + * @details TXACT (SC_STATUS[31]) is set by hardware when Tx transfer is in active and the STOP bit of the last byte has been transmitted. + * \hideinitializer + */ +#define SCUART_IS_TX_ACTIVE(sc) (((sc)->STATUS & SC_STATUS_TXACT_Msk)? 1 : 0) + +/* RX Macros */ + +/** + * @brief Read Rx data register + * @param[in] sc The base address of smartcard module + * @return The oldest data byte in RX FIFO + * \hideinitializer + */ +#define SCUART_READ(sc) ((sc)->DAT) + +/** + * @brief Get RX FIFO empty flag status from register + * @param[in] sc The base address of smartcard module + * @return Receive FIFO empty status + * @retval 0 Receive FIFO is not empty + * @retval SC_STATUS_RXEMPTY_Msk Receive FIFO is empty + * \hideinitializer + */ +#define SCUART_GET_RX_EMPTY(sc) ((sc)->STATUS & SC_STATUS_RXEMPTY_Msk) + + +/** + * @brief Get RX FIFO full flag status from register + * @param[in] sc The base address of smartcard module + * @return Receive FIFO full status + * @retval 0 Receive FIFO is not full + * @retval SC_STATUS_RXFULLF_Msk Receive FIFO is full + * \hideinitializer + */ +#define SCUART_GET_RX_FULL(sc) ((sc)->STATUS & SC_STATUS_RXFULL_Msk) + +/** + * @brief Check if receive data number in FIFO reach FIFO trigger level or not + * @param[in] sc The base address of smartcard module + * @return Receive FIFO data status + * @retval 0 The number of bytes in receive FIFO is less than trigger level + * @retval 1 The number of bytes in receive FIFO equals or larger than trigger level + * @note If receive trigger level is \b not 1 byte, this macro return 0 does not necessary indicates there is \b no data in FIFO + * \hideinitializer + */ +#define SCUART_IS_RX_READY(sc) ((sc)->INTSTS & SC_INTSTS_RDAIF_Msk ? 1 : 0) + +/** + * @brief Check specified smartcard port receive FIFO is full or not + * @param[in] sc The base address of smartcard module + * @return Receive FIFO full status + * @retval 0 Receive FIFO is not full + * @retval 1 Receive FIFO is full + * \hideinitializer + */ +#define SCUART_IS_RX_FULL(sc) ((sc)->STATUS & SC_STATUS_RXFULL_Msk ? 1 : 0) + +/* Interrupt Macros */ + +/** + * @brief Enable specified interrupts + * @param[in] sc The base address of smartcard module + * @param[in] u32Mask Interrupt masks to enable, a combination of following bits + * - \ref SC_INTEN_RXTOIEN_Msk + * - \ref SC_INTEN_TERRIEN_Msk + * - \ref SC_INTEN_TBEIEN_Msk + * - \ref SC_INTEN_RDAIEN_Msk + * @return None + * \hideinitializer + */ +#define SCUART_ENABLE_INT(sc, u32Mask) ((sc)->INTEN |= (u32Mask)) + +/** + * @brief Disable specified interrupts + * @param[in] sc The base address of smartcard module + * @param[in] u32Mask Interrupt masks to disable, a combination of following bits + * - \ref SC_INTEN_RXTOIEN_Msk + * - \ref SC_INTEN_TERRIEN_Msk + * - \ref SC_INTEN_TBEIEN_Msk + * - \ref SC_INTEN_RDAIEN_Msk + * @return None + * \hideinitializer + */ +#define SCUART_DISABLE_INT(sc, u32Mask) ((sc)->INTEN &= ~(u32Mask)) + +/** + * @brief Get specified interrupt flag/status + * @param[in] sc The base address of smartcard module + * @param[in] u32Type Interrupt flag/status to check, could be one of following value + * - \ref SC_INTSTS_RXTOIF_Msk + * - \ref SC_INTSTS_TERRIF_Msk + * - \ref SC_INTSTS_TBEIF_Msk + * - \ref SC_INTSTS_RDAIF_Msk + * @return The status of specified interrupt + * @retval 0 Specified interrupt does not happened + * @retval 1 Specified interrupt happened + * \hideinitializer + */ +#define SCUART_GET_INT_FLAG(sc, u32Type) ((sc)->INTSTS & (u32Type) ? 1 : 0) + +/** + * @brief Clear specified interrupt flag/status + * @param[in] sc The base address of smartcard module + * @param[in] u32Type Interrupt flag/status to clear, could be the combination of following values + * - \ref SC_INTSTS_RXTOIF_Msk + * - \ref SC_INTSTS_TERRIF_Msk + * - \ref SC_INTSTS_TBEIF_Msk + * @return None + * \hideinitializer + */ +#define SCUART_CLR_INT_FLAG(sc, u32Type) ((sc)->INTSTS = (u32Type)) + +/** + * @brief Get receive error flag/status + * @param[in] sc The base address of smartcard module + * @return Current receive error status, could one of following errors: + * @retval SC_STATUS_PEF_Msk Parity error + * @retval SC_STATUS_FEF_Msk Frame error + * @retval SC_STATUS_BEF_Msk Break error + * \hideinitializer + */ +#define SCUART_GET_ERR_FLAG(sc) ((sc)->STATUS & (SC_STATUS_PEF_Msk | SC_STATUS_FEF_Msk | SC_STATUS_BEF_Msk)) + +/** + * @brief Clear specified receive error flag/status + * @param[in] sc The base address of smartcard module + * @param[in] u32Mask Receive error flag/status to clear, combination following values + * - \ref SC_STATUS_PEF_Msk + * - \ref SC_STATUS_FEF_Msk + * - \ref SC_STATUS_BEF_Msk + * @return None + * \hideinitializer + */ +#define SCUART_CLR_ERR_FLAG(sc, u32Mask) ((sc)->STATUS = (u32Mask)) + +void SCUART_Close(SC_T *sc); +uint32_t SCUART_Open(SC_T *sc, uint32_t u32baudrate); +uint32_t SCUART_Read(SC_T *sc, uint8_t pu8RxBuf[], uint32_t u32ReadBytes); +uint32_t SCUART_SetLineConfig(SC_T *sc, uint32_t u32Baudrate, uint32_t u32DataWidth, uint32_t u32Parity, uint32_t u32StopBits); +void SCUART_SetTimeoutCnt(SC_T *sc, uint32_t u32TOC); +void SCUART_Write(SC_T *sc, uint8_t pu8TxBuf[], uint32_t u32WriteBytes); + +/*@}*/ /* end of group SCUART_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group SCUART_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_SCUART_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sdh.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sdh.h new file mode 100644 index 0000000000..4473f6fba1 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sdh.h @@ -0,0 +1,121 @@ +/****************************************************************************//** + * @file nu_sdh.h + * @brief SDH driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_SDH_H__ +#define __NU_SDH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup SDH_Driver SDH Driver + @{ +*/ + +/** @addtogroup SDH_EXPORTED_CONSTANTS SDH Exported Constants + @{ +*/ + +#define SDH_POWER_ON 0x01 +#define SDH_POWER_180 0x0A +#define SDH_POWER_300 0x0C +#define SDH_POWER_330 0x0E + +#define SDH_RESET_ALL 0x01 +#define SDH_RESET_CMD 0x02 +#define SDH_RESET_DATA 0x04 + +#define SDH_CMD_RESP_MASK 0x03 +#define SDH_CMD_CRC 0x08 +#define SDH_CMD_INDEX 0x10 +#define SDH_CMD_DATA 0x20 +#define SDH_CMD_ABORTCMD 0xC0 + +#define SDH_CMD_RESP_NONE 0x00 +#define SDH_CMD_RESP_LONG 0x01 +#define SDH_CMD_RESP_SHORT 0x02 +#define SDH_CMD_RESP_SHORT_BUSY 0x03 + + +/* MMC command */ +#define MMC_CMD_STOP_TRANSMISSION 12 + +/* MMC response */ +#define MMC_RSP_PRESENT (1 << 0) +#define MMC_RSP_136 (1 << 1) /* 136 bit response */ +#define MMC_RSP_CRC (1 << 2) /* expect valid crc */ +#define MMC_RSP_BUSY (1 << 3) /* card may send busy */ +#define MMC_RSP_OPCODE (1 << 4) /* response contains opcode */ + +#define MMC_RSP_NONE (0) +#define MMC_RSP_R1 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) +#define MMC_RSP_R1b (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE|MMC_RSP_BUSY) +#define MMC_RSP_R2 (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC) +#define MMC_RSP_R3 (MMC_RSP_PRESENT) +#define MMC_RSP_R4 (MMC_RSP_PRESENT) +#define MMC_RSP_R5 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) +#define MMC_RSP_R6 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) +#define MMC_RSP_R7 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) + +#define MMC_DATA_READ 1 +#define MMC_DATA_WRITE 2 + +#define SDH_BLOCK_SIZE 512ul + +struct mmc_cmd +{ + unsigned short cmdidx; + unsigned int resp_type; + unsigned int cmdarg; + unsigned int response[4]; +}; + +struct mmc_data +{ + union + { + char *dest; + const char *src; /* src buffers don't get written to */ + }; + unsigned int flags; + unsigned int blocks; + unsigned int blocksize; +}; + +#define SDH_ISCARDINSERTED(SDH) (SDH->S_PSTATE.CARD_INSERTED && SDH->S_PSTATE.CARD_STABLE) + + +/*@}*/ /* end of group SDH_EXPORTED_CONSTANTS */ + +/** @addtogroup SDH_EXPORTED_FUNCTIONS SDH Exported Functions + @{ +*/ + +void SDH_DumpReg(SDH_T *sdh); +void SDH_Reset(SDH_T *sdh, uint8_t u8Mask); +int SDH_SetBusWidth(SDH_T *sdh, uint32_t u32BusWidth); +uint32_t SDH_SetClock(SDH_T *sdh, uint32_t u32SrcFreqInHz, uint32_t u32ExceptedFreqInHz); +int SD_GetBusStatus(SDH_T *sdh, uint32_t cmdidx); +void SDH_SetPower(SDH_T *sdh, uint32_t u32OnOff); + +/*@}*/ /* end of group SDH_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group SDH_Driver */ + +/*@}*/ /* end of group Standard_Driver */ +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_spi.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_spi.h new file mode 100644 index 0000000000..873f849c1d --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_spi.h @@ -0,0 +1,607 @@ +/**************************************************************************//** + * @file nu_spi.h + * @brief SPI driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_SPI_H__ +#define __NU_SPI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup SPI_Driver SPI Driver + @{ +*/ + +/** @addtogroup SPI_EXPORTED_CONSTANTS SPI Exported Constants + @{ +*/ + +#define SPI_MODE_0 (SPI_CTL_TXNEG_Msk) /*!< CLKPOL=0; RXNEG=0; TXNEG=1 \hideinitializer */ +#define SPI_MODE_1 (SPI_CTL_RXNEG_Msk) /*!< CLKPOL=0; RXNEG=1; TXNEG=0 \hideinitializer */ +#define SPI_MODE_2 (SPI_CTL_CLKPOL_Msk | SPI_CTL_RXNEG_Msk) /*!< CLKPOL=1; RXNEG=1; TXNEG=0 \hideinitializer */ +#define SPI_MODE_3 (SPI_CTL_CLKPOL_Msk | SPI_CTL_TXNEG_Msk) /*!< CLKPOL=1; RXNEG=0; TXNEG=1 \hideinitializer */ + +#define SPI_SLAVE (SPI_CTL_SLAVE_Msk) /*!< Set as slave \hideinitializer */ +#define SPI_MASTER (0x0U) /*!< Set as master \hideinitializer */ + +#define SPI_SS (SPI_SSCTL_SS_Msk) /*!< Set SS \hideinitializer */ +#define SPI_SS_ACTIVE_HIGH (SPI_SSCTL_SSACTPOL_Msk) /*!< SS active high \hideinitializer */ +#define SPI_SS_ACTIVE_LOW (0x0U) /*!< SS active low \hideinitializer */ + +/* SPI Interrupt Mask */ +#define SPI_UNIT_INT_MASK (0x001U) /*!< Unit transfer interrupt mask \hideinitializer */ +#define SPI_SSACT_INT_MASK (0x002U) /*!< Slave selection signal active interrupt mask \hideinitializer */ +#define SPI_SSINACT_INT_MASK (0x004U) /*!< Slave selection signal inactive interrupt mask \hideinitializer */ +#define SPI_SLVUR_INT_MASK (0x008U) /*!< Slave under run interrupt mask \hideinitializer */ +#define SPI_SLVBE_INT_MASK (0x010U) /*!< Slave bit count error interrupt mask \hideinitializer */ +#define SPI_TXUF_INT_MASK (0x040U) /*!< Slave TX underflow interrupt mask \hideinitializer */ +#define SPI_FIFO_TXTH_INT_MASK (0x080U) /*!< FIFO TX threshold interrupt mask \hideinitializer */ +#define SPI_FIFO_RXTH_INT_MASK (0x100U) /*!< FIFO RX threshold interrupt mask \hideinitializer */ +#define SPI_FIFO_RXOV_INT_MASK (0x200U) /*!< FIFO RX overrun interrupt mask \hideinitializer */ +#define SPI_FIFO_RXTO_INT_MASK (0x400U) /*!< FIFO RX time-out interrupt mask \hideinitializer */ + +/* SPI Status Mask */ +#define SPI_BUSY_MASK (0x01U) /*!< Busy status mask \hideinitializer */ +#define SPI_RX_EMPTY_MASK (0x02U) /*!< RX empty status mask \hideinitializer */ +#define SPI_RX_FULL_MASK (0x04U) /*!< RX full status mask \hideinitializer */ +#define SPI_TX_EMPTY_MASK (0x08U) /*!< TX empty status mask \hideinitializer */ +#define SPI_TX_FULL_MASK (0x10U) /*!< TX full status mask \hideinitializer */ +#define SPI_TXRX_RESET_MASK (0x20U) /*!< TX or RX reset status mask \hideinitializer */ +#define SPI_SPIEN_STS_MASK (0x40U) /*!< SPIEN status mask \hideinitializer */ +#define SPI_SSLINE_STS_MASK (0x80U) /*!< SPIx_SS line status mask \hideinitializer */ + + +/* I2S Data Width */ +#define SPII2S_DATABIT_8 (0U << SPI_I2SCTL_WDWIDTH_Pos) /*!< I2S data width is 8-bit \hideinitializer */ +#define SPII2S_DATABIT_16 (1U << SPI_I2SCTL_WDWIDTH_Pos) /*!< I2S data width is 16-bit \hideinitializer */ +#define SPII2S_DATABIT_24 (2U << SPI_I2SCTL_WDWIDTH_Pos) /*!< I2S data width is 24-bit \hideinitializer */ +#define SPII2S_DATABIT_32 (3U << SPI_I2SCTL_WDWIDTH_Pos) /*!< I2S data width is 32-bit \hideinitializer */ + +/* I2S Audio Format */ +#define SPII2S_MONO SPI_I2SCTL_MONO_Msk /*!< Monaural channel \hideinitializer */ +#define SPII2S_STEREO (0U) /*!< Stereo channel \hideinitializer */ + +/* I2S Data Format */ +#define SPII2S_FORMAT_I2S (0U<STATUS = SPI_STATUS_UNITIF_Msk) + +/** + * @brief Trigger RX PDMA function. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Set RXPDMAEN bit of SPI_PDMACTL register to enable RX PDMA transfer function. + * \hideinitializer + */ +#define SPI_TRIGGER_RX_PDMA(spi) ((spi)->PDMACTL |= SPI_PDMACTL_RXPDMAEN_Msk) + +/** + * @brief Trigger TX PDMA function. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Set TXPDMAEN bit of SPI_PDMACTL register to enable TX PDMA transfer function. + * \hideinitializer + */ +#define SPI_TRIGGER_TX_PDMA(spi) ((spi)->PDMACTL |= SPI_PDMACTL_TXPDMAEN_Msk) + +/** + * @brief Trigger TX and RX PDMA function. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Set TXPDMAEN bit and RXPDMAEN bit of SPI_PDMACTL register to enable TX and RX PDMA transfer function. + * \hideinitializer + */ +#define SPI_TRIGGER_TX_RX_PDMA(spi) ((spi)->PDMACTL |= (SPI_PDMACTL_TXPDMAEN_Msk | SPI_PDMACTL_RXPDMAEN_Msk)) + +/** + * @brief Disable RX PDMA transfer. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Clear RXPDMAEN bit of SPI_PDMACTL register to disable RX PDMA transfer function. + * \hideinitializer + */ +#define SPI_DISABLE_RX_PDMA(spi) ( (spi)->PDMACTL &= ~SPI_PDMACTL_RXPDMAEN_Msk ) + +/** + * @brief Disable TX PDMA transfer. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Clear TXPDMAEN bit of SPI_PDMACTL register to disable TX PDMA transfer function. + * \hideinitializer + */ +#define SPI_DISABLE_TX_PDMA(spi) ( (spi)->PDMACTL &= ~SPI_PDMACTL_TXPDMAEN_Msk ) + +/** + * @brief Disable TX and RX PDMA transfer. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Clear TXPDMAEN bit and RXPDMAEN bit of SPI_PDMACTL register to disable TX and RX PDMA transfer function. + * \hideinitializer + */ +#define SPI_DISABLE_TX_RX_PDMA(spi) ( (spi)->PDMACTL &= ~(SPI_PDMACTL_TXPDMAEN_Msk | SPI_PDMACTL_RXPDMAEN_Msk) ) + +/** + * @brief Get the count of available data in RX FIFO. + * @param[in] spi The pointer of the specified SPI module. + * @return The count of available data in RX FIFO. + * @details Read RXCNT (SPI_STATUS[27:24]) to get the count of available data in RX FIFO. + * \hideinitializer + */ +#define SPI_GET_RX_FIFO_COUNT(spi) (((spi)->STATUS & SPI_STATUS_RXCNT_Msk) >> SPI_STATUS_RXCNT_Pos) + +/** + * @brief Get the RX FIFO empty flag. + * @param[in] spi The pointer of the specified SPI module. + * @retval 0 RX FIFO is not empty. + * @retval 1 RX FIFO is empty. + * @details Read RXEMPTY bit of SPI_STATUS register to get the RX FIFO empty flag. + * \hideinitializer + */ +#define SPI_GET_RX_FIFO_EMPTY_FLAG(spi) (((spi)->STATUS & SPI_STATUS_RXEMPTY_Msk)>>SPI_STATUS_RXEMPTY_Pos) + +/** + * @brief Get the TX FIFO empty flag. + * @param[in] spi The pointer of the specified SPI module. + * @retval 0 TX FIFO is not empty. + * @retval 1 TX FIFO is empty. + * @details Read TXEMPTY bit of SPI_STATUS register to get the TX FIFO empty flag. + * \hideinitializer + */ +#define SPI_GET_TX_FIFO_EMPTY_FLAG(spi) (((spi)->STATUS & SPI_STATUS_TXEMPTY_Msk)>>SPI_STATUS_TXEMPTY_Pos) + +/** + * @brief Get the TX FIFO full flag. + * @param[in] spi The pointer of the specified SPI module. + * @retval 0 TX FIFO is not full. + * @retval 1 TX FIFO is full. + * @details Read TXFULL bit of SPI_STATUS register to get the TX FIFO full flag. + * \hideinitializer + */ +#define SPI_GET_TX_FIFO_FULL_FLAG(spi) (((spi)->STATUS & SPI_STATUS_TXFULL_Msk)>>SPI_STATUS_TXFULL_Pos) + +/** + * @brief Get the datum read from RX register. + * @param[in] spi The pointer of the specified SPI module. + * @return Data in RX register. + * @details Read SPI_RX register to get the received datum. + * \hideinitializer + */ +#define SPI_READ_RX(spi) ((spi)->RX) + +/** + * @brief Write datum to TX register. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32TxData The datum which user attempt to transfer through SPI bus. + * @return None. + * @details Write u32TxData to SPI_TX register. + * \hideinitializer + */ +#define SPI_WRITE_TX(spi, u32TxData) ((spi)->TX = (u32TxData)) + +/** + * @brief Set SPIx_SS pin to high state. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Disable automatic slave selection function and set SPIx_SS pin to high state. + * \hideinitializer + */ +#define SPI_SET_SS_HIGH(spi) ((spi)->SSCTL = ((spi)->SSCTL & (~SPI_SSCTL_AUTOSS_Msk)) | (SPI_SSCTL_SSACTPOL_Msk | SPI_SSCTL_SS_Msk)) + +/** + * @brief Set SPIx_SS pin to low state. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Disable automatic slave selection function and set SPIx_SS pin to low state. + * \hideinitializer + */ +#define SPI_SET_SS_LOW(spi) ((spi)->SSCTL = ((spi)->SSCTL & (~(SPI_SSCTL_AUTOSS_Msk | SPI_SSCTL_SSACTPOL_Msk))) | SPI_SSCTL_SS_Msk) + +/** + * @brief Enable Byte Reorder function. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Enable Byte Reorder function. The suspend interval depends on the setting of SUSPITV (SPI_CTL[7:4]). + * \hideinitializer + */ +#define SPI_ENABLE_BYTE_REORDER(spi) ((spi)->CTL |= SPI_CTL_REORDER_Msk) + +/** + * @brief Disable Byte Reorder function. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Clear REORDER bit field of SPI_CTL register to disable Byte Reorder function. + * \hideinitializer + */ +#define SPI_DISABLE_BYTE_REORDER(spi) ((spi)->CTL &= ~SPI_CTL_REORDER_Msk) + +/** + * @brief Set the length of suspend interval. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32SuspCycle Decides the length of suspend interval. It could be 0 ~ 15. + * @return None. + * @details Set the length of suspend interval according to u32SuspCycle. + * The length of suspend interval is ((u32SuspCycle + 0.5) * the length of one SPI bus clock cycle). + * \hideinitializer + */ +#define SPI_SET_SUSPEND_CYCLE(spi, u32SuspCycle) ((spi)->CTL = ((spi)->CTL & ~SPI_CTL_SUSPITV_Msk) | ((u32SuspCycle) << SPI_CTL_SUSPITV_Pos)) + +/** + * @brief Set the SPI transfer sequence with LSB first. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Set LSB bit of SPI_CTL register to set the SPI transfer sequence with LSB first. + * \hideinitializer + */ +#define SPI_SET_LSB_FIRST(spi) ((spi)->CTL |= SPI_CTL_LSB_Msk) + +/** + * @brief Set the SPI transfer sequence with MSB first. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Clear LSB bit of SPI_CTL register to set the SPI transfer sequence with MSB first. + * \hideinitializer + */ +#define SPI_SET_MSB_FIRST(spi) ((spi)->CTL &= ~SPI_CTL_LSB_Msk) + +/** + * @brief Set the data width of a SPI transaction. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32Width The bit width of one transaction. + * @return None. + * @details The data width can be 8 ~ 32 bits. + * \hideinitializer + */ +#define SPI_SET_DATA_WIDTH(spi, u32Width) ((spi)->CTL = ((spi)->CTL & ~SPI_CTL_DWIDTH_Msk) | (((u32Width)&0x1F) << SPI_CTL_DWIDTH_Pos)) + +/** + * @brief Get the SPI busy state. + * @param[in] spi The pointer of the specified SPI module. + * @retval 0 SPI controller is not busy. + * @retval 1 SPI controller is busy. + * @details This macro will return the busy state of SPI controller. + * \hideinitializer + */ +#define SPI_IS_BUSY(spi) ( ((spi)->STATUS & SPI_STATUS_BUSY_Msk)>>SPI_STATUS_BUSY_Pos ) + +/** + * @brief Enable SPI controller. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Set SPIEN (SPI_CTL[0]) to enable SPI controller. + * \hideinitializer + */ +#define SPI_ENABLE(spi) ((spi)->CTL |= SPI_CTL_SPIEN_Msk) + +/** + * @brief Disable SPI controller. + * @param[in] spi The pointer of the specified SPI module. + * @return None. + * @details Clear SPIEN (SPI_CTL[0]) to disable SPI controller. + * \hideinitializer + */ +#define SPI_DISABLE(spi) ((spi)->CTL &= ~SPI_CTL_SPIEN_Msk) + +/* Declare these inline functions here to avoid MISRA C 2004 rule 8.1 error */ +__STATIC_INLINE void SPII2S_ENABLE_TX_ZCD(SPI_T *i2s, uint32_t u32ChMask); +__STATIC_INLINE void SPII2S_DISABLE_TX_ZCD(SPI_T *i2s, uint32_t u32ChMask); +__STATIC_INLINE void SPII2S_SET_MONO_RX_CHANNEL(SPI_T *i2s, uint32_t u32Ch); + +/** + * @brief Enable zero cross detection function. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32ChMask The mask for left or right channel. Valid values are: + * - \ref SPII2S_RIGHT + * - \ref SPII2S_LEFT + * @return None + * @details This function will set RZCEN or LZCEN bit of SPI_I2SCTL register to enable zero cross detection function. + */ +__STATIC_INLINE void SPII2S_ENABLE_TX_ZCD(SPI_T *i2s, uint32_t u32ChMask) +{ + if (u32ChMask == SPII2S_RIGHT) + { + i2s->I2SCTL |= SPI_I2SCTL_RZCEN_Msk; + } + else + { + i2s->I2SCTL |= SPI_I2SCTL_LZCEN_Msk; + } +} + +/** + * @brief Disable zero cross detection function. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32ChMask The mask for left or right channel. Valid values are: + * - \ref SPII2S_RIGHT + * - \ref SPII2S_LEFT + * @return None + * @details This function will clear RZCEN or LZCEN bit of SPI_I2SCTL register to disable zero cross detection function. + */ +__STATIC_INLINE void SPII2S_DISABLE_TX_ZCD(SPI_T *i2s, uint32_t u32ChMask) +{ + if (u32ChMask == SPII2S_RIGHT) + { + i2s->I2SCTL &= ~SPI_I2SCTL_RZCEN_Msk; + } + else + { + i2s->I2SCTL &= ~SPI_I2SCTL_LZCEN_Msk; + } +} + +/** + * @brief Enable I2S TX DMA function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will set TXPDMAEN bit of SPI_PDMACTL register to transmit data with PDMA. + * \hideinitializer + */ +#define SPII2S_ENABLE_TXDMA(i2s) ( (i2s)->PDMACTL |= SPI_PDMACTL_TXPDMAEN_Msk ) + +/** + * @brief Disable I2S TX DMA function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear TXPDMAEN bit of SPI_PDMACTL register to disable TX DMA function. + * \hideinitializer + */ +#define SPII2S_DISABLE_TXDMA(i2s) ( (i2s)->PDMACTL &= ~SPI_PDMACTL_TXPDMAEN_Msk ) + +/** + * @brief Enable I2S RX DMA function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will set RXPDMAEN bit of SPI_PDMACTL register to receive data with PDMA. + * \hideinitializer + */ +#define SPII2S_ENABLE_RXDMA(i2s) ( (i2s)->PDMACTL |= SPI_PDMACTL_RXPDMAEN_Msk ) + +/** + * @brief Disable I2S RX DMA function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear RXPDMAEN bit of SPI_PDMACTL register to disable RX DMA function. + * \hideinitializer + */ +#define SPII2S_DISABLE_RXDMA(i2s) ( (i2s)->PDMACTL &= ~SPI_PDMACTL_RXPDMAEN_Msk ) + +/** + * @brief Enable I2S TX function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will set TXEN bit of SPI_I2SCTL register to enable I2S TX function. + * \hideinitializer + */ +#define SPII2S_ENABLE_TX(i2s) ( (i2s)->I2SCTL |= SPI_I2SCTL_TXEN_Msk ) + +/** + * @brief Disable I2S TX function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear TXEN bit of SPI_I2SCTL register to disable I2S TX function. + * \hideinitializer + */ +#define SPII2S_DISABLE_TX(i2s) ( (i2s)->I2SCTL &= ~SPI_I2SCTL_TXEN_Msk ) + +/** + * @brief Enable I2S RX function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will set RXEN bit of SPI_I2SCTL register to enable I2S RX function. + * \hideinitializer + */ +#define SPII2S_ENABLE_RX(i2s) ( (i2s)->I2SCTL |= SPI_I2SCTL_RXEN_Msk ) + +/** + * @brief Disable I2S RX function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear RXEN bit of SPI_I2SCTL register to disable I2S RX function. + * \hideinitializer + */ +#define SPII2S_DISABLE_RX(i2s) ( (i2s)->I2SCTL &= ~SPI_I2SCTL_RXEN_Msk ) + +/** + * @brief Enable TX Mute function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will set MUTE bit of SPI_I2SCTL register to enable I2S TX mute function. + * \hideinitializer + */ +#define SPII2S_ENABLE_TX_MUTE(i2s) ( (i2s)->I2SCTL |= SPI_I2SCTL_MUTE_Msk ) + +/** + * @brief Disable TX Mute function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear MUTE bit of SPI_I2SCTL register to disable I2S TX mute function. + * \hideinitializer + */ +#define SPII2S_DISABLE_TX_MUTE(i2s) ( (i2s)->I2SCTL &= ~SPI_I2SCTL_MUTE_Msk ) + +/** + * @brief Clear TX FIFO. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear TX FIFO. The internal TX FIFO pointer will be reset to FIFO start point. + * \hideinitializer + */ +#define SPII2S_CLR_TX_FIFO(i2s) ( (i2s)->FIFOCTL |= SPI_FIFOCTL_TXFBCLR_Msk ) + +/** + * @brief Clear RX FIFO. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details This macro will clear RX FIFO. The internal RX FIFO pointer will be reset to FIFO start point. + * \hideinitializer + */ +#define SPII2S_CLR_RX_FIFO(i2s) ( (i2s)->FIFOCTL |= SPI_FIFOCTL_RXFBCLR_Msk ) + +/** + * @brief This function sets the recording source channel when mono mode is used. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32Ch left or right channel. Valid values are: + * - \ref SPII2S_MONO_LEFT + * - \ref SPII2S_MONO_RIGHT + * @return None + * @details This function selects the recording source channel of monaural mode. + * \hideinitializer + */ +__STATIC_INLINE void SPII2S_SET_MONO_RX_CHANNEL(SPI_T *i2s, uint32_t u32Ch) +{ + u32Ch == SPII2S_MONO_LEFT ? + (i2s->I2SCTL |= SPI_I2SCTL_RXLCH_Msk) : + (i2s->I2SCTL &= ~SPI_I2SCTL_RXLCH_Msk); +} + +/** + * @brief Write data to I2S TX FIFO. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32Data The value written to TX FIFO. + * @return None + * @details This macro will write a value to TX FIFO. + * \hideinitializer + */ +#define SPII2S_WRITE_TX_FIFO(i2s, u32Data) ( (i2s)->TX = (u32Data) ) + +/** + * @brief Read RX FIFO. + * @param[in] i2s The pointer of the specified I2S module. + * @return The value read from RX FIFO. + * @details This function will return a value read from RX FIFO. + * \hideinitializer + */ +#define SPII2S_READ_RX_FIFO(i2s) ( (i2s)->RX ) + +/** + * @brief Get the interrupt flag. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32Mask The mask value for all interrupt flags. + * @return The interrupt flags specified by the u32mask parameter. + * @details This macro will return the combination interrupt flags of SPI_I2SSTS register. The flags are specified by the u32mask parameter. + * \hideinitializer + */ +#define SPII2S_GET_INT_FLAG(i2s, u32Mask) ( (i2s)->I2SSTS & (u32Mask) ) + +/** + * @brief Clear the interrupt flag. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32Mask The mask value for all interrupt flags. + * @return None + * @details This macro will clear the interrupt flags specified by the u32mask parameter. + * @note Except TX and RX FIFO threshold interrupt flags, the other interrupt flags can be cleared by writing 1 to itself. + * \hideinitializer + */ +#define SPII2S_CLR_INT_FLAG(i2s, u32Mask) ( (i2s)->I2SSTS = (u32Mask) ) + +/** + * @brief Get transmit FIFO level + * @param[in] i2s The pointer of the specified I2S module. + * @return TX FIFO level + * @details This macro will return the number of available words in TX FIFO. + * \hideinitializer + */ +#define SPII2S_GET_TX_FIFO_LEVEL(i2s) ( ((i2s)->I2SSTS & SPI_I2SSTS_TXCNT_Msk) >> SPI_I2SSTS_TXCNT_Pos ) + +/** + * @brief Get receive FIFO level + * @param[in] i2s The pointer of the specified I2S module. + * @return RX FIFO level + * @details This macro will return the number of available words in RX FIFO. + * \hideinitializer + */ +#define SPII2S_GET_RX_FIFO_LEVEL(i2s) ( ((i2s)->I2SSTS & SPI_I2SSTS_RXCNT_Msk) >> SPI_I2SSTS_RXCNT_Pos ) + +/** + * @brief Set SPI Master Receive Phase. + * @param[in] spi is the base address of SPI module. + * @param[in] rxdly is the clock cycle of delay for rx phase. + * @return none + * \hideinitializer + */ +#define SPI_SET_MRXPHASE(spi, rxdly) ( (spi)->INTERNAL = ((spi)->INTERNAL & ~SPI_INTERNAL_MRXPHASE_Msk) | (rxdly<GPA_MFPL = (SYS->GPA_MFPL & (~SYS_GPA_MFPL_PA0MFP_Msk) ) | SYS_GPA_MFPL_PA0_MFP_SC0_CLK ; + +*/ +/********************* Bit definition of GPA_MFPL register **********************/ +#define SYS_GPA_MFPL_PA0MFP_GPIO (0x00UL<RLKSUBM = 0x59UL; + SYS->RLKSUBM = 0x16UL; + SYS->RLKSUBM = 0x88UL; + } + while (SYS->RLKSUBM == 0UL); +#else + do + { + SYS->RLKTZS = 0x59UL; + SYS->RLKTZS = 0x16UL; + SYS->RLKTZS = 0x88UL; + } + while (SYS->RLKTZS == 0UL); +#endif +} + +/** + * @brief Enable register write-protection function + * @param None + * @return None + * @details This function is used to enable register write-protection function. + * To lock the protected register to forbid write access. + */ +__STATIC_INLINE void SYS_LockReg(void) +{ +#if defined(USE_MA35D1_SUBM) + SYS->RLKSUBM = 0UL; +#else + SYS->RLKTZS = 0UL; +#endif +} + +/** + * @brief Query write-protection is locked or not + * @param None + * @return true or false + * @details + */ +__STATIC_INLINE uint32_t SYS_IsRegLocked(void) +{ +#if defined(USE_MA35D1_SUBM) + return (SYS->RLKSUBM == 0) ? 1 : 0; +#else + return (SYS->RLKTZS == 0) ? 1 : 0; +#endif +} + +void SYS_ResetModule(uint32_t u32ModuleIndex); + +/*@}*/ /* end of group SYS_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group SYS_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_SYS_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_timer.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_timer.h new file mode 100644 index 0000000000..4c3f21c1e4 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_timer.h @@ -0,0 +1,522 @@ +/**************************************************************************//** + * @file nu_timer.h + * @brief Timer Controller(Timer) driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_TIMER_H__ +#define __NU_TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup TIMER_Driver TIMER Driver + @{ +*/ + +/** @addtogroup TIMER_EXPORTED_CONSTANTS TIMER Exported Constants + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* TIMER Operation Mode, External Counter and Capture Mode Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define TIMER_ONESHOT_MODE (0UL << TIMER_CTL_OPMODE_Pos) /*!< Timer working in one-shot mode \hideinitializer */ +#define TIMER_PERIODIC_MODE (1UL << TIMER_CTL_OPMODE_Pos) /*!< Timer working in periodic mode \hideinitializer */ +#define TIMER_TOGGLE_MODE (2UL << TIMER_CTL_OPMODE_Pos) /*!< Timer working in toggle-output mode \hideinitializer */ +#define TIMER_CONTINUOUS_MODE (3UL << TIMER_CTL_OPMODE_Pos) /*!< Timer working in continuous counting mode \hideinitializer */ +#define TIMER_TOUT_PIN_FROM_TMX (0UL << TIMER_CTL_TGLPINSEL_Pos) /*!< Timer toggle-output pin is from TMx pin \hideinitializer */ +#define TIMER_TOUT_PIN_FROM_TMX_EXT (1UL << TIMER_CTL_TGLPINSEL_Pos) /*!< Timer toggle-output pin is from TMx_EXT pin \hideinitializer */ + +#define TIMER_COUNTER_EVENT_FALLING (0UL << TIMER_EXTCTL_CNTPHASE_Pos) /*!< Counter increase on falling edge detection \hideinitializer */ +#define TIMER_COUNTER_EVENT_RISING (1UL << TIMER_EXTCTL_CNTPHASE_Pos) /*!< Counter increase on rising edge detection \hideinitializer */ +#define TIMER_CAPTURE_FREE_COUNTING_MODE (0UL << TIMER_EXTCTL_CAPFUNCS_Pos) /*!< Timer capture event to get timer counter value \hideinitializer */ +#define TIMER_CAPTURE_COUNTER_RESET_MODE (1UL << TIMER_EXTCTL_CAPFUNCS_Pos) /*!< Timer capture event to reset timer counter \hideinitializer */ + +#define TIMER_CAPTURE_EVENT_FALLING (0UL << TIMER_EXTCTL_CAPEDGE_Pos) /*!< Falling edge detection to trigger capture event \hideinitializer */ +#define TIMER_CAPTURE_EVENT_RISING (1UL << TIMER_EXTCTL_CAPEDGE_Pos) /*!< Rising edge detection to trigger capture event \hideinitializer */ +#define TIMER_CAPTURE_EVENT_FALLING_RISING (2UL << TIMER_EXTCTL_CAPEDGE_Pos) /*!< Both falling and rising edge detection to trigger capture event, and first event at falling edge \hideinitializer */ +#define TIMER_CAPTURE_EVENT_RISING_FALLING (3UL << TIMER_EXTCTL_CAPEDGE_Pos) /*!< Both rising and falling edge detection to trigger capture event, and first event at rising edge \hideinitializer */ +#define TIMER_CAPTURE_EVENT_GET_LOW_PERIOD (6UL << TIMER_EXTCTL_CAPEDGE_Pos) /*!< First capture event is at falling edge, follows are at at rising edge \hideinitializer */ +#define TIMER_CAPTURE_EVENT_GET_HIGH_PERIOD (7UL << TIMER_EXTCTL_CAPEDGE_Pos) /*!< First capture event is at rising edge, follows are at at falling edge \hideinitializer */ + +#define TIMER_TRGSRC_TIMEOUT_EVENT (0UL << TIMER_TRGCTL_TRGSSEL_Pos) /*!< Select internal trigger source from timer time-out event \hideinitializer */ +#define TIMER_TRGSRC_CAPTURE_EVENT (1UL << TIMER_TRGCTL_TRGSSEL_Pos) /*!< Select internal trigger source from timer capture event \hideinitializer */ +#define TIMER_TRG_TO_EPWM (TIMER_TRGCTL_TRGEPWM_Msk) /*!< Each timer event as EPWM counter clock source \hideinitializer */ +#define TIMER_TRG_TO_EADC (TIMER_TRGCTL_TRGEADC_Msk) /*!< Each timer event to start ADC conversion \hideinitializer */ +#define TIMER_TRG_TO_DAC (TIMER_TRGCTL_TRGDAC_Msk) /*!< Each timer event to start DAC conversion \hideinitializer */ +#define TIMER_TRG_TO_PDMA (TIMER_TRGCTL_TRGPDMA_Msk) /*!< Each timer event to trigger PDMA transfer \hideinitializer */ + +/*@}*/ /* end of group TIMER_EXPORTED_CONSTANTS */ + + +/** @addtogroup TIMER_EXPORTED_FUNCTIONS TIMER Exported Functions + @{ +*/ + +/** + * @brief Set Timer Compared Value + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * @param[in] u32Value Timer compare value. Valid values are between 2 to 0xFFFFFF. + * + * @return None + * + * @details This macro is used to set timer compared value to adjust timer time-out interval. + * @note 1. Never write 0x0 or 0x1 in this field, or the core will run into unknown state. \n + * 2. If update timer compared value in continuous counting mode, timer counter value will keep counting continuously. \n + * But if timer is operating at other modes, the timer up counter will restart counting and start from 0. + * \hideinitializer + */ +#define TIMER_SET_CMP_VALUE(timer, u32Value) ((timer)->CMP = (u32Value)) + +/** + * @brief Set Timer Prescale Value + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * @param[in] u32Value Timer prescale value. Valid values are between 0 to 0xFF. + * + * @return None + * + * @details This macro is used to set timer prescale value and timer source clock will be divided by (prescale + 1) \n + * before it is fed into timer. + * \hideinitializer + */ +#define TIMER_SET_PRESCALE_VALUE(timer, u32Value) ((timer)->CTL = ((timer)->CTL & ~TIMER_CTL_PSC_Msk) | (u32Value)) + +/** + * @brief Check specify Timer Status + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Timer 24-bit up counter is inactive + * @retval 1 Timer 24-bit up counter is active + * + * @details This macro is used to check if specify Timer counter is inactive or active. + * \hideinitializer + */ +#define TIMER_IS_ACTIVE(timer) (((timer)->CTL & TIMER_CTL_ACTSTS_Msk)? 1 : 0) + +/** + * @brief Select Toggle-output Pin + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * @param[in] u32ToutSel Toggle-output pin selection, valid values are: + * - \ref TIMER_TOUT_PIN_FROM_TMX + * - \ref TIMER_TOUT_PIN_FROM_TMX_EXT + * + * @return None + * + * @details This macro is used to select timer toggle-output pin is output on TMx or TMx_EXT pin. + * \hideinitializer + */ +#define TIMER_SELECT_TOUT_PIN(timer, u32ToutSel) ((timer)->CTL = ((timer)->CTL & ~TIMER_CTL_TGLPINSEL_Msk) | (u32ToutSel)) + +/** + * @brief Select Timer operating mode + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * @param[in] u32OpMode Operation mode. Possible options are + * - \ref TIMER_ONESHOT_MODE + * - \ref TIMER_PERIODIC_MODE + * - \ref TIMER_TOGGLE_MODE + * - \ref TIMER_CONTINUOUS_MODE + * + * @return None + * \hideinitializer + */ +#define TIMER_SET_OPMODE(timer, u32OpMode) ((timer)->CTL = ((timer)->CTL & ~TIMER_CTL_OPMODE_Msk) | (u32OpMode)) + +/* Declare these inline functions here to avoid MISRA C 2004 rule 8.1 error */ +__STATIC_INLINE void TIMER_Start(TIMER_T *timer); +__STATIC_INLINE void TIMER_Stop(TIMER_T *timer); +__STATIC_INLINE void TIMER_EnableWakeup(TIMER_T *timer); +__STATIC_INLINE void TIMER_DisableWakeup(TIMER_T *timer); +__STATIC_INLINE void TIMER_StartCapture(TIMER_T *timer); +__STATIC_INLINE void TIMER_StopCapture(TIMER_T *timer); +__STATIC_INLINE void TIMER_EnableCaptureDebounce(TIMER_T *timer); +__STATIC_INLINE void TIMER_DisableCaptureDebounce(TIMER_T *timer); +__STATIC_INLINE void TIMER_EnableEventCounterDebounce(TIMER_T *timer); +__STATIC_INLINE void TIMER_DisableEventCounterDebounce(TIMER_T *timer); +__STATIC_INLINE void TIMER_EnableInt(TIMER_T *timer); +__STATIC_INLINE void TIMER_DisableInt(TIMER_T *timer); +__STATIC_INLINE void TIMER_EnableCaptureInt(TIMER_T *timer); +__STATIC_INLINE void TIMER_DisableCaptureInt(TIMER_T *timer); +__STATIC_INLINE uint32_t TIMER_GetIntFlag(TIMER_T *timer); +__STATIC_INLINE void TIMER_ClearIntFlag(TIMER_T *timer); +__STATIC_INLINE uint32_t TIMER_GetCaptureIntFlag(TIMER_T *timer); +__STATIC_INLINE void TIMER_ClearCaptureIntFlag(TIMER_T *timer); +__STATIC_INLINE uint32_t TIMER_GetWakeupFlag(TIMER_T *timer); +__STATIC_INLINE void TIMER_ClearWakeupFlag(TIMER_T *timer); +__STATIC_INLINE uint32_t TIMER_GetCaptureData(TIMER_T *timer); +__STATIC_INLINE uint32_t TIMER_GetCounter(TIMER_T *timer); +__STATIC_INLINE void TIMER_ResetCounter(TIMER_T *timer); + +/** + * @brief Start Timer Counting + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to start Timer counting. + */ +__STATIC_INLINE void TIMER_Start(TIMER_T *timer) +{ + timer->CTL |= TIMER_CTL_CNTEN_Msk; +} + +/** + * @brief Stop Timer Counting + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to stop/suspend Timer counting. + */ +__STATIC_INLINE void TIMER_Stop(TIMER_T *timer) +{ + timer->CTL &= ~TIMER_CTL_CNTEN_Msk; +} + +/** + * @brief Enable Timer Interrupt Wake-up Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to enable the timer interrupt wake-up function and interrupt source could be time-out interrupt, \n + * counter event interrupt or capture trigger interrupt. + * @note To wake the system from Power-down mode, timer clock source must be ether LXT or LIRC. + */ +__STATIC_INLINE void TIMER_EnableWakeup(TIMER_T *timer) +{ + timer->CTL |= TIMER_CTL_WKEN_Msk; +} + +/** + * @brief Disable Timer Wake-up Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to disable the timer interrupt wake-up function. + */ +__STATIC_INLINE void TIMER_DisableWakeup(TIMER_T *timer) +{ + timer->CTL &= ~TIMER_CTL_WKEN_Msk; +} + +/** + * @brief Start Timer Capture Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to start Timer capture function. + */ +__STATIC_INLINE void TIMER_StartCapture(TIMER_T *timer) +{ + timer->EXTCTL |= TIMER_EXTCTL_CAPEN_Msk; +} + +/** + * @brief Stop Timer Capture Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to stop Timer capture function. + */ +__STATIC_INLINE void TIMER_StopCapture(TIMER_T *timer) +{ + timer->EXTCTL &= ~TIMER_EXTCTL_CAPEN_Msk; +} + +/** + * @brief Enable Capture Pin De-bounce + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to enable the detect de-bounce function of capture pin. + */ +__STATIC_INLINE void TIMER_EnableCaptureDebounce(TIMER_T *timer) +{ + timer->EXTCTL |= TIMER_EXTCTL_CAPDBEN_Msk; +} + +/** + * @brief Disable Capture Pin De-bounce + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to disable the detect de-bounce function of capture pin. + */ +__STATIC_INLINE void TIMER_DisableCaptureDebounce(TIMER_T *timer) +{ + timer->EXTCTL &= ~TIMER_EXTCTL_CAPDBEN_Msk; +} + +/** + * @brief Enable Counter Pin De-bounce + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to enable the detect de-bounce function of counter pin. + */ +__STATIC_INLINE void TIMER_EnableEventCounterDebounce(TIMER_T *timer) +{ + timer->EXTCTL |= TIMER_EXTCTL_CNTDBEN_Msk; +} + +/** + * @brief Disable Counter Pin De-bounce + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to disable the detect de-bounce function of counter pin. + */ +__STATIC_INLINE void TIMER_DisableEventCounterDebounce(TIMER_T *timer) +{ + timer->EXTCTL &= ~TIMER_EXTCTL_CNTDBEN_Msk; +} + +/** + * @brief Enable Timer Time-out Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to enable the timer time-out interrupt function. + */ +__STATIC_INLINE void TIMER_EnableInt(TIMER_T *timer) +{ + timer->CTL |= TIMER_CTL_INTEN_Msk; +} + +/** + * @brief Disable Timer Time-out Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to disable the timer time-out interrupt function. + */ +__STATIC_INLINE void TIMER_DisableInt(TIMER_T *timer) +{ + timer->CTL &= ~TIMER_CTL_INTEN_Msk; +} + +/** + * @brief Enable Capture Trigger Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to enable the timer capture trigger interrupt function. + */ +__STATIC_INLINE void TIMER_EnableCaptureInt(TIMER_T *timer) +{ + timer->EXTCTL |= TIMER_EXTCTL_CAPIEN_Msk; +} + +/** + * @brief Disable Capture Trigger Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to disable the timer capture trigger interrupt function. + */ +__STATIC_INLINE void TIMER_DisableCaptureInt(TIMER_T *timer) +{ + timer->EXTCTL &= ~TIMER_EXTCTL_CAPIEN_Msk; +} + +/** + * @brief Get Timer Time-out Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Timer time-out interrupt did not occur + * @retval 1 Timer time-out interrupt occurred + * + * @details This function indicates timer time-out interrupt occurred or not. + */ +__STATIC_INLINE uint32_t TIMER_GetIntFlag(TIMER_T *timer) +{ + return ((timer->INTSTS & TIMER_INTSTS_TIF_Msk) ? 1UL : 0UL); +} + +/** + * @brief Clear Timer Time-out Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function clears timer time-out interrupt flag to 0. + */ +__STATIC_INLINE void TIMER_ClearIntFlag(TIMER_T *timer) +{ + timer->INTSTS = TIMER_INTSTS_TIF_Msk; +} + +/** + * @brief Get Timer Capture Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Timer capture interrupt did not occur + * @retval 1 Timer capture interrupt occurred + * + * @details This function indicates timer capture trigger interrupt occurred or not. + */ +__STATIC_INLINE uint32_t TIMER_GetCaptureIntFlag(TIMER_T *timer) +{ + return timer->EINTSTS; +} + +/** + * @brief Clear Timer Capture Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function clears timer capture trigger interrupt flag to 0. + */ +__STATIC_INLINE void TIMER_ClearCaptureIntFlag(TIMER_T *timer) +{ + timer->EINTSTS = TIMER_EINTSTS_CAPIF_Msk; +} + +/** + * @brief Get Timer Wake-up Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Timer does not cause CPU wake-up + * @retval 1 Timer interrupt event cause CPU wake-up + * + * @details This function indicates timer interrupt event has waked up system or not. + */ +__STATIC_INLINE uint32_t TIMER_GetWakeupFlag(TIMER_T *timer) +{ + return (timer->INTSTS & TIMER_INTSTS_TWKF_Msk ? 1UL : 0UL); +} + +/** + * @brief Clear Timer Wake-up Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function clears the timer wake-up system flag to 0. + */ +__STATIC_INLINE void TIMER_ClearWakeupFlag(TIMER_T *timer) +{ + timer->INTSTS = TIMER_INTSTS_TWKF_Msk; +} + +/** + * @brief Get Capture value + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return 24-bit Capture Value + * + * @details This function reports the current 24-bit timer capture value. + */ +__STATIC_INLINE uint32_t TIMER_GetCaptureData(TIMER_T *timer) +{ + return timer->CAP; +} + +/** + * @brief Get Counter value + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return 24-bit Counter Value + * + * @details This function reports the current 24-bit timer counter value. + */ +__STATIC_INLINE uint32_t TIMER_GetCounter(TIMER_T *timer) +{ + return timer->CNT; +} + +/** + * @brief Reset Counter + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This function is used to reset current counter value and internal prescale counter value. + */ +__STATIC_INLINE void TIMER_ResetCounter(TIMER_T *timer) +{ + timer->CNT = 0UL; + while ((timer->CNT & TIMER_CNT_RSTACT_Msk) == TIMER_CNT_RSTACT_Msk) + { + ; + } +} + + +uint32_t TIMER_Open(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Freq); +void TIMER_Close(TIMER_T *timer); +void TIMER_Delay(TIMER_T *timer, uint32_t u32Usec); +void TIMER_EnableCapture(TIMER_T *timer, uint32_t u32CapMode, uint32_t u32Edge); +void TIMER_DisableCapture(TIMER_T *timer); +void TIMER_EnableEventCounter(TIMER_T *timer, uint32_t u32Edge); +void TIMER_DisableEventCounter(TIMER_T *timer); +uint32_t TIMER_GetModuleClock(TIMER_T *timer); +void TIMER_EnableFreqCounter(TIMER_T *timer, + uint32_t u32DropCount, + uint32_t u32Timeout, + uint32_t u32EnableInt); +void TIMER_DisableFreqCounter(TIMER_T *timer); +void TIMER_SetTriggerSource(TIMER_T *timer, uint32_t u32Src); +void TIMER_SetTriggerTarget(TIMER_T *timer, uint32_t u32Mask); + +/*@}*/ /* end of group TIMER_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group TIMER_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_TIMER_H__ */ + + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_timer_pwm.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_timer_pwm.h new file mode 100644 index 0000000000..05291bc2cc --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_timer_pwm.h @@ -0,0 +1,745 @@ +/**************************************************************************//** + * @file nu_timer_pwm.h + * @brief Timer PWM Controller(Timer PWM) driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_TIMER_PWM_H__ +#define __NU_TIMER_PWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ +/** @addtogroup TIMER_PWM_Driver TIMER PWM Driver + @{ +*/ + +/** @addtogroup TIMER_PWM_EXPORTED_CONSTANTS TIMER PWM Exported Constants + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* Output Channel Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define TPWM_CH0 (BIT0) /*!< Indicate PWMx_CH0 \hideinitializer */ +#define TPWM_CH1 (BIT1) /*!< Indicate PWMx_CH1 \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Counter Type Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define TPWM_UP_COUNT (0UL << TIMER_PWMCTL_CNTTYPE_Pos) /*!< Up count type \hideinitializer */ +#define TPWM_DOWN_COUNT (1UL << TIMER_PWMCTL_CNTTYPE_Pos) /*!< Down count type \hideinitializer */ +#define TPWM_UP_DOWN_COUNT (2UL << TIMER_PWMCTL_CNTTYPE_Pos) /*!< Up-Down count type \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Counter Mode Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define TPWM_AUTO_RELOAD_MODE (0UL) /*!< Auto-reload mode \hideinitializer */ +#define TPWM_ONE_SHOT_MODE (TIMER_PWMCTL_CNTMODE_Msk) /*!< One-shot mode \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Output Level Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define TPWM_OUTPUT_TOGGLE (0UL) /*!< Timer PWM output toggle \hideinitializer */ +#define TPWM_OUTPUT_NOTHING (1UL) /*!< Timer PWM output nothing \hideinitializer */ +#define TPWM_OUTPUT_LOW (2UL) /*!< Timer PWM output low \hideinitializer */ +#define TPWM_OUTPUT_HIGH (3UL) /*!< Timer PWM output high \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Trigger ADC Source Select Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define TPWM_TRIGGER_ADC_AT_ZERO_POINT (0UL << TIMER_PWMEADCTS_TRGSEL_Pos) /*!< Timer PWM trigger ADC while counter zero point event occurred \hideinitializer */ +#define TPWM_TRIGGER_ADC_AT_PERIOD_POINT (1UL << TIMER_PWMEADCTS_TRGSEL_Pos) /*!< Timer PWM trigger ADC while counter period point event occurred \hideinitializer */ +#define TPWM_TRIGGER_ADC_AT_ZERO_OR_PERIOD_POINT (2UL << TIMER_PWMEADCTS_TRGSEL_Pos) /*!< Timer PWM trigger ADC while counter zero or period point event occurred \hideinitializer */ +#define TPWM_TRIGGER_ADC_AT_COMPARE_UP_COUNT_POINT (3UL << TIMER_PWMEADCTS_TRGSEL_Pos) /*!< Timer PWM trigger ADC while counter up count compare point event occurred \hideinitializer */ +#define TPWM_TRIGGER_ADC_AT_COMPARE_DOWN_COUNT_POINT (4UL << TIMER_PWMEADCTS_TRGSEL_Pos) /*!< Timer PWM trigger ADC while counter down count compare point event occurred \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Brake Control Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define TPWM_BRAKE_SOURCE_EDGE_ACMP0 (TIMER_PWMBRKCTL_CPO0EBEN_Msk) /*!< Comparator 0 as edge-detect fault brake source \hideinitializer */ +#define TPWM_BRAKE_SOURCE_EDGE_ACMP1 (TIMER_PWMBRKCTL_CPO1EBEN_Msk) /*!< Comparator 1 as edge-detect fault brake source \hideinitializer */ +#define TPWM_BRAKE_SOURCE_EDGE_BKPIN (TIMER_PWMBRKCTL_BRKPEEN_Msk) /*!< Brake pin as edge-detect fault brake source \hideinitializer */ +#define TPWM_BRAKE_SOURCE_EDGE_SYS_CSS (TIMER_PWMBRKCTL_SYSEBEN_Msk | (TIMER_PWMFAILBRK_CSSBRKEN_Msk << 16)) /*!< System fail condition: clock security system detection as edge-detect fault brake source \hideinitializer */ +#define TPWM_BRAKE_SOURCE_EDGE_SYS_BOD (TIMER_PWMBRKCTL_SYSEBEN_Msk | (TIMER_PWMFAILBRK_BODBRKEN_Msk << 16)) /*!< System fail condition: brown-out detection as edge-detect fault brake source \hideinitializer */ +#define TPWM_BRAKE_SOURCE_EDGE_SYS_COR (TIMER_PWMBRKCTL_SYSEBEN_Msk | (TIMER_PWMFAILBRK_CORBRKEN_Msk << 16)) /*!< System fail condition: core lockup detection as edge-detect fault brake source \hideinitializer */ +#define TPWM_BRAKE_SOURCE_EDGE_SYS_RAM (TIMER_PWMBRKCTL_SYSEBEN_Msk | (TIMER_PWMFAILBRK_RAMBRKEN_Msk << 16)) /*!< System fail condition: SRAM parity error detection as edge-detect fault brake source \hideinitializer */ + + +#define TPWM_BRAKE_SOURCE_LEVEL_ACMP0 (TIMER_PWMBRKCTL_CPO0LBEN_Msk) /*!< Comparator 0 as level-detect fault brake source \hideinitializer */ +#define TPWM_BRAKE_SOURCE_LEVEL_ACMP1 (TIMER_PWMBRKCTL_CPO1LBEN_Msk) /*!< Comparator 1 as level-detect fault brake source \hideinitializer */ +#define TPWM_BRAKE_SOURCE_LEVEL_BKPIN (TIMER_PWMBRKCTL_BRKPLEN_Msk) /*!< Brake pin as level-detect fault brake source \hideinitializer */ +#define TPWM_BRAKE_SOURCE_LEVEL_SYS_CSS (TIMER_PWMBRKCTL_SYSLBEN_Msk | (TIMER_PWMFAILBRK_CSSBRKEN_Msk << 16)) /*!< System fail condition: clock security system detection as level-detect fault brake source \hideinitializer */ +#define TPWM_BRAKE_SOURCE_LEVEL_SYS_BOD (TIMER_PWMBRKCTL_SYSLBEN_Msk | (TIMER_PWMFAILBRK_BODBRKEN_Msk << 16)) /*!< System fail condition: brown-out detection as level-detect fault brake source \hideinitializer */ +#define TPWM_BRAKE_SOURCE_LEVEL_SYS_COR (TIMER_PWMBRKCTL_SYSLBEN_Msk | (TIMER_PWMFAILBRK_CORBRKEN_Msk << 16)) /*!< System fail condition: core lockup detection as level-detect fault brake source \hideinitializer */ +#define TPWM_BRAKE_SOURCE_LEVEL_SYS_RAM (TIMER_PWMBRKCTL_SYSLBEN_Msk | (TIMER_PWMFAILBRK_RAMBRKEN_Msk << 16)) /*!< System fail condition: SRAM parity error detection as level-detect fault brake source \hideinitializer */ + +#define TPWM_BRAKE_EDGE (TIMER_PWMSWBRK_BRKETRG_Msk) /*!< Edge-detect fault brake \hideinitializer */ +#define TPWM_BRAKE_LEVEL (TIMER_PWMSWBRK_BRKLTRG_Msk) /*!< Level-detect fault brake \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Load Mode Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define TPWM_LOAD_MODE_PERIOD (0UL) /*!< Timer PWM period load mode \hideinitializer */ +#define TPWM_LOAD_MODE_IMMEDIATE (TIMER_PWMCTL_IMMLDEN_Msk) /*!< Timer PWM immediately load mode \hideinitializer */ +#define TPWM_LOAD_MODE_CENTER (TIMER_PWMCTL_CTRLD_Msk) /*!< Timer PWM center load mode \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Brake Pin De-bounce Clock Source Select Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define TPWM_BKP_DBCLK_PCLK_DIV_1 (0UL) /*!< De-bounce clock is PCLK divide by 1 \hideinitializer */ +#define TPWM_BKP_DBCLK_PCLK_DIV_2 (1UL) /*!< De-bounce clock is PCLK divide by 2 \hideinitializer */ +#define TPWM_BKP_DBCLK_PCLK_DIV_4 (2UL) /*!< De-bounce clock is PCLK divide by 4 \hideinitializer */ +#define TPWM_BKP_DBCLK_PCLK_DIV_8 (3UL) /*!< De-bounce clock is PCLK divide by 8 \hideinitializer */ +#define TPWM_BKP_DBCLK_PCLK_DIV_16 (4UL) /*!< De-bounce clock is PCLK divide by 16 \hideinitializer */ +#define TPWM_BKP_DBCLK_PCLK_DIV_32 (5UL) /*!< De-bounce clock is PCLK divide by 32 \hideinitializer */ +#define TPWM_BKP_DBCLK_PCLK_DIV_64 (6UL) /*!< De-bounce clock is PCLK divide by 64 \hideinitializer */ +#define TPWM_BKP_DBCLK_PCLK_DIV_128 (7UL) /*!< De-bounce clock is PCLK divide by 128 \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Brake Pin Source Select Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define TPWM_TM_BRAKE0 (0UL) /*!< Brake pin source comes from TM_BRAKE0 \hideinitializer */ +#define TPWM_TM_BRAKE1 (1UL) /*!< Brake pin source comes from TM_BRAKE1 \hideinitializer */ +#define TPWM_TM_BRAKE2 (2UL) /*!< Brake pin source comes from TM_BRAKE2 \hideinitializer */ +#define TPWM_TM_BRAKE3 (3UL) /*!< Brake pin source comes from TM_BRAKE3 \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Counter Clock Source Select Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define TPWM_CNTR_CLKSRC_TMR_CLK (0UL) /*!< Timer PWM Clock source selects to TMR_CLK \hideinitializer */ +#define TPWM_CNTR_CLKSRC_TIMER0_INT (1UL) /*!< Timer PWM Clock source selects to TIMER0 interrupt event \hideinitializer */ +#define TPWM_CNTR_CLKSRC_TIMER1_INT (2UL) /*!< Timer PWM Clock source selects to TIMER1 interrupt event \hideinitializer */ +#define TPWM_CNTR_CLKSRC_TIMER2_INT (3UL) /*!< Timer PWM Clock source selects to TIMER2 interrupt event \hideinitializer */ +#define TPWM_CNTR_CLKSRC_TIMER3_INT (4UL) /*!< Timer PWM Clock source selects to TIMER3 interrupt event \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Counter Synchronous Mode Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define TPWM_CNTR_SYNC_DISABLE (0UL) /*!< Disable TIMER PWM synchronous function \hideinitializer */ +#define TPWM_CNTR_SYNC_START_BY_TIMER0 ((0<ALTCTL = (1 << TIMER_ALTCTL_FUNCSEL_Pos)) + +/** + * @brief Disable PWM Counter Mode + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to disable specified Timer channel as PWM counter mode, then timer counter mode is available. + * @note All registers about PWM counter function will be cleared to 0 after executing this macro. + * \hideinitializer + */ +#define TPWM_DISABLE_PWM_MODE(timer) ((timer)->ALTCTL = (0 << TIMER_ALTCTL_FUNCSEL_Pos)) + +/** + * @brief Enable Independent Mode + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to enable independent mode of TIMER PWM module and complementary mode will be disabled. + * \hideinitializer + */ +#define TPWM_ENABLE_INDEPENDENT_MODE(timer) ((timer)->PWMCTL &= ~(1 << TIMER_PWMCTL_OUTMODE_Pos)) + +/** + * @brief Enable Complementary Mode + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to enable complementary mode of Timer PWM module and independent mode will be disabled. + * \hideinitializer + */ +#define TPWM_ENABLE_COMPLEMENTARY_MODE(timer) ((timer)->PWMCTL |= (1 << TIMER_PWMCTL_OUTMODE_Pos)) + +/** + * @brief Set Counter Type + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * @param[in] type Timer PWM count type, could be one of the following type + * - \ref TPWM_UP_COUNT + * - \ref TPWM_DOWN_COUNT + * - \ref TPWM_UP_DOWN_COUNT + * + * @return None + * + * @details This macro is used to set Timer PWM counter type. + * \hideinitializer + */ +#define TPWM_SET_COUNTER_TYPE(timer, type) ((timer)->PWMCTL = ((timer)->PWMCTL & ~TIMER_PWMCTL_CNTTYPE_Msk) | (type)) + +/** + * @brief Start PWM Counter + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to enable PWM generator and start counter counting. + * \hideinitializer + */ +#define TPWM_START_COUNTER(timer) ((timer)->PWMCTL |= TIMER_PWMCTL_CNTEN_Msk) + +/** + * @brief Stop PWM Counter + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to stop PWM counter after current period is completed. + * \hideinitializer + */ +#define TPWM_STOP_COUNTER(timer) ((timer)->PWMPERIOD = 0x0) + +/** + * @brief Set Counter Clock Prescaler + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @param[in] prescaler Clock prescaler of specified channel. Valid values are between 0x0~0xFFF. + * + * @return None + * + * @details This macro is used to set the prescaler of specified TIMER PWM. + * @note If prescaler is 0, then there is no scaling in counter clock source. + * \hideinitializer + */ +#define TPWM_SET_PRESCALER(timer, prescaler) ((timer)->PWMCLKPSC = (prescaler)) + +/** + * @brief Get Counter Clock Prescaler + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return Target prescaler setting, CLKPSC (TIMERx_PWMCLKPSC[11:0]) + * + * @details Get the prescaler setting, the target counter clock divider is (CLKPSC + 1). + * \hideinitializer + */ +#define TPWM_GET_PRESCALER(timer) ((timer)->PWMCLKPSC) + +/** + * @brief Set Counter Period + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @param[in] period Period of specified channel. Valid values are between 0x0~0xFFFF. + * + * @return None + * + * @details This macro is used to set the period of specified TIMER PWM. + * \hideinitializer + */ +#define TPWM_SET_PERIOD(timer, period) ((timer)->PWMPERIOD = (period)) + +/** + * @brief Get Counter Period + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return Target period setting, PERIOD (TIMERx_PWMPERIOD[15:0]) + * + * @details This macro is used to get the period of specified TIMER PWM. + * \hideinitializer + */ +#define TPWM_GET_PERIOD(timer) ((timer)->PWMPERIOD) + +/** + * @brief Set Comparator Value + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @param[in] cmp Comparator of specified channel. Valid values are between 0x0~0xFFFF. + * + * @return None + * + * @details This macro is used to set the comparator value of specified TIMER PWM. + * \hideinitializer + */ +#define TPWM_SET_CMPDAT(timer, cmp) ((timer)->PWMCMPDAT = (cmp)) + +/** + * @brief Get Comparator Value + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return Target comparator setting, CMPDAT (TIMERx_PWMCMPDAT[15:0]) + * + * @details This macro is used to get the comparator value of specified TIMER PWM. + * \hideinitializer + */ +#define TPWM_GET_CMPDAT(timer) ((timer)->PWMCMPDAT) + +/** + * @brief Clear Counter + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to clear counter of specified TIMER PWM. + * \hideinitializer + */ +#define TPWM_CLEAR_COUNTER(timer) ((timer)->PWMCNTCLR = TIMER_PWMCNTCLR_CNTCLR_Msk) + +/** + * @brief Software Trigger Brake Event + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @param[in] type Type of brake trigger. Valid values are: + * - \ref TPWM_BRAKE_EDGE + * - \ref TPWM_BRAKE_LEVEL + * + * @return None + * + * @details This macro is used to trigger brake event by writing PWMSWBRK register. + * \hideinitializer + */ +#define TPWM_SW_TRIGGER_BRAKE(timer, type) ((timer)->PWMSWBRK = (type)) + +/** + * @brief Enable Output Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @param[in] ch Enable specified channel output function. Valid values are the combination of: + * - \ref TPWM_CH0 + * - \ref TPWM_CH1 + * + * @return None + * + * @details This macro is used to enable output function of specified output pins. + * @note If the corresponding bit in ch parameter is 0, then output function will be disabled in this channel. + * \hideinitializer + */ +#define TPWM_ENABLE_OUTPUT(timer, ch) ((timer)->PWMPOEN = (ch)) + +/** + * @brief Set Output Inverse + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @param[in] ch Set specified channel output is inversed or not. Valid values are the combination of: + * - \ref TPWM_CH0 + * - \ref TPWM_CH1 + * + * @return None + * + * @details This macro is used to enable output inverse of specified output pins. + * @note If ch parameter is 0, then output inverse function will be disabled. + * \hideinitializer + */ +#define TPWM_SET_OUTPUT_INVERSE(timer, ch) ((timer)->PWMPOLCTL = (ch)) + +/** + * @brief Enable Output Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @param[in] ch Enable specified channel output mask function. Valid values are the combination of: + * - \ref TPWM_CH0 + * - \ref TPWM_CH1 + * + * @param[in] level Output to high or low on specified mask channel. + * + * @return None + * + * @details This macro is used to enable output function of specified output pins. + * @note If ch parameter is 0, then output mask function will be disabled. + * \hideinitializer + */ +#define TPWM_SET_MASK_OUTPUT(timer, ch, level) do {(timer)->PWMMSKEN = (ch); (timer)->PWMMSK = (level); }while(0) + +/** + * @brief Set Counter Synchronous Mode + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @param[in] mode Synchronous mode. Possible options are: + * - \ref TPWM_CNTR_SYNC_DISABLE + * - \ref TPWM_CNTR_SYNC_START_BY_TIMER0 + * - \ref TPWM_CNTR_SYNC_CLEAR_BY_TIMER0 + * - \ref TPWM_CNTR_SYNC_START_BY_TIMER2 + * - \ref TPWM_CNTR_SYNC_CLEAR_BY_TIMER2 + * + * @return None + * + * @details This macro is used to set counter synchronous mode of specified Timer PWM module. + * @note Only support all PWM counters are synchronous by TIMER0 PWM or TIMER0~1 PWM counter synchronous by TIMER0 PWM and + * TIMER2~3 PWM counter synchronous by TIMER2 PWM. + * \hideinitializer + */ +#define TPWM_SET_COUNTER_SYNC_MODE(timer, mode) ((timer)->PWMSCTL = (mode)) + +/** + * @brief Trigger Counter Synchronous + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to trigger synchronous event by specified TIMER PWM. + * @note 1. This macro is only available for TIMER0 PWM and TIMER2 PWM. \n + * 2. STRGEN (PWMSTRG[0]) is write only and always read as 0. + * \hideinitializer + */ +#define TPWM_TRIGGER_COUNTER_SYNC(timer) ((timer)->PWMSTRG = TIMER_PWMSTRG_STRGEN_Msk) + +/** + * @brief Enable Zero Event Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to enable the zero event interrupt function. + * \hideinitializer + */ +#define TPWM_ENABLE_ZERO_INT(timer) ((timer)->PWMINTEN0 |= TIMER_PWMINTEN0_ZIEN_Msk) + +/** + * @brief Disable Zero Event Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to disable the zero event interrupt function. + * \hideinitializer + */ +#define TPWM_DISABLE_ZERO_INT(timer) ((timer)->PWMINTEN0 &= ~TIMER_PWMINTEN0_ZIEN_Msk) + +/** + * @brief Get Zero Event Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Zero event interrupt did not occur + * @retval 1 Zero event interrupt occurred + * + * @details This macro indicates zero event occurred or not. + * \hideinitializer + */ +#define TPWM_GET_ZERO_INT_FLAG(timer) (((timer)->PWMINTSTS0 & TIMER_PWMINTSTS0_ZIF_Msk)? 1 : 0) + +/** + * @brief Clear Zero Event Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro clears zero event interrupt flag. + * \hideinitializer + */ +#define TPWM_CLEAR_ZERO_INT_FLAG(timer) ((timer)->PWMINTSTS0 = TIMER_PWMINTSTS0_ZIF_Msk) + +/** + * @brief Enable Period Event Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to enable the period event interrupt function. + * \hideinitializer + */ +#define TPWM_ENABLE_PERIOD_INT(timer) ((timer)->PWMINTEN0 |= TIMER_PWMINTEN0_PIEN_Msk) + +/** + * @brief Disable Period Event Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to disable the period event interrupt function. + * \hideinitializer + */ +#define TPWM_DISABLE_PERIOD_INT(timer) ((timer)->PWMINTEN0 &= ~TIMER_PWMINTEN0_PIEN_Msk) + +/** + * @brief Get Period Event Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Period event interrupt did not occur + * @retval 1 Period event interrupt occurred + * + * @details This macro indicates period event occurred or not. + * \hideinitializer + */ +#define TPWM_GET_PERIOD_INT_FLAG(timer) (((timer)->PWMINTSTS0 & TIMER_PWMINTSTS0_PIF_Msk)? 1 : 0) + +/** + * @brief Clear Period Event Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro clears period event interrupt flag. + * \hideinitializer + */ +#define TPWM_CLEAR_PERIOD_INT_FLAG(timer) ((timer)->PWMINTSTS0 = TIMER_PWMINTSTS0_PIF_Msk) + +/** + * @brief Enable Compare Up Event Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to enable the compare up event interrupt function. + * \hideinitializer + */ +#define TPWM_ENABLE_CMP_UP_INT(timer) ((timer)->PWMINTEN0 |= TIMER_PWMINTEN0_CMPUIEN_Msk) + +/** + * @brief Disable Compare Up Event Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to disable the compare up event interrupt function. + * \hideinitializer + */ +#define TPWM_DISABLE_CMP_UP_INT(timer) ((timer)->PWMINTEN0 &= ~TIMER_PWMINTEN0_CMPUIEN_Msk) + +/** + * @brief Get Compare Up Event Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Compare up event interrupt did not occur + * @retval 1 Compare up event interrupt occurred + * + * @details This macro indicates compare up event occurred or not. + * \hideinitializer + */ +#define TPWM_GET_CMP_UP_INT_FLAG(timer) (((timer)->PWMINTSTS0 & TIMER_PWMINTSTS0_CMPUIF_Msk)? 1 : 0) + +/** + * @brief Clear Compare Up Event Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro clears compare up event interrupt flag. + * \hideinitializer + */ +#define TPWM_CLEAR_CMP_UP_INT_FLAG(timer) ((timer)->PWMINTSTS0 = TIMER_PWMINTSTS0_CMPUIF_Msk) + +/** + * @brief Enable Compare Down Event Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to enable the compare down event interrupt function. + * \hideinitializer + */ +#define TPWM_ENABLE_CMP_DOWN_INT(timer) ((timer)->PWMINTEN0 |= TIMER_PWMINTEN0_CMPDIEN_Msk) + +/** + * @brief Disable Compare Down Event Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to disable the compare down event interrupt function. + * \hideinitializer + */ +#define TPWM_DISABLE_CMP_DOWN_INT(timer) ((timer)->PWMINTEN0 &= ~TIMER_PWMINTEN0_CMPDIEN_Msk) + +/** + * @brief Get Compare Down Event Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Compare down event interrupt did not occur + * @retval 1 Compare down event interrupt occurred + * + * @details This macro indicates compare down event occurred or not. + * \hideinitializer + */ +#define TPWM_GET_CMP_DOWN_INT_FLAG(timer) (((timer)->PWMINTSTS0 & TIMER_PWMINTSTS0_CMPDIF_Msk)? 1 : 0) + +/** + * @brief Clear Compare Down Event Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro clears compare down event interrupt flag. + * \hideinitializer + */ +#define TPWM_CLEAR_CMP_DOWN_INT_FLAG(timer) ((timer)->PWMINTSTS0 = TIMER_PWMINTSTS0_CMPDIF_Msk) + +/** + * @brief Get Counter Reach Maximum Count Status + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Timer PWM counter never counts to maximum value + * @retval 1 Timer PWM counter counts to maximum value, 0xFFFF + * + * @details This macro indicates Timer PWM counter has count to 0xFFFF or not. + * \hideinitializer + */ +#define TPWM_GET_REACH_MAX_CNT_STATUS(timer) (((timer)->PWMSTATUS & TIMER_PWMSTATUS_CNTMAXF_Msk)? 1 : 0) + +/** + * @brief Clear Counter Reach Maximum Count Status + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro clears reach maximum count status. + * \hideinitializer + */ +#define TPWM_CLEAR_REACH_MAX_CNT_STATUS(timer) ((timer)->PWMSTATUS = TIMER_PWMSTATUS_CNTMAXF_Msk) + +/** + * @brief Get Trigger ADC Status + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @retval 0 Trigger ADC start conversion is not occur + * @retval 1 Specified counter compare event has trigger ADC start conversion + * + * @details This macro is used to indicate PWM counter compare event has triggered ADC start conversion. + * \hideinitializer + */ +#define TPWM_GET_TRG_ADC_STATUS(timer) (((timer)->PWMSTATUS & TIMER_PWMSTATUS_EADCTRGF_Msk)? 1 : 0) + +/** + * @brief Clear Trigger ADC Status + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to clear PWM counter compare event trigger ADC status. + * \hideinitializer + */ +#define TPWM_CLEAR_TRG_ADC_STATUS(timer) ((timer)->PWMSTATUS = TIMER_PWMSTATUS_EADCTRGF_Msk) + +/** + * @brief Set Brake Event at Brake Pin High or Low-to-High + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to set detect brake event when external brake pin at high level or transfer from low to high. + * @note The default brake pin detection is high level or from low to high. + * \hideinitializer + */ +#define TPWM_SET_BRAKE_PIN_HIGH_DETECT(timer) ((timer)->PWMBNF &= ~TIMER_PWMBNF_BRKPINV_Msk) + +/** + * @brief Set Brake Event at Brake Pin Low or High-to-Low + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This macro is used to set detect brake event when external brake pin at low level or transfer from high to low. + * \hideinitializer + */ +#define TPWM_SET_BRAKE_PIN_LOW_DETECT(timer) ((timer)->PWMBNF |= TIMER_PWMBNF_BRKPINV_Msk) + +/** + * @brief Set External Brake Pin Source + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * @param[in] pin The external brake pin source, could be one of following source + * - \ref TPWM_TM_BRAKE0 + * - \ref TPWM_TM_BRAKE1 + * - \ref TPWM_TM_BRAKE2 + * - \ref TPWM_TM_BRAKE3 + * + * @return None + * + * @details This macro is used to set detect brake event when external brake pin at high level or transfer from low to high. + * \hideinitializer + */ +#define TPWM_SET_BRAKE_PIN_SOURCE(timer, pin) ((timer)->PWMBNF = ((timer)->PWMBNF & ~TIMER_PWMBNF_BKPINSRC_Msk) | ((pin)<> 4ul)-2ul) + + +/** + * @brief Calculate UART baudrate mode2 divider + * + * @param[in] u32SrcFreq UART clock frequency + * @param[in] u32BaudRate Baudrate of UART module + * + * @return UART baudrate mode2 divider + * + * @details This macro calculate UART baudrate mode2 divider. + * \hideinitializer + */ +#define UART_BAUD_MODE2_DIVIDER(u32SrcFreq, u32BaudRate) ((((u32SrcFreq) + ((u32BaudRate)/2ul)) / (u32BaudRate))-2ul) + + +/** + * @brief Write UART data + * + * @param[in] uart The pointer of the specified UART module + * @param[in] u8Data Data byte to transmit. + * + * @return None + * + * @details This macro write Data to Tx data register. + * \hideinitializer + */ +#define UART_WRITE(uart, u8Data) ((uart)->DAT = (u8Data)) + + +/** + * @brief Read UART data + * + * @param[in] uart The pointer of the specified UART module + * + * @return The oldest data byte in RX FIFO. + * + * @details This macro read Rx data register. + * \hideinitializer + */ +#define UART_READ(uart) ((uart)->DAT) + + +/** + * @brief Get Tx empty + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 Tx FIFO is not empty + * @retval >=1 Tx FIFO is empty + * + * @details This macro get Transmitter FIFO empty register value. + * \hideinitializer + */ +#define UART_GET_TX_EMPTY(uart) ((uart)->FIFOSTS & UART_FIFOSTS_TXEMPTY_Msk) + + +/** + * @brief Get Rx empty + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 Rx FIFO is not empty + * @retval >=1 Rx FIFO is empty + * + * @details This macro get Receiver FIFO empty register value. + * \hideinitializer + */ +#define UART_GET_RX_EMPTY(uart) ((uart)->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) + + +/** + * @brief Check specified UART port transmission is over. + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 Tx transmission is not over + * @retval 1 Tx transmission is over + * + * @details This macro return Transmitter Empty Flag register bit value. + * It indicates if specified UART port transmission is over nor not. + * \hideinitializer + */ +#define UART_IS_TX_EMPTY(uart) (((uart)->FIFOSTS & UART_FIFOSTS_TXEMPTYF_Msk) >> UART_FIFOSTS_TXEMPTYF_Pos) + + +/** + * @brief Wait specified UART port transmission is over + * + * @param[in] uart The pointer of the specified UART module + * + * @return None + * + * @details This macro wait specified UART port transmission is over. + * \hideinitializer + */ +#define UART_WAIT_TX_EMPTY(uart) while(!((((uart)->FIFOSTS) & UART_FIFOSTS_TXEMPTYF_Msk) >> UART_FIFOSTS_TXEMPTYF_Pos)) + + +/** + * @brief Check RX is ready or not + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 The number of bytes in the RX FIFO is less than the RFITL + * @retval 1 The number of bytes in the RX FIFO equals or larger than RFITL + * + * @details This macro check receive data available interrupt flag is set or not. + * \hideinitializer + */ +#define UART_IS_RX_READY(uart) (((uart)->INTSTS & UART_INTSTS_RDAIF_Msk)>>UART_INTSTS_RDAIF_Pos) + + +/** + * @brief Check TX FIFO is full or not + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 1 TX FIFO is full + * @retval 0 TX FIFO is not full + * + * @details This macro check TX FIFO is full or not. + * \hideinitializer + */ +#define UART_IS_TX_FULL(uart) (((uart)->FIFOSTS & UART_FIFOSTS_TXFULL_Msk)>>UART_FIFOSTS_TXFULL_Pos) + + +/** + * @brief Check RX FIFO is full or not + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 1 RX FIFO is full + * @retval 0 RX FIFO is not full + * + * @details This macro check RX FIFO is full or not. + * \hideinitializer + */ +#define UART_IS_RX_FULL(uart) (((uart)->FIFOSTS & UART_FIFOSTS_RXFULL_Msk)>>UART_FIFOSTS_RXFULL_Pos) + + +/** + * @brief Get Tx full register value + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 Tx FIFO is not full. + * @retval >=1 Tx FIFO is full. + * + * @details This macro get Tx full register value. + * \hideinitializer + */ +#define UART_GET_TX_FULL(uart) ((uart)->FIFOSTS & UART_FIFOSTS_TXFULL_Msk) + + +/** + * @brief Get Rx full register value + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 Rx FIFO is not full. + * @retval >=1 Rx FIFO is full. + * + * @details This macro get Rx full register value. + * \hideinitializer + */ +#define UART_GET_RX_FULL(uart) ((uart)->FIFOSTS & UART_FIFOSTS_RXFULL_Msk) + + +/** + * @brief Enable specified UART interrupt + * + * @param[in] uart The pointer of the specified UART module + * @param[in] u32eIntSel Interrupt type select + * - \ref UART_INTEN_ABRIEN_Msk : Auto baud rate interrupt + * - \ref UART_INTEN_WKIEN_Msk : Wakeup interrupt + * - \ref UART_INTEN_BUFEIEN_Msk : Buffer Error interrupt + * - \ref UART_INTEN_RXTOIEN_Msk : Rx time-out interrupt + * - \ref UART_INTEN_MODEMIEN_Msk : Modem interrupt + * - \ref UART_INTEN_RLSIEN_Msk : Rx Line status interrupt + * - \ref UART_INTEN_THREIEN_Msk : Tx empty interrupt + * - \ref UART_INTEN_RDAIEN_Msk : Rx ready interrupt + * + * @return None + * + * @details This macro enable specified UART interrupt. + * \hideinitializer + */ +#define UART_ENABLE_INT(uart, u32eIntSel) ((uart)->INTEN |= (u32eIntSel)) + + +/** + * @brief Disable specified UART interrupt + * + * @param[in] uart The pointer of the specified UART module + * @param[in] u32eIntSel Interrupt type select + * - \ref UART_INTEN_ABRIEN_Msk : Auto baud rate interrupt + * - \ref UART_INTEN_WKIEN_Msk : Wakeup interrupt + * - \ref UART_INTEN_BUFEIEN_Msk : Buffer Error interrupt + * - \ref UART_INTEN_RXTOIEN_Msk : Rx time-out interrupt + * - \ref UART_INTEN_MODEMIEN_Msk : Modem status interrupt + * - \ref UART_INTEN_RLSIEN_Msk : Receive Line status interrupt + * - \ref UART_INTEN_THREIEN_Msk : Tx empty interrupt + * - \ref UART_INTEN_RDAIEN_Msk : Rx ready interrupt + * + * @return None + * + * @details This macro enable specified UART interrupt. + * \hideinitializer + */ +#define UART_DISABLE_INT(uart, u32eIntSel) ((uart)->INTEN &= ~ (u32eIntSel)) + + +/** + * @brief Get specified interrupt flag/status + * + * @param[in] uart The pointer of the specified UART module + * @param[in] u32eIntTypeFlag Interrupt Type Flag, should be + * - \ref UART_INTSTS_PBUFEINT_Msk : PDMA Mode Buffer Error Interrupt Indicator + * - \ref UART_INTSTS_PTOINT_Msk : PDMA Mode Time-out Interrupt Indicator + * - \ref UART_INTSTS_PMODINT_Msk : PDMA Mode MODEM Status Interrupt Indicator + * - \ref UART_INTSTS_PRLSINT_Msk : PDMA Mode Receive Line Status Interrupt Indicator + * - \ref UART_INTSTS_PBUFEIF_Msk : PDMA Mode Buffer Error Interrupt Flag + * - \ref UART_INTSTS_PTOIF_Msk : PDMA Mode Time-out Interrupt Flag + * - \ref UART_INTSTS_PMODIF_Msk : PDMA Mode MODEM Interrupt Flag + * - \ref UART_INTSTS_PRLSIF_Msk : PDMA Mode Receive Line Status Flag + * - \ref UART_INTSTS_BUFEINT_Msk : Buffer Error Interrupt Indicator + * - \ref UART_INTSTS_RXTOINT_Msk : Time-out Interrupt Indicator + * - \ref UART_INTSTS_MODEMINT_Msk : Modem Status Interrupt Indicator + * - \ref UART_INTSTS_RLSINT_Msk : Receive Line Status Interrupt Indicator + * - \ref UART_INTSTS_THREINT_Msk : Transmit Holding Register Empty Interrupt Indicator + * - \ref UART_INTSTS_RDAINT_Msk : Receive Data Available Interrupt Indicator + * - \ref UART_INTSTS_BUFEIF_Msk : Buffer Error Interrupt Flag + * - \ref UART_INTSTS_RXTOIF_Msk : Rx Time-out Interrupt Flag + * - \ref UART_INTSTS_MODEMIF_Msk : Modem Interrupt Flag + * - \ref UART_INTSTS_RLSIF_Msk : Receive Line Status Interrupt Flag + * - \ref UART_INTSTS_THREIF_Msk : Tx Empty Interrupt Flag + * - \ref UART_INTSTS_RDAIF_Msk : Rx Ready Interrupt Flag + * + * @retval 0 The specified interrupt is not happened. + * 1 The specified interrupt is happened. + * + * @details This macro get specified interrupt flag or interrupt indicator status. + * \hideinitializer + */ +#define UART_GET_INT_FLAG(uart,u32eIntTypeFlag) (((uart)->INTSTS & (u32eIntTypeFlag))?1:0) + + +/** + * @brief Clear RS-485 Address Byte Detection Flag + * + * @param[in] uart The pointer of the specified UART module + * + * @return None + * + * @details This macro clear RS-485 address byte detection flag. + * \hideinitializer + */ +#define UART_RS485_CLEAR_ADDR_FLAG(uart) ((uart)->FIFOSTS = UART_FIFOSTS_ADDRDETF_Msk) + + +/** + * @brief Get RS-485 Address Byte Detection Flag + * + * @param[in] uart The pointer of the specified UART module + * + * @retval 0 Receiver detects a data that is not an address bit. + * @retval 1 Receiver detects a data that is an address bit. + * + * @details This macro get RS-485 address byte detection flag. + * \hideinitializer + */ +#define UART_RS485_GET_ADDR_FLAG(uart) (((uart)->FIFOSTS & UART_FIFOSTS_ADDRDETF_Msk) >> UART_FIFOSTS_ADDRDETF_Pos) + +/* Declare these inline functions here to avoid MISRA C 2004 rule 8.1 error */ +__STATIC_INLINE void UART_CLEAR_RTS(UART_T *uart); +__STATIC_INLINE void UART_SET_RTS(UART_T *uart); + + +/** + * @brief Set RTS pin to low + * + * @param[in] uart The pointer of the specified UART module + * + * @return None + * + * @details This macro set RTS pin to low. + */ +__STATIC_INLINE void UART_CLEAR_RTS(UART_T *uart) +{ + uart->MODEM |= UART_MODEM_RTSACTLV_Msk; + uart->MODEM &= ~UART_MODEM_RTS_Msk; +} + + +/** + * @brief Set RTS pin to high + * + * @param[in] uart The pointer of the specified UART module + * + * @return None + * + * @details This macro set RTS pin to high. + */ +__STATIC_INLINE void UART_SET_RTS(UART_T *uart) +{ + uart->MODEM |= UART_MODEM_RTSACTLV_Msk | UART_MODEM_RTS_Msk; +} + +/** + * @brief Enable specified UART PDMA function + * + * @param[in] uart The pointer of the specified UART module + * @param[in] u32FuncSel Combination of following functions + * - \ref UART_INTEN_TXPDMAEN_Msk + * - \ref UART_INTEN_RXPDMAEN_Msk + * + * @return None + * + * \hideinitializer + */ +#define UART_PDMA_ENABLE(uart, u32FuncSel) ((uart)->INTEN |= (u32FuncSel)) +/** + * @brief Disable specified UART PDMA function + * + * @param[in] uart The pointer of the specified UART module + * @param[in] u32FuncSel Combination of following functions + * - \ref UART_INTEN_TXPDMAEN_Msk + * - \ref UART_INTEN_RXPDMAEN_Msk + * + * @return None + * + * \hideinitializer + */ +#define UART_PDMA_DISABLE(uart, u32FuncSel) ((uart)->INTEN &= ~(u32FuncSel)) + + +void UART_ClearIntFlag(UART_T *uart, uint32_t u32InterruptFlag); +void UART_Close(UART_T *uart); +void UART_DisableFlowCtrl(UART_T *uart); +void UART_DisableInt(UART_T *uart, uint32_t u32InterruptFlag); +void UART_EnableFlowCtrl(UART_T *uart); +void UART_EnableInt(UART_T *uart, uint32_t u32InterruptFlag); +void UART_Open(UART_T *uart, uint32_t u32baudrate); +uint32_t UART_Read(UART_T *uart, uint8_t pu8RxBuf[], uint32_t u32ReadBytes); +void UART_SetLineConfig(UART_T *uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits); +void UART_SetTimeoutCnt(UART_T *uart, uint32_t u32TOC); +void UART_SelectIrDAMode(UART_T *uart, uint32_t u32Buadrate, uint32_t u32Direction); +void UART_SelectRS485Mode(UART_T *uart, uint32_t u32Mode, uint32_t u32Addr); +uint32_t UART_Write(UART_T *uart, uint8_t pu8TxBuf[], uint32_t u32WriteBytes); + + + + +/*@}*/ /* end of group UART_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group UART_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /*__NU_UART_H__*/ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_wdt.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_wdt.h new file mode 100644 index 0000000000..5e8398e383 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_wdt.h @@ -0,0 +1,214 @@ +/**************************************************************************//** + * @file nu_wdt.h + * @brief WDT driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_WDT_H__ +#define __NU_WDT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup WDT_Driver WDT Driver + @{ +*/ + +/** @addtogroup WDT_EXPORTED_CONSTANTS WDT Exported Constants + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* WDT Time-out Interval Period Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define WDT_TIMEOUT_2POW4 (0UL << WDT_CTL_TOUTSEL_Pos) /*!< Setting WDT time-out interval to 2^4 * WDT clocks \hideinitializer */ +#define WDT_TIMEOUT_2POW6 (1UL << WDT_CTL_TOUTSEL_Pos) /*!< Setting WDT time-out interval to 2^6 * WDT clocks \hideinitializer */ +#define WDT_TIMEOUT_2POW8 (2UL << WDT_CTL_TOUTSEL_Pos) /*!< Setting WDT time-out interval to 2^8 * WDT clocks \hideinitializer */ +#define WDT_TIMEOUT_2POW10 (3UL << WDT_CTL_TOUTSEL_Pos) /*!< Setting WDT time-out interval to 2^10 * WDT clocks \hideinitializer */ +#define WDT_TIMEOUT_2POW12 (4UL << WDT_CTL_TOUTSEL_Pos) /*!< Setting WDT time-out interval to 2^12 * WDT clocks \hideinitializer */ +#define WDT_TIMEOUT_2POW14 (5UL << WDT_CTL_TOUTSEL_Pos) /*!< Setting WDT time-out interval to 2^14 * WDT clocks \hideinitializer */ +#define WDT_TIMEOUT_2POW16 (6UL << WDT_CTL_TOUTSEL_Pos) /*!< Setting WDT time-out interval to 2^16 * WDT clocks \hideinitializer */ +#define WDT_TIMEOUT_2POW18 (7UL << WDT_CTL_TOUTSEL_Pos) /*!< Setting WDT time-out interval to 2^18 * WDT clocks \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* WDT Reset Delay Period Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define WDT_RESET_DELAY_1026CLK (0UL << WDT_ALTCTL_RSTDSEL_Pos) /*!< Setting WDT reset delay period to 1026 * WDT clocks \hideinitializer */ +#define WDT_RESET_DELAY_130CLK (1UL << WDT_ALTCTL_RSTDSEL_Pos) /*!< Setting WDT reset delay period to 130 * WDT clocks \hideinitializer */ +#define WDT_RESET_DELAY_18CLK (2UL << WDT_ALTCTL_RSTDSEL_Pos) /*!< Setting WDT reset delay period to 18 * WDT clocks \hideinitializer */ +#define WDT_RESET_DELAY_3CLK (3UL << WDT_ALTCTL_RSTDSEL_Pos) /*!< Setting WDT reset delay period to 3 * WDT clocks \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* WDT Free Reset Counter Keyword Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define WDT_RESET_COUNTER_KEYWORD (0x00005AA5UL) /*!< Fill this value to WDT_RSTCNT register to free reset WDT counter \hideinitializer */ + +/*@}*/ /* end of group WDT_EXPORTED_CONSTANTS */ + + +/** @addtogroup WDT_EXPORTED_FUNCTIONS WDT Exported Functions + @{ +*/ + +/** + * @brief Clear WDT Reset System Flag + * + * @param wdt + * + * @return None + * + * @details This macro clears WDT time-out reset system flag. + * \hideinitializer + */ +#define WDT_CLEAR_RESET_FLAG(wdt) (wdt->CTL = (wdt->CTL & ~(WDT_CTL_IF_Msk | WDT_CTL_WKF_Msk)) | WDT_CTL_RSTF_Msk) + +/** + * @brief Clear WDT Time-out Interrupt Flag + * + * @param wdt + * + * @return None + * + * @details This macro clears WDT time-out interrupt flag. + * \hideinitializer + */ +#define WDT_CLEAR_TIMEOUT_INT_FLAG(wdt) (wdt->CTL = (wdt->CTL & ~(WDT_CTL_RSTF_Msk | WDT_CTL_WKF_Msk)) | WDT_CTL_IF_Msk) + +/** + * @brief Clear WDT Wake-up Flag + * + * @param wdt + * + * @return None + * + * @details This macro clears WDT time-out wake-up system flag. + * \hideinitializer + */ +#define WDT_CLEAR_TIMEOUT_WAKEUP_FLAG(wdt) (wdt->CTL = (wdt->CTL & ~(WDT_CTL_RSTF_Msk | WDT_CTL_IF_Msk)) | WDT_CTL_WKF_Msk) + +/** + * @brief Get WDT Time-out Reset Flag + * + * @param wdt + * + * @retval 0 WDT time-out reset system did not occur + * @retval 1 WDT time-out reset system occurred + * + * @details This macro indicates system has been reset by WDT time-out reset or not. + * \hideinitializer + */ +#define WDT_GET_RESET_FLAG(wdt) ((wdt->CTL & WDT_CTL_RSTF_Msk)? 1UL : 0UL) + +/** + * @brief Get WDT Time-out Interrupt Flag + * + * @param wdt + * + * @retval 0 WDT time-out interrupt did not occur + * @retval 1 WDT time-out interrupt occurred + * + * @details This macro indicates WDT time-out interrupt occurred or not. + * \hideinitializer + */ +#define WDT_GET_TIMEOUT_INT_FLAG(wdt) ((wdt->CTL & WDT_CTL_IF_Msk)? 1UL : 0UL) + +/** + * @brief Get WDT Time-out Wake-up Flag + * + * @param wdt + * + * @retval 0 WDT time-out interrupt does not cause CPU wake-up + * @retval 1 WDT time-out interrupt event cause CPU wake-up + * + * @details This macro indicates WDT time-out interrupt event has waked up system or not. + * \hideinitializer + */ +#define WDT_GET_TIMEOUT_WAKEUP_FLAG(wdt) ((wdt->CTL & WDT_CTL_WKF_Msk)? 1UL : 0UL) + +/** + * @brief Reset WDT Counter + * + * @param wdt + * + * @return None + * + * @details This macro is used to reset the internal 18-bit WDT up counter value. + * @note If WDT is activated and time-out reset system function is enabled also, user should \n + * reset the 18-bit WDT up counter value to avoid generate WDT time-out reset signal to \n + * reset system before the WDT time-out reset delay period expires. + * \hideinitializer + */ +#define WDT_RESET_COUNTER(wdt) (wdt->RSTCNT = WDT_RESET_COUNTER_KEYWORD) + +/* Declare these inline functions here to avoid MISRA C 2004 rule 8.1 error */ +__STATIC_INLINE void WDT_Close(WDT_T *wdt); +__STATIC_INLINE void WDT_EnableInt(WDT_T *wdt); +__STATIC_INLINE void WDT_DisableInt(WDT_T *wdt); + +/** + * @brief Stop WDT Counting + * + * @param None + * + * @return None + * + * @details This function will stop WDT counting and disable WDT module. + */ +__STATIC_INLINE void WDT_Close(WDT_T *wdt) +{ + wdt->CTL = 0UL; + return; +} + +/** + * @brief Enable WDT Time-out Interrupt + * + * @param None + * + * @return None + * + * @details This function will enable the WDT time-out interrupt function. + */ +__STATIC_INLINE void WDT_EnableInt(WDT_T *wdt) +{ + wdt->CTL |= WDT_CTL_INTEN_Msk; + return; +} + +/** + * @brief Disable WDT Time-out Interrupt + * + * @param None + * + * @return None + * + * @details This function will disable the WDT time-out interrupt function. + */ +__STATIC_INLINE void WDT_DisableInt(WDT_T *wdt) +{ + /* Do not touch another write 1 clear bits */ + wdt->CTL &= ~(WDT_CTL_INTEN_Msk | WDT_CTL_RSTF_Msk | WDT_CTL_IF_Msk | WDT_CTL_WKF_Msk); + return; +} + +void WDT_Open(WDT_T *wdt, uint32_t u32TimeoutInterval, uint32_t u32ResetDelay, uint32_t u32EnableReset, uint32_t u32EnableWakeup); + +/*@}*/ /* end of group WDT_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group WDT_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_WDT_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_whc.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_whc.h new file mode 100644 index 0000000000..32ccc070b7 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_whc.h @@ -0,0 +1,279 @@ +/**************************************************************************//** + * @file nu_whc.h + * @brief WHC driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_WHC_H__ +#define __NU_WHC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup WHC_Driver WHC Driver + @{ +*/ + +/** @addtogroup WHC_EXPORTED_CONSTANTS WHC Exported Constants + @{ +*/ +#define WHC_CH 4ul /*!TXCTL |= (1ul << (u32Ch + WHC_TXCTL_CH0RC_Pos))) + +/** + * @brief + * + * @param[in] whc The pointer of the specified WHC module. + * @param[in] u32Ch WHC channel, valid channel numbers are 0~3 + * \hideinitializer + */ +#define WHC_IS_TX_READY(whc, u32Ch) ((whc)->TXSTS & (1 << u32Ch)) + +/** + * @brief + * + * @param[in] whc The pointer of the specified WHC module. + * @param[in] u32Ch WHC channel, valid channel numbers are 0~3 + * \hideinitializer + */ +#define WHC_IS_RX_READY(whc, u32Ch) ((whc)->RXSTS & (1 << u32Ch)) + +/** + * @brief Enable specified WHC interrupt + * + * @param[in] whc The pointer of the specified WHC module + * @param[in] u32IntSel Interrupt type select + * - \ref WHC_INTEN_RST0IEN_Msk + * - \ref WHC_INTEN_POFF0IEN_Msk + * - \ref WHC_INTEN_PD0IEN_Msk + * - \ref WHC_INTEN_RST1IEN_Msk + * - \ref WHC_INTEN_POFF1IEN_Msk + * - \ref WHC_INTEN_PD1IEN_Msk + * - \ref WHC_INTEN_GI0IEN_Msk + * - \ref WHC_INTEN_GI1IEN_Msk + * - \ref WHC_INTEN_GI2IEN_Msk + * - \ref WHC_INTEN_GI3IEN_Msk + * - \ref WHC_INTEN_TX0IEN_Msk + * - \ref WHC_INTEN_TX1IEN_Msk + * - \ref WHC_INTEN_TX2IEN_Msk + * - \ref WHC_INTEN_TX3IEN_Msk + * - \ref WHC_INTEN_RX0IEN_Msk + * - \ref WHC_INTEN_RX1IEN_Msk + * - \ref WHC_INTEN_RX2IEN_Msk + * - \ref WHC_INTEN_RX3IEN_Msk + * \hideinitializer + */ +#define WHC_ENABLE_INT(whc, u32IntSel) ((whc)->INTEN |= (u32IntSel)) + + +/** + * @brief Disable specified WHC interrupt + * + * @param[in] whc The pointer of the specified WHC module + * @param[in] u32IntSel Interrupt type select + * - \ref WHC_INTEN_RST0IEN_Msk + * - \ref WHC_INTEN_POFF0IEN_Msk + * - \ref WHC_INTEN_PD0IEN_Msk + * - \ref WHC_INTEN_RST1IEN_Msk + * - \ref WHC_INTEN_POFF1IEN_Msk + * - \ref WHC_INTEN_PD1IEN_Msk + * - \ref WHC_INTEN_GI0IEN_Msk + * - \ref WHC_INTEN_GI1IEN_Msk + * - \ref WHC_INTEN_GI2IEN_Msk + * - \ref WHC_INTEN_GI3IEN_Msk + * - \ref WHC_INTEN_TX0IEN_Msk + * - \ref WHC_INTEN_TX1IEN_Msk + * - \ref WHC_INTEN_TX2IEN_Msk + * - \ref WHC_INTEN_TX3IEN_Msk + * - \ref WHC_INTEN_RX0IEN_Msk + * - \ref WHC_INTEN_RX1IEN_Msk + * - \ref WHC_INTEN_RX2IEN_Msk + * - \ref WHC_INTEN_RX3IEN_Msk + * \hideinitializer + */ +#define WHC_DISABLE_INT(whc, u32IntSel) ((whc)->INTEN &= ~(u32IntSel)) + +/** + * @brief Get specified interrupt flag + * + * @param[in] whc The pointer of the specified WHC module + * @param[in] u32IntTypeFlag Interrupt Type Flag, should be + * - \ref WHC_INTSTS_RST0IF_Msk + * - \ref WHC_INTSTS_POFF0IF_Msk + * - \ref WHC_INTSTS_PD0IF_Msk + * - \ref WHC_INTSTS_RST1IF_Msk + * - \ref WHC_INTSTS_POFF1IF_Msk + * - \ref WHC_INTSTS_PD1IF_Msk + * - \ref WHC_INTSTS_GI0IF_Msk + * - \ref WHC_INTSTS_GI1IF_Msk + * - \ref WHC_INTSTS_GI2IF_Msk + * - \ref WHC_INTSTS_GI3IF_Msk + * - \ref WHC_INTSTS_TX0IF_Msk + * - \ref WHC_INTSTS_TX1IF_Msk + * - \ref WHC_INTSTS_TX2IF_Msk + * - \ref WHC_INTSTS_TX3IF_Msk + * - \ref WHC_INTSTS_RX0IF_Msk + * - \ref WHC_INTSTS_RX1IF_Msk + * - \ref WHC_INTSTS_RX2IF_Msk + * - \ref WHC_INTSTS_RX3IF_Msk + * + * @retval 0 The specified interrupt is not happened. + * 1 The specified interrupt is happened. + * \hideinitializer + */ +#define WHC_GET_INT_FLAG(whc, u32IntTypeFlag) (((whc)->INTSTS & (u32IntTypeFlag))?1:0) + +/** + * @brief Clear specified interrupt flag + * + * @param[in] whc The pointer of the specified WHC module + * @param[in] u32IntTypeFlag Interrupt Type Flag, should be + * - \ref WHC_INTSTS_RST0IF_Msk + * - \ref WHC_INTSTS_POFF0IF_Msk + * - \ref WHC_INTSTS_PD0IF_Msk + * - \ref WHC_INTSTS_RST1IF_Msk + * - \ref WHC_INTSTS_POFF1IF_Msk + * - \ref WHC_INTSTS_PD1IF_Msk + * - \ref WHC_INTSTS_GI0IF_Msk + * - \ref WHC_INTSTS_GI1IF_Msk + * - \ref WHC_INTSTS_GI2IF_Msk + * - \ref WHC_INTSTS_GI3IF_Msk + * - \ref WHC_INTSTS_TX0IF_Msk + * - \ref WHC_INTSTS_TX1IF_Msk + * - \ref WHC_INTSTS_TX2IF_Msk + * - \ref WHC_INTSTS_TX3IF_Msk + * - \ref WHC_INTSTS_RX0IF_Msk + * - \ref WHC_INTSTS_RX1IF_Msk + * - \ref WHC_INTSTS_RX2IF_Msk + * - \ref WHC_INTSTS_RX3IF_Msk + * \hideinitializer + */ +#define WHC_CLR_INT_FLAG(whc, u32IntTypeFlag) ((whc)->INTSTS = (u32IntTypeFlag)) + +/** + * @brief Trigger WHC general event interrupt + * @param[in] whc The pointer of the specified WHC module + * @param[in] u32IntNum General event interrupt number, valid number are 0~3 + * + * \hideinitializer + */ +#define WHC_TRIGGER_GINT(whc, u32IntNum) ((whc)->GINTTRG = (1ul << u32IntNum)) + +/** + * @brief Get counter part reset flag + * @param[in] whc The pointer of the specified WHC module + * @retval The combination of WHC_CPSTS_WDTRF_Msk, WHC_CPSTS_SYSRF_Msk, and WHC_CPSTS_CPURF_Msk + * + * \hideinitializer + */ +#define WHC_GET_RST_FLAG(whc) ((whc)->CPSTS & (WHC_CPSTS_WDTRF_Msk | WHC_CPSTS_SYSRF_Msk | WHC_CPSTS_CPURF_Msk)) + +/** + * @brief Clear counter part reset flag + * @param[in] whc The pointer of the specified WHC module + * + * \hideinitializer + */ +#define WHC_CLR_RST_FLAG(whc) ((whc)->CPSTS = (whc)->CPSTS) + + +/** + * @brief Set wakeup up source + * + * @param[in] whc The pointer of the specified WHC module + * @param[in] u32WakeupSrc Wake up source. Should be the combination of: + * - \ref WHC_WKCTL_RST0WKEN_Msk + * - \ref WHC_WKCTL_POFF0WKEN_Msk + * - \ref WHC_WKCTL_PD0WKEN_Msk + * - \ref WHC_WKCTL_RST1WKEN_Msk + * - \ref WHC_WKCTL_POFF1WKEN_Msk + * - \ref WHC_WKCTL_PD1WKEN_Msk + * - \ref WHC_WKCTL_GI0WKEN_Msk + * - \ref WHC_WKCTL_GI1WKEN_Msk + * - \ref WHC_WKCTL_GI2WKEN_Msk + * - \ref WHC_WKCTL_GI3WKEN_Msk + * - \ref WHC_WKCTL_TX0WKEN_Msk + * - \ref WHC_WKCTL_TX1WKEN_Msk + * - \ref WHC_WKCTL_TX2WKEN_Msk + * - \ref WHC_WKCTL_TX3WKEN_Msk + * - \ref WHC_WKCTL_RX0WKEN_Msk + * - \ref WHC_WKCTL_RX1WKEN_Msk + * - \ref WHC_WKCTL_RX2WKEN_Msk + * - \ref WHC_WKCTL_RX3WKEN_Msk + * \hideinitializer + */ +#define WHC_SET_WAKEUP_SRC(whc,u32WakeFlag) ((whc)->WKCTL |= (u32WakeFlag)) + + +/** + * @brief Clear wakeup up source + * + * @param[in] whc The pointer of the specified WHC module + * @param[in] u32WakeupSrc Wake up source. Should be the combination of: + * - \ref WHC_WKCTL_RST0WKEN_Msk + * - \ref WHC_WKCTL_POFF0WKEN_Msk + * - \ref WHC_WKCTL_PD0WKEN_Msk + * - \ref WHC_WKCTL_RST1WKEN_Msk + * - \ref WHC_WKCTL_POFF1WKEN_Msk + * - \ref WHC_WKCTL_PD1WKEN_Msk + * - \ref WHC_WKCTL_GI0WKEN_Msk + * - \ref WHC_WKCTL_GI1WKEN_Msk + * - \ref WHC_WKCTL_GI2WKEN_Msk + * - \ref WHC_WKCTL_GI3WKEN_Msk + * - \ref WHC_WKCTL_TX0WKEN_Msk + * - \ref WHC_WKCTL_TX1WKEN_Msk + * - \ref WHC_WKCTL_TX2WKEN_Msk + * - \ref WHC_WKCTL_TX3WKEN_Msk + * - \ref WHC_WKCTL_RX0WKEN_Msk + * - \ref WHC_WKCTL_RX1WKEN_Msk + * - \ref WHC_WKCTL_RX2WKEN_Msk + * - \ref WHC_WKCTL_RX3WKEN_Msk + * \hideinitializer + */ +#define WHC_CLR_WAKEUP_SRC(whc,u32WakeFlag) ((whc)->WKCTL &= ~(u32WakeFlag)) + +int WHC_Send(WHC_T *whc, uint32_t u32Ch, uint32_t *pu32TxBuf); +int WHC_Recv(WHC_T *whc, uint32_t u32Ch, uint32_t *pu32RxBuf); +int WHC_GetCPSts(WHC_T *whc, uint32_t u32Core); + + +/*@}*/ /* end of group WHC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group WHC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_wwdt.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_wwdt.h new file mode 100644 index 0000000000..054876a92d --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_wwdt.h @@ -0,0 +1,150 @@ +/**************************************************************************//** + * @file nu_wwdt.h + * @brief WWDT driver header file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __NU_WWDT_H__ +#define __NU_WWDT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup WWDT_Driver WWDT Driver + @{ +*/ + +/** @addtogroup WWDT_EXPORTED_CONSTANTS WWDT Exported Constants + @{ +*/ +/*---------------------------------------------------------------------------------------------------------*/ +/* WWDT Prescale Period Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define WWDT_PRESCALER_1 (0 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 1 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_2 (1 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 2 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_4 (2 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 4 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_8 (3 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 8 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_16 (4 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 16 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_32 (5 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 32 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_64 (6 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 64 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_128 (7 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 128 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_192 (8 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 192 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_256 (9 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 256 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_384 (10 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 384 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_512 (11 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 512 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_768 (12 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 768 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_1024 (13 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 1024 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_1536 (14 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 1536 * (64*WWDT_CLK) \hideinitializer */ +#define WWDT_PRESCALER_2048 (15 << WWDT_CTL_PSCSEL_Pos) /*!< Select max time-out period to 2048 * (64*WWDT_CLK) \hideinitializer */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* WWDT Reload Counter Keyword Constant Definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define WWDT_RELOAD_WORD (0x00005AA5) /*!< Fill this value to WWDT_RLDCNT register to reload WWDT counter \hideinitializer */ + +/*@}*/ /* end of group WWDT_EXPORTED_CONSTANTS */ + + +/** @addtogroup WWDT_EXPORTED_FUNCTIONS WWDT Exported Functions + @{ +*/ + +/** + * @brief Clear WWDT Reset System Flag + * + * @param None + * + * @return None + * + * @details This macro is used to clear WWDT time-out reset system flag. + * \hideinitializer + */ +#define WWDT_CLEAR_RESET_FLAG() (WWDT2->STATUS = WWDT_STATUS_WWDTRF_Msk) + +/** + * @brief Clear WWDT Compared Match Interrupt Flag + * + * @param None + * + * @return None + * + * @details This macro is used to clear WWDT compared match interrupt flag. + * \hideinitializer + */ +#define WWDT_CLEAR_INT_FLAG() (WWDT2->STATUS = WWDT_STATUS_WWDTIF_Msk) + +/** + * @brief Get WWDT Reset System Flag + * + * @param None + * + * @retval 0 WWDT time-out reset system did not occur + * @retval 1 WWDT time-out reset system occurred + * + * @details This macro is used to indicate system has been reset by WWDT time-out reset or not. + * \hideinitializer + */ +#define WWDT_GET_RESET_FLAG() ((WWDT2->STATUS & WWDT_STATUS_WWDTRF_Msk)? 1 : 0) + +/** + * @brief Get WWDT Compared Match Interrupt Flag + * + * @param None + * + * @retval 0 WWDT compare match interrupt did not occur + * @retval 1 WWDT compare match interrupt occurred + * + * @details This macro is used to indicate WWDT counter value matches CMPDAT value or not. + * \hideinitializer + */ +#define WWDT_GET_INT_FLAG() ((WWDT2->STATUS & WWDT_STATUS_WWDTIF_Msk)? 1 : 0) + +/** + * @brief Get WWDT Counter + * + * @param None + * + * @return WWDT Counter Value + * + * @details This macro reflects the current WWDT counter value. + * \hideinitializer + */ +#define WWDT_GET_COUNTER() (WWDT2->CNT) + +/** + * @brief Reload WWDT Counter + * + * @param None + * + * @return None + * + * @details This macro is used to reload the WWDT counter value to 0x3F. + * @note User can only write WWDT_RLDCNT register to reload WWDT counter value when current WWDT counter value \n + * between 0 and CMPDAT value. If user writes WWDT_RLDCNT when current WWDT counter value is larger than CMPDAT, \n + * WWDT reset signal will generate immediately to reset system. + * \hideinitializer + */ +#define WWDT_RELOAD_COUNTER() (WWDT2->RLDCNT = WWDT_RELOAD_WORD) + +void WWDT_Open(uint32_t u32PreScale, uint32_t u32CmpValue, uint32_t u32EnableInt); + +/*@}*/ /* end of group WWDT_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group WWDT_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NU_WWDT_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_adc.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_adc.c new file mode 100644 index 0000000000..d8dfdf1342 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_adc.c @@ -0,0 +1,87 @@ +/**************************************************************************//** + * @file adc.c + * @brief ADC driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright(C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup ADC_Driver ADC Driver + @{ +*/ + + +/** @addtogroup ADC_EXPORTED_FUNCTIONS ADC Exported Functions + @{ +*/ + +/** + * @brief This API configures ADC module to be ready for convert the input from selected channel + * @param[in] adc Base address of ADC module + * @param[in] u32InputMode Input mode. Valid values are: + * - \ref ADC_INPUT_MODE_NORMAL_CONV + * - \ref ADC_INPUT_MODE_4WIRE_TOUCH + * - \ref ADC_INPUT_MODE_5WIRE_TOUCH + * @param[in] u32OpMode Could be + * - \ref ADC_HIGH_SPEED_MODE + * - \ref ADC_NORMAL_SPEED_MODE + * @param[in] u32ChMask Channel enable bit. Each bit corresponds to a input channel. Bit 0 is channel 0, bit 1 is channel 1... + * This parameter is only used while u32InputMode set to ADC_INPUT_MODE_NORMAL_CONV. + * @return None + * @note ADC can only convert 1 channel at a time. If more than 1 channels are enabled, only channel + * with smallest number will be convert. + * @note This API does not turn on ADC power nor does trigger ADC conversion + */ +void ADC_Open(ADC_T *adc, + uint32_t u32InputMode, + uint32_t u32OpMode, + uint32_t u32ChMask) +{ + uint32_t u32Ch = 0, i; + + if (u32InputMode == ADC_INPUT_MODE_NORMAL_CONV) + { + for (i = 0; i < ADC_CH_NUM; i++) + { + if (u32ChMask & (1 << i)) + { + u32Ch = i; + break; + } + } + adc->CONF = (u32Ch << ADC_CONF_CHSEL_Pos) | u32OpMode | ADC_CONF_NACEN_Msk; + } + else if (u32InputMode == ADC_INPUT_MODE_4WIRE_TOUCH) + { + adc->CONF = 0; + } + else // 5-wire mode + { + adc->CTL |= ADC_CTL_WMSWCH_Msk; + adc->CONF = 0; + } +} + +/** + * @brief Disable ADC module + * @param[in] adc Base address of ADC module + * @return None + */ +void ADC_Close(ADC_T *adc) +{ + adc->CTL = 0; + adc->CONF = 0; + adc->IER = 0; + adc->ISR = adc->ISR; +} + +/*@}*/ /* end of group ADC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group ADC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_canfd.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_canfd.c new file mode 100644 index 0000000000..55c15dfaec --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_canfd.c @@ -0,0 +1,1894 @@ +/**************************************************************************//** + * @file canfd.c + * @brief CANFD driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#include "NuMicro.h" +#include "string.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Minimum number of time quanta in a bit. */ +#define MIN_TIME_QUANTA 9ul +/* Maximum number of time quanta in a bit. */ +#define MAX_TIME_QUANTA 20ul +/* Number of receive FIFOs (1 - 2) */ +#define CANFD_NUM_RX_FIFOS 2ul + +/*CANFD max nominal bit rate*/ +#define MAX_NOMINAL_BAUDRATE (1000000UL) + +/* Tx Event FIFO Element ESI(Error State Indicator) */ +#define TX_FIFO_E0_EVENT_ESI_Pos (31) +#define TX_FIFO_E0_EVENT_ESI_Msk (0x1ul << TX_FIFO_E0_EVENT_ESI_Pos) + +/* Tx Event FIFO Element XTD(Extended Identifier) */ +#define TX_FIFO_E0_EVENT_XTD_Pos (30) +#define TX_FIFO_E0_EVENT_XTD_Msk (0x1ul << TX_FIFO_E0_EVENT_XTD_Pos) + +/* Tx Event FIFO Element RTR(Remote Transmission Request) */ +#define TX_FIFO_E0_EVENT_RTR_Pos (29) +#define TX_FIFO_E0_EVENT_RTR_Msk (0x1ul << TX_FIFO_E0_EVENT_RTR_Pos) + +/* Tx Event FIFO Element ID(Identifier) */ +#define TX_FIFO_E0_EVENT_ID_Pos (0) +#define TX_FIFO_E0_EVENT_ID_Msk (0x1FFFFFFFul << TX_FIFO_E0_EVENT_ID_Pos) + +/* Tx Event FIFO Element MM(Message Marker) */ +#define TX_FIFO_E1_EVENT_MM_Pos (24) +#define TX_FIFO_E1_EVENT_MM_Msk (0xFFul << TX_FIFO_E1_EVENT_MM_Pos) + +/* Tx Event FIFO Element ET(Event Type) */ +#define TX_FIFO_E1_EVENT_ET_Pos (22) +#define TX_FIFO_E1_EVENT_ET_Msk (0x3ul << TX_FIFO_E1_EVENT_ET_Pos) + +/* Tx Event FIFO Element FDF(FD Format) */ +#define TX_FIFO_E1_EVENT_FDF_Pos (21) +#define TX_FIFO_E1_EVENT_FDF_Msk (0x1ul << TX_FIFO_E1_EVENT_FDF_Pos) + +/* Tx Event FIFO Element BRS(Bit Rate Switch) */ +#define TX_FIFO_E1_EVENT_BRS_Pos (20) +#define TX_FIFO_E1_EVENT_BRS_Msk (0x1ul << TX_FIFO_E1_EVENT_BRS_Pos) + +/* Tx Event FIFO Element DLC(Data Length Code) */ +#define TX_FIFO_E1_EVENT_DLC_Pos (16) +#define TX_FIFO_E1_EVENT_DLC_Msk (0xFul << TX_FIFO_E1_EVENT_DLC_Pos) + +/* Tx Event FIFO Element TXTS(Tx Timestamp) */ +#define TX_FIFO_E1A_EVENT_TXTS_Pos (0) +#define TX_FIFO_E1A_EVENT_TXTS_Msk (0xFFFFul << TX_FIFO_E1A_EVENT_TXTS_Pos) + +/* Tx Event FIFO Element MM(Message Marker) */ +#define TX_FIFO_E1B_EVENT_MM_Pos (8) +#define TX_FIFO_E1B_EVENT_MM_Msk (0xFFul << TX_FIFO_E1B_EVENT_MM_Pos) + +/* Tx Event FIFO Element TSC(Timestamp Captured) */ +#define TX_FIFO_E1B_EVENT_TSC_Pos (4) +#define TX_FIFO_E1B_EVENT_TSC_Msk (0x1ul << TX_FIFO_E1B_EVENT_TSC_Pos) + +/* Tx Event FIFO Element TSC(Timestamp Captured) */ +#define TX_FIFO_E1B_EVENT_TXTS_Pos (0) +#define TX_FIFO_E1B_EVENT_TXTS_Msk (0xFul << TX_FIFO_E1B_EVENT_TSC_Pos) + +/* Rx Buffer and FIFO Element ESI2(Error State Indicator) */ +#define RX_BUFFER_AND_FIFO_R0_ELEM_ESI_Pos (31) +#define RX_BUFFER_AND_FIFO_R0_ELEM_ESI_Msk (0x1ul << RX_BUFFER_AND_FIFO_R0_ELEM_ESI_Pos) + +/* Rx Buffer and FIFO Element XTD(Extended Identifier) */ +#define RX_BUFFER_AND_FIFO_R0_ELEM_XTD_Pos (30) +#define RX_BUFFER_AND_FIFO_R0_ELEM_XTD_Msk (0x1ul << RX_BUFFER_AND_FIFO_R0_ELEM_XTD_Pos) + +/* Rx Buffer and FIFO Element RTR(Remote Transmission Request) */ +#define RX_BUFFER_AND_FIFO_R0_ELEM_RTR_Pos (29) +#define RX_BUFFER_AND_FIFO_R0_ELEM_RTR_Msk (0x1ul << RX_BUFFER_AND_FIFO_R0_ELEM_RTR_Pos) + +/* Rx Buffer and FIFO Element ID(Identifier) */ +#define RX_BUFFER_AND_FIFO_R0_ELEM_ID_Pos (0) +#define RX_BUFFER_AND_FIFO_R0_ELEM_ID_Msk (0x1FFFFFFFul << RX_BUFFER_AND_FIFO_R0_ELEM_ID_Pos) + +/* Rx Buffer and FIFO Element ANMF(Accepted Non-matching Frame) */ +#define RX_BUFFER_AND_FIFO_R1_ELEM_ANMF_Pos (31) +#define RX_BUFFER_AND_FIFO_R1_ELEM_ANMF_Msk (0x1ul << RX_BUFFER_AND_FIFO_R1_ELEM_ANMF_Pos) + +/* Rx Buffer and FIFO Element FIDX(Filter Index) */ +#define RX_BUFFER_AND_FIFO_R1_ELEM_FIDX_Pos (24) +#define RX_BUFFER_AND_FIFO_R1_ELEM_FIDX_Msk (0x7Ful << RX_BUFFER_AND_FIFO_R1_ELEM_FIDX_Pos) + +/* Rx Buffer and FIFO Element FDF(FD Format) */ +#define RX_BUFFER_AND_FIFO_R1_ELEM_FDF_Pos (21) +#define RX_BUFFER_AND_FIFO_R1_ELEM_FDF_Msk (0x1ul << RX_BUFFER_AND_FIFO_R1_ELEM_FDF_Pos) + +/* Rx Buffer and FIFO Element BRS(Bit Rate Swit) */ +#define RX_BUFFER_AND_FIFO_R1_ELEM_BSR_Pos (20) +#define RX_BUFFER_AND_FIFO_R1_ELEM_BSR_Msk (0x1ul << RX_BUFFER_AND_FIFO_R1_ELEM_BSR_Pos) + +/* Rx Buffer and FIFO Element DLC(Bit Rate Swit) */ +#define RX_BUFFER_AND_FIFO_R1_ELEM_DLC_Pos (16) +#define RX_BUFFER_AND_FIFO_R1_ELEM_DLC_Msk (0xFul << RX_BUFFER_AND_FIFO_R1_ELEM_DLC_Pos) + +/* Rx Buffer and FIFO Element RXTS(Rx Timestamp) */ +#define RX_BUFFER_AND_FIFO_R1_ELEM_RXTS_Pos (0) +#define RX_BUFFER_AND_FIFO_R1_ELEM_RXTS_Msk (0xFFFFul << RX_BUFFER_AND_FIFO_R1_ELEM_RXTS_Pos) + +/* Tx Buffer Element ESI(Error State Indicator) */ +#define TX_BUFFER_T0_ELEM_ESI_Pos (31) +#define TX_BUFFER_T0_ELEM_ESI_Msk (0x1ul << TX_BUFFER_T0_ELEM_ESI_Pos) + +/* Tx Buffer Element XTD(Extended Identifier) */ +#define TX_BUFFER_T0_ELEM_XTD_Pos (30) +#define TX_BUFFER_T0_ELEM_XTD_Msk (0x1ul << TX_BUFFER_T0_ELEM_XTD_Pos) + +/* Tx Buffer RTR(Remote Transmission Request) */ +#define TX_BUFFER_T0_ELEM_RTR_Pos (29) +#define TX_BUFFER_T0_ELEM_RTR_Msk (0x1ul << TX_BUFFER_T0_ELEM_RTR_Pos) + +/* Tx Buffer Element ID(Identifier) */ +#define TX_BUFFER_T0_ELEM_ID_Pos (0) +#define TX_BUFFER_T0_ELEM_ID_Msk (0x1FFFFFFFul << TX_BUFFER_T0_ELEM_ID_Pos) + +/* Tx Buffer Element MM(Message Marker) */ +#define TX_BUFFER_T1_ELEM_MM1_Pos (24) +#define TX_BUFFER_T1_ELEM_MM1_Msk (0xFFul << TX_BUFFER_T1_ELEM_MM1_Pos) + +/* Tx Buffer Element EFC(Event FIFO Control) */ +#define TX_BUFFER_T1_ELEM_EFC_Pos (23) +#define TX_BUFFER_T1_ELEM_EFC_Msk (0xFFul << TX_BUFFER_T1_ELEM_EFC_Pos) + +/* Tx Buffer Element TSCE(Time Stamp Capture Enable for TSU) */ +#define TX_BUFFER_T1_ELEM_TSCE_Pos (22) +#define TX_BUFFER_T1_ELEM_TSCE_Msk (0x1ul << TX_BUFFER_T1_ELEM_TSCE_Pos) + +/* Tx Buffer Element FDF(FD Format) */ +#define TX_BUFFER_T1_ELEM_FDF_Pos (21) +#define TX_BUFFER_T1_ELEM_FDF_Msk (0x1ul << TX_BUFFER_T1_ELEM_FDF_Pos) + +/* Tx Buffer Element BRS(Bit Rate Swit) */ +#define TX_BUFFER_T1_ELEM_BSR_Pos (20) +#define TX_BUFFER_T1_ELEM_BSR_Msk (0x1ul << TX_BUFFER_T1_ELEM_BSR_Pos) + +/* Tx Buffer Element DLC(Bit Rate Swit) */ +#define TX_BUFFER_T1_ELEM_DLC_Pos (16) +#define TX_BUFFER_T1_ELEM_DLC_Msk (0xFul << TX_BUFFER_T1_ELEM_DLC_Pos) + +/* Tx Buffer Element MM(Message Marker) */ +#define TX_BUFFER_T1_ELEM_MM0_Pos (8) +#define TX_BUFFER_T1_ELEM_MM0_Msk (0xFFul << TX_BUFFER_T1_ELEM_MM0_Pos) + +#define CANFD_RXFS_RFL CANFD_RXF0S_RF0L_Msk + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup CANFD_Driver CAN_FD Driver + @{ +*/ + +/** @addtogroup CANFD_EXPORTED_FUNCTIONS CAN_FD Exported Functions + @{ +*/ + +static void CANFD_InitRxFifo(CANFD_T *canfd, uint32_t u32RxFifoNum, CANFD_RAM_PART_T *psRamConfig, CANFD_ELEM_SIZE_T *psElemSize, uint32_t u32FifoWM, E_CANFD_DATA_FIELD_SIZE eFifoSize); +static void CANFD_InitRxDBuf(CANFD_T *canfd, CANFD_RAM_PART_T *psRamConfig, CANFD_ELEM_SIZE_T *psElemSize, E_CANFD_DATA_FIELD_SIZE eRxBufSize); +static void CANFD_InitTxDBuf(CANFD_T *canfd, CANFD_RAM_PART_T *psRamConfig, CANFD_ELEM_SIZE_T *psElemSize, E_CANFD_DATA_FIELD_SIZE eTxBufSize); +static void CANFD_InitTxEvntFifo(CANFD_T *canfd, CANFD_RAM_PART_T *psRamConfig, CANFD_ELEM_SIZE_T *psElemSize, uint32_t u32FifoWaterLvl); +static void CANFD_ConfigSIDFC(CANFD_T *canfd, CANFD_RAM_PART_T *psRamConfig, CANFD_ELEM_SIZE_T *psElemSize); +static void CANFD_ConfigXIDFC(CANFD_T *canfd, CANFD_RAM_PART_T *psRamConfig, CANFD_ELEM_SIZE_T *psElemSize); + +uint32_t CANFD_ReadReg(__I uint32_t *pu32RegAddr) +{ + uint32_t u32ReadReg; + uint32_t u32TimeOutCnt = CANFD_READ_REG_TIMEOUT; + u32ReadReg = 0UL; + + do + { + u32ReadReg = inpw(pu32RegAddr); + if (--u32TimeOutCnt == 0UL) + { + break; + } + } + while (u32ReadReg == 0UL); + + return u32ReadReg; +} + +/** + * @brief Calculates the CAN FD RAM buffer address. + * + * @param[in] psConfigAddr CAN FD element star address structure. + * @param[in] psConfigSize CAN FD element size structure. + * + * @return None. + * + * @details Calculates the CAN FD RAM buffer address. + */ +static void CANFD_CalculateRamAddress(CANFD_RAM_PART_T *psConfigAddr, CANFD_ELEM_SIZE_T *psConfigSize) +{ + uint32_t u32RamAddrOffset = 0; + + /* Get the Standard Message ID Filter element address */ + if (psConfigSize->u32SIDFC > 0) + { + psConfigAddr->u32SIDFC_FLSSA = 0; + u32RamAddrOffset += psConfigSize->u32SIDFC * sizeof(CANFD_STD_FILTER_T); + } + + /* Get the Extended Message ID Filter element address */ + if (psConfigSize->u32XIDFC > 0) + { + psConfigAddr->u32XIDFC_FLESA = u32RamAddrOffset; + u32RamAddrOffset += psConfigSize->u32XIDFC * sizeof(CANFD_EXT_FILTER_T); + } + + /* Get the Rx FIFO0 element address */ + if (psConfigSize->u32RxFifo0 > 0) + { + psConfigAddr->u32RXF0C_F0SA = u32RamAddrOffset; + u32RamAddrOffset += psConfigSize->u32RxFifo0 * sizeof(CANFD_BUF_T); + } + + /* Get the Rx FIFO1 element address */ + if (psConfigSize->u32RxFifo1 > 0) + { + psConfigAddr->u32RXF1C_F1SA = u32RamAddrOffset; + u32RamAddrOffset += psConfigSize->u32RxFifo1 * sizeof(CANFD_BUF_T); + } + + /* Get the Rx Buffer element address */ + if (psConfigSize->u32RxBuf > 0) + { + psConfigAddr->u32RXBC_RBSA = u32RamAddrOffset; + u32RamAddrOffset += psConfigSize->u32RxBuf * sizeof(CANFD_BUF_T); + } + + /* Get the TX Event FIFO element address */ + if (psConfigSize->u32TxEventFifo > 0) + { + psConfigAddr->u32TXEFC_EFSA = u32RamAddrOffset; + u32RamAddrOffset += psConfigSize->u32TxEventFifo * sizeof(CANFD_EXT_FILTER_T); + } + + /* Get the Tx Buffer element address */ + if (psConfigSize->u32TxBuf > 0) + { + psConfigAddr->u32TXBC_TBSA = u32RamAddrOffset; + u32RamAddrOffset += psConfigSize->u32TxBuf * sizeof(CANFD_BUF_T); + } +} + +/** + * @brief Get the default configuration structure. + * + * @param[in] psConfig Pointer to CAN FD configuration structure. + * @param[in] u8OpMode Setting the CAN FD Operating mode. + * + * @return None. + * + * @details This function initializes the CAN FD configure structure to default value. + * The default value are: + * sNormBitRate.u32BitRate = 500000bps; + * u32DataBaudRate = 0(CAN mode) or 1000000(CAN FD mode) ; + * u32MRamSize = 8k bytes (2k words); + * bEnableLoopBack = FALSE; + * bBitRateSwitch = FALSE(CAN Mode) or TRUE(CAN FD Mode); + * bFDEn = FALSE(CAN Mode) or TRUE(CAN FD Mode); +*/ +void CANFD_GetDefaultConfig(CANFD_FD_T *psConfig, uint8_t u8OpMode) +{ + memset(psConfig, 0, sizeof(CANFD_FD_T)); + + psConfig->sBtConfig.sNormBitRate.u32BitRate = 500000; + + if (u8OpMode == CANFD_OP_CAN_MODE) + { + psConfig->sBtConfig.sDataBitRate.u32BitRate = 0; + psConfig->sBtConfig.bFDEn = FALSE; + psConfig->sBtConfig.bBitRateSwitch = FALSE; + } + else + { + psConfig->sBtConfig.sDataBitRate.u32BitRate = 10000000; + psConfig->sBtConfig.bFDEn = TRUE; + psConfig->sBtConfig.bBitRateSwitch = TRUE; + } + + /* Set normal mode by default */ + psConfig->sBtConfig.evTestMode = eCANFD_NORMAL; + + /*Get the CAN FD memory address*/ + psConfig->u32MRamSize = CANFD_SRAM_SIZE; + + /* CAN FD Standard message ID elements as 64 elements */ + psConfig->sElemSize.u32SIDFC = 64; + /* CAN FD Extended message ID elements as 64 elements */ + psConfig->sElemSize.u32XIDFC = 64; + /* CAN FD TX Buffer elements as 8 elements */ + psConfig->sElemSize.u32TxBuf = 8; + /* CAN FD RX Buffer elements as 8 elements */ + psConfig->sElemSize.u32RxBuf = 8; + /* CAN FD RX FIFO0 elements as 48 elements */ + psConfig->sElemSize.u32RxFifo0 = 48; + /* CAN FD RX FIFO1 elements as 8 elements */ + psConfig->sElemSize.u32RxFifo1 = 8; + /* CAN FD TX Event FOFI elements as 8 elements */ + psConfig->sElemSize.u32TxEventFifo = 8; + /*Calculates the CAN FD RAM buffer address*/ + CANFD_CalculateRamAddress(&psConfig->sMRamStartAddr, &psConfig->sElemSize); +} + + +/** + * @brief Encode the Data Length Code. + * + * @param[in] u8NumberOfBytes Number of bytes in a message. + * + * @return Data Length Code. + * + * @details Converts number of bytes in a message into a Data Length Code. + */ +static uint8_t CANFD_EncodeDLC(uint8_t u8NumberOfBytes) +{ + if (u8NumberOfBytes <= 8) return u8NumberOfBytes; + else if (u8NumberOfBytes <= 12) return 9; + else if (u8NumberOfBytes <= 16) return 10; + else if (u8NumberOfBytes <= 20) return 11; + else if (u8NumberOfBytes <= 24) return 12; + else if (u8NumberOfBytes <= 32) return 13; + else if (u8NumberOfBytes <= 48) return 14; + else return 15; +} + + +/** + * @brief Decode the Data Length Code. + * + * @param[in] u8Dlc Data Length Code. + * + * @return Number of bytes in a message. + * + * @details Converts a Data Length Code into a number of message bytes. + */ +static uint8_t CANFD_DecodeDLC(uint8_t u8Dlc) +{ + if (u8Dlc <= 8) return u8Dlc; + else if (u8Dlc == 9) return 12; + else if (u8Dlc == 10) return 16; + else if (u8Dlc == 11) return 20; + else if (u8Dlc == 12) return 24; + else if (u8Dlc == 13) return 32; + else if (u8Dlc == 14) return 48; + else return 64; +} + + +/** + * @brief Sets the CAN FD protocol timing characteristic. + * + * @param[in] psCanfd The pointer of the specified CANFD module. + * @param[in] psConfig Pointer to the timing configuration structure. + * + * @return None. + * + * @details This function gives user settings to CAN bus timing characteristic. + * The function is for an experienced user. For less experienced users, call + * the CANFD_Open() and fill the baud rate field with a desired value. + * This provides the default timing characteristics to the module. + */ +static void CANFD_SetTimingConfig(CANFD_T *psCanfd, const CANFD_TIMEING_CONFIG_T *psConfig) +{ + if (psCanfd == (CANFD_T *)CANFD0) + { + /* Set CANFD0 clock divider number */ + CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_CANFD0DIV_Msk) | CLK_CLKDIV0_CANFD0(psConfig->u8PreDivider) ; + } + else if (psCanfd == (CANFD_T *)CANFD1) + { + /* Set CANFD1 clock divider number */ + CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_CANFD1DIV_Msk) | CLK_CLKDIV0_CANFD1(psConfig->u8PreDivider) ; + } + else if (psCanfd == (CANFD_T *)CANFD2) + { + /* Set CANFD2 clock divider number */ + CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_CANFD2DIV_Msk) | CLK_CLKDIV0_CANFD2(psConfig->u8PreDivider) ; + } + else if (psCanfd == (CANFD_T *)CANFD3) + { + /* Set CANFD3 clock divider number */ + CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_CANFD3DIV_Msk) | CLK_CLKDIV0_CANFD3(psConfig->u8PreDivider) ; + } + else + { + return; + } + + /* configuration change enable */ + psCanfd->CCCR |= CANFD_CCCR_CCE_Msk; + + /* nominal bit rate */ + psCanfd->NBTP = (((psConfig->u8NominalRJumpwidth & 0x7F) - 1) << 25) + + (((psConfig->u16NominalPrescaler & 0x1FF) - 1) << 16) + + ((((psConfig->u8NominalPhaseSeg1 + psConfig->u8NominalPropSeg) & 0xFF) - 1) << 8) + + (((psConfig->u8NominalPhaseSeg2 & 0x7F) - 1) << 0); + + + /* canfd->DBTP */ + if (psCanfd->CCCR & CANFD_CCCR_FDOE_Msk) + { + psCanfd->DBTP = (((psConfig->u8DataPrescaler & 0x1F) - 1) << 16) + + ((((psConfig->u8DataPhaseSeg1 + psConfig->u8DataPropSeg) & 0x1F) - 1) << 8) + + (((psConfig->u8DataPhaseSeg2 & 0xF) - 1) << 4) + + (((psConfig->u8DataRJumpwidth & 0xF) - 1) << 0); + } +} + + +/** + * @brief Get the segment values. + * + * @param[in] u32NominalBaudRate The nominal speed in bps. + * @param[in] u32DataBaudRate The data speed in bps. + * @param[in] u32Ntq Number of nominal time quanta per bit. + * @param[in] u32Dtq Number of data time quanta per bit. + * @param[in] psConfig Passed is a configuration structure, on return the configuration is stored in the structure + * + * @return None. + * + * @details Calculates the segment values for a single bit time for nominal and data baudrates. + */ +static void CANFD_GetSegments(uint32_t u32NominalBaudRate, uint32_t u32DataBaudRate, uint32_t u32Ntq, uint32_t u32Dtq, CANFD_TIMEING_CONFIG_T *psConfig) +{ + float ideal_sp; + int int32P1; + + /* get ideal sample point */ + if (u32NominalBaudRate >= 1000000) ideal_sp = 0.750; + else if (u32NominalBaudRate >= 800000) ideal_sp = 0.800; + else ideal_sp = 0.875; + + /* distribute time quanta */ + int32P1 = (int)(u32Ntq * ideal_sp); + /* can controller doesn't separate prop seg and phase seg 1 */ + psConfig->u8NominalPropSeg = 0; + /* subtract one TQ for sync seg */ + psConfig->u8NominalPhaseSeg1 = int32P1 - 1; + psConfig->u8NominalPhaseSeg2 = u32Ntq - int32P1; + /* sjw is 20% of total TQ, rounded to nearest int */ + psConfig->u8NominalRJumpwidth = (u32Ntq + (5 - 1)) / 5; + + + /* if using baud rate switching then distribute time quanta for data rate */ + if (u32Dtq > 0) + { + /* get ideal sample point */ + if (u32DataBaudRate >= 1000000) ideal_sp = 0.750; + else if (u32DataBaudRate >= 800000) ideal_sp = 0.800; + else ideal_sp = 0.875; + + /* distribute time quanta */ + int32P1 = (int)(u32Dtq * ideal_sp); + /* can controller doesn't separate prop seg and phase seg 1 */ + psConfig->u8DataPropSeg = 0; + /* subtract one TQ for sync seg */ + psConfig->u8DataPhaseSeg1 = int32P1 - 1; + psConfig->u8DataPhaseSeg2 = u32Dtq - int32P1; + /* sjw is 20% of total TQ, rounded to nearest int */ + psConfig->u8DataRJumpwidth = (u32Dtq + (5 - 1)) / 5; + } + else + { + psConfig->u8DataPropSeg = 0; + psConfig->u8DataPhaseSeg1 = 0; + psConfig->u8DataPhaseSeg2 = 0; + psConfig->u8DataRJumpwidth = 0; + } +} + + +/** + * @brief Calculates the CAN controller timing values for specific baudrates. + * + * @param[in] u32NominalBaudRate The nominal speed in bps. + * @param[in] u32DataBaudRate The data speed in bps. Zero to disable baudrate switching. + * @param[in] u32SourceClock_Hz CAN FD Protocol Engine clock source frequency in Hz. + * @param[in] psConfig Passed is a configuration structure, on return the configuration is stored in the structure + * + * @return true if timing configuration found, false if failed to find configuration. + * + * @details Calculates the CAN controller timing values for specific baudrates. + */ +static uint32_t CANFD_CalculateTimingValues(CANFD_T *psCanfd, uint32_t u32NominalBaudRate, uint32_t u32DataBaudRate, uint32_t u32SourceClock_Hz, CANFD_TIMEING_CONFIG_T *psConfig) +{ + int i32Nclk; + int i32Nclk2; + int i32Ntq; + int i32Dclk; + int i32Dclk2; + int i32Dtq; + + /* observe baud rate maximums */ + if (u32NominalBaudRate > MAX_NOMINAL_BAUDRATE) u32NominalBaudRate = MAX_NOMINAL_BAUDRATE; + + for (i32Ntq = MAX_TIME_QUANTA; i32Ntq >= MIN_TIME_QUANTA; i32Ntq--) + { + i32Nclk = u32NominalBaudRate * i32Ntq; + + for (psConfig->u16NominalPrescaler = 0x001; psConfig->u16NominalPrescaler <= 0x400; (psConfig->u16NominalPrescaler)++) + { + i32Nclk2 = i32Nclk * psConfig->u16NominalPrescaler; + + if (((u32SourceClock_Hz / i32Nclk2) <= 5) && ((u32SourceClock_Hz % i32Nclk2) == 0)) + { + psConfig->u8PreDivider = u32SourceClock_Hz / i32Nclk2; + + /* FD Operation? */ + if (psCanfd->CCCR & CANFD_CCCR_FDOE_Msk) + { + /* Exception case: Let u32DataBaudRate is same with u32NominalBaudRate. */ + if (u32DataBaudRate == 0) + u32DataBaudRate = u32NominalBaudRate; + + /* if baudrates are the same and the solution for nominal will work for + data, then use the nominal settings for both */ + if ((u32DataBaudRate == u32NominalBaudRate) && (psConfig->u16NominalPrescaler <= 0x20)) + { + i32Dtq = i32Ntq; + psConfig->u8DataPrescaler = (uint8_t)psConfig->u16NominalPrescaler; + CANFD_GetSegments(u32NominalBaudRate, u32DataBaudRate, i32Ntq, i32Dtq, psConfig); + return TRUE; + } + + /* calculate data settings */ + for (i32Dtq = MAX_TIME_QUANTA; i32Dtq >= MIN_TIME_QUANTA; i32Dtq--) + { + i32Dclk = u32DataBaudRate * i32Dtq; + + for (psConfig->u8DataPrescaler = 0x01; psConfig->u8DataPrescaler <= 0x20; (psConfig->u8DataPrescaler)++) + { + i32Dclk2 = i32Dclk * psConfig->u8DataPrescaler; + if (u32SourceClock_Hz == ((uint32_t)i32Dclk2 * psConfig->u8PreDivider)) + { + CANFD_GetSegments(u32NominalBaudRate, u32DataBaudRate, i32Ntq, i32Dtq, psConfig); + return TRUE; + } + } + } + } + else + { + psConfig->u8DataPrescaler = 0; + CANFD_GetSegments(u32NominalBaudRate, 0, 0, 0, psConfig); + return TRUE; + } + } + } + } + + /* failed to find solution */ + return FALSE; +} + + +/** + * @brief Config message ram and Set bit-time. + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] psCanfdStr message ram setting and bit-time setting + * + * @return None. + * + * @details Converts a Data Length Code into a number of message bytes. + */ +void CANFD_Open(CANFD_T *psCanfd, CANFD_FD_T *psCanfdStr) +{ + uint32_t u32SrcCLK; + uint32_t u32RegLockLevel = SYS_IsRegLocked(); + + if (u32RegLockLevel) + SYS_UnlockReg(); + + if (psCanfd == (CANFD_T *)CANFD0) + { + CLK_EnableModuleClock(CANFD0_MODULE); + SYS_ResetModule(CANFD0_RST); + if (CLK_GetModuleClockSource(CANFD0_MODULE) == 1) + { + u32SrcCLK = CLK_GetPLLClockFreq(VPLL); + } + else + { + u32SrcCLK = CLK_GetPLLClockFreq(APLL); + } + } + else if (psCanfd == (CANFD_T *)CANFD1) + { + CLK_EnableModuleClock(CANFD1_MODULE); + SYS_ResetModule(CANFD1_RST); + if (CLK_GetModuleClockSource(CANFD1_MODULE) == 1) + { + u32SrcCLK = CLK_GetPLLClockFreq(VPLL); + } + else + { + u32SrcCLK = CLK_GetPLLClockFreq(APLL); + } + } + else if (psCanfd == (CANFD_T *)CANFD2) + { + CLK_EnableModuleClock(CANFD2_MODULE); + SYS_ResetModule(CANFD2_RST); + if (CLK_GetModuleClockSource(CANFD2_MODULE) == 1) + { + u32SrcCLK = CLK_GetPLLClockFreq(VPLL); + } + else + { + u32SrcCLK = CLK_GetPLLClockFreq(APLL); + } + } + else if (psCanfd == (CANFD_T *)CANFD3) + { + CLK_EnableModuleClock(CANFD3_MODULE); + SYS_ResetModule(CANFD3_RST); + if (CLK_GetModuleClockSource(CANFD3_MODULE) == 1) + { + u32SrcCLK = CLK_GetPLLClockFreq(VPLL); + } + else + { + u32SrcCLK = CLK_GetPLLClockFreq(APLL); + } + } + else + { + if (u32RegLockLevel) + SYS_LockReg(); + + return; + } + + /* Initialization & un-lock */ + CANFD_RunToNormal(psCanfd, FALSE); + + if (psCanfdStr->sBtConfig.bBitRateSwitch) + { + /* enable FD and baud-rate switching */ + psCanfd->CCCR |= CANFD_CCCR_BRSE_Msk; + } + + if (psCanfdStr->sBtConfig.bFDEn) + { + /*FD Operation enabled*/ + psCanfd->CCCR |= CANFD_CCCR_FDOE_Msk; + } + + /*Clear the Rx Fifo0 element setting */ + psCanfd->RXF0C = 0; + /*Clear the Rx Fifo1 element setting */ + psCanfd->RXF1C = 0; + + /* calculate and apply timing */ + if (CANFD_CalculateTimingValues(psCanfd, psCanfdStr->sBtConfig.sNormBitRate.u32BitRate, psCanfdStr->sBtConfig.sDataBitRate.u32BitRate, + u32SrcCLK, &psCanfdStr->sBtConfig.sConfigBitTing)) + { + CANFD_SetTimingConfig(psCanfd, &psCanfdStr->sBtConfig.sConfigBitTing); + } + + if (u32RegLockLevel) + SYS_LockReg(); + + /* Configures the Standard ID Filter element */ + if (psCanfdStr->sElemSize.u32SIDFC != 0) + CANFD_ConfigSIDFC(psCanfd, &psCanfdStr->sMRamStartAddr, &psCanfdStr->sElemSize); + + /*Configures the Extended ID Filter element */ + if (psCanfdStr->sElemSize.u32XIDFC != 0) + CANFD_ConfigXIDFC(psCanfd, &psCanfdStr->sMRamStartAddr, &psCanfdStr->sElemSize); + + /*Configures the Tx Buffer element */ + if (psCanfdStr->sElemSize.u32RxBuf != 0) + CANFD_InitTxDBuf(psCanfd, &psCanfdStr->sMRamStartAddr, &psCanfdStr->sElemSize, eCANFD_BYTE64); + + /*Configures the Rx Buffer element */ + if (psCanfdStr->sElemSize.u32RxBuf != 0) + CANFD_InitRxDBuf(psCanfd, &psCanfdStr->sMRamStartAddr, &psCanfdStr->sElemSize, eCANFD_BYTE64); + + /*Configures the Rx Fifo0 element */ + if (psCanfdStr->sElemSize.u32RxFifo0 != 0) + CANFD_InitRxFifo(psCanfd, 0, &psCanfdStr->sMRamStartAddr, &psCanfdStr->sElemSize, 0, eCANFD_BYTE64); + + /*Configures the Rx Fifo1 element */ + if (psCanfdStr->sElemSize.u32RxFifo1 != 0) + CANFD_InitRxFifo(psCanfd, 1, &psCanfdStr->sMRamStartAddr, &psCanfdStr->sElemSize, 0, eCANFD_BYTE64); + + /*Configures the Tx Event FIFO element */ + if (psCanfdStr->sElemSize.u32TxEventFifo != 0) + CANFD_InitTxEvntFifo(psCanfd, &psCanfdStr->sMRamStartAddr, &psCanfdStr->sElemSize, 0); + + /*Reject all Non-matching Frames Extended ID and Frames Standard ID,Reject all remote frames with 11-bit standard IDs and 29-bit extended IDs */ + CANFD_SetGFC(psCanfd, eCANFD_REJ_NON_MATCH_FRM, eCANFD_REJ_NON_MATCH_FRM, 1, 1); + + /* Test mode configuration */ + switch (psCanfdStr->sBtConfig.evTestMode) + { + case eCANFD_RESTRICTED_OPERATION: + psCanfd->CCCR |= (CANFD_CCCR_TEST_Msk | CANFD_CCCR_ASM_Msk); + break; + + case eCANFD_BUS_MONITOR: + psCanfd->CCCR |= (CANFD_CCCR_TEST_Msk | CANFD_CCCR_MON_Msk); + break; + + case eCANFD_LOOPBACK_EXTERNAL: + psCanfd->CCCR |= CANFD_CCCR_TEST_Msk; + psCanfd->TEST |= CANFD_TEST_LBCK_Msk; + break; + + case eCANFD_LOOPBACK_INTERNAL: + psCanfd->CCCR |= (CANFD_CCCR_TEST_Msk | CANFD_CCCR_MON_Msk); + psCanfd->TEST |= CANFD_TEST_LBCK_Msk; + break; + + case eCANFD_NORMAL: /* Normal mode */ + default: + psCanfd->CCCR &= ~(CANFD_CCCR_MON_Msk | CANFD_CCCR_TEST_Msk | CANFD_CCCR_ASM_Msk); + psCanfd->TEST &= ~CANFD_TEST_LBCK_Msk; + break; + } +} + + +/** + * @brief Close the CAN FD Bus. + * + * @param[in] psCanfd The pointer to CANFD module base address. + * + * @return None. + * + * @details Disable the CAN FD clock and Interrupt. + */ +void CANFD_Close(CANFD_T *psCanfd) +{ + if (psCanfd == (CANFD_T *)CANFD0) + { + CLK_DisableModuleClock(CANFD0_MODULE); + } + else if (psCanfd == (CANFD_T *)CANFD1) + { + CLK_DisableModuleClock(CANFD1_MODULE); + } + else if (psCanfd == (CANFD_T *)CANFD2) + { + CLK_DisableModuleClock(CANFD2_MODULE); + } + else if (psCanfd == (CANFD_T *)CANFD3) + { + CLK_DisableModuleClock(CANFD3_MODULE); + } +} + + +/** + * @brief Get the element's address when read transmit buffer. + * + * @param[in] psCanfd The pointer of the specified CAN FD module. + * @param[in] u32Idx The number of the transmit buffer element + * + * @return Address of the element in transmit buffer. + * + * @details The function is used to get the element's address when read transmit buffer. + */ +static uint32_t CANFD_GetTxBufferElementAddress(CANFD_T *psCanfd, uint32_t u32Idx) +{ + uint32_t u32Size = 0; + u32Size = (CANFD_ReadReg(&psCanfd->TXESC) & CANFD_TXESC_TBDS_Msk) >> CANFD_TXESC_TBDS_Pos; + + if (u32Size < 5U) + { + u32Size += 4U; + } + else + { + u32Size = u32Size * 4U - 10U; + } + + return (CANFD_ReadReg(&psCanfd->TXBC) & CANFD_TXBC_TBSA_Msk) + u32Idx * u32Size * 4U; +} + +/** + * @brief Enables CAN FD interrupts according to provided mask . + * + * @param[in] psCanfd The pointer of the specified CAN FD module. + * @param[in] u32IntLine0 The Interrupt Line 0 type select. + * @param[in] u32IntLine1 The Interrupt Line 1 type select. + * - \ref CANFD_IE_ARAE_Msk : Access to Reserved Address Interrupt + * - \ref CANFD_IE_PEDE_Msk : Protocol Error in Data Phase Interrupt + * - \ref CANFD_IE_PEAE_Msk : Protocol Error in Arbitration Phase Interrupt + * - \ref CANFD_IE_WDIE_Msk : Watchdog Interrupt + * - \ref CANFD_IE_BOE_Msk : Bus_Off Status Interrupt + * - \ref CANFD_IE_EWE_Msk : Warning Status Interrupt + * - \ref CANFD_IE_EPE_Msk : Error Passive Interrupt + * - \ref CANFD_IE_ELOE_Msk : Error Logging Overflow Interrupt + * - \ref CANFD_IE_BEUE_Msk : Bit Error Uncorrected Interrupt + * - \ref CANFD_IE_BECE_Msk : Bit Error Corrected Interrupt + * - \ref CANFD_IE_DRXE_Msk : Message stored to Dedicated Rx Buffer Interrupt + * - \ref CANFD_IE_TOOE_Msk : Timeout Occurred Interrupt + * - \ref CANFD_IE_MRAFE_Msk : Message RAM Access Failure Interrupt + * - \ref CANFD_IE_TSWE_Msk : Timestamp Wraparound Interrupt + * - \ref CANFD_IE_TEFLE_Msk : Tx Event FIFO Event Lost Interrupt + * - \ref CANFD_IE_TEFFE_Msk : Tx Event FIFO Full Interrupt + * - \ref CANFD_IE_TEFWE_Msk : Tx Event FIFO Watermark Reached Interrupt + * - \ref CANFD_IE_TEFNE_Msk : Tx Event FIFO New Entry Interrupt + * - \ref CANFD_IE_TFEE_Msk : Tx FIFO Empty Interrupt + * - \ref CANFD_IE_TCFE_Msk : Transmission Cancellation Finished Interrupt + * - \ref CANFD_IE_TCE_Msk : Transmission Completed Interrupt + * - \ref CANFD_IE_HPME_Msk : High Priority Message Interrupt + * - \ref CANFD_IE_RF1LE_Msk : Rx FIFO 1 Message Lost Interrupt + * - \ref CANFD_IE_RF1FE_Msk : Rx FIFO 1 Full Interrupt + * - \ref CANFD_IE_RF1WE_Msk : Rx FIFO 1 Watermark Reached Interrupt + * - \ref CANFD_IE_RF1NE_Msk : Rx FIFO 1 New Message Interrupt + * - \ref CANFD_IE_RF0LE_Msk : Rx FIFO 0 Message Lost Interrupt + * - \ref CANFD_IE_RF0FE_Msk : Rx FIFO 0 Full Interrupt + * - \ref CANFD_IE_RF0WE_Msk : Rx FIFO 0 Watermark Reached Interrupt + * - \ref CANFD_IE_RF0NE_Msk : Rx FIFO 0 New Message Interrupt + * + * @param[in] u32TXBTIE Enable Tx Buffer Transmission 0-31 Interrupt. + * @param[in] u32TXBCIE Enable Tx Buffer Cancellation Finished 0-31 Interrupt. + * @return None. + * + * @details This macro enable specified CAN FD interrupt. + */ +void CANFD_EnableInt(CANFD_T *psCanfd, uint32_t u32IntLine0, uint32_t u32IntLine1, uint32_t u32TXBTIE, uint32_t u32TXBCIE) +{ + /*Setting the CANFD Interrupt Enabling*/ + psCanfd->IE = CANFD_ReadReg(&psCanfd->IE) | u32IntLine0 | u32IntLine1; + + if (u32IntLine0 != 0) + { + /* Select specified interrupt event of Line0. */ + psCanfd->ILS = CANFD_ReadReg(&psCanfd->ILS) & ~u32IntLine0; + /* Enable Line0 interrupt. */ + psCanfd->ILE = CANFD_ReadReg(&psCanfd->ILE) | CANFD_ILE_ENT0_Msk; + } + + if (u32IntLine1 != 0) + { + /* Select specified interrupt event of Line1. */ + psCanfd->ILS = CANFD_ReadReg(&psCanfd->ILS) | u32IntLine1; + /* Enable Line1 interrupt. */ + psCanfd->ILE = CANFD_ReadReg(&psCanfd->ILE) | CANFD_ILE_ENT1_Msk; + } + + /*Setting the Tx Buffer Transmission Interrupt Enable*/ + psCanfd->TXBTIE = CANFD_ReadReg(&psCanfd->TXBTIE) | u32TXBTIE; + + /*Tx Buffer Cancellation Finished Interrupt Enable*/ + psCanfd->TXBCIE = CANFD_ReadReg(&psCanfd->TXBCIE) | u32TXBCIE; +} + + +/** + * @brief Disables CAN FD interrupts according to provided mask . + * + * @param[in] psCanfd The pointer of the specified CAN FD module. + * @param[in] u32IntLine0 The Interrupt Line 0 type select. + * @param[in] u32IntLine1 The Interrupt Line 1 type select. + * - \ref CANFD_IE_ARAE_Msk : Access to Reserved Address Interrupt + * - \ref CANFD_IE_PEDE_Msk : Protocol Error in Data Phase Interrupt + * - \ref CANFD_IE_PEAE_Msk : Protocol Error in Arbitration Phase Interrupt + * - \ref CANFD_IE_WDIE_Msk : Watchdog Interrupt + * - \ref CANFD_IE_BOE_Msk : Bus_Off Status Interrupt + * - \ref CANFD_IE_EWE_Msk : Warning Status Interrupt + * - \ref CANFD_IE_EPE_Msk : Error Passive Interrupt + * - \ref CANFD_IE_ELOE_Msk : Error Logging Overflow Interrupt + * - \ref CANFD_IE_BEUE_Msk : Bit Error Uncorrected Interrupt + * - \ref CANFD_IE_BECE_Msk : Bit Error Corrected Interrupt + * - \ref CANFD_IE_DRXE_Msk : Message stored to Dedicated Rx Buffer Interrupt + * - \ref CANFD_IE_TOOE_Msk : Timeout Occurred Interrupt + * - \ref CANFD_IE_MRAFE_Msk : Message RAM Access Failure Interrupt + * - \ref CANFD_IE_TSWE_Msk : Timestamp Wraparound Interrupt + * - \ref CANFD_IE_TEFLE_Msk : Tx Event FIFO Event Lost Interrupt + * - \ref CANFD_IE_TEFFE_Msk : Tx Event FIFO Full Interrupt + * - \ref CANFD_IE_TEFWE_Msk : Tx Event FIFO Watermark Reached Interrupt + * - \ref CANFD_IE_TEFNE_Msk : Tx Event FIFO New Entry Interrupt + * - \ref CANFD_IE_TFEE_Msk : Tx FIFO Empty Interrupt + * - \ref CANFD_IE_TCFE_Msk : Transmission Cancellation Finished Interrupt + * - \ref CANFD_IE_TCE_Msk : Transmission Completed Interrupt + * - \ref CANFD_IE_HPME_Msk : High Priority Message Interrupt + * - \ref CANFD_IE_RF1LE_Msk : Rx FIFO 1 Message Lost Interrupt + * - \ref CANFD_IE_RF1FE_Msk : Rx FIFO 1 Full Interrupt + * - \ref CANFD_IE_RF1WE_Msk : Rx FIFO 1 Watermark Reached Interrupt + * - \ref CANFD_IE_RF1NE_Msk : Rx FIFO 1 New Message Interrupt + * - \ref CANFD_IE_RF0LE_Msk : Rx FIFO 0 Message Lost Interrupt + * - \ref CANFD_IE_RF0FE_Msk : Rx FIFO 0 Full Interrupt + * - \ref CANFD_IE_RF0WE_Msk : Rx FIFO 0 Watermark Reached Interrupt + * - \ref CANFD_IE_RF0NE_Msk : Rx FIFO 0 New Message Interrupt + * + * @param[in] u32TXBTIE Disable Tx Buffer Transmission 0-31 Interrupt. + * @param[in] u32TXBCIE Disable Tx Buffer Cancellation Finished 0-31 Interrupt. + * @return None. + * + * @details This macro disable specified CAN FD interrupt. + */ +void CANFD_DisableInt(CANFD_T *psCanfd, uint32_t u32IntLine0, uint32_t u32IntLine1, uint32_t u32TXBTIE, uint32_t u32TXBCIE) +{ + psCanfd->IE = CANFD_ReadReg(&psCanfd->IE) & ~(u32IntLine0 | u32IntLine1); + + if (u32IntLine0 != 0) + { + /* Cancel specified interrupt event of Line0. */ + psCanfd->ILS = CANFD_ReadReg(&psCanfd->ILS) | u32IntLine0; + } + if (CANFD_ReadReg(&psCanfd->ILS) == ~0) + { + /* Disable Line0 interrupt */ + psCanfd->ILE = CANFD_ReadReg(&psCanfd->ILE) & ~CANFD_ILE_ENT0_Msk; + } + + if (u32IntLine1 != 0) + { + /* Select specified interrupt event of Line1. */ + psCanfd->ILS = CANFD_ReadReg(&psCanfd->ILS) & ~u32IntLine1; + } + if (CANFD_ReadReg(&psCanfd->ILS) == 0) + { + /* Disable Line1 interrupt */ + psCanfd->ILE = CANFD_ReadReg(&psCanfd->ILE) & ~CANFD_ILE_ENT1_Msk; + } + + /*Setting the Tx Buffer Transmission Interrupt Disable*/ + psCanfd->TXBTIE = CANFD_ReadReg(&psCanfd->TXBTIE) & ~u32TXBTIE; + + /*Tx Buffer Cancellation Finished Interrupt Disable*/ + psCanfd->TXBCIE = CANFD_ReadReg(&psCanfd->TXBCIE) & ~u32TXBCIE; +} + + +/** + * @brief Copy Tx Message to TX buffer and Request transmission. + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] u32TxBufIdx The Message Buffer index. + * @param[in] psTxMsg Message to be copied. + * + * @return number of tx requests set: 0= Tx Message Buffer is currently in use. + * 1= Write Tx Message Buffer Successfully. + * + * @details Copy Tx Message to FIFO/Queue TX buffer and Request transmission. + */ +uint32_t CANFD_TransmitTxMsg(CANFD_T *psCanfd, uint32_t u32TxBufIdx, CANFD_FD_MSG_T *psTxMsg) +{ + uint32_t u32Success = 0; + uint32_t u32TimeOutCnt = CANFD_TIMEOUT; + + /* write the message to the message buffer */ + u32Success = CANFD_TransmitDMsg(psCanfd, u32TxBufIdx, psTxMsg); + + if (u32Success == 1) + { + /* wait for completion */ + while (!(psCanfd->TXBRP & (1UL << u32TxBufIdx))) + { + if (--u32TimeOutCnt == 0) + { + u32Success = 0; + break; + } + + } + } + + return u32Success; +} + + +/** + * @brief Writes a Tx Message to Transmit Message Buffer. + * + * @param[in] psCanfd The pointer of the specified CAN FD module. + * @param[in] u32TxBufIdx The Message Buffer index. + * @param[in] psTxMsg Pointer to CAN FD message frame to be sent. + * + * @return 1 Write Tx Message Buffer Successfully. + * 0 Tx Message Buffer is currently in use. + * + * @details This function writes a CANFD Message to the specified Transmit Message Buffer + * and changes the Message Buffer state to start CANFD Message transmit. After + * that the function returns immediately. + */ +uint32_t CANFD_TransmitDMsg(CANFD_T *psCanfd, uint32_t u32TxBufIdx, CANFD_FD_MSG_T *psTxMsg) +{ + CANFD_BUF_T *psTxBuffer; + uint32_t u32Idx = 0, u32Success = 1; + uint32_t u32TimeOutCnt = CANFD_TIMEOUT; + + if (u32TxBufIdx >= CANFD_MAX_TX_BUF_ELEMS) return 0; + + /* transmission is pending in this message buffer */ + if (CANFD_ReadReg(&(psCanfd->TXBRP)) & (1UL << u32TxBufIdx)) return 0; + + /*Get the TX Buffer Start Address in the RAM*/ + psTxBuffer = (CANFD_BUF_T *)(CANFD_SRAM_BASE_ADDR(psCanfd) + (CANFD_ReadReg(&psCanfd->TXBC) & 0xFFFF) + (u32TxBufIdx * sizeof(CANFD_BUF_T))); + + if (psTxMsg->eIdType == eCANFD_XID) + { + psTxBuffer->u32Id = TX_BUFFER_T0_ELEM_XTD_Msk | (psTxMsg->u32Id & 0x1FFFFFFF); + } + else + { + psTxBuffer->u32Id = (psTxMsg->u32Id & 0x7FF) << 18; + } + + if (psTxMsg->eFrmType == eCANFD_REMOTE_FRM) psTxBuffer->u32Id |= TX_BUFFER_T0_ELEM_RTR_Msk; + + psTxBuffer->u32Config = (CANFD_EncodeDLC(psTxMsg->u32DLC) << 16); + + if (psTxMsg->bFDFormat) psTxBuffer->u32Config |= TX_BUFFER_T1_ELEM_FDF_Msk; + + if (psTxMsg->bBitRateSwitch) psTxBuffer->u32Config |= TX_BUFFER_T1_ELEM_BSR_Msk; + + + for (u32Idx = 0; u32Idx < (psTxMsg->u32DLC + (4 - 1)) / 4; u32Idx++) + { + psTxBuffer->au32Data[u32Idx] = psTxMsg->au32Data[u32Idx]; + } + + while (CANFD_GET_COMMUNICATION_STATE(psCanfd) != eCANFD_IDLE) + { + if (--u32TimeOutCnt == 0) return 0; + } + + psCanfd->TXBAR = (1 << u32TxBufIdx); + + return u32Success; +} + + +/** + * @brief Global Filter Configuration (GFC). + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] eNMStdFrm Accept/Reject Non-Matching Standard(11-bits) Frames. + * @param[in] eEMExtFrm Accept/Reject Non-Matching Extended(29-bits) Frames. + * @param[in] u32RejRmtStdFrm Reject/Filter Remote Standard Frames. + * @param[in] u32RejRmtExtFrm Reject/Filter Remote Extended Frames. + * + * @return None. + * + * @details Global Filter Configuration. + */ +void CANFD_SetGFC(CANFD_T *psCanfd, E_CANFD_ACC_NON_MATCH_FRM eNMStdFrm, E_CANFD_ACC_NON_MATCH_FRM eEMExtFrm, uint32_t u32RejRmtStdFrm, uint32_t u32RejRmtExtFrm) +{ + psCanfd->GFC &= ~(CANFD_GFC_ANFS_Msk | CANFD_GFC_ANFE_Msk | CANFD_GFC_RRFS_Msk | CANFD_GFC_RRFE_Msk); + psCanfd->GFC = (eNMStdFrm << CANFD_GFC_ANFS_Pos) | + (eEMExtFrm << CANFD_GFC_ANFE_Pos) | + (u32RejRmtStdFrm << CANFD_GFC_RRFS_Pos) | + (u32RejRmtExtFrm << CANFD_GFC_RRFE_Pos); +} + + +/** + * @brief Rx FIFO Configuration for RX_FIFO_0 and RX_FIFO_1. + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] u32RxFifoNum 0: RX FIFO_0, 1: RX_FIFO_1. + * @param[in] psRamConfig Rx FIFO Size in number of configuration ram address. + * @param[in] psElemSize Rx FIFO Size in number of Rx FIFO elements (element number (max. = 64)). + * @param[in] u32FifoWM Watermark in number of Rx FIFO elements + * @param[in] eFifoSize Maximum data field size that should be stored in this Rx FIFO + * (configure BYTE64 if you are unsure, as this is the largest data field allowed in CAN FD) + * + * @return None. + * + * @details Rx FIFO Configuration for RX_FIFO_0 and RX_FIFO_1. + */ +static void CANFD_InitRxFifo(CANFD_T *psCanfd, uint32_t u32RxFifoNum, CANFD_RAM_PART_T *psRamConfig, CANFD_ELEM_SIZE_T *psElemSize, uint32_t u32FifoWM, E_CANFD_DATA_FIELD_SIZE eFifoSize) +{ + uint32_t u32Address; + uint32_t u32Size; + + /* ignore if index is too high */ + if (u32RxFifoNum > CANFD_NUM_RX_FIFOS)return; + + /* ignore if index is too high */ + if (psElemSize-> u32RxFifo0 > CANFD_MAX_RX_FIFO0_ELEMS) return; + + /* ignore if index is too high */ + if (psElemSize-> u32RxFifo1 > CANFD_MAX_RX_FIFO1_ELEMS) return; + + switch (u32RxFifoNum) + { + case 0: + if (psElemSize-> u32RxFifo0) + { + /* set size of Rx FIFO 0, set offset, blocking mode */ + psCanfd->RXF0C = (psRamConfig->u32RXF0C_F0SA) | (psElemSize->u32RxFifo0 << CANFD_RXF0C_F0S_Pos) + | (u32FifoWM << CANFD_RXF0C_F0WM_Pos); + psCanfd->RXESC = (psCanfd->RXESC & (~CANFD_RXESC_F0DS_Msk)) | (eFifoSize << CANFD_RXESC_F0DS_Pos); + + /*Get the RX FIFO 0 Start Address in the RAM*/ + u32Address = CANFD_SRAM_BASE_ADDR(psCanfd) + (psRamConfig->u32RXF0C_F0SA & CANFD_RXF0C_F0SA_Msk); + u32Size = eFifoSize; + + if (u32Size < 5U) + { + u32Size += 4U; + } + else + { + u32Size = u32Size * 4U - 10U; + } + + /*Clear the RX FIFO 0 Memory*/ + memset((uint32_t *)(u32Address), 0x00, (u32Size * 4 * psElemSize->u32RxFifo0)); + } + else + { + psCanfd->RXF0C = 0; + } + + break; + + case 1: + if (psElemSize-> u32RxFifo1) + { + /* set size of Rx FIFO 1, set offset, blocking mode */ + psCanfd->RXF1C = (psRamConfig->u32RXF1C_F1SA) | (psElemSize->u32RxFifo1 << CANFD_RXF1C_F1S_Pos) + | (u32FifoWM << CANFD_RXF1C_F1WM_Pos); + psCanfd->RXESC = (psCanfd->RXESC & (~CANFD_RXESC_F1DS_Msk)) | (eFifoSize << CANFD_RXESC_F1DS_Pos); + + /*Get the RX FIFO 1 Start Address in the RAM*/ + u32Address = CANFD_SRAM_BASE_ADDR(psCanfd) + (psRamConfig->u32RXF1C_F1SA & CANFD_RXF1C_F1SA_Msk); + + u32Size = eFifoSize; + + if (u32Size < 5U) + { + u32Size += 4U; + } + else + { + u32Size = u32Size * 4U - 10U; + } + + /*Clear the RX FIFO 0 Memory*/ + memset((uint32_t *)(u32Address), 0x00, (u32Size * 4 * psElemSize->u32RxFifo1)); + } + else + { + psCanfd->RXF1C = 0; + } + + break; + } +} + + +/** + * @brief Function configures the data structures used by a dedicated Rx Buffer. + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] psRamConfig Tx buffer configuration ram address. + * @param[in] psElemSize Tx buffer configuration element size. + * @param[in] eTxBufSize Maximum data field size that should be stored in a dedicated Tx Buffer + * (configure BYTE64 if you are unsure, as this is the largest data field allowed in CAN FD)largest data field allowed in CAN FD) + * + * @return None. + * + * @details Function configures the data structures used by a dedicated Rx Buffer. + */ +static void CANFD_InitTxDBuf(CANFD_T *psCanfd, CANFD_RAM_PART_T *psRamConfig, CANFD_ELEM_SIZE_T *psElemSize, E_CANFD_DATA_FIELD_SIZE eTxBufSize) +{ + uint32_t u32Address; + uint32_t u32Size; + + /*Setting the Tx Buffer Start Address*/ + psCanfd->TXBC = ((psElemSize->u32TxBuf & 0x3F) << CANFD_TXBC_NDTB_Pos) | (psRamConfig->u32TXBC_TBSA & CANFD_TXBC_TBSA_Msk); + + /*Get the TX Buffer Start Address in the RAM*/ + u32Address = CANFD_SRAM_BASE_ADDR(psCanfd) + (psRamConfig->u32TXBC_TBSA & CANFD_TXBC_TBSA_Msk); + + /*Setting the Tx Buffer Data Field Size*/ + psCanfd->TXESC = (psCanfd->TXESC & (~CANFD_TXESC_TBDS_Msk)) | (eTxBufSize << CANFD_TXESC_TBDS_Pos); + + /*Get the Buffer Data Field Size*/ + u32Size = eTxBufSize; + + if (u32Size < 5U) + { + u32Size += 4U; + } + else + { + u32Size = u32Size * 4U - 10U; + } + + /*Clear the TX Buffer Memory*/ + memset((uint32_t *)(u32Address), 0x00, (u32Size * 4 * psElemSize->u32TxBuf)); +} + + +/** + * @brief Function configures the data structures used by a dedicated Rx Buffer. + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] psRamConfig Rx buffer configuration ram address. + * @param[in] psElemSize Rx buffer configuration element size. + * @param[in] eRxBufSize Maximum data field size that should be stored in a dedicated Rx Buffer + * (configure BYTE64 if you are unsure, as this is the largest data field allowed in CAN FD)largest data field allowed in CAN FD) + * + * @return None. + * + * @details Function configures the data structures used by a dedicated Rx Buffer. + */ +static void CANFD_InitRxDBuf(CANFD_T *psCanfd, CANFD_RAM_PART_T *psRamConfig, CANFD_ELEM_SIZE_T *psElemSize, E_CANFD_DATA_FIELD_SIZE eRxBufSize) +{ + uint32_t u32Address; + uint32_t u32Size; + + /*Setting the Rx Buffer Start Address*/ + psCanfd->RXBC = (psRamConfig->u32RXBC_RBSA & CANFD_RXBC_RBSA_Msk); + + /*Get the RX Buffer Start Address in the RAM*/ + u32Address = CANFD_SRAM_BASE_ADDR(psCanfd) + (psRamConfig->u32RXBC_RBSA & CANFD_RXBC_RBSA_Msk); + + /*Setting the Rx Buffer Data Field Size*/ + psCanfd->RXESC = (psCanfd->RXESC & (~CANFD_RXESC_RBDS_Msk)) | (eRxBufSize << CANFD_RXESC_RBDS_Pos); + /*Get the Buffer Data Field Size*/ + u32Size = eRxBufSize; + + if (u32Size < 5U) + { + u32Size += 4U; + } + else + { + u32Size = u32Size * 4U - 10U; + } + + /*Clear the RX Buffer Memory*/ + memset((uint32_t *)(u32Address), 0x00, (u32Size * 4 * psElemSize->u32RxBuf)); +} + + +/** + * @brief Configures the register SIDFC for the 11-bit Standard Message ID Filter elements. + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] psRamConfig Standard ID filter configuration ram address + * @param[in] psElemSize Standard ID filter configuration element size + * + * @return None. + * + * @details Function configures the data structures used by a dedicated Rx Buffer. + */ +static void CANFD_ConfigSIDFC(CANFD_T *psCanfd, CANFD_RAM_PART_T *psRamConfig, CANFD_ELEM_SIZE_T *psElemSize) +{ + uint32_t u32Address; + + /*Setting the Filter List Standard Start Address and List Size */ + psCanfd->SIDFC = ((psElemSize->u32SIDFC & 0xFF) << CANFD_SIDFC_LSS_Pos) | (psRamConfig->u32SIDFC_FLSSA & CANFD_SIDFC_FLSSA_Msk); + + /*Get the Filter List Standard Start Address in the RAM*/ + u32Address = CANFD_SRAM_BASE_ADDR(psCanfd) + (psRamConfig->u32SIDFC_FLSSA & CANFD_SIDFC_FLSSA_Msk); + + /*Clear the Filter List Memory*/ + memset((uint32_t *)(u32Address), 0x00, (psElemSize->u32SIDFC * sizeof(CANFD_STD_FILTER_T))); +} + + +/** + * @brief Configures the register XIDFC for the 29-bit Extended Message ID Filter elements. + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] psRamConfig Extended ID filter configuration ram address + * @param[in] psElemSize Extended ID filter configuration element size + * + * @return None. + * + * @details Configures the register XIDFC for the 29-bit Extended Message ID Filter elements. + */ +static void CANFD_ConfigXIDFC(CANFD_T *psCanfd, CANFD_RAM_PART_T *psRamConfig, CANFD_ELEM_SIZE_T *psElemSize) +{ + uint32_t u32Address; + + /*Setting the Filter List Extended Start Address and List Size */ + psCanfd->XIDFC = ((psElemSize->u32XIDFC & 0xFF) << CANFD_XIDFC_LSE_Pos) | (psRamConfig->u32XIDFC_FLESA & CANFD_XIDFC_FLESA_Msk); + + /*Get the Filter List Standard Start Address in the RAM*/ + u32Address = CANFD_SRAM_BASE_ADDR(psCanfd) + (psRamConfig->u32XIDFC_FLESA & CANFD_XIDFC_FLESA_Msk); + + /*Clear the Filter List Memory*/ + memset((uint32_t *)(u32Address), 0x00, (psElemSize->u32XIDFC * sizeof(CANFD_EXT_FILTER_T))); +} + + +/** + * @brief Writes a 11-bit Standard ID filter element in the Message RAM. + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] u32FltrIdx Index at which the filter element should be written in the '11-bit Filter' section of Message RAM + * @param[in] u32Filter Rx Individual filter value. + * + * @return None. + * + * @details Writes a 11-bit Standard ID filter element in the Message RAM. + */ +void CANFD_SetSIDFltr(CANFD_T *psCanfd, uint32_t u32FltrIdx, uint32_t u32Filter) +{ + CANFD_STD_FILTER_T *psFilter; + + /* ignore if index is too high */ + if (u32FltrIdx >= CANFD_MAX_11_BIT_FTR_ELEMS) return; + + /*Get the Filter List Configuration Address in the RAM*/ + psFilter = (CANFD_STD_FILTER_T *)(CANFD_SRAM_BASE_ADDR(psCanfd) + (psCanfd->SIDFC & CANFD_SIDFC_FLSSA_Msk) + (u32FltrIdx * sizeof(CANFD_STD_FILTER_T))); + + /*Wirted the Standard ID filter element to RAM */ + psFilter->VALUE = u32Filter; +} + + +/** + * @brief Writes a 29-bit extended id filter element in the Message RAM. + * Size of an Extended Id filter element is 2 words. So 2 words are written into the Message RAM for each filter element + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] u32FltrIdx Index at which the filter element should be written in the '29-bit Filter' section of Message RAM. + * @param[in] u32FilterLow Rx Individual filter low value. + * @param[in] u32FilterHigh Rx Individual filter high value. + * + * @return None. + * + * @details Writes a 29-bit extended id filter element in the Message RAM. + */ +void CANFD_SetXIDFltr(CANFD_T *psCanfd, uint32_t u32FltrIdx, uint32_t u32FilterLow, uint32_t u32FilterHigh) +{ + CANFD_EXT_FILTER_T *psFilter; + + /* ignore if index is too high */ + if (u32FltrIdx >= CANFD_MAX_29_BIT_FTR_ELEMS) return; + + /*Get the Filter List Configuration Address on RAM*/ + psFilter = (CANFD_EXT_FILTER_T *)(CANFD_SRAM_BASE_ADDR(psCanfd) + (psCanfd->XIDFC & CANFD_XIDFC_FLESA_Msk) + (u32FltrIdx * sizeof(CANFD_EXT_FILTER_T))); + + /*Wirted the Extended ID filter element to RAM */ + psFilter->LOWVALUE = u32FilterLow; + psFilter->HIGHVALUE = u32FilterHigh; +} + + +/** + * @brief Reads a CAN FD Message from Receive Message Buffer. + * + * @param[in] psCanfd The pointer of the specified CAN FD module. + * @param[in] u8MbIdx The CANFD Message Buffer index. + * @param[in] psMsgBuf Pointer to CAN FD message frame structure for reception. + * + * @return 1:Rx Message Buffer is full and has been read successfully. + * 0:Rx Message Buffer is empty. + * + * @details This function reads a CAN message from a specified Receive Message Buffer. + * The function fills a receive CAN message frame structure with just received data + * and activates the Message Buffer again.The function returns immediately. +*/ +uint32_t CANFD_ReadRxBufMsg(CANFD_T *psCanfd, uint8_t u8MbIdx, CANFD_FD_MSG_T *psMsgBuf) +{ + CANFD_BUF_T *psRxBuffer; + uint32_t u32Success = 0; + uint32_t newData = 0; + + if (u8MbIdx < CANFD_MAX_RX_BUF_ELEMS) + { + if (u8MbIdx < 32) + newData = (CANFD_ReadReg(&psCanfd->NDAT1) >> u8MbIdx) & 1; + else + newData = (CANFD_ReadReg(&psCanfd->NDAT2) >> (u8MbIdx - 32)) & 1; + + /* new message is waiting to be read */ + if (newData) + { + /* get memory location of rx buffer */ + psRxBuffer = (CANFD_BUF_T *)(CANFD_SRAM_BASE_ADDR(psCanfd) + (CANFD_ReadReg(&psCanfd->RXBC) & 0xFFFF) + (u8MbIdx * sizeof(CANFD_BUF_T))); + + /* read the message */ + CANFD_CopyDBufToMsgBuf(psRxBuffer, psMsgBuf); + + /* clear 'new data' flag */ + if (u8MbIdx < 32) + psCanfd->NDAT1 = CANFD_ReadReg(&psCanfd->NDAT1) | (1UL << u8MbIdx); + else + psCanfd->NDAT2 = CANFD_ReadReg(&psCanfd->NDAT2) | (1UL << (u8MbIdx - 32)); + + u32Success = 1; + } + } + + return u32Success; +} + + +/** + * @brief Reads a CAN FD Message from Rx FIFO. + * + * @param[in] psCanfd The pointer of the specified CANFD module. + * @param[in] u8FifoIdx Number of the FIFO, 0 or 1. + * @param[in] psMsgBuf Pointer to CANFD message frame structure for reception. + * + * @return 1 Read Message from Rx FIFO successfully. + * 2 Rx FIFO is already overflowed and has been read successfully + * 0 Rx FIFO is not enabled. + * + * @details This function reads a CAN message from the CANFD build-in Rx FIFO. + */ +uint32_t CANFD_ReadRxFifoMsg(CANFD_T *psCanfd, uint8_t u8FifoIdx, CANFD_FD_MSG_T *psMsgBuf) +{ + CANFD_BUF_T *pRxBuffer; + uint8_t GetIndex; + uint32_t u32Success = 0; + __I uint32_t *pRXFS; + __IO uint32_t *pRXFC, *pRXFA; + uint8_t msgLostBit; + + /* check for valid FIFO number */ + if (u8FifoIdx < CANFD_NUM_RX_FIFOS) + { + if (u8FifoIdx == 0) + { + pRXFS = &(psCanfd->RXF0S); + pRXFC = &(psCanfd->RXF0C); + pRXFA = &(psCanfd->RXF0A); + msgLostBit = 3; + } + else + { + pRXFS = &(psCanfd->RXF1S); + pRXFC = &(psCanfd->RXF1C); + pRXFA = &(psCanfd->RXF1A); + msgLostBit = 7; + } + + /* if FIFO is not empty */ + if ((CANFD_ReadReg(pRXFS) & 0x7F) > 0) + { + GetIndex = (uint8_t)((CANFD_ReadReg(pRXFS) >> 8) & 0x3F); + pRxBuffer = (CANFD_BUF_T *)(CANFD_SRAM_BASE_ADDR(psCanfd) + (CANFD_ReadReg(pRXFC) & 0xFFFF) + (GetIndex * sizeof(CANFD_BUF_T))); + + CANFD_CopyRxFifoToMsgBuf(pRxBuffer, psMsgBuf); + + /* we got the message */ + *pRXFA = GetIndex; + + /* check for overflow */ + if (CANFD_ReadReg(pRXFS) & CANFD_RXFS_RFL) + { + /* clear overflow flag */ + psCanfd->IR = (1UL << msgLostBit); + u32Success = 2; + } + else + { + u32Success = 1; + } + } + } + + return u32Success; +} + + +/** + * @brief Copies a message from a dedicated Rx buffer into a message buffer. + * + * @param[in] psRxBuf Buffer to read from. + * @param[in] psMsgBuf Location to store read message. + * + * @return None. + * + * @details Copies a message from a dedicated Rx buffer into a message buffer. + */ +void CANFD_CopyDBufToMsgBuf(CANFD_BUF_T *psRxBuf, CANFD_FD_MSG_T *psMsgBuf) +{ + uint32_t u32Idx; + + if (psRxBuf->u32Id & RX_BUFFER_AND_FIFO_R0_ELEM_ESI_Msk) + psMsgBuf->bErrStaInd = TRUE; + else + psMsgBuf->bErrStaInd = FALSE; + + /* if 29-bit ID */ + if (psRxBuf->u32Id & RX_BUFFER_AND_FIFO_R0_ELEM_XTD_Msk) + { + psMsgBuf->u32Id = (psRxBuf->u32Id & RX_BUFFER_AND_FIFO_R0_ELEM_ID_Msk); + psMsgBuf->eIdType = eCANFD_XID; + } + /* if 11-bit ID */ + else + { + psMsgBuf->u32Id = (psRxBuf->u32Id >> 18) & 0x7FF; + psMsgBuf->eIdType = eCANFD_SID; + } + + if (psRxBuf->u32Id & RX_BUFFER_AND_FIFO_R0_ELEM_RTR_Msk) + psMsgBuf->eFrmType = eCANFD_REMOTE_FRM; + else + psMsgBuf->eFrmType = eCANFD_DATA_FRM; + + + if (psRxBuf->u32Config & RX_BUFFER_AND_FIFO_R1_ELEM_FDF_Msk) + psMsgBuf->bFDFormat = TRUE; + else + psMsgBuf->bFDFormat = FALSE; + + if (psRxBuf->u32Config & RX_BUFFER_AND_FIFO_R1_ELEM_BSR_Msk) + psMsgBuf->bBitRateSwitch = TRUE; + else + psMsgBuf->bBitRateSwitch = FALSE; + + psMsgBuf->u32DLC = CANFD_DecodeDLC((psRxBuf->u32Config & RX_BUFFER_AND_FIFO_R1_ELEM_DLC_Msk) >> RX_BUFFER_AND_FIFO_R1_ELEM_DLC_Pos); + + for (u32Idx = 0 ; u32Idx < psMsgBuf->u32DLC ; u32Idx++) + { + psMsgBuf->au8Data[u32Idx] = psRxBuf->au8Data[u32Idx]; + } +} + + +/** + * @brief Get Rx FIFO water level. + * + * @param[in] psCanfd The pointer to CANFD module base address. + * @param[in] u32RxFifoNum 0: RX FIFO_0, 1: RX_FIFO_1 + * + * @return Rx FIFO water level. + * + * @details Get Rx FIFO water level. + */ +uint32_t CANFD_GetRxFifoWaterLvl(CANFD_T *psCanfd, uint32_t u32RxFifoNum) +{ + uint32_t u32WaterLevel = 0; + + if (u32RxFifoNum == 0) + u32WaterLevel = ((CANFD_ReadReg(&psCanfd->RXF0C) & CANFD_RXF0C_F0WM_Msk) >> CANFD_RXF0C_F0WM_Pos); + else + u32WaterLevel = ((CANFD_ReadReg(&psCanfd->RXF1C) & CANFD_RXF1C_F1WM_Msk) >> CANFD_RXF1C_F1WM_Pos); + + return u32WaterLevel; +} + + +/** + * @brief Copies messages from FIFO into a message buffert. + * + * @param[in] psRxBuf Buffer to read from. + * @param[in] psMsgBuf Location to store read message. + * + * @return None. + * + * @details Copies messages from FIFO into a message buffert. + */ +void CANFD_CopyRxFifoToMsgBuf(CANFD_BUF_T *psRxBuf, CANFD_FD_MSG_T *psMsgBuf) +{ + /*Copies a message from a dedicated Rx FIFO into a message buffer*/ + CANFD_CopyDBufToMsgBuf(psRxBuf, psMsgBuf); +} + + +/** + * @brief Cancel a Tx buffer transmission request. + * + * @param[in] psCanfd The pointer to CANFD module base address. + * @param[in] u32TxBufIdx Tx buffer index number + * + * @return None. + * + * @details Cancel a Tx buffer transmission request. + */ +void CANFD_TxBufCancelReq(CANFD_T *psCanfd, uint32_t u32TxBufIdx) +{ + psCanfd->TXBCR = CANFD_ReadReg(&psCanfd->TXBCR) | (0x1ul << u32TxBufIdx); +} + + +/** + * @brief Checks if a Tx buffer cancellation request has been finished or not. + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] u32TxBufIdx Tx buffer index number + * + * @return 0: cancellation finished. + * 1: cancellation fail + * + * @details Checks if a Tx buffer cancellation request has been finished or not. + */ +uint32_t CANFD_IsTxBufCancelFin(CANFD_T *psCanfd, uint32_t u32TxBufIdx) +{ + /* wait for completion */ + return ((CANFD_ReadReg(&psCanfd->TXBCR) & (0x1ul << u32TxBufIdx)) >> u32TxBufIdx); +} + + +/** + * @brief Checks if a Tx buffer transmission has occurred or not. + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] u32TxBufIdx Tx buffer index number + * + * @return 0: No transmission occurred. + * 1: Transmission occurred + * + * @details Checks if a Tx buffer transmission has occurred or not. + */ +uint32_t CANFD_IsTxBufTransmitOccur(CANFD_T *psCanfd, uint32_t u32TxBufIdx) +{ + return ((CANFD_ReadReg(&psCanfd->TXBTO) & (0x1ul << u32TxBufIdx)) >> u32TxBufIdx); +} + + +/** + * @brief Init Tx event fifo + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] psRamConfig Tx Event Fifo configuration ram address. + * @param[in] psElemSize Tx Event Fifo configuration element size + * @param[in] u32FifoWaterLvl FIFO water level + * + * @return None. + * + * @details Init Tx event fifo. + */ +static void CANFD_InitTxEvntFifo(CANFD_T *psCanfd, CANFD_RAM_PART_T *psRamConfig, CANFD_ELEM_SIZE_T *psElemSize, uint32_t u32FifoWaterLvl) +{ + /* Set TX Event FIFO element size,watermark,start address. */ + psCanfd->TXEFC = (u32FifoWaterLvl << CANFD_TXEFC_EFWN_Pos) | (psElemSize->u32TxEventFifo << CANFD_TXEFC_EFS_Pos) + | (psRamConfig->u32TXEFC_EFSA & CANFD_TXEFC_EFSA_Msk); +} + + +/** + * @brief Get Tx event fifo water level + * + * @param[in] psCanfd The pointer to CANFD module base address. + * + * @return Tx event fifo water level. + * + * @details Get Tx event fifo water level. + */ +uint32_t CANFD_GetTxEvntFifoWaterLvl(CANFD_T *psCanfd) +{ + return ((CANFD_ReadReg(&psCanfd->TXEFC) & CANFD_TXEFC_EFWN_Msk) >> CANFD_TXEFC_EFWN_Pos); +} + + +/** + * @brief Copy Event Elements from TX Event FIFO to user buffer + * + * @param[in] psCanfd The pointer to CAN FD module base address. + * @param[in] u32TxEvntNum Tx Event FIFO number + * @param[in] psTxEvntElem Tx Event Message struct + * + * @return None. + * + * @details Copy all Event Elements from TX Event FIFO to the Software Event List . + */ +void CANFD_CopyTxEvntFifoToUsrBuf(CANFD_T *psCanfd, uint32_t u32TxEvntNum, CANFD_TX_EVNT_ELEM_T *psTxEvntElem) +{ + uint32_t *pu32TxEvnt; + /*Get the Tx Event FIFO Address*/ + pu32TxEvnt = (uint32_t *)CANFD_GetTxBufferElementAddress(psCanfd, u32TxEvntNum); + + /*Get the Error State Indicator*/ + if ((pu32TxEvnt[0] & TX_FIFO_E0_EVENT_ESI_Msk) > 0) + psTxEvntElem->bErrStaInd = TRUE; //Transmitting node is error passive + else + psTxEvntElem->bErrStaInd = FALSE;//Transmitting node is error active + + /*Get the Tx FIFO Identifier type and Identifier*/ + + if ((pu32TxEvnt[0] & TX_FIFO_E0_EVENT_XTD_Msk) > 0) + { + psTxEvntElem-> eIdType = eCANFD_XID; + psTxEvntElem->u32Id = (pu32TxEvnt[0] & TX_FIFO_E0_EVENT_ID_Msk);// Extended ID + } + else + { + psTxEvntElem-> eIdType = eCANFD_SID; + psTxEvntElem->u32Id = (pu32TxEvnt[0] & TX_FIFO_E0_EVENT_ID_Msk) >> 18;// Standard ID + } + + /*Get the Frame type*/ + if ((pu32TxEvnt[0] & TX_FIFO_E0_EVENT_RTR_Msk) > 0) + psTxEvntElem->bRemote = TRUE; //Remote frame + else + psTxEvntElem->bRemote = FALSE; //Data frame + + /*Get the FD Format type*/ + if ((pu32TxEvnt[0] & TX_FIFO_E1_EVENT_FDF_Msk) > 0) + psTxEvntElem->bFDFormat = TRUE; //CAN FD frame format + else + psTxEvntElem->bFDFormat = FALSE; //Classical CAN frame format + + /*Get the Bit Rate Switch type*/ + if ((pu32TxEvnt[0] & TX_FIFO_E1_EVENT_BRS_Msk) > 0) + psTxEvntElem->bBitRateSwitch = TRUE; //Frame transmitted with bit rate switching + else + psTxEvntElem->bBitRateSwitch = FALSE; //Frame transmitted without bit rate switching + + /*Get the Tx FIFO Data Length */ + psTxEvntElem->u32DLC = CANFD_DecodeDLC((uint8_t)((pu32TxEvnt[1] & TX_FIFO_E1_EVENT_DLC_Msk) >> TX_FIFO_E1_EVENT_DLC_Pos)); + + /*Get the Tx FIFO Timestamp */ + psTxEvntElem->u32TxTs = (((pu32TxEvnt[1] & TX_FIFO_E1A_EVENT_TXTS_Msk) >> TX_FIFO_E1A_EVENT_TXTS_Pos)); + /*Get the Tx FIFO Message marker */ + psTxEvntElem->u32MsgMarker = (((pu32TxEvnt[1] & TX_FIFO_E1_EVENT_MM_Msk) >> TX_FIFO_E1_EVENT_MM_Pos)); +} + + +/** + * @brief Get CAN FD interrupts status. + * + * @param[in] psCanfd The pointer of the specified CAN FD module. + * @param[in] u32IntTypeFlag Interrupt Type Flag, should be + * - \ref CANFD_IR_ARA_Msk : Access to Reserved Address interrupt Indicator + * - \ref CANFD_IR_PED_Msk : Protocol Error in Data Phase interrupt Indicator + * - \ref CANFD_IR_PEA_Msk : Protocol Error in Arbitration Phase interrupt Indicator + * - \ref CANFD_IR_WDI_Msk : Watchdog interrupt Indicator + * - \ref CANFD_IR_BO_Msk : Bus_Off Status interrupt Indicator + * - \ref CANFD_IR_EW_Msk : Warning Status interrupt Indicator + * - \ref CANFD_IR_EP_Msk : Error Passive interrupt Indicator + * - \ref CANFD_IR_ELO_Msk : Error Logging Overflow interrupt Indicator + * - \ref CANFD_IR_DRX_Msk : Message stored to Dedicated Rx Buffer interrupt Indicator + * - \ref CANFD_IR_TOO_Msk : Timeout Occurred interrupt Indicator + * - \ref CANFD_IR_MRAF_Msk : Message RAM Access Failure interrupt Indicator + * - \ref CANFD_IR_TSW_Msk : Timestamp Wraparound interrupt Indicator + * - \ref CANFD_IR_TEFL_Msk : Tx Event FIFO Event Lost interrupt Indicator + * - \ref CANFD_IR_TEFF_Msk : Tx Event FIFO Full Indicator + * - \ref CANFD_IR_TEFW_Msk : Tx Event FIFO Watermark Reached Interrupt Indicator + * - \ref CANFD_IR_TEFN_Msk : Tx Event FIFO New Entry Interrupt Indicator + * - \ref CANFD_IR_TFE_Msk : Tx FIFO Empty Interrupt Indicator + * - \ref CANFD_IR_TCF_Msk : Transmission Cancellation Finished Interrupt Indicator + * - \ref CANFD_IR_TC_Msk : Transmission Completed interrupt Indicator + * - \ref CANFD_IR_HPM_Msk : High Priority Message Interrupt Indicator + * - \ref CANFD_IR_RF1L_Msk : Rx FIFO 1 Message Lost Interrupt Indicator + * - \ref CANFD_IR_RF1F_Msk : Rx FIFO 1 Full Interrupt Indicator + * - \ref CANFD_IR_RF1W_Msk : Rx FIFO 1 Watermark Reached Interrupt Indicator + * - \ref CANFD_IR_RF1N_Msk : Rx FIFO 1 New Message Interrupt Indicator + * - \ref CANFD_IR_RF0L_Msk : Rx FIFO 0 Message Lost Interrupt Indicator + * - \ref CANFD_IR_RF0F_Msk : Rx FIFO 0 Full Interrupt Indicator + * - \ref CANFD_IR_RF0W_Msk : Rx FIFO 0 Watermark Reached Interrupt Indicator + * - \ref CANFD_IR_RF0N_Msk : Rx FIFO 0 New Message Interrupt Indicator + * + * @return None. + * + * @details This function gets all CAN FD interrupt status flags. + */ +uint32_t CANFD_GetStatusFlag(CANFD_T *psCanfd, uint32_t u32IntTypeFlag) +{ + return (CANFD_ReadReg(&psCanfd->IR) & u32IntTypeFlag); +} + + +/** + * @brief Clears the CAN FD module interrupt flags + * + * @param[in] psCanfd The pointer of the specified CANFD module. + * @param[in] u32InterruptFlag The specified interrupt of CAN FD module + * - \ref CANFD_IR_ARA_Msk : Access to Reserved Address interrupt Indicator + * - \ref CANFD_IR_PED_Msk : Protocol Error in Data Phase interrupt Indicator + * - \ref CANFD_IR_PEA_Msk : Protocol Error in Arbitration Phase interrupt Indicator + * - \ref CANFD_IR_WDI_Msk : Watchdog interrupt Indicator + * - \ref CANFD_IR_BO_Msk : Bus_Off Status interrupt Indicator + * - \ref CANFD_IR_EW_Msk : Warning Status interrupt Indicator + * - \ref CANFD_IR_EP_Msk : Error Passive interrupt Indicator + * - \ref CANFD_IR_ELO_Msk : Error Logging Overflow interrupt Indicator + * - \ref CANFD_IR_DRX_Msk : Message stored to Dedicated Rx Buffer interrupt Indicator + * - \ref CANFD_IR_TOO_Msk : Timeout Occurred interrupt Indicator + * - \ref CANFD_IR_MRAF_Msk : Message RAM Access Failure interrupt Indicator + * - \ref CANFD_IR_TSW_Msk : Timestamp Wraparound interrupt Indicator + * - \ref CANFD_IR_TEFL_Msk : Tx Event FIFO Event Lost interrupt Indicator + * - \ref CANFD_IR_TEFF_Msk : Tx Event FIFO Full Indicator + * - \ref CANFD_IR_TEFW_Msk : Tx Event FIFO Watermark Reached Interrupt Indicator + * - \ref CANFD_IR_TEFN_Msk : Tx Event FIFO New Entry Interrupt Indicator + * - \ref CANFD_IR_TFE_Msk : Tx FIFO Empty Interrupt Indicator + * - \ref CANFD_IR_TCF_Msk : Transmission Cancellation Finished Interrupt Indicator + * - \ref CANFD_IR_TC_Msk : Transmission Completed interrupt Indicator + * - \ref CANFD_IR_HPM_Msk : High Priority Message Interrupt Indicator + * - \ref CANFD_IR_RF1L_Msk : Rx FIFO 1 Message Lost Interrupt Indicator + * - \ref CANFD_IR_RF1F_Msk : Rx FIFO 1 Full Interrupt Indicator + * - \ref CANFD_IR_RF1W_Msk : Rx FIFO 1 Watermark Reached Interrupt Indicator + * - \ref CANFD_IR_RF1N_Msk : Rx FIFO 1 New Message Interrupt Indicator + * - \ref CANFD_IR_RF0L_Msk : Rx FIFO 0 Message Lost Interrupt Indicator + * - \ref CANFD_IR_RF0F_Msk : Rx FIFO 0 Full Interrupt Indicator + * - \ref CANFD_IR_RF0W_Msk : Rx FIFO 0 Watermark Reached Interrupt Indicator + * - \ref CANFD_IR_RF0N_Msk : Rx FIFO 0 New Message Interrupt Indicator + * + * @return None. + * + * @details This function clears CAN FD interrupt status flags. + */ +void CANFD_ClearStatusFlag(CANFD_T *psCanfd, uint32_t u32InterruptFlag) +{ + /* Write 1 to clear status flag. */ + psCanfd->IR = CANFD_ReadReg(&psCanfd->IR) | u32InterruptFlag; +} + + +/** + * @brief Gets the CAN FD Bus Error Counter value. + * + * @param[in] psCanfd The pointer of the specified CAN FD module. + * @param[in] pu8TxErrBuf TxErrBuf Buffer to store Tx Error Counter value. + * @param[in] pu8RxErrBuf RxErrBuf Buffer to store Rx Error Counter value. + * + * @return None. + * + * @details This function gets the CAN FD Bus Error Counter value for both Tx and Rx direction. + * These values may be needed in the upper layer error handling. + */ +void CANFD_GetBusErrCount(CANFD_T *psCanfd, uint8_t *pu8TxErrBuf, uint8_t *pu8RxErrBuf) +{ + if (pu8TxErrBuf) + { + *pu8TxErrBuf = (uint8_t)((CANFD_ReadReg(&psCanfd->ECR) >> CANFD_ECR_TEC_Pos) & CANFD_ECR_TEC_Msk); + } + + if (pu8RxErrBuf) + { + *pu8RxErrBuf = (uint8_t)((CANFD_ReadReg(&psCanfd->ECR) >> CANFD_ECR_REC_Pos) & CANFD_ECR_REC_Msk); + } +} + + +/** + * @brief CAN FD Run to the Normal Operation. + * + * @param[in] psCanfd The pointer of the specified CAN FD module. + * @param[in] u8Enable TxErrBuf Buffer to store Tx Error Counter value. + * + * @retval CANFD_OK CANFD operation OK. + * @retval CANFD_ERR_TIMEOUT CANFD operation abort due to timeout error. + * + * @details This function gets the CAN FD Bus Error Counter value for both Tx and Rx direction. + * These values may be needed in the upper layer error handling. + */ +int32_t CANFD_RunToNormal(CANFD_T *psCanfd, uint8_t u8Enable) +{ + uint32_t u32TimeOutCnt = CANFD_TIMEOUT; + + if (u8Enable) + { + /* start operation */ + psCanfd->CCCR = CANFD_ReadReg(&psCanfd->CCCR) & ~(CANFD_CCCR_CCE_Msk | CANFD_CCCR_INIT_Msk); + + while (psCanfd->CCCR & CANFD_CCCR_INIT_Msk) + { + if (--u32TimeOutCnt == 0) return CANFD_ERR_TIMEOUT; + } + } + else + { + /* init mode */ + psCanfd->CCCR = CANFD_ReadReg(&psCanfd->CCCR) | CANFD_CCCR_INIT_Msk | CANFD_CCCR_CCE_Msk; + + while (!(psCanfd->CCCR & CANFD_CCCR_INIT_Msk)) + { + if (--u32TimeOutCnt == 0) return CANFD_ERR_TIMEOUT; + } + } + + return CANFD_OK; +} + + + +/*@}*/ /* end of group CANFD_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group CANFD_Driver */ + +/*@}*/ /* end of group Standard_Driver */ diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ccap.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ccap.c new file mode 100644 index 0000000000..a192b7e77a --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ccap.c @@ -0,0 +1,406 @@ +/**************************************************************************//** + * @file ccap.c + * @version V3.00 + * @brief M460 Series CCAP Driver Source File + * + * @copyright SPDX-License-Identifier: Apache-2.0 + * @copyright Copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#include "NuMicro.h" +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup CCAP_Driver CCAP Driver + @{ +*/ + +int32_t g_CCAP_i32ErrCode = 0; /*!< CCAP global error code */ + +/** @addtogroup CCAP_EXPORTED_FUNCTIONS CCAP Exported Functions + @{ +*/ + +/** + * @brief Open and set CCAP function + * + * @param[in] u32InFormat The bits corresponding VSP, HSP, PCLK, INFMT, SNRTYPE, OUTFMT and PDORD configurations. + * - VSP Sensor Vsync Polarity. It should be either \ref CCAP_PAR_VSP_LOW or \ref CCAP_PAR_VSP_HIGH + * - HSP Sensor Hsync Polarity. It should be either \ref CCAP_PAR_HSP_LOW or \ref CCAP_PAR_HSP_HIGH + * - PCLK Sensor Pixel Clock Polarity. It should be either \ref CCAP_PAR_PCLKP_LOW or \ref CCAP_PAR_PCLKP_HIGH + * - INFMT Sensor Input Data Format. It should be either \ref CCAP_PAR_INFMT_YUV422 or \ref CCAP_PAR_INFMT_RGB565 + * - SNRTYPE Sensor Input Type. It should be either \ref CCAP_PAR_SENTYPE_CCIR601 or \ref CCAP_PAR_SENTYPE_CCIR656 + * - PLNFMT Planar Output YUV Format + * - \ref 0 = YUV422 + * - OUTFMT Image Data Format Output to System Memory. It should be one of the following settings + * - \ref CCAP_PAR_OUTFMT_YUV422 + * - \ref CCAP_PAR_OUTFMT_ONLY_Y + * - \ref CCAP_PAR_OUTFMT_RGB555 + * - \ref CCAP_PAR_OUTFMT_RGB565 + * - PDORD Sensor Input Data Order. It should be one of the following settings + * - \ref CCAP_PAR_INDATORD_YUYV + * - \ref CCAP_PAR_INDATORD_YVYU + * - \ref CCAP_PAR_INDATORD_UYVY + * - \ref CCAP_PAR_INDATORD_VYUY + * - \ref CCAP_PAR_INDATORD_RGGB + * - \ref CCAP_PAR_INDATORD_BGGR + * - \ref CCAP_PAR_INDATORD_GBRG + * - \ref CCAP_PAR_INDATORD_GRBG + * @param[in] u32OutFormat Image Data Output Format. It should be + * - \ref CCAP_CTL_PKTEN + * + * @return None + * + * @details Initialize the Camera Capture Interface. + */ +void CCAP_Open(CCAP_T *ccap, uint32_t u32InFormat, uint32_t u32OutFormat) +{ + ccap->PAR = (ccap->PAR & ~(0x000007BFUL)) | u32InFormat; + ccap->CTL = (ccap->CTL & ~(0x00000060UL)) | u32OutFormat; +} + +/** + * @brief Set Cropping Window Starting Address and Size + * + * @param[in] u32VStart: Cropping Window Vertical Starting Address. It should be 0 ~ 0x7FF. + * @param[in] u32HStart: Cropping Window Horizontal Starting Address. It should be 0 ~ 0x7FF. + * @param[in] u32Height: Cropping Window Height. It should be 0 ~ 0x7FF. + * @param[in] u32Width: Cropping Window Width. It should be 0 ~ 0x7FF. + * + * @return None + * + * @details This function is used to set cropping window starting address and size. + */ +void CCAP_SetCroppingWindow(CCAP_T *ccap, uint32_t u32VStart, uint32_t u32HStart, uint32_t u32Height, uint32_t u32Width) +{ + ccap->CWSP = (ccap->CWSP & ~(CCAP_CWSP_CWSADDRV_Msk | CCAP_CWSP_CWSADDRH_Msk)) + | (((u32VStart << 16) | u32HStart)); + + ccap->CWS = (ccap->CWS & ~(CCAP_CWS_CWH_Msk | CCAP_CWS_CWW_Msk)) + | ((u32Height << 16) | u32Width); +} + +/** + * @brief Set System Memory Packet Base Address + * + * @param[in] u32Address: Set CCAP_PKTBA0 register. It should be 0x0 ~ 0xFFFFFFFF. + * + * @return None + * + * @details This function is used to set System Memory Packet Base Address 0 Register. + */ +void CCAP_SetPacketBuf(CCAP_T *ccap, uint32_t u32Address) +{ + ccap->PKTBA0 = u32Address; + ccap->CTL |= CCAP_CTL_UPDATE_Msk; +} + +/** + * @brief Set System Memory Planar Y Base Address + * + * @param[in] u32Address: Set CCAP_YBA register. It should be 0x0 ~ 0xFFFFFFFF. + * + * @return None + * + * @details This function is used to set System Memory Planar Y Base Address 0 Register. + */ +void CCAP_SetPlanarYBuf(CCAP_T *ccap, uint32_t u32Address) +{ + ccap->YBA = u32Address; + ccap->CTL |= CCAP_CTL_UPDATE_Msk; +} + +/** + * @brief Set System Memory Planar U Base Address + * + * @param[in] u32Address: Set CCAP_UBA register. It should be 0x0 ~ 0xFFFFFFFF. + * + * @return None + * + * @details This function is used to set System Memory Planar U Base Address 0 Register. + */ +void CCAP_SetPlanarUBuf(CCAP_T *ccap, uint32_t u32Address) +{ + ccap->UBA = u32Address; + ccap->CTL |= CCAP_CTL_UPDATE_Msk; +} + +/** + * @brief Set System Memory Planar V Base Address + * + * @param[in] u32Address: Set CCAP_VBA register. It should be 0x0 ~ 0xFFFFFFFF. + * + * @return None + * + * @details This function is used to set System Memory Planar V Base Address 0 Register. + */ +void CCAP_SetPlanarVBuf(CCAP_T *ccap, uint32_t u32Address) +{ + ccap->VBA = u32Address; + ccap->CTL |= CCAP_CTL_UPDATE_Msk; +} + +/** + * @brief Close Camera Capture Interface + * + * @param None + * + * @return None + * + * @details This function is used to disable Camera Capture Interface. + */ +void CCAP_Close(CCAP_T *ccap) +{ + ccap->CTL &= ~CCAP_CTL_CCAPEN; +} + +/** + * @brief Enable CCAP Interrupt + * + * @param[in] u32IntMask Interrupt settings. It could be + * - \ref CCAP_INT_VIEN_Msk + * - \ref CCAP_INT_MEIEN_Msk + * - \ref CCAP_INT_ADDRMIEN_Msk + * + * @return None + * + * @details This function is used to enable Video Frame End Interrupt, + * Bus Master Transfer Error Interrupt and Memory Address Match Interrupt. + */ +void CCAP_EnableInt(CCAP_T *ccap, uint32_t u32IntMask) +{ + ccap->INT = (ccap->INT & ~(CCAP_INT_VIEN_Msk | CCAP_INT_MEIEN_Msk | CCAP_INT_ADDRMIEN_Msk)) + | u32IntMask; +} + +/** + * @brief Disable CCAP Interrupt + * + * @param[in] u32IntMask Interrupt settings. It could be + * - \ref CCAP_INT_VINTF_Msk + * - \ref CCAP_INT_MEINTF_Msk + * - \ref CCAP_INT_ADDRMINTF_Msk + * + * @return None + * + * @details This function is used to disable Video Frame End Interrupt, + * Bus Master Transfer Error Interrupt and Memory Address Match Interrupt. + */ +void CCAP_DisableInt(CCAP_T *ccap, uint32_t u32IntMask) +{ + ccap->INT = (ccap->INT & ~(u32IntMask)); +} + +/** + * @brief Enable Monochrome CMOS Sensor + * + * @param[in] u32Interface Data I/O interface setting. It could be + * - \ref CCAP_CTL_MY8_MY4 + * - \ref CCAP_CTL_MY8_MY8 + * @return None + * + * @details This function is used to select monochrome CMOS sensor and set data width. + */ +void CCAP_EnableMono(CCAP_T *ccap, uint32_t u32Interface) +{ + ccap->CTL = (ccap->CTL & ~CCAP_CTL_MY8_MY4) | CCAP_CTL_MONO_Msk | u32Interface; +} + +/** + * @brief Disable Monochrome CMOS Sensor + * + * @param None + * + * @return None + * + * @details This function is used to disable monochrome CMOS sensor selection. + */ +void CCAP_DisableMono(CCAP_T *ccap) +{ + ccap->CTL &= ~CCAP_CTL_MONO_Msk; +} + +/** + * @brief Enable Luminance 8-bit Y to 1-bit Y Conversion + * + * @param[in] u32th Luminance Y8 to Y1 Threshold Value. It should be 0 ~ 255. + * + * @return None + * + * @details This function is used to enable luminance Y8 to Y1 function and set its threshold value. + */ +void CCAP_EnableLumaYOne(CCAP_T *ccap, uint32_t u32th) +{ + ccap->CTL |= CCAP_CTL_Luma_Y_One_Msk; + ccap->LUMA_Y1_THD = u32th & 0xff; +} + +/** + * @brief Disable Luminance 8-bit Y to 1-bit Y Conversion + * + * @param None + * + * @return None + * + * @details This function is used to disable luminance Y8 to Y1 function. + * + */ +void CCAP_DisableLumaYOne(CCAP_T *ccap) +{ + ccap->CTL &= ~CCAP_CTL_Luma_Y_One_Msk; +} + +/** + * @brief Start Camera Capture Interface + * + * @param None + * + * @return None + * + * @details This function is used to start Camera Capture Interface function. + */ +void CCAP_Start(CCAP_T *ccap) +{ + ccap->CTL |= CCAP_CTL_CCAPEN; +} + +/** + * @brief Stop Camera Capture Interface + * + * @param[in] u32FrameComplete: + * - \ref TRUE: Capture module disables the CCAP module automatically after a frame had been captured. + * - \ref FALSE: Stop Capture module now. + * + * @return None + * + * @details If u32FrameComplete is set to TRUE then get a new frame and disable CCAP module. + * + * @note This function sets g_CCAP_i32ErrCode to CCAP_TIMEOUT_ERR if the CCAP_IS_STOPPED() longer than expected. + */ +void CCAP_Stop(CCAP_T *ccap, uint32_t u32FrameComplete) +{ + uint32_t u32TimeOutCount = 94539453; + + if (u32FrameComplete == FALSE) + ccap->CTL &= ~CCAP_CTL_CCAPEN; + else + { + ccap->CTL |= CCAP_CTL_SHUTTER_Msk; + while (!CCAP_IS_STOPPED(ccap)) + { + if (--u32TimeOutCount == 0) + { + g_CCAP_i32ErrCode = CCAP_TIMEOUT_ERR; + break; + } + } + } +} + +/** + * @brief Set Packet Scaling Factor + * + * @param[in] u32VNumerator: Packet Scaling Vertical Factor N. It should be 0x0 ~ 0xFFFF. + * @param[in] u32VDenominator: Packet Scaling Vertical Factor M. It should be 0x0 ~ 0xFFFF. + * @param[in] u32HNumerator: Packet Scaling Horizontal Factor N. It should be 0x0 ~ 0xFFFF. + * @param[in] u32HDenominator: Packet Scaling Horizontal Factor M. It should be 0x0 ~ 0xFFFF. + * + * @return None + * + * @details This function is used to set Packet Scaling Vertical and Horizontal Factor register. + */ +void CCAP_SetPacketScaling(CCAP_T *ccap, uint32_t u32VNumerator, uint32_t u32VDenominator, uint32_t u32HNumerator, uint32_t u32HDenominator) +{ + uint32_t u32NumeratorL, u32NumeratorH; + uint32_t u32DenominatorL, u32DenominatorH; + + u32NumeratorL = u32VNumerator & 0xFF; + u32NumeratorH = u32VNumerator >> 8; + u32DenominatorL = u32VDenominator & 0xFF; + u32DenominatorH = u32VDenominator >> 8; + ccap->PKTSL = (ccap->PKTSL & ~(CCAP_PKTSL_PKTSVNL_Msk | CCAP_PKTSL_PKTSVML_Msk)) + | ((u32NumeratorL << CCAP_PKTSL_PKTSVNL_Pos) | (u32DenominatorL << CCAP_PKTSL_PKTSVML_Pos)); + ccap->PKTSM = (ccap->PKTSM & ~(CCAP_PKTSM_PKTSVNH_Msk | CCAP_PKTSM_PKTSVMH_Msk)) + | ((u32NumeratorH << CCAP_PKTSL_PKTSVNL_Pos) | (u32DenominatorH << CCAP_PKTSL_PKTSVML_Pos)); + + u32NumeratorL = u32HNumerator & 0xFF; + u32NumeratorH = u32HNumerator >> 8; + u32DenominatorL = u32HDenominator & 0xFF; + u32DenominatorH = u32HDenominator >> 8; + ccap->PKTSL = (ccap->PKTSL & ~(CCAP_PKTSL_PKTSHNL_Msk | CCAP_PKTSL_PKTSHML_Msk)) + | ((u32NumeratorL << CCAP_PKTSL_PKTSHNL_Pos) | (u32DenominatorL << CCAP_PKTSL_PKTSHML_Pos)); + ccap->PKTSM = (ccap->PKTSM & ~(CCAP_PKTSM_PKTSHNH_Msk | CCAP_PKTSM_PKTSHMH_Msk)) + | ((u32NumeratorH << CCAP_PKTSL_PKTSHNL_Pos) | (u32DenominatorH << CCAP_PKTSL_PKTSHML_Pos)); +} + +/** + * @brief Set Planar Scaling Factor + * + * @param[in] u32VNumerator: Planar Scaling Vertical Factor N. It should be 0x0 ~ 0xFFFF. + * @param[in] u32VDenominator: Planar Scaling Vertical Factor M. It should be 0x0 ~ 0xFFFF. + * @param[in] u32HNumerator: Planar Scaling Horizontal Factor N. It should be 0x0 ~ 0xFFFF. + * @param[in] u32HDenominator: Planar Scaling Horizontal Factor M. It should be 0x0 ~ 0xFFFF. + * + * @return None + * + * @details This function is used to set Planar Scaling Vertical and Horizontal Factor register. + */ +void CCAP_SetPlanarScaling(CCAP_T *ccap, uint32_t u32VNumerator, uint32_t u32VDenominator, uint32_t u32HNumerator, uint32_t u32HDenominator) +{ + uint32_t u32NumeratorL, u32NumeratorH; + uint32_t u32DenominatorL, u32DenominatorH; + + u32NumeratorL = u32VNumerator & 0xFF; + u32NumeratorH = u32VNumerator >> 8; + u32DenominatorL = u32VDenominator & 0xFF; + u32DenominatorH = u32VDenominator >> 8; + ccap->PLNSL = (ccap->PLNSL & ~(CCAP_PLNSL_PLNSVNL_Msk | CCAP_PLNSL_PLNSVML_Msk)) + | ((u32NumeratorL << CCAP_PLNSL_PLNSVNL_Pos) | (u32DenominatorL << CCAP_PLNSL_PLNSVML_Pos)); + ccap->PLNSM = (ccap->PLNSM & ~(CCAP_PLNSM_PLNSVNH_Msk | CCAP_PLNSM_PLNSVMH_Msk)) + | ((u32NumeratorH << CCAP_PLNSL_PLNSVNL_Pos) | (u32DenominatorH << CCAP_PLNSL_PLNSVML_Pos)); + + u32NumeratorL = u32HNumerator & 0xFF; + u32NumeratorH = u32HNumerator >> 8; + u32DenominatorL = u32HDenominator & 0xFF; + u32DenominatorH = u32HDenominator >> 8; + ccap->PLNSL = (ccap->PLNSL & ~(CCAP_PLNSL_PLNSHNL_Msk | CCAP_PLNSL_PLNSHML_Msk)) + | ((u32NumeratorL << CCAP_PLNSL_PLNSHNL_Pos) | (u32DenominatorL << CCAP_PLNSL_PLNSHML_Pos)); + ccap->PLNSM = (ccap->PLNSM & ~(CCAP_PLNSM_PLNSHNH_Msk | CCAP_PLNSM_PLNSHMH_Msk)) + | ((u32NumeratorH << CCAP_PLNSL_PLNSHNL_Pos) | (u32DenominatorH << CCAP_PLNSL_PLNSHML_Pos)); +} + +/** + * @brief Set Packet Frame Output Pixel Stride Width + * + * @param[in] u32Stride: Set CCAP_STRIDE register. It should be 0x0 ~ 0x3FFF. + * + * @return None + * + * @details This function is used to set Packet Frame Output Pixel Stride Width. + */ +void CCAP_SetPacketStride(CCAP_T *ccap, uint32_t u32Stride) +{ + ccap->STRIDE = (ccap->STRIDE & ~CCAP_STRIDE_PKTSTRIDE_Msk) | (u32Stride << CCAP_STRIDE_PKTSTRIDE_Pos); +} + +/** + * @brief Set Planar Frame Output Pixel Stride Width + * + * @param[in] u32Stride: Set CCAP_STRIDE register. It should be 0x0 ~ 0x3FFF. + * + * @return None + * + * @details This function is used to set Planar Frame Output Pixel Stride Width. + */ +void CCAP_SetPlanarStride(CCAP_T *ccap, uint32_t u32Stride) +{ + ccap->STRIDE = (ccap->STRIDE & ~CCAP_STRIDE_PLNSTRIDE_Msk) | (u32Stride << CCAP_STRIDE_PLNSTRIDE_Pos); +} + + +/*@}*/ /* end of group CCAP_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group CCAP_Driver */ + +/*@}*/ /* end of group Standard_Driver */ diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_clk.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_clk.c new file mode 100644 index 0000000000..50b1637c8c --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_clk.c @@ -0,0 +1,1763 @@ +/**************************************************************************//** + * @file clk.c + * @brief series CLK driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup CLK_Driver CLK Driver + @{ +*/ + +/** @addtogroup CLK_EXPORTED_FUNCTIONS CLK Exported Functions + @{ +*/ +#define SYSPLLFREQCLK FREQ_180MHZ + +/** + * @brief Disable clock divider output function + * @param None + * @return None + * @details This function disable clock divider output function. + */ +void CLK_DisableCKO(void) +{ + /* Disable CKO clock source */ + CLK_DisableModuleClock(CLKO_MODULE); +} + +/** + * @brief This function enable clock divider output module clock, + * enable clock divider output function and set frequency selection. + * @param[in] u32ClkSrc is frequency divider function clock source. Including : + * - \ref CLK_CLKSEL4_CKOSEL_HXT + * - \ref CLK_CLKSEL4_CKOSEL_LXT + * - \ref CLK_CLKSEL4_CKOSEL_LIRC + * - \ref CLK_CLKSEL4_CKOSEL_HIRC + * - \ref CLK_CLKSEL4_CKOSEL_CAPLL + * - \ref CLK_CLKSEL4_CKOSEL_SYSPLL + * - \ref CLK_CLKSEL4_CKOSEL_APLL + * - \ref CLK_CLKSEL4_CKOSEL_EPLL + * - \ref CLK_CLKSEL4_CKOSEL_VPLL + * @param[in] u32ClkDiv is divider output frequency selection. It could be 0~15. + * @param[in] u32ClkDivBy1En is clock divided by one enabled. + * @return None + * @details Output selected clock to CKO. The output clock frequency is divided by u32ClkDiv. \n + * The formula is: \n + * CKO frequency = (Clock source frequency) / 2^(u32ClkDiv + 1) \n + * This function is just used to set CKO clock. + * User must enable I/O for CKO clock output pin by themselves. \n + */ +void CLK_EnableCKO(uint32_t u32ClkSrc, uint32_t u32ClkDiv, uint32_t u32ClkDivBy1En) +{ + /* CKO = clock source / 2^(u32ClkDiv + 1) */ + CLK->CLKOCTL = CLK_CLKOCTL_CLKOEN_Msk | (u32ClkDiv) | (u32ClkDivBy1En << CLK_CLKOCTL_DIV1EN_Pos); + + /* Enable CKO clock source */ + CLK_EnableModuleClock(CLKO_MODULE); + + /* Select CKO clock source */ + CLK_SetModuleClock(CLKO_MODULE, u32ClkSrc, 0UL); +} + +#if defined(USE_MA35D1_SUBM) +/** + * @brief Enter to Power-down mode + * @param None + * @return None + * @details This function is used to let system enter to Power-down mode. \n + * The register write-protection function should be disabled before using this function. + */ +void CLK_PowerDown(void) +{ + /* Set the processor uses deep sleep as its low power mode */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + + /* Set system Power-down enabled */ + SYS->PMUCR |= (SYS_PMUCR_RTPPDEN_Msk); + + /* Chip enter Power-down mode after CPU run WFI instruction */ + __WFI(); + +} + +/** + * @brief Enter to Idle mode + * @param None + * @return None + * @details This function let system enter to Idle mode. \n + * The register write-protection function should be disabled before using this function. + */ +void CLK_Idle(void) +{ + /* Set the processor uses sleep as its low power mode */ + SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk; + + /* Set chip in idle mode because of WFI command */ + SYS->PMUCR &= ~(SYS_PMUCR_RTPPDEN_Msk); + + /* Chip enter idle mode after CPU run WFI instruction */ + __WFI(); +} +#else +void SystemCoreClockUpdate(void) +{ + +} +#endif + +/** + * @brief Get external high speed crystal clock frequency + * @param None + * @return External high frequency crystal frequency + * @details This function get external high frequency crystal frequency. The frequency unit is Hz. + */ +uint32_t CLK_GetHXTFreq(void) +{ + uint32_t u32Freq; + + if ((CLK->PWRCTL & CLK_PWRCTL_HXTEN_Msk) == CLK_PWRCTL_HXTEN_Msk) + { + u32Freq = __HXT; + } + else + { + u32Freq = 0UL; + } + + return u32Freq; +} + + +/** + * @brief Get external low speed crystal clock frequency + * @param None + * @return External low speed crystal clock frequency + * @details This function get external low frequency crystal frequency. The frequency unit is Hz. + */ +uint32_t CLK_GetLXTFreq(void) +{ + uint32_t u32Freq; + + if ((CLK->PWRCTL & CLK_PWRCTL_LXTEN_Msk) == CLK_PWRCTL_LXTEN_Msk) + { + u32Freq = __LXT; + } + else + { + u32Freq = 0UL; + } + + return u32Freq; +} + +/** + * @brief Get SYSCLK0 frequency + * @param None + * @return SYSCLK0 frequency + * @details This function get SYSCLK0 frequency. The frequency unit is Hz. + */ +uint32_t CLK_GetSYSCLK0Freq(void) +{ + uint32_t u32Freq; + + if ((CLK->CLKSEL0 & CLK_CLKSEL0_SYSCK0SEL_Msk) == CLK_CLKSEL0_SYSCK0SEL_EPLL_DIV2) + { + u32Freq = CLK_GetPLLClockFreq(EPLL) / 2; + } + else + { + u32Freq = SYSPLLFREQCLK; + } + + return u32Freq; +} + +/** + * @brief Get SYSCLK1 frequency + * @param None + * @return SYSCLK1 frequency + * @details This function get SYSCLK1 frequency. The frequency unit is Hz. + */ +uint32_t CLK_GetSYSCLK1Freq(void) +{ + uint32_t u32Freq; + + if ((CLK->CLKSEL0 & CLK_CLKSEL0_SYSCK1SEL_Msk) == CLK_CLKSEL0_SYSCK1SEL_HXT) + { + u32Freq = __HXT; + } + else + { + u32Freq = SYSPLLFREQCLK; + } + + return u32Freq; +} + +/** + * @brief Get CPU frequency + * @param None + * @return CPU frequency + * @details This function get CPU frequency. The frequency unit is Hz. + */ +uint32_t CLK_GetCPUFreq(void) +{ + return CLK_GetSYSCLK1Freq(); +} + +/** + * @brief Set HCLK frequency + * @param[in] u32Hclk is HCLK frequency. The range of u32Hclk is running up to 180MHz. + * @return HCLK frequency + * @details This function is used to set HCLK frequency. The frequency unit is Hz. \n + * The register write-protection function should be disabled before using this function. + */ +uint32_t CLK_SetCoreClock(uint32_t u32Hclk) +{ + /* The range of u32Hclk is running up to SYSPLLFREQCLK MHz */ + if (u32Hclk > SYSPLLFREQCLK) + { + u32Hclk = SYSPLLFREQCLK; + } + + /* Return actually HCLK frequency is PLL frequency divide 1 */ + return u32Hclk; +} + +/** + * @brief This function set HCLK clock source and HCLK clock divider + * @param[in] u32ClkSrc is HCLK clock source. Including : + * - \ref CLK_CLKSEL0_HCLKSEL_HXT + * - \ref CLK_CLKSEL0_HCLKSEL_LXT + * - \ref CLK_CLKSEL0_HCLKSEL_PLL + * - \ref CLK_CLKSEL0_HCLKSEL_LIRC + * - \ref CLK_CLKSEL0_HCLKSEL_HIRC + * @param[in] u32ClkDiv is HCLK clock divider. Including : + * - \ref CLK_CLKDIV0_HCLK(x) + * @return None + * @details This function set HCLK clock source and HCLK clock divider. \n + * The register write-protection function should be disabled before using this function. + */ +void CLK_SetHCLK(uint32_t u32ClkSrc, uint32_t u32ClkDiv) +{ +} + +/** + * @brief This function set selected module clock source and module clock divider + * @param[in] u32ModuleIdx is module index. + * @param[in] u32ClkSrc is module clock source. + * @param[in] u32ClkDiv is module clock divider. + * @return None + * @details Valid parameter combinations listed in following table: + * + * |Module index |Clock source |Divider | + * | :---------------- | :----------------------------------- | :------------------------ | + * |\ref CA35CK_MODULE |\ref CLK_CLKSEL0_CA35CKSEL_HXT | x | + * |\ref CA35CK_MODULE |\ref CLK_CLKSEL0_CA35CKSEL_CAPLL | x | + * |\ref SYSCK0_MODULE |\ref CLK_CLKSEL0_SYSCK0SEL_SYSPLL | x | + * |\ref SYSCK0_MODULE |\ref CLK_CLKSEL0_SYSCK0SEL_EPLL | x | + * |\ref LVRDB_MODULE |\ref CLK_CLKSEL0_LVRDBSEL_LIRC | x | + * |\ref LVRDB_MODULE |\ref CLK_CLKSEL0_LVRDBSEL_HIRC | x | + * |\ref SYSCK1_MODULE |\ref CLK_CLKSEL0_SYSCK1SEL_HXT | x | + * |\ref SYSCK1_MODULE |\ref CLK_CLKSEL0_SYSCK1SEL_SYSPLL | x | + * |\ref RTPST_MODULE |\ref CLK_CLKSEL0_RTPSTSEL_HXT | x | + * |\ref RTPST_MODULE |\ref CLK_CLKSEL0_RTPSTSEL_LXT | x | + * |\ref RTPST_MODULE |\ref CLK_CLKSEL0_RTPSTSEL_HXT_DIV2 | x | + * |\ref RTPST_MODULE |\ref CLK_CLKSEL0_RTPSTSEL_SYSCLK1_DIV2 | x | + * |\ref RTPST_MODULE |\ref CLK_CLKSEL0_RTPSTSEL_HIRC | x | + * |\ref CCAP0_MODULE |\ref CLK_CLKSEL0_CCAP0SEL_HXT |\ref CLK_CLKDIV1_CCAP0(x) | + * |\ref CCAP0_MODULE |\ref CLK_CLKSEL0_CCAP0SEL_SYSPLL |\ref CLK_CLKDIV1_CCAP0(x) | + * |\ref CCAP0_MODULE |\ref CLK_CLKSEL0_CCAP0SEL_APLL |\ref CLK_CLKDIV1_CCAP0(x) | + * |\ref CCAP0_MODULE |\ref CLK_CLKSEL0_CCAP0SEL_VPLL |\ref CLK_CLKDIV1_CCAP0(x) | + * |\ref CCAP1_MODULE |\ref CLK_CLKSEL0_CCAP1SEL_HXT |\ref CLK_CLKDIV1_CCAP1(x) | + * |\ref CCAP1_MODULE |\ref CLK_CLKSEL0_CCAP1SEL_SYSPLL |\ref CLK_CLKDIV1_CCAP1(x) | + * |\ref CCAP1_MODULE |\ref CLK_CLKSEL0_CCAP1SEL_APLL |\ref CLK_CLKDIV1_CCAP1(x) | + * |\ref CCAP1_MODULE |\ref CLK_CLKSEL0_CCAP1SEL_VPLL |\ref CLK_CLKDIV1_CCAP1(x) | + * |\ref SD0_MODULE |\ref CLK_CLKSEL0_SD0SEL_SYSPLL | x | + * |\ref SD0_MODULE |\ref CLK_CLKSEL0_SD0SEL_APLL | x | + * |\ref SD1_MODULE |\ref CLK_CLKSEL0_SD1SEL_SYSPLL | x | + * |\ref SD1_MODULE |\ref CLK_CLKSEL0_SD1SEL_APLL | x | + * |\ref DCU_MODULE |\ref CLK_CLKSEL0_DCUSEL_SYSPLL | x | + * |\ref DCU_MODULE |\ref CLK_CLKSEL0_DCUSEL_EPLL | x | + * |\ref GFX_MODULE |\ref CLK_CLKSEL0_GFXSEL_SYSPLL | x | + * |\ref GFX_MODULE |\ref CLK_CLKSEL0_GFXSEL_EPLL | x | + * |\ref DBG_MODULE |\ref CLK_CLKSEL0_DBGSEL_HIRC |\ref CLK_CLKDIV3_DBG(x) | + * |\ref DBG_MODULE |\ref CLK_CLKSEL0_DBGSEL_SYSPLL |\ref CLK_CLKDIV3_DBG(x) | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0SEL_HXT | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0SEL_LXT | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0SEL_LIRC | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0SEL_HIRC | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0SEL_PCLK0 | x | + * |\ref TMR0_MODULE |\ref CLK_CLKSEL1_TMR0SEL_EXT | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1SEL_HXT | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1SEL_LXT | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1SEL_LIRC | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1SEL_HIRC | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1SEL_PCLK0 | x | + * |\ref TMR1_MODULE |\ref CLK_CLKSEL1_TMR1SEL_EXT | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2SEL_HXT | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2SEL_LXT | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2SEL_LIRC | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2SEL_HIRC | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2SEL_PCLK1 | x | + * |\ref TMR2_MODULE |\ref CLK_CLKSEL1_TMR2SEL_EXT | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3SEL_HXT | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3SEL_LXT | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3SEL_LIRC | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3SEL_HIRC | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3SEL_PCLK1 | x | + * |\ref TMR3_MODULE |\ref CLK_CLKSEL1_TMR3SEL_EXT | x | + * |\ref TMR4_MODULE |\ref CLK_CLKSEL1_TMR4SEL_HXT | x | + * |\ref TMR4_MODULE |\ref CLK_CLKSEL1_TMR4SEL_LXT | x | + * |\ref TMR4_MODULE |\ref CLK_CLKSEL1_TMR4SEL_LIRC | x | + * |\ref TMR4_MODULE |\ref CLK_CLKSEL1_TMR4SEL_HIRC | x | + * |\ref TMR4_MODULE |\ref CLK_CLKSEL1_TMR4SEL_EXT | x | + * |\ref TMR4_MODULE |\ref CLK_CLKSEL1_TMR4SEL_PCLK2 | x | + * |\ref TMR5_MODULE |\ref CLK_CLKSEL1_TMR5SEL_HXT | x | + * |\ref TMR5_MODULE |\ref CLK_CLKSEL1_TMR5SEL_LXT | x | + * |\ref TMR5_MODULE |\ref CLK_CLKSEL1_TMR5SEL_LIRC | x | + * |\ref TMR5_MODULE |\ref CLK_CLKSEL1_TMR5SEL_HIRC | x | + * |\ref TMR5_MODULE |\ref CLK_CLKSEL1_TMR5SEL_EXT | x | + * |\ref TMR5_MODULE |\ref CLK_CLKSEL1_TMR5SEL_PCLK2 | x | + * |\ref TMR6_MODULE |\ref CLK_CLKSEL1_TMR6SEL_HXT | x | + * |\ref TMR6_MODULE |\ref CLK_CLKSEL1_TMR6SEL_LXT | x | + * |\ref TMR6_MODULE |\ref CLK_CLKSEL1_TMR6SEL_LIRC | x | + * |\ref TMR6_MODULE |\ref CLK_CLKSEL1_TMR6SEL_HIRC | x | + * |\ref TMR6_MODULE |\ref CLK_CLKSEL1_TMR6SEL_PCLK0 | x | + * |\ref TMR6_MODULE |\ref CLK_CLKSEL1_TMR6SEL_EXT | x | + * |\ref TMR7_MODULE |\ref CLK_CLKSEL1_TMR7SEL_HXT | x | + * |\ref TMR7_MODULE |\ref CLK_CLKSEL1_TMR7SEL_LXT | x | + * |\ref TMR7_MODULE |\ref CLK_CLKSEL1_TMR7SEL_LIRC | x | + * |\ref TMR7_MODULE |\ref CLK_CLKSEL1_TMR7SEL_HIRC | x | + * |\ref TMR7_MODULE |\ref CLK_CLKSEL1_TMR7SEL_PCLK0 | x | + * |\ref TMR7_MODULE |\ref CLK_CLKSEL1_TMR7SEL_EXT | x | + * |\ref TMR8_MODULE |\ref CLK_CLKSEL2_TMR8SEL_HXT | x | + * |\ref TMR8_MODULE |\ref CLK_CLKSEL2_TMR8SEL_LXT | x | + * |\ref TMR8_MODULE |\ref CLK_CLKSEL2_TMR8SEL_LIRC | x | + * |\ref TMR8_MODULE |\ref CLK_CLKSEL2_TMR8SEL_HIRC | x | + * |\ref TMR8_MODULE |\ref CLK_CLKSEL2_TMR8SEL_PCLK1 | x | + * |\ref TMR8_MODULE |\ref CLK_CLKSEL2_TMR8SEL_EXT | x | + * |\ref TMR9_MODULE |\ref CLK_CLKSEL2_TMR9SEL_HXT | x | + * |\ref TMR9_MODULE |\ref CLK_CLKSEL2_TMR9SEL_LXT | x | + * |\ref TMR9_MODULE |\ref CLK_CLKSEL2_TMR9SEL_LIRC | x | + * |\ref TMR9_MODULE |\ref CLK_CLKSEL2_TMR9SEL_HIRC | x | + * |\ref TMR9_MODULE |\ref CLK_CLKSEL2_TMR9SEL_PCLK1 | x | + * |\ref TMR9_MODULE |\ref CLK_CLKSEL2_TMR9SEL_EXT | x | + * |\ref TMR10_MODULE |\ref CLK_CLKSEL2_TMR10SEL_HXT | x | + * |\ref TMR10_MODULE |\ref CLK_CLKSEL2_TMR10SEL_LXT | x | + * |\ref TMR10_MODULE |\ref CLK_CLKSEL2_TMR10SEL_LIRC | x | + * |\ref TMR10_MODULE |\ref CLK_CLKSEL2_TMR10SEL_HIRC | x | + * |\ref TMR10_MODULE |\ref CLK_CLKSEL2_TMR10SEL_EXT | x | + * |\ref TMR10_MODULE |\ref CLK_CLKSEL2_TMR10SEL_PCLK2 | x | + * |\ref TMR11_MODULE |\ref CLK_CLKSEL2_TMR11SEL_HXT | x | + * |\ref TMR11_MODULE |\ref CLK_CLKSEL2_TMR11SEL_LXT | x | + * |\ref TMR11_MODULE |\ref CLK_CLKSEL2_TMR11SEL_LIRC | x | + * |\ref TMR11_MODULE |\ref CLK_CLKSEL2_TMR11SEL_HIRC | x | + * |\ref TMR11_MODULE |\ref CLK_CLKSEL2_TMR11SEL_EXT | x | + * |\ref TMR11_MODULE |\ref CLK_CLKSEL2_TMR11SEL_PCLK2 | x | + * |\ref UART0_MODULE |\ref CLK_CLKSEL2_UART0SEL_HXT |\ref CLK_CLKDIV1_UART0(x) | + * |\ref UART0_MODULE |\ref CLK_CLKSEL2_UART0SEL_SYSCLK1 |\ref CLK_CLKDIV1_UART0(x) | + * |\ref UART1_MODULE |\ref CLK_CLKSEL2_UART1SEL_HXT |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART1_MODULE |\ref CLK_CLKSEL2_UART1SEL_SYSCLK1 |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART2_MODULE |\ref CLK_CLKSEL2_UART2SEL_HXT |\ref CLK_CLKDIV1_UART2(x) | + * |\ref UART2_MODULE |\ref CLK_CLKSEL2_UART2SEL_SYSCLK1 |\ref CLK_CLKDIV1_UART2(x) | + * |\ref UART3_MODULE |\ref CLK_CLKSEL2_UART3SEL_HXT |\ref CLK_CLKDIV1_UART3(x) | + * |\ref UART3_MODULE |\ref CLK_CLKSEL2_UART3SEL_SYSCLK1 |\ref CLK_CLKDIV1_UART3(x) | + * |\ref UART4_MODULE |\ref CLK_CLKSEL2_UART4SEL_HXT |\ref CLK_CLKDIV2_UART4(x) | + * |\ref UART4_MODULE |\ref CLK_CLKSEL2_UART4SEL_SYSCLK1 |\ref CLK_CLKDIV2_UART4(x) | + * |\ref UART5_MODULE |\ref CLK_CLKSEL2_UART5SEL_HXT |\ref CLK_CLKDIV2_UART5(x) | + * |\ref UART5_MODULE |\ref CLK_CLKSEL2_UART5SEL_SYSCLK1 |\ref CLK_CLKDIV2_UART5(x) | + * |\ref UART6_MODULE |\ref CLK_CLKSEL2_UART6SEL_HXT |\ref CLK_CLKDIV2_UART6(x) | + * |\ref UART6_MODULE |\ref CLK_CLKSEL2_UART6SEL_SYSCLK1 |\ref CLK_CLKDIV2_UART6(x) | + * |\ref UART7_MODULE |\ref CLK_CLKSEL2_UART7SEL_HXT |\ref CLK_CLKDIV2_UART7(x) | + * |\ref UART7_MODULE |\ref CLK_CLKSEL2_UART7SEL_SYSCLK1 |\ref CLK_CLKDIV2_UART7(x) | + * |\ref UART8_MODULE |\ref CLK_CLKSEL3_UART8SEL_HXT |\ref CLK_CLKDIV2_UART8(x) | + * |\ref UART8_MODULE |\ref CLK_CLKSEL3_UART8SEL_SYSCLK1 |\ref CLK_CLKDIV2_UART8(x) | + * |\ref UART9_MODULE |\ref CLK_CLKSEL3_UART9SEL_HXT |\ref CLK_CLKDIV2_UART9(x) | + * |\ref UART9_MODULE |\ref CLK_CLKSEL3_UART9SEL_SYSCLK1 |\ref CLK_CLKDIV2_UART9(x) | + * |\ref UART10_MODULE |\ref CLK_CLKSEL3_UART10SEL_HXT |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART10_MODULE |\ref CLK_CLKSEL3_UART10SEL_SYSCLK1 |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART11_MODULE |\ref CLK_CLKSEL3_UART11SEL_HXT |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART11_MODULE |\ref CLK_CLKSEL3_UART11SEL_SYSCLK1 |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART12_MODULE |\ref CLK_CLKSEL3_UART12SEL_HXT |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART12_MODULE |\ref CLK_CLKSEL3_UART12SEL_SYSCLK1 |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART13_MODULE |\ref CLK_CLKSEL3_UART13SEL_HXT |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART13_MODULE |\ref CLK_CLKSEL3_UART13SEL_SYSCLK1 |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART14_MODULE |\ref CLK_CLKSEL3_UART14SEL_HXT |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART14_MODULE |\ref CLK_CLKSEL3_UART14SEL_SYSCLK1 |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART15_MODULE |\ref CLK_CLKSEL3_UART15SEL_HXT |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART15_MODULE |\ref CLK_CLKSEL3_UART15SEL_SYSCLK1 |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART16_MODULE |\ref CLK_CLKSEL3_UART16SEL_HXT |\ref CLK_CLKDIV1_UART1(x) | + * |\ref UART16_MODULE |\ref CLK_CLKSEL3_UART16SEL_SYSCLK1 |\ref CLK_CLKDIV1_UART1(x) | + * |\ref WDT0_MODULE |\ref CLK_CLKSEL3_WDT0SEL_HXT | x | + * |\ref WDT0_MODULE |\ref CLK_CLKSEL3_WDT0SEL_LXT | x | + * |\ref WDT0_MODULE |\ref CLK_CLKSEL3_WDT0SEL_LIRC | x | + * |\ref WDT0_MODULE |\ref CLK_CLKSEL3_WDT0SEL_PCLK3 | x | + * |\ref WWDT0_MODULE |\ref CLK_CLKSEL3_WWDT0SEL_HXT | x | + * |\ref WWDT0_MODULE |\ref CLK_CLKSEL3_WWDT0SEL_LXT | x | + * |\ref WWDT0_MODULE |\ref CLK_CLKSEL3_WWDT0SEL_LIRC | x | + * |\ref WWDT0_MODULE |\ref CLK_CLKSEL3_WWDT0SEL_PCLK3 | x | + * |\ref WDT1_MODULE |\ref CLK_CLKSEL3_WDT1SEL_HXT | x | + * |\ref WDT1_MODULE |\ref CLK_CLKSEL3_WDT1SEL_LXT | x | + * |\ref WDT1_MODULE |\ref CLK_CLKSEL3_WDT1SEL_LIRC | x | + * |\ref WDT1_MODULE |\ref CLK_CLKSEL3_WDT1SEL_PCLK3 | x | + * |\ref WWDT1_MODULE |\ref CLK_CLKSEL3_WWDT1SEL_HXT | x | + * |\ref WWDT1_MODULE |\ref CLK_CLKSEL3_WWDT1SEL_LXT | x | + * |\ref WWDT1_MODULE |\ref CLK_CLKSEL3_WWDT1SEL_LIRC | x | + * |\ref WWDT1_MODULE |\ref CLK_CLKSEL3_WWDT1SEL_PCLK3 | x | + * |\ref WDT2_MODULE |\ref CLK_CLKSEL3_WDT2SEL_HXT | x | + * |\ref WDT2_MODULE |\ref CLK_CLKSEL3_WDT2SEL_LXT | x | + * |\ref WDT2_MODULE |\ref CLK_CLKSEL3_WDT2SEL_LIRC | x | + * |\ref WDT2_MODULE |\ref CLK_CLKSEL3_WDT2SEL_PCLK4 | x | + * |\ref WWDT2_MODULE |\ref CLK_CLKSEL3_WWDT2SEL_HXT | x | + * |\ref WWDT2_MODULE |\ref CLK_CLKSEL3_WWDT2SEL_LXT | x | + * |\ref WWDT2_MODULE |\ref CLK_CLKSEL3_WWDT2SEL_LIRC | x | + * |\ref WWDT2_MODULE |\ref CLK_CLKSEL3_WWDT2SEL_PCLK4 | x | + * |\ref SPI0_MODULE |\ref CLK_CLKSEL4_SPI0SEL_PCLK1 | x | + * |\ref SPI0_MODULE |\ref CLK_CLKSEL4_SPI0SEL_APLL | x | + * |\ref SPI1_MODULE |\ref CLK_CLKSEL4_SPI1SEL_APLL | x | + * |\ref SPI1_MODULE |\ref CLK_CLKSEL4_SPI1SEL_PCLK2 | x | + * |\ref SPI2_MODULE |\ref CLK_CLKSEL4_SPI2SEL_PCLK1 | x | + * |\ref SPI2_MODULE |\ref CLK_CLKSEL4_SPI2SEL_APLL | x | + * |\ref SPI3_MODULE |\ref CLK_CLKSEL4_SPI3SEL_APLL | x | + * |\ref SPI3_MODULE |\ref CLK_CLKSEL4_SPI3SEL_PCLK2 | x | + * |\ref QSPI0_MODULE |\ref CLK_CLKSEL4_QSPI0SEL_PCLK0 | x | + * |\ref QSPI0_MODULE |\ref CLK_CLKSEL4_QSPI0SEL_APLL | x | + * |\ref QSPI1_MODULE |\ref CLK_CLKSEL4_QSPI1SEL_PCLK0 | x | + * |\ref QSPI1_MODULE |\ref CLK_CLKSEL4_QSPI1SEL_APLL | x | + * |\ref I2S0_MODULE |\ref CLK_CLKSEL4_I2S0SEL_APLL | x | + * |\ref I2S0_MODULE |\ref CLK_CLKSEL4_I2S0SEL_SYSCLK1 | x | + * |\ref I2S1_MODULE |\ref CLK_CLKSEL4_I2S1SEL_APLL | x | + * |\ref I2S1_MODULE |\ref CLK_CLKSEL4_I2S1SEL_SYSCLK1 | x | + * |\ref CANFD0_MODULE |\ref CLK_CLKSEL4_CANFD0SEL_APLL |\ref CLK_CLKDIV0_CANFD0(x) | + * |\ref CANFD0_MODULE |\ref CLK_CLKSEL4_CANFD0SEL_VPLL |\ref CLK_CLKDIV0_CANFD0(x) | + * |\ref CANFD1_MODULE |\ref CLK_CLKSEL4_CANFD1SEL_APLL |\ref CLK_CLKDIV0_CANFD1(x) | + * |\ref CANFD1_MODULE |\ref CLK_CLKSEL4_CANFD1SEL_VPLL |\ref CLK_CLKDIV0_CANFD1(x) | + * |\ref CANFD2_MODULE |\ref CLK_CLKSEL4_CANFD2SEL_APLL |\ref CLK_CLKDIV0_CANFD2(x) | + * |\ref CANFD2_MODULE |\ref CLK_CLKSEL4_CANFD2SEL_VPLL |\ref CLK_CLKDIV0_CANFD2(x) | + * |\ref CANFD3_MODULE |\ref CLK_CLKSEL4_CANFD3SEL_APLL |\ref CLK_CLKDIV0_CANFD3(x) | + * |\ref CANFD3_MODULE |\ref CLK_CLKSEL4_CANFD3SEL_VPLL |\ref CLK_CLKDIV0_CANFD3(x) | + * |\ref CLKO_MODULE |\ref CLK_CLKSEL4_CKOSEL_HXT | x | + * |\ref CLKO_MODULE |\ref CLK_CLKSEL4_CKOSEL_LXT | x | + * |\ref CLKO_MODULE |\ref CLK_CLKSEL4_CKOSEL_LIRC | x | + * |\ref CLKO_MODULE |\ref CLK_CLKSEL4_CKOSEL_HIRC | x | + * |\ref CLKO_MODULE |\ref CLK_CLKSEL4_CKOSEL_CAPLL | x | + * |\ref CLKO_MODULE |\ref CLK_CLKSEL4_CKOSEL_SYSPLL | x | + * |\ref CLKO_MODULE |\ref CLK_CLKSEL4_CKOSEL_APLL | x | + * |\ref CLKO_MODULE |\ref CLK_CLKSEL4_CKOSEL_EPLL | x | + * |\ref CLKO_MODULE |\ref CLK_CLKSEL4_CKOSEL_VPLL | x | + * |\ref SC0_MODULE |\ref CLK_CLKSEL4_SC0SEL_HXT |\ref CLK_CLKDIV1_SC0(x) | + * |\ref SC0_MODULE |\ref CLK_CLKSEL4_SC0SEL_PCLK4 |\ref CLK_CLKDIV1_SC0(x) | + * |\ref SC1_MODULE |\ref CLK_CLKSEL4_SC1SEL_HXT |\ref CLK_CLKDIV1_SC1(x) | + * |\ref SC1_MODULE |\ref CLK_CLKSEL4_SC1SEL_PCLK4 |\ref CLK_CLKDIV1_SC1(x) | + * |\ref KPI_MODULE |\ref CLK_CLKSEL4_KPISEL_HXT |\ref CLK_CLKDIV4_KPI(x) | + * |\ref KPI_MODULE |\ref CLK_CLKSEL4_KPISEL_LXT |\ref CLK_CLKDIV4_KPI(x) | + * |\ref CA35CK_MODULE |\ref CLK_CLKSEL0_CA35CKSEL_HXT | x | + * |\ref CA35CK_MODULE |\ref CLK_CLKSEL0_CA35CKSEL_CAPLL | x | + + * + */ +void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv) +{ + uint32_t u32sel = 0U, u32div = 0U; + + if (u32ModuleIdx == KPI_MODULE) + { + CLK->CLKDIV4 = (CLK->CLKDIV4 & ~(CLK_CLKDIV4_KPIDIV_Msk)) | u32ClkDiv; + CLK->CLKSEL4 = (CLK->CLKSEL4 & ~(CLK_CLKSEL4_KPISEL_Msk)) | u32ClkSrc; + CLK->APBCLK0 = (CLK->APBCLK0 & ~(CLK_APBCLK0_KPICKEN_Msk)) | CLK_APBCLK0_KPICKEN_Msk; + } + else if (u32ModuleIdx == ADC_MODULE) + { + CLK->CLKDIV4 = (CLK->CLKDIV4 & ~(CLK_CLKDIV4_ADCDIV_Msk)) | u32ClkDiv; + CLK->APBCLK2 = (CLK->APBCLK2 & ~(CLK_APBCLK2_ADCCKEN_Msk)) | CLK_APBCLK2_ADCCKEN_Msk; + } + else + { + if (MODULE_CLKDIV_Msk(u32ModuleIdx) != MODULE_NoMsk) + { + /* Get clock divider control register address */ + u32div = (uint32_t)&CLK->CLKDIV0 + ((MODULE_CLKDIV(u32ModuleIdx)) * 4U); + /* Apply new divider */ + M32(u32div) = (M32(u32div) & (~(MODULE_CLKDIV_Msk(u32ModuleIdx) << MODULE_CLKDIV_Pos(u32ModuleIdx)))) | u32ClkDiv; + } + + if (MODULE_CLKSEL_Msk(u32ModuleIdx) != MODULE_NoMsk) + { + /* Get clock select control register address */ + u32sel = (uint32_t)&CLK->CLKSEL0 + ((MODULE_CLKSEL(u32ModuleIdx)) * 4U); + /* Set new clock selection setting */ + M32(u32sel) = (M32(u32sel) & (~(MODULE_CLKSEL_Msk(u32ModuleIdx) << MODULE_CLKSEL_Pos(u32ModuleIdx)))) | u32ClkSrc; + } + } +} + +/** + * @brief Set SysTick clock source + * @param[in] u32ClkSrc is module clock source. Including: + * - \ref CLK_CLKSEL0_RTPSTSEL_HXT + * - \ref CLK_CLKSEL0_RTPSTSEL_LXT + * - \ref CLK_CLKSEL0_RTPSTSEL_HXT_DIV2 + * - \ref CLK_CLKSEL0_RTPSTSEL_SYSCLK1_DIV2 + * - \ref CLK_CLKSEL0_RTPSTSEL_HIRC + * @return None + * @details This function set SysTick clock source. \n + * The register write-protection function should be disabled before using this function. + */ +void CLK_SetSysTickClockSrc(uint32_t u32ClkSrc) +{ + CLK->CLKSEL0 = (CLK->CLKSEL0 & ~CLK_CLKSEL0_RTPSTSEL_Msk) | u32ClkSrc; +} + +/** + * @brief Enable clock source + * @param[in] u32ClkMask is clock source mask. Including : + * - \ref CLK_PWRCTL_HXTEN_Msk + * - \ref CLK_PWRCTL_LXTEN_Msk + * - \ref CLK_PWRCTL_HIRCEN_Msk + * - \ref CLK_PWRCTL_LIRCEN_Msk + * @return None + * @details This function enable clock source. \n + * The register write-protection function should be disabled before using this function. + */ +void CLK_EnableXtalRC(uint32_t u32ClkMask) +{ + CLK->PWRCTL |= u32ClkMask; +} + +/** + * @brief Disable clock source + * @param[in] u32ClkMask is clock source mask. Including : + * - \ref CLK_PWRCTL_HXTEN_Msk + * - \ref CLK_PWRCTL_LXTEN_Msk + * - \ref CLK_PWRCTL_HIRCEN_Msk + * - \ref CLK_PWRCTL_LIRCEN_Msk + * @return None + * @details This function disable clock source. \n + * The register write-protection function should be disabled before using this function. + */ +void CLK_DisableXtalRC(uint32_t u32ClkMask) +{ + CLK->PWRCTL &= ~u32ClkMask; +} + +/** + * @brief Enable module clock + * @param[in] u32ModuleIdx is module index. Including : + * - \ref PDMA0_MODULE + * - \ref PDMA1_MODULE + * - \ref PDMA2_MODULE + * - \ref PDMA3_MODULE + * - \ref WH0_MODULE + * - \ref WH1_MODULE + * - \ref HWS_MODULE + * - \ref EBI_MODULE + * - \ref SRAM0_MODULE + * - \ref SRAM1_MODULE + * - \ref ROM_MODULE + * - \ref TRA_MODULE + * - \ref DBG_MODULE + * - \ref CLKO_MODULE + * - \ref GTMR_MODULE + * - \ref GPA_MODULE + * - \ref GPB_MODULE + * - \ref GPC_MODULE + * - \ref GPD_MODULE + * - \ref GPE_MODULE + * - \ref GPF_MODULE + * - \ref GPG_MODULE + * - \ref GPH_MODULE + * - \ref GPI_MODULE + * - \ref GPJ_MODULE + * - \ref GPK_MODULE + * - \ref GPL_MODULE + * - \ref GPM_MODULE + * - \ref GPN_MODULE + * - \ref CA35_MODULE + * - \ref RTP_MODULE + * - \ref TAHB_MODULE + * - \ref LVRDB_MODULE + * - \ref DDR0_MODULE + * - \ref DDR6_MODULE + * - \ref CANFD0_MODULE + * - \ref CANFD1_MODULE + * - \ref CANFD2_MODULE + * - \ref CANFD3_MODULE + * - \ref SDH0_MODULE + * - \ref SDH1_MODULE + * - \ref NAND_MODULE + * - \ref USBD_MODULE + * - \ref USBH_MODULE + * - \ref HUSBH0_MODULE + * - \ref HUSBH1_MODULE + * - \ref GFX_MODULE + * - \ref VDEC_MODULE + * - \ref DCU_MODULE + * - \ref GMAC0_MODULE + * - \ref GMAC1_MODULE + * - \ref CCAP0_MODULE + * - \ref CCAP1_MODULE + * - \ref TMR0_MODULE + * - \ref TMR1_MODULE + * - \ref TMR2_MODULE + * - \ref TMR3_MODULE + * - \ref TMR4_MODULE + * - \ref TMR5_MODULE + * - \ref TMR6_MODULE + * - \ref TMR7_MODULE + * - \ref TMR8_MODULE + * - \ref TMR9_MODULE + * - \ref TMR10_MODULE + * - \ref TMR11_MODULE + * - \ref UART0_MODULE + * - \ref UART1_MODULE + * - \ref UART2_MODULE + * - \ref UART3_MODULE + * - \ref UART4_MODULE + * - \ref UART5_MODULE + * - \ref UART6_MODULE + * - \ref UART7_MODULE + * - \ref UART8_MODULE + * - \ref UART9_MODULE + * - \ref UART10_MODULE + * - \ref UART11_MODULE + * - \ref UART12_MODULE + * - \ref UART13_MODULE + * - \ref UART14_MODULE + * - \ref UART15_MODULE + * - \ref UART16_MODULE + * - \ref RTC_MODULE + * - \ref DDRP_MODULE + * - \ref KPI_MODULE + * - \ref I2C0_MODULE + * - \ref I2C1_MODULE + * - \ref I2C2_MODULE + * - \ref I2C3_MODULE + * - \ref I2C4_MODULE + * - \ref I2C5_MODULE + * - \ref QSPI0_MODULE + * - \ref QSPI1_MODULE + * - \ref SC0_MODULE + * - \ref SC1_MODULE + * - \ref WDT0_MODULE + * - \ref WDT1_MODULE + * - \ref WDT2_MODULE + * - \ref EPWM0_MODULE + * - \ref EPWM1_MODULE + * - \ref EPWM2_MODULE + * - \ref I2S0_MODULE + * - \ref I2S1_MODULE + * - \ref SSMCC_MODULE + * - \ref SSPCC_MODULE + * - \ref SPI0_MODULE + * - \ref SPI1_MODULE + * - \ref SPI2_MODULE + * - \ref SPI3_MODULE + * - \ref ECAP0_MODULE + * - \ref ECAP1_MODULE + * - \ref ECAP2_MODULE + * - \ref QEI0_MODULE + * - \ref QEI1_MODULE + * - \ref QEI2_MODULE + * - \ref ADC_MODULE + * - \ref EADC_MODULE + * @return None + * @details This function is used to enable module clock. + */ +void CLK_EnableModuleClock(uint32_t u32ModuleIdx) +{ + vu32 u32tmpVal = 0UL, u32tmpAddr = 0UL; + + u32tmpVal = (1UL << MODULE_IP_EN_Pos(u32ModuleIdx)); + u32tmpAddr = (uint32_t)&CLK->SYSCLK0; + u32tmpAddr += ((MODULE_APBCLK(u32ModuleIdx) * 4UL)); + + *(vu32 *)u32tmpAddr |= u32tmpVal; +} + +/** + * @brief Disable module clock + * @param[in] u32ModuleIdx is module index. Including : + * - \ref PDMA0_MODULE + * - \ref PDMA1_MODULE + * - \ref PDMA2_MODULE + * - \ref PDMA3_MODULE + * - \ref WH0_MODULE + * - \ref WH1_MODULE + * - \ref HWS_MODULE + * - \ref EBI_MODULE + * - \ref SRAM0_MODULE + * - \ref SRAM1_MODULE + * - \ref ROM_MODULE + * - \ref TRA_MODULE + * - \ref DBG_MODULE + * - \ref CLKO_MODULE + * - \ref GTMR_MODULE + * - \ref GPA_MODULE + * - \ref GPB_MODULE + * - \ref GPC_MODULE + * - \ref GPD_MODULE + * - \ref GPE_MODULE + * - \ref GPF_MODULE + * - \ref GPG_MODULE + * - \ref GPH_MODULE + * - \ref GPI_MODULE + * - \ref GPJ_MODULE + * - \ref GPK_MODULE + * - \ref GPL_MODULE + * - \ref GPM_MODULE + * - \ref GPN_MODULE + * - \ref CA35_MODULE + * - \ref RTP_MODULE + * - \ref TAHB_MODULE + * - \ref LVRDB_MODULE + * - \ref DDR0_MODULE + * - \ref DDR6_MODULE + * - \ref CANFD0_MODULE + * - \ref CANFD1_MODULE + * - \ref CANFD2_MODULE + * - \ref CANFD3_MODULE + * - \ref SDH0_MODULE + * - \ref SDH1_MODULE + * - \ref NAND_MODULE + * - \ref USBD_MODULE + * - \ref USBH_MODULE + * - \ref HUSBH0_MODULE + * - \ref HUSBH1_MODULE + * - \ref GFX_MODULE + * - \ref VDEC_MODULE + * - \ref DCU_MODULE + * - \ref GMAC0_MODULE + * - \ref GMAC1_MODULE + * - \ref CCAP0_MODULE + * - \ref CCAP1_MODULE + * - \ref TMR0_MODULE + * - \ref TMR1_MODULE + * - \ref TMR2_MODULE + * - \ref TMR3_MODULE + * - \ref TMR4_MODULE + * - \ref TMR5_MODULE + * - \ref TMR6_MODULE + * - \ref TMR7_MODULE + * - \ref TMR8_MODULE + * - \ref TMR9_MODULE + * - \ref TMR10_MODULE + * - \ref TMR11_MODULE + * - \ref UART0_MODULE + * - \ref UART1_MODULE + * - \ref UART2_MODULE + * - \ref UART3_MODULE + * - \ref UART4_MODULE + * - \ref UART5_MODULE + * - \ref UART6_MODULE + * - \ref UART7_MODULE + * - \ref UART8_MODULE + * - \ref UART9_MODULE + * - \ref UART10_MODULE + * - \ref UART11_MODULE + * - \ref UART12_MODULE + * - \ref UART13_MODULE + * - \ref UART14_MODULE + * - \ref UART15_MODULE + * - \ref UART16_MODULE + * - \ref RTC_MODULE + * - \ref DDRP_MODULE + * - \ref KPI_MODULE + * - \ref I2C0_MODULE + * - \ref I2C1_MODULE + * - \ref I2C2_MODULE + * - \ref I2C3_MODULE + * - \ref I2C4_MODULE + * - \ref I2C5_MODULE + * - \ref QSPI0_MODULE + * - \ref QSPI1_MODULE + * - \ref SC0_MODULE + * - \ref SC1_MODULE + * - \ref WDT0_MODULE + * - \ref WDT1_MODULE + * - \ref WDT2_MODULE + * - \ref EPWM0_MODULE + * - \ref EPWM1_MODULE + * - \ref EPWM2_MODULE + * - \ref I2S0_MODULE + * - \ref I2S1_MODULE + * - \ref SSMCC_MODULE + * - \ref SSPCC_MODULE + * - \ref SPI0_MODULE + * - \ref SPI1_MODULE + * - \ref SPI2_MODULE + * - \ref SPI3_MODULE + * - \ref ECAP0_MODULE + * - \ref ECAP1_MODULE + * - \ref ECAP2_MODULE + * - \ref QEI0_MODULE + * - \ref QEI1_MODULE + * - \ref QEI2_MODULE + * - \ref ADC_MODULE + * - \ref EADC_MODULE + * @return None + * @details This function is used to disable module clock. + */ +void CLK_DisableModuleClock(uint32_t u32ModuleIdx) +{ + vu32 u32tmpVal = 0UL, u32tmpAddr = 0UL; + + u32tmpVal = ~(1UL << MODULE_IP_EN_Pos(u32ModuleIdx)); + u32tmpAddr = (uint32_t)&CLK->SYSCLK0; + u32tmpAddr += ((MODULE_APBCLK(u32ModuleIdx) * 4UL)); + + *((vu32 *)u32tmpAddr) &= u32tmpVal; +} + +/** + * @brief Get VSI PLL Operation Mode + * @param[in] u32PllIdx is PLL clock index. Including : + * - \ref DDRPLL + * - \ref APLL + * - \ref EPLL + * - \ref VPLL + * @return VSI PLL Operation Mode + * @details This function get VSI PLL Operation Mode. + */ +uint32_t CLK_GetPLLOpMode(uint32_t u32PllIdx) +{ + return (CLK->PLL[u32PllIdx].CTL0 & CLK_PLLnCTL0_MODE_Msk) >> CLK_PLLnCTL0_MODE_Pos; +} + +/** + * @brief This function check selected clock source status + * @param[in] u32ClkMask is selected clock source. Including : + * - \ref CLK_STATUS_HXTSTB_Msk + * - \ref CLK_STATUS_LXTSTB_Msk + * - \ref CLK_STATUS_HIRCSTB_Msk + * - \ref CLK_STATUS_LIRCSTB_Msk + * - \ref CLK_STATUS_CAPLLSTB_Msk + * - \ref CLK_STATUS_DDRPLLSTB_Msk + * - \ref CLK_STATUS_EPLLSTB_Msk + * - \ref CLK_STATUS_APLLSTB_Msk + * - \ref CLK_STATUS_VPLLSTB_Msk + * @retval 0 clock is not stable + * @retval 1 clock is stable + * @details To wait for clock ready by specified clock source stable flag or timeout (~300ms) + */ +uint32_t CLK_WaitClockReady(uint32_t u32ClkMask) +{ + int32_t i32TimeOutCnt = 2160000; + uint32_t u32Ret = 1U; + + while ((CLK->STATUS & u32ClkMask) != u32ClkMask) + { + if (i32TimeOutCnt-- <= 0) + { + u32Ret = 0U; + break; + } + } + + return u32Ret; +} + +#if defined(USE_MA35D1_SUBM) +/** + * @brief Enable System Tick counter + * @param[in] u32ClkSrc is System Tick clock source. Including: + * - \ref CLK_CLKSEL0_RTPSTSEL_HXT + * - \ref CLK_CLKSEL0_RTPSTSEL_LXT + * - \ref CLK_CLKSEL0_RTPSTSEL_HXT_DIV2 + * - \ref CLK_CLKSEL0_RTPSTSEL_SYSCLK1_DIV2 + * - \ref CLK_CLKSEL0_RTPSTSEL_HIRC + * @param[in] u32Count is System Tick reload value. It could be 0~0xFFFFFF. + * @return None + * @details This function set System Tick clock source, reload value, enable System Tick counter and interrupt. \n + * The register write-protection function should be disabled before using this function. + */ +void CLK_EnableSysTick(uint32_t u32ClkSrc, uint32_t u32Count) +{ + /* Set System Tick counter disabled */ + SysTick->CTRL = 0UL; + + /* Set System Tick clock source */ + if (u32ClkSrc == CLK_CLKSEL0_RTPSTSEL_HIRC) + { + SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; + } + else + { + CLK->CLKSEL0 = (CLK->CLKSEL0 & ~CLK_CLKSEL0_RTPSTSEL_Msk) | u32ClkSrc; + } + + /* Set System Tick reload value */ + SysTick->LOAD = u32Count; + + /* Clear System Tick current value and counter flag */ + SysTick->VAL = 0UL; + + /* Set System Tick interrupt enabled and counter enabled */ + SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; +} + +/** + * @brief Disable System Tick counter + * @param None + * @return None + * @details This function disable System Tick counter. + */ +void CLK_DisableSysTick(void) +{ + /* Set System Tick counter disabled */ + SysTick->CTRL = 0UL; +} +#endif + +/** + * @brief Get CAPLL clock frequency + * @param None + * @return PLL frequency + * @details This function get PLL frequency. The frequency unit is Hz. + */ +uint32_t CLK_GetCAPLLClockFreq(void) +{ + uint32_t u32M, u32N, u32P; + uint32_t u32PllClk, u32RefClk; + uint32_t val; + + val = CLK->PLL0CTL0; + + u32N = (val & CLK_PLL0CTL0_FBDIV_Msk); + u32M = (val & CLK_PLL0CTL0_INDIV_Msk) >> (CLK_PLL0CTL0_INDIV_Pos); + u32P = (val & CLK_PLL0CTL0_OUTDIV_Msk) >> (CLK_PLL0CTL0_OUTDIV_Pos); + + if (val & CLK_PLL0CTL0_BP_Msk) + { + u32PllClk = __HXT; + } + else + { + /* u32RefClk is shifted to avoid overflow */ + u32RefClk = __HXT / 100; + + /* Actual PLL output clock frequency */ + u32PllClk = ((u32RefClk * u32N) / ((0x1 << u32P) * u32M)) * 100; + } + + return u32PllClk; +} + +/** + * @brief Get Advanced PLL clock frequency + * @param[in] u32PllIdx is Advanced PLL clock index. Including : + * - \ref DDRPLL + * - \ref APLL + * - \ref EPLL + * - \ref VPLL + * @return Advanced PLL frequency + * @details This function get Advanced PLL frequency. The frequency unit is Hz. + */ +static uint32_t CLK_GetVSIPLLClockFreq(uint32_t u32PllIdx) +{ + uint32_t u32M, u32N, u32P, u32X, u32Mode; + uint32_t u32CTLVal0, u32CTLVal1, u32PllClk = 0ul; + + /* Set PLL Operation mode. */ + u32CTLVal0 = CLK->PLL[u32PllIdx].CTL0; + u32CTLVal1 = CLK->PLL[u32PllIdx].CTL1; + + /* If is power down state, it will return 0 directly. */ + if (u32CTLVal1 & CLK_PLLnCTL1_PD_Msk) + return 0U; + + u32Mode = (u32CTLVal0 & CLK_PLLnCTL0_MODE_Msk) >> CLK_PLLnCTL0_MODE_Pos; + + u32N = (u32CTLVal0 & CLK_PLLnCTL0_FBDIV_Msk); + u32M = (u32CTLVal0 & CLK_PLLnCTL0_INDIV_Msk) >> CLK_PLLnCTL0_INDIV_Pos; + u32P = (u32CTLVal1 & CLK_PLLnCTL1_OUTDIV_Msk) >> CLK_PLLnCTL1_OUTDIV_Pos; + u32X = (u32CTLVal1 & CLK_PLLnCTL1_FRAC_Msk) >> CLK_PLLnCTL1_FRAC_Pos; + + if (u32Mode == 0) + { + /* Actual PLL output clock frequency */ + u32PllClk = (__HXT / (u32P * u32M)) * u32N; + } + else if (u32Mode == 1) + { + /* Actual PLL output clock frequency */ + u32X = (((u32X * 1000) + 500) >> 24); + u32PllClk = (__HXT / 1000) * ((u32N * 1000) + u32X) / (u32P * u32M); + } + else if (u32Mode == 2) + { + //uint32_t u32SR, u32FMOD, u32CTLVal2; + + //u32CTLVal2 = CLK->PLLCTL[u32PllIdx].REG2; + //u32SR = (u32CTLVal0 & (CLK_PLLnCTL0_SSRATE_Msk)) >> CLK_PLLnCTL0_SSRATE_Pos; + //u32FMOD = u32CTLVal2 & CLK_PLLnCTL2_SLOPE_Msk; + + /* Actual PLL output clock frequency */ + u32X = ((u32X * 1000) >> 24); + u32PllClk = (__HXT / 1000) * ((u32N * 1000) + u32X) / (u32P * u32M); + } + + return u32PllClk; +} + +/* VSI-PLL Specification limits */ +#define VSIPLL_FREF_MAX_FREQ 200000000U +#define VSIPLL_FREF_MIN_FREQ 1000000U + +#define VSIPLL_FREFDIVM_MAX_FREQ 40000000U +#define VSIPLL_FREFDIVM_MIN_FREQ0 1000000U +#define VSIPLL_FREFDIVM_MIN_FREQ1 10000000U + +#define VSIPLL_FCLK_MAX_FREQ 2400000000U +#define VSIPLL_FCLK_MIN_FREQ 600000000U + +#define VSIPLL_FCLKO_MAX_FREQ 2400000000U +#define VSIPLL_FCLKO_MIN_FREQ 85700000U + +#define VSIPLL_SPREAD_RANGE 194 +#define VSIPLL_MODULATION_FREQ 50000 + +struct S_PLL_FREQ_MAP +{ + uint64_t freq; + uint32_t mode; + uint32_t ctl0_reg; + uint32_t ctl1_reg; + uint32_t ctl2_reg; +} ; + +static const struct S_PLL_FREQ_MAP s_sVsiPllFreqTbl[] = +{ + { 1000000000, PLL_OPMODE_INTEGER, 0x307d, 0x10, 0 }, /* Mode0 */ + { 884736000, PLL_OPMODE_FRACTIONAL, 0x41024, 0xdd2f1b11, 0 }, /* Mode1 */ + { 533000000, PLL_OPMODE_SPREAD_SPECTRUM, 0x12b8102c, 0x6aaaab20, 0x12317 }, /* Mode2 */ + { } +}; + +static uint64_t CLK_CalPLLFreq_Mode0(uint64_t u64PllSrcClk, uint64_t u64PllFreq, uint32_t *u32Reg) +{ + uint32_t u32Tmp, u32Min, u32MinN, u32MinM, u32MinP; + + uint64_t u64PllClk; + uint64_t u64Con1, u64Con2, u64Con3; + + /* Find best solution */ + u32Min = (uint32_t) - 1; + u32MinM = 0UL; + u32MinN = 0UL; + u32MinP = 0UL; + + if ((u64PllFreq < VSIPLL_FCLKO_MIN_FREQ) || (u64PllFreq > VSIPLL_FCLKO_MAX_FREQ)) + { + u32Reg[0] = s_sVsiPllFreqTbl[0].ctl0_reg; + u32Reg[1] = s_sVsiPllFreqTbl[0].ctl1_reg; + u64PllClk = s_sVsiPllFreqTbl[0].freq; + } + else + { + uint32_t u32TmpM, u32TmpN, u32TmpP; + uint32_t u32RngMinN, u32RngMinM, u32RngMinP; + uint32_t u32RngMaxN, u32RngMaxM, u32RngMaxP; + + /* Find best solution */ + u32RngMinM = 1UL; + u32RngMaxM = 63UL; + + u32RngMinM = ((u64PllSrcClk / VSIPLL_FREFDIVM_MAX_FREQ) > 1) ? + (u64PllSrcClk / VSIPLL_FREFDIVM_MAX_FREQ) : 1; + u32RngMaxM = ((u64PllSrcClk / VSIPLL_FREFDIVM_MIN_FREQ0) < u32RngMaxM) ? + (u64PllSrcClk / VSIPLL_FREFDIVM_MIN_FREQ0) : u32RngMaxM; + + for (u32TmpM = u32RngMinM; u32TmpM < (u32RngMaxM + 1); u32TmpM++) + { + u64Con1 = u64PllSrcClk / u32TmpM; + + u32RngMinN = 16UL; + u32RngMaxN = 2047UL; + + u32RngMinN = ((VSIPLL_FCLK_MIN_FREQ / u64Con1) > u32RngMinN) ? + (VSIPLL_FCLK_MIN_FREQ / u64Con1) : u32RngMinN; + u32RngMaxN = ((VSIPLL_FCLK_MAX_FREQ / u64Con1) < u32RngMaxN) ? + (VSIPLL_FCLK_MAX_FREQ / u64Con1) : u32RngMaxN; + + for (u32TmpN = u32RngMinN; u32TmpN < (u32RngMaxN + 1); u32TmpN++) + { + u64Con2 = u64Con1 * u32TmpN; + + u32RngMinP = 1UL; + u32RngMaxP = 7UL; + + u32RngMinP = ((u64Con2 / VSIPLL_FCLKO_MAX_FREQ) > 1) ? (u64Con2 / + VSIPLL_FCLKO_MAX_FREQ) : 1; + u32RngMaxP = ((u64Con2 / VSIPLL_FCLKO_MIN_FREQ) < u32RngMaxP) ? + (u64Con2 / VSIPLL_FCLKO_MIN_FREQ) : u32RngMaxP; + + for (u32TmpP = u32RngMinP; u32TmpP < (u32RngMaxP + 1); u32TmpP++) + { + u64Con3 = u64Con2 / u32TmpP; + if (u64Con3 > u64PllFreq) + u32Tmp = u64Con3 - u64PllFreq; + else + u32Tmp = u64PllFreq - u64Con3; + + if (u32Tmp < u32Min) + { + u32Min = u32Tmp; + u32MinM = u32TmpM; + u32MinN = u32TmpN; + u32MinP = u32TmpP; + + /* Break when get good results */ + if (u32Min == 0UL) + { + u32Reg[0] = (u32MinM << 12) | (u32MinN); + u32Reg[1] = (u32MinP << 4); + + return ((u64PllSrcClk * u32MinN) / (u32MinP * u32MinM)); + } + } + } + } + + } + + /* Enable and apply new PLL setting. */ + u32Reg[0] = (u32MinM << 12) | (u32MinN); + u32Reg[1] = (u32MinP << 4); + + /* Actual PLL output clock frequency */ + u64PllClk = (u64PllSrcClk * u32MinN) / (u32MinP * u32MinM); + } + + return u64PllClk; +} + + +static uint64_t CLK_CalPLLFreq_Mode1(uint64_t u64PllSrcClk, uint64_t u64PllFreq, uint32_t *u32Reg) +{ + uint64_t u64X, u64N, u64M, u64P, u64tmp, u64tmpP, u64tmpM; + uint64_t u64PllClk, u64FCLKO; + uint32_t u32FRAC, i; + + // check condition 1 + if ((u64PllSrcClk > VSIPLL_FREF_MAX_FREQ) || (u64PllSrcClk < VSIPLL_FREF_MIN_FREQ)) + { + // Fref is incorrect, return fail + return 0; + } + + // check condition 4 + if (u64PllFreq < VSIPLL_FCLKO_MIN_FREQ) + { + // Adjust u64FCLKO + u64FCLKO = 0; + + for (i = 2; i < 100; i++) + { + u64tmp = (i * u64PllFreq); + if (u64tmp > VSIPLL_FCLKO_MIN_FREQ) + { + u64FCLKO = u64tmp; + break; + } + } + + if (u64FCLKO == 0) return 0; + } + else if (u64PllFreq >= VSIPLL_FCLKO_MAX_FREQ) + { + u32Reg[0] = 0x30FA; + u32Reg[1] = (0x2 << 4); + u64PllClk = 1000000000; + return u64PllClk; + } + else + u64FCLKO = u64PllFreq; + + // Find P + u64P = 0; + for (i = 1; i < 8; i++) + { + u64tmpP = i * u64FCLKO; + // it should be condition 3 + if ((u64tmpP <= VSIPLL_FCLKO_MAX_FREQ) && (u64tmpP >= 600000000)) + { + u64P = i; + break; + } + } + + // No reasonable P is found, return fail. + if (u64P == 0) return 0; + + // Find M + u64M = 0; // Initialize it, and use it to judge reasonable M is found or not + for (i = 1; i < 64; i++) + { + u64tmpM = u64PllSrcClk / i; + if ((u64tmpM <= 40000000) && (u64tmpM >= 10000000)) // condition 2 + { + u64M = i; + break; + } + } + + if (u64M == 0) + { + // No reasonable M is found + return 0; + } + + u64tmp = (u64FCLKO * u64P * u64M * 1000) / u64PllSrcClk; + u64N = u64tmp / 1000; + u64X = u64tmp % 1000; + u32FRAC = ((u64X << 24) + 500) / 1000; + + u32Reg[0] = (u64M << 12) | (u64N); + u32Reg[1] = (u64P << 4) | (u32FRAC << 8); + + /* Actual PLL output clock frequency */ + u64PllClk = (u64PllSrcClk * u64tmp) / u64P / u64M / 1000; + + return u64PllClk; +} + +static uint64_t CLK_CalPLLFreq_Mode2(uint64_t PllSrcClk, uint64_t u64PllFreq, uint32_t u32SR, uint32_t u32Fmod, uint32_t *u32Reg) +{ + uint64_t u64PllClk; + uint64_t u64X, u64N, u64M, u64P, u64tmp, u64tmpP, u64tmpM; + uint64_t u64FCLKO, u64SSRATE, u64SLOPE; + uint32_t u32FRAC, i; + + // check condition 1 + if ((PllSrcClk > 200000000) || (PllSrcClk < 1000000)) + { + // Fref is incorrect, return fail case + return 0; + } + + // check condition 4 + if (u64PllFreq < 85700000) + { + u64FCLKO = 0; + for (i = 2; i < 8; i++) + { + u64tmp = (i * u64PllFreq); + if (u64tmp > 85700000) + { + u64FCLKO = u64tmp; + } + } + + if (u64FCLKO == 0) return 0; + } + else if (u64PllFreq >= 2400000000) + { + u32Reg[0] = 0x30FA; + u32Reg[1] = (0x2 << 4); + u64PllClk = 1000000000; + return u64PllClk; + } + else + u64FCLKO = u64PllFreq; + + // Find P + u64P = 0; + for (i = 1; i < 8; i++) + { + u64tmpP = i * u64FCLKO; + if ((u64tmpP <= 2400000000) && (u64tmpP >= 600000000)) + { + u64P = i; + break; + } + } + + // No reasonable P is found, return fail. + if (u64P == 0) return 0; + + // Find M + u64M = 0; // Initialize it, and use it to judge reasonable M is found or not + for (i = 1; i < 64; i++) + { + u64tmpM = PllSrcClk / i; + if ((u64tmpM <= 40000000) && (u64tmpM >= 10000000)) // condition 2 + { + u64M = i; + break; + } + } + + if (u64M == 0) // No reasonable M is found + { + return 0; + } + + u64tmp = (u64FCLKO * u64P * u64M * 1000) / PllSrcClk; + u64N = u64tmp / 1000; + u64X = u64tmp % 1000; + u32FRAC = ((u64X << 24) + 500) / 1000; + + u64SSRATE = ((PllSrcClk >> 1) / (u32Fmod * 2)) - 1; + u64SLOPE = ((u64tmp * u32SR / u64SSRATE) << 24) / 100 / 1000; + + u32Reg[0] = (u64SSRATE << 20) | (u64M << 12) | (u64N); + u32Reg[1] = (u64P << 4) | (u32FRAC << 8); + u32Reg[2] = u64SLOPE; + + /* Actual PLL output clock frequency */ + u64PllClk = (PllSrcClk * u64tmp) / u64P / u64M / 1000; + + return u64PllClk; +} + +/** + * @brief Get Advanced PLL clock frequency + * @param[in] u32PllIdx is Advanced PLL clock index. Including : + * - \ref CAPLL + * - \ref + * - \ref DDRPLL + * - \ref APLL + * - \ref EPLL + * - \ref VPLL + * @return Advanced PLL frequency + * @details This function get Advanced PLL frequency. The frequency unit is Hz. + */ +uint32_t CLK_GetPLLClockFreq(uint32_t u32PllIdx) +{ + uint32_t u32Pllout = 0; + + switch (u32PllIdx) + { + /* SMIC */ + case CAPLL: + u32Pllout = CLK_GetCAPLLClockFreq(); + break; + + case SYSPLL: + u32Pllout = SYSPLLFREQCLK; + break; + + /* VSI */ + case DDRPLL: + case EPLL: + case APLL: + case VPLL: + u32Pllout = CLK_GetVSIPLLClockFreq(u32PllIdx); + break; + + default: + break; + } + + return u32Pllout; +} + +/* CPU-PLL: 1000MHz 800MHz 700MHz */ +static const struct S_PLL_FREQ_MAP s_au32CAPLLMap[] = +{ + { 1000000000u, PLL_OPMODE_INTEGER, 0x000006FA, 0, 0 }, /* 1000 MHz */ + { 800000000u, PLL_OPMODE_INTEGER, 0x00000364, 0, 0 }, /* 800 MHz */ + { 700000000u, PLL_OPMODE_INTEGER, 0x000006AF, 0, 0 }, /* 700 MHz */ +}; +#define ARRARSIZE_CAPLLPLLMAP (sizeof(s_au32CAPLLMap)/sizeof(struct S_PLL_FREQ_MAP)) + +static uint64_t CLK_SetCAPLLClockFreq(uint32_t u32PllIdx, uint32_t u32OpMode, uint64_t PllSrcClk, uint64_t u64PllFreq) +{ + // TODO + uint32_t i; + + for (i = 0; i < ARRARSIZE_CAPLLPLLMAP; i++) + { + if ((u32OpMode == PLL_OPMODE_INTEGER) && (u64PllFreq == s_au32CAPLLMap[i].freq)) + { + CLK->PLL0CTL0 = s_au32CAPLLMap[i].ctl0_reg; + return s_au32CAPLLMap[i].freq; + } + } + + return 0; +} + +static uint64_t CLK_SetVSIPLLFreq(uint32_t u32PllIdx, uint32_t u32OpMode, uint64_t PllSrcClk, uint64_t u64PllFreq) +{ + uint32_t u32CTLVal0, u32CTLVal1, u32CTLVal2; + uint32_t u32Reg[3] = {0}; + uint64_t u64PllClk = 0; + + /* Set PLL Operation mode. */ + u32CTLVal0 = CLK->PLL[u32PllIdx].CTL0; + u32CTLVal1 = CLK->PLL[u32PllIdx].CTL1; + u32CTLVal2 = CLK->PLL[u32PllIdx].CTL2; + + /* Set PLL Operation mode. */ + u32CTLVal0 = (u32CTLVal0 & ~CLK_PLLnCTL0_MODE_Msk) | (u32OpMode << CLK_PLLnCTL0_MODE_Pos); + + if (u32OpMode == PLL_OPMODE_INTEGER) + { + u64PllClk = CLK_CalPLLFreq_Mode0(PllSrcClk, u64PllFreq, &u32Reg[0]); + u32CTLVal0 = (u32CTLVal0 & ~(CLK_PLLnCTL0_INDIV_Msk | CLK_PLLnCTL0_FBDIV_Msk)) | u32Reg[0]; + u32CTLVal1 = (u32CTLVal1 & ~CLK_PLLnCTL1_OUTDIV_Msk) | u32Reg[1]; + } + else if (u32OpMode == PLL_OPMODE_FRACTIONAL) + { + u64PllClk = CLK_CalPLLFreq_Mode1(PllSrcClk, u64PllFreq, &u32Reg[0]); + u32CTLVal0 = (u32CTLVal0 & ~(CLK_PLLnCTL0_INDIV_Msk | CLK_PLLnCTL0_FBDIV_Msk)) | u32Reg[0]; + u32CTLVal1 = (u32CTLVal1 & ~(CLK_PLLnCTL1_OUTDIV_Msk | CLK_PLLnCTL1_FRAC_Msk)) | u32Reg[1]; + } + else if (u32OpMode == PLL_OPMODE_SPREAD_SPECTRUM) + { + u64PllClk = CLK_CalPLLFreq_Mode2(PllSrcClk, u64PllFreq, 50000, 194, &u32Reg[0]); /* 50 khz, 1.94% */ + u32CTLVal0 = (u32CTLVal0 & ~(CLK_PLLnCTL0_SSRATE_Msk | CLK_PLLnCTL0_INDIV_Msk | CLK_PLLnCTL0_FBDIV_Msk)) | u32Reg[0]; + u32CTLVal1 = (u32CTLVal1 & ~(CLK_PLLnCTL1_OUTDIV_Msk | CLK_PLLnCTL1_FRAC_Msk)) | u32Reg[1]; + u32CTLVal2 = u32Reg[2]; + } + else + { + return 0; + } + + CLK->PLL[u32PllIdx].CTL0 = u32CTLVal0; + CLK->PLL[u32PllIdx].CTL1 = u32CTLVal1 & (~CLK_PLLnCTL1_PD_Msk); + CLK->PLL[u32PllIdx].CTL2 = u32CTLVal2; + + return u64PllClk; +} + +uint64_t CLK_SetPLLFreq(uint32_t u32PllIdx, uint32_t u32OpMode, uint64_t PllSrcClk, uint64_t u64PllFreq) +{ + uint64_t u64Pllout = 0; + + switch (u32PllIdx) + { + /* SMIC */ + case CAPLL: + u64Pllout = CLK_SetCAPLLClockFreq(u32PllIdx, u32OpMode, PllSrcClk, u64PllFreq); + break; + + case SYSPLL: + u64Pllout = SYSPLLFREQCLK; + break; + + /* VSI */ + case DDRPLL: + case EPLL: + case APLL: + case VPLL: + u64Pllout = CLK_SetVSIPLLFreq(u32PllIdx, u32OpMode, PllSrcClk, u64PllFreq); + break; + + default: + break; + } + + return u64Pllout; +} + +/** + * @brief Get selected module clock source + * @param[in] u32ModuleIdx is module index. + * - \ref PDMA0_MODULE + * - \ref PDMA1_MODULE + * - \ref PDMA2_MODULE + * - \ref PDMA3_MODULE + * - \ref WH0_MODULE + * - \ref WH1_MODULE + * - \ref HWS_MODULE + * - \ref EBI_MODULE + * - \ref SRAM0_MODULE + * - \ref SRAM1_MODULE + * - \ref ROM_MODULE + * - \ref TRA_MODULE + * - \ref DBG_MODULE + * - \ref CLKO_MODULE + * - \ref GTMR_MODULE + * - \ref GPA_MODULE + * - \ref GPB_MODULE + * - \ref GPC_MODULE + * - \ref GPD_MODULE + * - \ref GPE_MODULE + * - \ref GPF_MODULE + * - \ref GPG_MODULE + * - \ref GPH_MODULE + * - \ref GPI_MODULE + * - \ref GPJ_MODULE + * - \ref GPK_MODULE + * - \ref GPL_MODULE + * - \ref GPM_MODULE + * - \ref GPN_MODULE + * - \ref CA35_MODULE + * - \ref RTP_MODULE + * - \ref TAHB_MODULE + * - \ref LVRDB_MODULE + * - \ref DDR0_MODULE + * - \ref DDR6_MODULE + * - \ref CANFD0_MODULE + * - \ref CANFD1_MODULE + * - \ref CANFD2_MODULE + * - \ref CANFD3_MODULE + * - \ref SDH0_MODULE + * - \ref SDH1_MODULE + * - \ref NAND_MODULE + * - \ref USBD_MODULE + * - \ref USBH_MODULE + * - \ref HUSBH0_MODULE + * - \ref HUSBH1_MODULE + * - \ref GFX_MODULE + * - \ref VDEC_MODULE + * - \ref DCU_MODULE + * - \ref GMAC0_MODULE + * - \ref GMAC1_MODULE + * - \ref CCAP0_MODULE + * - \ref CCAP1_MODULE + * - \ref TMR0_MODULE + * - \ref TMR1_MODULE + * - \ref TMR2_MODULE + * - \ref TMR3_MODULE + * - \ref TMR4_MODULE + * - \ref TMR5_MODULE + * - \ref TMR6_MODULE + * - \ref TMR7_MODULE + * - \ref TMR8_MODULE + * - \ref TMR9_MODULE + * - \ref TMR10_MODULE + * - \ref TMR11_MODULE + * - \ref UART0_MODULE + * - \ref UART1_MODULE + * - \ref UART2_MODULE + * - \ref UART3_MODULE + * - \ref UART4_MODULE + * - \ref UART5_MODULE + * - \ref UART6_MODULE + * - \ref UART7_MODULE + * - \ref UART8_MODULE + * - \ref UART9_MODULE + * - \ref UART10_MODULE + * - \ref UART11_MODULE + * - \ref UART12_MODULE + * - \ref UART13_MODULE + * - \ref UART14_MODULE + * - \ref UART15_MODULE + * - \ref UART16_MODULE + * - \ref RTC_MODULE + * - \ref DDRP_MODULE + * - \ref KPI_MODULE + * - \ref I2C0_MODULE + * - \ref I2C1_MODULE + * - \ref I2C2_MODULE + * - \ref I2C3_MODULE + * - \ref I2C4_MODULE + * - \ref I2C5_MODULE + * - \ref QSPI0_MODULE + * - \ref QSPI1_MODULE + * - \ref SC0_MODULE + * - \ref SC1_MODULE + * - \ref WDT0_MODULE + * - \ref WDT1_MODULE + * - \ref WDT2_MODULE + * - \ref EPWM0_MODULE + * - \ref EPWM1_MODULE + * - \ref EPWM2_MODULE + * - \ref I2S0_MODULE + * - \ref I2S1_MODULE + * - \ref SSMCC_MODULE + * - \ref SSPCC_MODULE + * - \ref SPI0_MODULE + * - \ref SPI1_MODULE + * - \ref SPI2_MODULE + * - \ref SPI3_MODULE + * - \ref ECAP0_MODULE + * - \ref ECAP1_MODULE + * - \ref ECAP2_MODULE + * - \ref QEI0_MODULE + * - \ref QEI1_MODULE + * - \ref QEI2_MODULE + * - \ref ADC_MODULE + * - \ref EADC_MODULE + * @return Selected module clock source setting + * @details This function get selected module clock source. + */ +uint32_t CLK_GetModuleClockSource(uint32_t u32ModuleIdx) +{ + uint32_t u32sel = 0; + uint32_t u32SelTbl[5] = {0x0, 0x4, 0x8, 0xC, 0x10}; + + /* Get clock source selection setting */ + if (MODULE_CLKSEL_Msk(u32ModuleIdx) != MODULE_NoMsk) + { + /* Get clock select control register address */ + u32sel = (uint32_t)&CLK->CLKSEL0 + (u32SelTbl[MODULE_CLKSEL(u32ModuleIdx)]); + /* Get clock source selection setting */ + return ((M32(u32sel) & (MODULE_CLKSEL_Msk(u32ModuleIdx) << MODULE_CLKSEL_Pos(u32ModuleIdx))) >> MODULE_CLKSEL_Pos(u32ModuleIdx)); + } + else + return 0; +} + +/** + * @brief Get selected module clock divider number + * @param[in] u32ModuleIdx is module index. + * - \ref PDMA0_MODULE + * - \ref PDMA1_MODULE + * - \ref PDMA2_MODULE + * - \ref PDMA3_MODULE + * - \ref WH0_MODULE + * - \ref WH1_MODULE + * - \ref HWS_MODULE + * - \ref EBI_MODULE + * - \ref SRAM0_MODULE + * - \ref SRAM1_MODULE + * - \ref ROM_MODULE + * - \ref TRA_MODULE + * - \ref DBG_MODULE + * - \ref CLKO_MODULE + * - \ref GTMR_MODULE + * - \ref GPA_MODULE + * - \ref GPB_MODULE + * - \ref GPC_MODULE + * - \ref GPD_MODULE + * - \ref GPE_MODULE + * - \ref GPF_MODULE + * - \ref GPG_MODULE + * - \ref GPH_MODULE + * - \ref GPI_MODULE + * - \ref GPJ_MODULE + * - \ref GPK_MODULE + * - \ref GPL_MODULE + * - \ref GPM_MODULE + * - \ref GPN_MODULE + * - \ref CA35_MODULE + * - \ref RTP_MODULE + * - \ref TAHB_MODULE + * - \ref LVRDB_MODULE + * - \ref DDR0_MODULE + * - \ref DDR6_MODULE + * - \ref CANFD0_MODULE + * - \ref CANFD1_MODULE + * - \ref CANFD2_MODULE + * - \ref CANFD3_MODULE + * - \ref SDH0_MODULE + * - \ref SDH1_MODULE + * - \ref NAND_MODULE + * - \ref USBD_MODULE + * - \ref USBH_MODULE + * - \ref HUSBH0_MODULE + * - \ref HUSBH1_MODULE + * - \ref GFX_MODULE + * - \ref VDEC_MODULE + * - \ref DCU_MODULE + * - \ref GMAC0_MODULE + * - \ref GMAC1_MODULE + * - \ref CCAP0_MODULE + * - \ref CCAP1_MODULE + * - \ref TMR0_MODULE + * - \ref TMR1_MODULE + * - \ref TMR2_MODULE + * - \ref TMR3_MODULE + * - \ref TMR4_MODULE + * - \ref TMR5_MODULE + * - \ref TMR6_MODULE + * - \ref TMR7_MODULE + * - \ref TMR8_MODULE + * - \ref TMR9_MODULE + * - \ref TMR10_MODULE + * - \ref TMR11_MODULE + * - \ref UART0_MODULE + * - \ref UART1_MODULE + * - \ref UART2_MODULE + * - \ref UART3_MODULE + * - \ref UART4_MODULE + * - \ref UART5_MODULE + * - \ref UART6_MODULE + * - \ref UART7_MODULE + * - \ref UART8_MODULE + * - \ref UART9_MODULE + * - \ref UART10_MODULE + * - \ref UART11_MODULE + * - \ref UART12_MODULE + * - \ref UART13_MODULE + * - \ref UART14_MODULE + * - \ref UART15_MODULE + * - \ref UART16_MODULE + * - \ref RTC_MODULE + * - \ref DDRP_MODULE + * - \ref KPI_MODULE + * - \ref I2C0_MODULE + * - \ref I2C1_MODULE + * - \ref I2C2_MODULE + * - \ref I2C3_MODULE + * - \ref I2C4_MODULE + * - \ref I2C5_MODULE + * - \ref QSPI0_MODULE + * - \ref QSPI1_MODULE + * - \ref SC0_MODULE + * - \ref SC1_MODULE + * - \ref WDT0_MODULE + * - \ref WDT1_MODULE + * - \ref WDT2_MODULE + * - \ref EPWM0_MODULE + * - \ref EPWM1_MODULE + * - \ref EPWM2_MODULE + * - \ref I2S0_MODULE + * - \ref I2S1_MODULE + * - \ref SSMCC_MODULE + * - \ref SSPCC_MODULE + * - \ref SPI0_MODULE + * - \ref SPI1_MODULE + * - \ref SPI2_MODULE + * - \ref SPI3_MODULE + * - \ref ECAP0_MODULE + * - \ref ECAP1_MODULE + * - \ref ECAP2_MODULE + * - \ref QEI0_MODULE + * - \ref QEI1_MODULE + * - \ref QEI2_MODULE + * - \ref ADC_MODULE + * - \ref EADC_MODULE + * @return Selected module clock divider number setting + * @details This function get selected module clock divider number. + */ +uint32_t CLK_GetModuleClockDivider(uint32_t u32ModuleIdx) +{ + vu32 u32div = 0; + uint32_t u32DivTbl[5] = {0x0, 0x4, 0xc, 0xc, 0x10}; + + if (MODULE_CLKDIV_Msk(u32ModuleIdx) != MODULE_NoMsk) + { + if (u32ModuleIdx == KPI_MODULE) + { + u32div = (CLK->CLKDIV4 & CLK_CLKDIV4_KPIDIV_Msk) >> CLK_CLKDIV4_KPIDIV_Pos; + return u32div; + } + else if (u32ModuleIdx == ADC_MODULE) + { + u32div = (CLK->CLKDIV4 & CLK_CLKDIV4_ADCDIV_Msk) >> CLK_CLKDIV4_ADCDIV_Pos; + return u32div; + } + else + { + /* Get clock divider control register address */ + u32div = (vu32)&CLK->CLKDIV0 + (u32DivTbl[MODULE_CLKDIV(u32ModuleIdx)]); + /* Get clock divider number setting */ + return ((M32(u32div) & (MODULE_CLKDIV_Msk(u32ModuleIdx) << MODULE_CLKDIV_Pos(u32ModuleIdx))) >> MODULE_CLKDIV_Pos(u32ModuleIdx)); + } + } + else + return 0; +} + + +/*@}*/ /* end of group CLK_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group CLK_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_disp.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_disp.c new file mode 100644 index 0000000000..f92ce1537a --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_disp.c @@ -0,0 +1,560 @@ +/**************************************************************************//** + * @file nu_disp.c + * @brief DISP driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup DISP_Driver DISP Driver + @{ +*/ + +/** @addtogroup DISP_EXPORTED_FUNCTIONS DISP Exported Functions + @{ +*/ + +static const DISP_LCD_INFO *g_psDispLcdInfo_Curr = NULL; + +const static DISP_LCD_INFO g_sLcdInfo_arr [eDispLcd_Cnt] = +{ + { + /* eDispLcd_1024x600 */ + .u32ResolutionWidth = 1024, + .u32ResolutionHeight = 600, + .sLcdTiming = + { + .u32PCF = 51000000, + .u32HA = 1024, + .u32HSL = 1, + .u32HFP = 160, + .u32HBP = 160, + .u32VA = 600, + .u32VSL = 1, + .u32VFP = 23, + .u32VBP = 12, + .eHSPP = ePolarity_Positive, + .eVSPP = ePolarity_Positive + }, + .sPanelConf = + { + .eDpiFmt = eDPIFmt_D24, + .eDEP = ePolarity_Positive, + .eDP = ePolarity_Positive, + .eCP = ePolarity_Positive + }, + }, + { + /* eDispLcd_800x480 */ + .u32ResolutionWidth = 800, + .u32ResolutionHeight = 480, + .sLcdTiming = + { + .u32PCF = 45000000, + .u32HA = 800, + .u32HSL = 1, + .u32HFP = 210, + .u32HBP = 46, + .u32VA = 480, + .u32VSL = 1, + .u32VFP = 22, + .u32VBP = 23, + .eHSPP = ePolarity_Positive, + .eVSPP = ePolarity_Positive + }, + .sPanelConf = + { + .eDpiFmt = eDPIFmt_D24, + .eDEP = ePolarity_Positive, + .eDP = ePolarity_Positive, + .eCP = ePolarity_Positive + }, + }, + { + /* eDispLcd_1920x1080 */ + .u32ResolutionWidth = 1920, + .u32ResolutionHeight = 1080, + .sLcdTiming = + { + .u32PCF = 125000000, + .u32HA = 1920, + .u32HSL = 32, + .u32HFP = 120, + .u32HBP = 128, + .u32VA = 1080, + .u32VSL = 14, + .u32VFP = 21, + .u32VBP = 10, + .eHSPP = ePolarity_Positive, + .eVSPP = ePolarity_Positive + }, + .sPanelConf = + { + .eDpiFmt = eDPIFmt_D24, + .eDEP = ePolarity_Positive, + .eDP = ePolarity_Positive, + .eCP = ePolarity_Positive + }, + }, +}; + +static uint32_t DISP_GetBitPerPixel(E_FB_FMT eFbFmt) +{ + uint32_t u32bpp; + + switch (eFbFmt) + { + case eFBFmt_MONOCHROME: + case eFBFmt_R8: + case eFBFmt_INDEX8: + case eFBFmt_NV12: + case eFBFmt_NV16: + u32bpp = 8U; + break; + + case eFBFmt_X4R4G4B4: + case eFBFmt_A4R4G4B4: + case eFBFmt_X1R5G5B5: + case eFBFmt_A1R5G5B5: + case eFBFmt_R5G6B5: + case eFBFmt_YUY2: + case eFBFmt_UYVY: + case eFBFmt_YV12: + case eFBFmt_RG16: + u32bpp = 16U; + break; + + case eFBFmt_INDEX1: + u32bpp = 1U; + break; + + case eFBFmt_INDEX2: + u32bpp = 2U; + break; + + case eFBFmt_INDEX4: + u32bpp = 4U; + break; + + default: + u32bpp = 32U; + break; + } + return u32bpp; +} + +uint64_t DISP_GeneratePixelClk(uint32_t u32PixClkInHz) +{ + uint64_t u64PixClkOut; + + /* Set new VPLL clock frequency. */ + u32PixClkInHz <<= 1U; + u64PixClkOut = CLK_SetPLLFreq(VPLL, PLL_OPMODE_INTEGER, __HXT, (uint64_t)u32PixClkInHz); + + /* Waiting clock ready */ + CLK_WaitClockReady(CLK_STATUS_VPLLSTB_Msk); + + return u64PixClkOut; +} + +void DISP_SuspendPixelClk(void) +{ + /* Stop VPLL forcely. */ + CLK_SetPLLPowerDown(VPLL); +} + +void DISP_SetTiming(DISP_LCD_TIMING *psLCDTiming) +{ + uint32_t u32HEnd, u32HTotal, u32HSyncStart, u32HSyncEnd; + uint32_t u32VEnd, u32VTotal, u32VSyncStart, u32VSyncEnd; + uint32_t u32Value; + + /* Set H- timing */ + u32HEnd = psLCDTiming->u32HA; + u32HTotal = u32HEnd + psLCDTiming->u32HFP + psLCDTiming->u32HBP + psLCDTiming->u32HSL; + u32HSyncStart = u32HEnd + psLCDTiming->u32HFP; + u32HSyncEnd = u32HSyncStart + psLCDTiming->u32HSL; + + u32Value = (u32HTotal << DISP_HDisplay0_TOTAL_Pos) | (u32HEnd << DISP_HDisplay0_DISPLAY_END_Pos); + DISP->HDisplay0 = u32Value; + + u32Value = 0U; + if (psLCDTiming->eHSPP != ePolarity_Disable) + { + u32Value = (psLCDTiming->eHSPP << DISP_HSync0_POLARITY_Pos) | DISP_HSync0_PULSE_Msk; + } + + u32Value |= (u32HSyncEnd << DISP_HSync0_END_Pos) | (u32HSyncStart << DISP_HSync0_START_Pos); + DISP->HSync0 = u32Value; + + /* Set V- timing */ + u32VEnd = psLCDTiming->u32VA; + u32VTotal = u32VEnd + psLCDTiming->u32VFP + psLCDTiming->u32VBP + psLCDTiming->u32VSL; + u32VSyncStart = u32VEnd + psLCDTiming->u32VFP; + u32VSyncEnd = u32VSyncStart + psLCDTiming->u32VSL; + + u32Value = (u32VTotal << DISP_VDisplay0_TOTAL_Pos) | (u32VEnd << DISP_VDisplay0_DISPLAY_END_Pos); + DISP->VDisplay0 = u32Value; + + u32Value = 0U; + if (psLCDTiming->eVSPP != ePolarity_Disable) + { + u32Value = (psLCDTiming->eVSPP << DISP_VSync0_POLARITY_Pos) | DISP_VSync0_PULSE_Msk; + } + + u32Value |= (u32VSyncEnd << DISP_VSync0_END_Pos) | (u32VSyncStart << DISP_VSync0_START_Pos); + DISP->VSync0 = u32Value; +} + +void DISP_SetPanelConf(DISP_PANEL_CONF *psPanelConf) +{ + uint32_t u32Value = 0U; + + if (psPanelConf->eDEP != ePolarity_Disable) + { + u32Value = (psPanelConf->eDEP << DISP_PanelConfig0_DE_POLARITY_Pos) | DISP_PanelConfig0_DE_Msk; + } + + if (psPanelConf->eDP != ePolarity_Disable) + { + u32Value |= ((psPanelConf->eDP << DISP_PanelConfig0_DATA_POLARITY_Pos) | DISP_PanelConfig0_DATA_ENABLE_Msk); + } + + if (psPanelConf->eCP != ePolarity_Disable) + { + u32Value |= ((psPanelConf->eCP << DISP_PanelConfig0_CLOCK_POLARITY_Pos) | DISP_PanelConfig0_CLOCK_Msk); + } + + DISP->DbiConfig0 = 0x00000080U; + DISP->DpiConfig0 = psPanelConf->eDpiFmt << DISP_DpiConfig0_DPI_DATA_FORMAT_Pos; + DISP->PanelConfig0 = u32Value; +} + +int DISP_SetTransparencyMode(E_DISP_LAYER eLayer, E_TRANSPARENCY_MODE eTM) +{ + switch (eLayer) + { + + case eLayer_Video: + DISP->FrameBufferConfig0 &= ~DISP_FrameBufferConfig0_TRANSPARENCY_Msk; + DISP->FrameBufferConfig0 |= (eTM << DISP_FrameBufferConfig0_TRANSPARENCY_Pos); + break; + + case eLayer_Overlay: + DISP->OverlayConfig0 &= ~DISP_OverlayConfig0_TRANSPARENCY_Msk; + DISP->OverlayConfig0 |= (eTM << DISP_OverlayConfig0_TRANSPARENCY_Pos); + break; + + default: + return -1; + } + + return 0; +} + +int DISP_Trigger(E_DISP_LAYER eLayer, uint32_t u32Action) +{ + switch (eLayer) + { + case eLayer_Video: + if (u32Action) + { + /* Start engine clock. */ + CLK_EnableModuleClock(DCU_MODULE); + + /* Generate Pixel clock */ + DISP_GeneratePixelClk(g_psDispLcdInfo_Curr->sLcdTiming.u32PCF); + + DISP->FrameBufferConfig0 |= DISP_FrameBufferConfig0_OUTPUT_Msk; + } + else + { + DISP->FrameBufferConfig0 &= ~DISP_FrameBufferConfig0_OUTPUT_Msk; + + /* Stop pixel clock. */ + DISP_SuspendPixelClk(); + + /* Stop engine clock. */ + CLK_DisableModuleClock(DCU_MODULE); + } + break; + + case eLayer_Overlay: + if (u32Action) + { + DISP->OverlayConfig0 = (DISP->OverlayConfig0 & ~DISP_OverlayConfig0_ENABLE_Msk) | DISP_OverlayConfig0_ENABLE_Msk; + } + else + { + DISP->OverlayConfig0 &= ~DISP_OverlayConfig0_ENABLE_Msk; + } + break; + + default: + return -1; + } + + return 0; +} + +int DISP_SetBlendOpMode(E_DC_BLEND_MODE eDCBM, E_GLOBAL_ALPHA_MODE eGloAM_Src, E_GLOBAL_ALPHA_MODE eGloAM_Dst) +{ + uint32_t u32Value; + + u32Value = (eGloAM_Dst << DISP_OverlayAlphaBlendConfig0_DST_GLOBAL_ALPHA_MODE_Pos) | + (eGloAM_Src << DISP_OverlayAlphaBlendConfig0_SRC_GLOBAL_ALPHA_MODE_Pos); + + switch (eDCBM) + { + case DC_BLEND_MODE_CLEAR: + u32Value |= (eBM_ZERO << DISP_OverlayAlphaBlendConfig0_SRC_BLENDING_MODE_Pos) | + (eBM_ZERO << DISP_OverlayAlphaBlendConfig0_DST_BLENDING_MODE_Pos); + break; + case DC_BLEND_MODE_SRC: + u32Value |= (eBM_ONE << DISP_OverlayAlphaBlendConfig0_SRC_BLENDING_MODE_Pos) | + (eBM_ZERO << DISP_OverlayAlphaBlendConfig0_DST_BLENDING_MODE_Pos); + break; + case DC_BLEND_MODE_DST: + u32Value |= (eBM_ZERO << DISP_OverlayAlphaBlendConfig0_SRC_BLENDING_MODE_Pos) | + (eBM_ONE << DISP_OverlayAlphaBlendConfig0_DST_BLENDING_MODE_Pos); + break; + case DC_BLEND_MODE_SRC_OVER: + u32Value |= (eBM_ONE << DISP_OverlayAlphaBlendConfig0_SRC_BLENDING_MODE_Pos) | + (eBM_INVERSED << DISP_OverlayAlphaBlendConfig0_DST_BLENDING_MODE_Pos); + break; + case DC_BLEND_MODE_DST_OVER: + u32Value |= (eBM_INVERSED << DISP_OverlayAlphaBlendConfig0_SRC_BLENDING_MODE_Pos) | + (eBM_ONE << DISP_OverlayAlphaBlendConfig0_DST_BLENDING_MODE_Pos); + break; + case DC_BLEND_MODE_SRC_IN: + u32Value |= (eBM_NORMAL << DISP_OverlayAlphaBlendConfig0_SRC_BLENDING_MODE_Pos) | + (eBM_ZERO << DISP_OverlayAlphaBlendConfig0_DST_BLENDING_MODE_Pos); + break; + case DC_BLEND_MODE_DST_IN: + u32Value |= (eBM_ZERO << DISP_OverlayAlphaBlendConfig0_SRC_BLENDING_MODE_Pos) | + (eBM_NORMAL << DISP_OverlayAlphaBlendConfig0_DST_BLENDING_MODE_Pos); + break; + case DC_BLEND_MODE_SRC_OUT: + u32Value |= (eBM_INVERSED << DISP_OverlayAlphaBlendConfig0_SRC_BLENDING_MODE_Pos) | + (eBM_ZERO << DISP_OverlayAlphaBlendConfig0_DST_BLENDING_MODE_Pos); + break; + default: + return -1; + } + + DISP->OverlayAlphaBlendConfig0 = u32Value; + + return 0; +} + +void DISP_SetBlendValue(uint32_t u32GloAV_Src, uint32_t u32GloAV_Dst) +{ + DISP->OverlaySrcGlobalColor0 = u32GloAV_Src; + DISP->OverlayDstGlobalColor0 = u32GloAV_Dst; +} + +void DISP_SetColorKeyValue(uint32_t u32ColorKeyLow, uint32_t u32ColorKeyHigh) +{ + DISP->OverlayColorKey0 = u32ColorKeyLow; + DISP->OverlayColorKeyHigh0 = u32ColorKeyHigh; +} + +int DISP_SetFBAddr(E_DISP_LAYER eLayer, uint32_t u32DMAFBStartAddr) +{ + /* Check Start address is 128B alignment. */ + if ((u32DMAFBStartAddr % 128) != 0) + return -1; + + switch (eLayer) + { + case eLayer_Video: + /* Set frame buffer address registers */ + DISP->FrameBufferAddress0 = u32DMAFBStartAddr; + break; + case eLayer_Overlay: + /* Set frame buffer address registers */ + DISP->OverlayAddress0 = u32DMAFBStartAddr; + break; + default: + return -1; + } + return 0; +} + +int DISP_SetFBFmt(E_DISP_LAYER eLayer, E_FB_FMT eFbFmt, uint32_t u32Pitch) +{ + switch (eLayer) + { + case eLayer_Video: + { + uint32_t u32FBConf = DISP->FrameBufferConfig0; + + DISP->FrameBufferConfig0 = 0; + DISP->FrameBufferStride0 = u32Pitch; + u32FBConf = (u32FBConf & ~DISP_FrameBufferConfig0_FORMAT_Msk) | + (eFbFmt << DISP_FrameBufferConfig0_FORMAT_Pos) | + DISP_FrameBufferConfig0_RESET_Msk; + + DISP->FrameBufferConfig0 = u32FBConf; + + break; + } + default: + return -2; + } + + return 0; +} + + +int DISP_SetFBConfig(E_DISP_LAYER eLayer, E_FB_FMT eFbFmt, uint32_t u32ResWidth, uint32_t u32ResHeight, uint32_t u32DMAFBStartAddr) +{ + uint32_t u32bpp; + + /* Check Start address is 128B alignment. */ + if ((u32DMAFBStartAddr % 128) != 0) + return -1; + + u32bpp = DISP_GetBitPerPixel(eFbFmt); + + switch (eLayer) + { + case eLayer_Video: + DISP->FrameBufferUPlanarAddress0 = 0U; + DISP->FrameBufferVPlanarAddress0 = 0U; + DISP->FrameBufferUStride0 = 0U; + DISP->FrameBufferVStride0 = 0U; + DISP->IndexColorTableIndex0 = 0U; + + DISP->FrameBufferSize0 = (u32ResHeight << DISP_FrameBufferSize0_HEIGHT_Pos) | + (u32ResWidth << DISP_FrameBufferSize0_WIDTH_Pos); + + DISP->FrameBufferStride0 = u32ResWidth * (u32bpp >> 3U); + + /* Set frame buffer address registers */ + DISP->FrameBufferAddress0 = u32DMAFBStartAddr; + + DISP->FrameBufferConfig0 = (eFbFmt << DISP_FrameBufferConfig0_FORMAT_Pos) | + (eYUV_709_BT709 << DISP_FrameBufferConfig0_YUV_Pos) | + (DISP_FrameBufferConfig0_RESET_Msk); + + break; + + case eLayer_Overlay: + + DISP->OverlayStride0 = u32ResWidth * (u32bpp >> 3U); + + /* + * eFbFmt is fixed in eFBFmt_A8R8G8B8. + */ + DISP->OverlayConfig0 = (eFBFmt_A8R8G8B8 << DISP_OverlayConfig0_FORMAT_Pos) | + (0 << DISP_OverlayConfig0_SWIZZLE_Pos) | + (0 << DISP_OverlayConfig0_TRANSPARENCY_Pos) | + (eYUV_709_BT709 << DISP_OverlayConfig0_YUV_Pos) | + (0 << DISP_OverlayConfig0_CLEAR_Pos); + + /* Set frame buffer address registers */ + DISP->OverlayAddress0 = u32DMAFBStartAddr; + + DISP->OverlayVStride0 = 0U; + + DISP->OverlayUStride0 = 0U; + DISP->OverlayVStride0 = 0U; + + DISP->OverlaySize0 = (u32ResHeight << DISP_OverlaySize0_HEIGHT_Pos) | + (u32ResWidth << DISP_OverlaySize0_WIDTH_Pos); + + DISP->OverlayTL0 = (0U << DISP_OverlayTL0_Y_Pos) | (0 << DISP_OverlayTL0_X_Pos); + DISP->OverlayBR0 = (u32ResHeight << DISP_OverlayBR0_Y_Pos) | (u32ResWidth << DISP_OverlayBR0_X_Pos); + + /* Default setting */ + DISP_SetBlendOpMode(DC_BLEND_MODE_SRC_OVER, eGloAM_NORMAL, eGloAM_NORMAL); + DISP->OverlayClearValue0 = 0U; + DISP_SetColorKeyValue(0U, 0U); + + DISP->OverlayUPlanarAddress0 = 0U; + DISP->OverlayVPlanarAddress0 = 0U; + + break; + + default: + return -2; + } + + return 0; +} + +int32_t DISP_LCDInit(const DISP_LCD_INFO *psLCDInfo) +{ + vu32 vu32UsDelay = CLK_GetPLLClockFreq(CAPLL) / 1000000; + vu32 vu32Timeout; + DISP_LCD_TIMING *psLCDTiming = (DISP_LCD_TIMING *)&psLCDInfo->sLcdTiming; + DISP_PANEL_CONF *psPanelConf = (DISP_PANEL_CONF *)&psLCDInfo->sPanelConf; + + /* Store to current. */ + g_psDispLcdInfo_Curr = psLCDInfo; + + /* Start engine clock. */ + DISP_SuspendPixelClk(); + + /* Reset */ + SYS->IPRST0 |= SYS_IPRST0_DISPCRST_Msk; + vu32Timeout = 100 * vu32UsDelay; + while (vu32Timeout--); + SYS->IPRST0 &= ~SYS_IPRST0_DISPCRST_Msk; + vu32Timeout = 100 * vu32UsDelay; + while (vu32Timeout--); + + DISP->FrameBufferConfig0 = 0U; + DISP->AQHiClockControl = 0x00071900U; + DISP->AQHiClockControl = 0x00070900U; + + /* Delay 5ms */ + vu32Timeout = 5000 * vu32UsDelay; + while (vu32Timeout--); + + /* Set timing */ + DISP_SetTiming(psLCDTiming); + + /* Set Panel config */ + DISP_SetPanelConf(psPanelConf); + + return 0; +} + +int32_t DISP_LCDDeinit(void) +{ + /* Stop engine clock */ + DISP_SuspendPixelClk(); + + /* Stop engine clock. */ + CLK_DisableModuleClock(DCU_MODULE); + + g_psDispLcdInfo_Curr = NULL; + + return 0; +} + +const DISP_LCD_INFO *DISP_GetLCDInst(E_DISP_LCD eDispLcd) +{ + if (eDispLcd < eDispLcd_Cnt) + return &g_sLcdInfo_arr[eDispLcd]; + + return (const DISP_LCD_INFO *)NULL; +} + +/*@}*/ /* end of group DISP_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group DISP_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + + + + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_eadc.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_eadc.c new file mode 100644 index 0000000000..647e089b21 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_eadc.c @@ -0,0 +1,141 @@ +/**************************************************************************//** + * @file eadc.c + * @brief series EADC driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup EADC_Driver EADC Driver + @{ +*/ + +/** @addtogroup EADC_EXPORTED_FUNCTIONS EADC Exported Functions + @{ +*/ + +/** + * @brief This function make EADC_module be ready to convert. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32InputMode Decides the input mode. + * - \ref EADC_CTL_DIFFEN_SINGLE_END :Single end input mode. + * - \ref EADC_CTL_DIFFEN_DIFFERENTIAL :Differential input type. + * @return None + * @details This function is used to set analog input mode and enable A/D Converter. + * Before starting A/D conversion function, ADCEN bit (EADC_CTL[0]) should be set to 1. + * @note + */ +void EADC_Open(EADC_T *eadc, uint32_t u32InputMode) +{ + eadc->CTL &= (~EADC_CTL_DIFFEN_Msk); + + eadc->CTL |= (u32InputMode | EADC_CTL_ADCEN_Msk); + while (!(eadc->PWRM & EADC_PWRM_PWUPRDY_Msk)) {} +} + +/** + * @brief Disable EADC_module. + * @param[in] eadc The pointer of the specified EADC module.. + * @return None + * @details Clear ADCEN bit (EADC_CTL[0]) to disable A/D converter analog circuit power consumption. + */ +void EADC_Close(EADC_T *eadc) +{ + eadc->CTL &= ~EADC_CTL_ADCEN_Msk; +} + +/** + * @brief Configure the sample control logic module. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum Decides the sample module number, valid value are from 0 to 15. + * @param[in] u32TriggerSrc Decides the trigger source. Valid values are: + * - \ref EADC_SOFTWARE_TRIGGER : Disable trigger + * - \ref EADC_FALLING_EDGE_TRIGGER : STADC pin falling edge trigger + * - \ref EADC_RISING_EDGE_TRIGGER : STADC pin rising edge trigger + * - \ref EADC_FALLING_RISING_EDGE_TRIGGER : STADC pin both falling and rising edge trigger + * - \ref EADC_ADINT0_TRIGGER : EADC ADINT0 interrupt EOC pulse trigger + * - \ref EADC_ADINT1_TRIGGER : EADC ADINT1 interrupt EOC pulse trigger + * - \ref EADC_TIMER0_TRIGGER : Timer0 overflow pulse trigger + * - \ref EADC_TIMER1_TRIGGER : Timer1 overflow pulse trigger + * - \ref EADC_TIMER2_TRIGGER : Timer2 overflow pulse trigger + * - \ref EADC_TIMER3_TRIGGER : Timer3 overflow pulse trigger + * - \ref EADC_EPWM0TG0_TRIGGER : EPWM0TG0 trigger + * - \ref EADC_EPWM0TG1_TRIGGER : EPWM0TG1 trigger + * - \ref EADC_EPWM0TG2_TRIGGER : EPWM0TG2 trigger + * - \ref EADC_EPWM0TG3_TRIGGER : EPWM0TG3 trigger + * - \ref EADC_EPWM0TG4_TRIGGER : EPWM0TG4 trigger + * - \ref EADC_EPWM0TG5_TRIGGER : EPWM0TG5 trigger + * - \ref EADC_EPWM1TG0_TRIGGER : EPWM1TG0 trigger + * - \ref EADC_EPWM1TG1_TRIGGER : EPWM1TG1 trigger + * - \ref EADC_EPWM1TG2_TRIGGER : EPWM1TG2 trigger + * - \ref EADC_EPWM1TG3_TRIGGER : EPWM1TG3 trigger + * - \ref EADC_EPWM1TG4_TRIGGER : EPWM1TG4 trigger + * - \ref EADC_EPWM1TG5_TRIGGER : EPWM1TG5 trigger + * - \ref EADC_BPWM0TG_TRIGGER : BPWM0TG trigger + * - \ref EADC_BPWM1TG_TRIGGER : BPWM1TG trigger + * @param[in] u32Channel Specifies the sample module channel, valid value are from 0 to 15. + * @return None + * @details Each of ADC control logic modules 0~15 which is configurable for ADC converter channel EADC_CH0~15 and trigger source. + * sample module 16~18 is fixed for ADC channel 16, 17, 18 input sources as band-gap voltage, temperature sensor, and battery power (VBAT). + */ +void EADC_ConfigSampleModule(EADC_T *eadc, \ + uint32_t u32ModuleNum, \ + uint32_t u32TriggerSrc, \ + uint32_t u32Channel) +{ + eadc->SCTL[u32ModuleNum] &= ~(EADC_SCTL_EXTFEN_Msk | EADC_SCTL_EXTREN_Msk | EADC_SCTL_TRGSEL_Msk | EADC_SCTL_CHSEL_Msk); + eadc->SCTL[u32ModuleNum] |= (u32TriggerSrc | u32Channel); +} + + +/** + * @brief Set trigger delay time. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum Decides the sample module number, valid value are from 0 to 15. + * @param[in] u32TriggerDelayTime Decides the trigger delay time, valid range are between 0~0xFF. + * @param[in] u32DelayClockDivider Decides the trigger delay clock divider. Valid values are: + * - \ref EADC_SCTL_TRGDLYDIV_DIVIDER_1 : Trigger delay clock frequency is ADC_CLK/1 + * - \ref EADC_SCTL_TRGDLYDIV_DIVIDER_2 : Trigger delay clock frequency is ADC_CLK/2 + * - \ref EADC_SCTL_TRGDLYDIV_DIVIDER_4 : Trigger delay clock frequency is ADC_CLK/4 + * - \ref EADC_SCTL_TRGDLYDIV_DIVIDER_16 : Trigger delay clock frequency is ADC_CLK/16 + * @return None + * @details User can configure the trigger delay time by setting TRGDLYCNT (EADC_SCTLn[15:8], n=0~15) and TRGDLYDIV (EADC_SCTLn[7:6], n=0~15). + * Trigger delay time = (u32TriggerDelayTime) x Trigger delay clock period. + */ +void EADC_SetTriggerDelayTime(EADC_T *eadc, \ + uint32_t u32ModuleNum, \ + uint32_t u32TriggerDelayTime, \ + uint32_t u32DelayClockDivider) +{ + eadc->SCTL[u32ModuleNum] &= ~(EADC_SCTL_TRGDLYDIV_Msk | EADC_SCTL_TRGDLYCNT_Msk); + eadc->SCTL[u32ModuleNum] |= ((u32TriggerDelayTime << EADC_SCTL_TRGDLYCNT_Pos) | u32DelayClockDivider); +} + +/** + * @brief Set ADC extend sample time. + * @param[in] eadc The pointer of the specified EADC module. + * @param[in] u32ModuleNum Decides the sample module number, valid value are from 0 to 18. + * @param[in] u32ExtendSampleTime Decides the extend sampling time, the range is from 0~255 ADC clock. Valid value are from 0 to 0xFF. + * @return None + * @details When A/D converting at high conversion rate, the sampling time of analog input voltage may not enough if input channel loading is heavy, + * user can extend A/D sampling time after trigger source is coming to get enough sampling time. + */ +void EADC_SetExtendSampleTime(EADC_T *eadc, uint32_t u32ModuleNum, uint32_t u32ExtendSampleTime) +{ + eadc->SCTL[u32ModuleNum] &= ~EADC_SCTL_EXTSMPT_Msk; + + eadc->SCTL[u32ModuleNum] |= (u32ExtendSampleTime << EADC_SCTL_EXTSMPT_Pos); + +} + +/*@}*/ /* end of group EADC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group EADC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ebi.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ebi.c new file mode 100644 index 0000000000..5bb90872a9 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ebi.c @@ -0,0 +1,193 @@ +/**************************************************************************//** + * @file ebi.c + * @brief External Bus Interface(EBI) driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup EBI_Driver EBI Driver + @{ +*/ + + +/** @addtogroup EBI_EXPORTED_FUNCTIONS EBI Exported Functions + @{ +*/ + +/** + * @brief Initialize EBI for specify Bank + * + * @param[in] u32Bank Bank number for EBI. Valid values are: + * - \ref EBI_BANK0 + * - \ref EBI_BANK1 + * - \ref EBI_BANK2 + * @param[in] u32DataWidth Data bus width. Valid values are: + * - \ref EBI_BUSWIDTH_8BIT + * - \ref EBI_BUSWIDTH_16BIT + * @param[in] u32TimingClass Default timing configuration. Valid values are: + * - \ref EBI_TIMING_FASTEST + * - \ref EBI_TIMING_VERYFAST + * - \ref EBI_TIMING_FAST + * - \ref EBI_TIMING_NORMAL + * - \ref EBI_TIMING_SLOW + * - \ref EBI_TIMING_VERYSLOW + * - \ref EBI_TIMING_SLOWEST + * @param[in] u32BusMode Set EBI bus operate mode. Valid values are: + * - \ref EBI_OPMODE_NORMAL + * - \ref EBI_OPMODE_CACCESS + * - \ref EBI_OPMODE_ADSEPARATE + * @param[in] u32CSActiveLevel CS is active High/Low. Valid values are: + * - \ref EBI_CS_ACTIVE_HIGH + * - \ref EBI_CS_ACTIVE_LOW + * + * @return None + * + * @details This function is used to open specify EBI bank with different bus width, timing setting and \n + * active level of CS pin to access EBI device. + * @note Write Buffer Enable(WBUFEN) and Extend Time Of ALE(TALE) are only available in EBI bank0 control register. + */ +void EBI_Open(uint32_t u32Bank, uint32_t u32DataWidth, uint32_t u32TimingClass, uint32_t u32BusMode, uint32_t u32CSActiveLevel) +{ + uint32_t u32Index0 = (uint32_t)&EBI->CTL0 + (uint32_t)u32Bank * 0x10U; + uint32_t u32Index1 = (uint32_t)&EBI->TCTL0 + (uint32_t)u32Bank * 0x10U; + volatile uint32_t *pu32EBICTL = (uint32_t *)(u32Index0); + volatile uint32_t *pu32EBITCTL = (uint32_t *)(u32Index1); + + if (u32DataWidth == EBI_BUSWIDTH_8BIT) + { + *pu32EBICTL &= ~EBI_CTL_DW16_Msk; + } + else + { + *pu32EBICTL |= EBI_CTL_DW16_Msk; + } + + *pu32EBICTL |= u32BusMode; + + switch (u32TimingClass) + { + case EBI_TIMING_FASTEST: + *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) | + (EBI_MCLKDIV_1 << EBI_CTL_MCLKDIV_Pos) | + (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk; + *pu32EBITCTL = 0x0U; + break; + + case EBI_TIMING_VERYFAST: + *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) | + (EBI_MCLKDIV_1 << EBI_CTL_MCLKDIV_Pos) | + (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk | + (0x3U << EBI_CTL_TALE_Pos) ; + *pu32EBITCTL = 0x03003318U; + break; + + case EBI_TIMING_FAST: + *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) | + (EBI_MCLKDIV_2 << EBI_CTL_MCLKDIV_Pos) | + (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk; + *pu32EBITCTL = 0x0U; + break; + + case EBI_TIMING_NORMAL: + *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) | + (EBI_MCLKDIV_2 << EBI_CTL_MCLKDIV_Pos) | + (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk | + (0x3U << EBI_CTL_TALE_Pos) ; + *pu32EBITCTL = 0x03003318U; + break; + + case EBI_TIMING_SLOW: + *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) | + (EBI_MCLKDIV_2 << EBI_CTL_MCLKDIV_Pos) | + (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk | + (0x7U << EBI_CTL_TALE_Pos) ; + *pu32EBITCTL = 0x07007738U; + break; + + case EBI_TIMING_VERYSLOW: + *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) | + (EBI_MCLKDIV_8 << EBI_CTL_MCLKDIV_Pos) | + (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk | + (0x7U << EBI_CTL_TALE_Pos) ; + *pu32EBITCTL = 0x07007738U; + break; + + case EBI_TIMING_SLOWEST: + *pu32EBICTL = (*pu32EBICTL & ~(EBI_CTL_MCLKDIV_Msk | EBI_CTL_TALE_Msk)) | + (EBI_MCLKDIV_16 << EBI_CTL_MCLKDIV_Pos) | + (u32CSActiveLevel << EBI_CTL_CSPOLINV_Pos) | EBI_CTL_EN_Msk | + (0x7U << EBI_CTL_TALE_Pos) ; + *pu32EBITCTL = 0x07007738U; + break; + + default: + *pu32EBICTL &= ~EBI_CTL_EN_Msk; + break; + } +} + +/** + * @brief Disable EBI on specify Bank + * + * @param[in] u32Bank Bank number for EBI. Valid values are: + * - \ref EBI_BANK0 + * - \ref EBI_BANK1 + * - \ref EBI_BANK2 + * + * @return None + * + * @details This function is used to close specify EBI function. + */ +void EBI_Close(uint32_t u32Bank) +{ + uint32_t u32Index = (uint32_t)&EBI->CTL0 + u32Bank * 0x10U; + volatile uint32_t *pu32EBICTL = (uint32_t *)(u32Index); + + *pu32EBICTL &= ~EBI_CTL_EN_Msk; +} + +/** + * @brief Set EBI Bus Timing for specify Bank + * + * @param[in] u32Bank Bank number for EBI. Valid values are: + * - \ref EBI_BANK0 + * - \ref EBI_BANK1 + * - \ref EBI_BANK2 + * @param[in] u32TimingConfig Configure EBI timing settings, includes TACC, TAHD, W2X and R2R setting. + * @param[in] u32MclkDiv Divider for MCLK. Valid values are: + * - \ref EBI_MCLKDIV_1 + * - \ref EBI_MCLKDIV_2 + * - \ref EBI_MCLKDIV_4 + * - \ref EBI_MCLKDIV_8 + * - \ref EBI_MCLKDIV_16 + * - \ref EBI_MCLKDIV_32 + * - \ref EBI_MCLKDIV_64 + * - \ref EBI_MCLKDIV_128 + * + * @return None + * + * @details This function is used to configure specify EBI bus timing for access EBI device. + */ +void EBI_SetBusTiming(uint32_t u32Bank, uint32_t u32TimingConfig, uint32_t u32MclkDiv) +{ + uint32_t u32Index0 = (uint32_t)&EBI->CTL0 + (uint32_t)u32Bank * 0x10U; + uint32_t u32Index1 = (uint32_t)&EBI->TCTL0 + (uint32_t)u32Bank * 0x10U; + volatile uint32_t *pu32EBICTL = (uint32_t *)(u32Index0); + volatile uint32_t *pu32EBITCTL = (uint32_t *)(u32Index1); + + *pu32EBICTL = (*pu32EBICTL & ~EBI_CTL_MCLKDIV_Msk) | (u32MclkDiv << EBI_CTL_MCLKDIV_Pos); + *pu32EBITCTL = u32TimingConfig; +} + +/*@}*/ /* end of group EBI_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group EBI_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ecap.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ecap.c new file mode 100644 index 0000000000..2e28c0810a --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ecap.c @@ -0,0 +1,96 @@ +/**************************************************************************//** + * @file ecap.c + * @brief Enhanced Input Capture Timer (ECAP) driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ +#include "NuMicro.h" + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup ECAP_Driver ECAP Driver + @{ +*/ + +/** @addtogroup ECAP_EXPORTED_FUNCTIONS ECAP Exported Functions + @{ +*/ + +/** + * @brief Enable ECAP function + * @param[in] ecap The pointer of the specified ECAP module. + * @param[in] u32FuncMask Input capture function select + * - \ref ECAP_DISABLE_COMPARE + * - \ref ECAP_COMPARE_FUNCTION + * @return None + * @details This macro enable input capture function and select compare and reload function. + */ +void ECAP_Open(ECAP_T *ecap, uint32_t u32FuncMask) +{ + /* Clear Input capture mode*/ + ecap->CTL0 = ecap->CTL0 & ~(ECAP_CTL0_CMPEN_Msk); + + /* Enable Input Capture and set mode */ + ecap->CTL0 |= ECAP_CTL0_CAPEN_Msk | (u32FuncMask); +} + + + +/** + * @brief Disable ECAP function + * @param[in] ecap The pointer of the specified ECAP module. + * @return None + * @details This macro disable input capture function. + */ +void ECAP_Close(ECAP_T *ecap) +{ + /* Disable Input Capture*/ + ecap->CTL0 &= ~ECAP_CTL0_CAPEN_Msk; +} + +/** + * @brief This macro is used to enable input channel interrupt + * @param[in] ecap Specify ECAP port + * @param[in] u32Mask The input channel Mask + * - \ref ECAP_CTL0_CAPIEN0_Msk + * - \ref ECAP_CTL0_CAPIEN1_Msk + * - \ref ECAP_CTL0_CAPIEN2_Msk + * - \ref ECAP_CTL0_OVIEN_Msk + * - \ref ECAP_CTL0_CMPIEN_Msk + * @return None + * @details This macro will enable the input channel_n interrupt. + */ +void ECAP_EnableINT(ECAP_T *ecap, uint32_t u32Mask) +{ + /* Enable input channel interrupt */ + ecap->CTL0 |= (u32Mask); +} + +/** + * @brief This macro is used to disable input channel interrupt + * @param[in] ecap Specify ECAP port + * @param[in] u32Mask The input channel number + * - \ref ECAP_CTL0_CAPIEN0_Msk + * - \ref ECAP_CTL0_CAPIEN1_Msk + * - \ref ECAP_CTL0_CAPIEN2_Msk + * - \ref ECAP_CTL0_OVIEN_Msk + * - \ref ECAP_CTL0_CMPIEN_Msk + * @return None + * @details This macro will disable the input channel_n interrupt. + */ +void ECAP_DisableINT(ECAP_T *ecap, uint32_t u32Mask) +{ + /* Disable input channel interrupt */ + ecap->CTL0 &= ~(u32Mask); +} + +/*@}*/ /* end of group ECAP_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group ECAP_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_epwm.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_epwm.c new file mode 100644 index 0000000000..c28e78d647 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_epwm.c @@ -0,0 +1,1616 @@ +/**************************************************************************//** + * @file epwm.c + * @brief EPWM driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup EPWM_Driver EPWM Driver + @{ +*/ + + +/** @addtogroup EPWM_EXPORTED_FUNCTIONS EPWM Exported Functions + @{ +*/ + +/** + * @brief Configure EPWM capture and get the nearest unit time. + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32UnitTimeNsec The unit time of counter + * @param[in] u32CaptureEdge The condition to latch the counter. This parameter is not used + * @return The nearest unit time in nano second. + * @details This function is used to Configure EPWM capture and get the nearest unit time. + */ +uint32_t EPWM_ConfigCaptureChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32UnitTimeNsec, uint32_t u32CaptureEdge) +{ + uint32_t u32EPWMClockSrc; + uint32_t u32NearestUnitTimeNsec; + uint32_t u16Prescale = 1U, u16CNR = 0xFFFFU; + + /* clock source is from PCLK */ + SystemCoreClockUpdate(); + u32EPWMClockSrc = CLK_GetPCLK0Freq(); + + u32EPWMClockSrc /= 1000U; + for (u16Prescale = 1U; u16Prescale <= 0x1000U; u16Prescale++) + { + uint32_t u32Exit = 0U; + u32NearestUnitTimeNsec = (1000000U * u16Prescale) / u32EPWMClockSrc; + if (u32NearestUnitTimeNsec < u32UnitTimeNsec) + { + if (u16Prescale == 0x1000U) /* limit to the maximum unit time(nano second) */ + { + u32Exit = 1U; + } + else + { + u32Exit = 0U; + } + if (!((1000000U * (u16Prescale + 1U) > (u32NearestUnitTimeNsec * u32EPWMClockSrc)))) + { + u32Exit = 1U; + } + else + { + u32Exit = 0U; + } + } + else + { + u32Exit = 1U; + } + if (u32Exit == 1U) + { + break; + } + else {} + } + + /* convert to real register value */ + /* every two channels share a prescaler */ + u16Prescale -= 1U; + EPWM_SET_PRESCALER(epwm, u32ChannelNum, u16Prescale); + + /* set EPWM to down count type(edge aligned) */ + (epwm)->CTL1 = ((epwm)->CTL1 & ~(EPWM_CTL1_CNTTYPE0_Msk << (u32ChannelNum << 1U))) | (1UL << (u32ChannelNum << 1U)); + /* set EPWM to auto-reload mode */ + (epwm)->CTL1 &= ~(EPWM_CTL1_CNTMODE0_Msk << u32ChannelNum); + EPWM_SET_CNR(epwm, u32ChannelNum, u16CNR); + + return (u32NearestUnitTimeNsec); +} + +/** + * @brief This function Configure EPWM generator and get the nearest frequency in edge aligned(up counter type) auto-reload mode + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32Frequency Target generator frequency + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @return Nearest frequency clock in nano second + * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure EPWM frequency may affect + * existing frequency of other channel. + * @note This function is used for initial stage. + * To change duty cycle later, it should get the configured period value and calculate the new comparator value. + */ +uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32DutyCycle) +{ + uint32_t u32EPWMClockSrc; + uint32_t i; + uint32_t u32Prescale = 1U, u32CNR = 0xFFFFU; + + /* clock source is from PCLK */ + SystemCoreClockUpdate(); + u32EPWMClockSrc = CLK_GetPCLK0Freq(); + + for (u32Prescale = 1U; u32Prescale < 0xFFFU; u32Prescale++) /* prescale could be 0~0xFFF */ + { + i = (u32EPWMClockSrc / u32Frequency) / u32Prescale; + /* If target value is larger than CNR, need to use a larger prescaler */ + if (i < (0x10000U)) + { + u32CNR = i; + break; + } + } + /* Store return value here 'cos we're gonna change u16Prescale & u16CNR to the real value to fill into register */ + i = u32EPWMClockSrc / (u32Prescale * u32CNR); + + /* convert to real register value */ + /* every two channels share a prescaler */ + u32Prescale -= 1U; + EPWM_SET_PRESCALER(epwm, u32ChannelNum, u32Prescale); + /* set EPWM to up counter type(edge aligned) and auto-reload mode */ + (epwm)->CTL1 = ((epwm)->CTL1 & ~((EPWM_CTL1_CNTTYPE0_Msk << (u32ChannelNum << 1U)) | ((1UL << EPWM_CTL1_CNTMODE0_Pos) << u32ChannelNum))); + + u32CNR -= 1U; + EPWM_SET_CNR(epwm, u32ChannelNum, u32CNR); + EPWM_SET_CMR(epwm, u32ChannelNum, u32DutyCycle * (u32CNR + 1U) / 100U); + + (epwm)->WGCTL0 = ((epwm)->WGCTL0 & ~((EPWM_WGCTL0_PRDPCTL0_Msk | EPWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum << 1U))) | \ + ((uint32_t)EPWM_OUTPUT_HIGH << ((u32ChannelNum << 1U) + (uint32_t)EPWM_WGCTL0_ZPCTL0_Pos)); + (epwm)->WGCTL1 = ((epwm)->WGCTL1 & ~((EPWM_WGCTL1_CMPDCTL0_Msk | EPWM_WGCTL1_CMPUCTL0_Msk) << (u32ChannelNum << 1U))) | \ + ((uint32_t)EPWM_OUTPUT_LOW << ((u32ChannelNum << 1U) + (uint32_t)EPWM_WGCTL1_CMPUCTL0_Pos)); + + return (i); +} + +/** + * @brief Start EPWM module + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @details This function is used to start EPWM module. + */ +void EPWM_Start(EPWM_T *epwm, uint32_t u32ChannelMask) +{ + (epwm)->CNTEN |= u32ChannelMask; +} + +/** + * @brief Stop EPWM module + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @details This function is used to stop EPWM module. + */ +void EPWM_Stop(EPWM_T *epwm, uint32_t u32ChannelMask) +{ + uint32_t i; + for (i = 0U; i < EPWM_CHANNEL_NUM; i ++) + { + if (u32ChannelMask & (1UL << i)) + { + (epwm)->PERIOD[i] = 0U; + } + } +} + +/** + * @brief Stop EPWM generation immediately by clear channel enable bit + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @details This function is used to stop EPWM generation immediately by clear channel enable bit. + */ +void EPWM_ForceStop(EPWM_T *epwm, uint32_t u32ChannelMask) +{ + (epwm)->CNTEN &= ~u32ChannelMask; +} + +/** + * @brief Enable selected channel to trigger ADC + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32Condition The condition to trigger ADC. Combination of following conditions: + * - \ref EPWM_TRG_ADC_EVEN_ZERO + * - \ref EPWM_TRG_ADC_EVEN_PERIOD + * - \ref EPWM_TRG_ADC_EVEN_ZERO_PERIOD + * - \ref EPWM_TRG_ADC_EVEN_COMPARE_UP + * - \ref EPWM_TRG_ADC_EVEN_COMPARE_DOWN + * - \ref EPWM_TRG_ADC_ODD_ZERO + * - \ref EPWM_TRG_ADC_ODD_PERIOD + * - \ref EPWM_TRG_ADC_ODD_ZERO_PERIOD + * - \ref EPWM_TRG_ADC_ODD_COMPARE_UP + * - \ref EPWM_TRG_ADC_ODD_COMPARE_DOWN + * - \ref EPWM_TRG_ADC_CH_0_FREE_CMP_UP + * - \ref EPWM_TRG_ADC_CH_0_FREE_CMP_DOWN + * - \ref EPWM_TRG_ADC_CH_2_FREE_CMP_UP + * - \ref EPWM_TRG_ADC_CH_2_FREE_CMP_DOWN + * - \ref EPWM_TRG_ADC_CH_4_FREE_CMP_UP + * - \ref EPWM_TRG_ADC_CH_4_FREE_CMP_DOWN + * @return None + * @details This function is used to enable selected channel to trigger ADC. + */ +void EPWM_EnableADCTrigger(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Condition) +{ + if (u32ChannelNum < 4U) + { + (epwm)->EADCTS0 &= ~((EPWM_EADCTS0_TRGSEL0_Msk) << (u32ChannelNum << 3U)); + (epwm)->EADCTS0 |= ((EPWM_EADCTS0_TRGEN0_Msk | u32Condition) << (u32ChannelNum << 3)); + } + else + { + (epwm)->EADCTS1 &= ~((EPWM_EADCTS1_TRGSEL4_Msk) << ((u32ChannelNum - 4U) << 3U)); + (epwm)->EADCTS1 |= ((EPWM_EADCTS1_TRGEN4_Msk | u32Condition) << ((u32ChannelNum - 4U) << 3U)); + } +} + +/** + * @brief Disable selected channel to trigger ADC + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to disable selected channel to trigger ADC. + */ +void EPWM_DisableADCTrigger(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + if (u32ChannelNum < 4U) + { + (epwm)->EADCTS0 &= ~(EPWM_EADCTS0_TRGEN0_Msk << (u32ChannelNum << 3U)); + } + else + { + (epwm)->EADCTS1 &= ~(EPWM_EADCTS1_TRGEN4_Msk << ((u32ChannelNum - 4U) << 3U)); + } +} + +/** + * @brief Enable and configure trigger ADC prescale + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @param[in] u32Prescale ADC prescale. Valid values are between 0 to 0xF. + * @param[in] u32PrescaleCnt ADC prescale counter. Valid values are between 0 to 0xF. + * @retval 0 Success. + * @retval -1 Failed. + * @details This function is used to enable and configure trigger ADC prescale. + * @note User can configure only when ADC trigger prescale is disabled. + * @note ADC prescale counter must less than ADC prescale. + */ +int32_t EPWM_EnableADCTriggerPrescale(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Prescale, uint32_t u32PrescaleCnt) +{ + /* User can write only when PSCENn(n = 0 ~ 5) is 0 */ + if ((epwm)->EADCPSCCTL & (1UL << u32ChannelNum)) + return (-1); + + if (u32ChannelNum < 4UL) + { + (epwm)->EADCPSC0 = ((epwm)->EADCPSC0 & ~((EPWM_EADCPSC0_EADCPSC0_Msk) << (u32ChannelNum << 3))) | \ + (u32Prescale << (u32ChannelNum << 3)); + (epwm)->EADCPSCNT0 = ((epwm)->EADCPSCNT0 & ~((EPWM_EADCPSCNT0_PSCNT0_Msk) << (u32ChannelNum << 3))) | \ + (u32PrescaleCnt << (u32ChannelNum << 3)); + } + else + { + (epwm)->EADCPSC1 = ((epwm)->EADCPSC1 & ~((EPWM_EADCPSC1_EADCPSC4_Msk) << ((u32ChannelNum - 4UL) << 3))) | \ + (u32Prescale << ((u32ChannelNum - 4UL) << 3)); + (epwm)->EADCPSCNT1 = ((epwm)->EADCPSCNT1 & ~((EPWM_EADCPSCNT1_PSCNT4_Msk) << ((u32ChannelNum - 4UL) << 3))) | \ + (u32PrescaleCnt << ((u32ChannelNum - 4UL) << 3)); + } + + (epwm)->EADCPSCCTL |= EPWM_EADCPSCCTL_PSCEN0_Msk << u32ChannelNum; + + return 0; +} + +/** + * @brief Disable Trigger ADC prescale function + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to disable trigger ADC prescale. + */ +void EPWM_DisableADCTriggerPrescale(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->EADCPSCCTL &= ~(EPWM_EADCPSCCTL_PSCEN0_Msk << u32ChannelNum); +} + +/** + * @brief Clear selected channel trigger ADC flag + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32Condition This parameter is not used + * @return None + * @details This function is used to clear selected channel trigger ADC flag. + */ +void EPWM_ClearADCTriggerFlag(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Condition) +{ + (epwm)->STATUS = (EPWM_STATUS_EADCTRGF0_Msk << u32ChannelNum); +} + +/** + * @brief Get selected channel trigger ADC flag + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @retval 0 The specified channel trigger ADC to start of conversion flag is not set + * @retval 1 The specified channel trigger ADC to start of conversion flag is set + * @details This function is used to get EPWM trigger ADC to start of conversion flag for specified channel. + */ +uint32_t EPWM_GetADCTriggerFlag(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + return (((epwm)->STATUS & (EPWM_STATUS_EADCTRGF0_Msk << u32ChannelNum)) ? 1UL : 0UL); +} + +/** + * @brief Enable selected channel to trigger DAC + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32Condition The condition to trigger DAC. Combination of following conditions: + * - \ref EPWM_TRIGGER_DAC_ZERO + * - \ref EPWM_TRIGGER_DAC_PERIOD + * - \ref EPWM_TRIGGER_DAC_COMPARE_UP + * - \ref EPWM_TRIGGER_DAC_COMPARE_DOWN + * @return None + * @details This function is used to enable selected channel to trigger DAC. + */ +void EPWM_EnableDACTrigger(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Condition) +{ + (epwm)->DACTRGEN |= (u32Condition << u32ChannelNum); +} + +/** + * @brief Disable selected channel to trigger DAC + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to disable selected channel to trigger DAC. + */ +void EPWM_DisableDACTrigger(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->DACTRGEN &= ~((EPWM_TRIGGER_DAC_ZERO | EPWM_TRIGGER_DAC_PERIOD | EPWM_TRIGGER_DAC_COMPARE_UP | \ + EPWM_TRIGGER_DAC_COMPARE_DOWN) << u32ChannelNum); +} + +/** + * @brief This function enable fault brake of selected channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * @param[in] u32LevelMask Output high or low while fault brake occurs, each bit represent the level of a channel + * while fault brake occurs. Bit 0 represents channel 0, bit 1 represents channel 1... + * @param[in] u32BrakeSource Fault brake source, could be one of following source + * - \ref EPWM_FB_EDGE_ADCRM + * - \ref EPWM_FB_EDGE_ACMP0 + * - \ref EPWM_FB_EDGE_ACMP1 + * - \ref EPWM_FB_EDGE_BKP0 + * - \ref EPWM_FB_EDGE_BKP1 + * - \ref EPWM_FB_EDGE_SYS_CSS + * - \ref EPWM_FB_EDGE_SYS_BOD + * - \ref EPWM_FB_EDGE_SYS_RAM + * - \ref EPWM_FB_EDGE_SYS_COR + * - \ref EPWM_FB_LEVEL_ADCRM + * - \ref EPWM_FB_LEVEL_ACMP0 + * - \ref EPWM_FB_LEVEL_ACMP1 + * - \ref EPWM_FB_LEVEL_BKP0 + * - \ref EPWM_FB_LEVEL_BKP1 + * - \ref EPWM_FB_LEVEL_SYS_CSS + * - \ref EPWM_FB_LEVEL_SYS_BOD + * - \ref EPWM_FB_LEVEL_SYS_RAM + * - \ref EPWM_FB_LEVEL_SYS_COR + * @return None + * @details This function is used to enable fault brake of selected channel(s). + * The write-protection function should be disabled before using this function. + */ +void EPWM_EnableFaultBrake(EPWM_T *epwm, uint32_t u32ChannelMask, uint32_t u32LevelMask, uint32_t u32BrakeSource) +{ + uint32_t i; + + for (i = 0U; i < EPWM_CHANNEL_NUM; i ++) + { + if (u32ChannelMask & (1UL << i)) + { + if ((u32BrakeSource == EPWM_FB_EDGE_SYS_CSS) || (u32BrakeSource == EPWM_FB_EDGE_SYS_BOD) || \ + (u32BrakeSource == EPWM_FB_EDGE_SYS_RAM) || (u32BrakeSource == EPWM_FB_EDGE_SYS_COR) || \ + (u32BrakeSource == EPWM_FB_LEVEL_SYS_CSS) || (u32BrakeSource == EPWM_FB_LEVEL_SYS_BOD) || \ + (u32BrakeSource == EPWM_FB_LEVEL_SYS_RAM) || (u32BrakeSource == EPWM_FB_LEVEL_SYS_COR)) + { + (epwm)->BRKCTL[i >> 1U] |= (u32BrakeSource & (EPWM_BRKCTL0_1_SYSEBEN_Msk | EPWM_BRKCTL0_1_SYSLBEN_Msk)); + (epwm)->FAILBRK |= (u32BrakeSource & 0xFU); + } + else + { + (epwm)->BRKCTL[i >> 1U] |= u32BrakeSource; + } + } + + if (u32LevelMask & (1UL << i)) + { + if ((i & 0x1U) == 0U) + { + /* set brake action as high level for even channel */ + (epwm)->BRKCTL[i >> 1] &= ~EPWM_BRKCTL0_1_BRKAEVEN_Msk; + (epwm)->BRKCTL[i >> 1] |= ((3U) << EPWM_BRKCTL0_1_BRKAEVEN_Pos); + } + else + { + /* set brake action as high level for odd channel */ + (epwm)->BRKCTL[i >> 1] &= ~EPWM_BRKCTL0_1_BRKAODD_Msk; + (epwm)->BRKCTL[i >> 1] |= ((3U) << EPWM_BRKCTL0_1_BRKAODD_Pos); + } + } + else + { + if ((i & 0x1U) == 0U) + { + /* set brake action as low level for even channel */ + (epwm)->BRKCTL[i >> 1U] &= ~EPWM_BRKCTL0_1_BRKAEVEN_Msk; + (epwm)->BRKCTL[i >> 1U] |= ((2U) << EPWM_BRKCTL0_1_BRKAEVEN_Pos); + } + else + { + /* set brake action as low level for odd channel */ + (epwm)->BRKCTL[i >> 1U] &= ~EPWM_BRKCTL0_1_BRKAODD_Msk; + (epwm)->BRKCTL[i >> 1U] |= ((2U) << EPWM_BRKCTL0_1_BRKAODD_Pos); + } + } + } +} + +/** + * @brief Enable capture of selected channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @details This function is used to enable capture of selected channel(s). + */ +void EPWM_EnableCapture(EPWM_T *epwm, uint32_t u32ChannelMask) +{ + (epwm)->CAPINEN |= u32ChannelMask; + (epwm)->CAPCTL |= u32ChannelMask; +} + +/** + * @brief Disable capture of selected channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @details This function is used to disable capture of selected channel(s). + */ +void EPWM_DisableCapture(EPWM_T *epwm, uint32_t u32ChannelMask) +{ + (epwm)->CAPINEN &= ~u32ChannelMask; + (epwm)->CAPCTL &= ~u32ChannelMask; +} + +/** + * @brief Enables EPWM output generation of selected channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Set bit 0 to 1 enables channel 0 output, set bit 1 to 1 enables channel 1 output... + * @return None + * @details This function is used to enable EPWM output generation of selected channel(s). + */ +void EPWM_EnableOutput(EPWM_T *epwm, uint32_t u32ChannelMask) +{ + (epwm)->POEN |= u32ChannelMask; +} + +/** + * @brief Disables EPWM output generation of selected channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel + * Set bit 0 to 1 disables channel 0 output, set bit 1 to 1 disables channel 1 output... + * @return None + * @details This function is used to disable EPWM output generation of selected channel(s). + */ +void EPWM_DisableOutput(EPWM_T *epwm, uint32_t u32ChannelMask) +{ + (epwm)->POEN &= ~u32ChannelMask; +} + +/** + * @brief Enables PDMA transfer of selected channel for EPWM capture + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. + * @param[in] u32RisingFirst The capture order is rising, falling first. Every two channels share the same setting. Valid values are TRUE and FALSE. + * @param[in] u32Mode Captured data transferred by PDMA interrupt type. It could be either + * - \ref EPWM_CAPTURE_PDMA_RISING_LATCH + * - \ref EPWM_CAPTURE_PDMA_FALLING_LATCH + * - \ref EPWM_CAPTURE_PDMA_RISING_FALLING_LATCH + * @return None + * @details This function is used to enable PDMA transfer of selected channel(s) for EPWM capture. + * @note This function can only selects even or odd channel of pairs to do PDMA transfer. + */ +void EPWM_EnablePDMA(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32RisingFirst, uint32_t u32Mode) +{ + uint32_t u32IsOddCh; + u32IsOddCh = u32ChannelNum & 0x1U; + (epwm)->PDMACTL = ((epwm)->PDMACTL & ~((EPWM_PDMACTL_CHSEL0_1_Msk | EPWM_PDMACTL_CAPORD0_1_Msk | EPWM_PDMACTL_CAPMOD0_1_Msk) << ((u32ChannelNum >> 1U) << 3U))) | \ + (((u32IsOddCh << EPWM_PDMACTL_CHSEL0_1_Pos) | (u32RisingFirst << EPWM_PDMACTL_CAPORD0_1_Pos) | \ + u32Mode | EPWM_PDMACTL_CHEN0_1_Msk) << ((u32ChannelNum >> 1U) << 3U)); +} + +/** + * @brief Disables PDMA transfer of selected channel for EPWM capture + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. + * @return None + * @details This function is used to enable PDMA transfer of selected channel(s) for EPWM capture. + */ +void EPWM_DisablePDMA(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->PDMACTL &= ~(EPWM_PDMACTL_CHEN0_1_Msk << ((u32ChannelNum >> 1U) << 3U)); +} + +/** + * @brief Enable Dead zone of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32Duration Dead zone length in EPWM clock count, valid values are between 0~0xFFF, but 0 means there is no Dead zone. + * @return None + * @details This function is used to enable Dead zone of selected channel. + * The write-protection function should be disabled before using this function. + * @note Every two channels share the same setting. + */ +void EPWM_EnableDeadZone(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Duration) +{ + /* every two channels share the same setting */ + (epwm)->DTCTL[(u32ChannelNum) >> 1U] &= ~EPWM_DTCTL0_1_DTCNT_Msk; + (epwm)->DTCTL[(u32ChannelNum) >> 1U] |= EPWM_DTCTL0_1_DTEN_Msk | u32Duration; +} + +/** + * @brief Disable Dead zone of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to disable Dead zone of selected channel. + * The write-protection function should be disabled before using this function. + */ +void EPWM_DisableDeadZone(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + /* every two channels shares the same setting */ + (epwm)->DTCTL[(u32ChannelNum) >> 1U] &= ~EPWM_DTCTL0_1_DTEN_Msk; +} + +/** + * @brief Enable capture interrupt of selected channel. + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32Edge Rising or falling edge to latch counter. + * - \ref EPWM_CAPTURE_INT_RISING_LATCH + * - \ref EPWM_CAPTURE_INT_FALLING_LATCH + * @return None + * @details This function is used to enable capture interrupt of selected channel. + */ +void EPWM_EnableCaptureInt(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Edge) +{ + (epwm)->CAPIEN |= (u32Edge << u32ChannelNum); +} + +/** + * @brief Disable capture interrupt of selected channel. + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32Edge Rising or falling edge to latch counter. + * - \ref EPWM_CAPTURE_INT_RISING_LATCH + * - \ref EPWM_CAPTURE_INT_FALLING_LATCH + * @return None + * @details This function is used to disable capture interrupt of selected channel. + */ +void EPWM_DisableCaptureInt(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Edge) +{ + (epwm)->CAPIEN &= ~(u32Edge << u32ChannelNum); +} + +/** + * @brief Clear capture interrupt of selected channel. + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32Edge Rising or falling edge to latch counter. + * - \ref EPWM_CAPTURE_INT_RISING_LATCH + * - \ref EPWM_CAPTURE_INT_FALLING_LATCH + * @return None + * @details This function is used to clear capture interrupt of selected channel. + */ +void EPWM_ClearCaptureIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Edge) +{ + (epwm)->CAPIF = (u32Edge << u32ChannelNum); +} + +/** + * @brief Get capture interrupt of selected channel. + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @retval 0 No capture interrupt + * @retval 1 Rising edge latch interrupt + * @retval 2 Falling edge latch interrupt + * @retval 3 Rising and falling latch interrupt + * @details This function is used to get capture interrupt of selected channel. + */ +uint32_t EPWM_GetCaptureIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + return (((((epwm)->CAPIF & (EPWM_CAPIF_CFLIF0_Msk << u32ChannelNum)) ? 1UL : 0UL) << 1) | \ + (((epwm)->CAPIF & (EPWM_CAPIF_CRLIF0_Msk << u32ChannelNum)) ? 1UL : 0UL)); +} +/** + * @brief Enable duty interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32IntDutyType Duty interrupt type, could be either + * - \ref EPWM_DUTY_INT_DOWN_COUNT_MATCH_CMP + * - \ref EPWM_DUTY_INT_UP_COUNT_MATCH_CMP + * @return None + * @details This function is used to enable duty interrupt of selected channel. + */ +void EPWM_EnableDutyInt(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32IntDutyType) +{ + (epwm)->INTEN0 |= (u32IntDutyType << u32ChannelNum); +} + +/** + * @brief Disable duty interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to disable duty interrupt of selected channel. + */ +void EPWM_DisableDutyInt(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->INTEN0 &= ~((uint32_t)(EPWM_DUTY_INT_DOWN_COUNT_MATCH_CMP | EPWM_DUTY_INT_UP_COUNT_MATCH_CMP) << u32ChannelNum); +} + +/** + * @brief Clear duty interrupt flag of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to clear duty interrupt flag of selected channel. + */ +void EPWM_ClearDutyIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->INTSTS0 = (EPWM_INTSTS0_CMPUIF0_Msk | EPWM_INTSTS0_CMPDIF0_Msk) << u32ChannelNum; +} + +/** + * @brief Get duty interrupt flag of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return Duty interrupt flag of specified channel + * @retval 0 Duty interrupt did not occur + * @retval 1 Duty interrupt occurred + * @details This function is used to get duty interrupt flag of selected channel. + */ +uint32_t EPWM_GetDutyIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + return ((((epwm)->INTSTS0 & ((EPWM_INTSTS0_CMPDIF0_Msk | EPWM_INTSTS0_CMPUIF0_Msk) << u32ChannelNum))) ? 1UL : 0UL); +} + +/** + * @brief This function enable fault brake interrupt + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32BrakeSource Fault brake source. + * - \ref EPWM_FB_EDGE + * - \ref EPWM_FB_LEVEL + * @return None + * @details This function is used to enable fault brake interrupt. + * The write-protection function should be disabled before using this function. + * @note Every two channels share the same setting. + */ +void EPWM_EnableFaultBrakeInt(EPWM_T *epwm, uint32_t u32BrakeSource) +{ + (epwm)->INTEN1 |= (0x7UL << u32BrakeSource); +} + +/** + * @brief This function disable fault brake interrupt + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32BrakeSource Fault brake source. + * - \ref EPWM_FB_EDGE + * - \ref EPWM_FB_LEVEL + * @return None + * @details This function is used to disable fault brake interrupt. + * The write-protection function should be disabled before using this function. + * @note Every two channels share the same setting. + */ +void EPWM_DisableFaultBrakeInt(EPWM_T *epwm, uint32_t u32BrakeSource) +{ + (epwm)->INTEN1 &= ~(0x7UL << u32BrakeSource); +} + +/** + * @brief This function clear fault brake interrupt of selected source + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32BrakeSource Fault brake source. + * - \ref EPWM_FB_EDGE + * - \ref EPWM_FB_LEVEL + * @return None + * @details This function is used to clear fault brake interrupt of selected source. + * The write-protection function should be disabled before using this function. + */ +void EPWM_ClearFaultBrakeIntFlag(EPWM_T *epwm, uint32_t u32BrakeSource) +{ + (epwm)->INTSTS1 = (0x3fUL << u32BrakeSource); +} + +/** + * @brief This function get fault brake interrupt flag of selected source + * @param[in] epwm The pointer of the specified EPWM module + * @param[in] u32BrakeSource Fault brake source, could be either + * - \ref EPWM_FB_EDGE + * - \ref EPWM_FB_LEVEL + * @return Fault brake interrupt flag of specified source + * @retval 0 Fault brake interrupt did not occurred + * @retval 1 Fault brake interrupt occurred + * @details This function is used to get fault brake interrupt flag of selected source. + */ +uint32_t EPWM_GetFaultBrakeIntFlag(EPWM_T *epwm, uint32_t u32BrakeSource) +{ + return (((epwm)->INTSTS1 & (0x3fUL << u32BrakeSource)) ? 1UL : 0UL); +} + +/** + * @brief Enable period interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32IntPeriodType Period interrupt type. This parameter is not used. + * @return None + * @details This function is used to enable period interrupt of selected channel. + */ +void EPWM_EnablePeriodInt(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32IntPeriodType) +{ + (epwm)->INTEN0 |= ((1UL << EPWM_INTEN0_PIEN0_Pos) << u32ChannelNum); +} + +/** + * @brief Disable period interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to disable period interrupt of selected channel. + */ +void EPWM_DisablePeriodInt(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->INTEN0 &= ~((1UL << EPWM_INTEN0_PIEN0_Pos) << u32ChannelNum); +} + +/** + * @brief Clear period interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to clear period interrupt of selected channel. + */ +void EPWM_ClearPeriodIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->INTSTS0 = ((1UL << EPWM_INTSTS0_PIF0_Pos) << u32ChannelNum); +} + +/** + * @brief Get period interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return Period interrupt flag of specified channel + * @retval 0 Period interrupt did not occur + * @retval 1 Period interrupt occurred + * @details This function is used to get period interrupt of selected channel. + */ +uint32_t EPWM_GetPeriodIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + return ((((epwm)->INTSTS0 & ((1UL << EPWM_INTSTS0_PIF0_Pos) << u32ChannelNum))) ? 1UL : 0UL); +} + +/** + * @brief Enable zero interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to enable zero interrupt of selected channel. + */ +void EPWM_EnableZeroInt(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->INTEN0 |= ((1UL << EPWM_INTEN0_ZIEN0_Pos) << u32ChannelNum); +} + +/** + * @brief Disable zero interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to disable zero interrupt of selected channel. + */ +void EPWM_DisableZeroInt(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->INTEN0 &= ~((1UL << EPWM_INTEN0_ZIEN0_Pos) << u32ChannelNum); +} + +/** + * @brief Clear zero interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to clear zero interrupt of selected channel. + */ +void EPWM_ClearZeroIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->INTSTS0 = ((1UL << EPWM_INTEN0_ZIEN0_Pos) << u32ChannelNum); +} + +/** + * @brief Get zero interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return Zero interrupt flag of specified channel + * @retval 0 Zero interrupt did not occur + * @retval 1 Zero interrupt occurred + * @details This function is used to get zero interrupt of selected channel. + */ +uint32_t EPWM_GetZeroIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + return ((((epwm)->INTSTS0 & ((1UL << EPWM_INTEN0_ZIEN0_Pos) << u32ChannelNum))) ? 1UL : 0UL); +} + +/** + * @brief Enable interrupt flag accumulator of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32IntFlagCnt Interrupt flag counter. Valid values are between 0~65535. + * @param[in] u32IntAccSrc Interrupt flag accumulator source selection. + * - \ref EPWM_IFA_ZERO_POINT + * - \ref EPWM_IFA_PERIOD_POINT + * - \ref EPWM_IFA_COMPARE_UP_COUNT_POINT + * - \ref EPWM_IFA_COMPARE_DOWN_COUNT_POINT + * @return None + * @details This function is used to enable interrupt flag accumulator of selected channel. + */ +void EPWM_EnableAcc(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32IntFlagCnt, uint32_t u32IntAccSrc) +{ + (epwm)->IFA[u32ChannelNum] = (((epwm)->IFA[u32ChannelNum] & ~((EPWM_IFA0_IFACNT_Msk | EPWM_IFA0_IFASEL_Msk))) | \ + (EPWM_IFA0_IFAEN_Msk | (u32IntAccSrc << EPWM_IFA0_IFASEL_Pos) | u32IntFlagCnt)); +} + +/** + * @brief Disable interrupt flag accumulator of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to Disable interrupt flag accumulator of selected channel. + */ +void EPWM_DisableAcc(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->IFA[u32ChannelNum] = ((epwm)->IFA[u32ChannelNum] & ~(EPWM_IFA0_IFAEN_Msk)); +} + +/** + * @brief Enable interrupt flag accumulator interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to enable interrupt flag accumulator interrupt of selected channel. + */ +void EPWM_EnableAccInt(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->AINTEN |= (1UL << (u32ChannelNum)); +} + +/** + * @brief Disable interrupt flag accumulator interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to disable interrupt flag accumulator interrupt of selected channel. + */ +void EPWM_DisableAccInt(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->AINTEN &= ~(1UL << (u32ChannelNum)); +} + +/** + * @brief Clear interrupt flag accumulator interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to clear interrupt flag accumulator interrupt of selected channel. + */ +void EPWM_ClearAccInt(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->AINTSTS = (1UL << (u32ChannelNum)); +} + +/** + * @brief Get interrupt flag accumulator interrupt of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @retval 0 Accumulator interrupt did not occur + * @retval 1 Accumulator interrupt occurred + * @details This function is used to Get interrupt flag accumulator interrupt of selected channel. + */ +uint32_t EPWM_GetAccInt(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + return (((epwm)->AINTSTS & (1UL << (u32ChannelNum))) ? 1UL : 0UL); +} + +/** + * @brief Enable accumulator PDMA of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to enable accumulator interrupt trigger PDMA of selected channel. + */ +void EPWM_EnableAccPDMA(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->APDMACTL |= (1UL << (u32ChannelNum)); +} + +/** + * @brief Disable accumulator PDMA of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to disable accumulator interrupt trigger PDMA of selected channel. + */ +void EPWM_DisableAccPDMA(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->APDMACTL &= ~(1UL << (u32ChannelNum)); +} + +/** + * @brief Enable interrupt flag accumulator stop mode of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to enable interrupt flag accumulator stop mode of selected channel. + */ +void EPWM_EnableAccStopMode(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->IFA[u32ChannelNum] |= EPWM_IFA0_STPMOD_Msk; +} + +/** + * @brief Disable interrupt flag accumulator stop mode of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to disable interrupt flag accumulator stop mode of selected channel. + */ +void EPWM_DisableAccStopMode(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->IFA[u32ChannelNum] &= ~EPWM_IFA0_STPMOD_Msk; +} + +/** + * @brief Clear free trigger duty interrupt flag of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to clear free trigger duty interrupt flag of selected channel. + */ +void EPWM_ClearFTDutyIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->FTCI = ((EPWM_FTCI_FTCMU0_Msk | EPWM_FTCI_FTCMD0_Msk) << (u32ChannelNum >> 1U)); +} + +/** + * @brief Get free trigger duty interrupt flag of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return Duty interrupt flag of specified channel + * @retval 0 Free trigger duty interrupt did not occur + * @retval 1 Free trigger duty interrupt occurred + * @details This function is used to get free trigger duty interrupt flag of selected channel. + */ +uint32_t EPWM_GetFTDutyIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + return (((epwm)->FTCI & ((EPWM_FTCI_FTCMU0_Msk | EPWM_FTCI_FTCMD0_Msk) << (u32ChannelNum >> 1U))) ? 1UL : 0UL); +} + +/** + * @brief Enable load mode of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32LoadMode EPWM counter loading mode. + * - \ref EPWM_LOAD_MODE_IMMEDIATE + * - \ref EPWM_LOAD_MODE_WINDOW + * - \ref EPWM_LOAD_MODE_CENTER + * @return None + * @details This function is used to enable load mode of selected channel. + */ +void EPWM_EnableLoadMode(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32LoadMode) +{ + (epwm)->CTL0 |= (u32LoadMode << u32ChannelNum); +} + +/** + * @brief Disable load mode of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32LoadMode EPWM counter loading mode. + * - \ref EPWM_LOAD_MODE_IMMEDIATE + * - \ref EPWM_LOAD_MODE_WINDOW + * - \ref EPWM_LOAD_MODE_CENTER + * @return None + * @details This function is used to disable load mode of selected channel. + */ +void EPWM_DisableLoadMode(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32LoadMode) +{ + (epwm)->CTL0 &= ~(u32LoadMode << u32ChannelNum); +} + +/** + * @brief Configure synchronization phase of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32SyncSrc EPWM synchronize source selection. + * - \ref EPWM_SYNC_OUT_FROM_SYNCIN_SWSYNC + * - \ref EPWM_SYNC_OUT_FROM_COUNT_TO_ZERO + * - \ref EPWM_SYNC_OUT_FROM_COUNT_TO_COMPARATOR + * - \ref EPWM_SYNC_OUT_DISABLE + * @param[in] u32Direction Phase direction. Control EPWM counter count decrement or increment after synchronizing. + * - \ref EPWM_PHS_DIR_DECREMENT + * - \ref EPWM_PHS_DIR_INCREMENT + * @param[in] u32StartPhase Synchronous start phase value. Valid values are between 0~65535. + * @return None + * @details This function is used to configure synchronization phase of selected channel. + * @note Every two channels share the same setting. + */ +void EPWM_ConfigSyncPhase(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32SyncSrc, uint32_t u32Direction, uint32_t u32StartPhase) +{ + /* every two channels shares the same setting */ + u32ChannelNum >>= 1U; + (epwm)->SYNC = (((epwm)->SYNC & ~(((3UL << EPWM_SYNC_SINSRC0_Pos) << (u32ChannelNum << 1U)) | ((1UL << EPWM_SYNC_PHSDIR0_Pos) << u32ChannelNum))) | \ + (u32Direction << EPWM_SYNC_PHSDIR0_Pos << u32ChannelNum) | ((u32SyncSrc << EPWM_SYNC_SINSRC0_Pos) << (u32ChannelNum << 1U))); + (epwm)->PHS[(u32ChannelNum)] = u32StartPhase; +} + + +/** + * @brief Enable SYNC phase of selected channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @details This function is used to enable SYNC phase of selected channel(s). + * @note Every two channels share the same setting. + */ +void EPWM_EnableSyncPhase(EPWM_T *epwm, uint32_t u32ChannelMask) +{ + uint32_t i; + for (i = 0U; i < EPWM_CHANNEL_NUM; i ++) + { + if (u32ChannelMask & (1UL << i)) + { + (epwm)->SYNC |= ((1UL << EPWM_SYNC_PHSEN0_Pos) << (i >> 1U)); + } + } +} + +/** + * @brief Disable SYNC phase of selected channel(s) + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel. + * Bit 0 is channel 0, bit 1 is channel 1... + * @return None + * @details This function is used to disable SYNC phase of selected channel(s). + * @note Every two channels share the same setting. + */ +void EPWM_DisableSyncPhase(EPWM_T *epwm, uint32_t u32ChannelMask) +{ + uint32_t i; + for (i = 0U; i < EPWM_CHANNEL_NUM; i ++) + { + if (u32ChannelMask & (1UL << i)) + { + (epwm)->SYNC &= ~((1UL << EPWM_SYNC_PHSEN0_Pos) << (i >> 1U)); + } + } +} + +/** + * @brief Enable EPWM SYNC_IN noise filter function + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ClkCnt SYNC Edge Detector Filter Count. This controls the counter number of edge detector. + * The valid value is 0~7. + * @param[in] u32ClkDivSel SYNC Edge Detector Filter Clock Selection. + * - \ref EPWM_NF_CLK_DIV_1 + * - \ref EPWM_NF_CLK_DIV_2 + * - \ref EPWM_NF_CLK_DIV_4 + * - \ref EPWM_NF_CLK_DIV_8 + * - \ref EPWM_NF_CLK_DIV_16 + * - \ref EPWM_NF_CLK_DIV_32 + * - \ref EPWM_NF_CLK_DIV_64 + * - \ref EPWM_NF_CLK_DIV_128 + * @return None + * @details This function is used to enable EPWM SYNC_IN noise filter function. + */ +void EPWM_EnableSyncNoiseFilter(EPWM_T *epwm, uint32_t u32ClkCnt, uint32_t u32ClkDivSel) +{ + (epwm)->SYNC = ((epwm)->SYNC & ~(EPWM_SYNC_SFLTCNT_Msk | EPWM_SYNC_SFLTCSEL_Msk)) | \ + ((u32ClkCnt << EPWM_SYNC_SFLTCNT_Pos) | (u32ClkDivSel << EPWM_SYNC_SFLTCSEL_Pos) | EPWM_SYNC_SNFLTEN_Msk); +} + +/** + * @brief Disable EPWM SYNC_IN noise filter function + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @return None + * @details This function is used to Disable EPWM SYNC_IN noise filter function. + */ +void EPWM_DisableSyncNoiseFilter(EPWM_T *epwm) +{ + (epwm)->SYNC &= ~EPWM_SYNC_SNFLTEN_Msk; +} + +/** + * @brief Enable EPWM SYNC input pin inverse function + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @return None + * @details This function is used to enable EPWM SYNC input pin inverse function. + */ +void EPWM_EnableSyncPinInverse(EPWM_T *epwm) +{ + (epwm)->SYNC |= EPWM_SYNC_SINPINV_Msk; +} + +/** + * @brief Disable EPWM SYNC input pin inverse function + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @return None + * @details This function is used to Disable EPWM SYNC input pin inverse function. + */ +void EPWM_DisableSyncPinInverse(EPWM_T *epwm) +{ + (epwm)->SYNC &= (~EPWM_SYNC_SINPINV_Msk); +} + +/** + * @brief Set EPWM clock source + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @param[in] u32ClkSrcSel EPWM external clock source. + * - \ref EPWM_CLKSRC_EPWM_CLK + * - \ref EPWM_CLKSRC_TIMER0 + * - \ref EPWM_CLKSRC_TIMER1 + * - \ref EPWM_CLKSRC_TIMER2 + * - \ref EPWM_CLKSRC_TIMER3 + * @return None + * @details This function is used to set EPWM clock source. + * @note Every two channels share the same setting. + * @note If the clock source of EPWM counter is selected from TIMERn interrupt events, the TRGEPWM(TIMERn_TRGCTL[1], n=0,1..3) bit must be set as 1. + */ +void EPWM_SetClockSource(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32ClkSrcSel) +{ + (epwm)->CLKSRC = ((epwm)->CLKSRC & ~(EPWM_CLKSRC_ECLKSRC0_Msk << ((u32ChannelNum >> 1U) << 3U))) | \ + (u32ClkSrcSel << ((u32ChannelNum >> 1U) << 3U)); +} + +/** + * @brief Enable EPWM brake noise filter function + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32BrakePinNum Brake pin selection. Valid values are 0 or 1. + * @param[in] u32ClkCnt SYNC Edge Detector Filter Count. This controls the counter number of edge detector + * @param[in] u32ClkDivSel SYNC Edge Detector Filter Clock Selection. + * - \ref EPWM_NF_CLK_DIV_1 + * - \ref EPWM_NF_CLK_DIV_2 + * - \ref EPWM_NF_CLK_DIV_4 + * - \ref EPWM_NF_CLK_DIV_8 + * - \ref EPWM_NF_CLK_DIV_16 + * - \ref EPWM_NF_CLK_DIV_32 + * - \ref EPWM_NF_CLK_DIV_64 + * - \ref EPWM_NF_CLK_DIV_128 + * @return None + * @details This function is used to enable EPWM brake noise filter function. + */ +void EPWM_EnableBrakeNoiseFilter(EPWM_T *epwm, uint32_t u32BrakePinNum, uint32_t u32ClkCnt, uint32_t u32ClkDivSel) +{ + (epwm)->BNF = ((epwm)->BNF & ~((EPWM_BNF_BRK0FCNT_Msk | EPWM_BNF_BRK0NFSEL_Msk) << (u32BrakePinNum << 3U))) | \ + (((u32ClkCnt << EPWM_BNF_BRK0FCNT_Pos) | (u32ClkDivSel << EPWM_BNF_BRK0NFSEL_Pos) | EPWM_BNF_BRK0NFEN_Msk) << (u32BrakePinNum << 3U)); +} + +/** + * @brief Disable EPWM brake noise filter function + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32BrakePinNum Brake pin selection. Valid values are 0 or 1. + * @return None + * @details This function is used to disable EPWM brake noise filter function. + */ +void EPWM_DisableBrakeNoiseFilter(EPWM_T *epwm, uint32_t u32BrakePinNum) +{ + (epwm)->BNF &= ~(EPWM_BNF_BRK0NFEN_Msk << (u32BrakePinNum << 3U)); +} + +/** + * @brief Enable EPWM brake pin inverse function + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32BrakePinNum Brake pin selection. Valid values are 0 or 1. + * @return None + * @details This function is used to enable EPWM brake pin inverse function. + */ +void EPWM_EnableBrakePinInverse(EPWM_T *epwm, uint32_t u32BrakePinNum) +{ + (epwm)->BNF |= (EPWM_BNF_BRK0PINV_Msk << (u32BrakePinNum << 3U)); +} + +/** + * @brief Disable EPWM brake pin inverse function + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32BrakePinNum Brake pin selection. Valid values are 0 or 1. + * @return None + * @details This function is used to disable EPWM brake pin inverse function. + */ +void EPWM_DisableBrakePinInverse(EPWM_T *epwm, uint32_t u32BrakePinNum) +{ + (epwm)->BNF &= ~(EPWM_BNF_BRK0PINV_Msk << (u32BrakePinNum * (uint32_t)EPWM_BNF_BRK1NFEN_Pos)); +} + +/** + * @brief Set EPWM brake pin source + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32BrakePinNum Brake pin selection. Valid values are 0 or 1. + * @param[in] u32SelAnotherModule Select to another module. Valid values are TRUE or FALSE. + * @return None + * @details This function is used to set EPWM brake pin source. + */ +void EPWM_SetBrakePinSource(EPWM_T *epwm, uint32_t u32BrakePinNum, uint32_t u32SelAnotherModule) +{ + (epwm)->BNF = ((epwm)->BNF & ~(EPWM_BNF_BK0SRC_Msk << (u32BrakePinNum << 3U))) | (u32SelAnotherModule << ((uint32_t)EPWM_BNF_BK0SRC_Pos + (u32BrakePinNum << 3U))); +} + +/** + * @brief Set EPWM leading edge blanking function + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32TrigSrcSel Leading edge blanking source selection. + * - \ref EPWM_LEBCTL_SRCEN0 + * - \ref EPWM_LEBCTL_SRCEN2 + * - \ref EPWM_LEBCTL_SRCEN4 + * - \ref EPWM_LEBCTL_SRCEN0_2 + * - \ref EPWM_LEBCTL_SRCEN0_4 + * - \ref EPWM_LEBCTL_SRCEN2_4 + * - \ref EPWM_LEBCTL_SRCEN0_2_4 + * @param[in] u32TrigType Leading edge blanking trigger type. + * - \ref EPWM_LEBCTL_TRGTYPE_RISING + * - \ref EPWM_LEBCTL_TRGTYPE_FALLING + * - \ref EPWM_LEBCTL_TRGTYPE_RISING_OR_FALLING + * @param[in] u32BlankingCnt Leading Edge Blanking Counter. Valid values are between 1~512. + This counter value decides leading edge blanking window size, and this counter clock base is ECLK. + * @param[in] u32BlankingEnable Enable EPWM leading edge blanking function. Valid values are TRUE (ENABLE) or FALSE (DISABLE). + * - \ref FALSE + * - \ref TRUE + * @return None + * @details This function is used to configure EPWM leading edge blanking function that blank the false trigger from ACMP brake source which may cause by EPWM output transition. + * @note EPWM leading edge blanking function is only used for brake source from ACMP. + */ +void EPWM_SetLeadingEdgeBlanking(EPWM_T *epwm, uint32_t u32TrigSrcSel, uint32_t u32TrigType, uint32_t u32BlankingCnt, uint32_t u32BlankingEnable) +{ + (epwm)->LEBCTL = (u32TrigType) | (u32TrigSrcSel) | (u32BlankingEnable); + /* Blanking window size = LEBCNT + 1, so LEBCNT = u32BlankingCnt - 1 */ + (epwm)->LEBCNT = (u32BlankingCnt) - 1U; +} + +/** + * @brief Get the time-base counter reached its maximum value flag of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return Count to max interrupt flag of specified channel + * @retval 0 Count to max interrupt did not occur + * @retval 1 Count to max interrupt occurred + * @details This function is used to get the time-base counter reached its maximum value flag of selected channel. + */ +uint32_t EPWM_GetWrapAroundFlag(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + return (((epwm)->STATUS & (EPWM_STATUS_CNTMAXF0_Msk << u32ChannelNum)) ? 1UL : 0UL); +} + +/** + * @brief Clear the time-base counter reached its maximum value flag of selected channel + * @param[in] epwm The pointer of the specified EPWM module + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 + * @return None + * @details This function is used to clear the time-base counter reached its maximum value flag of selected channel. + */ +void EPWM_ClearWrapAroundFlag(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->STATUS = (EPWM_STATUS_CNTMAXF0_Msk << u32ChannelNum); +} + +/** + * @brief Enable fault detect of selected channel. + * @param[in] epwm The pointer of the specified EPWM module. + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @param[in] u32AfterPrescaler Fault Detect Clock Source is from prescaler output. Valid values are TRUE (after prescaler) or FALSE (before prescaler). + * @param[in] u32ClkSel Fault Detect Clock Select. + * - \ref EPWM_FDCTL_FDCKSEL_CLK_DIV_1 + * - \ref EPWM_FDCTL_FDCKSEL_CLK_DIV_2 + * - \ref EPWM_FDCTL_FDCKSEL_CLK_DIV_4 + * - \ref EPWM_FDCTL_FDCKSEL_CLK_DIV_8 + * @return None + * @details This function is used to enable fault detect of selected channel. + */ +void EPWM_EnableFaultDetect(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32AfterPrescaler, uint32_t u32ClkSel) +{ + (epwm)->FDEN = ((epwm)->FDEN & ~(EPWM_FDEN_FDCKS0_Msk << (u32ChannelNum))) | \ + ((EPWM_FDEN_FDEN0_Msk | ((u32AfterPrescaler) << EPWM_FDEN_FDCKS0_Pos)) << (u32ChannelNum)); + (epwm)->FDCTL[(u32ChannelNum)] = ((epwm)->FDCTL[(u32ChannelNum)] & ~EPWM_FDCTL0_FDCKSEL_Msk) | (u32ClkSel); +} + +/** + * @brief Disable fault detect of selected channel. + * @param[in] epwm The pointer of the specified EPWM module. + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @return None + * @details This function is used to disable fault detect of selected channel. + */ +void EPWM_DisableFaultDetect(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->FDEN &= ~(EPWM_FDEN_FDEN0_Msk << (u32ChannelNum)); +} + +/** + * @brief Enable fault detect output of selected channel. + * @param[in] epwm The pointer of the specified EPWM module. + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @return None + * @details This function is used to enable fault detect output of selected channel. + */ +void EPWM_EnableFaultDetectOutput(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->FDEN &= ~(EPWM_FDEN_FDODIS0_Msk << (u32ChannelNum)); +} + +/** + * @brief Disable fault detect output of selected channel. + * @param[in] epwm The pointer of the specified EPWM module. + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @return None + * @details This function is used to disable fault detect output of selected channel. + */ +void EPWM_DisableFaultDetectOutput(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->FDEN |= (EPWM_FDEN_FDODIS0_Msk << (u32ChannelNum)); +} + +/** + * @brief Enable fault detect deglitch function of selected channel. + * @param[in] epwm The pointer of the specified EPWM module. + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @param[in] u32DeglitchSmpCycle Deglitch Sampling Cycle. Valid values are between 0~7. + * @return None + * @details This function is used to enable fault detect deglitch function of selected channel. + */ +void EPWM_EnableFaultDetectDeglitch(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32DeglitchSmpCycle) +{ + (epwm)->FDCTL[(u32ChannelNum)] = ((epwm)->FDCTL[(u32ChannelNum)] & (~EPWM_FDCTL0_DGSMPCYC_Msk)) | \ + (EPWM_FDCTL0_FDDGEN_Msk | ((u32DeglitchSmpCycle) << EPWM_FDCTL0_DGSMPCYC_Pos)); +} + +/** + * @brief Disable fault detect deglitch function of selected channel. + * @param[in] epwm The pointer of the specified EPWM module. + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @return None + * @details This function is used to disable fault detect deglitch function of selected channel. + */ +void EPWM_DisableFaultDetectDeglitch(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->FDCTL[(u32ChannelNum)] &= ~EPWM_FDCTL0_FDDGEN_Msk; +} + +/** + * @brief Enable fault detect mask function of selected channel. + * @param[in] epwm The pointer of the specified EPWM module. + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @param[in] u32MaskCnt Transition mask counter. Valid values are between 0~0x7F. + * @return None + * @details This function is used to enable fault detect mask function of selected channel. + */ +void EPWM_EnableFaultDetectMask(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32MaskCnt) +{ + (epwm)->FDCTL[(u32ChannelNum)] = ((epwm)->FDCTL[(u32ChannelNum)] & (~EPWM_FDCTL0_TRMSKCNT_Msk)) | (EPWM_FDCTL0_FDMSKEN_Msk | (u32MaskCnt)); +} + +/** + * @brief Disable fault detect mask function of selected channel. + * @param[in] epwm The pointer of the specified EPWM module. + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @return None + * @details This function is used to disable fault detect mask function of selected channel. + */ +void EPWM_DisableFaultDetectMask(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->FDCTL[(u32ChannelNum)] &= ~EPWM_FDCTL0_FDMSKEN_Msk; +} + +/** + * @brief Enable fault detect interrupt of selected channel. + * @param[in] epwm The pointer of the specified EPWM module. + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @return None + * @details This function is used to enable fault detect interrupt of selected channel. + */ +void EPWM_EnableFaultDetectInt(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->FDIEN |= (EPWM_FDIEN_FDIEN0_Msk << (u32ChannelNum)); +} + +/** + * @brief Disable fault detect interrupt of selected channel. + * @param[in] epwm The pointer of the specified EPWM module. + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @return None + * @details This function is used to disable fault detect interrupt of selected channel. + */ +void EPWM_DisableFaultDetectInt(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->FDIEN &= ~(EPWM_FDIEN_FDIEN0_Msk << (u32ChannelNum)); +} + +/** + * @brief Clear fault detect interrupt of selected channel. + * @param[in] epwm The pointer of the specified EPWM module. + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @return None + * @details This function is used to clear fault detect interrupt of selected channel. + */ +void EPWM_ClearFaultDetectInt(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + (epwm)->FDSTS = (EPWM_FDSTS_FDIF0_Msk << (u32ChannelNum)); +} + +/** + * @brief Get fault detect interrupt of selected channel. + * @param[in] epwm The pointer of the specified EPWM module. + * - EPWM0 : EPWM Group 0 + * - EPWM1 : EPWM Group 1 + * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5. + * @retval 0 Fault detect interrupt did not occur. + * @retval 1 Fault detect interrupt occurred. + * @details This function is used to Get fault detect interrupt of selected channel. + */ +uint32_t EPWM_GetFaultDetectInt(EPWM_T *epwm, uint32_t u32ChannelNum) +{ + return (((epwm)->FDSTS & (EPWM_FDSTS_FDIF0_Msk << (u32ChannelNum))) ? 1UL : 0UL); +} + +/*@}*/ /* end of group EPWM_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group EPWM_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_gpio.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_gpio.c new file mode 100644 index 0000000000..7ea2713ea7 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_gpio.c @@ -0,0 +1,255 @@ +/**************************************************************************//** + * @file gpio.c + * @brief GPIO driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup GPIO_Driver GPIO Driver + @{ +*/ + +/** @addtogroup GPIO_EXPORTED_FUNCTIONS GPIO Exported Functions + @{ +*/ + +/** + * @brief Set GPIO operation mode + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG or PH. + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. + * It could be BIT0 ~ BIT15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be BIT0 ~ BIT13 for PE GPIO port. + * It could be BIT0 ~ BIT11 for PG GPIO port. + * @param[in] u32Mode Operation mode. It could be \n + * GPIO_MODE_INPUT, GPIO_MODE_OUTPUT, GPIO_MODE_OPEN_DRAIN, GPIO_MODE_QUASI. + * + * @return None + * + * @details This function is used to set specified GPIO operation mode. + */ +void GPIO_SetMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode) +{ + uint32_t i; + + for (i = 0ul; i < GPIO_PIN_MAX; i++) + { + if ((u32PinMask & (1ul << i)) == (1ul << i)) + { + port->MODE = (port->MODE & ~(0x3ul << (i << 1))) | (u32Mode << (i << 1)); + } + } +} + +/** + * @brief Enable GPIO interrupt + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG or PH. + * @param[in] u32Pin The pin of specified GPIO port. + * It could be 0 ~ 15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be 0 ~ 13 for PE GPIO port. + * It could be 0 ~ 11 for PG GPIO port. + * @param[in] u32IntAttribs The interrupt attribute of specified GPIO pin. It could be \n + * GPIO_INT_RISING, GPIO_INT_FALLING, GPIO_INT_BOTH_EDGE, GPIO_INT_HIGH, GPIO_INT_LOW. + * + * @return None + * + * @details This function is used to enable specified GPIO pin interrupt. + */ +void GPIO_EnableInt(GPIO_T *port, uint32_t u32Pin, uint32_t u32IntAttribs) +{ + port->INTTYPE = (port->INTTYPE & ~(1ul << u32Pin)) | (((u32IntAttribs >> 24) & 0xFFUL) << u32Pin); + port->INTEN = (port->INTEN & ~(0x00010001ul << u32Pin)) | ((u32IntAttribs & 0xFFFFFFUL) << u32Pin); +} + + +/** + * @brief Disable GPIO interrupt + * + * @param[in] port GPIO port. It could be PA, PB, PC, PD, PE, PF, PG or PH. + * @param[in] u32Pin The pin of specified GPIO port. + * It could be 0 ~ 15 for PA, PB, PC, PD, PF and PH GPIO port. + * It could be 0 ~ 13 for PE GPIO port. + * It could be 0 ~ 11 for PG GPIO port. + * + * @return None + * + * @details This function is used to disable specified GPIO pin interrupt. + */ +void GPIO_DisableInt(GPIO_T *port, uint32_t u32Pin) +{ + port->INTTYPE &= ~(1UL << u32Pin); + port->INTEN &= ~((0x00010001UL) << u32Pin); +} + +/** + * @brief Set GPIO slew rate control + * + * @param[in] port GPIO port. It could be \ref PA, \ref PB, ... or \ref GPH + * @param[in] u32PinMask The single or multiple pins of specified GPIO port. + * @param[in] u32Mode Slew rate mode. \ref GPIO_SLEWCTL_NORMAL (maximum 40 MHz at 2.7V) + * \ref GPIO_SLEWCTL_HIGH (maximum 80 MHz at 2.7V) + * \ref GPIO_SLEWCTL_FAST (maximum 100 MHz at 2.7V) + * + * @return None + * + * @details This function is used to set specified GPIO operation mode. + */ +void GPIO_SetSlewCtl(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode) +{ + uint32_t i; + + for (i = 0ul; i < GPIO_PIN_MAX; i++) + { + if (u32PinMask & (1ul << i)) + { + port->SLEWCTL = (port->SLEWCTL & ~(0x3ul << (i << 1))) | (u32Mode << (i << 1)); + } + } +} + +/** + * @brief Set GPIO Pull-up and Pull-down control + * + * @param[in] port GPIO port. It could be \ref PA, \ref PB, ... or \ref GPH + * @param[in] u32PinMask The pin of specified GPIO port. It could be 0 ~ 15. + * @param[in] u32Mode The pin mode of specified GPIO pin. It could be + * \ref GPIO_PUSEL_DISABLE + * \ref GPIO_PUSEL_PULL_UP + * \ref GPIO_PUSEL_PULL_DOWN + * + * @return None + * + * @details Set the pin mode of specified GPIO pin. + */ +void GPIO_SetPullCtl(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode) +{ + uint32_t i; + + for (i = 0ul; i < GPIO_PIN_MAX; i++) + { + if (u32PinMask & (1ul << i)) + { + port->PUSEL = (port->PUSEL & ~(0x3ul << (i << 1))) | (u32Mode << (i << 1)); + } + } +} + +/** + * @brief Set GPIO Driving Strength control + * + * @param[in] port GPIO port. It could be \ref PA, \ref PB, ... or \ref GPH + * @param[in] u32PinMask The pin of specified GPIO port. It could be 0 ~ 15. + * @param[in] u32Driving The pin driving strength of specified GPIO pin. It could be + * \ref 000 = Px.n is minimum deiver strength. + * \ref 111 = Px.n is maximum deiver strength. + * + * @return None + * + * @details Set the driving strength of specified GPIO pin. + */ +void GPIO_SetDrivingCtl(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Driving) +{ + uint32_t i; + + for (i = 0ul; i < GPIO_PIN_MAX; i++) + { + if (u32PinMask & (1ul << i)) + { + volatile uint32_t *pu32DS = &port->DSL + (i / 8); + uint32_t u32Offset = 4 * (i % 8); + *pu32DS = (*pu32DS & ~(0x7ul << u32Offset)) | ((u32Driving & 0x7) << u32Offset); + } + } +} + +uint32_t GPIO_GetDrivingCtl(GPIO_T *port, uint32_t u32PinNo) +{ + volatile uint32_t *pu32DS = &port->DSL + (u32PinNo / 8); + uint32_t u32Offset = 4 * (u32PinNo % 8) ; + return (*pu32DS >> u32Offset) & 0x7; +} + +/** + * @brief Set GPIO Power Mode + * + * @param[in] port GPIO port. It could be \ref PA, \ref PB, ... or \ref GPH + * @param[in] u32PinMask The pin of specified GPIO port. It could be 0 ~ 15. + * @param[in] u32PowerMode The pin driving strength of specified GPIO pin. It could be + * \ref 0 = Px.n is 1.8v. + * \ref 1 = Px.n is 3.3v. + * + * @return None + * + * @details Set the power mode of specified GPIO pin. + * Only PB.0~15, PD.1, PE.2~13, PF.0~13, PG.10, PJ.0~11, PK.9~10, PN.10~11 pad voltage can be selected. + */ +void GPIO_SetPowerMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32PowerMode) +{ + uint32_t i; + + for (i = 0ul; i < GPIO_PIN_MAX; i++) + { + if (u32PinMask & (1ul << i)) + { + uint32_t value = port->SPW; + value &= ~(1 << i); + value |= ((u32PowerMode ? 1 : 0) << i); + port->SPW = value; + } + } +} + +uint32_t GPIO_GetPowerMode(GPIO_T *port, uint32_t u32PinNo) +{ + return (port->SPW & (1 << u32PinNo)) >> u32PinNo; +} + +/** + * @brief Set GPIO Input Schmitt Trigger + * + * @param[in] port GPIO port. It could be \ref PA, \ref PB, ... or \ref GPH + * @param[in] u32PinMask The pin of specified GPIO port. It could be 0 ~ 15. + * @param[in] u32SchmittTrigger The pin driving strength of specified GPIO pin. It could be + * \ref 0 = Px.n input schmitt trigger function Disabled. + * \ref 1 = Px.n input schmitt trigger function Enabled. + * + * @return None + * + * @details Set the power mode of specified GPIO pin. + * Only PB.0~15, PD.1, PE.2~13, PF.0~13, PG.10, PJ.0~11, PK.9~10, PN.10~11 pad voltage can be selected. + */ +void GPIO_SetSchmittTriggere(GPIO_T *port, uint32_t u32PinMask, uint32_t u32SchmittTrigger) +{ + uint32_t i; + + for (i = 0ul; i < GPIO_PIN_MAX; i++) + { + if (u32PinMask & (1ul << i)) + { + uint32_t value = port->SMTEN; + value &= ~(1 << i); + value |= ((u32SchmittTrigger ? 1 : 0) << i); + port->SMTEN = value; + } + } +} + +uint32_t GPIO_GetSchmittTriggere(GPIO_T *port, uint32_t u32PinNo) +{ + return (port->SMTEN & (1 << u32PinNo)) >> u32PinNo; +} + +/*@}*/ /* end of group GPIO_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group GPIO_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_i2c.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_i2c.c new file mode 100644 index 0000000000..6baf9e91fb --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_i2c.c @@ -0,0 +1,1244 @@ +/**************************************************************************//** + * @file i2c.c + * @brief I2C driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup I2C_Driver I2C Driver + @{ +*/ + + +/** @addtogroup I2C_EXPORTED_FUNCTIONS I2C Exported Functions + @{ +*/ + +/** + * @brief Enable specify I2C Controller and set Clock Divider + * + * @param[in] i2c Specify I2C port + * @param[in] u32BusClock The target I2C bus clock in Hz + * + * @return Actual I2C bus clock frequency + * + * @details The function enable the specify I2C Controller and set proper Clock Divider + * in I2C CLOCK DIVIDED REGISTER (I2CLK) according to the target I2C Bus clock. + * I2C Bus clock = PCLK / (4*(divider+1). + * + */ +uint32_t I2C_Open(I2C_T *i2c, uint32_t u32BusClock) +{ + uint32_t u32Div; + uint32_t u32Pclk; + + u32Pclk = CLK_GetPCLK0Freq(); + + u32Div = (uint32_t)(((u32Pclk * 10U) / (u32BusClock * 4U) + 5U) / 10U - 1U); /* Compute proper divider for I2C clock */ + i2c->CLKDIV = u32Div; + + /* Enable I2C */ + i2c->CTL0 |= I2C_CTL0_I2CEN_Msk; + + return (u32Pclk / ((u32Div + 1U) << 2U)); +} + +/** + * @brief Disable specify I2C Controller + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details Reset I2C Controller and disable specify I2C port. + * + */ + +void I2C_Close(I2C_T *i2c) +{ + /* Reset I2C Controller */ + if ((uint32_t)i2c == I2C0_BASE) + { + SYS->IPRST1 |= SYS_IPRST1_I2C0RST_Msk; + SYS->IPRST1 &= ~SYS_IPRST1_I2C0RST_Msk; + } + else if ((uint32_t)i2c == I2C1_BASE) + { + SYS->IPRST1 |= SYS_IPRST1_I2C1RST_Msk; + SYS->IPRST1 &= ~SYS_IPRST1_I2C1RST_Msk; + } + else if ((uint32_t)i2c == I2C2_BASE) + { + SYS->IPRST1 |= SYS_IPRST1_I2C2RST_Msk; + SYS->IPRST1 &= ~SYS_IPRST1_I2C2RST_Msk; + } + else if ((uint32_t)i2c == I2C3_BASE) + { + SYS->IPRST1 |= SYS_IPRST1_I2C3RST_Msk; + SYS->IPRST1 &= ~SYS_IPRST1_I2C3RST_Msk; + } + else if ((uint32_t)i2c == I2C4_BASE) + { + SYS->IPRST1 |= SYS_IPRST3_I2C4RST_Pos; + SYS->IPRST1 &= ~SYS_IPRST3_I2C4RST_Pos; + } + else if ((uint32_t)i2c == I2C5_BASE) + { + SYS->IPRST1 |= SYS_IPRST3_I2C5RST_Pos; + SYS->IPRST1 &= ~SYS_IPRST3_I2C5RST_Pos; + } + + /* Disable I2C */ + i2c->CTL0 &= ~I2C_CTL0_I2CEN_Msk; +} + +/** + * @brief Clear Time-out Counter flag + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details When Time-out flag will be set, use this function to clear I2C Bus Time-out counter flag . + * + */ +void I2C_ClearTimeoutFlag(I2C_T *i2c) +{ + i2c->TOCTL |= I2C_TOCTL_TOIF_Msk; +} + +/** + * @brief Set Control bit of I2C Controller + * + * @param[in] i2c Specify I2C port + * @param[in] u8Start Set I2C START condition + * @param[in] u8Stop Set I2C STOP condition + * @param[in] u8Si Clear SI flag + * @param[in] u8Ack Set I2C ACK bit + * + * @return None + * + * @details The function set I2C Control bit of I2C Bus protocol. + * + */ +void I2C_Trigger(I2C_T *i2c, uint8_t u8Start, uint8_t u8Stop, uint8_t u8Si, uint8_t u8Ack) +{ + uint32_t u32Reg = 0U; + + if (u8Start) + { + u32Reg |= I2C_CTL_STA; + } + + if (u8Stop) + { + u32Reg |= I2C_CTL_STO; + } + + if (u8Si) + { + u32Reg |= I2C_CTL_SI; + } + + if (u8Ack) + { + u32Reg |= I2C_CTL_AA; + } + + i2c->CTL0 = (i2c->CTL0 & ~0x3CU) | u32Reg; +} + +/** + * @brief Disable Interrupt of I2C Controller + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details The function is used for disable I2C interrupt + * + */ +void I2C_DisableInt(I2C_T *i2c) +{ + i2c->CTL0 &= ~I2C_CTL0_INTEN_Msk; +} + +/** + * @brief Enable Interrupt of I2C Controller + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details The function is used for enable I2C interrupt + * + */ +void I2C_EnableInt(I2C_T *i2c) +{ + i2c->CTL0 |= I2C_CTL0_INTEN_Msk; +} + +/** + * @brief Get I2C Bus Clock + * + * @param[in] i2c Specify I2C port + * + * @return The actual I2C Bus clock in Hz + * + * @details To get the actual I2C Bus Clock frequency. + */ +uint32_t I2C_GetBusClockFreq(I2C_T *i2c) +{ + uint32_t u32Divider = i2c->CLKDIV; + uint32_t u32Pclk; + + u32Pclk = CLK_GetPCLK0Freq(); + + return (u32Pclk / ((u32Divider + 1U) << 2U)); +} + +/** + * @brief Set I2C Bus Clock + * + * @param[in] i2c Specify I2C port + * @param[in] u32BusClock The target I2C Bus Clock in Hz + * + * @return The actual I2C Bus Clock in Hz + * + * @details To set the actual I2C Bus Clock frequency. + */ +uint32_t I2C_SetBusClockFreq(I2C_T *i2c, uint32_t u32BusClock) +{ + uint32_t u32Div; + uint32_t u32Pclk; + + u32Pclk = CLK_GetPCLK0Freq(); + + u32Div = (uint32_t)(((u32Pclk * 10U) / (u32BusClock * 4U) + 5U) / 10U - 1U); /* Compute proper divider for I2C clock */ + i2c->CLKDIV = u32Div; + + return (u32Pclk / ((u32Div + 1U) << 2U)); +} + +/** + * @brief Get Interrupt Flag + * + * @param[in] i2c Specify I2C port + * + * @return I2C interrupt flag status + * + * @details To get I2C Bus interrupt flag. + */ +uint32_t I2C_GetIntFlag(I2C_T *i2c) +{ + uint32_t u32Value; + + if ((i2c->CTL0 & I2C_CTL0_SI_Msk) == I2C_CTL0_SI_Msk) + { + u32Value = 1U; + } + else + { + u32Value = 0U; + } + + return u32Value; +} + +/** + * @brief Get I2C Bus Status Code + * + * @param[in] i2c Specify I2C port + * + * @return I2C Status Code + * + * @details To get I2C Bus Status Code. + */ +uint32_t I2C_GetStatus(I2C_T *i2c) +{ + return (i2c->STATUS0); +} + +/** + * @brief Read a Byte from I2C Bus + * + * @param[in] i2c Specify I2C port + * + * @return I2C Data + * + * @details To read a bytes data from specify I2C port. + */ +uint8_t I2C_GetData(I2C_T *i2c) +{ + return (uint8_t)(i2c->DAT); +} + +/** + * @brief Send a byte to I2C Bus + * + * @param[in] i2c Specify I2C port + * @param[in] u8Data The data to send to I2C bus + * + * @return None + * + * @details This function is used to write a byte to specified I2C port + */ +void I2C_SetData(I2C_T *i2c, uint8_t u8Data) +{ + i2c->DAT = u8Data; +} + +/** + * @brief Set 7-bit Slave Address and GC Mode + * + * @param[in] i2c Specify I2C port + * @param[in] u8SlaveNo Set the number of I2C address register (0~3) + * @param[in] u8SlaveAddr 7-bit slave address + * @param[in] u8GCMode Enable/Disable GC mode (I2C_GCMODE_ENABLE / I2C_GCMODE_DISABLE) + * + * @return None + * + * @details This function is used to set 7-bit slave addresses in I2C SLAVE ADDRESS REGISTER (I2CADDR0~3) + * and enable GC Mode. + * + */ +void I2C_SetSlaveAddr(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddr, uint8_t u8GCMode) +{ + switch (u8SlaveNo) + { + case 1: + i2c->ADDR1 = ((uint32_t)u8SlaveAddr << 1U) | u8GCMode; + break; + case 2: + i2c->ADDR2 = ((uint32_t)u8SlaveAddr << 1U) | u8GCMode; + break; + case 3: + i2c->ADDR3 = ((uint32_t)u8SlaveAddr << 1U) | u8GCMode; + break; + case 0: + default: + i2c->ADDR0 = ((uint32_t)u8SlaveAddr << 1U) | u8GCMode; + break; + } +} + +/** + * @brief Configure the mask bits of 7-bit Slave Address + * + * @param[in] i2c Specify I2C port + * @param[in] u8SlaveNo Set the number of I2C address mask register (0~3) + * @param[in] u8SlaveAddrMask A byte for slave address mask + * + * @return None + * + * @details This function is used to set 7-bit slave addresses. + * + */ +void I2C_SetSlaveAddrMask(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddrMask) +{ + switch (u8SlaveNo) + { + case 1: + i2c->ADDRMSK1 = (uint32_t)u8SlaveAddrMask << 1U; + break; + case 2: + i2c->ADDRMSK2 = (uint32_t)u8SlaveAddrMask << 1U; + break; + case 3: + i2c->ADDRMSK3 = (uint32_t)u8SlaveAddrMask << 1U; + break; + case 0: + default: + i2c->ADDRMSK0 = (uint32_t)u8SlaveAddrMask << 1U; + break; + } +} + +/** + * @brief Enable Time-out Counter Function and support Long Time-out + * + * @param[in] i2c Specify I2C port + * @param[in] u8LongTimeout Configure DIV4 to enable Long Time-out (0/1) + * + * @return None + * + * @details This function enable Time-out Counter function and configure DIV4 to support Long + * Time-out. + * + */ +void I2C_EnableTimeout(I2C_T *i2c, uint8_t u8LongTimeout) +{ + if (u8LongTimeout) + { + i2c->TOCTL |= I2C_TOCTL_TOCDIV4_Msk; + } + else + { + i2c->TOCTL &= ~I2C_TOCTL_TOCDIV4_Msk; + } + + i2c->TOCTL |= I2C_TOCTL_TOCEN_Msk; +} + +/** + * @brief Disable Time-out Counter Function + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details To disable Time-out Counter function in I2CTOC register. + * + */ +void I2C_DisableTimeout(I2C_T *i2c) +{ + i2c->TOCTL &= ~I2C_TOCTL_TOCEN_Msk; +} + +/** + * @brief Enable I2C Wake-up Function + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details To enable Wake-up function of I2C Wake-up control register. + * + */ +void I2C_EnableWakeup(I2C_T *i2c) +{ + i2c->WKCTL |= I2C_WKCTL_WKEN_Msk; +} + +/** + * @brief Disable I2C Wake-up Function + * + * @param[in] i2c Specify I2C port + * + * @return None + * + * @details To disable Wake-up function of I2C Wake-up control register. + * + */ +void I2C_DisableWakeup(I2C_T *i2c) +{ + i2c->WKCTL &= ~I2C_WKCTL_WKEN_Msk; +} + +/** + * @brief Write a byte to Slave + * + * @param[in] *i2c Point to I2C peripheral + * @param[in] u8SlaveAddr Access Slave address(7-bit) + * @param[in] data Write a byte data to Slave + * + * @retval 0 Write data success + * @retval 1 Write data fail, or bus occurs error events + * + * @details The function is used for I2C Master write a byte data to Slave. + * + */ + +uint8_t I2C_WriteByte(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t data) +{ + uint8_t u8Xfering = 1u, u8Err = 0u, u8Ctrl = 0u; + + I2C_START(i2c); + while (u8Xfering && (u8Err == 0u)) + { + I2C_WAIT_READY(i2c) {} + switch (I2C_GET_STATUS(i2c)) + { + case 0x08u: + I2C_SET_DATA(i2c, (uint8_t)(u8SlaveAddr << 1u | 0x00u)); /* Write SLA+W to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x18u: /* Slave Address ACK */ + I2C_SET_DATA(i2c, data); /* Write data to I2CDAT */ + break; + case 0x20u: /* Slave Address NACK */ + case 0x30u: /* Master transmit data NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x28u: + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Xfering = 0u; + break; + case 0x38u: /* Arbitration Lost */ + default: /* Unknow status */ + I2C_SET_CONTROL_REG(i2c, I2C_CTL_STO_SI); /* Clear SI and send STOP */ + u8Ctrl = I2C_CTL_SI; + u8Err = 1u; + break; + } + I2C_SET_CONTROL_REG(i2c, u8Ctrl); /* Write controlbit to I2C_CTL register */ + } + return (u8Err | u8Xfering); /* return (Success)/(Fail) status */ +} + +/** + * @brief Write multi bytes to Slave + * + * @param[in] *i2c Point to I2C peripheral + * @param[in] u8SlaveAddr Access Slave address(7-bit) + * @param[in] *data Pointer to array to write data to Slave + * @param[in] u32wLen How many bytes need to write to Slave + * + * @return A length of how many bytes have been transmitted. + * + * @details The function is used for I2C Master write multi bytes data to Slave. + * + */ + +uint32_t I2C_WriteMultiBytes(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t data[], uint32_t u32wLen) +{ + uint8_t u8Xfering = 1u, u8Err = 0u, u8Ctrl = 0u; + uint32_t u32txLen = 0u; + + I2C_START(i2c); /* Send START */ + while (u8Xfering && (u8Err == 0u)) + { + I2C_WAIT_READY(i2c) {} + switch (I2C_GET_STATUS(i2c)) + { + case 0x08u: + I2C_SET_DATA(i2c, (uint8_t)(u8SlaveAddr << 1u | 0x00u)); /* Write SLA+W to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x18u: /* Slave Address ACK */ + case 0x28u: + if (u32txLen < u32wLen) + { + I2C_SET_DATA(i2c, data[u32txLen++]); /* Write Data to I2CDAT */ + } + else + { + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Xfering = 0u; + } + break; + case 0x20u: /* Slave Address NACK */ + case 0x30u: /* Master transmit data NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x38u: /* Arbitration Lost */ + default: /* Unknow status */ + I2C_SET_CONTROL_REG(i2c, I2C_CTL_STO_SI); /* Clear SI and send STOP */ + u8Ctrl = I2C_CTL_SI; + u8Err = 1u; + break; + } + I2C_SET_CONTROL_REG(i2c, u8Ctrl); /* Write controlbit to I2C_CTL register */ + } + return u32txLen; /* Return bytes length that have been transmitted */ +} + +/** + * @brief Specify a byte register address and write a byte to Slave + * + * @param[in] *i2c Point to I2C peripheral + * @param[in] u8SlaveAddr Access Slave address(7-bit) + * @param[in] u8DataAddr Specify a address (1 byte) of data write to + * @param[in] data A byte data to write it to Slave + * + * @retval 0 Write data success + * @retval 1 Write data fail, or bus occurs error events + * + * @details The function is used for I2C Master specify a address that data write to in Slave. + * + */ + +uint8_t I2C_WriteByteOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t data) +{ + uint8_t u8Xfering = 1u, u8Err = 0u, u8Ctrl = 0u; + uint32_t u32txLen = 0u; + + I2C_START(i2c); /* Send START */ + while (u8Xfering && (u8Err == 0u)) + { + I2C_WAIT_READY(i2c) {} + switch (I2C_GET_STATUS(i2c)) + { + case 0x08u: + I2C_SET_DATA(i2c, (uint8_t)(u8SlaveAddr << 1u | 0x00u)); /* Send Slave address with write bit */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x18u: /* Slave Address ACK */ + I2C_SET_DATA(i2c, u8DataAddr); /* Write Lo byte address of register */ + break; + case 0x20u: /* Slave Address NACK */ + case 0x30u: /* Master transmit data NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x28u: + if (u32txLen < 1u) + { + I2C_SET_DATA(i2c, data); + u32txLen++; + } + else + { + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Xfering = 0u; + } + break; + case 0x38u: /* Arbitration Lost */ + default: /* Unknow status */ + I2C_SET_CONTROL_REG(i2c, I2C_CTL_STO_SI); /* Clear SI and send STOP */ + u8Ctrl = I2C_CTL_SI; + u8Err = 1u; + break; + } + I2C_SET_CONTROL_REG(i2c, u8Ctrl); /* Write controlbit to I2C_CTL register */ + } + return (u8Err | u8Xfering); /* return (Success)/(Fail) status */ +} + + +/** + * @brief Specify a byte register address and write multi bytes to Slave + * + * @param[in] *i2c Point to I2C peripheral + * @param[in] u8SlaveAddr Access Slave address(7-bit) + * @param[in] u8DataAddr Specify a address (1 byte) of data write to + * @param[in] *data Pointer to array to write data to Slave + * @param[in] u32wLen How many bytes need to write to Slave + * + * @return A length of how many bytes have been transmitted. + * + * @details The function is used for I2C Master specify a byte address that multi data bytes write to in Slave. + * + */ + +uint32_t I2C_WriteMultiBytesOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t data[], uint32_t u32wLen) +{ + uint8_t u8Xfering = 1u, u8Err = 0u, u8Ctrl = 0u; + uint32_t u32txLen = 0u; + + I2C_START(i2c); /* Send START */ + while (u8Xfering && (u8Err == 0u)) + { + I2C_WAIT_READY(i2c) {} + switch (I2C_GET_STATUS(i2c)) + { + case 0x08u: + I2C_SET_DATA(i2c, (uint8_t)(u8SlaveAddr << 1u | 0x00u)); /* Write SLA+W to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; + break; + case 0x18u: /* Slave Address ACK */ + I2C_SET_DATA(i2c, u8DataAddr); /* Write Lo byte address of register */ + break; + case 0x20u: /* Slave Address NACK */ + case 0x30u: /* Master transmit data NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x28u: + if (u32txLen < u32wLen) + { + I2C_SET_DATA(i2c, data[u32txLen++]); + } + else + { + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Xfering = 0u; + } + break; + case 0x38u: /* Arbitration Lost */ + default: /* Unknow status */ + I2C_SET_CONTROL_REG(i2c, I2C_CTL_STO_SI); /* Clear SI and send STOP */ + u8Ctrl = I2C_CTL_SI; + u8Err = 1u; + break; + } + I2C_SET_CONTROL_REG(i2c, u8Ctrl); /* Write controlbit to I2C_CTL register */ + } + + return u32txLen; /* Return bytes length that have been transmitted */ +} + +/** + * @brief Specify two bytes register address and Write a byte to Slave + * + * @param[in] *i2c Point to I2C peripheral + * @param[in] u8SlaveAddr Access Slave address(7-bit) + * @param[in] u16DataAddr Specify a address (2 byte) of data write to + * @param[in] data Write a byte data to Slave + * + * @retval 0 Write data success + * @retval 1 Write data fail, or bus occurs error events + * + * @details The function is used for I2C Master specify two bytes address that data write to in Slave. + * + */ + +uint8_t I2C_WriteByteTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t data) +{ + uint8_t u8Xfering = 1u, u8Err = 0u, u8Addr = 1u, u8Ctrl = 0u; + uint32_t u32txLen = 0u; + + I2C_START(i2c); /* Send START */ + while (u8Xfering && (u8Err == 0u)) + { + I2C_WAIT_READY(i2c) {} + switch (I2C_GET_STATUS(i2c)) + { + case 0x08u: + I2C_SET_DATA(i2c, (uint8_t)(u8SlaveAddr << 1u | 0x00u)); /* Write SLA+W to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x18u: /* Slave Address ACK */ + I2C_SET_DATA(i2c, (uint8_t)((u16DataAddr & 0xFF00u) >> 8u)); /* Write Hi byte address of register */ + break; + case 0x20u: /* Slave Address NACK */ + case 0x30u: /* Master transmit data NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x28u: + if (u8Addr) + { + I2C_SET_DATA(i2c, (uint8_t)(u16DataAddr & 0xFFu)); /* Write Lo byte address of register */ + u8Addr = 0u; + } + else if ((u32txLen < 1u) && (u8Addr == 0u)) + { + I2C_SET_DATA(i2c, data); + u32txLen++; + } + else + { + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Xfering = 0u; + } + break; + case 0x38u: /* Arbitration Lost */ + default: /* Unknow status */ + I2C_SET_CONTROL_REG(i2c, I2C_CTL_STO_SI); /* Clear SI and send STOP */ + u8Ctrl = I2C_CTL_SI; + u8Err = 1u; + break; + } + I2C_SET_CONTROL_REG(i2c, u8Ctrl); /* Write controlbit to I2C_CTL register */ + } + return (u8Err | u8Xfering); /* return (Success)/(Fail) status */ +} + + +/** + * @brief Specify two bytes register address and write multi bytes to Slave + * + * @param[in] *i2c Point to I2C peripheral + * @param[in] u8SlaveAddr Access Slave address(7-bit) + * @param[in] u16DataAddr Specify a address (2 bytes) of data write to + * @param[in] data[] A data array for write data to Slave + * @param[in] u32wLen How many bytes need to write to Slave + * + * @return A length of how many bytes have been transmitted. + * + * @details The function is used for I2C Master specify a byte address that multi data write to in Slave. + * + */ + +uint32_t I2C_WriteMultiBytesTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t data[], uint32_t u32wLen) +{ + uint8_t u8Xfering = 1u, u8Err = 0u, u8Addr = 1u, u8Ctrl = 0u; + uint32_t u32txLen = 0u; + + I2C_START(i2c); /* Send START */ + while (u8Xfering && (u8Err == 0u)) + { + I2C_WAIT_READY(i2c) {} + switch (I2C_GET_STATUS(i2c)) + { + case 0x08u: + I2C_SET_DATA(i2c, (uint8_t)(u8SlaveAddr << 1u | 0x00u)); /* Write SLA+W to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x18u: /* Slave Address ACK */ + I2C_SET_DATA(i2c, (uint8_t)((u16DataAddr & 0xFF00u) >> 8u)); /* Write Hi byte address of register */ + break; + case 0x20u: /* Slave Address NACK */ + case 0x30u: /* Master transmit data NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x28u: + if (u8Addr) + { + I2C_SET_DATA(i2c, (uint8_t)(u16DataAddr & 0xFFu)); /* Write Lo byte address of register */ + u8Addr = 0u; + } + else if ((u32txLen < u32wLen) && (u8Addr == 0u)) + { + I2C_SET_DATA(i2c, data[u32txLen++]); /* Write data to Register I2CDAT*/ + } + else + { + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Xfering = 0u; + } + break; + case 0x38u: /* Arbitration Lost */ + default: /* Unknow status */ + I2C_SET_CONTROL_REG(i2c, I2C_CTL_STO_SI); /* Clear SI and send STOP */ + u8Ctrl = I2C_CTL_SI; + u8Err = 1u; + break; + } + I2C_SET_CONTROL_REG(i2c, u8Ctrl); /* Write controlbit to I2C_CTL register */ + } + return u32txLen; /* Return bytes length that have been transmitted */ +} + +/** + * @brief Read a byte from Slave + * + * @param[in] *i2c Point to I2C peripheral + * @param[in] u8SlaveAddr Access Slave address(7-bit) + * + * @return Read a byte data from Slave + * + * @details The function is used for I2C Master to read a byte data from Slave. + * + */ +uint8_t I2C_ReadByte(I2C_T *i2c, uint8_t u8SlaveAddr) +{ + uint8_t u8Xfering = 1u, u8Err = 0u, rdata = 0u, u8Ctrl = 0u; + + I2C_START(i2c); /* Send START */ + while (u8Xfering && (u8Err == 0u)) + { + I2C_WAIT_READY(i2c) {} + switch (I2C_GET_STATUS(i2c)) + { + case 0x08u: + I2C_SET_DATA(i2c, (uint8_t)((u8SlaveAddr << 1u) | 0x01u)); /* Write SLA+R to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x40u: /* Slave Address ACK */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x48u: /* Slave Address NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x58u: + rdata = (unsigned char) I2C_GET_DATA(i2c); /* Receive Data */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Xfering = 0u; + break; + case 0x38u: /* Arbitration Lost */ + default: /* Unknow status */ + I2C_SET_CONTROL_REG(i2c, I2C_CTL_STO_SI); /* Clear SI and send STOP */ + u8Ctrl = I2C_CTL_SI; + u8Err = 1u; + break; + } + I2C_SET_CONTROL_REG(i2c, u8Ctrl); /* Write controlbit to I2C_CTL register */ + } + if (u8Err) + { + rdata = 0u; /* If occurs error, return 0 */ + } + return rdata; /* Return read data */ +} + + +/** + * @brief Read multi bytes from Slave + * + * @param[in] *i2c Point to I2C peripheral + * @param[in] u8SlaveAddr Access Slave address(7-bit) + * @param[out] rdata[] A data array to store data from Slave + * @param[in] u32rLen How many bytes need to read from Slave + * + * @return A length of how many bytes have been received + * + * @details The function is used for I2C Master to read multi data bytes from Slave. + * + * + */ +uint32_t I2C_ReadMultiBytes(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t rdata[], uint32_t u32rLen) +{ + uint8_t u8Xfering = 1u, u8Err = 0u, u8Ctrl = 0u; + uint32_t u32rxLen = 0u; + + I2C_START(i2c); /* Send START */ + while (u8Xfering && (u8Err == 0u)) + { + I2C_WAIT_READY(i2c) {} + switch (I2C_GET_STATUS(i2c)) + { + case 0x08u: + I2C_SET_DATA(i2c, (uint8_t)((u8SlaveAddr << 1u) | 0x01u)); /* Write SLA+R to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x40u: /* Slave Address ACK */ + u8Ctrl = I2C_CTL_SI_AA; /* Clear SI and set ACK */ + break; + case 0x48u: /* Slave Address NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x50u: + rdata[u32rxLen++] = (unsigned char) I2C_GET_DATA(i2c); /* Receive Data */ + if (u32rxLen < (u32rLen - 1u)) + { + u8Ctrl = I2C_CTL_SI_AA; /* Clear SI and set ACK */ + } + else + { + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + } + break; + case 0x58u: + rdata[u32rxLen++] = (unsigned char) I2C_GET_DATA(i2c); /* Receive Data */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Xfering = 0u; + break; + case 0x38u: /* Arbitration Lost */ + default: /* Unknow status */ + I2C_SET_CONTROL_REG(i2c, I2C_CTL_STO_SI); /* Clear SI and send STOP */ + u8Ctrl = I2C_CTL_SI; + u8Err = 1u; + break; + } + I2C_SET_CONTROL_REG(i2c, u8Ctrl); /* Write controlbit to I2C_CTL register */ + } + return u32rxLen; /* Return bytes length that have been received */ +} + + +/** + * @brief Specify a byte register address and read a byte from Slave + * + * @param[in] *i2c Point to I2C peripheral + * @param[in] u8SlaveAddr Access Slave address(7-bit) + * @param[in] u8DataAddr Specify a address(1 byte) of data read from + * + * @return Read a byte data from Slave + * + * @details The function is used for I2C Master specify a byte address that a data byte read from Slave. + * + * + */ +uint8_t I2C_ReadByteOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr) +{ + uint8_t u8Xfering = 1u, u8Err = 0u, rdata = 0u, u8Ctrl = 0u; + + I2C_START(i2c); /* Send START */ + while (u8Xfering && (u8Err == 0u)) + { + I2C_WAIT_READY(i2c) {} + switch (I2C_GET_STATUS(i2c)) + { + case 0x08u: + I2C_SET_DATA(i2c, (uint8_t)(u8SlaveAddr << 1u | 0x00u)); /* Write SLA+W to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x18u: /* Slave Address ACK */ + I2C_SET_DATA(i2c, u8DataAddr); /* Write Lo byte address of register */ + break; + case 0x20u: /* Slave Address NACK */ + case 0x30u: /* Master transmit data NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x28u: + u8Ctrl = I2C_CTL_STA_SI; /* Send repeat START */ + break; + case 0x10u: + I2C_SET_DATA(i2c, (uint8_t)((u8SlaveAddr << 1u) | 0x01u)); /* Write SLA+R to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x40u: /* Slave Address ACK */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x48u: /* Slave Address NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x58u: + rdata = (uint8_t) I2C_GET_DATA(i2c); /* Receive Data */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Xfering = 0u; + break; + case 0x38u: /* Arbitration Lost */ + default: /* Unknow status */ + I2C_SET_CONTROL_REG(i2c, I2C_CTL_STO_SI); /* Clear SI and send STOP */ + u8Ctrl = I2C_CTL_SI; + u8Err = 1u; + break; + } + I2C_SET_CONTROL_REG(i2c, u8Ctrl); /* Write controlbit to I2C_CTL register */ + } + if (u8Err) + { + rdata = 0u; /* If occurs error, return 0 */ + } + return rdata; /* Return read data */ +} + +/** + * @brief Specify a byte register address and read multi bytes from Slave + * + * @param[in] *i2c Point to I2C peripheral + * @param[in] u8SlaveAddr Access Slave address(7-bit) + * @param[in] u8DataAddr Specify a address (1 bytes) of data read from + * @param[out] rdata[] A data array to store data from Slave + * @param[in] u32rLen How many bytes need to read from Slave + * + * @return A length of how many bytes have been received + * + * @details The function is used for I2C Master specify a byte address that multi data bytes read from Slave. + * + * + */ +uint32_t I2C_ReadMultiBytesOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t rdata[], uint32_t u32rLen) +{ + uint8_t u8Xfering = 1u, u8Err = 0u, u8Ctrl = 0u; + uint32_t u32rxLen = 0u; + + I2C_START(i2c); /* Send START */ + while (u8Xfering && (u8Err == 0u)) + { + I2C_WAIT_READY(i2c) {} + switch (I2C_GET_STATUS(i2c)) + { + case 0x08u: + I2C_SET_DATA(i2c, (uint8_t)(u8SlaveAddr << 1u | 0x00u)); /* Write SLA+W to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x18u: /* Slave Address ACK */ + I2C_SET_DATA(i2c, u8DataAddr); /* Write Lo byte address of register */ + break; + case 0x20u: /* Slave Address NACK */ + case 0x30u: /* Master transmit data NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x28u: + u8Ctrl = I2C_CTL_STA_SI; /* Send repeat START */ + break; + case 0x10u: + I2C_SET_DATA(i2c, (uint8_t)((u8SlaveAddr << 1u) | 0x01u)); /* Write SLA+R to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x40u: /* Slave Address ACK */ + u8Ctrl = I2C_CTL_SI_AA; /* Clear SI and set ACK */ + break; + case 0x48u: /* Slave Address NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x50u: + rdata[u32rxLen++] = (uint8_t) I2C_GET_DATA(i2c); /* Receive Data */ + if (u32rxLen < (u32rLen - 1u)) + { + u8Ctrl = I2C_CTL_SI_AA; /* Clear SI and set ACK */ + } + else + { + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + } + break; + case 0x58u: + rdata[u32rxLen++] = (uint8_t) I2C_GET_DATA(i2c); /* Receive Data */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Xfering = 0u; + break; + case 0x38u: /* Arbitration Lost */ + default: /* Unknow status */ + I2C_SET_CONTROL_REG(i2c, I2C_CTL_STO_SI); /* Clear SI and send STOP */ + u8Ctrl = I2C_CTL_SI; + u8Err = 1u; + break; + } + I2C_SET_CONTROL_REG(i2c, u8Ctrl); /* Write controlbit to I2C_CTL register */ + } + return u32rxLen; /* Return bytes length that have been received */ +} + +/** + * @brief Specify two bytes register address and read a byte from Slave + * + * @param[in] *i2c Point to I2C peripheral + * @param[in] u8SlaveAddr Access Slave address(7-bit) + * @param[in] u16DataAddr Specify an address(2 bytes) of data read from + * + * @return Read a byte data from Slave + * + * @details The function is used for I2C Master specify two bytes address that a data byte read from Slave. + * + * + */ +uint8_t I2C_ReadByteTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr) +{ + uint8_t u8Xfering = 1u, u8Err = 0u, rdata = 0u, u8Addr = 1u, u8Ctrl = 0u; + + I2C_START(i2c); /* Send START */ + while (u8Xfering && (u8Err == 0u)) + { + I2C_WAIT_READY(i2c) {} + switch (I2C_GET_STATUS(i2c)) + { + case 0x08u: + I2C_SET_DATA(i2c, (uint8_t)(u8SlaveAddr << 1u | 0x00u)); /* Write SLA+W to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x18u: /* Slave Address ACK */ + I2C_SET_DATA(i2c, (uint8_t)((u16DataAddr & 0xFF00u) >> 8u)); /* Write Hi byte address of register */ + break; + case 0x20u: /* Slave Address NACK */ + case 0x30u: /* Master transmit data NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x28u: + if (u8Addr) + { + I2C_SET_DATA(i2c, (uint8_t)(u16DataAddr & 0xFFu)); /* Write Lo byte address of register */ + u8Addr = 0u; + } + else + { + u8Ctrl = I2C_CTL_STA_SI; /* Clear SI and send repeat START */ + } + break; + case 0x10u: + I2C_SET_DATA(i2c, (uint8_t)((u8SlaveAddr << 1u) | 0x01u)); /* Write SLA+R to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x40u: /* Slave Address ACK */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x48u: /* Slave Address NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x58u: + rdata = (unsigned char) I2C_GET_DATA(i2c); /* Receive Data */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Xfering = 0u; + break; + case 0x38u: /* Arbitration Lost */ + default: /* Unknow status */ + I2C_SET_CONTROL_REG(i2c, I2C_CTL_STO_SI); /* Clear SI and send STOP */ + u8Ctrl = I2C_CTL_SI; + u8Err = 1u; + break; + } + I2C_SET_CONTROL_REG(i2c, u8Ctrl); /* Write controlbit to I2C_CTL register */ + } + if (u8Err) + { + rdata = 0u; /* If occurs error, return 0 */ + } + return rdata; /* Return read data */ +} + +/** + * @brief Specify two bytes register address and read multi bytes from Slave + * + * @param[in] *i2c Point to I2C peripheral + * @param[in] u8SlaveAddr Access Slave address(7-bit) + * @param[in] u16DataAddr Specify a address (2 bytes) of data read from + * @param[out] rdata[] A data array to store data from Slave + * @param[in] u32rLen How many bytes need to read from Slave + * + * @return A length of how many bytes have been received + * + * @details The function is used for I2C Master specify two bytes address that multi data bytes read from Slave. + * + * + */ +uint32_t I2C_ReadMultiBytesTwoRegs(I2C_T *i2c, uint8_t u8SlaveAddr, uint16_t u16DataAddr, uint8_t rdata[], uint32_t u32rLen) +{ + uint8_t u8Xfering = 1u, u8Err = 0u, u8Addr = 1u, u8Ctrl = 0u; + uint32_t u32rxLen = 0u; + + I2C_START(i2c); /* Send START */ + while (u8Xfering && (u8Err == 0u)) + { + I2C_WAIT_READY(i2c) {} + switch (I2C_GET_STATUS(i2c)) + { + case 0x08u: + I2C_SET_DATA(i2c, (uint8_t)(u8SlaveAddr << 1u | 0x00u)); /* Write SLA+W to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x18u: /* Slave Address ACK */ + I2C_SET_DATA(i2c, (uint8_t)((u16DataAddr & 0xFF00u) >> 8u)); /* Write Hi byte address of register */ + break; + case 0x20u: /* Slave Address NACK */ + case 0x30u: /* Master transmit data NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x28u: + if (u8Addr) + { + I2C_SET_DATA(i2c, (uint8_t)(u16DataAddr & 0xFFu)); /* Write Lo byte address of register */ + u8Addr = 0u; + } + else + { + u8Ctrl = I2C_CTL_STA_SI; /* Clear SI and send repeat START */ + } + break; + case 0x10u: + I2C_SET_DATA(i2c, (uint8_t)((u8SlaveAddr << 1u) | 0x01u)); /* Write SLA+R to Register I2CDAT */ + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + break; + case 0x40u: /* Slave Address ACK */ + u8Ctrl = I2C_CTL_SI_AA; /* Clear SI and set ACK */ + break; + case 0x48u: /* Slave Address NACK */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Err = 1u; + break; + case 0x50u: + rdata[u32rxLen++] = (unsigned char) I2C_GET_DATA(i2c); /* Receive Data */ + if (u32rxLen < (u32rLen - 1u)) + { + u8Ctrl = I2C_CTL_SI_AA; /* Clear SI and set ACK */ + } + else + { + u8Ctrl = I2C_CTL_SI; /* Clear SI */ + } + break; + case 0x58u: + rdata[u32rxLen++] = (unsigned char) I2C_GET_DATA(i2c); /* Receive Data */ + u8Ctrl = I2C_CTL_STO_SI; /* Clear SI and send STOP */ + u8Xfering = 0u; + break; + case 0x38u: /* Arbitration Lost */ + default: /* Unknow status */ + I2C_SET_CONTROL_REG(i2c, I2C_CTL_STO_SI); /* Clear SI and send STOP */ + u8Ctrl = I2C_CTL_SI; + u8Err = 1u; + break; + } + I2C_SET_CONTROL_REG(i2c, u8Ctrl); /* Write control bit to I2C_CTL register */ + } + return u32rxLen; /* Return bytes length that have been received */ +} + + +/*@}*/ /* end of group I2C_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group I2C_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_i2s.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_i2s.c new file mode 100644 index 0000000000..6fd974f097 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_i2s.c @@ -0,0 +1,269 @@ +/**************************************************************************//** + * @file i2s.c + * @brief I2S driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#include +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup I2S_Driver I2S Driver + @{ +*/ + +/** @addtogroup I2S_EXPORTED_FUNCTIONS I2S Exported Functions + @{ +*/ + +static uint32_t I2S_GetSourceClockFreq(I2S_T *i2s); + +/** + * @brief This function make I2S module be ready to transfer. + * @param[in] i2s The pointer of the specified I2S module. + * @return Source clock frequency of I2S peripheral. + * @details + * 0: _HXT + * 1: APLL + * 2: PCLK0 + * 3: HIRC + */ + +static uint32_t I2S_GetSourceClockFreq(I2S_T *i2s) +{ + uint32_t u32Freq = 0UL, u32ClkSrcSel; + uint32_t u32ClkSelMsk = 0U; + + if (i2s == I2S0) + { + u32ClkSelMsk = CLK_CLKSEL4_I2S0SEL_Msk; + } + else if (i2s == I2S1) + { + u32ClkSelMsk = CLK_CLKSEL4_I2S1SEL_Msk; + } + else + { + return 0U; + } + + /* get I2S selection clock source */ + u32ClkSrcSel = CLK->CLKSEL4 & u32ClkSelMsk; + + switch (u32ClkSrcSel) + { + case CLK_CLKSEL4_I2S0SEL_APLL: + u32Freq = CLK_GetPLLClockFreq(APLL); + break; + + case CLK_CLKSEL4_I2S0SEL_SYSCLK1_DIV2: + u32Freq = CLK_GetSYSCLK1Freq() / 2; + break; + + default: + u32Freq = CLK_GetPLLClockFreq(APLL); + break; + } + + return u32Freq; +} + +/** + * @brief This function configures some parameters of I2S interface for general purpose use. + * The sample rate may not be used from the parameter, it depends on system's clock settings, + * but real sample rate used by system will be returned for reference. + * @param[in] i2s is the base address of I2S module. + * @param[in] u32MasterSlave I2S operation mode. Valid values are: + * - \ref I2S_MODE_MASTER + * - \ref I2S_MODE_SLAVE + * @param[in] u32SampleRate Sample rate + * @param[in] u32WordWidth Data length. Valid values are: + * - \ref I2S_DATABIT_8 + * - \ref I2S_DATABIT_16 + * - \ref I2S_DATABIT_24 + * - \ref I2S_DATABIT_32 + * @param[in] u32MonoData: Set audio data to mono or not. Valid values are: + * - \ref I2S_ENABLE_MONO + * - \ref I2S_DISABLE_MONO + * @param[in] u32DataFormat: Data format. This is also used to select I2S or PCM(TDM) function. Valid values are: + * - \ref I2S_FORMAT_I2S + * - \ref I2S_FORMAT_I2S_MSB + * - \ref I2S_FORMAT_I2S_LSB + * - \ref I2S_FORMAT_PCM + * - \ref I2S_FORMAT_PCM_MSB + * - \ref I2S_FORMAT_PCM_LSB + * @return Real sample rate. + */ +uint32_t I2S_Open(I2S_T *i2s, uint32_t u32MasterSlave, uint32_t u32SampleRate, uint32_t u32WordWidth, uint32_t u32MonoData, uint32_t u32DataFormat) +{ + uint16_t u16Divider; + uint32_t u32BitRate, u32SrcClk; + + /* Reset I2S */ + if (i2s == I2S0) + { + SYS->IPRST1 |= SYS_IPRST1_I2S0RST_Msk; + SYS->IPRST1 &= ~SYS_IPRST1_I2S0RST_Msk; + } + else + { + SYS->IPRST3 |= SYS_IPRST3_I2S1RST_Msk; + SYS->IPRST3 &= ~SYS_IPRST3_I2S1RST_Msk; + } + + i2s->CTL0 = u32MasterSlave | u32WordWidth | u32MonoData | u32DataFormat; + i2s->CTL1 = I2S_FIFO_TX_LEVEL_WORD_8 | I2S_FIFO_RX_LEVEL_WORD_8; + + u32SrcClk = I2S_GetSourceClockFreq(i2s); + + u32BitRate = u32SampleRate * (((u32WordWidth >> 4U) & 0x3U) + 1U) * 16U; + //u16Divider = (uint16_t)((u32SrcClk/u32BitRate) >> 1U) - 1U; + u16Divider = (uint16_t)((((u32SrcClk * 10UL / u32BitRate) >> 1U) + 5UL) / 10UL) - 1U; + i2s->CLKDIV = (i2s->CLKDIV & ~I2S_CLKDIV_BCLKDIV_Msk) | ((uint32_t)u16Divider << 8U); + + /* calculate real sample rate */ + u32BitRate = u32SrcClk / (2U * ((uint32_t)u16Divider + 1U)); + u32SampleRate = u32BitRate / ((((u32WordWidth >> 4U) & 0x3U) + 1U) * 16U); + + i2s->CTL0 |= I2S_CTL0_I2SEN_Msk; + + return u32SampleRate; +} + +/** + * @brief Disable I2S function and I2S clock. + * @param[in] i2s is the base address of I2S module. + * @return none + */ +void I2S_Close(I2S_T *i2s) +{ + i2s->CTL0 &= ~I2S_CTL0_I2SEN_Msk; +} + +/** + * @brief This function enables the interrupt according to the mask parameter. + * @param[in] i2s is the base address of I2S module. + * @param[in] u32Mask is the combination of all related interrupt enable bits. + * Each bit corresponds to a interrupt bit. + * @return none + */ +void I2S_EnableInt(I2S_T *i2s, uint32_t u32Mask) +{ + i2s->IEN |= u32Mask; +} + +/** + * @brief This function disables the interrupt according to the mask parameter. + * @param[in] i2s is the base address of I2S module. + * @param[in] u32Mask is the combination of all related interrupt enable bits. + * Each bit corresponds to a interrupt bit. + * @return none + */ +void I2S_DisableInt(I2S_T *i2s, uint32_t u32Mask) +{ + i2s->IEN &= ~u32Mask; +} + +/** + * @brief Enable MCLK . + * @param[in] i2s is the base address of I2S module. + * @param[in] u32BusClock is the target MCLK clock + * @return Actual MCLK clock + */ +uint32_t I2S_EnableMCLK(I2S_T *i2s, uint32_t u32BusClock) +{ + uint8_t u8Divider; + uint32_t u32SrcClk, u32Reg, u32Clock; + + u32SrcClk = I2S_GetSourceClockFreq(i2s); + if (u32BusClock == u32SrcClk) + { + u8Divider = 0U; + } + else + { + u8Divider = (uint8_t)(u32SrcClk / u32BusClock) >> 1U; + } + + i2s->CLKDIV = (i2s->CLKDIV & ~I2S_CLKDIV_MCLKDIV_Msk) | u8Divider; + + i2s->CTL0 |= I2S_CTL0_MCLKEN_Msk; + + u32Reg = i2s->CLKDIV & I2S_CLKDIV_MCLKDIV_Msk; + + if (u32Reg == 0U) + { + u32Clock = u32SrcClk; + } + else + { + u32Clock = ((u32SrcClk >> 1U) / u32Reg); + } + + return u32Clock; +} + +/** + * @brief Disable MCLK . + * @param[in] i2s is the base address of I2S module. + * @return none + */ +void I2S_DisableMCLK(I2S_T *i2s) +{ + i2s->CTL0 &= ~I2S_CTL0_MCLKEN_Msk; +} + +/** + * @brief Configure FIFO threshold setting. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32TxThreshold Decides the TX FIFO threshold. It could be 0 ~ 7. + * @param[in] u32RxThreshold Decides the RX FIFO threshold. It could be 0 ~ 7. + * @return None + * @details Set TX FIFO threshold and RX FIFO threshold configurations. + */ +void I2S_SetFIFO(I2S_T *i2s, uint32_t u32TxThreshold, uint32_t u32RxThreshold) +{ + i2s->CTL1 = ((i2s->CTL1 & ~(I2S_CTL1_TXTH_Msk | I2S_CTL1_RXTH_Msk)) | + (u32TxThreshold << I2S_CTL1_TXTH_Pos) | + (u32RxThreshold << I2S_CTL1_RXTH_Pos)); +} + + +/** + * @brief Configure PCM(TDM) function parameters, such as channel width, channel number and sync pulse width + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32ChannelWidth Channel width. Valid values are: + * - \ref I2S_TDM_WIDTH_8BIT + * - \ref I2S_TDM_WIDTH_16BIT + * - \ref I2S_TDM_WIDTH_24BIT + * - \ref I2S_TDM_WIDTH_32BIT + * @param[in] u32ChannelNum Channel number. Valid values are: + * - \ref I2S_TDM_2CH + * - \ref I2S_TDM_4CH + * - \ref I2S_TDM_6CH + * - \ref I2S_TDM_8CH + * @param[in] u32SyncWidth Width for sync pulse. Valid values are: + * - \ref I2S_TDM_SYNC_ONE_BCLK + * - \ref I2S_TDM_SYNC_ONE_CHANNEL + * @return None + * @details Set TX FIFO threshold and RX FIFO threshold configurations. + */ +void I2S_ConfigureTDM(I2S_T *i2s, uint32_t u32ChannelWidth, uint32_t u32ChannelNum, uint32_t u32SyncWidth) +{ + i2s->CTL0 = ((i2s->CTL0 & ~(I2S_CTL0_TDMCHNUM_Msk | I2S_CTL0_CHWIDTH_Msk | I2S_CTL0_PCMSYNC_Msk)) | + (u32ChannelWidth << I2S_CTL0_CHWIDTH_Pos) | + (u32ChannelNum << I2S_CTL0_TDMCHNUM_Pos) | + (u32SyncWidth << I2S_CTL0_PCMSYNC_Pos)); +} + +/*@}*/ /* end of group I2S_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group I2S_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_kpi.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_kpi.c new file mode 100644 index 0000000000..435f43cc3e --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_kpi.c @@ -0,0 +1,135 @@ +/**************************************************************************//** + * @file kpi.c + * @brief KPI driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#include +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup KPI_Driver KPI Driver + @{ +*/ + +/** @addtogroup KPI_EXPORTED_FUNCTIONS KPI Exported Functions + @{ +*/ + + +/// @cond HIDDEN_SYMBOLS +#define KPICONF_VALUE 0x00288059 +/// @endcond HIDDEN_SYMBOLS + + +/** + * @brief Open KPI function. + * + * @return TRUE: Success \n + * FALSE: KPI function already open + * + */ +void KPI_Open(KPI_T *kpi, uint32_t u32Row, uint32_t u32Col) +{ + uint32_t u32Reg; + + kpi->KPICONF = 0x0; + kpi->KPI3KCONF = 0x0; + kpi->KPIRSTC = 0x0; + + if (u32Row < 2) + u32Row = 1; + else if (u32Row > 6) + u32Row = 6; + else + u32Row = u32Row - 1; + + if (u32Col < 2) + u32Col = 1; + else if (u32Col > 8) + u32Col = 8; + else + u32Col = u32Col - 1; + + u32Reg = (KPICONF_VALUE | (u32Row << 28) | (u32Col << 24)); + kpi->KPICONF = u32Reg; +} + +/** + * @brief Close KPI function. + * + * @return Successful: Success \n + * kpiNotOpen: KPI function not open + */ +void KPI_Close(KPI_T *kpi) +{ + kpi->KPICONF &= ~KPI_KPICONF_ENKP_Msk; +} + + +/** + * @brief Config KPI scan key timing. + * + * @param[in] u32PreScale: Row Scan Cycle Pre-scale Value. The divided number is from 1 to 256 + * @param[in] u32Debounce: De-bounce Sampling Cycle. The value is from 3 to 13 + * @param[in] u32ScanDelay: Setting delay cycle when row change: + * \ref KPI_ROW_SCAN_DELAY4CLK + * \ref KPI_ROW_SCAN_DELAY8CLK + * \ref KPI_ROW_SCAN_DELAY16CLK + * \ref KPI_ROW_SCAN_DELAY32CLK + * + * @return None + * + */ +void KPI_ConfigKeyScanTiming(KPI_T *kpi, uint32_t u32PreScale, uint32_t u32Debounce, uint32_t u32ScanDelay) +{ + if (u32Debounce < 3) u32Debounce = 3; + if (u32Debounce > 13) u32Debounce = 13; + + kpi->KPICONF &= ~(KPI_KPICONF_PRESCALE_Msk | KPI_KPICONF_DBCLKSEL_Msk | KPI_KPICONF_SCANROWD_Msk); + kpi->KPICONF |= (u32PreScale << KPI_KPICONF_PRESCALE_Pos) | (u32Debounce << KPI_KPICONF_DBCLKSEL_Pos) | + (u32ScanDelay << KPI_KPICONF_SCANROWD_Pos); +} + +/** + * @brief Read KPI Release key Status. + * + * @param[in] u32Key1: \ref KPI_KEY00 ~ \ref KPI_KEY58 + * @param[in] u32Key2: \ref KPI_KEY00 ~ \ref KPI_KEY58 + * @param[in] u32Key3: \ref KPI_KEY00 ~ \ref KPI_KEY58 + * @param[in] u32RSTC: Reset Period Count. The value is from 0 ~ 255. + * + * @return None + */ +void KPI_Set3KeyReset(KPI_T *kpi, uint32_t u32Key1, uint32_t u32Key2, uint32_t u32Key3, uint32_t u32RstCnt) +{ + kpi->KPI3KCONF &= ~(KPI_KPI3KCONF_K30C_Msk | KPI_KPI3KCONF_K30R_Msk | + KPI_KPI3KCONF_K31C_Msk | KPI_KPI3KCONF_K31R_Msk | + KPI_KPI3KCONF_K32C_Msk | KPI_KPI3KCONF_K32R_Msk); + + // Set Key + kpi->KPI3KCONF |= ((u32Key1 / 8) << 3) | (u32Key1 % 8); + kpi->KPI3KCONF |= ((((u32Key1 / 8) << 3) | (u32Key1 % 8)) << 8); + kpi->KPI3KCONF |= ((((u32Key1 / 8) << 3) | (u32Key1 % 16)) << 8); + + // Set Reset Period Count + kpi->KPIRSTC = u32RstCnt; + + // Enable 3Key Reset + kpi->KPI3KCONF |= KPI_KPI3KCONF_EN3KYRST_Msk; +} + +/*@}*/ /* end of group KPI_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group KPI_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + + + + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_pdma.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_pdma.c new file mode 100644 index 0000000000..ff56e0ccb8 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_pdma.c @@ -0,0 +1,443 @@ +/**************************************************************************//** + * @file pdma.c + * @brief PDMA driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup PDMA_Driver PDMA Driver + @{ +*/ + + +/** @addtogroup PDMA_EXPORTED_FUNCTIONS PDMA Exported Functions + @{ +*/ + +/** + * @brief PDMA Open + * + * @param[in] pdma The pointer of the specified PDMA module + * + * @param[in] u32Mask Channel enable bits. + * + * @return None + * + * @details This function enable the PDMA channels. + */ +void PDMA_Open(PDMA_T *pdma, uint32_t u32Mask) +{ + uint32_t i; + + for (i = 0UL; i < PDMA_CH_MAX; i++) + { + if ((1 << i) & u32Mask) + { + pdma->DSCT[i].CTL = 0UL; + } + } + + pdma->CHCTL |= u32Mask; +} + +/** + * @brief PDMA Close + * + * @param[in] pdma The pointer of the specified PDMA module + * + * @return None + * + * @details This function disable all PDMA channels. + */ +void PDMA_Close(PDMA_T *pdma) +{ + pdma->CHCTL = 0UL; +} + +/** + * @brief Set PDMA Transfer Count + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * @param[in] u32Width Data width. Valid values are + * - \ref PDMA_WIDTH_8 + * - \ref PDMA_WIDTH_16 + * - \ref PDMA_WIDTH_32 + * @param[in] u32TransCount Transfer count + * + * @return None + * + * @details This function set the selected channel data width and transfer count. + */ +void PDMA_SetTransferCnt(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32Width, uint32_t u32TransCount) +{ + pdma->DSCT[u32Ch].CTL &= ~(PDMA_DSCT_CTL_TXCNT_Msk | PDMA_DSCT_CTL_TXWIDTH_Msk); + pdma->DSCT[u32Ch].CTL |= (u32Width | ((u32TransCount - 1UL) << PDMA_DSCT_CTL_TXCNT_Pos)); +} + +/** + * @brief Set PDMA Stride Mode + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * @param[in] u32DestLen Destination stride count + * @param[in] u32SrcLen Source stride count + * @param[in] u32TransCount Transfer count + * + * @return None + * + * @details This function set the selected stride mode. + */ +void PDMA_SetStride(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32DestLen, uint32_t u32SrcLen, uint32_t u32TransCount) +{ + pdma->DSCT[u32Ch].CTL |= PDMA_DSCT_CTL_STRIDEEN_Msk; + pdma->STRIDE[u32Ch].ASOCR = ((u32DestLen - 1) << 16) | (u32SrcLen - 1); + pdma->STRIDE[u32Ch].STCR = u32TransCount - 1; +} + +/** + * @brief Set PDMA Repeat + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * @param[in] u32DestInterval Destination address interval count + * @param[in] u32SrcInterval Source address interval count + * @param[in] u32RepeatCount Repeat count + * + * @return None + * + * @details This function set the selected repeat. + */ +void PDMA_SetRepeat(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32DestInterval, uint32_t u32SrcInterval, uint32_t u32RepeatCount) +{ + pdma->DSCT[u32Ch].CTL |= PDMA_DSCT_CTL_STRIDEEN_Msk; + pdma->REPEAT[u32Ch].AICTL = ((u32DestInterval) << 16) | (u32SrcInterval); + pdma->REPEAT[u32Ch].RCNT = u32RepeatCount; +} + +/** + * @brief Set PDMA Transfer Address + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * @param[in] u32SrcAddr Source address + * @param[in] u32SrcCtrl Source control attribute. Valid values are + * - \ref PDMA_SAR_INC + * - \ref PDMA_SAR_FIX + * @param[in] u32DstAddr destination address + * @param[in] u32DstCtrl destination control attribute. Valid values are + * - \ref PDMA_DAR_INC + * - \ref PDMA_DAR_FIX + * + * @return None + * + * @details This function set the selected channel source/destination address and attribute. + */ +void PDMA_SetTransferAddr(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32SrcAddr, uint32_t u32SrcCtrl, uint32_t u32DstAddr, uint32_t u32DstCtrl) +{ + pdma->DSCT[u32Ch].SA = u32SrcAddr; + pdma->DSCT[u32Ch].DA = u32DstAddr; + pdma->DSCT[u32Ch].CTL &= ~(PDMA_DSCT_CTL_SAINC_Msk | PDMA_DSCT_CTL_DAINC_Msk); + pdma->DSCT[u32Ch].CTL |= (u32SrcCtrl | u32DstCtrl); +} + +/** + * @brief Set PDMA Transfer Mode + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * @param[in] u32Peripheral The selected peripheral. Valid values are + * - \ref PDMA_MEM + * - \ref PDMA_USB_TX + * - \ref PDMA_USB_RX + * - \ref PDMA_UART0_TX + * - \ref PDMA_UART0_RX + * - \ref PDMA_UART1_TX + * - \ref PDMA_UART1_RX + * - \ref PDMA_UART2_TX + * - \ref PDMA_UART2_RX + * - \ref PDMA_UART3_TX + * - \ref PDMA_UART3_RX + * - \ref PDMA_UART4_TX + * - \ref PDMA_UART4_RX + * - \ref PDMA_UART5_TX + * - \ref PDMA_UART5_RX + * - \ref PDMA_USCI0_TX + * - \ref PDMA_USCI0_RX + * - \ref PDMA_USCI1_TX + * - \ref PDMA_USCI1_RX + * - \ref PDMA_QSPI0_TX + * - \ref PDMA_QSPI0_RX + * - \ref PDMA_SPI0_TX + * - \ref PDMA_SPI0_RX + * - \ref PDMA_SPI1_TX + * - \ref PDMA_SPI1_RX + * - \ref PDMA_SPI2_TX + * - \ref PDMA_SPI2_RX + * - \ref PDMA_SPI3_TX + * - \ref PDMA_SPI3_RX + * - \ref PDMA_EPWM0_P1_RX + * - \ref PDMA_EPWM0_P2_RX + * - \ref PDMA_EPWM0_P3_RX + * - \ref PDMA_EPWM1_P1_RX + * - \ref PDMA_EPWM1_P2_RX + * - \ref PDMA_EPWM1_P3_RX + * - \ref PDMA_I2C0_TX + * - \ref PDMA_I2C0_RX + * - \ref PDMA_I2C1_TX + * - \ref PDMA_I2C1_RX + * - \ref PDMA_I2C2_TX + * - \ref PDMA_I2C2_RX + * - \ref PDMA_I2S0_TX + * - \ref PDMA_I2S0_RX + * - \ref PDMA_TMR0 + * - \ref PDMA_TMR1 + * - \ref PDMA_TMR2 + * - \ref PDMA_TMR3 + * - \ref PDMA_EADC0_RX + * - \ref PDMA_DAC0_TX + * - \ref PDMA_DAC1_TX + * - \ref PDMA_EPWM0_CH0_TX + * - \ref PDMA_EPWM0_CH1_TX + * - \ref PDMA_EPWM0_CH2_TX + * - \ref PDMA_EPWM0_CH3_TX + * - \ref PDMA_EPWM0_CH4_TX + * - \ref PDMA_EPWM0_CH5_TX + * - \ref PDMA_EPWM1_CH0_TX + * - \ref PDMA_EPWM1_CH1_TX + * - \ref PDMA_EPWM1_CH2_TX + * - \ref PDMA_EPWM1_CH3_TX + * - \ref PDMA_EPWM1_CH4_TX + * - \ref PDMA_EPWM1_CH5_TX + * - \ref PDMA_UART6_TX + * - \ref PDMA_UART6_RX + * - \ref PDMA_UART7_TX + * - \ref PDMA_UART7_RX + * - \ref PDMA_EADC1_RX + * @param[in] u32ScatterEn Scatter-gather mode enable + * @param[in] u32DescAddr Scatter-gather descriptor address + * + * @return None + * + * @details This function set the selected channel transfer mode. Include peripheral setting. + */ +void PDMA_SetTransferMode(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32Peripheral, uint32_t u32ScatterEn, uint32_t u32DescAddr) +{ + if (u32Ch < PDMA_CH_MAX) + { + __IO uint32_t *pau32REQSEL = (__IO uint32_t *)&pdma->REQSEL0_3; + uint32_t u32REQSEL_Pos, u32REQSEL_Msk; + + u32REQSEL_Pos = (u32Ch % 4) * 8 ; + u32REQSEL_Msk = PDMA_REQSEL0_3_REQSRC0_Msk << u32REQSEL_Pos; + pau32REQSEL[u32Ch / 4] = (pau32REQSEL[u32Ch / 4] & ~u32REQSEL_Msk) | (u32Peripheral << u32REQSEL_Pos); + + if (u32ScatterEn) + { + pdma->DSCT[u32Ch].CTL = (pdma->DSCT[u32Ch].CTL & ~PDMA_DSCT_CTL_OPMODE_Msk) | PDMA_OP_SCATTER; + pdma->DSCT[u32Ch].NEXT = u32DescAddr; + } + else + { + pdma->DSCT[u32Ch].CTL = (pdma->DSCT[u32Ch].CTL & ~PDMA_DSCT_CTL_OPMODE_Msk) | PDMA_OP_BASIC; + } + } + else {} +} + +/** + * @brief Set PDMA Burst Type and Size + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * @param[in] u32BurstType Burst mode or single mode. Valid values are + * - \ref PDMA_REQ_SINGLE + * - \ref PDMA_REQ_BURST + * @param[in] u32BurstSize Set the size of burst mode. Valid values are + * - \ref PDMA_BURST_128 + * - \ref PDMA_BURST_64 + * - \ref PDMA_BURST_32 + * - \ref PDMA_BURST_16 + * - \ref PDMA_BURST_8 + * - \ref PDMA_BURST_4 + * - \ref PDMA_BURST_2 + * - \ref PDMA_BURST_1 + * + * @return None + * + * @details This function set the selected channel burst type and size. + */ +void PDMA_SetBurstType(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32BurstType, uint32_t u32BurstSize) +{ + pdma->DSCT[u32Ch].CTL &= ~(PDMA_DSCT_CTL_TXTYPE_Msk | PDMA_DSCT_CTL_BURSIZE_Msk); + pdma->DSCT[u32Ch].CTL |= (u32BurstType | u32BurstSize); +} + +/** + * @brief Enable timeout function + * + * @param[in] pdma The pointer of the specified PDMA module + * + * @param[in] u32Mask Channel enable bits. + * + * @return None + * + * @details This function enable timeout function of the selected channel(s). + */ +void PDMA_EnableTimeout(PDMA_T *pdma, uint32_t u32Mask) +{ + pdma->TOUTEN |= u32Mask; +} + +/** + * @brief Disable timeout function + * + * @param[in] pdma The pointer of the specified PDMA module + * + * @param[in] u32Mask Channel enable bits. + * + * @return None + * + * @details This function disable timeout function of the selected channel(s). + */ +void PDMA_DisableTimeout(PDMA_T *pdma, uint32_t u32Mask) +{ + pdma->TOUTEN &= ~u32Mask; +} + +/** + * @brief Set PDMA Timeout Count + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel, + * @param[in] u32OnOff Enable/disable time out function + * @param[in] u32TimeOutCnt Timeout count + * + * @return None + * + * @details This function set the timeout count. + */ +void PDMA_SetTimeOut(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32OnOff, uint32_t u32TimeOutCnt) +{ + if (u32Ch < PDMA_CH_MAX) + { + __IO uint32_t *pau32TOC = (__IO uint32_t *)&pdma->TOC0_1; + uint32_t u32TOC_Pos, u32TOC_Msk; + + u32TOC_Pos = (u32Ch % 2) * 16 ; + u32TOC_Msk = PDMA_TOC0_1_TOC0_Msk << u32TOC_Pos; + pau32TOC[u32Ch / 2] = (pau32TOC[u32Ch / 2] & ~u32TOC_Msk) | (u32TimeOutCnt << u32TOC_Pos); + + if (u32OnOff) + pdma->TOUTEN |= (1 << u32Ch); + else + pdma->TOUTEN &= ~(1 << u32Ch); + } + else {} +} + +/** + * @brief Trigger PDMA + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * + * @return None + * + * @details This function trigger the selected channel. + */ +void PDMA_Trigger(PDMA_T *pdma, uint32_t u32Ch) +{ + __IO uint32_t *pau32REQSEL = (__IO uint32_t *)&pdma->REQSEL0_3; + uint32_t u32REQSEL_Pos, u32REQSEL_Msk, u32ChReq; + + u32REQSEL_Pos = (u32Ch % 4) * 8 ; + u32REQSEL_Msk = PDMA_REQSEL0_3_REQSRC0_Msk << u32REQSEL_Pos; + + u32ChReq = (pau32REQSEL[u32Ch / 4] & u32REQSEL_Msk) >> u32REQSEL_Pos; + + if (u32ChReq == PDMA_MEM) + { + pdma->SWREQ = (1ul << u32Ch); + } + else {} +} + +/** + * @brief Enable Interrupt + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * @param[in] u32Mask The Interrupt Type. Valid values are + * - \ref PDMA_INT_TRANS_DONE + * - \ref PDMA_INT_TEMPTY + * - \ref PDMA_INT_TIMEOUT + * + * @return None + * + * @details This function enable the selected channel interrupt. + */ +void PDMA_EnableInt(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32Mask) +{ + switch (u32Mask) + { + case PDMA_INT_TRANS_DONE: + pdma->INTEN |= (1ul << u32Ch); + break; + case PDMA_INT_TEMPTY: + pdma->DSCT[u32Ch].CTL &= ~PDMA_DSCT_CTL_TBINTDIS_Msk; + break; + case PDMA_INT_TIMEOUT: + pdma->TOUTIEN |= (1ul << u32Ch); + break; + + default: + break; + } +} + +/** + * @brief Disable Interrupt + * + * @param[in] pdma The pointer of the specified PDMA module + * @param[in] u32Ch The selected channel + * @param[in] u32Mask The Interrupt Type. Valid values are + * - \ref PDMA_INT_TRANS_DONE + * - \ref PDMA_INT_TEMPTY + * - \ref PDMA_INT_TIMEOUT + * + * @return None + * + * @details This function disable the selected channel interrupt. + */ +void PDMA_DisableInt(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32Mask) +{ + switch (u32Mask) + { + case PDMA_INT_TRANS_DONE: + pdma->INTEN &= ~(1ul << u32Ch); + break; + case PDMA_INT_TEMPTY: + pdma->DSCT[u32Ch].CTL |= PDMA_DSCT_CTL_TBINTDIS_Msk; + break; + case PDMA_INT_TIMEOUT: + pdma->TOUTIEN &= ~(1ul << u32Ch); + break; + + default: + break; + } +} + +/*@}*/ /* end of group PDMA_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group PDMA_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_qei.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_qei.c new file mode 100644 index 0000000000..a4470a8975 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_qei.c @@ -0,0 +1,122 @@ +/**************************************************************************//** + * @file qei.c + * @brief Quadrature Encoder Interface (QEI) driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ +#include "NuMicro.h" + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup QEI_Driver QEI Driver + @{ +*/ + +/** @addtogroup QEI_EXPORTED_FUNCTIONS QEI Exported Functions + @{ +*/ + +/** + * @brief Close QEI function + * @param[in] qei The pointer of the specified QEI module. + * @return None + * @details This function reset QEI configuration and stop QEI counting. + */ +void QEI_Close(QEI_T *qei) +{ + /* Reset QEI configuration */ + qei->CTL = (uint32_t)0; +} + +/** + * @brief Disable QEI interrupt + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32IntSel Interrupt type selection. + * - \ref QEI_CTL_DIRIEN_Msk : Direction change interrupt + * - \ref QEI_CTL_OVUNIEN_Msk : Counter overflow or underflow interrupt + * - \ref QEI_CTL_CMPIEN_Msk : Compare-match interrupt + * - \ref QEI_CTL_IDXIEN_Msk : Index detected interrupt + * @return None + * @details This function disable QEI specified interrupt. + */ +void QEI_DisableInt(QEI_T *qei, uint32_t u32IntSel) +{ + /* Disable QEI specified interrupt */ + QEI_DISABLE_INT(qei, u32IntSel); +} + +/** + * @brief Enable QEI interrupt + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32IntSel Interrupt type selection. + * - \ref QEI_CTL_DIRIEN_Msk : Direction change interrupt + * - \ref QEI_CTL_OVUNIEN_Msk : Counter overflow or underflow interrupt + * - \ref QEI_CTL_CMPIEN_Msk : Compare-match interrupt + * - \ref QEI_CTL_IDXIEN_Msk : Index detected interrupt + * @return None + * @details This function enable QEI specified interrupt. + */ +void QEI_EnableInt(QEI_T *qei, uint32_t u32IntSel) +{ + /* Enable QEI specified interrupt */ + QEI_ENABLE_INT(qei, u32IntSel); +} + +/** + * @brief Open QEI in specified mode and enable input + * @param[in] qei The pointer of the specified QEI module. + * @param[in] u32Mode QEI counting mode. + * - \ref QEI_CTL_X4_FREE_COUNTING_MODE + * - \ref QEI_CTL_X2_FREE_COUNTING_MODE + * - \ref QEI_CTL_X4_COMPARE_COUNTING_MODE + * - \ref QEI_CTL_X2_COMPARE_COUNTING_MODE + * @param[in] u32Value The counter maximum value in compare-counting mode. + * @return None + * @details This function set QEI in specified mode and enable input. + */ +void QEI_Open(QEI_T *qei, uint32_t u32Mode, uint32_t u32Value) +{ + /* Set QEI function configuration */ + /* Set QEI counting mode */ + /* Enable IDX, QEA and QEB input to QEI controller */ + qei->CTL = (qei->CTL & (~QEI_CTL_MODE_Msk)) | ((u32Mode) | QEI_CTL_CHAEN_Msk | QEI_CTL_CHBEN_Msk | QEI_CTL_IDXEN_Msk); + + /* Set QEI maximum count value in in compare-counting mode */ + qei->CNTMAX = u32Value; +} + +/** + * @brief Start QEI function + * @param[in] qei The pointer of the specified QEI module. + * @return None + * @details This function enable QEI function and start QEI counting. + */ +void QEI_Start(QEI_T *qei) +{ + /* Enable QEI controller function */ + qei->CTL |= QEI_CTL_QEIEN_Msk; +} + +/** + * @brief Stop QEI function + * @param[in] qei The pointer of the specified QEI module. + * @return None + * @details This function disable QEI function and stop QEI counting. + */ +void QEI_Stop(QEI_T *qei) +{ + /* Disable QEI controller function */ + qei->CTL &= (~QEI_CTL_QEIEN_Msk); +} + + +/*@}*/ /* end of group QEI_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group QEI_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_qspi.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_qspi.c new file mode 100644 index 0000000000..e9a037a2e4 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_qspi.c @@ -0,0 +1,788 @@ +/**************************************************************************//** + * @file qspi.c + * @brief QSPI driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup QSPI_Driver QSPI Driver + @{ +*/ + + +/** @addtogroup QSPI_EXPORTED_FUNCTIONS QSPI Exported Functions + @{ +*/ +static uint32_t QSPI_GetSrcClkSetting(QSPI_T *qspi); + +/** + * @brief This function make QSPI module be ready to transfer. + * @param[in] qspi The pointer of the specified QSPI module. + * @return Source clock frequency of QSPI peripheral. + * @details + * 0: APLL + * 1: PCLK0 + */ +static uint32_t QSPI_GetSrcClkSetting(QSPI_T *qspi) +{ + uint32_t u32ClkSrcFreq = 0UL, u32ClkSrcSel; + uint32_t u32ClkSelMsk = 0U, u32ClkSelPos = 0U; + + if (qspi == QSPI0) + { + u32ClkSelMsk = CLK_CLKSEL4_QSPI0SEL_Msk; + u32ClkSelPos = CLK_CLKSEL4_QSPI0SEL_Pos; + } + else if (qspi == QSPI1) + { + u32ClkSelMsk = CLK_CLKSEL4_QSPI1SEL_Msk; + u32ClkSelPos = CLK_CLKSEL4_QSPI1SEL_Pos; + } + else + { + goto Exit_QSPI_GetSrcClkSetting; + } + + u32ClkSrcSel = (CLK->CLKSEL4 & u32ClkSelMsk) >> u32ClkSelPos; + + switch (u32ClkSrcSel) + { + case 0x0U: + /* Clock source is PCLK0 */ + u32ClkSrcFreq = CLK_GetPCLK0Freq(); + break; + case 0x1U: + /* Clock source is APLL */ + u32ClkSrcFreq = CLK_GetPLLClockFreq(APLL); + break; + default: + break; + } + +Exit_QSPI_GetSrcClkSetting: + + return u32ClkSrcFreq; +} + +/** + * @brief This function make QSPI module be ready to transfer. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None. + */ +static void QSPI_SetSrcClkToPCLK(QSPI_T *qspi) +{ + uint32_t u32ClkSelMsk = 0U, u32ClkSelPos = 0U; + + if (qspi == QSPI0) + { + u32ClkSelMsk = CLK_CLKSEL4_QSPI0SEL_Msk; + u32ClkSelPos = CLK_CLKSEL4_QSPI0SEL_Pos; + } + else if (qspi == QSPI1) + { + u32ClkSelMsk = CLK_CLKSEL4_QSPI1SEL_Msk; + u32ClkSelPos = CLK_CLKSEL4_QSPI1SEL_Pos; + } + + /* Select PCLK as the clock source of QSPI */ + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~u32ClkSelMsk)) | (0x2UL << u32ClkSelPos); +} + +/** + * @brief This function make QSPI module be ready to transfer. + * @param[in] qspi The pointer of the specified QSPI module. + * @param[in] u32MasterSlave Decides the QSPI module is operating in master mode or in slave mode. (QSPI_SLAVE, QSPI_MASTER) + * @param[in] u32QSPIMode Decides the transfer timing. (QSPI_MODE_0, QSPI_MODE_1, QSPI_MODE_2, QSPI_MODE_3) + * @param[in] u32DataWidth Decides the data width of a QSPI transaction. + * @param[in] u32BusClock The expected frequency of QSPI bus clock in Hz. + * @return Actual frequency of QSPI peripheral clock. + * @details By default, the QSPI transfer sequence is MSB first, the slave selection signal is active low and the automatic + * slave selection function is disabled. + * In Slave mode, the u32BusClock shall be NULL and the QSPI clock divider setting will be 0. + * The actual clock rate may be different from the target QSPI clock rate. + * For example, if the QSPI source clock rate is 12 MHz and the target QSPI bus clock rate is 7 MHz, the + * actual QSPI clock rate will be 6MHz. + * @note If u32BusClock = 0, DIVIDER setting will be set to the maximum value. + * @note If u32BusClock >= system clock frequency, QSPI peripheral clock source will be set to APB clock and DIVIDER will be set to 0. + * @note If u32BusClock >= QSPI peripheral clock source, DIVIDER will be set to 0. + * @note In slave mode, the QSPI peripheral clock rate will be equal to APB clock rate. + */ +uint32_t QSPI_Open(QSPI_T *qspi, + uint32_t u32MasterSlave, + uint32_t u32QSPIMode, + uint32_t u32DataWidth, + uint32_t u32BusClock) +{ + uint32_t u32ClkSrcFreq = 0U, u32Div, u32HCLKFreq, u32RetValue = 0U; + + if (u32DataWidth == 32U) + { + u32DataWidth = 0U; + } + + + if (u32MasterSlave == QSPI_MASTER) + { + /* Default setting: slave selection signal is active low; disable automatic slave selection function. */ + qspi->SSCTL = QSPI_SS_ACTIVE_LOW; + + /* Default setting: MSB first, disable unit transfer interrupt, SP_CYCLE = 0. */ + qspi->CTL = u32MasterSlave | (u32DataWidth << QSPI_CTL_DWIDTH_Pos) | (u32QSPIMode) | QSPI_CTL_SPIEN_Msk; + + /* Get system clock frequency */ + u32HCLKFreq = CLK_GetSYSCLK0Freq(); + if (u32BusClock >= u32HCLKFreq) + { + /* Select PCLK as the clock source of QSPI */ + QSPI_SetSrcClkToPCLK(qspi); + } + + /* Check clock source of QSPI */ + u32ClkSrcFreq = QSPI_GetSrcClkSetting(qspi); + + if ((u32BusClock >= u32HCLKFreq) || (u32BusClock >= u32ClkSrcFreq)) + { + /* Set DIVIDER = 0 */ + qspi->CLKDIV = 0U; + /* Return master peripheral clock rate */ + u32RetValue = u32ClkSrcFreq; + } + else if (u32BusClock == 0U) + { + /* Set DIVIDER to the maximum value 0xFF. f_qspi = f_qspi_clk_src / (DIVIDER + 1) */ + qspi->CLKDIV |= QSPI_CLKDIV_DIVIDER_Msk; + /* Return master peripheral clock rate */ + u32RetValue = (u32ClkSrcFreq / (0xFFU + 1U)); + } + else + { + u32Div = (((u32ClkSrcFreq * 10U) / u32BusClock + 5U) / 10U) - 1U; /* Round to the nearest integer */ + if (u32Div > 0xFFU) + { + u32Div = 0xFFU; + qspi->CLKDIV |= QSPI_CLKDIV_DIVIDER_Msk; + /* Return master peripheral clock rate */ + u32RetValue = (u32ClkSrcFreq / (0xFFU + 1U)); + } + else + { + qspi->CLKDIV = (qspi->CLKDIV & (~QSPI_CLKDIV_DIVIDER_Msk)) | (u32Div << QSPI_CLKDIV_DIVIDER_Pos); + /* Return master peripheral clock rate */ + u32RetValue = (u32ClkSrcFreq / (u32Div + 1U)); + } + } + } + else /* For slave mode, force the QSPI peripheral clock rate to equal APB clock rate. */ + { + /* Default setting: slave selection signal is low level active. */ + qspi->SSCTL = QSPI_SS_ACTIVE_LOW; + + /* Default setting: MSB first, disable unit transfer interrupt, SP_CYCLE = 0. */ + qspi->CTL = u32MasterSlave | (u32DataWidth << QSPI_CTL_DWIDTH_Pos) | (u32QSPIMode) | QSPI_CTL_SPIEN_Msk; + + /* Set DIVIDER = 0 */ + qspi->CLKDIV = 0U; + + /* Select PCLK as the clock source of QSPI */ + QSPI_SetSrcClkToPCLK(qspi); + + /* Return slave peripheral clock rate */ + u32RetValue = CLK_GetPCLK0Freq(); + } + + return u32RetValue; +} + +/** + * @brief Disable QSPI controller. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None + * @details This function will reset QSPI controller. + */ +void QSPI_Close(QSPI_T *qspi) +{ + /* Reset QSPI */ + if (qspi == QSPI0) + { + SYS->IPRST1 |= SYS_IPRST1_QSPI0RST_Msk; + SYS->IPRST1 &= ~SYS_IPRST1_QSPI0RST_Msk; + } + else + { + SYS->IPRST2 |= SYS_IPRST2_QSPI1RST_Msk; + SYS->IPRST2 &= ~SYS_IPRST2_QSPI1RST_Msk; + } +} + +/** + * @brief Clear RX FIFO buffer. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None + * @details This function will clear QSPI RX FIFO buffer. The RXEMPTY (QSPI_STATUS[8]) will be set to 1. + */ +void QSPI_ClearRxFIFO(QSPI_T *qspi) +{ + qspi->FIFOCTL |= QSPI_FIFOCTL_RXFBCLR_Msk; +} + +/** + * @brief Clear TX FIFO buffer. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None + * @details This function will clear QSPI TX FIFO buffer. The TXEMPTY (QSPI_STATUS[16]) will be set to 1. + * @note The TX shift register will not be cleared. + */ +void QSPI_ClearTxFIFO(QSPI_T *qspi) +{ + qspi->FIFOCTL |= QSPI_FIFOCTL_TXFBCLR_Msk; +} + +/** + * @brief Disable the automatic slave selection function. + * @param[in] qspi The pointer of the specified QSPI module. + * @return None + * @details This function will disable the automatic slave selection function and set slave selection signal to inactive state. + */ +void QSPI_DisableAutoSS(QSPI_T *qspi) +{ + qspi->SSCTL &= ~(QSPI_SSCTL_AUTOSS_Msk | QSPI_SSCTL_SS_Msk); +} + +/** + * @brief Enable the automatic slave selection function. + * @param[in] qspi The pointer of the specified QSPI module. + * @param[in] u32SSPinMask Specifies slave selection pins. (QSPI_SS) + * @param[in] u32ActiveLevel Specifies the active level of slave selection signal. (QSPI_SS_ACTIVE_HIGH, QSPI_SS_ACTIVE_LOW) + * @return None + * @details This function will enable the automatic slave selection function. Only available in Master mode. + * The slave selection pin and the active level will be set in this function. + */ +void QSPI_EnableAutoSS(QSPI_T *qspi, uint32_t u32SSPinMask, uint32_t u32ActiveLevel) +{ + qspi->SSCTL = (qspi->SSCTL & (~(QSPI_SSCTL_AUTOSS_Msk | QSPI_SSCTL_SSACTPOL_Msk | QSPI_SSCTL_SS_Msk))) | (u32SSPinMask | u32ActiveLevel | QSPI_SSCTL_AUTOSS_Msk); +} + +/** + * @brief Set the QSPI bus clock. + * @param[in] qspi The pointer of the specified QSPI module. + * @param[in] u32BusClock The expected frequency of QSPI bus clock in Hz. + * @return Actual frequency of QSPI bus clock. + * @details This function is only available in Master mode. The actual clock rate may be different from the target QSPI bus clock rate. + * For example, if the QSPI source clock rate is 12 MHz and the target QSPI bus clock rate is 7 MHz, the actual QSPI bus clock + * rate will be 6 MHz. + * @note If u32BusClock = 0, DIVIDER setting will be set to the maximum value. + * @note If u32BusClock >= system clock frequency, QSPI peripheral clock source will be set to APB clock and DIVIDER will be set to 0. + * @note If u32BusClock >= QSPI peripheral clock source, DIVIDER will be set to 0. + */ +uint32_t QSPI_SetBusClock(QSPI_T *qspi, uint32_t u32BusClock) +{ + uint32_t u32ClkSrcFreq, u32HCLKFreq; + uint32_t u32Div, u32RetValue; + + /* Get system clock frequency */ + u32HCLKFreq = CLK_GetSYSCLK0Freq(); + if (u32BusClock >= u32HCLKFreq) + { + /* Select PCLK as the clock source of QSPI */ + QSPI_SetSrcClkToPCLK(qspi); + } + + /* Check clock source of QSPI */ + u32ClkSrcFreq = QSPI_GetSrcClkSetting(qspi); + if (u32BusClock >= u32HCLKFreq) + { + /* Set DIVIDER = 0 */ + qspi->CLKDIV = 0U; + /* Return master peripheral clock rate */ + u32RetValue = u32ClkSrcFreq; + } + else if (u32BusClock >= u32ClkSrcFreq) + { + /* Set DIVIDER = 0 */ + qspi->CLKDIV = 0U; + /* Return master peripheral clock rate */ + u32RetValue = u32ClkSrcFreq; + } + else if (u32BusClock == 0U) + { + /* Set DIVIDER to the maximum value 0xFF. f_qspi = f_qspi_clk_src / (DIVIDER + 1) */ + qspi->CLKDIV |= QSPI_CLKDIV_DIVIDER_Msk; + /* Return master peripheral clock rate */ + u32RetValue = (u32ClkSrcFreq / (0xFFU + 1U)); + } + else + { + u32Div = (((u32ClkSrcFreq * 10U) / u32BusClock + 5U) / 10U) - 1U; /* Round to the nearest integer */ + if (u32Div > 0x1FFU) + { + u32Div = 0x1FFU; + qspi->CLKDIV |= QSPI_CLKDIV_DIVIDER_Msk; + /* Return master peripheral clock rate */ + u32RetValue = (u32ClkSrcFreq / (0xFFU + 1U)); + } + else + { + qspi->CLKDIV = (qspi->CLKDIV & (~QSPI_CLKDIV_DIVIDER_Msk)) | (u32Div << QSPI_CLKDIV_DIVIDER_Pos); + /* Return master peripheral clock rate */ + u32RetValue = (u32ClkSrcFreq / (u32Div + 1U)); + } + } + + return u32RetValue; +} + +/** + * @brief Configure FIFO threshold setting. + * @param[in] qspi The pointer of the specified QSPI module. + * @param[in] u32TxThreshold Decides the TX FIFO threshold. It could be 0 ~ 7. + * @param[in] u32RxThreshold Decides the RX FIFO threshold. It could be 0 ~ 7. + * @return None + * @details Set TX FIFO threshold and RX FIFO threshold configurations. + */ +void QSPI_SetFIFO(QSPI_T *qspi, uint32_t u32TxThreshold, uint32_t u32RxThreshold) +{ + qspi->FIFOCTL = (qspi->FIFOCTL & ~(QSPI_FIFOCTL_TXTH_Msk | QSPI_FIFOCTL_RXTH_Msk)) | + (u32TxThreshold << QSPI_FIFOCTL_TXTH_Pos) | + (u32RxThreshold << QSPI_FIFOCTL_RXTH_Pos); +} + +/** + * @brief Get the actual frequency of QSPI bus clock. Only available in Master mode. + * @param[in] qspi The pointer of the specified QSPI module. + * @return Actual QSPI bus clock frequency in Hz. + * @details This function will calculate the actual QSPI bus clock rate according to the QSPInSEL and DIVIDER settings. Only available in Master mode. + */ +uint32_t QSPI_GetBusClock(QSPI_T *qspi) +{ + uint32_t u32Div; + uint32_t u32ClkSrcFreq; + + /* Check clock source of QSPI */ + u32ClkSrcFreq = QSPI_GetSrcClkSetting(qspi); + + /* Get DIVIDER setting */ + u32Div = (qspi->CLKDIV & QSPI_CLKDIV_DIVIDER_Msk) >> QSPI_CLKDIV_DIVIDER_Pos; + + /* Return QSPI bus clock rate */ + return (u32ClkSrcFreq / (u32Div + 1U)); +} + +/** + * @brief Enable interrupt function. + * @param[in] qspi The pointer of the specified QSPI module. + * @param[in] u32Mask The combination of all related interrupt enable bits. + * Each bit corresponds to a interrupt enable bit. + * This parameter decides which interrupts will be enabled. It is combination of: + * - \ref QSPI_UNIT_INT_MASK + * - \ref QSPI_SSACT_INT_MASK + * - \ref QSPI_SSINACT_INT_MASK + * - \ref QSPI_SLVUR_INT_MASK + * - \ref QSPI_SLVBE_INT_MASK + * - \ref QSPI_TXUF_INT_MASK + * - \ref QSPI_FIFO_TXTH_INT_MASK + * - \ref QSPI_FIFO_RXTH_INT_MASK + * - \ref QSPI_FIFO_RXOV_INT_MASK + * - \ref QSPI_FIFO_RXTO_INT_MASK + * + * @return None + * @details Enable QSPI related interrupts specified by u32Mask parameter. + */ +void QSPI_EnableInt(QSPI_T *qspi, uint32_t u32Mask) +{ + /* Enable unit transfer interrupt flag */ + if ((u32Mask & QSPI_UNIT_INT_MASK) == QSPI_UNIT_INT_MASK) + { + qspi->CTL |= QSPI_CTL_UNITIEN_Msk; + } + + /* Enable slave selection signal active interrupt flag */ + if ((u32Mask & QSPI_SSACT_INT_MASK) == QSPI_SSACT_INT_MASK) + { + qspi->SSCTL |= QSPI_SSCTL_SSACTIEN_Msk; + } + + /* Enable slave selection signal inactive interrupt flag */ + if ((u32Mask & QSPI_SSINACT_INT_MASK) == QSPI_SSINACT_INT_MASK) + { + qspi->SSCTL |= QSPI_SSCTL_SSINAIEN_Msk; + } + + /* Enable slave TX under run interrupt flag */ + if ((u32Mask & QSPI_SLVUR_INT_MASK) == QSPI_SLVUR_INT_MASK) + { + qspi->SSCTL |= QSPI_SSCTL_SLVURIEN_Msk; + } + + /* Enable slave bit count error interrupt flag */ + if ((u32Mask & QSPI_SLVBE_INT_MASK) == QSPI_SLVBE_INT_MASK) + { + qspi->SSCTL |= QSPI_SSCTL_SLVBEIEN_Msk; + } + + /* Enable slave TX underflow interrupt flag */ + if ((u32Mask & QSPI_TXUF_INT_MASK) == QSPI_TXUF_INT_MASK) + { + qspi->FIFOCTL |= QSPI_FIFOCTL_TXUFIEN_Msk; + } + + /* Enable TX threshold interrupt flag */ + if ((u32Mask & QSPI_FIFO_TXTH_INT_MASK) == QSPI_FIFO_TXTH_INT_MASK) + { + qspi->FIFOCTL |= QSPI_FIFOCTL_TXTHIEN_Msk; + } + + /* Enable RX threshold interrupt flag */ + if ((u32Mask & QSPI_FIFO_RXTH_INT_MASK) == QSPI_FIFO_RXTH_INT_MASK) + { + qspi->FIFOCTL |= QSPI_FIFOCTL_RXTHIEN_Msk; + } + + /* Enable RX overrun interrupt flag */ + if ((u32Mask & QSPI_FIFO_RXOV_INT_MASK) == QSPI_FIFO_RXOV_INT_MASK) + { + qspi->FIFOCTL |= QSPI_FIFOCTL_RXOVIEN_Msk; + } + + /* Enable RX time-out interrupt flag */ + if ((u32Mask & QSPI_FIFO_RXTO_INT_MASK) == QSPI_FIFO_RXTO_INT_MASK) + { + qspi->FIFOCTL |= QSPI_FIFOCTL_RXTOIEN_Msk; + } +} + +/** + * @brief Disable interrupt function. + * @param[in] qspi The pointer of the specified QSPI module. + * @param[in] u32Mask The combination of all related interrupt enable bits. + * Each bit corresponds to a interrupt bit. + * This parameter decides which interrupts will be disabled. It is combination of: + * - \ref QSPI_UNIT_INT_MASK + * - \ref QSPI_SSACT_INT_MASK + * - \ref QSPI_SSINACT_INT_MASK + * - \ref QSPI_SLVUR_INT_MASK + * - \ref QSPI_SLVBE_INT_MASK + * - \ref QSPI_TXUF_INT_MASK + * - \ref QSPI_FIFO_TXTH_INT_MASK + * - \ref QSPI_FIFO_RXTH_INT_MASK + * - \ref QSPI_FIFO_RXOV_INT_MASK + * - \ref QSPI_FIFO_RXTO_INT_MASK + * + * @return None + * @details Disable QSPI related interrupts specified by u32Mask parameter. + */ +void QSPI_DisableInt(QSPI_T *qspi, uint32_t u32Mask) +{ + /* Disable unit transfer interrupt flag */ + if ((u32Mask & QSPI_UNIT_INT_MASK) == QSPI_UNIT_INT_MASK) + { + qspi->CTL &= ~QSPI_CTL_UNITIEN_Msk; + } + + /* Disable slave selection signal active interrupt flag */ + if ((u32Mask & QSPI_SSACT_INT_MASK) == QSPI_SSACT_INT_MASK) + { + qspi->SSCTL &= ~QSPI_SSCTL_SSACTIEN_Msk; + } + + /* Disable slave selection signal inactive interrupt flag */ + if ((u32Mask & QSPI_SSINACT_INT_MASK) == QSPI_SSINACT_INT_MASK) + { + qspi->SSCTL &= ~QSPI_SSCTL_SSINAIEN_Msk; + } + + /* Disable slave TX under run interrupt flag */ + if ((u32Mask & QSPI_SLVUR_INT_MASK) == QSPI_SLVUR_INT_MASK) + { + qspi->SSCTL &= ~QSPI_SSCTL_SLVURIEN_Msk; + } + + /* Disable slave bit count error interrupt flag */ + if ((u32Mask & QSPI_SLVBE_INT_MASK) == QSPI_SLVBE_INT_MASK) + { + qspi->SSCTL &= ~QSPI_SSCTL_SLVBEIEN_Msk; + } + + /* Disable slave TX underflow interrupt flag */ + if ((u32Mask & QSPI_TXUF_INT_MASK) == QSPI_TXUF_INT_MASK) + { + qspi->FIFOCTL &= ~QSPI_FIFOCTL_TXUFIEN_Msk; + } + + /* Disable TX threshold interrupt flag */ + if ((u32Mask & QSPI_FIFO_TXTH_INT_MASK) == QSPI_FIFO_TXTH_INT_MASK) + { + qspi->FIFOCTL &= ~QSPI_FIFOCTL_TXTHIEN_Msk; + } + + /* Disable RX threshold interrupt flag */ + if ((u32Mask & QSPI_FIFO_RXTH_INT_MASK) == QSPI_FIFO_RXTH_INT_MASK) + { + qspi->FIFOCTL &= ~QSPI_FIFOCTL_RXTHIEN_Msk; + } + + /* Disable RX overrun interrupt flag */ + if ((u32Mask & QSPI_FIFO_RXOV_INT_MASK) == QSPI_FIFO_RXOV_INT_MASK) + { + qspi->FIFOCTL &= ~QSPI_FIFOCTL_RXOVIEN_Msk; + } + + /* Disable RX time-out interrupt flag */ + if ((u32Mask & QSPI_FIFO_RXTO_INT_MASK) == QSPI_FIFO_RXTO_INT_MASK) + { + qspi->FIFOCTL &= ~QSPI_FIFOCTL_RXTOIEN_Msk; + } +} + +/** + * @brief Get interrupt flag. + * @param[in] qspi The pointer of the specified QSPI module. + * @param[in] u32Mask The combination of all related interrupt sources. + * Each bit corresponds to a interrupt source. + * This parameter decides which interrupt flags will be read. It is combination of: + * - \ref QSPI_UNIT_INT_MASK + * - \ref QSPI_SSACT_INT_MASK + * - \ref QSPI_SSINACT_INT_MASK + * - \ref QSPI_SLVUR_INT_MASK + * - \ref QSPI_SLVBE_INT_MASK + * - \ref QSPI_TXUF_INT_MASK + * - \ref QSPI_FIFO_TXTH_INT_MASK + * - \ref QSPI_FIFO_RXTH_INT_MASK + * - \ref QSPI_FIFO_RXOV_INT_MASK + * - \ref QSPI_FIFO_RXTO_INT_MASK + * + * @return Interrupt flags of selected sources. + * @details Get QSPI related interrupt flags specified by u32Mask parameter. + */ +uint32_t QSPI_GetIntFlag(QSPI_T *qspi, uint32_t u32Mask) +{ + uint32_t u32IntFlag = 0U, u32TmpVal; + + u32TmpVal = qspi->STATUS & QSPI_STATUS_UNITIF_Msk; + /* Check unit transfer interrupt flag */ + if ((u32Mask & QSPI_UNIT_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= QSPI_UNIT_INT_MASK; + } + + u32TmpVal = qspi->STATUS & QSPI_STATUS_SSACTIF_Msk; + /* Check slave selection signal active interrupt flag */ + if ((u32Mask & QSPI_SSACT_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= QSPI_SSACT_INT_MASK; + } + + u32TmpVal = qspi->STATUS & QSPI_STATUS_SSINAIF_Msk; + /* Check slave selection signal inactive interrupt flag */ + if ((u32Mask & QSPI_SSINACT_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= QSPI_SSINACT_INT_MASK; + } + + u32TmpVal = qspi->STATUS & QSPI_STATUS_SLVURIF_Msk; + /* Check slave TX under run interrupt flag */ + if ((u32Mask & QSPI_SLVUR_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= QSPI_SLVUR_INT_MASK; + } + + u32TmpVal = qspi->STATUS & QSPI_STATUS_SLVBEIF_Msk; + /* Check slave bit count error interrupt flag */ + if ((u32Mask & QSPI_SLVBE_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= QSPI_SLVBE_INT_MASK; + } + + u32TmpVal = qspi->STATUS & QSPI_STATUS_TXUFIF_Msk; + /* Check slave TX underflow interrupt flag */ + if ((u32Mask & QSPI_TXUF_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= QSPI_TXUF_INT_MASK; + } + + u32TmpVal = qspi->STATUS & QSPI_STATUS_TXTHIF_Msk; + /* Check TX threshold interrupt flag */ + if ((u32Mask & QSPI_FIFO_TXTH_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= QSPI_FIFO_TXTH_INT_MASK; + } + + u32TmpVal = qspi->STATUS & QSPI_STATUS_RXTHIF_Msk; + /* Check RX threshold interrupt flag */ + if ((u32Mask & QSPI_FIFO_RXTH_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= QSPI_FIFO_RXTH_INT_MASK; + } + + u32TmpVal = qspi->STATUS & QSPI_STATUS_RXOVIF_Msk; + /* Check RX overrun interrupt flag */ + if ((u32Mask & QSPI_FIFO_RXOV_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= QSPI_FIFO_RXOV_INT_MASK; + } + + u32TmpVal = qspi->STATUS & QSPI_STATUS_RXTOIF_Msk; + /* Check RX time-out interrupt flag */ + if ((u32Mask & QSPI_FIFO_RXTO_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= QSPI_FIFO_RXTO_INT_MASK; + } + + return u32IntFlag; +} + +/** + * @brief Clear interrupt flag. + * @param[in] qspi The pointer of the specified QSPI module. + * @param[in] u32Mask The combination of all related interrupt sources. + * Each bit corresponds to a interrupt source. + * This parameter decides which interrupt flags will be cleared. It could be the combination of: + * - \ref QSPI_UNIT_INT_MASK + * - \ref QSPI_SSACT_INT_MASK + * - \ref QSPI_SSINACT_INT_MASK + * - \ref QSPI_SLVUR_INT_MASK + * - \ref QSPI_SLVBE_INT_MASK + * - \ref QSPI_TXUF_INT_MASK + * - \ref QSPI_FIFO_RXOV_INT_MASK + * - \ref QSPI_FIFO_RXTO_INT_MASK + * + * @return None + * @details Clear QSPI related interrupt flags specified by u32Mask parameter. + */ +void QSPI_ClearIntFlag(QSPI_T *qspi, uint32_t u32Mask) +{ + if (u32Mask & QSPI_UNIT_INT_MASK) + { + qspi->STATUS = QSPI_STATUS_UNITIF_Msk; /* Clear unit transfer interrupt flag */ + } + + if (u32Mask & QSPI_SSACT_INT_MASK) + { + qspi->STATUS = QSPI_STATUS_SSACTIF_Msk; /* Clear slave selection signal active interrupt flag */ + } + + if (u32Mask & QSPI_SSINACT_INT_MASK) + { + qspi->STATUS = QSPI_STATUS_SSINAIF_Msk; /* Clear slave selection signal inactive interrupt flag */ + } + + if (u32Mask & QSPI_SLVUR_INT_MASK) + { + qspi->STATUS = QSPI_STATUS_SLVURIF_Msk; /* Clear slave TX under run interrupt flag */ + } + + if (u32Mask & QSPI_SLVBE_INT_MASK) + { + qspi->STATUS = QSPI_STATUS_SLVBEIF_Msk; /* Clear slave bit count error interrupt flag */ + } + + if (u32Mask & QSPI_TXUF_INT_MASK) + { + qspi->STATUS = QSPI_STATUS_TXUFIF_Msk; /* Clear slave TX underflow interrupt flag */ + } + + if (u32Mask & QSPI_FIFO_RXOV_INT_MASK) + { + qspi->STATUS = QSPI_STATUS_RXOVIF_Msk; /* Clear RX overrun interrupt flag */ + } + + if (u32Mask & QSPI_FIFO_RXTO_INT_MASK) + { + qspi->STATUS = QSPI_STATUS_RXTOIF_Msk; /* Clear RX time-out interrupt flag */ + } +} + +/** + * @brief Get QSPI status. + * @param[in] qspi The pointer of the specified QSPI module. + * @param[in] u32Mask The combination of all related sources. + * Each bit corresponds to a source. + * This parameter decides which flags will be read. It is combination of: + * - \ref QSPI_BUSY_MASK + * - \ref QSPI_RX_EMPTY_MASK + * - \ref QSPI_RX_FULL_MASK + * - \ref QSPI_TX_EMPTY_MASK + * - \ref QSPI_TX_FULL_MASK + * - \ref QSPI_TXRX_RESET_MASK + * - \ref QSPI_QSPIEN_STS_MASK + * - \ref QSPI_SSLINE_STS_MASK + * + * @return Flags of selected sources. + * @details Get QSPI related status specified by u32Mask parameter. + */ +uint32_t QSPI_GetStatus(QSPI_T *qspi, uint32_t u32Mask) +{ + uint32_t u32Flag = 0U, u32TmpValue; + + u32TmpValue = qspi->STATUS & QSPI_STATUS_BUSY_Msk; + /* Check busy status */ + if ((u32Mask & QSPI_BUSY_MASK) && (u32TmpValue)) + { + u32Flag |= QSPI_BUSY_MASK; + } + + u32TmpValue = qspi->STATUS & QSPI_STATUS_RXEMPTY_Msk; + /* Check RX empty flag */ + if ((u32Mask & QSPI_RX_EMPTY_MASK) && (u32TmpValue)) + { + u32Flag |= QSPI_RX_EMPTY_MASK; + } + + u32TmpValue = qspi->STATUS & QSPI_STATUS_RXFULL_Msk; + /* Check RX full flag */ + if ((u32Mask & QSPI_RX_FULL_MASK) && (u32TmpValue)) + { + u32Flag |= QSPI_RX_FULL_MASK; + } + + u32TmpValue = qspi->STATUS & QSPI_STATUS_TXEMPTY_Msk; + /* Check TX empty flag */ + if ((u32Mask & QSPI_TX_EMPTY_MASK) && (u32TmpValue)) + { + u32Flag |= QSPI_TX_EMPTY_MASK; + } + + u32TmpValue = qspi->STATUS & QSPI_STATUS_TXFULL_Msk; + /* Check TX full flag */ + if ((u32Mask & QSPI_TX_FULL_MASK) && (u32TmpValue)) + { + u32Flag |= QSPI_TX_FULL_MASK; + } + + u32TmpValue = qspi->STATUS & QSPI_STATUS_TXRXRST_Msk; + /* Check TX/RX reset flag */ + if ((u32Mask & QSPI_TXRX_RESET_MASK) && (u32TmpValue)) + { + u32Flag |= QSPI_TXRX_RESET_MASK; + } + + u32TmpValue = qspi->STATUS & QSPI_STATUS_SPIENSTS_Msk; + /* Check QSPIEN flag */ + if ((u32Mask & QSPI_QSPIEN_STS_MASK) && (u32TmpValue)) + { + u32Flag |= QSPI_QSPIEN_STS_MASK; + } + + u32TmpValue = qspi->STATUS & QSPI_STATUS_SSLINE_Msk; + /* Check QSPIx_SS line status */ + if ((u32Mask & QSPI_SSLINE_STS_MASK) && (u32TmpValue)) + { + u32Flag |= QSPI_SSLINE_STS_MASK; + } + + return u32Flag; +} + + + +/*@}*/ /* end of group QSPI_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group QSPI_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_rtc.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_rtc.c new file mode 100644 index 0000000000..4f16700b96 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_rtc.c @@ -0,0 +1,731 @@ +/**************************************************************************//** + * @file rtc.c + * @brief RTC driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + + +/** @cond HIDDEN_SYMBOLS */ + +/*---------------------------------------------------------------------------------------------------------*/ +/* Macro, type and constant definitions */ +/*---------------------------------------------------------------------------------------------------------*/ +#define RTC_GLOBALS + +/*---------------------------------------------------------------------------------------------------------*/ +/* Global file scope (static) variables */ +/*---------------------------------------------------------------------------------------------------------*/ +static volatile uint32_t g_u32hiYear, g_u32loYear, g_u32hiMonth, g_u32loMonth, g_u32hiDay, g_u32loDay; +static volatile uint32_t g_u32hiHour, g_u32loHour, g_u32hiMin, g_u32loMin, g_u32hiSec, g_u32loSec; + +/** @endcond HIDDEN_SYMBOLS */ + + + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup RTC_Driver RTC Driver + @{ +*/ + +/** @addtogroup RTC_EXPORTED_FUNCTIONS RTC Exported Functions + @{ +*/ + +/** + * @brief Initialize RTC module and start counting + * + * @param[in] sPt Specify the time property and current date and time. It includes: \n + * u32Year: Year value, range between 2000 ~ 2099. \n + * u32Month: Month value, range between 1 ~ 12. \n + * u32Day: Day value, range between 1 ~ 31. \n + * u32DayOfWeek: Day of the week. [RTC_SUNDAY / RTC_MONDAY / RTC_TUESDAY / + * RTC_WEDNESDAY / RTC_THURSDAY / RTC_FRIDAY / + * RTC_SATURDAY] \n + * u32Hour: Hour value, range between 0 ~ 23. \n + * u32Minute: Minute value, range between 0 ~ 59. \n + * u32Second: Second value, range between 0 ~ 59. \n + * u32TimeScale: [RTC_CLOCK_12 / RTC_CLOCK_24] \n + * u8AmPm: [RTC_AM / RTC_PM] \n + * + * @return None + * + * @details This function is used to: \n + * 1. Write initial key to let RTC start count. \n + * 2. Input parameter indicates start date/time. \n + * 3. User has to make sure that parameters of RTC date/time are reasonable. \n + * @note Null pointer for using default starting date/time. + */ +int32_t RTC_Open(S_RTC_TIME_DATA_T *sPt) +{ + RTC->INIT = RTC_INIT_KEY; + if (RTC->INIT != RTC_INIT_ACTIVE_Msk) + { + uint32_t u32Timeout = 10000000ul; + + RTC->INIT = RTC_INIT_KEY; + while ((u32Timeout > 0) && (RTC->INIT != RTC_INIT_ACTIVE_Msk)) + { + u32Timeout--; + } + if (u32Timeout == 0) return -1; + } + + if (sPt == 0) + { + } + else + { + /* Set RTC date and time */ + RTC_SetDateAndTime(sPt); + } + return 0; +} + +/** + * @brief Disable RTC Clock + * + * @param None + * + * @return None + * + * @details This API will disable RTC peripheral clock and stops RTC counting. + */ +void RTC_Close(void) +{ + CLK->APBCLK0 &= ~CLK_APBCLK0_RTCCKEN_Msk; +} + +/** + * @brief Get Current RTC Date and Time + * + * @param[out] sPt The returned pointer is specified the current RTC value. It includes: \n + * u32Year: Year value \n + * u32Month: Month value \n + * u32Day: Day value \n + * u32DayOfWeek: Day of week \n + * u32Hour: Hour value \n + * u32Minute: Minute value \n + * u32Second: Second value \n + * u32TimeScale: [RTC_CLOCK_12 / RTC_CLOCK_24] \n + * u8AmPm: [RTC_AM / RTC_PM] \n + * + * @return None + * + * @details This API is used to get the current RTC date and time value. + */ +void RTC_GetDateAndTime(S_RTC_TIME_DATA_T *sPt) +{ + uint32_t u32Tmp; + + sPt->u32TimeScale = RTC->CLKFMT & RTC_CLKFMT_24HEN_Msk; /* 12/24-hour */ + sPt->u32DayOfWeek = RTC->WEEKDAY & RTC_WEEKDAY_WEEKDAY_Msk; /* Day of the week */ + + /* Get [Date digit] data */ + g_u32hiYear = (RTC->CAL & RTC_CAL_TENYEAR_Msk) >> RTC_CAL_TENYEAR_Pos; + g_u32loYear = (RTC->CAL & RTC_CAL_YEAR_Msk) >> RTC_CAL_YEAR_Pos; + g_u32hiMonth = (RTC->CAL & RTC_CAL_TENMON_Msk) >> RTC_CAL_TENMON_Pos; + g_u32loMonth = (RTC->CAL & RTC_CAL_MON_Msk) >> RTC_CAL_MON_Pos; + g_u32hiDay = (RTC->CAL & RTC_CAL_TENDAY_Msk) >> RTC_CAL_TENDAY_Pos; + g_u32loDay = (RTC->CAL & RTC_CAL_DAY_Msk) >> RTC_CAL_DAY_Pos; + + /* Get [Time digit] data */ + g_u32hiHour = (RTC->TIME & RTC_TIME_TENHR_Msk) >> RTC_TIME_TENHR_Pos; + g_u32loHour = (RTC->TIME & RTC_TIME_HR_Msk) >> RTC_TIME_HR_Pos; + g_u32hiMin = (RTC->TIME & RTC_TIME_TENMIN_Msk) >> RTC_TIME_TENMIN_Pos; + g_u32loMin = (RTC->TIME & RTC_TIME_MIN_Msk) >> RTC_TIME_MIN_Pos; + g_u32hiSec = (RTC->TIME & RTC_TIME_TENSEC_Msk) >> RTC_TIME_TENSEC_Pos; + g_u32loSec = (RTC->TIME & RTC_TIME_SEC_Msk) >> RTC_TIME_SEC_Pos; + + /* Compute to 20XX year */ + u32Tmp = (g_u32hiYear * 10ul); + u32Tmp += g_u32loYear; + sPt->u32Year = u32Tmp + RTC_YEAR2000; + + /* Compute 0~12 month */ + u32Tmp = (g_u32hiMonth * 10ul); + sPt->u32Month = u32Tmp + g_u32loMonth; + + /* Compute 0~31 day */ + u32Tmp = (g_u32hiDay * 10ul); + sPt->u32Day = u32Tmp + g_u32loDay; + + /* Compute 12/24 hour */ + if (sPt->u32TimeScale == RTC_CLOCK_12) + { + u32Tmp = (g_u32hiHour * 10ul); + u32Tmp += g_u32loHour; + sPt->u32Hour = u32Tmp; /* AM: 1~12. PM: 21~32. */ + + if (sPt->u32Hour >= 21ul) + { + sPt->u32AmPm = RTC_PM; + sPt->u32Hour -= 20ul; + } + else + { + sPt->u32AmPm = RTC_AM; + } + + u32Tmp = (g_u32hiMin * 10ul); + u32Tmp += g_u32loMin; + sPt->u32Minute = u32Tmp; + + u32Tmp = (g_u32hiSec * 10ul); + u32Tmp += g_u32loSec; + sPt->u32Second = u32Tmp; + } + else + { + u32Tmp = (g_u32hiHour * 10ul); + u32Tmp += g_u32loHour; + sPt->u32Hour = u32Tmp; + + u32Tmp = (g_u32hiMin * 10ul); + u32Tmp += g_u32loMin; + sPt->u32Minute = u32Tmp; + + u32Tmp = (g_u32hiSec * 10ul); + u32Tmp += g_u32loSec; + sPt->u32Second = u32Tmp; + } +} + +/** + * @brief Get RTC Alarm Date and Time + * + * @param[out] sPt The returned pointer is specified the RTC alarm value. It includes: \n + * u32Year: Year value \n + * u32Month: Month value \n + * u32Day: Day value \n + * u32DayOfWeek: Day of week \n + * u32Hour: Hour value \n + * u32Minute: Minute value \n + * u32Second: Second value \n + * u32TimeScale: [RTC_CLOCK_12 / RTC_CLOCK_24] \n + * u8AmPm: [RTC_AM / RTC_PM] \n + * + * @return None + * + * @details This API is used to get the RTC alarm date and time setting. + */ +void RTC_GetAlarmDateAndTime(S_RTC_TIME_DATA_T *sPt) +{ + uint32_t u32Tmp; + + sPt->u32TimeScale = RTC->CLKFMT & RTC_CLKFMT_24HEN_Msk; /* 12/24-hour */ + sPt->u32DayOfWeek = RTC->WEEKDAY & RTC_WEEKDAY_WEEKDAY_Msk; /* Day of the week */ + + /* Get alarm [Date digit] data */ + g_u32hiYear = (REG_RTC_CALM & RTC_CALM_TENYEAR_Msk) >> RTC_CALM_TENYEAR_Pos; + g_u32loYear = (REG_RTC_CALM & RTC_CALM_YEAR_Msk) >> RTC_CALM_YEAR_Pos; + g_u32hiMonth = (REG_RTC_CALM & RTC_CALM_TENMON_Msk) >> RTC_CALM_TENMON_Pos; + g_u32loMonth = (REG_RTC_CALM & RTC_CALM_MON_Msk) >> RTC_CALM_MON_Pos; + g_u32hiDay = (REG_RTC_CALM & RTC_CALM_TENDAY_Msk) >> RTC_CALM_TENDAY_Pos; + g_u32loDay = (REG_RTC_CALM & RTC_CALM_DAY_Msk) >> RTC_CALM_DAY_Pos; + + /* Get alarm [Time digit] data */ + g_u32hiHour = (REG_RTC_TALM & RTC_TALM_TENHR_Msk) >> RTC_TALM_TENHR_Pos; + g_u32loHour = (REG_RTC_TALM & RTC_TALM_HR_Msk) >> RTC_TALM_HR_Pos; + g_u32hiMin = (REG_RTC_TALM & RTC_TALM_TENMIN_Msk) >> RTC_TALM_TENMIN_Pos; + g_u32loMin = (REG_RTC_TALM & RTC_TALM_MIN_Msk) >> RTC_TALM_MIN_Pos; + g_u32hiSec = (REG_RTC_TALM & RTC_TALM_TENSEC_Msk) >> RTC_TALM_TENSEC_Pos; + g_u32loSec = (REG_RTC_TALM & RTC_TALM_SEC_Msk) >> RTC_TALM_SEC_Pos; + + /* Compute to 20XX year */ + u32Tmp = (g_u32hiYear * 10ul); + u32Tmp += g_u32loYear; + sPt->u32Year = u32Tmp + RTC_YEAR2000; + + /* Compute 0~12 month */ + u32Tmp = (g_u32hiMonth * 10ul); + sPt->u32Month = u32Tmp + g_u32loMonth; + + /* Compute 0~31 day */ + u32Tmp = (g_u32hiDay * 10ul); + sPt->u32Day = u32Tmp + g_u32loDay; + + /* Compute 12/24 hour */ + if (sPt->u32TimeScale == RTC_CLOCK_12) + { + u32Tmp = (g_u32hiHour * 10ul); + u32Tmp += g_u32loHour; + sPt->u32Hour = u32Tmp; /* AM: 1~12. PM: 21~32. */ + + if (sPt->u32Hour >= 21ul) + { + sPt->u32AmPm = RTC_PM; + sPt->u32Hour -= 20ul; + } + else + { + sPt->u32AmPm = RTC_AM; + } + + u32Tmp = (g_u32hiMin * 10ul); + u32Tmp += g_u32loMin; + sPt->u32Minute = u32Tmp; + + u32Tmp = (g_u32hiSec * 10ul); + u32Tmp += g_u32loSec; + sPt->u32Second = u32Tmp; + + } + else + { + u32Tmp = (g_u32hiHour * 10ul); + u32Tmp += g_u32loHour; + sPt->u32Hour = u32Tmp; + + u32Tmp = (g_u32hiMin * 10ul); + u32Tmp += g_u32loMin; + sPt->u32Minute = u32Tmp; + + u32Tmp = (g_u32hiSec * 10ul); + u32Tmp += g_u32loSec; + sPt->u32Second = u32Tmp; + } +} + +/** + * @brief Update Current RTC Date and Time + * + * @param[in] sPt Specify the time property and current date and time. It includes: \n + * u32Year: Year value, range between 2000 ~ 2099. \n + * u32Month: Month value, range between 1 ~ 12. \n + * u32Day: Day value, range between 1 ~ 31. \n + * u32DayOfWeek: Day of the week. [RTC_SUNDAY / RTC_MONDAY / RTC_TUESDAY / + * RTC_WEDNESDAY / RTC_THURSDAY / RTC_FRIDAY / + * RTC_SATURDAY] \n + * u32Hour: Hour value, range between 0 ~ 23. \n + * u32Minute: Minute value, range between 0 ~ 59. \n + * u32Second: Second value, range between 0 ~ 59. \n + * u32TimeScale: [RTC_CLOCK_12 / RTC_CLOCK_24] \n + * u8AmPm: [RTC_AM / RTC_PM] \n + * + * @return None + * + * @details This API is used to update current date and time to RTC. + */ +void RTC_SetDateAndTime(S_RTC_TIME_DATA_T *sPt) +{ + uint32_t u32RegCAL, u32RegTIME; + + if (sPt == 0ul) + { + } + else + { +#if !defined(USE_MA35D1_SUBM) + /*-----------------------------------------------------------------------------------------------------*/ + /* Set RTC 24/12 hour setting and Day of the Week */ + /*-----------------------------------------------------------------------------------------------------*/ + if (sPt->u32TimeScale == RTC_CLOCK_12) + { + RTC->CLKFMT &= ~RTC_CLKFMT_24HEN_Msk; + + /*-------------------------------------------------------------------------------------------------*/ + /* Important, range of 12-hour PM mode is 21 up to 32 */ + /*-------------------------------------------------------------------------------------------------*/ + if (sPt->u32AmPm == RTC_PM) + { + sPt->u32Hour += 20ul; + } + } + else + { + RTC->CLKFMT |= RTC_CLKFMT_24HEN_Msk; + } +#endif + + /* Set Day of the Week */ + RTC->WEEKDAY = sPt->u32DayOfWeek; + + /*-----------------------------------------------------------------------------------------------------*/ + /* Set RTC Current Date and Time */ + /*-----------------------------------------------------------------------------------------------------*/ + u32RegCAL = ((sPt->u32Year - RTC_YEAR2000) / 10ul) << 20; + u32RegCAL |= (((sPt->u32Year - RTC_YEAR2000) % 10ul) << 16); + u32RegCAL |= ((sPt->u32Month / 10ul) << 12); + u32RegCAL |= ((sPt->u32Month % 10ul) << 8); + u32RegCAL |= ((sPt->u32Day / 10ul) << 4); + u32RegCAL |= (sPt->u32Day % 10ul); + + u32RegTIME = ((sPt->u32Hour / 10ul) << 20); + u32RegTIME |= ((sPt->u32Hour % 10ul) << 16); + u32RegTIME |= ((sPt->u32Minute / 10ul) << 12); + u32RegTIME |= ((sPt->u32Minute % 10ul) << 8); + u32RegTIME |= ((sPt->u32Second / 10ul) << 4); + u32RegTIME |= (sPt->u32Second % 10ul); + + /*-----------------------------------------------------------------------------------------------------*/ + /* Set RTC Calender and Time Loading */ + /*-----------------------------------------------------------------------------------------------------*/ + RTC->CAL = (uint32_t)u32RegCAL; + RTC->TIME = (uint32_t)u32RegTIME; + } +} + +/** + * @brief Update RTC Alarm Date and Time + * + * @param[in] sPt Specify the time property and alarm date and time. It includes: \n + * u32Year: Year value, range between 2000 ~ 2099. \n + * u32Month: Month value, range between 1 ~ 12. \n + * u32Day: Day value, range between 1 ~ 31. \n + * u32DayOfWeek: Day of the week. [RTC_SUNDAY / RTC_MONDAY / RTC_TUESDAY / + * RTC_WEDNESDAY / RTC_THURSDAY / RTC_FRIDAY / + * RTC_SATURDAY] \n + * u32Hour: Hour value, range between 0 ~ 23. \n + * u32Minute: Minute value, range between 0 ~ 59. \n + * u32Second: Second value, range between 0 ~ 59. \n + * u32TimeScale: [RTC_CLOCK_12 / RTC_CLOCK_24] \n + * u8AmPm: [RTC_AM / RTC_PM] \n + * + * @return None + * + * @details This API is used to update alarm date and time setting to RTC. + */ +void RTC_SetAlarmDateAndTime(S_RTC_TIME_DATA_T *sPt) +{ + uint32_t u32RegCALM, u32RegTALM; + + if (sPt == 0) + { + } + else + { +#if !defined(USE_MA35D1_SUBM) + /*-----------------------------------------------------------------------------------------------------*/ + /* Set RTC 24/12 hour setting and Day of the Week */ + /*-----------------------------------------------------------------------------------------------------*/ + if (sPt->u32TimeScale == RTC_CLOCK_12) + { + RTC->CLKFMT &= ~RTC_CLKFMT_24HEN_Msk; + + /*-------------------------------------------------------------------------------------------------*/ + /* Important, range of 12-hour PM mode is 21 up to 32 */ + /*-------------------------------------------------------------------------------------------------*/ + if (sPt->u32AmPm == RTC_PM) + { + sPt->u32Hour += 20ul; + } + } + else + { + RTC->CLKFMT |= RTC_CLKFMT_24HEN_Msk; + } +#endif + + /*-----------------------------------------------------------------------------------------------------*/ + /* Set RTC Alarm Date and Time */ + /*-----------------------------------------------------------------------------------------------------*/ + u32RegCALM = ((sPt->u32Year - RTC_YEAR2000) / 10ul) << 20; + u32RegCALM |= (((sPt->u32Year - RTC_YEAR2000) % 10ul) << 16); + u32RegCALM |= ((sPt->u32Month / 10ul) << 12); + u32RegCALM |= ((sPt->u32Month % 10ul) << 8); + u32RegCALM |= ((sPt->u32Day / 10ul) << 4); + u32RegCALM |= (sPt->u32Day % 10ul); + + u32RegTALM = ((sPt->u32Hour / 10ul) << 20); + u32RegTALM |= ((sPt->u32Hour % 10ul) << 16); + u32RegTALM |= ((sPt->u32Minute / 10ul) << 12); + u32RegTALM |= ((sPt->u32Minute % 10ul) << 8); + u32RegTALM |= ((sPt->u32Second / 10ul) << 4); + u32RegTALM |= (sPt->u32Second % 10ul); + + REG_RTC_CALM = (uint32_t)u32RegCALM; + REG_RTC_TALM = (uint32_t)u32RegTALM; + } +} + +/** + * @brief Update RTC Current Date + * + * @param[in] u32Year The year calendar digit of current RTC setting. + * @param[in] u32Month The month calendar digit of current RTC setting. + * @param[in] u32Day The day calendar digit of current RTC setting. + * @param[in] u32DayOfWeek The Day of the week. [RTC_SUNDAY / RTC_MONDAY / RTC_TUESDAY / + * RTC_WEDNESDAY / RTC_THURSDAY / RTC_FRIDAY / + * RTC_SATURDAY] + * + * @return None + * + * @details This API is used to update current date to RTC. + */ +void RTC_SetDate(uint32_t u32Year, uint32_t u32Month, uint32_t u32Day, uint32_t u32DayOfWeek) +{ + uint32_t u32RegCAL; + + u32RegCAL = ((u32Year - RTC_YEAR2000) / 10ul) << 20; + u32RegCAL |= (((u32Year - RTC_YEAR2000) % 10ul) << 16); + u32RegCAL |= ((u32Month / 10ul) << 12); + u32RegCAL |= ((u32Month % 10ul) << 8); + u32RegCAL |= ((u32Day / 10ul) << 4); + u32RegCAL |= (u32Day % 10ul); + + /* Set Day of the Week */ + RTC->WEEKDAY = u32DayOfWeek & RTC_WEEKDAY_WEEKDAY_Msk; + + /* Set RTC Calender Loading */ + RTC->CAL = (uint32_t)u32RegCAL; +} + +/** + * @brief Update RTC Current Time + * + * @param[in] u32Hour The hour time digit of current RTC setting. + * @param[in] u32Minute The minute time digit of current RTC setting. + * @param[in] u32Second The second time digit of current RTC setting. + * @param[in] u32TimeMode The 24-Hour / 12-Hour Time Scale Selection. [RTC_CLOCK_12 / RTC_CLOCK_24] + * @param[in] u32AmPm 12-hour time scale with AM and PM indication. Only Time Scale select 12-hour used. [RTC_AM / RTC_PM] + * + * @return None + * + * @details This API is used to update current time to RTC. + */ +void RTC_SetTime(uint32_t u32Hour, uint32_t u32Minute, uint32_t u32Second, uint32_t u32TimeMode, uint32_t u32AmPm) +{ + uint32_t u32RegTIME; + + /* Important, range of 12-hour PM mode is 21 up to 32 */ + if ((u32TimeMode == RTC_CLOCK_12) && (u32AmPm == RTC_PM)) + { + u32Hour += 20ul; + } + + u32RegTIME = ((u32Hour / 10ul) << 20); + u32RegTIME |= ((u32Hour % 10ul) << 16); + u32RegTIME |= ((u32Minute / 10ul) << 12); + u32RegTIME |= ((u32Minute % 10ul) << 8); + u32RegTIME |= ((u32Second / 10ul) << 4); + u32RegTIME |= (u32Second % 10ul); + +#if !defined(USE_MA35D1_SUBM) + /*-----------------------------------------------------------------------------------------------------*/ + /* Set RTC 24/12 hour setting and Day of the Week */ + /*-----------------------------------------------------------------------------------------------------*/ + if (u32TimeMode == RTC_CLOCK_12) + { + RTC->CLKFMT &= ~RTC_CLKFMT_24HEN_Msk; + } + else + { + RTC->CLKFMT |= RTC_CLKFMT_24HEN_Msk; + } +#endif + + RTC->TIME = (uint32_t)u32RegTIME; +} + +/** + * @brief Update RTC Alarm Date + * + * @param[in] u32Year The year calendar digit of RTC alarm setting. + * @param[in] u32Month The month calendar digit of RTC alarm setting. + * @param[in] u32Day The day calendar digit of RTC alarm setting. + * + * @return None + * + * @details This API is used to update alarm date setting to RTC. + */ +void RTC_SetAlarmDate(uint32_t u32Year, uint32_t u32Month, uint32_t u32Day) +{ + uint32_t u32RegCALM; + + u32RegCALM = ((u32Year - RTC_YEAR2000) / 10ul) << 20; + u32RegCALM |= (((u32Year - RTC_YEAR2000) % 10ul) << 16); + u32RegCALM |= ((u32Month / 10ul) << 12); + u32RegCALM |= ((u32Month % 10ul) << 8); + u32RegCALM |= ((u32Day / 10ul) << 4); + u32RegCALM |= (u32Day % 10ul); + + /* Set RTC Alarm Date */ + REG_RTC_CALM = (uint32_t)u32RegCALM; +} + +/** + * @brief Update RTC Alarm Time + * + * @param[in] u32Hour The hour time digit of RTC alarm setting. + * @param[in] u32Minute The minute time digit of RTC alarm setting. + * @param[in] u32Second The second time digit of RTC alarm setting. + * @param[in] u32TimeMode The 24-Hour / 12-Hour Time Scale Selection. [RTC_CLOCK_12 / RTC_CLOCK_24] + * @param[in] u32AmPm 12-hour time scale with AM and PM indication. Only Time Scale select 12-hour used. [RTC_AM / RTC_PM] + * + * @return None + * + * @details This API is used to update alarm time setting to RTC. + */ +void RTC_SetAlarmTime(uint32_t u32Hour, uint32_t u32Minute, uint32_t u32Second, uint32_t u32TimeMode, uint32_t u32AmPm) +{ + uint32_t u32RegTALM; + + /* Important, range of 12-hour PM mode is 21 up to 32 */ + if ((u32TimeMode == RTC_CLOCK_12) && (u32AmPm == RTC_PM)) + { + u32Hour += 20ul; + } + + u32RegTALM = ((u32Hour / 10ul) << 20); + u32RegTALM |= ((u32Hour % 10ul) << 16); + u32RegTALM |= ((u32Minute / 10ul) << 12); + u32RegTALM |= ((u32Minute % 10ul) << 8); + u32RegTALM |= ((u32Second / 10ul) << 4); + u32RegTALM |= (u32Second % 10ul); + +#if !defined(USE_MA35D1_SUBM) + /*-----------------------------------------------------------------------------------------------------*/ + /* Set RTC 24/12 hour setting and Day of the Week */ + /*-----------------------------------------------------------------------------------------------------*/ + if (u32TimeMode == RTC_CLOCK_12) + { + RTC->CLKFMT &= ~RTC_CLKFMT_24HEN_Msk; + } + else + { + RTC->CLKFMT |= RTC_CLKFMT_24HEN_Msk; + } +#endif + + /* Set RTC Alarm Time */ + REG_RTC_TALM = (uint32_t)u32RegTALM; +} + +/** + * @brief Set RTC Alarm Date Mask Function + * + * @param[in] u8IsTenYMsk 1: enable 10-Year digit alarm mask; 0: disabled. + * @param[in] u8IsYMsk 1: enable 1-Year digit alarm mask; 0: disabled. + * @param[in] u8IsTenMMsk 1: enable 10-Mon digit alarm mask; 0: disabled. + * @param[in] u8IsMMsk 1: enable 1-Mon digit alarm mask; 0: disabled. + * @param[in] u8IsTenDMsk 1: enable 10-Day digit alarm mask; 0: disabled. + * @param[in] u8IsDMsk 1: enable 1-Day digit alarm mask; 0: disabled. + * + * @return None + * + * @details This API is used to enable or disable RTC alarm date mask function. + */ +void RTC_SetAlarmDateMask(uint8_t u8IsTenYMsk, uint8_t u8IsYMsk, uint8_t u8IsTenMMsk, uint8_t u8IsMMsk, uint8_t u8IsTenDMsk, uint8_t u8IsDMsk) +{ + REG_RTC_CAMSK = ((uint32_t)u8IsTenYMsk << RTC_CAMSK_MTENYEAR_Pos) | + ((uint32_t)u8IsYMsk << RTC_CAMSK_MYEAR_Pos) | + ((uint32_t)u8IsTenMMsk << RTC_CAMSK_MTENMON_Pos) | + ((uint32_t)u8IsMMsk << RTC_CAMSK_MMON_Pos) | + ((uint32_t)u8IsTenDMsk << RTC_CAMSK_MTENDAY_Pos) | + ((uint32_t)u8IsDMsk << RTC_CAMSK_MDAY_Pos); +} + +/** + * @brief Set RTC Alarm Time Mask Function + * + * @param[in] u8IsTenHMsk 1: enable 10-Hour digit alarm mask; 0: disabled. + * @param[in] u8IsHMsk 1: enable 1-Hour digit alarm mask; 0: disabled. + * @param[in] u8IsTenMMsk 1: enable 10-Min digit alarm mask; 0: disabled. + * @param[in] u8IsMMsk 1: enable 1-Min digit alarm mask; 0: disabled. + * @param[in] u8IsTenSMsk 1: enable 10-Sec digit alarm mask; 0: disabled. + * @param[in] u8IsSMsk 1: enable 1-Sec digit alarm mask; 0: disabled. + * + * @return None + * + * @details This API is used to enable or disable RTC alarm time mask function. + */ +void RTC_SetAlarmTimeMask(uint8_t u8IsTenHMsk, uint8_t u8IsHMsk, uint8_t u8IsTenMMsk, uint8_t u8IsMMsk, uint8_t u8IsTenSMsk, uint8_t u8IsSMsk) +{ + REG_RTC_TAMSK = ((uint32_t)u8IsTenHMsk << RTC_TAMSK_MTENHR_Pos) | + ((uint32_t)u8IsHMsk << RTC_TAMSK_MHR_Pos) | + ((uint32_t)u8IsTenMMsk << RTC_TAMSK_MTENMIN_Pos) | + ((uint32_t)u8IsMMsk << RTC_TAMSK_MMIN_Pos) | + ((uint32_t)u8IsTenSMsk << RTC_TAMSK_MTENSEC_Pos) | + ((uint32_t)u8IsSMsk << RTC_TAMSK_MSEC_Pos); +} + +/** + * @brief Get Day of the Week + * + * @param None + * + * @retval 0 Sunday + * @retval 1 Monday + * @retval 2 Tuesday + * @retval 3 Wednesday + * @retval 4 Thursday + * @retval 5 Friday + * @retval 6 Saturday + * + * @details This API is used to get day of the week of current RTC date. + */ +uint32_t RTC_GetDayOfWeek(void) +{ + return (RTC->WEEKDAY & RTC_WEEKDAY_WEEKDAY_Msk); +} + +/** + * @brief Set RTC Tick Period Time + * + * @param[in] u32TickSelection It is used to set the RTC tick period time for Periodic Time Tick request. \n + * It consists of: + * - \ref RTC_TICK_1_SEC : Time tick is 1 second + * - \ref RTC_TICK_1_2_SEC : Time tick is 1/2 second + * - \ref RTC_TICK_1_4_SEC : Time tick is 1/4 second + * - \ref RTC_TICK_1_8_SEC : Time tick is 1/8 second + * - \ref RTC_TICK_1_16_SEC : Time tick is 1/16 second + * - \ref RTC_TICK_1_32_SEC : Time tick is 1/32 second + * - \ref RTC_TICK_1_64_SEC : Time tick is 1/64 second + * - \ref RTC_TICK_1_128_SEC : Time tick is 1/128 second + * + * @return None + * + * @details This API is used to set RTC tick period time for each tick interrupt. + */ +void RTC_SetTickPeriod(uint32_t u32TickSelection) +{ + REG_RTC_TICK = (REG_RTC_TICK & ~RTC_TICK_TICK_Msk) | u32TickSelection; +} + +/** + * @brief Enable RTC Interrupt + * + * @param[in] u32IntFlagMask Specify the interrupt source. It consists of: + * - \ref RTC_INTEN_ALMIEN_Msk : Alarm interrupt + * - \ref RTC_INTEN_TICKIEN_Msk : Tick interrupt + * + * @return None + * + * @details This API is used to enable the specify RTC interrupt function. + */ +void RTC_EnableInt(uint32_t u32IntFlagMask) +{ + REG_RTC_INTEN |= u32IntFlagMask; +} + +/** + * @brief Disable RTC Interrupt + * + * @param[in] u32IntFlagMask Specify the interrupt source. It consists of: + * - \ref RTC_INTEN_ALMIEN_Msk : Alarm interrupt + * - \ref RTC_INTEN_TICKIEN_Msk : Tick interrupt + * + * @return None + * + * @details This API is used to disable the specify RTC interrupt function. + */ +void RTC_DisableInt(uint32_t u32IntFlagMask) +{ + REG_RTC_INTEN &= ~u32IntFlagMask; + REG_RTC_INTSTS = u32IntFlagMask; +} + + +/*@}*/ /* end of group RTC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group RTC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sc.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sc.c new file mode 100644 index 0000000000..f3286844dd --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sc.c @@ -0,0 +1,368 @@ +/**************************************************************************//** + * @file sc.c + * @brief Smartcard(SC) driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + +/* Below are variables used locally by SC driver and does not want to parse by doxygen unless HIDDEN_SYMBOLS is defined */ +/** @cond HIDDEN_SYMBOLS */ +static uint32_t u32CardStateIgnore[SC_INTERFACE_NUM] = {0UL, 0UL}; + +/** @endcond HIDDEN_SYMBOLS */ + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup SC_Driver SC Driver + @{ +*/ + +/** @addtogroup SC_EXPORTED_FUNCTIONS SC Exported Functions + @{ +*/ + +/** + * @brief This function indicates specified smartcard slot status + * @param[in] sc Base address of smartcard module + * @return Card insert status + * @retval TRUE Card insert + * @retval FALSE Card remove + */ +uint32_t SC_IsCardInserted(SC_T *sc) +{ + uint32_t ret; + /* put conditions into two variable to remove IAR compilation warning */ + uint32_t cond1 = ((sc->STATUS & SC_STATUS_CDPINSTS_Msk) >> SC_STATUS_CDPINSTS_Pos); + uint32_t cond2 = ((sc->CTL & SC_CTL_CDLV_Msk) >> SC_CTL_CDLV_Pos); + + if ((sc == SC0) && (u32CardStateIgnore[0] == 1UL)) + { + ret = (uint32_t)TRUE; + } + else if ((sc == SC1) && (u32CardStateIgnore[1] == 1UL)) + { + ret = (uint32_t)TRUE; + } + else if (cond1 != cond2) + { + ret = (uint32_t)FALSE; + } + else + { + ret = (uint32_t)TRUE; + } + return ret; +} + +/** + * @brief This function reset both transmit and receive FIFO of specified smartcard module + * @param[in] sc Base address of smartcard module + * @return None + */ +void SC_ClearFIFO(SC_T *sc) +{ + while (sc->ALTCTL & SC_ALTCTL_SYNC_Msk) + { + ; + } + sc->ALTCTL |= (SC_ALTCTL_TXRST_Msk | SC_ALTCTL_RXRST_Msk); +} + +/** + * @brief This function disable specified smartcard module + * @param[in] sc Base address of smartcard module + * @return None + */ +void SC_Close(SC_T *sc) +{ + sc->INTEN = 0UL; + while (sc->PINCTL & SC_PINCTL_SYNC_Msk) + { + ; + } + sc->PINCTL = 0UL; + sc->ALTCTL = 0UL; + while (sc->CTL & SC_CTL_SYNC_Msk) + { + ; + } + sc->CTL = 0UL; +} + +/** + * @brief This function initialized smartcard module + * @param[in] sc Base address of smartcard module + * @param[in] u32CardDet Card detect polarity, select the CD pin state which indicates card absent. Could be + * -\ref SC_PIN_STATE_HIGH + * -\ref SC_PIN_STATE_LOW + * -\ref SC_PIN_STATE_IGNORE, no card detect pin, always assumes card present + * @param[in] u32PWR Power on polarity, select the PWR pin state which could set smartcard VCC to high level. Could be + * -\ref SC_PIN_STATE_HIGH + * -\ref SC_PIN_STATE_LOW + * @return None + */ +void SC_Open(SC_T *sc, uint32_t u32CardDet, uint32_t u32PWR) +{ + uint32_t u32Reg = 0UL, u32Intf; + + if (sc == SC0) + { + u32Intf = 0UL; + } + else + { + u32Intf = 1UL; + } + + if (u32CardDet != SC_PIN_STATE_IGNORE) + { + u32Reg = u32CardDet ? 0UL : SC_CTL_CDLV_Msk; + u32CardStateIgnore[u32Intf] = 0UL; + } + else + { + u32CardStateIgnore[u32Intf] = 1UL; + } + sc->PINCTL = u32PWR ? 0UL : SC_PINCTL_PWRINV_Msk; + while (sc->CTL & SC_CTL_SYNC_Msk) + { + ; + } + sc->CTL = SC_CTL_SCEN_Msk | SC_CTL_TMRSEL_Msk | u32Reg; +} + +/** + * @brief This function reset specified smartcard module to its default state for activate smartcard + * @param[in] sc Base address of smartcard module + * @return None + */ +void SC_ResetReader(SC_T *sc) +{ + uint32_t u32Intf; + + if (sc == SC0) + { + u32Intf = 0UL; + } + else + { + u32Intf = 1UL; + } + + /* Reset FIFO, enable auto de-activation while card removal */ + sc->ALTCTL |= (SC_ALTCTL_TXRST_Msk | SC_ALTCTL_RXRST_Msk | SC_ALTCTL_ADACEN_Msk); + /* Set Rx trigger level to 1 character, longest card detect debounce period, disable error retry (EMV ATR does not use error retry) */ + while (sc->CTL & SC_CTL_SYNC_Msk) + { + ; + } + sc->CTL &= ~(SC_CTL_RXTRGLV_Msk | + SC_CTL_CDDBSEL_Msk | + SC_CTL_TXRTY_Msk | + SC_CTL_TXRTYEN_Msk | + SC_CTL_RXRTY_Msk | + SC_CTL_RXRTYEN_Msk); + while (sc->CTL & SC_CTL_SYNC_Msk) + { + ; + } + /* Enable auto convention, and all three smartcard internal timers */ + sc->CTL |= SC_CTL_AUTOCEN_Msk | SC_CTL_TMRSEL_Msk; + /* Disable Rx timeout */ + sc->RXTOUT = 0UL; + /* 372 clocks per ETU by default */ + sc->ETUCTL = 371UL; + + + /* Enable necessary interrupt for smartcard operation */ + if (u32CardStateIgnore[u32Intf]) /* Do not enable card detect interrupt if card present state ignore */ + { + sc->INTEN = (SC_INTEN_RDAIEN_Msk | + SC_INTEN_TERRIEN_Msk | + SC_INTEN_TMR0IEN_Msk | + SC_INTEN_TMR1IEN_Msk | + SC_INTEN_TMR2IEN_Msk | + SC_INTEN_BGTIEN_Msk | + SC_INTEN_ACERRIEN_Msk); + } + else + { + sc->INTEN = (SC_INTEN_RDAIEN_Msk | + SC_INTEN_TERRIEN_Msk | + SC_INTEN_TMR0IEN_Msk | + SC_INTEN_TMR1IEN_Msk | + SC_INTEN_TMR2IEN_Msk | + SC_INTEN_BGTIEN_Msk | + SC_INTEN_CDIEN_Msk | + SC_INTEN_ACERRIEN_Msk); + } + return; +} + +/** + * @brief This function block guard time (BGT) of specified smartcard module + * @param[in] sc Base address of smartcard module + * @param[in] u32BGT Block guard time using ETU as unit, valid range are between 1 ~ 32 + * @return None + */ +void SC_SetBlockGuardTime(SC_T *sc, uint32_t u32BGT) +{ + sc->CTL = (sc->CTL & ~SC_CTL_BGT_Msk) | ((u32BGT - 1UL) << SC_CTL_BGT_Pos); +} + +/** + * @brief This function character guard time (CGT) of specified smartcard module + * @param[in] sc Base address of smartcard module + * @param[in] u32CGT Character guard time using ETU as unit, valid range are between 11 ~ 267 + * @return None + */ +void SC_SetCharGuardTime(SC_T *sc, uint32_t u32CGT) +{ + u32CGT -= sc->CTL & SC_CTL_NSB_Msk ? 11UL : 12UL; + sc->EGT = u32CGT; +} + +/** + * @brief This function stop all smartcard timer of specified smartcard module + * @param[in] sc Base address of smartcard module + * @return None + * @note This function stop the timers within smartcard module, \b not timer module + */ +void SC_StopAllTimer(SC_T *sc) +{ + while (sc->ALTCTL & SC_ALTCTL_SYNC_Msk) + { + ; + } + sc->ALTCTL &= ~(SC_ALTCTL_CNTEN0_Msk | SC_ALTCTL_CNTEN1_Msk | SC_ALTCTL_CNTEN2_Msk); +} + +/** + * @brief This function configure and start a smartcard timer of specified smartcard module + * @param[in] sc Base address of smartcard module + * @param[in] u32TimerNum Timer to start. Valid values are 0, 1, 2. + * @param[in] u32Mode Timer operating mode, valid values are: + * - \ref SC_TMR_MODE_0 + * - \ref SC_TMR_MODE_1 + * - \ref SC_TMR_MODE_2 + * - \ref SC_TMR_MODE_3 + * - \ref SC_TMR_MODE_4 + * - \ref SC_TMR_MODE_5 + * - \ref SC_TMR_MODE_6 + * - \ref SC_TMR_MODE_7 + * - \ref SC_TMR_MODE_8 + * - \ref SC_TMR_MODE_F + * @param[in] u32ETUCount Timer timeout duration, ETU based. For timer 0, valid range are between 1~0x1000000ETUs. + * For timer 1 and timer 2, valid range are between 1 ~ 0x100 ETUs + * @return None + * @note This function start the timer within smartcard module, \b not timer module + * @note Depend on the timer operating mode, timer may not start counting immediately + */ +void SC_StartTimer(SC_T *sc, uint32_t u32TimerNum, uint32_t u32Mode, uint32_t u32ETUCount) +{ + uint32_t reg = u32Mode | (SC_TMRCTL0_CNT_Msk & (u32ETUCount - 1UL)); + while (sc->ALTCTL & SC_ALTCTL_SYNC_Msk) + { + ; + } + if (u32TimerNum == 0UL) + { + while (sc->TMRCTL0 & SC_TMRCTL0_SYNC_Msk) + { + ; + } + sc->TMRCTL0 = reg; + sc->ALTCTL |= SC_ALTCTL_CNTEN0_Msk; + } + else if (u32TimerNum == 1UL) + { + while (sc->TMRCTL1 & SC_TMRCTL1_SYNC_Msk) + { + ; + } + sc->TMRCTL1 = reg; + sc->ALTCTL |= SC_ALTCTL_CNTEN1_Msk; + } + else /* timer 2 */ + { + while (sc->TMRCTL2 & SC_TMRCTL2_SYNC_Msk) + { + ; + } + sc->TMRCTL2 = reg; + sc->ALTCTL |= SC_ALTCTL_CNTEN2_Msk; + } +} + +/** + * @brief This function stop a smartcard timer of specified smartcard module + * @param[in] sc Base address of smartcard module + * @param[in] u32TimerNum Timer to stop. Valid values are 0, 1, 2. + * @return None + * @note This function stop the timer within smartcard module, \b not timer module + */ +void SC_StopTimer(SC_T *sc, uint32_t u32TimerNum) +{ + while (sc->ALTCTL & SC_ALTCTL_SYNC_Msk) + { + ; + } + if (u32TimerNum == 0UL) + { + sc->ALTCTL &= ~SC_ALTCTL_CNTEN0_Msk; + } + else if (u32TimerNum == 1UL) + { + sc->ALTCTL &= ~SC_ALTCTL_CNTEN1_Msk; + } + else /* timer 2 */ + { + sc->ALTCTL &= ~SC_ALTCTL_CNTEN2_Msk; + } +} + +/** + * @brief This function gets smartcard clock frequency. + * @param[in] sc Base address of smartcard module + * @return Smartcard frequency in kHz + */ +uint32_t SC_GetInterfaceClock(SC_T *sc) +{ + uint32_t u32ClkSrc, u32Num, u32Clk; + + if (sc == SC0) + { + u32Num = 0UL; + } + else + { + u32Num = 1UL; + } + + u32ClkSrc = CLK->CLKSEL4 >> (u32Num + CLK_CLKSEL4_SC0SEL_Pos); + + /* Get smartcard module clock */ + if (u32ClkSrc == 0UL) + { + u32Clk = __HXT; + } + else + { + u32Clk = CLK_GetPCLK3Freq(); + } + + u32Clk /= (((CLK->CLKDIV1 >> (4UL * u32Num)) & CLK_CLKDIV1_SC0DIV_Msk) + 1UL) * 1000UL;; + + return u32Clk; +} + +/*@}*/ /* end of group SC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group SC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_scuart.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_scuart.c new file mode 100644 index 0000000000..7af435253c --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_scuart.c @@ -0,0 +1,222 @@ +/**************************************************************************//** + * @file scuart.c + * @brief Smartcard UART mode (SCUART) driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + +static uint32_t SCUART_GetClock(SC_T *sc); + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup SCUART_Driver SCUART Driver + @{ +*/ + + +/** @addtogroup SCUART_EXPORTED_FUNCTIONS SCUART Exported Functions + @{ +*/ + +/** + * @brief The function is used to disable smartcard interface UART mode. + * @param sc The base address of smartcard module. + * @return None + */ +void SCUART_Close(SC_T *sc) +{ + sc->INTEN = 0UL; + sc->UARTCTL = 0UL; + sc->CTL = 0UL; + +} +/** @cond HIDDEN_SYMBOLS */ +/** + * @brief This function returns module clock of specified SC interface + * @param[in] sc The base address of smartcard module. + * @return Module clock of specified SC interface + */ +static uint32_t SCUART_GetClock(SC_T *sc) +{ + uint32_t u32ClkSrc, u32Num, u32Clk; + + if (sc == SC0) + { + u32Num = 0UL; + } + else + { + u32Num = 1UL; + } + + u32ClkSrc = CLK->CLKSEL4 >> (u32Num + CLK_CLKSEL4_SC0SEL_Msk); + + /* Get smartcard module clock */ + if (u32ClkSrc == 0UL) + { + u32Clk = __HXT; + } + else + { + u32Clk = CLK_GetPCLK3Freq(); + } + + + u32Clk /= (((CLK->CLKDIV1 >> (4UL * u32Num)) & CLK_CLKDIV1_SC0DIV_Msk) + 1UL); + + + return u32Clk; +} + +/** @endcond HIDDEN_SYMBOLS */ + +/** + * @brief This function use to enable smartcard module UART mode and set baudrate. + * @param[in] sc The base address of smartcard module. + * @param[in] u32baudrate Target baudrate of smartcard module. + * @return Actual baudrate of smartcard mode + * @details This function configures character width to 8 bits, 1 stop bit, and no parity. + * And can use \ref SCUART_SetLineConfig function to update these settings + * The baudrate clock source comes from SC_CLK/SC_DIV, where SC_CLK is controlled + * by SCxSEL in CLKSEL3 register, SC_DIV is controlled by SCxDIV in CLKDIV1 + * register. Since the baudrate divider is 12-bit wide and must be larger than 4, + * (clock source / baudrate) must be larger or equal to 5 and smaller or equal to + * 4096. Otherwise this function cannot configure SCUART to work with target baudrate. + */ +uint32_t SCUART_Open(SC_T *sc, uint32_t u32baudrate) +{ + uint32_t u32Clk = SCUART_GetClock(sc), u32Div; + + /* Calculate divider for target baudrate */ + u32Div = (u32Clk + (u32baudrate >> 1) - 1UL) / u32baudrate - 1UL; + + /* Enable smartcard interface and stop bit = 1 */ + sc->CTL = SC_CTL_SCEN_Msk | SC_CTL_NSB_Msk; + /* Enable UART mode, disable parity and 8 bit per character */ + sc->UARTCTL = SCUART_CHAR_LEN_8 | SCUART_PARITY_NONE | SC_UARTCTL_UARTEN_Msk; + sc->ETUCTL = u32Div; + + return (u32Clk / (u32Div + 1UL)); +} + +/** + * @brief The function is used to read Rx data from RX FIFO. + * @param[in] sc The base address of smartcard module. + * @param[in] pu8RxBuf The buffer to store receive the data + * @param[in] u32ReadBytes Target number of characters to receive + * @return Actual character number reads to buffer + * @note This function does not block and return immediately if there's no data available + */ +uint32_t SCUART_Read(SC_T *sc, uint8_t pu8RxBuf[], uint32_t u32ReadBytes) +{ + uint32_t u32Count; + + for (u32Count = 0UL; u32Count < u32ReadBytes; u32Count++) + { + if (SCUART_GET_RX_EMPTY(sc)) /* no data available */ + { + break; + } + pu8RxBuf[u32Count] = (uint8_t)SCUART_READ(sc); /* get data from FIFO */ + } + + return u32Count; +} + +/** + * @brief This function use to configure smartcard UART mode line setting. + * @param[in] sc The base address of smartcard module. + * @param[in] u32Baudrate Target baudrate of smartcard module. If this value is 0, UART baudrate will not change. + * @param[in] u32DataWidth The data length, could be + * - \ref SCUART_CHAR_LEN_5 + * - \ref SCUART_CHAR_LEN_6 + * - \ref SCUART_CHAR_LEN_7 + * - \ref SCUART_CHAR_LEN_8 + * @param[in] u32Parity The parity setting, could be + * - \ref SCUART_PARITY_NONE + * - \ref SCUART_PARITY_ODD + * - \ref SCUART_PARITY_EVEN + * @param[in] u32StopBits The stop bit length, could be + * - \ref SCUART_STOP_BIT_1 + * - \ref SCUART_STOP_BIT_2 + * @return Actual baudrate of smartcard + * @details The baudrate clock source comes from SC_CLK/SC_DIV, where SC_CLK is controlled + * by SCxSEL in CLKSEL3 register, SC_DIV is controlled by SCxDIV in CLKDIV1 + * register. Since the baudrate divider is 12-bit wide and must be larger than 4, + * (clock source / baudrate) must be larger or equal to 5 and smaller or equal to + * 4096. Otherwise this function cannot configure SCUART to work with target baudrate. + */ +uint32_t SCUART_SetLineConfig(SC_T *sc, uint32_t u32Baudrate, uint32_t u32DataWidth, uint32_t u32Parity, uint32_t u32StopBits) +{ + + uint32_t u32Clk = SCUART_GetClock(sc), u32Div; + + if (u32Baudrate == 0UL) /* keep original baudrate setting */ + { + u32Div = sc->ETUCTL & SC_ETUCTL_ETURDIV_Msk; + } + else + { + /* Calculate divider for target baudrate */ + u32Div = (u32Clk + (u32Baudrate >> 1) - 1UL) / u32Baudrate - 1UL; + sc->ETUCTL = u32Div; + } + /* Set stop bit */ + sc->CTL = u32StopBits | SC_CTL_SCEN_Msk; + /* Set character width and parity */ + sc->UARTCTL = u32Parity | u32DataWidth | SC_UARTCTL_UARTEN_Msk; + + return (u32Clk / (u32Div + 1UL)); +} + +/** + * @brief This function use to set receive timeout count. + * @param[in] sc The base address of smartcard module. + * @param[in] u32TOC Rx timeout counter, using baudrate as counter unit. Valid range are 0~0x1FF, + * set this value to 0 will disable timeout counter + * @return None + * @details The time-out counter resets and starts counting whenever the RX buffer received a + * new data word. Once the counter decrease to 1 and no new data is received or CPU + * does not read any data from FIFO, a receiver time-out interrupt will be generated. + */ +void SCUART_SetTimeoutCnt(SC_T *sc, uint32_t u32TOC) +{ + sc->RXTOUT = u32TOC; +} + + +/** + * @brief This function is to write data into transmit FIFO to send data out. + * @param[in] sc The base address of smartcard module. + * @param[in] pu8TxBuf The buffer containing data to send to transmit FIFO. + * @param[in] u32WriteBytes Number of data to send. + * @return None + * @note This function blocks until all data write into FIFO + */ +void SCUART_Write(SC_T *sc, uint8_t pu8TxBuf[], uint32_t u32WriteBytes) +{ + uint32_t u32Count; + + for (u32Count = 0UL; u32Count != u32WriteBytes; u32Count++) + { + /* Wait 'til FIFO not full */ + while (SCUART_GET_TX_FULL(sc)) + { + ; + } + /* Write 1 byte to FIFO */ + sc->DAT = pu8TxBuf[u32Count]; + } +} + + +/*@}*/ /* end of group SCUART_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group SCUART_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sdh.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sdh.c new file mode 100644 index 0000000000..a7f9a9dfef --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sdh.c @@ -0,0 +1,276 @@ +/**************************************************************************//** +* @file nu_sdh.c +* @brief SDH driver source file +* +* SPDX-License-Identifier: Apache-2.0 +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ +#include "NuMicro.h" +#include + +/** @addtogroup Standard_Driver Standard Driver +@{ +*/ + +/** @addtogroup SDH_Driver SDH Driver +@{ +*/ + +/** @addtogroup SDH_EXPORTED_FUNCTIONS SDH Exported Functions +@{ +*/ + +#define SDH_DBG +#if defined(SDH_DBG) + extern int rt_kprintf(const char *fmt, ...); + #define SDH_DBG_PRINT rt_kprintf + extern void rt_hw_us_delay(uint32_t us); + #define DelayMicrosecond rt_hw_us_delay + +#else + #define SDH_DBG_PRINT(...) + #define DelayMicrosecond SDH_Delay +#endif + +/* Print out register information: Name, Offset, Current value, Reset value, match flag. */ +#define DUMP_REG(BASE, NAME, DEFAULT) SDH_DBG_PRINT("| %-24s | 0x%04x | 0x%08x | 0x%08x | %-6s |\n", #NAME, (uint32_t)&BASE->NAME - (uint32_t)BASE, BASE->NAME, DEFAULT, ((BASE->NAME != DEFAULT) ? " N ":" Y ") ) + +#define PACK_MMC_CMD(CMD, IDX, ARG, RESP) ( CMD.cmdidx=IDX, CMD.cmdarg=ARG, CMD.resp_type=RESP ) + +#if !defined(SDH_DBG) +static void SDH_Delay(uint32_t u32LoopTime) +{ + volatile uint32_t i = 0x2000 * u32LoopTime; + for (; i > 0; i--); +} +#endif + +void SDH_DumpReg(SDH_T *sdh) +{ + + SDH_DBG_PRINT("========================================================================\n"); + SDH_DBG_PRINT("SDH_T(0x%08x): %d\n", sdh, sizeof(SDH_T)); + SDH_DBG_PRINT("========================================================================\n"); + SDH_DBG_PRINT("| %-24s | %-6s | %-10s | %-10s | %-6s |\n", "REG NAME", "OFFSET", "CURRENT", "DEFAULT", "MATCH?"); + SDH_DBG_PRINT("========================================================================\n"); + DUMP_REG(sdh, SDMASA, 0x0); + DUMP_REG(sdh, BLOCKSIZE, 0x0); + DUMP_REG(sdh, BLOCKCOUNT, 0x0); + DUMP_REG(sdh, ARGUMENT, 0x0); + DUMP_REG(sdh, XFER_MODE, 0x0); + DUMP_REG(sdh, CMD, 0x0); + DUMP_REG(sdh, RESP01, 0x0); + DUMP_REG(sdh, RESP23, 0x0); + DUMP_REG(sdh, RESP45, 0x0); + DUMP_REG(sdh, RESP67, 0x0); + DUMP_REG(sdh, BUF_DATA, 0x0); + DUMP_REG(sdh, PSTATE, 0x0); + DUMP_REG(sdh, HOST_CTRL1, 0x0); + DUMP_REG(sdh, PWR_CTRL, 0x0); + + DUMP_REG(sdh, BGAP_CTRL, 0x0); + DUMP_REG(sdh, WUP_CTRL, 0x0); + DUMP_REG(sdh, CLK_CTRL, 0x0); + DUMP_REG(sdh, TOUT_CTRL, 0x0); + DUMP_REG(sdh, SW_RST, 0x0); + DUMP_REG(sdh, NORMAL_INT_STAT, 0x0); + DUMP_REG(sdh, ERROR_INT_STAT, 0x0); + DUMP_REG(sdh, NORMAL_INT_STAT_EN, 0x0); + DUMP_REG(sdh, ERROR_INT_STAT_EN, 0x0); + DUMP_REG(sdh, NORMAL_INT_SIGNAL_EN, 0x0); + + DUMP_REG(sdh, ERROR_INT_SIGNAL_EN, 0x0); + DUMP_REG(sdh, AUTO_CMD_STAT, 0x0); + DUMP_REG(sdh, HOST_CTRL2, 0x0); + DUMP_REG(sdh, CAPABILITIES1, 0x276EC898); + DUMP_REG(sdh, CAPABILITIES2, 0x08008077); + DUMP_REG(sdh, CURR_CAPABILITIES1, 0x0); + DUMP_REG(sdh, CURR_CAPABILITIES2, 0x0); + DUMP_REG(sdh, FORCE_AUTO_CMD_STAT, 0x0); + DUMP_REG(sdh, FORCE_ERROR_INT_STAT, 0x0); + DUMP_REG(sdh, ADMA_ERR_STAT, 0x0); + DUMP_REG(sdh, ADMA_SA_LOW, 0x0); + DUMP_REG(sdh, PRESET_INIT, 0x0); + DUMP_REG(sdh, PRESET_DS, 0x0); + DUMP_REG(sdh, PRESET_HS, 0x0); + DUMP_REG(sdh, PRESET_SDR12, 0x0); + DUMP_REG(sdh, PRESET_SDR25, 0x0); + DUMP_REG(sdh, PRESET_SDR50, 0x0); + DUMP_REG(sdh, PRESET_SDR104, 0x0); + DUMP_REG(sdh, PRESET_DDR50, 0x0); + DUMP_REG(sdh, PRESET_UHS2, 0x0); + DUMP_REG(sdh, P_EMBEDDED_CNTRL, 0x0F6C); + DUMP_REG(sdh, P_VENDOR_SPECIFIC_AREA, 0x0500); + DUMP_REG(sdh, P_VENDOR2_SPECIFIC_AREA, 0x0180); + DUMP_REG(sdh, SLOT_INTR_STATUS, 0x0000); + DUMP_REG(sdh, HOST_CNTRL_VERS, 0x0005); + DUMP_REG(sdh, EMBEDDED_CTRL, 0x00000000); + DUMP_REG(sdh, MSHC_VER_ID, 0x3138302A); + DUMP_REG(sdh, MSHC_VER_TYPE, 0x67612A2A); + DUMP_REG(sdh, MSHC_CTRL, 0x01); + DUMP_REG(sdh, MBIU_CTRL, 0x0F); + DUMP_REG(sdh, EMMC_CTRL, 0x000C); + DUMP_REG(sdh, BOOT_CTRL, 0x0000); + + DUMP_REG(sdh, AT_CTRL, 0x03000005); + DUMP_REG(sdh, AT_STAT, 0x00000006); + DUMP_REG(sdh, CQCAP, 0x000030C8); + SDH_DBG_PRINT("========================================================================\n"); +} + +void SDH_Reset(SDH_T *sdh, uint8_t u8Mask) +{ + /* Wait max 100 ms */ + unsigned int timeout = 100; + + sdh->SW_RST |= u8Mask; + while (sdh->SW_RST & u8Mask) + { + if (timeout == 0) + { + SDH_DBG_PRINT("SD Reset fail\n"); + return; + } + timeout--; + DelayMicrosecond(1000); + } +} + +void SDH_SetPower(SDH_T *sdh, uint32_t u32OnOff) +{ + if (u32OnOff) + { + /* Power on VDD1 */ + sdh->S_PWR_CTRL.SD_BUS_PWR_VDD1 = 1; + + /* Set 3.3v for EMMC, SD and */ + sdh->S_PWR_CTRL.SD_BUS_VOL_VDD1 = 7; + } + else + { + /* Power off VDD1 */ + sdh->S_PWR_CTRL.SD_BUS_PWR_VDD1 = 0; + + /* Set 0v for EMMC, SD and */ + sdh->S_PWR_CTRL.SD_BUS_VOL_VDD1 = 0; + } +} + +uint32_t SDH_SetClock(SDH_T *sdh, uint32_t u32SrcFreqInHz, uint32_t u32ExceptedFreqInHz) +{ + uint32_t timeout; + uint32_t div; + + if (u32ExceptedFreqInHz == 0) + goto exit_SDH_SetClock; + + /* Wait max 20 ms */ + timeout = 200; + while (sdh->PSTATE & 0x3) //(SDH_CMD_INHIBIT | SDH_DATA_INHIBIT)) + { + if (timeout == 0) + { + SDH_DBG_PRINT("Timeout to wait cmd & data inhibit\n"); + goto exit_SDH_SetClock; + } + timeout--; + DelayMicrosecond(100); + } + /* Shutdown clocks. */ + sdh->CLK_CTRL = 0; + DelayMicrosecond(1000); + + div = (u32SrcFreqInHz / 2) / u32ExceptedFreqInHz; + if (div > 0) + { + while ((u32SrcFreqInHz / (2 * div)) > u32ExceptedFreqInHz) + { + div++; + } + } + + sdh->S_CLK_CTRL.FREQ_SEL = div & 0xff; + sdh->S_CLK_CTRL.UPPER_FREQ_SEL = (div >> 8) & 0x3; + + sdh->S_CLK_CTRL.INTERNAL_CLK_EN = 1; + + /* Wait stable */ + /* Wait max 20 ms */ + timeout = 200; + while (!sdh->S_CLK_CTRL.INTERNAL_CLK_STABLE) + { + if (timeout == 0) + { + SDH_DBG_PRINT("Timeout to wait CLK stable.\n"); + goto exit_SDH_SetClock; + } + timeout--; + DelayMicrosecond(100); + } + + /* Enable SD CLK */ + sdh->S_CLK_CTRL.SD_CLK_EN = 1; + + return (div == 0) ? u32SrcFreqInHz : u32SrcFreqInHz / (2 * div); + +exit_SDH_SetClock: + + sdh->CLK_CTRL = 0; + + return 0; +} + +#define SDH_CMD_MAX_TIMEOUT 3200 +#define SDH_CMD_DEFAULT_TIMEOUT 100 +#define SDH_MAX_DIV_SPEC_300 2046 + +int SD_GetBusStatus(SDH_T *sdh, uint32_t mask) +{ + volatile unsigned int time = 0; + volatile unsigned int cmd_timeout = SDH_CMD_DEFAULT_TIMEOUT; + + while (sdh->PSTATE & mask) + { + if (time >= cmd_timeout) + { + if (2 * cmd_timeout <= SDH_CMD_MAX_TIMEOUT) + { + cmd_timeout += cmd_timeout; + } + else + { + return -1; + } + } + DelayMicrosecond(1000); + time++; + } + return 0; +} + +int SDH_SetBusWidth(SDH_T *sdh, uint32_t u32BusWidth) +{ + switch (u32BusWidth) + { + case 1: + sdh->S_HOST_CTRL1.DAT_XFER_WIDTH = 0; + sdh->S_HOST_CTRL1.EXT_DAT_XFER = 0; + break; + case 4: + sdh->S_HOST_CTRL1.DAT_XFER_WIDTH = 1; + sdh->S_HOST_CTRL1.EXT_DAT_XFER = 0; + break; + case 8: + sdh->S_HOST_CTRL1.DAT_XFER_WIDTH = 1; + sdh->S_HOST_CTRL1.EXT_DAT_XFER = 1; + break; + } + return 0; +} + +/*@}*/ /* end of group SDH_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group SDH_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_spi.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_spi.c new file mode 100644 index 0000000000..e4bc1b397c --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_spi.c @@ -0,0 +1,1313 @@ +/**************************************************************************//** + * @file spi.c + * @brief SPI driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup SPI_Driver SPI Driver + @{ +*/ + + +/** @addtogroup SPI_EXPORTED_FUNCTIONS SPI Exported Functions + @{ +*/ +static uint32_t SPII2S_GetSourceClockFreq(SPI_T *i2s); + +/** + * @brief This function make SPI module be ready to transfer. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32MasterSlave Decides the SPI module is operating in master mode or in slave mode. (SPI_SLAVE, SPI_MASTER) + * @param[in] u32SPIMode Decides the transfer timing. (SPI_MODE_0, SPI_MODE_1, SPI_MODE_2, SPI_MODE_3) + * @param[in] u32DataWidth Decides the data width of a SPI transaction. + * @param[in] u32BusClock The expected frequency of SPI bus clock in Hz. + * @return Actual frequency of SPI peripheral clock. + * @details By default, the SPI transfer sequence is MSB first, the slave selection signal is active low and the automatic + * slave selection function is disabled. + * In Slave mode, the u32BusClock shall be NULL and the SPI clock divider setting will be 0. + * The actual clock rate may be different from the target SPI clock rate. + * For example, if the SPI source clock rate is 12 MHz and the target SPI bus clock rate is 7 MHz, the + * actual SPI clock rate will be 6MHz. + * @note If u32BusClock = 0, DIVIDER setting will be set to the maximum value. + * @note If u32BusClock >= system clock frequency, SPI peripheral clock source will be set to APB clock and DIVIDER will be set to 0. + * @note If u32BusClock >= SPI peripheral clock source, DIVIDER will be set to 0. + * @note In slave mode, the SPI peripheral clock rate will be equal to APB clock rate. + */ +uint32_t SPI_Open(SPI_T *spi, + uint32_t u32MasterSlave, + uint32_t u32SPIMode, + uint32_t u32DataWidth, + uint32_t u32BusClock) +{ + uint32_t u32ClkSrc = 0U, u32Div, u32HCLKFreq, u32RetValue = 0U; + + /* Disable I2S mode */ + spi->I2SCTL &= ~SPI_I2SCTL_I2SEN_Msk; + + if (u32DataWidth == 32U) + { + u32DataWidth = 0U; + } + + /* Get system clock frequency */ + u32HCLKFreq = CLK_GetSYSCLK0Freq(); + + if (u32MasterSlave == SPI_MASTER) + { + /* Default setting: slave selection signal is active low; disable automatic slave selection function. */ + spi->SSCTL = SPI_SS_ACTIVE_LOW; + + /* Default setting: MSB first, disable unit transfer interrupt, SP_CYCLE = 0. */ + spi->CTL = u32MasterSlave | (u32DataWidth << SPI_CTL_DWIDTH_Pos) | (u32SPIMode) | SPI_CTL_SPIEN_Msk; + + if (u32BusClock >= u32HCLKFreq) + { + /* Select PCLK as the clock source of SPI */ + if (spi == SPI0) + { + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI0SEL_Msk)) | CLK_CLKSEL4_SPI0SEL_PCLK1; + } + else if (spi == SPI1) + { + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI1SEL_Msk)) | CLK_CLKSEL4_SPI1SEL_PCLK2; + } + else if (spi == SPI2) + { + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI2SEL_Msk)) | CLK_CLKSEL4_SPI2SEL_PCLK1; + } + else + { + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI3SEL_Msk)) | CLK_CLKSEL4_SPI3SEL_PCLK2; + } + } + + /* Check clock source of SPI */ + if (spi == SPI0) + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI0SEL_Msk) == CLK_CLKSEL4_SPI0SEL_APLL) + { + u32ClkSrc = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI0SEL_Msk) == CLK_CLKSEL4_SPI0SEL_PCLK1) + { + /* Clock source is PCLK1 */ + u32ClkSrc = CLK_GetPCLK1Freq(); + } + } + else if (spi == SPI1) + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI1SEL_Msk) == CLK_CLKSEL4_SPI1SEL_APLL) + { + u32ClkSrc = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI1SEL_Msk) == CLK_CLKSEL4_SPI1SEL_PCLK2) + { + /* Clock source is PCLK2 */ + u32ClkSrc = CLK_GetPCLK2Freq(); + } + } + else if (spi == SPI2) + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI2SEL_Msk) == CLK_CLKSEL4_SPI2SEL_APLL) + { + u32ClkSrc = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI2SEL_Msk) == CLK_CLKSEL4_SPI2SEL_PCLK1) + { + u32ClkSrc = CLK_GetPCLK1Freq(); + } + } + else + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI3SEL_Msk) == CLK_CLKSEL4_SPI3SEL_APLL) + { + u32ClkSrc = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI3SEL_Msk) == CLK_CLKSEL4_SPI3SEL_PCLK2) + { + /* Clock source is PCLK2 */ + u32ClkSrc = CLK_GetPCLK2Freq(); + } + } + + if (u32BusClock >= u32HCLKFreq) + { + /* Set DIVIDER = 0 */ + spi->CLKDIV = 0U; + /* Return master peripheral clock rate */ + u32RetValue = u32ClkSrc; + } + else if (u32BusClock >= u32ClkSrc) + { + /* Set DIVIDER = 0 */ + spi->CLKDIV = 0U; + /* Return master peripheral clock rate */ + u32RetValue = u32ClkSrc; + } + else if (u32BusClock == 0U) + { + /* Set DIVIDER to the maximum value 0xFF. f_spi = f_spi_clk_src / (DIVIDER + 1) */ + spi->CLKDIV |= SPI_CLKDIV_DIVIDER_Msk; + /* Return master peripheral clock rate */ + u32RetValue = (u32ClkSrc / (0xFFU + 1U)); + } + else + { + u32Div = (((u32ClkSrc * 10U) / u32BusClock + 5U) / 10U) - 1U; /* Round to the nearest integer */ + if (u32Div > 0xFFU) + { + u32Div = 0xFFU; + spi->CLKDIV |= SPI_CLKDIV_DIVIDER_Msk; + /* Return master peripheral clock rate */ + u32RetValue = (u32ClkSrc / (0xFFU + 1U)); + } + else + { + spi->CLKDIV = (spi->CLKDIV & (~SPI_CLKDIV_DIVIDER_Msk)) | (u32Div << SPI_CLKDIV_DIVIDER_Pos); + /* Return master peripheral clock rate */ + u32RetValue = (u32ClkSrc / (u32Div + 1U)); + } + } + } + else /* For slave mode, force the SPI peripheral clock rate to equal APB clock rate. */ + { + /* Default setting: slave selection signal is low level active. */ + spi->SSCTL = SPI_SS_ACTIVE_LOW; + + /* Default setting: MSB first, disable unit transfer interrupt, SP_CYCLE = 0. */ + spi->CTL = u32MasterSlave | (u32DataWidth << SPI_CTL_DWIDTH_Pos) | (u32SPIMode) | SPI_CTL_SPIEN_Msk; + + /* Set DIVIDER = 0 */ + spi->CLKDIV = 0U; + + /* Select PCLK as the clock source of SPI */ + if (spi == SPI0) + { + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI0SEL_Msk)) | CLK_CLKSEL4_SPI0SEL_PCLK1; + /* Return slave peripheral clock rate */ + u32RetValue = CLK_GetPCLK1Freq(); + } + else if (spi == SPI1) + { + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI1SEL_Msk)) | CLK_CLKSEL4_SPI1SEL_PCLK2; + /* Return slave peripheral clock rate */ + u32RetValue = CLK_GetPCLK2Freq(); + } + else if (spi == SPI2) + { + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI2SEL_Msk)) | CLK_CLKSEL4_SPI2SEL_PCLK1; + /* Return slave peripheral clock rate */ + u32RetValue = CLK_GetPCLK1Freq(); + } + else + { + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI3SEL_Msk)) | CLK_CLKSEL4_SPI3SEL_PCLK2; + /* Return slave peripheral clock rate */ + u32RetValue = CLK_GetPCLK2Freq(); + } + } + + return u32RetValue; +} + +/** + * @brief Disable SPI controller. + * @param[in] spi The pointer of the specified SPI module. + * @return None + * @details This function will reset SPI controller. + */ +void SPI_Close(SPI_T *spi) +{ + if (spi == SPI0) + { + /* Reset SPI */ + SYS->IPRST1 |= SYS_IPRST1_SPI0RST_Msk; + SYS->IPRST1 &= ~SYS_IPRST1_SPI0RST_Msk; + } + else if (spi == SPI1) + { + /* Reset SPI */ + SYS->IPRST1 |= SYS_IPRST1_SPI1RST_Msk; + SYS->IPRST1 &= ~SYS_IPRST1_SPI1RST_Msk; + } + else if (spi == SPI2) + { + /* Reset SPI */ + SYS->IPRST1 |= SYS_IPRST1_SPI2RST_Msk; + SYS->IPRST1 &= ~SYS_IPRST1_SPI2RST_Msk; + } + else + { + /* Reset SPI */ + SYS->IPRST2 |= SYS_IPRST2_SPI3RST_Msk; + SYS->IPRST2 &= ~SYS_IPRST2_SPI3RST_Msk; + } +} + +/** + * @brief Clear RX FIFO buffer. + * @param[in] spi The pointer of the specified SPI module. + * @return None + * @details This function will clear SPI RX FIFO buffer. The RXEMPTY (SPI_STATUS[8]) will be set to 1. + */ +void SPI_ClearRxFIFO(SPI_T *spi) +{ + spi->FIFOCTL |= SPI_FIFOCTL_RXFBCLR_Msk; +} + +/** + * @brief Clear TX FIFO buffer. + * @param[in] spi The pointer of the specified SPI module. + * @return None + * @details This function will clear SPI TX FIFO buffer. The TXEMPTY (SPI_STATUS[16]) will be set to 1. + * @note The TX shift register will not be cleared. + */ +void SPI_ClearTxFIFO(SPI_T *spi) +{ + spi->FIFOCTL |= SPI_FIFOCTL_TXFBCLR_Msk; +} + +/** + * @brief Disable the automatic slave selection function. + * @param[in] spi The pointer of the specified SPI module. + * @return None + * @details This function will disable the automatic slave selection function and set slave selection signal to inactive state. + */ +void SPI_DisableAutoSS(SPI_T *spi) +{ + spi->SSCTL &= ~(SPI_SSCTL_AUTOSS_Msk | SPI_SSCTL_SS_Msk); +} + +/** + * @brief Enable the automatic slave selection function. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32SSPinMask Specifies slave selection pins. (SPI_SS) + * @param[in] u32ActiveLevel Specifies the active level of slave selection signal. (SPI_SS_ACTIVE_HIGH, SPI_SS_ACTIVE_LOW) + * @return None + * @details This function will enable the automatic slave selection function. Only available in Master mode. + * The slave selection pin and the active level will be set in this function. + */ +void SPI_EnableAutoSS(SPI_T *spi, uint32_t u32SSPinMask, uint32_t u32ActiveLevel) +{ + spi->SSCTL = (spi->SSCTL & (~(SPI_SSCTL_AUTOSS_Msk | SPI_SSCTL_SSACTPOL_Msk | SPI_SSCTL_SS_Msk))) | (u32SSPinMask | u32ActiveLevel | SPI_SSCTL_AUTOSS_Msk); +} + +/** + * @brief Set the SPI bus clock. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32BusClock The expected frequency of SPI bus clock in Hz. + * @return Actual frequency of SPI bus clock. + * @details This function is only available in Master mode. The actual clock rate may be different from the target SPI bus clock rate. + * For example, if the SPI source clock rate is 12 MHz and the target SPI bus clock rate is 7 MHz, the actual SPI bus clock + * rate will be 6 MHz. + * @note If u32BusClock = 0, DIVIDER setting will be set to the maximum value. + * @note If u32BusClock >= system clock frequency, SPI peripheral clock source will be set to APB clock and DIVIDER will be set to 0. + * @note If u32BusClock >= SPI peripheral clock source, DIVIDER will be set to 0. + */ +uint32_t SPI_SetBusClock(SPI_T *spi, uint32_t u32BusClock) +{ + uint32_t u32ClkSrc = 0, u32HCLKFreq; + uint32_t u32Div, u32RetValue; + + /* Get system clock frequency */ + u32HCLKFreq = CLK_GetSYSCLK0Freq(); + + if (u32BusClock >= u32HCLKFreq) + { + /* Select PCLK as the clock source of SPI */ + if (spi == SPI0) + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI0SEL_Msk)) | CLK_CLKSEL4_SPI0SEL_PCLK1; + else if (spi == SPI1) + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI1SEL_Msk)) | CLK_CLKSEL4_SPI1SEL_PCLK2; + else if (spi == SPI2) + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI2SEL_Msk)) | CLK_CLKSEL4_SPI2SEL_PCLK1; + else + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI3SEL_Msk)) | CLK_CLKSEL4_SPI3SEL_PCLK2; + } + + /* Check clock source of SPI */ + if (spi == SPI0) + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI0SEL_Msk) == CLK_CLKSEL4_SPI0SEL_APLL) + { + u32ClkSrc = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI0SEL_Msk) == CLK_CLKSEL4_SPI0SEL_PCLK1) + { + /* Clock source is PCLK1 */ + u32ClkSrc = CLK_GetPCLK1Freq(); + } + } + else if (spi == SPI1) + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI1SEL_Msk) == CLK_CLKSEL4_SPI1SEL_APLL) + { + u32ClkSrc = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI1SEL_Msk) == CLK_CLKSEL4_SPI1SEL_PCLK2) + { + /* Clock source is PCLK2 */ + u32ClkSrc = CLK_GetPCLK2Freq(); + } + } + else if (spi == SPI2) + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI2SEL_Msk) == CLK_CLKSEL4_SPI2SEL_APLL) + { + u32ClkSrc = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI2SEL_Msk) == CLK_CLKSEL4_SPI2SEL_PCLK1) + { + /* Clock source is PCLK1 */ + u32ClkSrc = CLK_GetPCLK1Freq(); + } + } + else + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI3SEL_Msk) == CLK_CLKSEL4_SPI3SEL_APLL) + { + u32ClkSrc = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI3SEL_Msk) == CLK_CLKSEL4_SPI3SEL_PCLK2) + { + /* Clock source is PCLK2 */ + u32ClkSrc = CLK_GetPCLK2Freq(); + } + } + + if (u32BusClock >= u32HCLKFreq) + { + /* Set DIVIDER = 0 */ + spi->CLKDIV = 0U; + /* Return master peripheral clock rate */ + u32RetValue = u32ClkSrc; + } + else if (u32BusClock >= u32ClkSrc) + { + /* Set DIVIDER = 0 */ + spi->CLKDIV = 0U; + /* Return master peripheral clock rate */ + u32RetValue = u32ClkSrc; + } + else if (u32BusClock == 0U) + { + /* Set DIVIDER to the maximum value 0xFF. f_spi = f_spi_clk_src / (DIVIDER + 1) */ + spi->CLKDIV |= SPI_CLKDIV_DIVIDER_Msk; + /* Return master peripheral clock rate */ + u32RetValue = (u32ClkSrc / (0xFFU + 1U)); + } + else + { + u32Div = (((u32ClkSrc * 10U) / u32BusClock + 5U) / 10U) - 1U; /* Round to the nearest integer */ + if (u32Div > 0x1FFU) + { + u32Div = 0x1FFU; + spi->CLKDIV |= SPI_CLKDIV_DIVIDER_Msk; + /* Return master peripheral clock rate */ + u32RetValue = (u32ClkSrc / (0xFFU + 1U)); + } + else + { + spi->CLKDIV = (spi->CLKDIV & (~SPI_CLKDIV_DIVIDER_Msk)) | (u32Div << SPI_CLKDIV_DIVIDER_Pos); + /* Return master peripheral clock rate */ + u32RetValue = (u32ClkSrc / (u32Div + 1U)); + } + } + + return u32RetValue; +} + +/** + * @brief Configure FIFO threshold setting. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32TxThreshold Decides the TX FIFO threshold. It could be 0 ~ 3. If data width is 8~16 bits, it could be 0 ~ 7. + * @param[in] u32RxThreshold Decides the RX FIFO threshold. It could be 0 ~ 3. If data width is 8~16 bits, it could be 0 ~ 7. + * @return None + * @details Set TX FIFO threshold and RX FIFO threshold configurations. + */ +void SPI_SetFIFO(SPI_T *spi, uint32_t u32TxThreshold, uint32_t u32RxThreshold) +{ + spi->FIFOCTL = (spi->FIFOCTL & ~(SPI_FIFOCTL_TXTH_Msk | SPI_FIFOCTL_RXTH_Msk)) | + (u32TxThreshold << SPI_FIFOCTL_TXTH_Pos) | + (u32RxThreshold << SPI_FIFOCTL_RXTH_Pos); +} + +/** + * @brief Get the actual frequency of SPI bus clock. Only available in Master mode. + * @param[in] spi The pointer of the specified SPI module. + * @return Actual SPI bus clock frequency in Hz. + * @details This function will calculate the actual SPI bus clock rate according to the SPInSEL and DIVIDER settings. Only available in Master mode. + */ +uint32_t SPI_GetBusClock(SPI_T *spi) +{ + uint32_t u32Div; + uint32_t u32ClkSrc = 0; + + /* Get DIVIDER setting */ + u32Div = (spi->CLKDIV & SPI_CLKDIV_DIVIDER_Msk) >> SPI_CLKDIV_DIVIDER_Pos; + + /* Check clock source of SPI */ + if (spi == SPI0) + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI0SEL_Msk) == CLK_CLKSEL4_SPI0SEL_APLL) + { + u32ClkSrc = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI0SEL_Msk) == CLK_CLKSEL4_SPI0SEL_PCLK1) + { + /* Clock source is PCLK1 */ + u32ClkSrc = CLK_GetPCLK1Freq(); + } + } + else if (spi == SPI1) + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI1SEL_Msk) == CLK_CLKSEL4_SPI1SEL_APLL) + { + u32ClkSrc = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI1SEL_Msk) == CLK_CLKSEL4_SPI1SEL_PCLK2) + { + /* Clock source is PCLK2 */ + u32ClkSrc = CLK_GetPCLK2Freq(); + } + } + else if (spi == SPI2) + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI2SEL_Msk) == CLK_CLKSEL4_SPI2SEL_APLL) + { + u32ClkSrc = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI2SEL_Msk) == CLK_CLKSEL4_SPI2SEL_PCLK1) + { + /* Clock source is PCLK1 */ + u32ClkSrc = CLK_GetPCLK1Freq(); + } + } + else + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI3SEL_Msk) == CLK_CLKSEL4_SPI3SEL_APLL) + { + u32ClkSrc = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI3SEL_Msk) == CLK_CLKSEL4_SPI3SEL_PCLK2) + { + /* Clock source is PCLK2 */ + u32ClkSrc = CLK_GetPCLK2Freq(); + } + } + + /* Return SPI bus clock rate */ + return (u32ClkSrc / (u32Div + 1U)); +} + +/** + * @brief Enable interrupt function. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32Mask The combination of all related interrupt enable bits. + * Each bit corresponds to a interrupt enable bit. + * This parameter decides which interrupts will be enabled. It is combination of: + * - \ref SPI_UNIT_INT_MASK + * - \ref SPI_SSACT_INT_MASK + * - \ref SPI_SSINACT_INT_MASK + * - \ref SPI_SLVUR_INT_MASK + * - \ref SPI_SLVBE_INT_MASK + * - \ref SPI_TXUF_INT_MASK + * - \ref SPI_FIFO_TXTH_INT_MASK + * - \ref SPI_FIFO_RXTH_INT_MASK + * - \ref SPI_FIFO_RXOV_INT_MASK + * - \ref SPI_FIFO_RXTO_INT_MASK + * + * @return None + * @details Enable SPI related interrupts specified by u32Mask parameter. + */ +void SPI_EnableInt(SPI_T *spi, uint32_t u32Mask) +{ + /* Enable unit transfer interrupt flag */ + if ((u32Mask & SPI_UNIT_INT_MASK) == SPI_UNIT_INT_MASK) + { + spi->CTL |= SPI_CTL_UNITIEN_Msk; + } + + /* Enable slave selection signal active interrupt flag */ + if ((u32Mask & SPI_SSACT_INT_MASK) == SPI_SSACT_INT_MASK) + { + spi->SSCTL |= SPI_SSCTL_SSACTIEN_Msk; + } + + /* Enable slave selection signal inactive interrupt flag */ + if ((u32Mask & SPI_SSINACT_INT_MASK) == SPI_SSINACT_INT_MASK) + { + spi->SSCTL |= SPI_SSCTL_SSINAIEN_Msk; + } + + /* Enable slave TX under run interrupt flag */ + if ((u32Mask & SPI_SLVUR_INT_MASK) == SPI_SLVUR_INT_MASK) + { + spi->SSCTL |= SPI_SSCTL_SLVURIEN_Msk; + } + + /* Enable slave bit count error interrupt flag */ + if ((u32Mask & SPI_SLVBE_INT_MASK) == SPI_SLVBE_INT_MASK) + { + spi->SSCTL |= SPI_SSCTL_SLVBEIEN_Msk; + } + + /* Enable slave TX underflow interrupt flag */ + if ((u32Mask & SPI_TXUF_INT_MASK) == SPI_TXUF_INT_MASK) + { + spi->FIFOCTL |= SPI_FIFOCTL_TXUFIEN_Msk; + } + + /* Enable TX threshold interrupt flag */ + if ((u32Mask & SPI_FIFO_TXTH_INT_MASK) == SPI_FIFO_TXTH_INT_MASK) + { + spi->FIFOCTL |= SPI_FIFOCTL_TXTHIEN_Msk; + } + + /* Enable RX threshold interrupt flag */ + if ((u32Mask & SPI_FIFO_RXTH_INT_MASK) == SPI_FIFO_RXTH_INT_MASK) + { + spi->FIFOCTL |= SPI_FIFOCTL_RXTHIEN_Msk; + } + + /* Enable RX overrun interrupt flag */ + if ((u32Mask & SPI_FIFO_RXOV_INT_MASK) == SPI_FIFO_RXOV_INT_MASK) + { + spi->FIFOCTL |= SPI_FIFOCTL_RXOVIEN_Msk; + } + + /* Enable RX time-out interrupt flag */ + if ((u32Mask & SPI_FIFO_RXTO_INT_MASK) == SPI_FIFO_RXTO_INT_MASK) + { + spi->FIFOCTL |= SPI_FIFOCTL_RXTOIEN_Msk; + } +} + +/** + * @brief Disable interrupt function. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32Mask The combination of all related interrupt enable bits. + * Each bit corresponds to a interrupt bit. + * This parameter decides which interrupts will be disabled. It is combination of: + * - \ref SPI_UNIT_INT_MASK + * - \ref SPI_SSACT_INT_MASK + * - \ref SPI_SSINACT_INT_MASK + * - \ref SPI_SLVUR_INT_MASK + * - \ref SPI_SLVBE_INT_MASK + * - \ref SPI_TXUF_INT_MASK + * - \ref SPI_FIFO_TXTH_INT_MASK + * - \ref SPI_FIFO_RXTH_INT_MASK + * - \ref SPI_FIFO_RXOV_INT_MASK + * - \ref SPI_FIFO_RXTO_INT_MASK + * + * @return None + * @details Disable SPI related interrupts specified by u32Mask parameter. + */ +void SPI_DisableInt(SPI_T *spi, uint32_t u32Mask) +{ + /* Disable unit transfer interrupt flag */ + if ((u32Mask & SPI_UNIT_INT_MASK) == SPI_UNIT_INT_MASK) + { + spi->CTL &= ~SPI_CTL_UNITIEN_Msk; + } + + /* Disable slave selection signal active interrupt flag */ + if ((u32Mask & SPI_SSACT_INT_MASK) == SPI_SSACT_INT_MASK) + { + spi->SSCTL &= ~SPI_SSCTL_SSACTIEN_Msk; + } + + /* Disable slave selection signal inactive interrupt flag */ + if ((u32Mask & SPI_SSINACT_INT_MASK) == SPI_SSINACT_INT_MASK) + { + spi->SSCTL &= ~SPI_SSCTL_SSINAIEN_Msk; + } + + /* Disable slave TX under run interrupt flag */ + if ((u32Mask & SPI_SLVUR_INT_MASK) == SPI_SLVUR_INT_MASK) + { + spi->SSCTL &= ~SPI_SSCTL_SLVURIEN_Msk; + } + + /* Disable slave bit count error interrupt flag */ + if ((u32Mask & SPI_SLVBE_INT_MASK) == SPI_SLVBE_INT_MASK) + { + spi->SSCTL &= ~SPI_SSCTL_SLVBEIEN_Msk; + } + + /* Disable slave TX underflow interrupt flag */ + if ((u32Mask & SPI_TXUF_INT_MASK) == SPI_TXUF_INT_MASK) + { + spi->FIFOCTL &= ~SPI_FIFOCTL_TXUFIEN_Msk; + } + + /* Disable TX threshold interrupt flag */ + if ((u32Mask & SPI_FIFO_TXTH_INT_MASK) == SPI_FIFO_TXTH_INT_MASK) + { + spi->FIFOCTL &= ~SPI_FIFOCTL_TXTHIEN_Msk; + } + + /* Disable RX threshold interrupt flag */ + if ((u32Mask & SPI_FIFO_RXTH_INT_MASK) == SPI_FIFO_RXTH_INT_MASK) + { + spi->FIFOCTL &= ~SPI_FIFOCTL_RXTHIEN_Msk; + } + + /* Disable RX overrun interrupt flag */ + if ((u32Mask & SPI_FIFO_RXOV_INT_MASK) == SPI_FIFO_RXOV_INT_MASK) + { + spi->FIFOCTL &= ~SPI_FIFOCTL_RXOVIEN_Msk; + } + + /* Disable RX time-out interrupt flag */ + if ((u32Mask & SPI_FIFO_RXTO_INT_MASK) == SPI_FIFO_RXTO_INT_MASK) + { + spi->FIFOCTL &= ~SPI_FIFOCTL_RXTOIEN_Msk; + } +} + +/** + * @brief Get interrupt flag. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32Mask The combination of all related interrupt sources. + * Each bit corresponds to a interrupt source. + * This parameter decides which interrupt flags will be read. It is combination of: + * - \ref SPI_UNIT_INT_MASK + * - \ref SPI_SSACT_INT_MASK + * - \ref SPI_SSINACT_INT_MASK + * - \ref SPI_SLVUR_INT_MASK + * - \ref SPI_SLVBE_INT_MASK + * - \ref SPI_TXUF_INT_MASK + * - \ref SPI_FIFO_TXTH_INT_MASK + * - \ref SPI_FIFO_RXTH_INT_MASK + * - \ref SPI_FIFO_RXOV_INT_MASK + * - \ref SPI_FIFO_RXTO_INT_MASK + * + * @return Interrupt flags of selected sources. + * @details Get SPI related interrupt flags specified by u32Mask parameter. + */ +uint32_t SPI_GetIntFlag(SPI_T *spi, uint32_t u32Mask) +{ + uint32_t u32IntFlag = 0U, u32TmpVal; + + u32TmpVal = spi->STATUS & SPI_STATUS_UNITIF_Msk; + /* Check unit transfer interrupt flag */ + if ((u32Mask & SPI_UNIT_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= SPI_UNIT_INT_MASK; + } + + u32TmpVal = spi->STATUS & SPI_STATUS_SSACTIF_Msk; + /* Check slave selection signal active interrupt flag */ + if ((u32Mask & SPI_SSACT_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= SPI_SSACT_INT_MASK; + } + + u32TmpVal = spi->STATUS & SPI_STATUS_SSINAIF_Msk; + /* Check slave selection signal inactive interrupt flag */ + if ((u32Mask & SPI_SSINACT_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= SPI_SSINACT_INT_MASK; + } + + u32TmpVal = spi->STATUS & SPI_STATUS_SLVURIF_Msk; + /* Check slave TX under run interrupt flag */ + if ((u32Mask & SPI_SLVUR_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= SPI_SLVUR_INT_MASK; + } + + u32TmpVal = spi->STATUS & SPI_STATUS_SLVBEIF_Msk; + /* Check slave bit count error interrupt flag */ + if ((u32Mask & SPI_SLVBE_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= SPI_SLVBE_INT_MASK; + } + + u32TmpVal = spi->STATUS & SPI_STATUS_TXUFIF_Msk; + /* Check slave TX underflow interrupt flag */ + if ((u32Mask & SPI_TXUF_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= SPI_TXUF_INT_MASK; + } + + u32TmpVal = spi->STATUS & SPI_STATUS_TXTHIF_Msk; + /* Check TX threshold interrupt flag */ + if ((u32Mask & SPI_FIFO_TXTH_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= SPI_FIFO_TXTH_INT_MASK; + } + + u32TmpVal = spi->STATUS & SPI_STATUS_RXTHIF_Msk; + /* Check RX threshold interrupt flag */ + if ((u32Mask & SPI_FIFO_RXTH_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= SPI_FIFO_RXTH_INT_MASK; + } + + u32TmpVal = spi->STATUS & SPI_STATUS_RXOVIF_Msk; + /* Check RX overrun interrupt flag */ + if ((u32Mask & SPI_FIFO_RXOV_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= SPI_FIFO_RXOV_INT_MASK; + } + + u32TmpVal = spi->STATUS & SPI_STATUS_RXTOIF_Msk; + /* Check RX time-out interrupt flag */ + if ((u32Mask & SPI_FIFO_RXTO_INT_MASK) && (u32TmpVal)) + { + u32IntFlag |= SPI_FIFO_RXTO_INT_MASK; + } + + return u32IntFlag; +} + +/** + * @brief Clear interrupt flag. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32Mask The combination of all related interrupt sources. + * Each bit corresponds to a interrupt source. + * This parameter decides which interrupt flags will be cleared. It could be the combination of: + * - \ref SPI_UNIT_INT_MASK + * - \ref SPI_SSACT_INT_MASK + * - \ref SPI_SSINACT_INT_MASK + * - \ref SPI_SLVUR_INT_MASK + * - \ref SPI_SLVBE_INT_MASK + * - \ref SPI_TXUF_INT_MASK + * - \ref SPI_FIFO_RXOV_INT_MASK + * - \ref SPI_FIFO_RXTO_INT_MASK + * + * @return None + * @details Clear SPI related interrupt flags specified by u32Mask parameter. + */ +void SPI_ClearIntFlag(SPI_T *spi, uint32_t u32Mask) +{ + if (u32Mask & SPI_UNIT_INT_MASK) + { + spi->STATUS = SPI_STATUS_UNITIF_Msk; /* Clear unit transfer interrupt flag */ + } + + if (u32Mask & SPI_SSACT_INT_MASK) + { + spi->STATUS = SPI_STATUS_SSACTIF_Msk; /* Clear slave selection signal active interrupt flag */ + } + + if (u32Mask & SPI_SSINACT_INT_MASK) + { + spi->STATUS = SPI_STATUS_SSINAIF_Msk; /* Clear slave selection signal inactive interrupt flag */ + } + + if (u32Mask & SPI_SLVUR_INT_MASK) + { + spi->STATUS = SPI_STATUS_SLVURIF_Msk; /* Clear slave TX under run interrupt flag */ + } + + if (u32Mask & SPI_SLVBE_INT_MASK) + { + spi->STATUS = SPI_STATUS_SLVBEIF_Msk; /* Clear slave bit count error interrupt flag */ + } + + if (u32Mask & SPI_TXUF_INT_MASK) + { + spi->STATUS = SPI_STATUS_TXUFIF_Msk; /* Clear slave TX underflow interrupt flag */ + } + + if (u32Mask & SPI_FIFO_RXOV_INT_MASK) + { + spi->STATUS = SPI_STATUS_RXOVIF_Msk; /* Clear RX overrun interrupt flag */ + } + + if (u32Mask & SPI_FIFO_RXTO_INT_MASK) + { + spi->STATUS = SPI_STATUS_RXTOIF_Msk; /* Clear RX time-out interrupt flag */ + } +} + +/** + * @brief Get SPI status. + * @param[in] spi The pointer of the specified SPI module. + * @param[in] u32Mask The combination of all related sources. + * Each bit corresponds to a source. + * This parameter decides which flags will be read. It is combination of: + * - \ref SPI_BUSY_MASK + * - \ref SPI_RX_EMPTY_MASK + * - \ref SPI_RX_FULL_MASK + * - \ref SPI_TX_EMPTY_MASK + * - \ref SPI_TX_FULL_MASK + * - \ref SPI_TXRX_RESET_MASK + * - \ref SPI_SPIEN_STS_MASK + * - \ref SPI_SSLINE_STS_MASK + * + * @return Flags of selected sources. + * @details Get SPI related status specified by u32Mask parameter. + */ +uint32_t SPI_GetStatus(SPI_T *spi, uint32_t u32Mask) +{ + uint32_t u32Flag = 0U, u32TmpValue; + + u32TmpValue = spi->STATUS & SPI_STATUS_BUSY_Msk; + /* Check busy status */ + if ((u32Mask & SPI_BUSY_MASK) && (u32TmpValue)) + { + u32Flag |= SPI_BUSY_MASK; + } + + u32TmpValue = spi->STATUS & SPI_STATUS_RXEMPTY_Msk; + /* Check RX empty flag */ + if ((u32Mask & SPI_RX_EMPTY_MASK) && (u32TmpValue)) + { + u32Flag |= SPI_RX_EMPTY_MASK; + } + + u32TmpValue = spi->STATUS & SPI_STATUS_RXFULL_Msk; + /* Check RX full flag */ + if ((u32Mask & SPI_RX_FULL_MASK) && (u32TmpValue)) + { + u32Flag |= SPI_RX_FULL_MASK; + } + + u32TmpValue = spi->STATUS & SPI_STATUS_TXEMPTY_Msk; + /* Check TX empty flag */ + if ((u32Mask & SPI_TX_EMPTY_MASK) && (u32TmpValue)) + { + u32Flag |= SPI_TX_EMPTY_MASK; + } + + u32TmpValue = spi->STATUS & SPI_STATUS_TXFULL_Msk; + /* Check TX full flag */ + if ((u32Mask & SPI_TX_FULL_MASK) && (u32TmpValue)) + { + u32Flag |= SPI_TX_FULL_MASK; + } + + u32TmpValue = spi->STATUS & SPI_STATUS_TXRXRST_Msk; + /* Check TX/RX reset flag */ + if ((u32Mask & SPI_TXRX_RESET_MASK) && (u32TmpValue)) + { + u32Flag |= SPI_TXRX_RESET_MASK; + } + + u32TmpValue = spi->STATUS & SPI_STATUS_SPIENSTS_Msk; + /* Check SPIEN flag */ + if ((u32Mask & SPI_SPIEN_STS_MASK) && (u32TmpValue)) + { + u32Flag |= SPI_SPIEN_STS_MASK; + } + + u32TmpValue = spi->STATUS & SPI_STATUS_SSLINE_Msk; + /* Check SPIx_SS line status */ + if ((u32Mask & SPI_SSLINE_STS_MASK) && (u32TmpValue)) + { + u32Flag |= SPI_SSLINE_STS_MASK; + } + + return u32Flag; +} + + +/** + * @brief This function is used to get I2S source clock frequency. + * @param[in] i2s The pointer of the specified I2S module. + * @return I2S source clock frequency (Hz). + * @details Return the source clock frequency according to the setting of SPI0SEL (CLKSEL2[27:26]). + */ +static uint32_t SPII2S_GetSourceClockFreq(SPI_T *i2s) +{ + uint32_t u32Freq = 0; + + if (i2s == SPI0) + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI0SEL_Msk) == CLK_CLKSEL4_SPI0SEL_APLL) + { + u32Freq = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI0SEL_Msk) == CLK_CLKSEL4_SPI0SEL_PCLK1) + { + /* Clock source is PCLK1 */ + u32Freq = CLK_GetPCLK1Freq(); + } + } + else if (i2s == SPI1) + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI1SEL_Msk) == CLK_CLKSEL4_SPI1SEL_APLL) + { + u32Freq = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI1SEL_Msk) == CLK_CLKSEL4_SPI1SEL_PCLK2) + { + /* Clock source is PCLK2 */ + u32Freq = CLK_GetPCLK2Freq(); + } + } + else if (i2s == SPI2) + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI2SEL_Msk) == CLK_CLKSEL4_SPI2SEL_APLL) + { + u32Freq = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI2SEL_Msk) == CLK_CLKSEL4_SPI2SEL_PCLK1) + { + /* Clock source is PCLK1 */ + u32Freq = CLK_GetPCLK1Freq(); + } + } + else + { + if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI3SEL_Msk) == CLK_CLKSEL4_SPI3SEL_APLL) + { + u32Freq = CLK_GetPLLClockFreq(APLL); /* Clock source is APLL */ + } + else if ((CLK->CLKSEL4 & CLK_CLKSEL4_SPI3SEL_Msk) == CLK_CLKSEL4_SPI3SEL_PCLK2) + { + /* Clock source is PCLK2 */ + u32Freq = CLK_GetPCLK2Freq(); + } + } + + return u32Freq; +} + +/** + * @brief This function configures some parameters of I2S interface for general purpose use. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32MasterSlave I2S operation mode. Valid values are listed below. + * - \ref SPII2S_MODE_MASTER + * - \ref SPII2S_MODE_SLAVE + * @param[in] u32SampleRate Sample rate + * @param[in] u32WordWidth Data length. Valid values are listed below. + * - \ref SPII2S_DATABIT_8 + * - \ref SPII2S_DATABIT_16 + * - \ref SPII2S_DATABIT_24 + * - \ref SPII2S_DATABIT_32 + * @param[in] u32Channels Audio format. Valid values are listed below. + * - \ref SPII2S_MONO + * - \ref SPII2S_STEREO + * @param[in] u32DataFormat Data format. Valid values are listed below. + * - \ref SPII2S_FORMAT_I2S + * - \ref SPII2S_FORMAT_MSB + * - \ref SPII2S_FORMAT_PCMA + * - \ref SPII2S_FORMAT_PCMB + * @return Real sample rate of master mode or peripheral clock rate of slave mode. + * @details This function will reset SPI/I2S controller and configure I2S controller according to the input parameters. + * Set TX FIFO threshold to 2 and RX FIFO threshold to 1. Both the TX and RX functions will be enabled. + * The actual sample rate may be different from the target sample rate. The real sample rate will be returned for reference. + * @note In slave mode, the SPI peripheral clock rate will be equal to APB clock rate. + */ +uint32_t SPII2S_Open(SPI_T *i2s, uint32_t u32MasterSlave, uint32_t u32SampleRate, uint32_t u32WordWidth, uint32_t u32Channels, uint32_t u32DataFormat) +{ + uint32_t u32Divider; + uint32_t u32BitRate, u32SrcClk, u32RetValue; + + /* Reset SPI/I2S */ + if (i2s == SPI0) + { + SYS->IPRST1 |= SYS_IPRST1_SPI0RST_Msk; + SYS->IPRST1 &= ~SYS_IPRST1_SPI0RST_Msk; + } + else if (i2s == SPI1) + { + SYS->IPRST1 |= SYS_IPRST1_SPI1RST_Msk; + SYS->IPRST1 &= ~SYS_IPRST1_SPI1RST_Msk; + } + else if (i2s == SPI2) + { + SYS->IPRST1 |= SYS_IPRST1_SPI2RST_Msk; + SYS->IPRST1 &= ~SYS_IPRST1_SPI2RST_Msk; + } + else + { + SYS->IPRST2 |= SYS_IPRST2_SPI3RST_Msk; + SYS->IPRST2 &= ~SYS_IPRST2_SPI3RST_Msk; + } + + /* Configure I2S controller */ + i2s->I2SCTL = u32MasterSlave | u32WordWidth | u32Channels | u32DataFormat; + /* Set TX FIFO threshold to 2 and RX FIFO threshold to 1 */ + SPI_SetFIFO(i2s, 2, 1); + + if (u32MasterSlave == SPI_MASTER) + { + /* Get the source clock rate */ + u32SrcClk = SPII2S_GetSourceClockFreq(i2s); + + /* Calculate the bit clock rate */ + u32BitRate = u32SampleRate * ((u32WordWidth >> SPI_I2SCTL_WDWIDTH_Pos) + 1U) * 16U; + u32Divider = ((u32SrcClk / u32BitRate) >> 1U) - 1U; + //u32Divider = ((((u32SrcClk * 10UL / u32BitRate) >> 1U) + 5UL) / 10UL) - 1U; + /* Set BCLKDIV setting */ + i2s->I2SCLK = (i2s->I2SCLK & ~SPI_I2SCLK_BCLKDIV_Msk) | (u32Divider << SPI_I2SCLK_BCLKDIV_Pos); + + /* Calculate bit clock rate */ + u32BitRate = u32SrcClk / ((u32Divider + 1U) * 2U); + /* Calculate real sample rate */ + u32SampleRate = u32BitRate / (((u32WordWidth >> SPI_I2SCTL_WDWIDTH_Pos) + 1U) * 16U); + + /* Enable TX function, RX function and I2S mode. */ + i2s->I2SCTL |= (SPI_I2SCTL_RXEN_Msk | SPI_I2SCTL_TXEN_Msk | SPI_I2SCTL_I2SEN_Msk); + + /* Return the real sample rate */ + u32RetValue = u32SampleRate; + } + else + { + /* Set BCLKDIV = 0 */ + i2s->I2SCLK &= ~SPI_I2SCLK_BCLKDIV_Msk; + + if (i2s == SPI0) + { + /* Set the peripheral clock rate to equal APB clock rate */ + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI0SEL_Msk)) | CLK_CLKSEL4_SPI0SEL_PCLK1; + /* Enable TX function, RX function and I2S mode. */ + i2s->I2SCTL |= (SPI_I2SCTL_RXEN_Msk | SPI_I2SCTL_TXEN_Msk | SPI_I2SCTL_I2SEN_Msk); + /* Return slave peripheral clock rate */ + u32RetValue = CLK_GetPCLK1Freq(); + } + else if (i2s == SPI1) + { + /* Set the peripheral clock rate to equal APB clock rate */ + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI1SEL_Msk)) | CLK_CLKSEL4_SPI1SEL_PCLK2; + /* Enable TX function, RX function and I2S mode. */ + i2s->I2SCTL |= (SPI_I2SCTL_RXEN_Msk | SPI_I2SCTL_TXEN_Msk | SPI_I2SCTL_I2SEN_Msk); + /* Return slave peripheral clock rate */ + u32RetValue = CLK_GetPCLK2Freq(); + } + else if (i2s == SPI2) + { + /* Set the peripheral clock rate to equal APB clock rate */ + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI2SEL_Msk)) | CLK_CLKSEL4_SPI2SEL_PCLK1; + /* Enable TX function, RX function and I2S mode. */ + i2s->I2SCTL |= (SPI_I2SCTL_RXEN_Msk | SPI_I2SCTL_TXEN_Msk | SPI_I2SCTL_I2SEN_Msk); + /* Return slave peripheral clock rate */ + u32RetValue = CLK_GetPCLK1Freq(); + } + else + { + /* Set the peripheral clock rate to equal APB clock rate */ + CLK->CLKSEL4 = (CLK->CLKSEL4 & (~CLK_CLKSEL4_SPI3SEL_Msk)) | CLK_CLKSEL4_SPI3SEL_PCLK2; + /* Enable TX function, RX function and I2S mode. */ + i2s->I2SCTL |= (SPI_I2SCTL_RXEN_Msk | SPI_I2SCTL_TXEN_Msk | SPI_I2SCTL_I2SEN_Msk); + /* Return slave peripheral clock rate */ + u32RetValue = CLK_GetPCLK2Freq(); + } + } + + return u32RetValue; +} + +/** + * @brief Disable I2S function. + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details Disable I2S function. + */ +void SPII2S_Close(SPI_T *i2s) +{ + i2s->I2SCTL &= ~SPI_I2SCTL_I2SEN_Msk; +} + +/** + * @brief Enable interrupt function. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32Mask The combination of all related interrupt enable bits. + * Each bit corresponds to a interrupt source. Valid values are listed below. + * - \ref SPII2S_FIFO_TXTH_INT_MASK + * - \ref SPII2S_FIFO_RXTH_INT_MASK + * - \ref SPII2S_FIFO_RXOV_INT_MASK + * - \ref SPII2S_FIFO_RXTO_INT_MASK + * - \ref SPII2S_TXUF_INT_MASK + * - \ref SPII2S_RIGHT_ZC_INT_MASK + * - \ref SPII2S_LEFT_ZC_INT_MASK + * @return None + * @details This function enables the interrupt according to the u32Mask parameter. + */ +void SPII2S_EnableInt(SPI_T *i2s, uint32_t u32Mask) +{ + /* Enable TX threshold interrupt flag */ + if ((u32Mask & SPII2S_FIFO_TXTH_INT_MASK) == SPII2S_FIFO_TXTH_INT_MASK) + { + i2s->FIFOCTL |= SPI_FIFOCTL_TXTHIEN_Msk; + } + + /* Enable RX threshold interrupt flag */ + if ((u32Mask & SPII2S_FIFO_RXTH_INT_MASK) == SPII2S_FIFO_RXTH_INT_MASK) + { + i2s->FIFOCTL |= SPI_FIFOCTL_RXTHIEN_Msk; + } + + /* Enable RX overrun interrupt flag */ + if ((u32Mask & SPII2S_FIFO_RXOV_INT_MASK) == SPII2S_FIFO_RXOV_INT_MASK) + { + i2s->FIFOCTL |= SPI_FIFOCTL_RXOVIEN_Msk; + } + + /* Enable RX time-out interrupt flag */ + if ((u32Mask & SPII2S_FIFO_RXTO_INT_MASK) == SPII2S_FIFO_RXTO_INT_MASK) + { + i2s->FIFOCTL |= SPI_FIFOCTL_RXTOIEN_Msk; + } + + /* Enable TX underflow interrupt flag */ + if ((u32Mask & SPII2S_TXUF_INT_MASK) == SPII2S_TXUF_INT_MASK) + { + i2s->FIFOCTL |= SPI_FIFOCTL_TXUFIEN_Msk; + } + + /* Enable right channel zero cross interrupt flag */ + if ((u32Mask & SPII2S_RIGHT_ZC_INT_MASK) == SPII2S_RIGHT_ZC_INT_MASK) + { + i2s->I2SCTL |= SPI_I2SCTL_RZCIEN_Msk; + } + + /* Enable left channel zero cross interrupt flag */ + if ((u32Mask & SPII2S_LEFT_ZC_INT_MASK) == SPII2S_LEFT_ZC_INT_MASK) + { + i2s->I2SCTL |= SPI_I2SCTL_LZCIEN_Msk; + } +} + +/** + * @brief Disable interrupt function. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32Mask The combination of all related interrupt enable bits. + * Each bit corresponds to a interrupt source. Valid values are listed below. + * - \ref SPII2S_FIFO_TXTH_INT_MASK + * - \ref SPII2S_FIFO_RXTH_INT_MASK + * - \ref SPII2S_FIFO_RXOV_INT_MASK + * - \ref SPII2S_FIFO_RXTO_INT_MASK + * - \ref SPII2S_TXUF_INT_MASK + * - \ref SPII2S_RIGHT_ZC_INT_MASK + * - \ref SPII2S_LEFT_ZC_INT_MASK + * @return None + * @details This function disables the interrupt according to the u32Mask parameter. + */ +void SPII2S_DisableInt(SPI_T *i2s, uint32_t u32Mask) +{ + /* Disable TX threshold interrupt flag */ + if ((u32Mask & SPII2S_FIFO_TXTH_INT_MASK) == SPII2S_FIFO_TXTH_INT_MASK) + { + i2s->FIFOCTL &= ~SPI_FIFOCTL_TXTHIEN_Msk; + } + + /* Disable RX threshold interrupt flag */ + if ((u32Mask & SPII2S_FIFO_RXTH_INT_MASK) == SPII2S_FIFO_RXTH_INT_MASK) + { + i2s->FIFOCTL &= ~SPI_FIFOCTL_RXTHIEN_Msk; + } + + /* Disable RX overrun interrupt flag */ + if ((u32Mask & SPII2S_FIFO_RXOV_INT_MASK) == SPII2S_FIFO_RXOV_INT_MASK) + { + i2s->FIFOCTL &= ~SPI_FIFOCTL_RXOVIEN_Msk; + } + + /* Disable RX time-out interrupt flag */ + if ((u32Mask & SPII2S_FIFO_RXTO_INT_MASK) == SPII2S_FIFO_RXTO_INT_MASK) + { + i2s->FIFOCTL &= ~SPI_FIFOCTL_RXTOIEN_Msk; + } + + /* Disable TX underflow interrupt flag */ + if ((u32Mask & SPII2S_TXUF_INT_MASK) == SPII2S_TXUF_INT_MASK) + { + i2s->FIFOCTL &= ~SPI_FIFOCTL_TXUFIEN_Msk; + } + + /* Disable right channel zero cross interrupt flag */ + if ((u32Mask & SPII2S_RIGHT_ZC_INT_MASK) == SPII2S_RIGHT_ZC_INT_MASK) + { + i2s->I2SCTL &= ~SPI_I2SCTL_RZCIEN_Msk; + } + + /* Disable left channel zero cross interrupt flag */ + if ((u32Mask & SPII2S_LEFT_ZC_INT_MASK) == SPII2S_LEFT_ZC_INT_MASK) + { + i2s->I2SCTL &= ~SPI_I2SCTL_LZCIEN_Msk; + } +} + +/** + * @brief Enable master clock (MCLK). + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32BusClock The target MCLK clock rate. + * @return Actual MCLK clock rate + * @details Set the master clock rate according to u32BusClock parameter and enable master clock output. + * The actual master clock rate may be different from the target master clock rate. The real master clock rate will be returned for reference. + */ +uint32_t SPII2S_EnableMCLK(SPI_T *i2s, uint32_t u32BusClock) +{ + uint32_t u32Divider; + uint32_t u32SrcClk, u32RetValue; + + u32SrcClk = SPII2S_GetSourceClockFreq(i2s); + if (u32BusClock == u32SrcClk) + { + u32Divider = 0U; + } + else + { + u32Divider = (u32SrcClk / u32BusClock) >> 1U; + /* MCLKDIV is a 6-bit width configuration. The maximum value is 0x3F. */ + if (u32Divider > 0x3FU) + { + u32Divider = 0x3FU; + } + } + + /* Write u32Divider to MCLKDIV (SPI_I2SCLK[5:0]) */ + i2s->I2SCLK = (i2s->I2SCLK & ~SPI_I2SCLK_MCLKDIV_Msk) | (u32Divider << SPI_I2SCLK_MCLKDIV_Pos); + + /* Enable MCLK output */ + i2s->I2SCTL |= SPI_I2SCTL_MCLKEN_Msk; + + if (u32Divider == 0U) + { + u32RetValue = u32SrcClk; /* If MCLKDIV=0, master clock rate is equal to the source clock rate. */ + } + else + { + u32RetValue = ((u32SrcClk >> 1U) / u32Divider); /* If MCLKDIV>0, master clock rate = source clock rate / (MCLKDIV * 2) */ + } + + return u32RetValue; +} + +/** + * @brief Disable master clock (MCLK). + * @param[in] i2s The pointer of the specified I2S module. + * @return None + * @details Clear MCLKEN bit of SPI_I2SCTL register to disable master clock output. + */ +void SPII2S_DisableMCLK(SPI_T *i2s) +{ + i2s->I2SCTL &= ~SPI_I2SCTL_MCLKEN_Msk; +} + +/** + * @brief Configure FIFO threshold setting. + * @param[in] i2s The pointer of the specified I2S module. + * @param[in] u32TxThreshold Decides the TX FIFO threshold. It could be 0 ~ 3. + * @param[in] u32RxThreshold Decides the RX FIFO threshold. It could be 0 ~ 3. + * @return None + * @details Set TX FIFO threshold and RX FIFO threshold configurations. + */ +void SPII2S_SetFIFO(SPI_T *i2s, uint32_t u32TxThreshold, uint32_t u32RxThreshold) +{ + i2s->FIFOCTL = (i2s->FIFOCTL & ~(SPI_FIFOCTL_TXTH_Msk | SPI_FIFOCTL_RXTH_Msk)) | + (u32TxThreshold << SPI_FIFOCTL_TXTH_Pos) | + (u32RxThreshold << SPI_FIFOCTL_RXTH_Pos); +} + +/*@}*/ /* end of group SPI_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group SPI_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ssmcc.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ssmcc.c new file mode 100644 index 0000000000..cb9e0e8cad --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_ssmcc.c @@ -0,0 +1,133 @@ +/**************************************************************************//** + * @file ssmcc.c + * @brief SSMCC driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ +#include "NuMicro.h" + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup SSMCC_Driver SSMCC Driver + @{ +*/ + +/** @addtogroup SSMCC_EXPORTED_FUNCTIONS SSMCC Exported Functions + @{ +*/ + +/** + * @brief Set TZC Region0. + * @param[in] u32Attr is security attribute for all region 0. + * @return none + * @details + * SSMCC::TZC0:Ch0 CA35, AXI-AP + * SSMCC::TZC0:Ch1 GFX, VC8000 + * SSMCC::TZC0:Ch2 DCUltra + * SSMCC::TZC0:Ch3 GMAC0, GMAC1 + * SSMCC::TZC2:Ch0 CCAP0, CCAP1 + * SSMCC::TZC2:Ch1 CM4 + * PDMA0, PDMA1, PDMA2, PDMA3 + * SDH0, SDH1 + * HSUSBH0, HSUSBH1, USBH0, USBH1, USBH2 + * HSUSBD, NFI + * SSMCC::TZC2:Ch2 CRYPTO + * \hideinitializer + */ +#define TZC0_CH_NUM 4 +#define TZC2_CH_NUM 3 + +void SSMCC_SetRegion0(uint32_t u32Attr) +{ + /* Enable SSMCC clock */ + CLK->APBCLK2 |= CLK_APBCLK2_SSMCCEN_Msk; + + /* Enable IP clocks on channels. */ + CLK->CLKSEL0 |= CLK_CLKSEL0_SYSCK0SEL_SYSPLL; + + CLK->SYSCLK0 |= (CLK_SYSCLK0_CCAP1EN_Msk | + CLK_SYSCLK0_CCAP0EN_Msk | + CLK_SYSCLK0_GMAC1EN_Msk | + CLK_SYSCLK0_GMAC0EN_Msk | + CLK_SYSCLK0_DCUEN_Msk | + CLK_SYSCLK0_VDECEN_Msk | + CLK_SYSCLK0_GFXEN_Msk | + CLK_SYSCLK0_HUSBH1EN_Msk | + CLK_SYSCLK0_HUSBH0EN_Msk | + CLK_SYSCLK0_USBHEN_Msk | + CLK_SYSCLK0_USBDEN_Msk | + CLK_SYSCLK0_NANDEN_Msk | + CLK_SYSCLK0_SDH1EN_Msk | + CLK_SYSCLK0_SDH0EN_Msk); + + /* Set region 0 secure attribute */ + TZC0->REGION[SSMCC_REGION_0].ATTRIBUTES = u32Attr & (TZC_REGION_ATTRIBUTES_s_rd_en_Msk | TZC_REGION_ATTRIBUTES_s_wr_en_Msk); + TZC0->GATE_KEEPER = (1 << TZC0_CH_NUM) - 1; /* CH[0, 1, 2, 3] used, filter mask is 0xF */ + TZC2->REGION[SSMCC_REGION_0].ATTRIBUTES = u32Attr & (TZC_REGION_ATTRIBUTES_s_rd_en_Msk | TZC_REGION_ATTRIBUTES_s_wr_en_Msk); + TZC2->GATE_KEEPER = (1 << TZC2_CH_NUM) - 1; /* CH[0, 1, 2] used, filter mask is 0x7 */ + + while (1) + { + if (((TZC0->GATE_KEEPER & TZC_GATE_KEEPER_open_status_Msk) == (((1 << TZC0_CH_NUM) - 1) << TZC_GATE_KEEPER_open_status_Pos)) + && ((TZC2->GATE_KEEPER & TZC_GATE_KEEPER_open_status_Msk) == (((1 << TZC2_CH_NUM) - 1) << TZC_GATE_KEEPER_open_status_Pos))) + { + break; + } + } + + /* set region 0 non-secure attribute */ + TZC0->REGION[SSMCC_REGION_0].ID_ACCESS = u32Attr & 0x00010001; + TZC2->REGION[SSMCC_REGION_0].ID_ACCESS = u32Attr & 0x00030003; + + CLK->SYSCLK0 &= ~(CLK_SYSCLK0_CCAP1EN_Msk | + CLK_SYSCLK0_CCAP0EN_Msk | + CLK_SYSCLK0_GMAC1EN_Msk | + CLK_SYSCLK0_GMAC0EN_Msk | + CLK_SYSCLK0_DCUEN_Msk | + CLK_SYSCLK0_VDECEN_Msk | + CLK_SYSCLK0_GFXEN_Msk | + CLK_SYSCLK0_HUSBH1EN_Msk | + CLK_SYSCLK0_HUSBH0EN_Msk | + CLK_SYSCLK0_USBHEN_Msk | + CLK_SYSCLK0_USBDEN_Msk | + CLK_SYSCLK0_NANDEN_Msk | + CLK_SYSCLK0_SDH1EN_Msk | + CLK_SYSCLK0_SDH0EN_Msk); + + //CLK->CLKSEL0 &= ~CLK_CLKSEL0_SYSCK0SEL_Msk; +} + +/** + * @brief Set TZC Regions. + * @param[in] psParam is structure pointer of SSMCC parameter. + * @return none + * @details + * \hideinitializer + */ +void SSMCC_SetRegion(SSMCC_PARAM_T *psParam) +{ + if (psParam && + psParam->region_no != SSMCC_REGION_0) + { + TZC0->REGION[psParam->region_no].BASE_LOW = psParam->base_address; + TZC0->REGION[psParam->region_no].TOP_LOW = psParam->base_address + psParam->size - 1; + TZC0->REGION[psParam->region_no].ATTRIBUTES = ((1 << TZC0_CH_NUM) - 1) | (psParam->attribute & (TZC_REGION_ATTRIBUTES_s_rd_en_Msk | TZC_REGION_ATTRIBUTES_s_wr_en_Msk)); + TZC0->REGION[psParam->region_no].ID_ACCESS = psParam->attribute & 0x00010001; + + TZC2->REGION[psParam->region_no].BASE_LOW = psParam->base_address; + TZC2->REGION[psParam->region_no].TOP_LOW = psParam->base_address + psParam->size - 1; + TZC2->REGION[psParam->region_no].ATTRIBUTES = ((1 << TZC2_CH_NUM) - 1) | (psParam->attribute & (TZC_REGION_ATTRIBUTES_s_rd_en_Msk | TZC_REGION_ATTRIBUTES_s_wr_en_Msk)); + TZC2->REGION[psParam->region_no].ID_ACCESS = psParam->attribute & 0x00030003; + } +} + +/*@}*/ /* end of group SSMCC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group SSMCC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sspcc.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sspcc.c new file mode 100644 index 0000000000..d72def46d5 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sspcc.c @@ -0,0 +1,106 @@ +/**************************************************************************//** + * @file sspcc.c + * @brief SSPCC driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup SSPCC_Driver SSPCC Driver + @{ +*/ + +/** @addtogroup SSPCC_EXPORTED_FUNCTIONS SSPCC Exported Functions + @{ +*/ + +/** + * @brief Set Peripheral Realm + * + * @param[in] u32Perip SSPCC Peripheral ID. + * @param[in] u32Realm Security set(Realm). It could be \n + * SSPCC_SSET_TZS, SSPCC_SSET_TZNS, SSPCC_SSET_SUBM. + * + * @return None + * + * @details This function is used to set specified realm. + */ +void SSPCC_SetRealm(uint32_t u32Perip, uint32_t u32Realm) +{ + vu32 *pu32SSet = (vu32 *)(SSPCC_BASE + (u32Perip >> SSPCC_REG_Pos)); + uint32_t u32Pos = u32Perip & SSPCC_PS_Msk; + + *pu32SSet = (*pu32SSet & ~(SSPCC_SSET_Msk << u32Pos)) | (u32Realm << u32Pos); +} + +/** + * @brief Get Peripheral Realm + * + * @param[in] u32Perip SSPCC Peripheral ID. + * @param[out] u32Realm Security set(Realm). It could be \n + * SSPCC_SSET_TZS, SSPCC_SSET_TZNS, SSPCC_SSET_SUBM. + * + * @return None + * + * @details This function is used to get specified realm. + */ +uint32_t SSPCC_GetRealm(uint32_t u32Perip) +{ + vu32 *pu32SSet = (vu32 *)(SSPCC_BASE + (u32Perip >> SSPCC_REG_Pos)); + uint32_t u32Pos = u32Perip & SSPCC_PS_Msk; + + return (*pu32SSet & (SSPCC_SSET_Msk << u32Pos)) >> u32Pos; +} + +/** + * @brief Set Pin Realm + * + * @param[in] u32PortBA GPIO port. It could be GPIOA_BASE, GPIOB_BASE, ..., GPIOM_BASE and GPION_BASE. + * @param[in] u32Pin It could be 0 ~ 15 for PA, PB, ..., PM and PN GPIO ports. + * @param[in] u32Realm realm. It could be \n + * SSPCC_SSET_TZS, SSPCC_SSET_TZNS, SSPCC_SSET_SUBM. + * + * @return None + * + * @details This function is used to set specified IO realm. + */ +void SSPCC_SetRealm_GPIO(uint32_t u32PortBA, uint32_t u32Pin, uint32_t u32Realm) +{ + uint32_t u32PortIdx = (u32PortBA - GPIO_BASE) / 0x40; + vu32 *avu32IOSecuritySet = (vu32 *)&SSPCC->IOASSET; + + avu32IOSecuritySet[u32PortIdx] = (avu32IOSecuritySet[u32PortIdx] & ~(SSPCC_SSET_Msk << (u32Pin << 1))) | (u32Realm << (u32Pin << 1)); +} + +/** + * @brief Get Pin Realm + * + * @param[in] u32PortBA GPIO port. It could be GPIOA_BASE, GPIOB_BASE, ..., GPIOM_BASE and GPION_BASE. + * @param[in] u32Pin It could be 0 ~ 15 for PA, PB, ..., PM and PN GPIO ports. + * + * @return It could be \n + * SSPCC_SSET_TZS, SSPCC_SSET_TZNS, SSPCC_SSET_SUBM. + * + * @details This function is used to set specified IO realm. + */ +uint32_t SSPCC_GetRealm_GPIO(uint32_t u32PortBA, uint32_t u32Pin) +{ + uint32_t u32PortIdx = (u32PortBA - GPIO_BASE) / 0x40; + vu32 *avu32IOSecuritySet = (vu32 *)&SSPCC->IOASSET; + uint32_t u32Ret = avu32IOSecuritySet[u32PortIdx] & (SSPCC_SSET_Msk << (u32Pin << 1)); + + return u32Ret >> (u32Pin << 1); +} + +/*@}*/ /* end of group SSPCC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group SSPCC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sys.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sys.c new file mode 100644 index 0000000000..98a23a2757 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sys.c @@ -0,0 +1,149 @@ +/**************************************************************************//** + * @file sys.c + * @brief SYS driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#include "NuMicro.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup SYS_Driver SYS Driver + @{ +*/ + + +/** @addtogroup SYS_EXPORTED_FUNCTIONS SYS Exported Functions + @{ +*/ + +/** + * @brief Reset selected module + * @param[in] u32ModuleIndex is module index. Including : + * - \ref PDMA0_RST + * - \ref PDMA1_RST + * - \ref PDMA2_RST + * - \ref PDMA3_RST + * - \ref DISPC_RST + * - \ref VCAP0_RST + * - \ref VCAP1_RST + * - \ref GFX_RST + * - \ref VDEC_RST + * - \ref WRHO0_RST + * - \ref WRHO1_RST + * - \ref GMAC0_RST + * - \ref GMAC1_RST + * - \ref HWSEM_RST + * - \ref EBI_RST + * - \ref HSUSBH0_RST + * - \ref HSUSBH1_RST + * - \ref HSUSBD_RST + * - \ref USBHL_RST + * - \ref SDH0_RST + * - \ref SDH1_RST + * - \ref NAND_RST + * - \ref GPIO_RST + * - \ref MCTLP_RST + * - \ref MCTLC_RST + * - \ref DDRPUB_RST + * - \ref TMR0_RST + * - \ref TMR1_RST + * - \ref TMR2_RST + * - \ref TMR3_RST + * - \ref I2C0_RST + * - \ref I2C1_RST + * - \ref I2C2_RST + * - \ref I2C3_RST + * - \ref QSPI0_RST + * - \ref SPI0_RST + * - \ref SPI1_RST + * - \ref SPI2_RST + * - \ref UART0_RST + * - \ref UART1_RST + * - \ref UART2_RST + * - \ref UART3_RST + * - \ref UART4_RST + * - \ref UART5_RST + * - \ref UART6_RST + * - \ref UART7_RST + * - \ref MCAN0_RST + * - \ref MCAN1_RST + * - \ref EADC0_RST + * - \ref I2S0_RST + * - \ref SC0_RST + * - \ref SC1_RST + * - \ref QSPI1_RST + * - \ref SPI3_RST + * - \ref EPWM0_RST + * - \ref EPWM1_RST + * - \ref QEI0_RST + * - \ref QEI1_RST + * - \ref ECAP0_RST + * - \ref ECAP1_RST + * - \ref MCAN2_RST + * - \ref ADC0_RST + * - \ref TMR4_RST + * - \ref TMR5_RST + * - \ref TMR6_RST + * - \ref TMR7_RST + * - \ref TMR8_RST + * - \ref TMR9_RST + * - \ref TMR10_RST + * - \ref TMR11_RST + * - \ref UART8_RST + * - \ref UART9_RST + * - \ref UART10_RST + * - \ref UART11_RST + * - \ref UART12_RST + * - \ref UART13_RST + * - \ref UART14_RST + * - \ref UART15_RST + * - \ref UART16_RST + * - \ref I2S1_RST + * - \ref I2C4_RST + * - \ref I2C5_RST + * - \ref EPWM2_RST + * - \ref ECAP2_RST + * - \ref QEI2_RST + * - \ref MCAN3_RST + * - \ref KPI_RST + * - \ref GIC_RST + * - \ref SSMCC_RST + * - \ref SSPCC_RST + * @return None + * @details This function reset selected module. + */ +void SYS_ResetModule(uint32_t u32ModuleIndex) +{ + uint32_t u32tmpVal = 0UL, u32tmpAddr = 0UL; + + /* Generate reset signal to the corresponding module */ + u32tmpVal = (1UL << (u32ModuleIndex & 0x00ffffffUL)); + u32tmpAddr = (vu32)&SYS->IPRST0 + ((u32ModuleIndex >> 24UL)); + *(vu32 *)u32tmpAddr |= u32tmpVal; + + /* Release corresponding module from reset state */ + u32tmpVal = ~(1UL << (u32ModuleIndex & 0x00ffffffUL)); + *(vu32 *)u32tmpAddr &= u32tmpVal; +} + + +/*@}*/ /* end of group SYS_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group SYS_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + +#ifdef __cplusplus +} +#endif + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_timer.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_timer.c new file mode 100644 index 0000000000..d933ec6587 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_timer.c @@ -0,0 +1,396 @@ +/**************************************************************************//** + * @file timer.c + * @brief Timer Controller(Timer) driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ +#include "NuMicro.h" + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup TIMER_Driver TIMER Driver + @{ +*/ + +/** @addtogroup TIMER_EXPORTED_FUNCTIONS TIMER Exported Functions + @{ +*/ + +/** + * @brief Open Timer with Operate Mode and Frequency + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32Mode Operation mode. Possible options are + * - \ref TIMER_ONESHOT_MODE + * - \ref TIMER_PERIODIC_MODE + * - \ref TIMER_TOGGLE_MODE + * - \ref TIMER_CONTINUOUS_MODE + * @param[in] u32Freq Target working frequency + * + * @return Real timer working frequency + * + * @details This API is used to configure timer to operate in specified mode and frequency. + * If timer cannot work in target frequency, a closest frequency will be chose and returned. + * @note After calling this API, Timer is \b NOT running yet. But could start timer running be calling + * \ref TIMER_Start macro or program registers directly. + */ +uint32_t TIMER_Open(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Freq) +{ + uint32_t u32Clk = TIMER_GetModuleClock(timer); + uint32_t u32Cmpr = 0UL, u32Prescale = 0UL; + + /* Fastest possible timer working freq is (u32Clk / 2). While cmpr = 2, prescaler = 0. */ + if (u32Freq > (u32Clk / 2UL)) + { + u32Cmpr = 2UL; + } + else + { + u32Cmpr = u32Clk / u32Freq; + u32Prescale = (u32Cmpr >> 24); /* for 24 bits CMPDAT */ + + if (u32Prescale > 0UL) + u32Cmpr = u32Cmpr / (u32Prescale + 1UL); + } + + timer->CTL = u32Mode | u32Prescale; + timer->CMP = u32Cmpr; + + return (u32Clk / (u32Cmpr * (u32Prescale + 1UL))); +} + +/** + * @brief Stop Timer Counting + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * + * @return None + * + * @details This API stops timer counting and disable all timer interrupt function. + */ +void TIMER_Close(TIMER_T *timer) +{ + timer->CTL = 0UL; + timer->EXTCTL = 0UL; +} + +/** + * @brief Create a specify Delay Time + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32Usec Delay period in micro seconds. Valid values are between 100~1000000 (100 micro second ~ 1 second). + * + * @return None + * + * @details This API is used to create a delay loop for u32usec micro seconds by using timer one-shot mode. + * @note This API overwrites the register setting of the timer used to count the delay time. + * @note This API use polling mode. So there is no need to enable interrupt for the timer module used to generate delay. + */ +void TIMER_Delay(TIMER_T *timer, uint32_t u32Usec) +{ +#if 0 + uint32_t u32Clk = TIMER_GetModuleClock(timer); + uint32_t u32Prescale = 0UL, delay = (SystemCoreClock / u32Clk) + 1UL; + uint32_t u32Cmpr, u32NsecPerTick; + + /* Clear current timer configuration */ + timer->CTL = 0UL; + timer->EXTCTL = 0UL; + + if (u32Clk <= 1000000UL) /* min delay is 1000 us if timer clock source is <= 1 MHz */ + { + if (u32Usec < 1000UL) + { + u32Usec = 1000UL; + } + + if (u32Usec > 1000000UL) + { + u32Usec = 1000000UL; + } + } + else + { + if (u32Usec < 100UL) + { + u32Usec = 100UL; + } + + if (u32Usec > 1000000UL) + { + u32Usec = 1000000UL; + } + } + + if (u32Clk <= 1000000UL) + { + u32Prescale = 0UL; + u32NsecPerTick = 1000000000UL / u32Clk; + u32Cmpr = (u32Usec * 1000UL) / u32NsecPerTick; + } + else + { + u32Cmpr = u32Usec * (u32Clk / 1000000UL); + u32Prescale = (u32Cmpr >> 24); /* for 24 bits CMPDAT */ + + if (u32Prescale > 0UL) + u32Cmpr = u32Cmpr / (u32Prescale + 1UL); + } + + timer->CMP = u32Cmpr; + timer->CTL = TIMER_CTL_CNTEN_Msk | TIMER_ONESHOT_MODE | u32Prescale; + + /* When system clock is faster than timer clock, it is possible timer active bit cannot set in time while we check it. + And the while loop below return immediately, so put a tiny delay here allowing timer start counting and raise active flag. */ + for (; delay > 0UL; delay--) + { + __NOP(); + } + + while (timer->CTL & TIMER_CTL_ACTSTS_Msk) + { + ; + } +#endif +} + +/** + * @brief Enable Timer Capture Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32CapMode Timer capture mode. Could be + * - \ref TIMER_CAPTURE_FREE_COUNTING_MODE + * - \ref TIMER_CAPTURE_COUNTER_RESET_MODE + * @param[in] u32Edge Timer capture trigger edge. Possible values are + * - \ref TIMER_CAPTURE_EVENT_FALLING + * - \ref TIMER_CAPTURE_EVENT_RISING + * - \ref TIMER_CAPTURE_EVENT_FALLING_RISING + * - \ref TIMER_CAPTURE_EVENT_RISING_FALLING + * + * @return None + * + * @details This API is used to enable timer capture function with specify capture trigger edge \n + * to get current counter value or reset counter value to 0. + * @note Timer frequency should be configured separately by using \ref TIMER_Open API, or program registers directly. + */ +void TIMER_EnableCapture(TIMER_T *timer, uint32_t u32CapMode, uint32_t u32Edge) +{ + timer->EXTCTL = (timer->EXTCTL & ~(TIMER_EXTCTL_CAPFUNCS_Msk | TIMER_EXTCTL_CAPEDGE_Msk)) | + u32CapMode | u32Edge | TIMER_EXTCTL_CAPEN_Msk; +} + +/** + * @brief Disable Timer Capture Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER0, TIMER1, TIMER2, TIMER3. + * + * @return None + * + * @details This API is used to disable the timer capture function. + */ +void TIMER_DisableCapture(TIMER_T *timer) +{ + timer->EXTCTL &= ~TIMER_EXTCTL_CAPEN_Msk; +} + +/** + * @brief Enable Timer Counter Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32Edge Detection edge of counter pin. Could be ether + * - \ref TIMER_COUNTER_EVENT_FALLING, or + * - \ref TIMER_COUNTER_EVENT_RISING + * + * @return None + * + * @details This function is used to enable the timer counter function with specify detection edge. + * @note Timer compare value should be configured separately by using \ref TIMER_SET_CMP_VALUE macro or program registers directly. + * @note While using event counter function, \ref TIMER_TOGGLE_MODE cannot set as timer operation mode. + */ +void TIMER_EnableEventCounter(TIMER_T *timer, uint32_t u32Edge) +{ + timer->EXTCTL = (timer->EXTCTL & ~TIMER_EXTCTL_CNTPHASE_Msk) | u32Edge; + timer->CTL |= TIMER_CTL_EXTCNTEN_Msk; +} + +/** + * @brief Disable Timer Counter Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * + * @return None + * + * @details This API is used to disable the timer event counter function. + */ +void TIMER_DisableEventCounter(TIMER_T *timer) +{ + timer->CTL &= ~TIMER_CTL_EXTCNTEN_Msk; +} + +/** + * @brief Get Timer Clock Frequency + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * + * @return Timer clock frequency + * + * @details This API is used to get the timer clock frequency. + * @note This API cannot return correct clock rate if timer source is from external clock input. + */ +uint32_t TIMER_GetModuleClock(TIMER_T *timer) +{ + uint32_t u32Src, u32Clk; + const uint32_t au32Clk[] = {__HXT, __LXT, 0UL, 0UL, 0UL, __LIRC, 0UL, __HIRC}; + + if (timer == TIMER0) + { + u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR0SEL_Msk) >> CLK_CLKSEL1_TMR0SEL_Pos; + } + else if (timer == TIMER1) + { + u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR1SEL_Msk) >> CLK_CLKSEL1_TMR1SEL_Pos; + } + else if (timer == TIMER2) + { + u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR2SEL_Msk) >> CLK_CLKSEL1_TMR2SEL_Pos; + } + else if (timer == TIMER3) + { + u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR3SEL_Msk) >> CLK_CLKSEL1_TMR3SEL_Pos; + } + else if (timer == TIMER4) + { + u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR4SEL_Msk) >> CLK_CLKSEL1_TMR4SEL_Pos; + } + else if (timer == TIMER5) + { + u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR5SEL_Msk) >> CLK_CLKSEL1_TMR5SEL_Pos; + } + else if (timer == TIMER6) + { + u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR6SEL_Msk) >> CLK_CLKSEL1_TMR6SEL_Pos; + } + else if (timer == TIMER7) + { + u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR7SEL_Msk) >> CLK_CLKSEL1_TMR7SEL_Pos; + } + else if (timer == TIMER8) + { + u32Src = (CLK->CLKSEL2 & CLK_CLKSEL2_TMR8SEL_Msk) >> CLK_CLKSEL2_TMR8SEL_Pos; + } + else if (timer == TIMER9) + { + u32Src = (CLK->CLKSEL2 & CLK_CLKSEL2_TMR9SEL_Msk) >> CLK_CLKSEL2_TMR9SEL_Pos; + } + else if (timer == TIMER10) + { + u32Src = (CLK->CLKSEL2 & CLK_CLKSEL2_TMR10SEL_Msk) >> CLK_CLKSEL2_TMR10SEL_Pos; + } + else /* Timer 11 */ + { + u32Src = (CLK->CLKSEL2 & CLK_CLKSEL2_TMR11SEL_Msk) >> CLK_CLKSEL2_TMR11SEL_Pos; + } + + if (u32Src == 2UL) + { + u32Clk = CLK_GetSYSCLK1Freq(); + } + else + { + u32Clk = au32Clk[u32Src]; + } + + return u32Clk; +} + + + +/** + * @brief This function is used to enable the Timer frequency counter function + * @param[in] timer The base address of Timer module. Can be \ref TIMER2 or \ref TIMER4 + * @param[in] u32DropCount This parameter has no effect + * @param[in] u32Timeout This parameter has no effect + * @param[in] u32EnableInt Enable interrupt assertion after capture complete or not. Valid values are TRUE and FALSE + * @return None + * @details This function is used to calculate input event frequency. After enable + * this function, a pair of timers, TIMER2 and TIMER3, or TIMER4 and TIMER5 + * will be configured for this function. The mode used to calculate input + * event frequency is mentioned as "Inter Timer Trigger Mode" in Technical + * Reference Manual + */ +void TIMER_EnableFreqCounter(TIMER_T *timer, + uint32_t u32DropCount, + uint32_t u32Timeout, + uint32_t u32EnableInt) +{ + TIMER_T *t = NULL; /* store the timer base to configure compare value */ + + if (timer == TIMER0) + t = TIMER1; + else if (timer == TIMER2) + t = TIMER3; + else if (timer == TIMER4) + t = TIMER5; + else if (timer == TIMER6) + t = TIMER7; + else if (timer == TIMER8) + t = TIMER9; + else if (timer == TIMER10) + t = TIMER11; + else // Select error + return; + + t->CMP = 0xFFFFFFUL; + t->EXTCTL = u32EnableInt ? TIMER_EXTCTL_CAPIEN_Msk : 0UL; + timer->CTL = TIMER_CTL_INTRGEN_Msk | TIMER_CTL_CNTEN_Msk; + + return; +} +/** + * @brief This function is used to disable the Timer frequency counter function. + * @param[in] timer The base address of Timer module + * @return None + */ +void TIMER_DisableFreqCounter(TIMER_T *timer) +{ + timer->CTL &= ~TIMER_CTL_INTRGEN_Msk; +} + + +/** + * @brief This function is used to select the interrupt source used to trigger other modules. + * @param[in] timer The base address of Timer module + * @param[in] u32Src Selects the interrupt source to trigger other modules. Could be: + * - \ref TIMER_TRGSRC_TIMEOUT_EVENT + * - \ref TIMER_TRGSRC_CAPTURE_EVENT + * @return None + */ +void TIMER_SetTriggerSource(TIMER_T *timer, uint32_t u32Src) +{ + timer->TRGCTL = (timer->TRGCTL & ~TIMER_TRGCTL_TRGSSEL_Msk) | u32Src; +} + +/** + * @brief This function is used to set modules trigger by timer interrupt + * @param[in] timer The base address of Timer module + * @param[in] u32Mask The mask of modules (EPWM, EADC, DAC and PDMA) trigger by timer. Is the combination of + * - \ref TIMER_TRG_TO_EPWM, + * - \ref TIMER_TRG_TO_EADC, and + * - \ref TIMER_TRG_TO_PDMA + * @return None + */ +void TIMER_SetTriggerTarget(TIMER_T *timer, uint32_t u32Mask) +{ + timer->TRGCTL = (timer->TRGCTL & ~(TIMER_TRGCTL_TRGPWM_Msk | TIMER_TRGCTL_TRGEADC_Msk | TIMER_TRGCTL_TRGPDMA_Msk)) | u32Mask; +} + +/*@}*/ /* end of group TIMER_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group TIMER_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_timer_pwm.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_timer_pwm.c new file mode 100644 index 0000000000..9118564109 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_timer_pwm.c @@ -0,0 +1,437 @@ +/**************************************************************************//** + * @file timer_pwm.c + * @brief Timer PWM Controller(Timer PWM) driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup TIMER_PWM_Driver TIMER PWM Driver + @{ +*/ + +/** @addtogroup TIMER_PWM_EXPORTED_FUNCTIONS TIMER PWM Exported Functions + @{ +*/ + +/** + * @brief Set PWM Counter Clock Source + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32CntClkSrc PWM counter clock source, could be one of following source + * - \ref TPWM_CNTR_CLKSRC_TMR_CLK + * - \ref TPWM_CNTR_CLKSRC_TIMER2_INT + * - \ref TPWM_CNTR_CLKSRC_TIMER3_INT + * - \ref TPWM_CNTR_CLKSRC_TIMER4_INT + * - \ref TPWM_CNTR_CLKSRC_TIMER5_INT + * + * @return None + * + * @details This function is used to set PWM counter clock source. + */ +void TPWM_SetCounterClockSource(TIMER_T *timer, uint32_t u32CntClkSrc) +{ + (timer)->PWMCLKSRC = ((timer)->PWMCLKSRC & ~TIMER_PWMCLKSRC_CLKSRC_Msk) | u32CntClkSrc; +} + +/** + * @brief Configure PWM Output Frequency and Duty Cycle + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32Frequency Target generator frequency. + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0~100. 10 means 10%, 20 means 20%... + * + * @return Nearest frequency clock in nano second + * + * @details This API is used to configure PWM output frequency and duty cycle in up count type and auto-reload operation mode. + * @note This API is only available if Timer PWM counter clock source is from TMRx_CLK. + */ +uint32_t TPWM_ConfigOutputFreqAndDuty(TIMER_T *timer, uint32_t u32Frequency, uint32_t u32DutyCycle) +{ + uint32_t u32PWMClockFreq, u32TargetFreq; + uint32_t u32Prescaler = 0x1000UL, u32Period, u32CMP; + + u32PWMClockFreq = CLK_GetSYSCLK1Freq(); + + /* Calculate u16PERIOD and u16PSC */ + for (u32Prescaler = 1UL; u32Prescaler <= 0x1000UL; u32Prescaler++) + { + u32Period = (u32PWMClockFreq / u32Prescaler) / u32Frequency; + + /* If target u32Period is larger than 0x10000, need to use a larger prescaler */ + if (u32Period <= 0x10000UL) + { + break; + } + } + + /* Store return value here 'cos we're gonna change u32Prescaler & u32Period to the real value to fill into register */ + u32TargetFreq = (u32PWMClockFreq / u32Prescaler) / u32Period; + + /* Set PWM to up count type */ + timer->PWMCTL = (timer->PWMCTL & ~TIMER_PWMCTL_CNTTYPE_Msk) | (TPWM_UP_COUNT << TIMER_PWMCTL_CNTTYPE_Pos); + + /* Set PWM to auto-reload mode */ + timer->PWMCTL = (timer->PWMCTL & ~TIMER_PWMCTL_CNTMODE_Msk) | TPWM_AUTO_RELOAD_MODE; + + /* Convert to real register value */ + TPWM_SET_PRESCALER(timer, (u32Prescaler - 1UL)); + + TPWM_SET_PERIOD(timer, (u32Period - 1UL)); + + if (u32DutyCycle) + { + u32CMP = (u32DutyCycle * u32Period) / 100UL; + } + else + { + u32CMP = 0UL; + } + + TPWM_SET_CMPDAT(timer, u32CMP); + + return (u32TargetFreq); +} + +/** + * @brief Enable Dead-Time Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32DTCount Dead-Time duration in PWM clock count, valid values are between 0x0~0xFFF, but 0x0 means there is no Dead-Time insertion. + * + * @return None + * + * @details This function is used to enable Dead-Time function and counter source is the same as Timer PWM clock source. + * @note The register write-protection function should be disabled before using this function. + */ +void TPWM_EnableDeadTime(TIMER_T *timer, uint32_t u32DTCount) +{ + timer->PWMDTCTL = TIMER_PWMDTCTL_DTEN_Msk | u32DTCount; +} + +/** + * @brief Enable Dead-Time Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32DTCount Dead-Time duration in PWM clock count, valid values are between 0x0~0xFFF, but 0x0 means there is no Dead-Time insertion. + * + * @return None + * + * @details This function is used to enable Dead-Time function and counter source is the Timer PWM clock source with prescale. + * @note The register write-protection function should be disabled before using this function. + */ +void TPWM_EnableDeadTimeWithPrescale(TIMER_T *timer, uint32_t u32DTCount) +{ + timer->PWMDTCTL = TIMER_PWMDTCTL_DTCKSEL_Msk | TIMER_PWMDTCTL_DTEN_Msk | u32DTCount; +} + +/** + * @brief Disable Dead-Time Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * + * @return None + * + * @details This function is used to enable Dead-time of selected channel. + * @note The register write-protection function should be disabled before using this function. + */ +void TPWM_DisableDeadTime(TIMER_T *timer) +{ + timer->PWMDTCTL = 0x0UL; +} + +/** + * @brief Enable PWM Counter + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * + * @return None + * + * @details This function is used to enable PWM generator and start counter counting. + */ +void TPWM_EnableCounter(TIMER_T *timer) +{ + timer->PWMCTL |= TIMER_PWMCTL_CNTEN_Msk; +} + +/** + * @brief Disable PWM Generator + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * + * @return None + * + * @details This function is used to disable PWM counter immediately by clear CNTEN (TIMERx_PWMCTL[0]) bit. + */ +void TPWM_DisableCounter(TIMER_T *timer) +{ + timer->PWMCTL &= ~TIMER_PWMCTL_CNTEN_Msk; +} + +/** + * @brief Enable Trigger ADC + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32Condition The condition to trigger ADC. It could be one of following conditions: + * - \ref TPWM_TRIGGER_ADC_AT_ZERO_POINT + * - \ref TPWM_TRIGGER_ADC_AT_PERIOD_POINT + * - \ref TPWM_TRIGGER_ADC_AT_ZERO_OR_PERIOD_POINT + * - \ref TPWM_TRIGGER_ADC_AT_COMPARE_UP_COUNT_POINT + * - \ref TPWM_TRIGGER_ADC_AT_COMPARE_DOWN_COUNT_POINT + * + * @return None + * + * @details This function is used to enable specified counter compare event to trigger ADC. + */ +void TPWM_EnableTriggerADC(TIMER_T *timer, uint32_t u32Condition) +{ + timer->PWMEADCTS = TIMER_PWMEADCTS_TRGEN_Msk | u32Condition; +} + +/** + * @brief Disable Trigger ADC + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * + * @return None + * + * @details This function is used to disable counter compare event to trigger ADC. + */ +void TPWM_DisableTriggerADC(TIMER_T *timer) +{ + timer->PWMEADCTS = 0x0UL; +} + +/** + * @brief Enable Fault Brake Function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32CH0Level PWMx_CH0 output level while fault brake event occurs. Valid value is one of following setting + * - \ref TPWM_OUTPUT_TOGGLE + * - \ref TPWM_OUTPUT_NOTHING + * - \ref TPWM_OUTPUT_LOW + * - \ref TPWM_OUTPUT_HIGH + * @param[in] u32CH1Level PWMx_CH1 output level while fault brake event occurs. Valid value is one of following setting + * - \ref TPWM_OUTPUT_TOGGLE + * - \ref TPWM_OUTPUT_NOTHING + * - \ref TPWM_OUTPUT_LOW + * - \ref TPWM_OUTPUT_HIGH + * @param[in] u32BrakeSource Fault brake source, combination of following source + * - \ref TPWM_BRAKE_SOURCE_EDGE_ACMP0 + * - \ref TPWM_BRAKE_SOURCE_EDGE_ACMP1 + * - \ref TPWM_BRAKE_SOURCE_EDGE_BKPIN + * - \ref TPWM_BRAKE_SOURCE_EDGE_SYS_CSS + * - \ref TPWM_BRAKE_SOURCE_EDGE_SYS_BOD + * - \ref TPWM_BRAKE_SOURCE_EDGE_SYS_COR + * - \ref TPWM_BRAKE_SOURCE_EDGE_SYS_RAM + * - \ref TPWM_BRAKE_SOURCE_LEVEL_ACMP0 + * - \ref TPWM_BRAKE_SOURCE_LEVEL_ACMP1 + * - \ref TPWM_BRAKE_SOURCE_LEVEL_BKPIN + * - \ref TPWM_BRAKE_SOURCE_LEVEL_SYS_CSS + * - \ref TPWM_BRAKE_SOURCE_LEVEL_SYS_BOD + * - \ref TPWM_BRAKE_SOURCE_LEVEL_SYS_COR + * - \ref TPWM_BRAKE_SOURCE_LEVEL_SYS_RAM + * + * @return None + * + * @details This function is used to enable fault brake function. + * @note The register write-protection function should be disabled before using this function. + */ +void TPWM_EnableFaultBrake(TIMER_T *timer, uint32_t u32CH0Level, uint32_t u32CH1Level, uint32_t u32BrakeSource) +{ + timer->PWMFAILBRK |= ((u32BrakeSource >> 16) & 0xFUL); + timer->PWMBRKCTL = (timer->PWMBRKCTL & ~(TIMER_PWMBRKCTL_BRKAEVEN_Msk | TIMER_PWMBRKCTL_BRKAODD_Msk)) | + (u32BrakeSource & 0xFFFFUL) | (u32CH0Level << TIMER_PWMBRKCTL_BRKAEVEN_Pos) | (u32CH1Level << TIMER_PWMBRKCTL_BRKAODD_Pos); +} + +/** + * @brief Enable Fault Brake Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32IntSource Interrupt source, could be one of following source + * - \ref TPWM_BRAKE_EDGE + * - \ref TPWM_BRAKE_LEVEL + * + * @return None + * + * @details This function is used to enable fault brake interrupt. + * @note The register write-protection function should be disabled before using this function. + */ +void TPWM_EnableFaultBrakeInt(TIMER_T *timer, uint32_t u32IntSource) +{ + timer->PWMINTEN1 |= u32IntSource; +} + +/** + * @brief Disable Fault Brake Interrupt + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32IntSource Interrupt source, could be one of following source + * - \ref TPWM_BRAKE_EDGE + * - \ref TPWM_BRAKE_LEVEL + * + * @return None + * + * @details This function is used to disable fault brake interrupt. + * @note The register write-protection function should be disabled before using this function. + */ +void TPWM_DisableFaultBrakeInt(TIMER_T *timer, uint32_t u32IntSource) +{ + timer->PWMINTEN1 &= ~u32IntSource; +} + +/** + * @brief Indicate Fault Brake Interrupt Flag + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32IntSource Interrupt source, could be one of following source + * - \ref TPWM_BRAKE_EDGE + * - \ref TPWM_BRAKE_LEVEL + * + * @return Fault brake interrupt flag of specified source + * @retval 0 Fault brake interrupt did not occurred + * @retval 1 Fault brake interrupt occurred + * + * @details This function is used to indicate fault brake interrupt flag occurred or not of selected source. + */ +uint32_t TPWM_GetFaultBrakeIntFlag(TIMER_T *timer, uint32_t u32IntSource) +{ + return ((timer->PWMINTSTS1 & (0x3UL << u32IntSource)) ? 1UL : 0UL); +} + +/** + * @brief Clear Fault Brake Interrupt Flags + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32IntSource Interrupt source, could be one of following source + * - \ref TPWM_BRAKE_EDGE + * - \ref TPWM_BRAKE_LEVEL + * + * @return None + * + * @details This function is used to clear fault brake interrupt flags of selected source. + * @note The register write-protection function should be disabled before using this function. + */ +void TPWM_ClearFaultBrakeIntFlag(TIMER_T *timer, uint32_t u32IntSource) +{ + timer->PWMINTSTS1 = (0x3UL << u32IntSource); +} + +/** + * @brief Enable load mode of selected channel + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32LoadMode Timer PWM counter loading mode, could be one of following mode + * - \ref TPWM_LOAD_MODE_PERIOD + * - \ref TPWM_LOAD_MODE_IMMEDIATE + * - \ref TPWM_LOAD_MODE_CENTER + * + * @return None + * + * @details This function is used to enable load mode of selected channel. + * @note The default loading mode is period loading mode. + */ +void TPWM_SetLoadMode(TIMER_T *timer, uint32_t u32LoadMode) +{ + timer->PWMCTL = (timer->PWMCTL & ~(TIMER_PWMCTL_IMMLDEN_Msk | TIMER_PWMCTL_CTRLD_Msk)) | u32LoadMode; +} + +/** + * @brief Enable brake pin noise filter function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32BrakePinSrc The external brake pin source, could be one of following source + * - \ref TPWM_TM_BRAKE0 + * - \ref TPWM_TM_BRAKE1 + * - \ref TPWM_TM_BRAKE2 + * - \ref TPWM_TM_BRAKE3 + * @param[in] u32DebounceCnt This value controls the real debounce sample time. + * The target debounce sample time is (debounce sample clock period) * (u32DebounceCnt). + * @param[in] u32ClkSrcSel Brake pin detector debounce clock source, could be one of following source + * - \ref TPWM_BKP_DBCLK_PCLK_DIV_1 + * - \ref TPWM_BKP_DBCLK_PCLK_DIV_2 + * - \ref TPWM_BKP_DBCLK_PCLK_DIV_4 + * - \ref TPWM_BKP_DBCLK_PCLK_DIV_8 + * - \ref TPWM_BKP_DBCLK_PCLK_DIV_16 + * - \ref TPWM_BKP_DBCLK_PCLK_DIV_32 + * - \ref TPWM_BKP_DBCLK_PCLK_DIV_64 + * - \ref TPWM_BKP_DBCLK_PCLK_DIV_128 + * + * @return None + * + * @details This function is used to enable external brake pin detector noise filter function. + */ +void TPWM_EnableBrakePinDebounce(TIMER_T *timer, uint32_t u32BrakePinSrc, uint32_t u32DebounceCnt, uint32_t u32ClkSrcSel) +{ + timer->PWMBNF = (timer->PWMBNF & ~(TIMER_PWMBNF_BKPINSRC_Msk | TIMER_PWMBNF_BRKFCNT_Msk | TIMER_PWMBNF_BRKNFSEL_Msk)) | + (u32BrakePinSrc << TIMER_PWMBNF_BKPINSRC_Pos) | + (u32DebounceCnt << TIMER_PWMBNF_BRKFCNT_Pos) | + (u32ClkSrcSel << TIMER_PWMBNF_BRKNFSEL_Pos) | TIMER_PWMBNF_BRKNFEN_Msk; +} + +/** + * @brief Disable brake pin noise filter function + * + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * + * @return None + * + * @details This function is used to disable external brake pin detector noise filter function. + */ +void TPWM_DisableBrakePinDebounce(TIMER_T *timer) +{ + timer->PWMBNF &= ~TIMER_PWMBNF_BRKNFEN_Msk; +} + + +/** + * @brief Enable brake pin inverse function + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @return None + * @details This function is used to enable PWM brake pin inverse function. + */ +void TPWM_EnableBrakePinInverse(TIMER_T *timer) +{ + timer->PWMBNF |= TIMER_PWMBNF_BRKPINV_Msk; +} + +/** + * @brief Disable brake pin inverse function + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @return None + * @details This function is used to disable PWM brake pin inverse function. + */ +void TPWM_DisableBrakePinInverse(TIMER_T *timer) +{ + timer->PWMBNF &= ~TIMER_PWMBNF_BRKPINV_Msk; +} + +/** + * @brief Set brake pin source + * @param[in] timer The pointer of the specified Timer module. It could be TIMER2 ~ TIMER11. + * @param[in] u32BrakePinNum Brake pin selection. One of the following: + * - \ref TPWM_TM_BRAKE0 + * - \ref TPWM_TM_BRAKE1 + * - \ref TPWM_TM_BRAKE2 + * - \ref TPWM_TM_BRAKE3 + * @return None + * @details This function is used to set PWM brake pin source. + */ +void TPWM_SetBrakePinSource(TIMER_T *timer, uint32_t u32BrakePinNum) +{ + timer->PWMBNF = (((timer)->PWMBNF & ~TIMER_PWMBNF_BKPINSRC_Msk) | (u32BrakePinNum << TIMER_PWMBNF_BKPINSRC_Pos)); +} + + +/*@}*/ /* end of group TIMER_PWM_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group TIMER_PWM_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_uart.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_uart.c new file mode 100644 index 0000000000..4b4a8a43f0 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_uart.c @@ -0,0 +1,545 @@ +/**************************************************************************//** + * @file uart.c + * @brief UART driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#include +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup UART_Driver UART Driver + @{ +*/ + +/** @addtogroup UART_EXPORTED_FUNCTIONS UART Exported Functions + @{ +*/ + +static void UART_GetSrcClkSetting(UART_T *uart, uint32_t *pu32ClkSrcFreq, uint32_t *pu32ClkDivNum); + +/** + * @brief This function make UART module be ready to transfer. + * @param[in] pu32ClkSrcFreq will return UART source clock frequency(In HZ). + * @param[in] pu32ClkSrcFreq will return UART source clock frequency(In HZ). + * @param[in] pu32ClkDivNum will return UART source clock divider. + * @return None. + * @details + * 0: HXT + * 1: SYSCLK1 + * 2: LXT + * 3: HIRC + * @note If u32BusClock = 0, DIVIDER setting will be set to the maximum value. + */ + +static void UART_GetSrcClkSetting(UART_T *uart, uint32_t *pu32ClkSrcFreq, uint32_t *pu32ClkDivNum) +{ + uint32_t u32UartClkSrcSel = 0u, u32UartClkDivNum = 0u; + uint32_t u32SrcClkFreq = 0u; + uint32_t u32UartPort; + + if (uart == (UART_T *)UART16) + { + u32UartPort = 16; + } + else + { + u32UartPort = ((uint32_t)uart & 0xf0000) >> 16; + } + + if (u32UartPort < 8) + { + u32UartClkSrcSel = ((CLK->CLKSEL2 >> (16 + u32UartPort * 2)) & 0x3ul); + + if (u32UartPort < 4) + { + u32UartClkDivNum = ((CLK->CLKDIV1 >> ((u32UartPort + 4) * 4)) & 0xful); + } + else + { + u32UartClkDivNum = ((CLK->CLKDIV2 >> ((u32UartPort - 4) * 4)) & 0xful); + } + } + else if (u32UartPort <= 16) + { + u32UartClkSrcSel = ((CLK->CLKSEL3 >> ((u32UartPort - 8) * 2)) & 0x3ul); + + if (u32UartPort < 12) + { + u32UartClkDivNum = ((CLK->CLKDIV2 >> ((u32UartPort - 4) * 4)) & 0xful); + } + else + { + u32UartClkDivNum = ((CLK->CLKDIV3 >> ((u32UartPort - 12) * 4)) & 0xful); + } + } + + /* Get PLL clock frequency if UART clock source selection is PLL */ + switch (u32UartClkSrcSel) + { + case 0u: + u32SrcClkFreq = __HXT; + break; + case 1u: + u32SrcClkFreq = CLK_GetSYSCLK1Freq(); //TODO + break; + default: + u32SrcClkFreq = 0; + break; + } + + if (pu32ClkSrcFreq) + *pu32ClkSrcFreq = u32SrcClkFreq; + + if (pu32ClkDivNum) + *pu32ClkDivNum = u32UartClkDivNum; +} + +/** + * @brief Clear UART specified interrupt flag + * + * @param[in] uart The pointer of the specified UART module. + * @param[in] u32InterruptFlag The specified interrupt of UART module. + * - \ref UART_INTSTS_WKIF_Msk : Wake-up interrupt + * - \ref UART_INTSTS_BUFEINT_Msk : Buffer Error interrupt + * - \ref UART_INTSTS_MODEMINT_Msk : Modem Status interrupt + * - \ref UART_INTSTS_RLSINT_Msk : Receive Line Status interrupt + * + * @return None + * + * @details The function is used to clear UART specified interrupt flag. + */ + +void UART_ClearIntFlag(UART_T *uart, uint32_t u32InterruptFlag) +{ + + if (u32InterruptFlag & UART_INTSTS_RLSINT_Msk) /* Clear Receive Line Status Interrupt */ + { + uart->FIFOSTS = UART_FIFOSTS_BIF_Msk | UART_FIFOSTS_FEF_Msk | UART_FIFOSTS_PEF_Msk; + uart->FIFOSTS = UART_FIFOSTS_ADDRDETF_Msk; + } + + if (u32InterruptFlag & UART_INTSTS_MODEMINT_Msk) /* Clear Modem Status Interrupt */ + { + uart->MODEMSTS |= UART_MODEMSTS_CTSDETF_Msk; + } + else + { + } + + if (u32InterruptFlag & UART_INTSTS_BUFEINT_Msk) /* Clear Buffer Error Interrupt */ + { + uart->FIFOSTS = UART_FIFOSTS_RXOVIF_Msk | UART_FIFOSTS_TXOVIF_Msk; + } + + if (u32InterruptFlag & UART_INTSTS_WKINT_Msk) /* Clear Wake-up Interrupt */ + { + uart->WKSTS = UART_WKSTS_CTSWKF_Msk | UART_WKSTS_DATWKF_Msk | + UART_WKSTS_RFRTWKF_Msk | UART_WKSTS_RS485WKF_Msk | + UART_WKSTS_TOUTWKF_Msk; + } + +} + + +/** + * @brief Disable UART interrupt + * + * @param[in] uart The pointer of the specified UART module. + * + * @return None + * + * @details The function is used to disable UART interrupt. + */ +void UART_Close(UART_T *uart) +{ + uart->INTEN = 0ul; +} + + +/** + * @brief Disable UART auto flow control function + * + * @param[in] uart The pointer of the specified UART module. + * + * @return None + * + * @details The function is used to disable UART auto flow control. + */ +void UART_DisableFlowCtrl(UART_T *uart) +{ + uart->INTEN &= ~(UART_INTEN_ATORTSEN_Msk | UART_INTEN_ATOCTSEN_Msk); +} + + +/** + * @brief Disable UART specified interrupt + * + * @param[in] uart The pointer of the specified UART module. + * @param[in] u32InterruptFlag The specified interrupt of UART module. + * - \ref UART_INTEN_WKIEN_Msk : Wake-up interrupt + * - \ref UART_INTEN_BUFEIEN_Msk : Buffer Error interrupt + * - \ref UART_INTEN_RXTOIEN_Msk : Rx time-out interrupt + * - \ref UART_INTEN_MODEMIEN_Msk : Modem status interrupt + * - \ref UART_INTEN_RLSIEN_Msk : Receive Line status interrupt + * - \ref UART_INTEN_THREIEN_Msk : Tx empty interrupt + * - \ref UART_INTEN_RDAIEN_Msk : Rx ready interrupt * + * + * @return None + * + * @details The function is used to disable UART specified interrupt and disable NVIC UART IRQ. + */ +void UART_DisableInt(UART_T *uart, uint32_t u32InterruptFlag) +{ + /* Disable UART specified interrupt */ + UART_DISABLE_INT(uart, u32InterruptFlag); +} + + +/** + * @brief Enable UART auto flow control function + * + * @param[in] uart The pointer of the specified UART module. + * + * @return None + * + * @details The function is used to Enable UART auto flow control. + */ +void UART_EnableFlowCtrl(UART_T *uart) +{ + /* Set RTS pin output is low level active */ + uart->MODEM |= UART_MODEM_RTSACTLV_Msk; + + /* Set CTS pin input is low level active */ + uart->MODEMSTS |= UART_MODEMSTS_CTSACTLV_Msk; + + /* Set RTS and CTS auto flow control enable */ + uart->INTEN |= UART_INTEN_ATORTSEN_Msk | UART_INTEN_ATOCTSEN_Msk; +} + + +/** + * @brief The function is used to enable UART specified interrupt and enable NVIC UART IRQ. + * + * @param[in] uart The pointer of the specified UART module. + * @param[in] u32InterruptFlag The specified interrupt of UART module: + * - \ref UART_INTEN_WKIEN_Msk : Wake-up interrupt + * - \ref UART_INTEN_BUFEIEN_Msk : Buffer Error interrupt + * - \ref UART_INTEN_RXTOIEN_Msk : Rx time-out interrupt + * - \ref UART_INTEN_MODEMIEN_Msk : Modem status interrupt + * - \ref UART_INTEN_RLSIEN_Msk : Receive Line status interrupt + * - \ref UART_INTEN_THREIEN_Msk : Tx empty interrupt + * - \ref UART_INTEN_RDAIEN_Msk : Rx ready interrupt * + * + * @return None + * + * @details The function is used to enable UART specified interrupt and enable NVIC UART IRQ. + */ +void UART_EnableInt(UART_T *uart, uint32_t u32InterruptFlag) +{ + /* Enable UART specified interrupt */ + UART_ENABLE_INT(uart, u32InterruptFlag); +} + + +/** + * @brief Open and set UART function + * + * @param[in] uart The pointer of the specified UART module. + * @param[in] u32baudrate The baudrate of UART module. + * + * @return None + * + * @details This function use to enable UART function and set baud-rate. + */ +void UART_Open(UART_T *uart, uint32_t u32baudrate) +{ + uint32_t u32UartSrcClkFreq = 0ul, u32UartClkDivNum = 0ul; + uint32_t u32Baud_Div = 0ul; + + /* Select UART function */ + uart->FUNCSEL = UART_FUNCSEL_UART; + + /* Set UART line configuration */ + uart->LINE = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1; + + /* Set UART Rx and RTS trigger level */ + uart->FIFO &= ~(UART_FIFO_RFITL_Msk | UART_FIFO_RTSTRGLV_Msk); + + /* Get Source clock frequency and its divider of curret setting */ + UART_GetSrcClkSetting(uart, &u32UartSrcClkFreq, &u32UartClkDivNum); + + /* Set UART baud rate */ + if (u32baudrate != 0ul) + { + u32Baud_Div = UART_BAUD_MODE2_DIVIDER(u32UartSrcClkFreq / (u32UartClkDivNum + 1ul), u32baudrate); + + if (u32Baud_Div > 0xFFFFul) + { + uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER(u32UartSrcClkFreq / (u32UartClkDivNum + 1ul), u32baudrate)); + } + else + { + uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div); + } + } +} + + +/** + * @brief Read UART data + * + * @param[in] uart The pointer of the specified UART module. + * @param[in] pu8RxBuf The buffer to receive the data of receive FIFO. + * @param[in] u32ReadBytes The the read bytes number of data. + * + * @return u32Count Receive byte count + * + * @details The function is used to read Rx data from RX FIFO and the data will be stored in pu8RxBuf. + */ +uint32_t UART_Read(UART_T *uart, uint8_t pu8RxBuf[], uint32_t u32ReadBytes) +{ + uint32_t u32Count, u32delayno; + uint32_t u32Exit = 0ul; + + for (u32Count = 0ul; u32Count < u32ReadBytes; u32Count++) + { + u32delayno = 0ul; + + while (uart->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) /* Check RX empty => failed */ + { + u32delayno++; + if (u32delayno >= 0x40000000ul) + { + u32Exit = 1ul; + break; + } + else + { + } + } + + if (u32Exit == 1ul) + { + break; + } + else + { + pu8RxBuf[u32Count] = (uint8_t)uart->DAT; /* Get Data from UART RX */ + } + } + + return u32Count; + +} + + +/** + * @brief Set UART line configuration + * + * @param[in] uart The pointer of the specified UART module. + * @param[in] u32baudrate The register value of baudrate of UART module. + * If u32baudrate = 0, UART baudrate will not change. + * @param[in] u32data_width The data length of UART module. + * - \ref UART_WORD_LEN_5 + * - \ref UART_WORD_LEN_6 + * - \ref UART_WORD_LEN_7 + * - \ref UART_WORD_LEN_8 + * @param[in] u32parity The parity setting (none/odd/even/mark/space) of UART module. + * - \ref UART_PARITY_NONE + * - \ref UART_PARITY_ODD + * - \ref UART_PARITY_EVEN + * - \ref UART_PARITY_MARK + * - \ref UART_PARITY_SPACE + * @param[in] u32stop_bits The stop bit length (1/1.5/2 bit) of UART module. + * - \ref UART_STOP_BIT_1 + * - \ref UART_STOP_BIT_1_5 + * - \ref UART_STOP_BIT_2 + * + * @return None + * + * @details This function use to config UART line setting. + */ +void UART_SetLineConfig(UART_T *uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits) +{ + uint32_t u32UartSrcClkFreq = 0ul, u32UartClkDivNum = 0ul; + uint32_t u32Baud_Div = 0ul; + + /* Get Source clock frequency and its divider of curret setting */ + UART_GetSrcClkSetting(uart, &u32UartSrcClkFreq, &u32UartClkDivNum); + + /* Set UART baud rate */ + if (u32baudrate != 0ul) + { + u32Baud_Div = UART_BAUD_MODE2_DIVIDER(u32UartSrcClkFreq / (u32UartClkDivNum + 1ul), u32baudrate); + + if (u32Baud_Div > 0xFFFFul) + { + uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER(u32UartSrcClkFreq / (u32UartClkDivNum + 1ul), u32baudrate)); + } + else + { + uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div); + } + } + + /* Set UART line configuration */ + uart->LINE = u32data_width | u32parity | u32stop_bits; +} + + +/** + * @brief Set Rx timeout count + * + * @param[in] uart The pointer of the specified UART module. + * @param[in] u32TOC Rx timeout counter. + * + * @return None + * + * @details This function use to set Rx timeout count. + */ +void UART_SetTimeoutCnt(UART_T *uart, uint32_t u32TOC) +{ + /* Set time-out interrupt comparator */ + uart->TOUT = (uart->TOUT & ~UART_TOUT_TOIC_Msk) | (u32TOC); + + /* Set time-out counter enable */ + uart->INTEN |= UART_INTEN_TOCNTEN_Msk; +} + + +/** + * @brief Select and configure IrDA function + * + * @param[in] uart The pointer of the specified UART module. + * @param[in] u32Buadrate The baudrate of UART module. + * @param[in] u32Direction The direction of UART module in IrDA mode: + * - \ref UART_IRDA_TXEN + * - \ref UART_IRDA_RXEN + * + * @return None + * + * @details The function is used to configure IrDA relative settings. It consists of TX or RX mode and baudrate. + */ +void UART_SelectIrDAMode(UART_T *uart, uint32_t u32Buadrate, uint32_t u32Direction) +{ + uint32_t u32UartSrcClkFreq = 0ul, u32UartClkDivNum = 0ul; + uint32_t u32Baud_Div; + + /* Select IrDA function mode */ + uart->FUNCSEL = UART_FUNCSEL_IrDA; + + /* Get Source clock frequency and its divider of curret setting */ + UART_GetSrcClkSetting(uart, &u32UartSrcClkFreq, &u32UartClkDivNum); + + /* Set UART IrDA baud rate in mode 0 */ + if (u32Buadrate != 0ul) + { + u32Baud_Div = UART_BAUD_MODE0_DIVIDER(u32UartSrcClkFreq / (u32UartClkDivNum + 1ul), u32Buadrate); + + if (u32Baud_Div < 0xFFFFul) + { + uart->BAUD = (UART_BAUD_MODE0 | u32Baud_Div); + } + else + { + } + } + + /* Configure IrDA relative settings */ + if (u32Direction == UART_IRDA_RXEN) + { + uart->IRDA |= UART_IRDA_RXINV_Msk; /*Rx signal is inverse*/ + uart->IRDA &= ~UART_IRDA_TXEN_Msk; + } + else + { + uart->IRDA &= ~UART_IRDA_TXINV_Msk; /*Tx signal is not inverse*/ + uart->IRDA |= UART_IRDA_TXEN_Msk; + } + +} + + +/** + * @brief Select and configure RS485 function + * + * @param[in] uart The pointer of the specified UART module. + * @param[in] u32Mode The operation mode(NMM/AUD/AAD). + * - \ref UART_ALTCTL_RS485NMM_Msk + * - \ref UART_ALTCTL_RS485AUD_Msk + * - \ref UART_ALTCTL_RS485AAD_Msk + * @param[in] u32Addr The RS485 address. + * + * @return None + * + * @details The function is used to set RS485 relative setting. + */ +void UART_SelectRS485Mode(UART_T *uart, uint32_t u32Mode, uint32_t u32Addr) +{ + /* Select UART RS485 function mode */ + uart->FUNCSEL = UART_FUNCSEL_RS485; + + /* Set RS585 configuration */ + uart->ALTCTL &= ~(UART_ALTCTL_RS485NMM_Msk | UART_ALTCTL_RS485AUD_Msk | UART_ALTCTL_RS485AAD_Msk | UART_ALTCTL_ADDRMV_Msk); + uart->ALTCTL |= (u32Mode | (u32Addr << UART_ALTCTL_ADDRMV_Pos)); +} + + +/** + * @brief Write UART data + * + * @param[in] uart The pointer of the specified UART module. + * @param[in] pu8TxBuf The buffer to send the data to UART transmission FIFO. + * @param[out] u32WriteBytes The byte number of data. + * + * @return u32Count transfer byte count + * + * @details The function is to write data into TX buffer to transmit data by UART. + */ +uint32_t UART_Write(UART_T *uart, uint8_t pu8TxBuf[], uint32_t u32WriteBytes) +{ + uint32_t u32Count, u32delayno; + uint32_t u32Exit = 0ul; + + for (u32Count = 0ul; u32Count != u32WriteBytes; u32Count++) + { + u32delayno = 0ul; + while (uart->FIFOSTS & UART_FIFOSTS_TXFULL_Msk) /* Check Tx Full */ + { + u32delayno++; + if (u32delayno >= 0x40000000ul) + { + u32Exit = 1ul; + break; + } + else + { + } + } + + if (u32Exit == 1ul) + { + break; + } + else + { + uart->DAT = pu8TxBuf[u32Count]; /* Send UART Data from buffer */ + } + } + + return u32Count; +} + + +/*@}*/ /* end of group UART_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group UART_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_wdt.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_wdt.c new file mode 100644 index 0000000000..71a8efc2d2 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_wdt.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file wdt.c + * @brief WDT driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ +#include "NuMicro.h" + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup WDT_Driver WDT Driver + @{ +*/ + +/** @addtogroup WDT_EXPORTED_FUNCTIONS WDT Exported Functions + @{ +*/ + +/** + * @brief Initialize WDT and start counting + * @param[in] wdt WDT instance. + * @param[in] u32TimeoutInterval Time-out interval period of WDT module. Valid values are: + * - \ref WDT_TIMEOUT_2POW4 + * - \ref WDT_TIMEOUT_2POW6 + * - \ref WDT_TIMEOUT_2POW8 + * - \ref WDT_TIMEOUT_2POW10 + * - \ref WDT_TIMEOUT_2POW12 + * - \ref WDT_TIMEOUT_2POW14 + * - \ref WDT_TIMEOUT_2POW16 + * - \ref WDT_TIMEOUT_2POW18 + * @param[in] u32ResetDelay Configure WDT time-out reset delay period. Valid values are: + * - \ref WDT_RESET_DELAY_1026CLK + * - \ref WDT_RESET_DELAY_130CLK + * - \ref WDT_RESET_DELAY_18CLK + * - \ref WDT_RESET_DELAY_3CLK + * @param[in] u32EnableReset Enable WDT time-out reset system function. Valid values are TRUE and FALSE. + * @param[in] u32EnableWakeup Enable WDT time-out wake-up system function. Valid values are TRUE and FALSE. + * + * @return None + * + * @details This function makes WDT module start counting with different time-out interval, reset delay period and choose to \n + * enable or disable WDT time-out reset system or wake-up system. + * @note Please make sure that Register Write-Protection Function has been disabled before using this function. + */ +void WDT_Open(WDT_T *wdt, + uint32_t u32TimeoutInterval, + uint32_t u32ResetDelay, + uint32_t u32EnableReset, + uint32_t u32EnableWakeup) +{ + wdt->ALTCTL = u32ResetDelay; + + wdt->CTL = u32TimeoutInterval | WDT_CTL_WDTEN_Msk | + (u32EnableReset << WDT_CTL_RSTEN_Pos) | + (u32EnableWakeup << WDT_CTL_WKEN_Pos); + return; +} + +/*@}*/ /* end of group WDT_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group WDT_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_whc.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_whc.c new file mode 100644 index 0000000000..3065fb8ff2 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_whc.c @@ -0,0 +1,100 @@ +/**************************************************************************//** + * @file whc.c + * @brief WHC driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#include "NuMicro.h" + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup WHC_Driver WHC Driver + @{ +*/ + +/** @addtogroup WHC_EXPORTED_FUNCTIONS WHC Exported Functions + @{ +*/ + +/** + * @brief Send message through a wormhole channel + * @param[in] whc The pointer of the specified WHC module. + * @param[in] u32Ch WHC channel, valid channel numbers are 0~3 + * @param[in] pu32TxBuf The buffer holds the data to send + * @retval 0 Success + * @retval -1 Failed. Channel is busy, previous message hasn't been read yet. + */ +int WHC_Send(WHC_T *whc, uint32_t u32Ch, uint32_t *pu32TxBuf) +{ + int i; + + if (whc->TXSTS & (1ul << u32Ch)) + { + for (i = 0; i < WHC_BUFFER_LEN; i++) + whc->TMDAT[u32Ch][i] = *pu32TxBuf++; + whc->TXCTL = (1ul << u32Ch); + } + else + { + return -1; + + } + return 0; +} + +/** + * @brief Receive message from a wormhole channel + * @param[in] whc The pointer of the specified WHC module. + * @param[in] u32Ch WHC channel, valid channel numbers are 0~3 + * @param[out] pu32RxBuf The buffer to hold the receive data + * @retval 0 Success + * @retval -1 Failed. Channel is empty and no message is available for read. + * @Note This function send an ACK signal after receive complete + */ +int WHC_Recv(WHC_T *whc, uint32_t u32Ch, uint32_t *pu32RxBuf) +{ + int i; + + if (whc->RXSTS & (1ul << u32Ch)) + { + for (i = 0; i < WHC_BUFFER_LEN; i++) + *pu32RxBuf++ = whc->RMDAT[u32Ch][i]; + whc->RXCTL = (1ul << u32Ch); + } + else + { + return -1; + + } + return 0; +} + +/** + * @brief Get counter part status + * @param[in] whc The pointer of the specified WHC module. + * @param[in] u32Core Core number, valid channel numbers are 0~1 + * @retval \ref WHC_RUN_MODE + * @retval \ref WHC_POFF_MODE + * @retval \ref WHC_PD_MODE + */ +int WHC_GetCPSts(WHC_T *whc, uint32_t u32Core) +{ + if (u32Core == 0) + { + return (whc->CPSTS & WHC_CPSTS_OPMODE0_Msk) >> WHC_CPSTS_OPMODE0_Pos; + } + else + { + return (whc->CPSTS & WHC_CPSTS_OPMODE1_Msk) >> WHC_CPSTS_OPMODE1_Pos; + } +} + +/*@}*/ /* end of group WHC_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group WHC_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_wwdt.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_wwdt.c new file mode 100644 index 0000000000..aa0903b506 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_wwdt.c @@ -0,0 +1,67 @@ +/**************************************************************************//** + * @file wwdt.c + * @brief WWDT driver source file + * + * SPDX-License-Identifier: Apache-2.0 + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ +#include "NuMicro.h" + + +/** @addtogroup Standard_Driver Standard Driver + @{ +*/ + +/** @addtogroup WWDT_Driver WWDT Driver + @{ +*/ + +/** @addtogroup WWDT_EXPORTED_FUNCTIONS WWDT Exported Functions + @{ +*/ + +/** + * @brief Open WWDT and start counting + * + * @param[in] u32PreScale Pre-scale setting of WWDT counter. Valid values are: + * - \ref WWDT_PRESCALER_1 + * - \ref WWDT_PRESCALER_2 + * - \ref WWDT_PRESCALER_4 + * - \ref WWDT_PRESCALER_8 + * - \ref WWDT_PRESCALER_16 + * - \ref WWDT_PRESCALER_32 + * - \ref WWDT_PRESCALER_64 + * - \ref WWDT_PRESCALER_128 + * - \ref WWDT_PRESCALER_192 + * - \ref WWDT_PRESCALER_256 + * - \ref WWDT_PRESCALER_384 + * - \ref WWDT_PRESCALER_512 + * - \ref WWDT_PRESCALER_768 + * - \ref WWDT_PRESCALER_1024 + * - \ref WWDT_PRESCALER_1536 + * - \ref WWDT_PRESCALER_2048 + * @param[in] u32CmpValue Setting the window compared value. Valid values are between 0x0 to 0x3F. + * @param[in] u32EnableInt Enable WWDT time-out interrupt function. Valid values are TRUE and FALSE. + * + * @return None + * + * @details This function makes WWDT module start counting with different counter period by pre-scale setting and compared window value. + * @note This WWDT_CTL register can be write only one time after chip is powered on or reset. + */ +void WWDT_Open(uint32_t u32PreScale, + uint32_t u32CmpValue, + uint32_t u32EnableInt) +{ + WWDT2->CTL = u32PreScale | + (u32CmpValue << WWDT_CTL_CMPDAT_Pos) | + ((u32EnableInt == TRUE) ? WWDT_CTL_INTEN_Msk : 0U) | + WWDT_CTL_WWDTEN_Msk; + return; +} + +/*@}*/ /* end of group WWDT_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group WWDT_Driver */ + +/*@}*/ /* end of group Standard_Driver */ + diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/SConscript b/bsp/nuvoton/libraries/ma35/UsbHostLib/SConscript new file mode 100644 index 0000000000..e7e5dcfbb9 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/SConscript @@ -0,0 +1,12 @@ +# RT-Thread building script for component + +from building import * + +cwd = GetCurrentDir() +group = [] +if GetDepend('BSP_USING_USBH'): + src = Glob('*src/*.c') + Glob('src/*.cpp') + CPPPATH = [cwd + '/inc'] + group = DefineGroup('ma35d1_usbhostlib', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/config.h b/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/config.h new file mode 100644 index 0000000000..892cbbb32b --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/config.h @@ -0,0 +1,142 @@ +/**************************************************************************//** + * @file config.h + * @version V1.00 + * @brief This header file defines the configuration of USB Host library. + * @note + * SPDX-License-Identifier: Apache-2.0 + * Copyright (C) 2018 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#ifndef _USBH_CONFIG_H_ +#define _USBH_CONFIG_H_ + + +/// @cond HIDDEN_SYMBOLS + +#include +#include "NuMicro.h" +#include "nu_sys.h" +#include "drv_sys.h" + + +/*----------------------------------------------------------------------------------------*/ +/* Hardware settings */ +/*----------------------------------------------------------------------------------------*/ +#define HCLK_MHZ 700 /* used for loop-delay. must be larger than + true HCLK clock MHz */ + +#define NON_CACHE_MASK (0xC0000000) + +static __inline void ENABLE_OHCI_IRQ(void) +{ + rt_hw_interrupt_umask(USBH0_IRQn); + rt_hw_interrupt_umask(USBH1_IRQn); +} +static __inline void DISABLE_OHCI_IRQ(void) +{ + rt_hw_interrupt_mask(USBH0_IRQn); + rt_hw_interrupt_mask(USBH1_IRQn); +} +static __inline void ENABLE_EHCI_IRQ(void) +{ + rt_hw_interrupt_umask(HSUSBH0_IRQn); + rt_hw_interrupt_umask(HSUSBH1_IRQn); +} +static __inline void DISABLE_EHCI_IRQ(void) +{ + rt_hw_interrupt_mask(HSUSBH0_IRQn); + rt_hw_interrupt_mask(HSUSBH1_IRQn); +} + + +#if defined(BSP_USING_HSUSBH0) + #define ENABLE_EHCI0 + #define ENABLE_OHCI0 +#endif + +#if defined(BSP_USING_HSUSBH1) + #define ENABLE_EHCI1 + #define ENABLE_OHCI1 +#endif + +#define EHCI_PORT_CNT 1 /* Number of EHCI roothub ports */ +#define OHCI_PORT_CNT 1 /* Number of OHCI roothub ports */ +#define OHCI_PER_PORT_POWER /* OHCI root hub per port powered */ + +#define OHCI_ISO_DELAY 4 /* preserved number frames while scheduling + OHCI isochronous transfer */ + +#define EHCI_ISO_DELAY 2 /* preserved number of frames while + scheduling EHCI isochronous transfer */ + +#define EHCI_ISO_RCLM_RANGE 32 /* When inspecting activated iTD/siTD, + unconditionally reclaim iTD/isTD scheduled + in just elapsed EHCI_ISO_RCLM_RANGE ms. */ + +#define MAX_DESC_BUFF_SIZE 4096 /* To hold the configuration descriptor, USB + core will allocate a buffer with this size + for each connected device. USB core does + not release it until device disconnected. */ + +/*----------------------------------------------------------------------------------------*/ +/* Memory allocation settings */ +/*----------------------------------------------------------------------------------------*/ + +#define STATIC_MEMORY_ALLOC 0 /* pre-allocate static memory blocks. No dynamic memory aloocation. + But the maximum number of connected devices and transfers are + limited. */ + +#define MAX_UDEV_DRIVER 8 /*!< Maximum number of registered drivers */ +#define MAX_ALT_PER_IFACE 8 /*!< maximum number of alternative interfaces per interface */ +#define MAX_EP_PER_IFACE 6 /*!< maximum number of endpoints per interface */ +#define MAX_HUB_DEVICE 8 /*!< Maximum number of hub devices */ + +/* Host controller hardware transfer descriptors memory pool. ED/TD/ITD of OHCI and QH/QTD of EHCI + are all allocated from this pool. Allocated unit size is determined by MEM_POOL_UNIT_SIZE. + May allocate one or more units depend on hardware descriptor type. */ + +#define MEM_POOL_UNIT_SIZE 64 /*!< A fixed hard coding setting. Do not change it! */ +#define MEM_POOL_UNIT_NUM 256 /*!< Increase this or heap size if memory allocate failed. */ + +/*----------------------------------------------------------------------------------------*/ +/* Re-defined staff for various compiler */ +/*----------------------------------------------------------------------------------------*/ +#ifdef __ICCARM__ + #define __inline inline +#endif + + +/*----------------------------------------------------------------------------------------*/ +/* Debug settings */ +/*----------------------------------------------------------------------------------------*/ +//#define ENABLE_ERROR_MSG /* enable debug messages */ +//#define ENABLE_DEBUG_MSG /* enable debug messages */ +//#define ENABLE_VERBOSE_DEBUG /* verbos debug messages */ +//#define DUMP_DESCRIPTOR /* dump descriptors */ + +#ifdef ENABLE_ERROR_MSG + #define USB_error rt_kprintf +#else + #define USB_error(...) +#endif + +#ifdef ENABLE_DEBUG_MSG + #define USB_debug rt_kprintf + #ifdef ENABLE_VERBOSE_DEBUG + #define USB_vdebug rt_kprintf + #else + #define USB_vdebug(...) + #endif +#else + #define USB_debug(...) + #define USB_vdebug(...) +#endif +#define ptr_to_u32(x) ((uint32_t)(x)) + + +/// @endcond HIDDEN_SYMBOLS + +#endif /* _USBH_CONFIG_H_ */ + +/*** (C) COPYRIGHT 2018 Nuvoton Technology Corp. ***/ + diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/ehci.h b/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/ehci.h new file mode 100644 index 0000000000..a5dbe01a11 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/ehci.h @@ -0,0 +1,277 @@ +/**************************************************************************//** + * @file ehci.h + * @version V1.00 + * @brief USB EHCI host controller driver header file. + * @note + * SPDX-License-Identifier: Apache-2.0 + * Copyright (C) 2017 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#ifndef _USBH_EHCI_H_ +#define _USBH_EHCI_H_ + +/// @cond HIDDEN_SYMBOLS + +struct utr_t; +struct udev_t; +struct qh_t; +struct iso_ep_t; +struct ep_info_t; + +/*----------------------------------------------------------------------------------------*/ +/* Periodic Frame List Size (256, 512, or 1024) */ +/*----------------------------------------------------------------------------------------*/ +#define FL_SIZE 1024 /* frame list size can be 256, 512, or 1024 */ +#define NUM_IQH 11 /* depends on FL_SIZE, 256:9, 512:10, 1024:11 */ + + +/*----------------------------------------------------------------------------------------*/ +/* Interrupt Threshold Control (1, 2, 4, 6, .. 64) */ +/*----------------------------------------------------------------------------------------*/ +#define UCMDR_INT_THR_CTRL (0x1< of QH */ +} qTD_T; + + +#define QTD_LIST_END 0x1 /* Indicate the terminate of qTD list. */ +#define QTD_PTR(x) ((qTD_T *)((uint32_t)(x) & ~0x1F)) + +/* + * Status: qTD Token[7:0] + */ +#define QTD_STS_PS_OUT (0<<0) /* directs the HC to issue an OUT PID */ +#define QTD_STS_PS_PING (1<<0) /* directs the HC to issue an PING PID */ +#define QTD_STS_SPLIT_STRAT (0<<1) /* directs the HC to issue an Start split */ +#define QTD_STS_SPLIT_COMPLETE (1<<1) /* directs the HC to issue an Complete split */ +#define QTD_STS_MISS_MF (1<<2) /* miss a required complete-split transaction */ +#define QTD_STS_XactErr (1<<3) /* Transaction Error occurred */ +#define QTD_STS_BABBLE (1<<4) /* Babble Detected */ +#define QTD_STS_DATA_BUFF_ERR (1<<5) /* Data Buffer Error */ +#define QTD_STS_HALT (1<<6) /* Halted */ +#define QTD_STS_ACTIVE (1<<7) /* Active */ + +/* + * PID: qTD Token[9:8] + */ +#define QTD_PID_Msk (0x3<<8) +#define QTD_PID_OUT (0<<8) /* generates token (E1H) */ +#define QTD_PID_IN (1<<8) /* generates token (69H) */ +#define QTD_PID_SETUP (2<<8) /* generates token (2DH) */ + +#define QTD_ERR_COUNTER (3<<10) /* Token[11:10] */ +#define QTD_IOC (1<<15) /* Token[15] - Interrupt On Complete */ +#define QTD_TODO_LEN_Pos 16 /* Token[31:16] - Total Bytes to Transfer */ +#define QTD_TODO_LEN(x) (((x)>>16) & 0x7FFF) +#define QTD_DT (1UL<<31) /* Token[31] - Data Toggle */ + +/*----------------------------------------------------------------------------------------*/ +/* Queue Head (QH) */ +/*----------------------------------------------------------------------------------------*/ +typedef struct qh_t +{ + /* OHCI spec. Endpoint descriptor */ + uint32_t HLink; /* Queue Head Horizontal Link Pointer */ + uint32_t Chrst; /* Endpoint Characteristics: QH DWord 1 */ + uint32_t Cap; /* Endpoint Capabilities: QH DWord 2 */ + uint32_t Curr_qTD; /* Current qTD Pointer */ + /* + * The followings are qTD Transfer Overlay + */ + uint32_t OL_Next_qTD; /* Next qTD Pointer */ + uint32_t OL_Alt_Next_qTD; /* Alternate Next qTD Pointer */ + uint32_t OL_Token; /* qTD Token */ + uint32_t OL_Bptr[5]; /* qTD Buffer Page Pointer List */ + /* + * The following members are used by USB Host libary. + */ + qTD_T *qtd_list; /* currently linked qTD transfers */ + qTD_T *done_list; /* currently linked qTD transfers */ + struct qh_t *next; /* point to the next QH in remove list */ +} QH_T; + +/* HLink[0] T field of "Queue Head Horizontal Link Pointer" */ +#define QH_HLNK_END 0x1 + +/* + * HLink[2:1] Typ field of "Queue Head Horizontal Link Pointer" + */ +#define QH_HLNK_ITD(x) (((uint32_t)(x) & ~0x1F) | 0x0) +#define QH_HLNK_QH(x) (((uint32_t)(x) & ~0x1F) | 0x2) +#define QH_HLNK_SITD(x) (((uint32_t)(x) & ~0x1F) | 0x4) +#define QH_HLNK_FSTN(x) (((uint32_t)(x) & ~0x1F) | 0x6) +#define QH_PTR(x) ((QH_T *)((uint32_t)(x) & ~0x1F)) + +/* + * Bit fields of "Endpoint Characteristics" + */ +#define QH_NAK_RL (4L<<28) /* Chrst[31:28] - NAK Count Reload */ +#define QH_CTRL_EP_FLAG (1<<27) /* Chrst[27] - Control Endpoint Flag */ +#define QH_RCLM_LIST_HEAD (1<<15) /* Chrst[15] - Head of Reclamation List Flag */ +#define QH_DTC (1<<14) /* Chrst[14] - Data Toggle Control */ +#define QH_EPS_FULL (0<<12) /* Chrst[13:12] - Endpoint Speed (Full) */ +#define QH_EPS_LOW (1<<12) /* Chrst[13:12] - Endpoint Speed (Low) */ +#define QH_EPS_HIGH (2<<12) /* Chrst[13:12] - Endpoint Speed (High) */ +#define QH_I_NEXT (1<<7) /* Chrst[7] - Inactivate on Next Transaction */ + +/* + * Bit fields of "Endpoint Capabilities" + */ +#define QH_MULT_Pos 30 /* Cap[31:30] - High-Bandwidth Pipe Multiplier */ +#define QH_HUB_PORT_Pos 23 /* Cap[29:23] - Hub Port Number */ +#define QH_HUB_ADDR_Pos 16 /* Cap[22:16] - Hub Addr */ +#define QH_C_MASK_Msk 0xFF00 /* Cap[15:8] - uFrame C-mask */ +#define QH_S_MASK_Msk 0x00FF /* Cap[7:0] - uFrame S-mask */ + + +/*----------------------------------------------------------------------------------------*/ +/* Isochronous (High-Speed) Transfer Descriptor (iTD) */ +/*----------------------------------------------------------------------------------------*/ +typedef struct itd_t +{ + uint32_t Next_Link; /* Next Link Pointer */ + uint32_t Transaction[8]; /* Transaction Status and Control */ + uint32_t Bptr[7]; /* Buffer Page Pointer List */ + /* + * The following members are used by USB Host libary. + */ + struct iso_ep_t *iso_ep; /* associated isochronous information block */ + struct utr_t *utr; /* associated UTR */ + uint32_t buff_base; /* buffer base address */ + uint8_t fidx; /* iTD's first index to UTR iso frames */ + uint8_t trans_mask; /* mask of activated transactions in iTD */ + uint32_t sched_frnidx; /* scheduled frame index */ + struct itd_t *next; /* used by software to maintain iTD list */ +} iTD_T; + +/* + * Next_Link[2:1] Typ field of "Next Schedule Element Pointer" Typ field + */ +#define ITD_HLNK_ITD(x) (((uint32_t)(x) & ~0x1F) | 0x0) +#define ITD_HLNK_QH(x) (((uint32_t)(x) & ~0x1F) | 0x2) +#define ITD_HLNK_SITD(x) (((uint32_t)(x) & ~0x1F) | 0x4) +#define ITD_HLNK_FSTN(x) (((uint32_t)(x) & ~0x1F) | 0x6) +#define ITD_PTR(x) ((iTD_T *)((uint32_t)(x) & ~0x1F)) + +/* + * Transaction[8] + */ +#define ITD_STATUS(x) (((x)>>28)&0xF) +#define ITD_STATUS_ACTIVE (0x80000000UL) /* Active */ +#define ITD_STATUS_BUFF_ERR (0x40000000UL) /* Data Buffer Error */ +#define ITD_STATUS_BABBLE (0x20000000UL) /* Babble Detected */ +#define ITD_STATUS_XACT_ERR (0x10000000UL) /* Transcation Error */ + +#define ITD_XLEN_Pos 16 +#define ITD_XFER_LEN(x) (((x)>>16)&0xFFF) +#define ITD_IOC (1<<15) +#define ITD_PG_Pos 12 +#define ITD_XFER_OFF_Msk 0xFFF + +/* + * Bptr[7] + */ +#define ITD_BUFF_PAGE_Pos 12 +/* Bptr[0] */ +#define ITD_EP_NUM_Pos 8 +#define ITD_EP_NUM(itd) (((itd)->Bptr[0]>>8)&0xF) +#define ITD_DEV_ADDR_Pos 0 +#define ITD_DEV_ADDR(itd) ((itd)->Bptr[0]&0x7F) +/* Bptr[1] */ +#define ITD_DIR_IN (1<<11) +#define ITD_DIR_OUT (0<<11) +#define ITD_MAX_PKTSZ_Pos 0 +#define ITD_MAX_PKTSZ(itd) ((itd)->Bptr[1]&0x7FF) + +/*----------------------------------------------------------------------------------------*/ +/* Split Isochronous (Full-Speed) Transfer Descriptor (siTD) */ +/*----------------------------------------------------------------------------------------*/ +typedef struct sitd_t +{ + uint32_t Next_Link; /* Next Link Pointer */ + uint32_t Chrst; /* Endpoint and Transaction Translator Characteristics */ + uint32_t Sched; /* Micro-frame Schedule Control */ + uint32_t StsCtrl; /* siTD Transfer Status and Control */ + uint32_t Bptr[2]; /* Buffer Page Pointer List */ + uint32_t BackLink; /* siTD Back Link Pointer */ + /* + * The following members are used by USB Host libary. + */ + struct iso_ep_t *iso_ep; /* associated isochronous information block */ + struct utr_t *utr; /* associated UTR */ + uint8_t fidx; /* iTD's first index to UTR iso frames */ + uint32_t sched_frnidx; /* scheduled frame index */ + struct sitd_t *next; /* used by software to maintain siTD list */ +} siTD_T; + +#define SITD_LIST_END 0x1 /* Indicate the terminate of siTD list. */ + +#define SITD_XFER_IO_Msk (1UL<<31) +#define SITD_XFER_IN (1UL<<31) +#define SITD_XFER_OUT (0UL<<31) + +#define SITD_PORT_NUM_Pos 24 +#define SITD_HUB_ADDR_Pos 16 +#define SITD_EP_NUM_Pos 8 +#define SITD_DEV_ADDR_Pos 0 + +#define SITD_IOC (1UL<<31) +#define SITD_XFER_CNT_Pos 16 +#define SITD_XFER_CNT_Msk (0x3FF<>28) & 0x0F) +#define TD_CC_SET(td, cc) (td) = ((td) & 0x0FFFFFFF) | (((cc) & 0x0F) << 28) +#define TD_T_DATA0 0x02000000 +#define TD_T_DATA1 0x03000000 +#define TD_R 0x00040000 +#define TD_DP 0x00180000 +#define TD_DP_IN 0x00100000 +#define TD_DP_OUT 0x00080000 +#define MAXPSW 8 +/* steel TD reserved bits to keep driver data */ +#define TD_TYPE_Msk (0x3<<16) +#define TD_TYPE_CTRL (0x0<<16) +#define TD_TYPE_BULK (0x1<<16) +#define TD_TYPE_INT (0x2<<16) +#define TD_TYPE_ISO (0x3<<16) +#define TD_CTRL_Msk (0x7<<15) +#define TD_CTRL_DATA (1<<15) + + +/* + * The HCCA (Host Controller Communications Area) is a 256 byte + * structure defined in the OHCI spec. that the host controller is + * told the base address of. It must be 256-byte aligned. + */ +typedef struct +{ + uint32_t int_table[32]; /* Interrupt ED table */ + uint16_t frame_no; /* current frame number */ + uint16_t pad1; /* set to 0 on each frame_no change */ + uint32_t done_head; /* info returned for an interrupt */ + uint8_t reserved_for_hc[116]; +} HCCA_T; + + +/// @endcond + +#endif /* _USBH_OHCI_H_ */ diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/usb.h b/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/usb.h new file mode 100644 index 0000000000..ce223e6c6f --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/usb.h @@ -0,0 +1,386 @@ +/**************************************************************************//** + * @file usb.h + * @version V1.00 + * @brief USB Host library header file. + * @note + * SPDX-License-Identifier: Apache-2.0 + * Copyright (C) 2017 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ + +#ifndef _USBH_H_ +#define _USBH_H_ + +#include "config.h" +#include "usbh_lib.h" +#include "ehci.h" +#include "ohci.h" + +/// @cond HIDDEN_SYMBOLS + +struct utr_t; +struct udev_t; +struct hub_dev_t; +struct iface_t; +struct ep_info_t; + +/*----------------------------------------------------------------------------------*/ +/* USB device request setup packet */ +/*----------------------------------------------------------------------------------*/ +typedef struct __attribute__((__packed__)) +{ + uint8_t bmRequestType; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} +DEV_REQ_T; + +/* + * bmRequestType[7] - Data transfer direction + */ +#define REQ_TYPE_OUT 0x00 +#define REQ_TYPE_IN 0x80 +/* + * bmRequestType[6:5] - Type + */ +#define REQ_TYPE_STD_DEV 0x00 +#define REQ_TYPE_CLASS_DEV 0x20 +#define REQ_TYPE_VENDOR_DEV 0x40 +/* + * bmRequestType[4:0] - Recipient + */ +#define REQ_TYPE_TO_DEV 0x00 +#define REQ_TYPE_TO_IFACE 0x01 +#define REQ_TYPE_TO_EP 0x02 +#define REQ_TYPE_TO_OTHER 0x03 +/* + * Standard Requests + */ +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_SET_INTERFACE 0x0B +/* + * Descriptor Types + */ +#define USB_DT_STANDARD 0x00 +#define USB_DT_CLASS 0x20 +#define USB_DT_VENDOR 0x40 + +#define USB_DT_DEVICE 0x01 +#define USB_DT_CONFIGURATION 0x02 +#define USB_DT_STRING 0x03 +#define USB_DT_INTERFACE 0x04 +#define USB_DT_ENDPOINT 0x05 +#define USB_DT_DEVICE_QUALIFIER 0x06 +#define USB_DT_OTHER_SPEED_CONF 0x07 +#define USB_DT_IFACE_POWER 0x08 + + + +/*----------------------------------------------------------------------------------*/ +/* USB standard descriptors */ +/*----------------------------------------------------------------------------------*/ + +/* Descriptor header */ +typedef struct __attribute__((__packed__)) +{ + uint8_t bLength; + uint8_t bDescriptorType; +} +DESC_HDR_T; + +/*----------------------------------------------------------------------------------*/ +/* USB device descriptor */ +/*----------------------------------------------------------------------------------*/ +typedef struct __attribute__((__packed__)) /*!< device descriptor structure */ +{ + uint8_t bLength; /*!< Length of device descriptor */ + uint8_t bDescriptorType; /*!< Device descriptor type */ + uint16_t bcdUSB; /*!< USB version number */ + uint8_t bDeviceClass; /*!< Device class code */ + uint8_t bDeviceSubClass; /*!< Device subclass code */ + uint8_t bDeviceProtocol; /*!< Device protocol code */ + uint8_t bMaxPacketSize0; /*!< Maximum packet size of control endpoint*/ + uint16_t idVendor; /*!< Vendor ID */ + uint16_t idProduct; /*!< Product ID */ + uint16_t bcdDevice; /*!< Device ID */ + uint8_t iManufacturer; /*!< Manufacture description string ID */ + uint8_t iProduct; /*!< Product description string ID */ + uint8_t iSerialNumber; /*!< Serial number description string ID */ + uint8_t bNumConfigurations; /*!< Total number of configurations */ +} +DESC_DEV_T; /*!< device descriptor structure */ + +/* + * Configuration Descriptor + */ +typedef struct __attribute__((__packed__)) usb_config_descriptor /*!< Configuration descriptor structure */ +{ + uint8_t bLength; /*!< Length of configuration descriptor */ + uint8_t bDescriptorType; /*!< Descriptor type */ + uint16_t wTotalLength; /*!< Total length of this configuration */ + uint8_t bNumInterfaces; /*!< Total number of interfaces */ + uint8_t bConfigurationValue; /*!< Configuration descriptor number */ + uint8_t iConfiguration; /*!< String descriptor ID */ + uint8_t bmAttributes; /*!< Configuration characteristics */ + uint8_t MaxPower; /*!< Maximum power consumption */ +} DESC_CONF_T; /*!< Configuration descriptor structure */ + +/* + * Interface Descriptor + */ +typedef struct __attribute__((__packed__))usb_interface_descriptor /*!< Interface descriptor structure */ +{ + uint8_t bLength; /*!< Length of interface descriptor */ + uint8_t bDescriptorType; /*!< Descriptor type */ + uint8_t bInterfaceNumber; /*!< Interface number */ + uint8_t bAlternateSetting; /*!< Alternate setting number */ + uint8_t bNumEndpoints; /*!< Number of endpoints */ + uint8_t bInterfaceClass; /*!< Interface class code */ + uint8_t bInterfaceSubClass; /*!< Interface subclass code */ + uint8_t bInterfaceProtocol; /*!< Interface protocol code */ + uint8_t iInterface; /*!< Interface ID */ +} DESC_IF_T; /*!< Interface descriptor structure */ + +/* + * Endpoint Descriptor + */ +typedef struct __attribute__((__packed__)) usb_endpoint_descriptor /*!< Endpoint descriptor structure */ +{ + uint8_t bLength; /*!< Length of endpoint descriptor */ + uint8_t bDescriptorType; /*!< Descriptor type */ + uint8_t bEndpointAddress; /*!< Endpoint address */ + uint8_t bmAttributes; /*!< Endpoint attribute */ + uint16_t wMaxPacketSize; /*!< Maximum packet size */ + uint8_t bInterval; /*!< Synchronous transfer interval */ + uint8_t bRefresh; /*!< Refresh */ + uint8_t bSynchAddress; /*!< Sync address */ +} DESC_EP_T; /*!< Endpoint descriptor structure */ + +/* + * Endpoint descriptor bEndpointAddress[7] - direction + */ +#define EP_ADDR_DIR_MASK 0x80 +#define EP_ADDR_DIR_IN 0x80 +#define EP_ADDR_DIR_OUT 0x00 + +/* + * Endpoint descriptor bmAttributes[1:0] - transfer type + */ +#define EP_ATTR_TT_MASK 0x03 +#define EP_ATTR_TT_CTRL 0x00 +#define EP_ATTR_TT_ISO 0x01 +#define EP_ATTR_TT_BULK 0x02 +#define EP_ATTR_TT_INT 0x03 + + +/*----------------------------------------------------------------------------------*/ +/* USB Host controller driver */ +/*----------------------------------------------------------------------------------*/ +typedef struct +{ + int (*init)(void); + void (*shutdown)(void); + void (*suspend)(void); + void (*resume)(void); + int (*ctrl_xfer)(struct utr_t *utr); + int (*bulk_xfer)(struct utr_t *utr); + int (*int_xfer)(struct utr_t *utr); + int (*iso_xfer)(struct utr_t *utr); + int (*quit_xfer)(struct utr_t *utr, struct ep_info_t *ep); + + /* root hub support */ + int (*rthub_port_reset)(int port); + int (*rthub_polling)(void); + void *hc_data; +} HC_DRV_T; + + +/*----------------------------------------------------------------------------------*/ +/* USB device driver */ +/*----------------------------------------------------------------------------------*/ +typedef struct +{ + int (*probe)(struct iface_t *iface); + void (*disconnect)(struct iface_t *iface); + void (*suspend)(struct iface_t *iface); + void (*resume)(struct iface_t *iface); +} UDEV_DRV_T; + + +/*----------------------------------------------------------------------------------*/ +/* USB device */ +/*----------------------------------------------------------------------------------*/ + +typedef enum +{ + SPEED_LOW, + SPEED_FULL, + SPEED_HIGH +} SPEED_E; + +typedef struct ep_info_t +{ + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint8_t bInterval; + uint8_t bToggle; + uint16_t wMaxPacketSize; + void *hw_pipe; /*!< point to the HC assocaied endpoint \hideinitializer */ +} EP_INFO_T; + +typedef struct udev_t +{ + DESC_DEV_T descriptor; /*!< Device descriptor. \hideinitializer */ + struct hub_dev_t *parent; /*!< parent hub device \hideinitializer */ + uint8_t port_num; /*!< The hub port this device connected on \hideinitializer */ + uint8_t dev_num; /*!< device number \hideinitializer */ + int8_t cur_conf; /*!< Currentll selected configuration \hideinitializer */ + SPEED_E speed; /*!< device speed (low/full/high) \hideinitializer */ + /* + * The followings are lightweight USB stack internal used . + */ + uint8_t *cfd_buff; /*!< Configuration descriptor buffer. \hideinitializer */ + EP_INFO_T ep0; /*!< Endpoint 0 \hideinitializer */ + HC_DRV_T *hc_driver; /*!< host controller driver \hideinitializer */ + struct iface_t *iface_list; /*!< Working interface list \hideinitializer */ + struct udev_t *next; /*!< link for global usb device list \hideinitializer */ +} UDEV_T; + +typedef struct alt_iface_t +{ + DESC_IF_T *ifd; /*!< point to the location of this alternative interface descriptor in UDEV_T->cfd_buff */ + EP_INFO_T ep[MAX_EP_PER_IFACE]; /*!< endpoints of this alternative interface */ +} ALT_IFACE_T; + +typedef struct iface_t +{ + UDEV_T *udev; /*!< USB device \hideinitializer */ + uint8_t if_num; /*!< Interface number \hideinitializer */ + uint8_t num_alt; /*!< Number of alternative interface \hideinitializer */ + ALT_IFACE_T *aif; /*!< Point to the active alternative interface */ + ALT_IFACE_T alt[MAX_ALT_PER_IFACE]; /*!< List of alternative interface \hideinitializer */ + UDEV_DRV_T *driver; /*!< Interface associated driver \hideinitializer */ + void *context; /*!< Reference to device context \hideinitializer */ + struct iface_t *next; /*!< Point to next interface of the same device. Started from UDEV_T->iface_list \hideinitializer */ +} IFACE_T; + + +/*----------------------------------------------------------------------------------*/ +/* URB (USB Request Block) */ +/*----------------------------------------------------------------------------------*/ + +#define IF_PER_UTR 8 /* number of frames per UTR isochronous transfer (DO NOT modify it!) */ + +typedef void (*FUNC_UTR_T)(struct utr_t *); + +typedef struct utr_t +{ + UDEV_T *udev; /*!< point to associated USB device \hideinitializer */ + DEV_REQ_T setup; /*!< buffer for setup packet \hideinitializer */ + EP_INFO_T *ep; /*!< associated endpoint \hideinitializer */ + uint8_t *buff; /*!< transfer buffer \hideinitializer */ + uint8_t bIsTransferDone; /*!< tansfer done? \hideinitializer */ + uint32_t data_len; /*!< length of data to be transferred \hideinitializer */ + uint32_t xfer_len; /*!< length of transferred data \hideinitializer */ + uint8_t bIsoNewSched; /*!< New schedule isochronous transfer \hideinitializer */ + uint16_t iso_sf; /*!< Isochronous start frame number \hideinitializer */ + uint16_t iso_xlen[IF_PER_UTR]; /*!< transfer length of isochronous frames \hideinitializer */ + uint8_t *iso_buff[IF_PER_UTR]; /*!< transfer buffer address of isochronous frames \hideinitializer */ + int iso_status[IF_PER_UTR]; /*!< transfer status of isochronous frames \hideinitializer */ + int td_cnt; /*!< number of transfer descriptors \hideinitializer */ + int status; /*!< return status \hideinitializer */ + int interval; /*!< interrupt/isochronous interval \hideinitializer */ + void *context; /*!< point to deivce proprietary data area \hideinitializer */ + FUNC_UTR_T func; /*!< tansfer done call-back function \hideinitializer */ + struct utr_t *next; /* point to the next UTR of the same endpoint. \hideinitializer */ +} UTR_T; + + +/*----------------------------------------------------------------------------------*/ +/* Global variables */ +/*----------------------------------------------------------------------------------*/ +extern USBH_T *_ohci0, *_ohci1, *_ohci2; +extern HSUSBH_T *_ehci0, *_ehci1; + +extern HC_DRV_T ohci0_driver, ohci1_driver, ohci2_driver; +extern HC_DRV_T ehci0_driver, ehci1_driver; + +extern UDEV_T *g_udev_list; + +/*----------------------------------------------------------------------------------*/ +/* USB stack exported functions */ +/*----------------------------------------------------------------------------------*/ +extern void usbh_delay_ms(int msec); + +extern void usbh_dump_buff_bytes(uint8_t *buff, int nSize); +extern void usbh_dump_interface_descriptor(DESC_IF_T *if_desc); +extern void usbh_dump_endpoint_descriptor(DESC_EP_T *ep_desc); +extern void usbh_dump_iface(IFACE_T *iface); +extern void usbh_dump_ep_info(EP_INFO_T *ep); + +/* + * Memory management functions + */ +extern void USB_InitializeMemoryPool(void); +extern void *USB_malloc(int wanted_size, int boundary); +extern void USB_free(void *); +extern int USB_available_memory(void); +extern int USB_allocated_memory(void); +extern void usbh_memory_init(void); +extern uint32_t usbh_memory_used(void); +extern void *usbh_alloc_mem(int size); +extern void usbh_free_mem(void *p, int size); +extern int alloc_dev_address(void); +extern void free_dev_address(int dev_addr); +extern UDEV_T *alloc_device(void); +extern void free_device(UDEV_T *udev); +extern UTR_T *alloc_utr(UDEV_T *udev); +extern void free_utr(UTR_T *utr); +extern ED_T *alloc_ohci_ED(void); +extern void free_ohci_ED(ED_T *ed); +extern TD_T *alloc_ohci_TD(UTR_T *utr); +extern void free_ohci_TD(TD_T *td); +extern QH_T *alloc_ehci_QH(void); +extern void free_ehci_QH(QH_T *qh); +extern qTD_T *alloc_ehci_qTD(UTR_T *utr); +extern void free_ehci_qTD(qTD_T *qtd); +extern iTD_T *alloc_ehci_iTD(void); +extern void free_ehci_iTD(iTD_T *itd); +extern siTD_T *alloc_ehci_siTD(void); +extern void free_ehci_siTD(siTD_T *sitd); + + +extern void usbh_hub_init(void); +extern int usbh_connect_device(UDEV_T *); +extern void usbh_disconnect_device(UDEV_T *); +extern int usbh_register_driver(UDEV_DRV_T *driver); +extern EP_INFO_T *usbh_iface_find_ep(IFACE_T *iface, uint8_t ep_addr, uint8_t dir_type); +extern int usbh_reset_device(UDEV_T *); +extern int usbh_reset_port(UDEV_T *); + +/* + * USB Standard Request functions + */ +extern int usbh_get_device_descriptor(UDEV_T *udev, DESC_DEV_T *desc_buff); +extern int usbh_get_config_descriptor(UDEV_T *udev, uint8_t *desc_buff, int buff_len); +extern int usbh_set_configuration(UDEV_T *udev, uint8_t conf_val); +extern int usbh_set_interface(IFACE_T *iface, uint16_t alt_setting); +extern int usbh_clear_halt(UDEV_T *udev, uint16_t ep_addr); + +extern int usbh_ctrl_xfer(UDEV_T *udev, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength, uint8_t *buff, uint32_t *xfer_len, uint32_t timeout); +extern int usbh_bulk_xfer(UTR_T *utr); +extern int usbh_int_xfer(UTR_T *utr); +extern int usbh_iso_xfer(UTR_T *utr); +extern int usbh_quit_utr(UTR_T *utr); +extern int usbh_quit_xfer(UDEV_T *udev, EP_INFO_T *ep); + + +/// @endcond HIDDEN_SYMBOLS + +#endif /* _USBH_H_ */ diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/usbh_lib.h b/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/usbh_lib.h new file mode 100644 index 0000000000..90eb8c3de3 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/usbh_lib.h @@ -0,0 +1,189 @@ +/**************************************************************************//** + * @file usbh_lib.h + * @version V1.10 + * @brief USB Host library exported header file. + * + * @note + * SPDX-License-Identifier: Apache-2.0 + * Copyright (C) 2017 Nuvoton Technology Corp. All rights reserved. + ******************************************************************************/ +#ifndef _USBH_LIB_H_ +#define _USBH_LIB_H_ + +#include "NuMicro.h" + +#include "usb.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** @addtogroup LIBRARY Library + @{ +*/ + +/** @addtogroup USBH_Library USB Host Library + @{ +*/ + +/** @addtogroup USBH_EXPORTED_CONSTANTS USB Host Exported Constants + @{ +*/ + +#define USBH_OK 0 /*!< No error. */ +#define USBH_ERR_MEMORY_OUT -10 /*!< Out of memory. */ +#define USBH_ERR_IF_ALT_LIMIT -11 /*!< Number of alternative interface > MAX_ALT_PER_IFACE */ +#define USBH_ERR_IF_EP_LIMIT -15 /*!< Number of endpoints > MAX_EP_PER_IFACE */ +#define USBH_ERR_NOT_SUPPORTED -101 /*!< Device/Class/Transfer not supported */ +#define USBH_ERR_NOT_MATCHED -103 /*!< Not macthed */ +#define USBH_ERR_NOT_EXPECTED -104 /*!< Unknown or unexpected */ +#define USBH_ERR_INVALID_PARAM -105 /*!< Invalid parameter */ +#define USBH_ERR_NOT_FOUND -106 /*!< Device or interface not found */ +#define USBH_ERR_EP_NOT_FOUND -107 /*!< Endpoint not found */ +#define USBH_ERR_DESCRIPTOR -137 /*!< Failed to parse USB descriptors */ +#define USBH_ERR_SET_DEV_ADDR -139 /*!< Failed to set device address */ +#define USBH_ERR_SET_CONFIG -151 /*!< Failed to set device configuration */ + +#define USBH_ERR_TRANSFER -201 /*!< USB transfer error */ +#define USBH_ERR_TIMEOUT -203 /*!< USB transfer time-out */ +#define USBH_ERR_ABORT -205 /*!< USB transfer aborted due to disconnect or reset */ +#define USBH_ERR_PORT_RESET -255 /*!< Hub port reset failed */ +#define USBH_ERR_SCH_OVERRUN -257 /*!< USB isochronous schedule overrun */ +#define USBH_ERR_DISCONNECTED -259 /*!< USB device was disconnected */ + +#define USBH_ERR_TRANSACTION -271 /*!< USB transaction timeout, CRC, Bad PID, etc. */ +#define USBH_ERR_BABBLE_DETECTED -272 /*!< A 'babble' is detected during the transaction */ +#define USBH_ERR_DATA_BUFF -274 /*!< Data buffer overrun or underrun */ + +#define USBH_ERR_CC_NO_ERR -280 /*!< OHCI CC code - no error */ +#define USBH_ERR_CRC -281 /*!< USB trasfer CRC error */ +#define USBH_ERR_BIT_STUFF -282 /*!< USB transfer bit stuffing error */ +#define USBH_ERR_DATA_TOGGLE -283 /*!< USB trasfer data toggle error */ +#define USBH_ERR_STALL -284 /*!< USB trasfer STALL error */ +#define USBH_ERR_DEV_NO_RESP -285 /*!< USB trasfer device no response error */ +#define USBH_ERR_PID_CHECK -286 /*!< USB trasfer PID check failure */ +#define USBH_ERR_UNEXPECT_PID -287 /*!< USB trasfer unexpected PID error */ +#define USBH_ERR_DATA_OVERRUN -288 /*!< USB trasfer data overrun error */ +#define USBH_ERR_DATA_UNDERRUN -289 /*!< USB trasfer data underrun error */ +#define USBH_ERR_BUFF_OVERRUN -292 /*!< USB trasfer buffer overrun error */ +#define USBH_ERR_BUFF_UNDERRUN -293 /*!< USB trasfer buffer underrun error */ +#define USBH_ERR_NOT_ACCESS0 -294 /*!< USB trasfer not accessed error */ +#define USBH_ERR_NOT_ACCESS1 -295 /*!< USB trasfer not accessed error */ + +#define USBH_ERR_OHCI_INIT -301 /*!< Failed to initialize OHIC controller. */ +#define USBH_ERR_OHCI_EP_BUSY -303 /*!< The endpoint is under transfer. */ + +#define USBH_ERR_EHCI_INIT -501 /*!< Failed to initialize EHCI controller. */ +#define USBH_ERR_EHCI_QH_BUSY -503 /*!< the Queue Head is busy. */ + +#define UMAS_OK 0 /*!< No error. */ +#define UMAS_ERR_NO_DEVICE -1031 /*!< No Mass Stroage Device found. */ +#define UMAS_ERR_IO -1033 /*!< Device read/write failed. */ +#define UMAS_ERR_INIT_DEVICE -1035 /*!< failed to init MSC device */ +#define UMAS_ERR_CMD_STATUS -1037 /*!< SCSI command status failed */ +#define UMAS_ERR_IVALID_PARM -1038 /*!< Invalid parameter. */ +#define UMAS_ERR_DRIVE_NOT_FOUND -1039 /*!< drive not found */ + +#define HID_RET_OK 0 /*!< Return with no errors. */ +#define HID_RET_DEV_NOT_FOUND -1081 /*!< HID device not found or removed. */ +#define HID_RET_IO_ERR -1082 /*!< USB transfer failed. */ +#define HID_RET_INVALID_PARAMETER -1083 /*!< Invalid parameter. */ +#define HID_RET_OUT_OF_MEMORY -1084 /*!< Out of memory. */ +#define HID_RET_NOT_SUPPORTED -1085 /*!< Function not supported. */ +#define HID_RET_EP_NOT_FOUND -1086 /*!< Endpoint not found. */ +#define HID_RET_PARSING -1087 /*!< Failed to parse HID descriptor */ +#define HID_RET_XFER_IS_RUNNING -1089 /*!< The transfer has been enabled. */ +#define HID_RET_REPORT_NOT_FOUND -1090 /*!< The transfer has been enabled. */ + +#define UAC_RET_OK 0 /*!< Return with no errors. */ +#define UAC_RET_DEV_NOT_FOUND -2001 /*!< Audio Class device not found or removed. */ +#define UAC_RET_FUNC_NOT_FOUND -2002 /*!< Audio device has no this function. */ +#define UAC_RET_IO_ERR -2003 /*!< USB transfer failed. */ +#define UAC_RET_DATA_LEN -2004 /*!< Unexpected transfer length */ +#define UAC_RET_INVALID -2005 /*!< Invalid parameter or usage. */ +#define UAC_RET_OUT_OF_MEMORY -2007 /*!< Out of memory. */ +#define UAC_RET_DRV_NOT_SUPPORTED -2009 /*!< Function not supported by this UAC driver. */ +#define UAC_RET_DEV_NOT_SUPPORTED -2011 /*!< Function not supported by the UAC device. */ +#define UAC_RET_PARSER -2013 /*!< Failed to parse UAC descriptor */ +#define UAC_RET_IS_STREAMING -2015 /*!< Audio pipe is on streaming. */ + + +/*@}*/ /* end of group USBH_EXPORTED_CONSTANTS */ + + +/** @addtogroup USBH_EXPORTED_TYPEDEF USB Host Typedef + @{ +*/ +struct udev_t; +typedef void (CONN_FUNC)(struct udev_t *udev, int param); + +struct line_coding_t; +struct cdc_dev_t; +typedef void (CDC_CB_FUNC)(struct cdc_dev_t *cdev, uint8_t *rdata, int data_len); + +struct usbhid_dev; +typedef void (HID_IR_FUNC)(struct usbhid_dev *hdev, uint16_t ep_addr, int status, uint8_t *rdata, uint32_t data_len); /*!< interrupt in callback function \hideinitializer */ +typedef void (HID_IW_FUNC)(struct usbhid_dev *hdev, uint16_t ep_addr, int status, uint8_t *wbuff, uint32_t *data_len); /*!< interrupt out callback function \hideinitializer */ + +struct uac_dev_t; +typedef int (UAC_CB_FUNC)(struct uac_dev_t *dev, uint8_t *data, int len); /*!< audio in callback function \hideinitializer */ + +/*@}*/ /* end of group USBH_EXPORTED_STRUCT */ + + + +/** @addtogroup USBH_EXPORTED_FUNCTIONS USB Host Exported Functions + @{ +*/ + +/*------------------------------------------------------------------*/ +/* */ +/* USB Core Library APIs */ +/* */ +/*------------------------------------------------------------------*/ +extern void usbh_core_init(void); +extern int usbh_polling_root_hubs(void); +extern void usbh_install_conn_callback(CONN_FUNC *conn_func, CONN_FUNC *disconn_func); +extern void usbh_suspend(void); +extern void usbh_resume(void); +extern struct udev_t *usbh_find_device(char *hub_id, int port); + +/** + * @brief A function return current tick count. + * @return Current tick. + * @details User application must provide this function to return current tick. + * The tick should increase by 1 for every 10 ms. + */ +extern uint32_t usbh_get_ticks(void); /* This function must be provided by user application. */ +extern uint32_t usbh_tick_from_millisecond(uint32_t msec); /* This function must be provided by user application. */ + + +/// @cond HIDDEN_SYMBOLS + +//extern void dump_ohci_regs(void); +//extern void dump_ehci_regs(void); +//extern void dump_ohci_ports(void); +//extern void dump_ehci_ports(void); +//extern uint32_t usbh_memory_used(void); + +/// @endcond HIDDEN_SYMBOLS + + +/*@}*/ /* end of group USBH_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group USBH_Library */ + +/*@}*/ /* end of group LIBRARY */ + +#ifdef __cplusplus +} +#endif + +#endif /* _USBH_LIB_H_ */ + +/*** (C) COPYRIGHT 2017 Nuvoton Technology Corp. ***/ + + + diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ehci.c_ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ehci.c_ new file mode 100644 index 0000000000..958844b806 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ehci.c_ @@ -0,0 +1,1264 @@ +/**************************************************************************//** + * @file ehci.c + * @version V1.10 + * @brief USB Host library EHCI (USB 2.0) host controller driver. + * + * @note + * SPDX-License-Identifier: Apache-2.0 + * Copyright (C) 2017 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + + +/// @cond HIDDEN_SYMBOLS + +static QH_T *_H_qh; /* head of reclamation list */ +static qTD_T *_ghost_qtd; /* used as a terminator qTD */ +static QH_T *qh_remove_list; + +static uint32_t _PFList_mem[FL_SIZE] __attribute__((aligned(4096))); /* Periodic frame list */ + +static uint32_t *_PFList; + +static QH_T *_Iqh[NUM_IQH]; + +static int ehci_quit_iso_xfer(UTR_T *utr, EP_INFO_T *ep); +static void scan_isochronous_list(void); + + +#ifdef ENABLE_ERROR_MSG +static void dump_ehci_regs(void) +{ + USB_debug("Dump HSUSBH(0x%x) registers:\n", ptr_to_u32(&_ehci->EHCVNR)); + USB_debug(" EHCVNR = 0x%x\n", _ehci->EHCVNR); + USB_debug(" EHCSPR = 0x%x\n", _ehci->EHCSPR); + USB_debug(" EHCCPR = 0x%x\n", _ehci->EHCCPR); + USB_debug(" UCMDR = 0x%x\n", _ehci->UCMDR); + USB_debug(" USTSR = 0x%x\n", _ehci->USTSR); + USB_debug(" UIENR = 0x%x\n", _ehci->UIENR); + USB_debug(" UFINDR = 0x%x\n", _ehci->UFINDR); + USB_debug(" UPFLBAR = 0x%x\n", _ehci->UPFLBAR); + USB_debug(" UCALAR = 0x%x\n", _ehci->UCALAR); + USB_debug(" UCFGR = 0x%x\n", _ehci->UCFGR); + USB_debug(" UPSCR0 = 0x%x\n", _ehci->UPSCR); +// USB_debug(" PHYCTL0 = 0x%x\n", _ehci->USBPCR0); +// USB_debug(" PHYCTL1 = 0x%x\n", _ehci->USBPCR1); +} + +static void dump_ehci_ports() +{ + USB_debug("_ehci port0=0x%x\n", _ehci->UPSCR); +} + +static void dump_ehci_qtd(qTD_T *qtd) +{ + USB_debug(" [qTD] - 0x%08x\n", (int)qtd); + USB_debug(" 0x%08x (Next qtd Pointer)\n", qtd->Next_qTD); + USB_debug(" 0x%08x (Alternate Next qtd Pointer)\n", qtd->Alt_Next_qTD); + USB_debug(" 0x%08x (qtd Token) PID: %s, Bytes: %d, IOC: %d\n", qtd->Token, (((qtd->Token >> 8) & 0x3) == 0) ? "OUT" : ((((qtd->Token >> 8) & 0x3) == 1) ? "IN" : "SETUP"), (qtd->Token >> 16) & 0x7FFF, (qtd->Token >> 15) & 0x1); + USB_debug(" 0x%08x (Buffer Pointer (page 0))\n", qtd->Bptr[0]); + //USB_debug(" 0x%08x (Buffer Pointer (page 1))\n", qtd->Bptr[1]); + //USB_debug(" 0x%08x (Buffer Pointer (page 2))\n", qtd->Bptr[2]); + //USB_debug(" 0x%08x (Buffer Pointer (page 3))\n", qtd->Bptr[3]); + //USB_debug(" 0x%08x (Buffer Pointer (page 4))\n", qtd->Bptr[4]); + USB_debug("\n"); +} + +static void dump_ehci_asynclist(void) +{ + QH_T *qh = _H_qh; + qTD_T *qtd; + + USB_debug(">>> Dump EHCI Asynchronous List <<<\n"); + do + { + USB_debug("[QH] - 0x%08x\n", (int)qh); + USB_debug(" 0x%08x (Queue Head Horizontal Link Pointer, Queue Head DWord 0)\n", qh->HLink); + USB_debug(" 0x%08x (Endpoint Characteristics) DevAddr: %d, EP: 0x%x, PktSz: %d, Speed: %s\n", qh->Chrst, (qh->Chrst & 0x7F), ((qh->Chrst >> 8) & 0xF), ((qh->Chrst >> 16) & 0x7FF), ((qh->Chrst >> 12) & 0x3 == 0) ? "Full" : (((qh->Chrst >> 12) & 0x3 == 1) ? "Low" : "High")); + USB_debug(" 0x%08x (Endpoint Capabilities: Queue Head DWord 2)\n", qh->Cap); + USB_debug(" 0x%08x (Current qtd Pointer)\n", qh->Curr_qTD); + USB_debug(" --- Overlay Area ---\n"); + USB_debug(" 0x%08x (Next qtd Pointer)\n", qh->OL_Next_qTD); + USB_debug(" 0x%08x (Alternate Next qtd Pointer)\n", qh->OL_Alt_Next_qTD); + USB_debug(" 0x%08x (qtd Token)\n", qh->OL_Token); + USB_debug(" 0x%08x (Buffer Pointer (page 0))\n", qh->OL_Bptr[0]); + USB_debug("\n"); + + qtd = QTD_PTR(qh->Curr_qTD); + while (qtd != NULL) + { + dump_ehci_qtd(qtd); + qtd = QTD_PTR(qtd->Next_qTD); + } + qh = QH_PTR(qh->HLink); + } + while (qh != _H_qh); +} + +static void dump_ehci_asynclist_simple(void) +{ + QH_T *qh = _H_qh; + + USB_debug(">>> EHCI Asynchronous List <<<\n"); + USB_debug("[QH] => "); + do + { + USB_debug("0x%08x ", (int)qh); + qh = QH_PTR(qh->HLink); + } + while (qh != _H_qh); + USB_debug("\n"); +} + +static void dump_ehci_period_frame_list_simple(void) +{ + QH_T *qh = _Iqh[NUM_IQH - 1]; + + USB_debug(">>> EHCI period frame list simple <<<\n"); + USB_debug("[FList] => "); + do + { + USB_debug("0x%08x ", (int)qh); + qh = QH_PTR(qh->HLink); + } + while (qh != NULL); + USB_debug("\n"); +} + +static void dump_ehci_period_frame_list() +{ + int i; + QH_T *qh; + + for (i = 0; i < FL_SIZE; i++) + { + USB_debug("!%02d: ", i); + qh = QH_PTR(_PFList[i]);; + while (qh != NULL) + { + // USB_debug("0x%x (0x%x) => ", (int)qh, qh->HLink); + USB_debug("0x%x => ", (int)qh); + qh = QH_PTR(qh->HLink); + } + USB_debug("0\n"); + } +} + +#endif /* ENABLE_ERROR_MSG */ + +static void init_periodic_frame_list() +{ + QH_T *qh_p; + int i, idx, interval; + + _PFList = (uint32_t *)((uint32_t)_PFList_mem | NON_CACHE_MASK); + memset(_PFList, 0, sizeof(_PFList_mem)); + + iso_ep_list = NULL; + + for (i = NUM_IQH - 1; i >= 0; i--) /* interval = i^2 */ + { + _Iqh[i] = alloc_ehci_QH(); + + _Iqh[i]->HLink = QH_HLNK_END; + _Iqh[i]->Curr_qTD = (uint32_t)_ghost_qtd; + _Iqh[i]->OL_Next_qTD = QTD_LIST_END; + _Iqh[i]->OL_Alt_Next_qTD = (uint32_t)_ghost_qtd; + _Iqh[i]->OL_Token = QTD_STS_HALT; + + interval = 0x1 << i; + + for (idx = interval - 1; idx < FL_SIZE; idx += interval) + { + if (_PFList[idx] == 0) /* is empty list, insert directly */ + { + _PFList[idx] = QH_HLNK_QH(_Iqh[i]); + } + else + { + qh_p = QH_PTR(_PFList[idx]); + + while (1) + { + if (qh_p == _Iqh[i]) + break; /* already chained by previous visit */ + + if (qh_p->HLink == QH_HLNK_END) /* reach end of list? */ + { + qh_p->HLink = QH_HLNK_QH(_Iqh[i]); + break; + } + qh_p = QH_PTR(qh_p->HLink); + } + } + } + } +} + +static QH_T *get_int_tree_head_node(int interval) +{ + int i; + + interval /= 8; /* each frame list entry for 8 micro-frame */ + + for (i = 0; i < NUM_IQH - 1; i++) + { + interval >>= 1; + if (interval == 0) + return _Iqh[i]; + } + return _Iqh[NUM_IQH - 1]; +} + +static int make_int_s_mask(int bInterval) +{ + int order, interval; + + interval = 1; + while (bInterval > 1) + { + interval *= 2; + bInterval--; + } + + if (interval < 2) + return 0xFF; /* interval 1 */ + if (interval < 4) + return 0x55; /* interval 2 */ + if (interval < 8) + return 0x22; /* interval 4 */ + for (order = 0; (interval > 1); order++) + { + interval >>= 1; + } + return (0x1 << (order % 8)); +} + +static int ehci_init(void) +{ + int timeout = 250 * 1000; /* EHCI reset time-out 250 ms */ + + /*------------------------------------------------------------------------------------*/ + /* Reset EHCI host controller */ + /*------------------------------------------------------------------------------------*/ + _ehci->UCMDR = HSUSBH_UCMDR_HCRST_Msk; + while ((_ehci->UCMDR & HSUSBH_UCMDR_HCRST_Msk) && (timeout > 0)) + { + usbh_delay_ms(1); + timeout -= 1000; + } + if (_ehci->UCMDR & HSUSBH_UCMDR_HCRST_Msk) + return USBH_ERR_EHCI_INIT; + + _ehci->UCMDR = UCMDR_INT_THR_CTRL | HSUSBH_UCMDR_RUN_Msk; + + _ghost_qtd = alloc_ehci_qTD(NULL); + _ghost_qtd->Token = 0x11197B7F; //QTD_STS_HALT; visit_qtd() will not remove a qTD with this mark. It represents a qhost qTD. + + /*------------------------------------------------------------------------------------*/ + /* Initialize asynchronous list */ + /*------------------------------------------------------------------------------------*/ + qh_remove_list = NULL; + + /* Create the QH list head with H-bit 1 */ + _H_qh = alloc_ehci_QH(); + _H_qh->HLink = QH_HLNK_QH(_H_qh); /* circular link to itself, the only one QH */ + _H_qh->Chrst = QH_RCLM_LIST_HEAD; /* it's the head of reclamation list */ + _H_qh->Curr_qTD = (uint32_t)_ghost_qtd; + _H_qh->OL_Next_qTD = QTD_LIST_END; + _H_qh->OL_Alt_Next_qTD = (uint32_t)_ghost_qtd; + _H_qh->OL_Token = QTD_STS_HALT; + _ehci->UCALAR = (uint32_t)_H_qh; + + /*------------------------------------------------------------------------------------*/ + /* Initialize periodic list */ + /*------------------------------------------------------------------------------------*/ + if (FL_SIZE == 256) + _ehci->UCMDR |= (0x2 << HSUSBH_UCMDR_FLSZ_Pos); + else if (FL_SIZE == 512) + _ehci->UCMDR |= (0x1 << HSUSBH_UCMDR_FLSZ_Pos); + else if (FL_SIZE == 1024) + _ehci->UCMDR |= (0x0 << HSUSBH_UCMDR_FLSZ_Pos); + else + return USBH_ERR_EHCI_INIT; /* Invalid FL_SIZE setting! */ + + /*------------------------------------------------------------------------------------*/ + /* start run */ + /*------------------------------------------------------------------------------------*/ + + _ehci->UCFGR = 0x1; /* enable port routing to EHCI */ + _ehci->UIENR = HSUSBH_UIENR_USBIEN_Msk | HSUSBH_UIENR_UERRIEN_Msk | HSUSBH_UIENR_HSERREN_Msk | HSUSBH_UIENR_IAAEN_Msk; + + usbh_delay_ms(1); /* delay 1 ms */ + + _ehci->UPSCR[0] = HSUSBH_UPSCR_PP_Msk; /* enable port 1 port power */ + //_ehci->UPSCR[0] = HSUSBH_UPSCR_PP_Msk | HSUSBH_UPSCR_PO_Msk; /* set port owner to OHCI */ + + init_periodic_frame_list(); + + _ehci->UPFLBAR = (uint32_t)_PFList; + usbh_delay_ms(10); /* delay 10 ms */ + + return 0; +} + +static void ehci_suspend(void) +{ + if (_ehci->UPSCR[0] & 0x1) + _ehci->UPSCR[0] |= HSUSBH_UPSCR_SUSPEND_Msk; +} + +static void ehci_resume(void) +{ + if (_ehci->UPSCR[0] & 0x1) + _ehci->UPSCR[0] = (_ehci->UPSCR[0] & ~HSUSBH_UPSCR_SUSPEND_Msk) | HSUSBH_UPSCR_FPR_Msk; +} + +static void ehci_shutdown(void) +{ + ehci_suspend(); +} + +static void move_qh_to_remove_list(QH_T *qh) +{ + QH_T *q; + + // USB_debug("move_qh_to_remove_list - 0x%x (0x%x)\n", (int)qh, qh->Chrst); + + /* check if this ED found in ed_remove_list */ + q = qh_remove_list; + while (q) + { + if (q == qh) /* This QH found in qh_remove_list. */ + { + return; /* Do nothing, return... */ + } + q = q->next; + } + + DISABLE_EHCI_IRQ(); + + /*------------------------------------------------------------------------------------*/ + /* Search asynchronous frame list and remove qh if found in list. */ + /*------------------------------------------------------------------------------------*/ + q = _H_qh; /* find and remove it from asynchronous list */ + while (QH_PTR(q->HLink) != _H_qh) + { + if (QH_PTR(q->HLink) == qh) + { + /* q's next QH is qh, found... */ + q->HLink = qh->HLink; /* remove qh from list */ + + qh->next = qh_remove_list; /* add qh to qh_remove_list */ + qh_remove_list = qh; + _ehci->UCMDR |= HSUSBH_UCMDR_IAAD_Msk; /* trigger IAA interrupt */ + ENABLE_EHCI_IRQ(); + return; /* done */ + } + q = QH_PTR(q->HLink); /* advance to next QH in asynchronous list */ + } + + /*------------------------------------------------------------------------------------*/ + /* Search periodic frame list and remove qh if found in list. */ + /*------------------------------------------------------------------------------------*/ + q = _Iqh[NUM_IQH - 1]; + while (q->HLink != QH_HLNK_END) + { + if (QH_PTR(q->HLink) == qh) + { + /* q's next QH is qh, found... */ + q->HLink = qh->HLink; /* remove qh from list */ + + qh->next = qh_remove_list; /* add qh to qh_remove_list */ + qh_remove_list = qh; + _ehci->UCMDR |= HSUSBH_UCMDR_IAAD_Msk; /* trigger IAA interrupt */ + ENABLE_EHCI_IRQ(); + return; /* done */ + } + q = QH_PTR(q->HLink); /* advance to next QH in asynchronous list */ + } + ENABLE_EHCI_IRQ(); +} + +static void append_to_qtd_list_of_QH(QH_T *qh, qTD_T *qtd) +{ + qTD_T *q; + + if (qh->qtd_list == NULL) + { + qh->qtd_list = qtd; + } + else + { + q = qh->qtd_list; + while (q->next != NULL) + { + q = q->next; + } + q->next = qtd; + } +} + +/* + * If ep==NULL, it's a control endpoint QH. + */ +static void write_qh(UDEV_T *udev, EP_INFO_T *ep, QH_T *qh) +{ + uint32_t chrst, cap; + + /*------------------------------------------------------------------------------------*/ + /* Write QH DWord 1 - Endpoint Characteristics */ + /*------------------------------------------------------------------------------------*/ + if (ep == NULL) /* is control endpoint? */ + { + if (udev->descriptor.bMaxPacketSize0 == 0) + { + if (udev->speed == SPEED_LOW) /* give a default maximum packet size */ + udev->descriptor.bMaxPacketSize0 = 8; + else + udev->descriptor.bMaxPacketSize0 = 64; + } + chrst = QH_DTC | QH_NAK_RL | (udev->descriptor.bMaxPacketSize0 << 16); + if (udev->speed != SPEED_HIGH) + chrst |= QH_CTRL_EP_FLAG; /* non-high-speed control endpoint */ + } + else /* not a control endpoint */ + { + chrst = QH_NAK_RL | (ep->wMaxPacketSize << 16); + chrst |= ((ep->bEndpointAddress & 0xf) << 8); /* Endpoint Address */ + } + + if (udev->speed == SPEED_LOW) + chrst |= QH_EPS_LOW; + else if (udev->speed == SPEED_FULL) + chrst |= QH_EPS_FULL; + else + chrst |= QH_EPS_HIGH; + + chrst |= udev->dev_num; + + qh->Chrst = chrst; + + /*------------------------------------------------------------------------------------*/ + /* Write QH DWord 2 - Endpoint Capabilities */ + /*------------------------------------------------------------------------------------*/ + if (udev->speed == SPEED_HIGH) + { + cap = 0x40000000; + } + else + { + /* + * Backtrace device tree until the USB 2.0 hub found + */ + HUB_DEV_T *hub; + int port_num; + + port_num = udev->port_num; + hub = udev->parent; + + while ((hub != NULL) && (hub->iface->udev->speed != SPEED_HIGH)) + { + port_num = hub->iface->udev->port_num; + hub = hub->iface->udev->parent; + } + + cap = (port_num << QH_HUB_PORT_Pos) | + (hub->iface->udev->dev_num << QH_HUB_ADDR_Pos); + } + + qh->Cap = cap; +} + +static void write_qtd_bptr(qTD_T *qtd, uint32_t buff_addr, int xfer_len) +{ + int i; + + qtd->xfer_len = xfer_len; + qtd->Bptr[0] = buff_addr; + + buff_addr = (buff_addr + 0x1000) & ~0xFFF; + + for (i = 1; i < 5; i++) + { + qtd->Bptr[i] = buff_addr; + buff_addr += 0x1000; + } +} + +static int ehci_ctrl_xfer(UTR_T *utr) +{ + UDEV_T *udev; + QH_T *qh; + qTD_T *qtd_setup, *qtd_data, *qtd_status; + uint32_t token; + int is_new_qh = 0; + + udev = utr->udev; + + if (utr->data_len > 0) + { + if (((uint32_t)utr->buff + utr->data_len) > (((uint32_t)utr->buff & ~0xFFF) + 0x5000)) + return USBH_ERR_BUFF_OVERRUN; + } + + /*------------------------------------------------------------------------------------*/ + /* Allocate and link QH */ + /*------------------------------------------------------------------------------------*/ + if (udev->ep0.hw_pipe != NULL) + { + qh = (QH_T *)udev->ep0.hw_pipe; + if (qh->qtd_list) + return USBH_ERR_EHCI_QH_BUSY; + } + else + { + qh = alloc_ehci_QH(); + if (qh == NULL) + return USBH_ERR_MEMORY_OUT; + + udev->ep0.hw_pipe = (void *)qh; /* driver can find QH from EP */ + is_new_qh = 1; + } + write_qh(udev, NULL, qh); + utr->ep = &udev->ep0; /* driver can find EP from UTR */ + + /*------------------------------------------------------------------------------------*/ + /* Allocate qTDs */ + /*------------------------------------------------------------------------------------*/ + qtd_setup = alloc_ehci_qTD(utr); /* allocate qTD for SETUP */ + + if (utr->data_len > 0) + qtd_data = alloc_ehci_qTD(utr); /* allocate qTD for DATA */ + else + qtd_data = NULL; + + qtd_status = alloc_ehci_qTD(utr); /* allocate qTD for USTSR */ + + if (qtd_status == NULL) /* out of memory? */ + { + if (qtd_setup) + free_ehci_qTD(qtd_setup); /* free memory */ + if (qtd_data) + free_ehci_qTD(qtd_data); /* free memory */ + return USBH_ERR_MEMORY_OUT; /* out of memory */ + } + + //USB_debug("qh=0x%x, qtd_setup=0x%x, qtd_data=0x%x, qtd_status=0x%x\n", (int)qh, (int)qtd_setup, (int)qtd_data, (int)qtd_status); + + /*------------------------------------------------------------------------------------*/ + /* prepare SETUP stage qTD */ + /*------------------------------------------------------------------------------------*/ + qtd_setup->qh = qh; + //qtd_setup->utr = utr; + write_qtd_bptr(qtd_setup, (uint32_t)&utr->setup, 8); + append_to_qtd_list_of_QH(qh, qtd_setup); + qtd_setup->Token = (8 << 16) | QTD_ERR_COUNTER | QTD_PID_SETUP | QTD_STS_ACTIVE; + + /*------------------------------------------------------------------------------------*/ + /* prepare DATA stage qTD */ + /*------------------------------------------------------------------------------------*/ + if (utr->data_len > 0) + { + qtd_setup->Next_qTD = (uint32_t)qtd_data; + qtd_data->Next_qTD = (uint32_t)qtd_status; + + if ((utr->setup.bmRequestType & 0x80) == REQ_TYPE_OUT) + token = QTD_ERR_COUNTER | QTD_PID_OUT | QTD_STS_ACTIVE; + else + token = QTD_ERR_COUNTER | QTD_PID_IN | QTD_STS_ACTIVE; + + qtd_data->qh = qh; + //qtd_data->utr = utr; + write_qtd_bptr(qtd_data, (uint32_t)utr->buff, utr->data_len); + append_to_qtd_list_of_QH(qh, qtd_data); + qtd_data->Token = QTD_DT | (utr->data_len << 16) | token; + } + else + { + qtd_setup->Next_qTD = (uint32_t)qtd_status; + } + + /*------------------------------------------------------------------------------------*/ + /* prepare USTSR stage qTD */ + /*------------------------------------------------------------------------------------*/ + qtd_status->Next_qTD = (uint32_t)_ghost_qtd; + qtd_status->Alt_Next_qTD = QTD_LIST_END; + + if ((utr->setup.bmRequestType & 0x80) == REQ_TYPE_OUT) + token = QTD_ERR_COUNTER | QTD_PID_IN | QTD_STS_ACTIVE; + else + token = QTD_ERR_COUNTER | QTD_PID_OUT | QTD_STS_ACTIVE; + + qtd_status->qh = qh; + //qtd_status->utr = utr; + append_to_qtd_list_of_QH(qh, qtd_status); + qtd_status->Token = QTD_DT | QTD_IOC | token; + + /*------------------------------------------------------------------------------------*/ + /* Update QH overlay */ + /*------------------------------------------------------------------------------------*/ + qh->Curr_qTD = 0; + qh->OL_Next_qTD = (uint32_t)qtd_setup; + qh->OL_Alt_Next_qTD = QTD_LIST_END; + qh->OL_Token = 0; + + /*------------------------------------------------------------------------------------*/ + /* Link QH and start asynchronous transfer */ + /*------------------------------------------------------------------------------------*/ + if (is_new_qh) + { + qh->HLink = _H_qh->HLink; + _H_qh->HLink = QH_HLNK_QH(qh); + } + + /* Start transfer */ + _ehci->UCMDR |= HSUSBH_UCMDR_ASEN_Msk; /* start asynchronous transfer */ + return 0; +} + +static int ehci_bulk_xfer(UTR_T *utr) +{ + UDEV_T *udev; + EP_INFO_T *ep = utr->ep; + QH_T *qh; + qTD_T *qtd, *qtd_pre; + uint32_t data_len, xfer_len; + uint8_t *buff; + uint32_t token; + int is_new_qh = 0; + + //USB_debug("Bulk XFER =>\n"); + // dump_ehci_asynclist_simple(); + + udev = utr->udev; + + if (ep->hw_pipe != NULL) + { + qh = (QH_T *)ep->hw_pipe ; + if (qh->qtd_list) + { + return USBH_ERR_EHCI_QH_BUSY; + } + } + else + { + qh = alloc_ehci_QH(); + if (qh == NULL) + return USBH_ERR_MEMORY_OUT; + is_new_qh = 1; + write_qh(udev, ep, qh); + ep->hw_pipe = (void *)qh; /* associate QH with endpoint */ + } + + /*------------------------------------------------------------------------------------*/ + /* Prepare qTDs */ + /*------------------------------------------------------------------------------------*/ + data_len = utr->data_len; + buff = utr->buff; + qtd_pre = NULL; + + while (data_len > 0) + { + qtd = alloc_ehci_qTD(utr); + if (qtd == NULL) /* failed to allocate a qTD */ + { + qtd = qh->qtd_list; + while (qtd != NULL) + { + qtd_pre = qtd; + qtd = qtd->next; + free_ehci_qTD(qtd_pre); + } + if (is_new_qh) + { + free_ehci_QH(qh); + ep->hw_pipe = NULL; + } + return USBH_ERR_MEMORY_OUT; + } + + if ((ep->bEndpointAddress & EP_ADDR_DIR_MASK) == EP_ADDR_DIR_OUT) + token = QTD_ERR_COUNTER | QTD_PID_OUT | QTD_STS_ACTIVE; + else + token = QTD_ERR_COUNTER | QTD_PID_IN | QTD_STS_ACTIVE; + + if (data_len > 0x4000) /* force maximum x'fer length 16K per qTD */ + xfer_len = 0x4000; + else + xfer_len = data_len; /* remaining data length < 4K */ + + qtd->qh = qh; + qtd->Next_qTD = (uint32_t)_ghost_qtd; + qtd->Alt_Next_qTD = QTD_LIST_END; //(uint32_t)_ghost_qtd; + write_qtd_bptr(qtd, (uint32_t)buff, xfer_len); + append_to_qtd_list_of_QH(qh, qtd); + qtd->Token = (xfer_len << 16) | token; + + buff += xfer_len; /* advanced buffer pointer */ + data_len -= xfer_len; + + if (data_len == 0) /* is this the latest qTD? */ + { + qtd->Token |= QTD_IOC; /* ask to raise an interrupt on the last qTD */ + qtd->Next_qTD = (uint32_t)_ghost_qtd; /* qTD list end */ + } + + if (qtd_pre != NULL) + qtd_pre->Next_qTD = (uint32_t)qtd; + qtd_pre = qtd; + } + + //USB_debug("utr=0x%x, qh=0x%x, qtd=0x%x\n", (int)utr, (int)qh, (int)qh->qtd_list); + + qtd = qh->qtd_list; + + qh->OL_Next_qTD = (uint32_t)qtd; + + /*------------------------------------------------------------------------------------*/ + /* Link QH and start asynchronous transfer */ + /*------------------------------------------------------------------------------------*/ + if (is_new_qh) + { + memcpy(&(qh->OL_Bptr[0]), &(qtd->Bptr[0]), 20); + qh->Curr_qTD = (uint32_t)qtd; + + qh->OL_Token = 0; //qtd->Token; + + if (utr->ep->bToggle) + qh->OL_Token |= QTD_DT; + + qh->HLink = _H_qh->HLink; + _H_qh->HLink = QH_HLNK_QH(qh); + } + + /* Start transfer */ + _ehci->UCMDR |= HSUSBH_UCMDR_ASEN_Msk; /* start asynchronous transfer */ + + return 0; +} + +static int ehci_int_xfer(UTR_T *utr) +{ + UDEV_T *udev = utr->udev; + EP_INFO_T *ep = utr->ep; + QH_T *qh, *iqh; + qTD_T *qtd; + uint32_t token; + int8_t is_new_qh = 0; + + if (ep->hw_pipe != NULL) + { + qh = (QH_T *)ep->hw_pipe ; + if (qh->qtd_list) + return USBH_ERR_EHCI_QH_BUSY; + } + else + { + qh = alloc_ehci_QH(); + if (qh == NULL) + return USBH_ERR_MEMORY_OUT; + is_new_qh = 1; + write_qh(udev, ep, qh); + qh->Chrst &= ~0xF0000000; + + if (udev->speed == SPEED_HIGH) + { + qh->Cap = (0x1 << QH_MULT_Pos) | (qh->Cap & 0xff) | make_int_s_mask(ep->bInterval); + } + else + { + qh->Cap = (0x1 << QH_MULT_Pos) | (qh->Cap & ~(QH_C_MASK_Msk | QH_S_MASK_Msk)) | 0x7802; + } + ep->hw_pipe = (void *)qh; /* associate QH with endpoint */ + } + + /*------------------------------------------------------------------------------------*/ + /* Prepare qTD */ + /*------------------------------------------------------------------------------------*/ + qtd = alloc_ehci_qTD(utr); + if (qtd == NULL) /* failed to allocate a qTD */ + { + if (is_new_qh) + { + free_ehci_QH(qh); + ep->hw_pipe = NULL; + } + return USBH_ERR_MEMORY_OUT; + } + + if ((ep->bEndpointAddress & EP_ADDR_DIR_MASK) == EP_ADDR_DIR_OUT) + token = QTD_ERR_COUNTER | QTD_PID_OUT | QTD_STS_ACTIVE; + else + token = QTD_ERR_COUNTER | QTD_PID_IN | QTD_STS_ACTIVE; + + qtd->qh = qh; + qtd->Next_qTD = QTD_LIST_END; //(uint32_t)_ghost_qtd; + qtd->Alt_Next_qTD = QTD_LIST_END; //(uint32_t)_ghost_qtd; + write_qtd_bptr(qtd, (uint32_t)utr->buff, utr->data_len); + append_to_qtd_list_of_QH(qh, qtd); + qtd->Token = QTD_IOC | (utr->data_len << 16) | token; + + DISABLE_EHCI_IRQ(); + + USB_debug("ehci_int_xfer - qh: 0x%x, 0x%x, 0x%x, qtd: 0x%x\n", (int)qh, (int)qh->Chrst, (int)qh->Cap, (int)qtd); + + qh->OL_Next_qTD = (uint32_t)qtd; + + if (is_new_qh) + { + memcpy(&(qh->OL_Bptr[0]), &(qtd->Bptr[0]), 20); + qh->Curr_qTD = (uint32_t)qtd; + qh->OL_Token = qtd->Token; + + if (udev->speed == SPEED_HIGH) /* get head node of this interval */ + iqh = get_int_tree_head_node(ep->bInterval); + else + iqh = get_int_tree_head_node(ep->bInterval * 8); + qh->HLink = iqh->HLink; /* Add to list of the same interval */ + iqh->HLink = QH_HLNK_QH(qh); + } + + ENABLE_EHCI_IRQ(); + + _ehci->UCMDR |= HSUSBH_UCMDR_PSEN_Msk; /* periodic list enable */ + return 0; +} + +/* + * Quit current trasnfer via UTR or hardware EP. + */ +static int ehci_quit_xfer(UTR_T *utr, EP_INFO_T *ep) +{ + QH_T *qh; + + // USB_debug("ehci_quit_xfer - utr: 0x%x, ep: 0x%x\n", (int)utr, (int)ep); + + DISABLE_EHCI_IRQ(); + if (ehci_quit_iso_xfer(utr, ep) == 0) + { + ENABLE_EHCI_IRQ(); + return 0; + } + ENABLE_EHCI_IRQ(); + + if (utr != NULL) + { + if (utr->ep == NULL) + return USBH_ERR_NOT_FOUND; + + qh = (QH_T *)(utr->ep->hw_pipe); + + if (!qh) + return USBH_ERR_NOT_FOUND; + + /* add the QH to remove list, it will be removed on the next IAAD interrupt */ + move_qh_to_remove_list(qh); + utr->ep->hw_pipe = NULL; + } + + if ((ep != NULL) && (ep->hw_pipe != NULL)) + { + qh = (QH_T *)(ep->hw_pipe); + /* add the QH to remove list, it will be removed on the next IAAD interrupt */ + move_qh_to_remove_list(qh); + ep->hw_pipe = NULL; + } + usbh_delay_ms(2); + + return 0; +} + +static int visit_qtd(qTD_T *qtd) +{ + if ((qtd->Token == 0x11197B7F) || (qtd->Token == 0x1197B7F)) + return 0; /* A Dummy qTD or qTD on writing, don't touch it. */ + + // USB_debug("Visit qtd 0x%x - 0x%x\n", (int)qtd, qtd->Token); + + if ((qtd->Token & QTD_STS_ACTIVE) == 0) + { + if (qtd->Token & (QTD_STS_HALT | QTD_STS_DATA_BUFF_ERR | QTD_STS_BABBLE | QTD_STS_XactErr | QTD_STS_MISS_MF)) + { + USB_error("qTD 0x%x error token=0x%x! 0x%x\n", (int)qtd, qtd->Token, qtd->Bptr[0]); + if (qtd->utr->status == 0) + qtd->utr->status = USBH_ERR_TRANSACTION; + } + else + { + if ((qtd->Token & QTD_PID_Msk) != QTD_PID_SETUP) + { + qtd->utr->xfer_len += qtd->xfer_len - QTD_TODO_LEN(qtd->Token); + // USB_debug("0x%x utr->xfer_len += %d\n", qtd->Token, qtd->xfer_len - QTD_TODO_LEN(qtd->Token)); + } + } + return 1; + } + return 0; +} + +static void scan_asynchronous_list() +{ + QH_T *qh, *qh_tmp; + qTD_T *q_pre, *qtd, *qtd_tmp; + UTR_T *utr; + + q_pre = NULL; + qh = QH_PTR(_H_qh->HLink); + while (qh != _H_qh) + { + // USB_debug("Scan qh=0x%x, 0x%x\n", (int)qh, qh->OL_Token); + + utr = NULL; + qtd = qh->qtd_list; + while (qtd != NULL) + { + if (visit_qtd(qtd)) /* if TRUE, reclaim this qtd */ + { + /* qTD is completed, will remove it */ + utr = qtd->utr; + if (qtd == qh->qtd_list) + qh->qtd_list = qtd->next; /* unlink the qTD from qtd_list */ + else + q_pre->next = qtd->next; /* unlink the qTD from qtd_list */ + + qtd_tmp = qtd; /* remember this qTD for freeing later */ + qtd = qtd->next; /* advance to the next qTD */ + + qtd_tmp->next = qh->done_list; /* push this qTD to QH's done list */ + qh->done_list = qtd_tmp; + } + else + { + q_pre = qtd; /* remember this qTD as a preceder */ + qtd = qtd->next; /* advance to next qTD */ + } + } + + qh_tmp = qh; + qh = QH_PTR(qh->HLink); /* advance to the next QH */ + + /* If all TDs are done, call-back to requester and then remove this QH. */ + if ((qh_tmp->qtd_list == NULL) && utr) + { + // printf("T %d [%d]\n", (qh_tmp->Chrst>>8)&0xf, (qh_tmp->OL_Token&QTD_DT) ? 1 : 0); + if (qh_tmp->OL_Token & QTD_DT) + utr->ep->bToggle = 1; + else + utr->ep->bToggle = 0; + + utr->bIsTransferDone = 1; + if (utr->func) + utr->func(utr); + + _ehci->UCMDR |= HSUSBH_UCMDR_IAAD_Msk; /* trigger IAA to reclaim done_list */ + } + } +} + +static void scan_periodic_frame_list() +{ + QH_T *qh; + qTD_T *qtd; + UTR_T *utr; + + /*------------------------------------------------------------------------------------*/ + /* Scan interrupt frame list */ + /*------------------------------------------------------------------------------------*/ + qh = _Iqh[NUM_IQH - 1]; + while (qh != NULL) + { + qtd = qh->qtd_list; /* There's only one qTD in list at most. */ + + if (qtd == NULL) + { + /* empty QH */ + qh = QH_PTR(qh->HLink); /* advance to the next QH */ + continue; + } + + if (visit_qtd(qtd)) /* if TRUE, reclaim this qtd */ + { + qtd->next = qh->done_list; /* push qTD into the done list */ + qh->done_list = qtd; + qh->qtd_list = NULL; /* qtd_list becomes empty */ + } + + qtd = qh->done_list; + + /* If all TDs are done, call-back to requester and then remove this QH. */ + if ((qtd != NULL) && (qh->qtd_list == NULL)) + { + utr = qtd->utr; + + if (qh->OL_Token & QTD_DT) + utr->ep->bToggle = 1; + else + utr->ep->bToggle = 0; + + utr->bIsTransferDone = 1; + if (utr->func) + utr->func(utr); + + _ehci->UCMDR |= HSUSBH_UCMDR_IAAD_Msk; /* trigger IAA to reclaim done_list */ + } + + qh = QH_PTR(qh->HLink); /* advance to the next QH */ + } + + /*------------------------------------------------------------------------------------*/ + /* Scan isochronous frame list */ + /*------------------------------------------------------------------------------------*/ + + scan_isochronous_list(); +} + +static void iaad_remove_qh() +{ + QH_T *qh; + qTD_T *qtd; + UTR_T *utr; + + /*------------------------------------------------------------------------------------*/ + /* Remove all QHs in qh_remove_list... */ + /*------------------------------------------------------------------------------------*/ + while (qh_remove_list != NULL) + { + qh = qh_remove_list; + qh_remove_list = qh->next; + + // USB_debug("iaad_remove_qh - remove QH 0x%x\n", (int)qh); + + while (qh->done_list) /* we can free the qTDs now */ + { + qtd = qh->done_list; + qh->done_list = qtd->next; + free_ehci_qTD(qtd); + } + + if (qh->qtd_list != NULL) /* still have incomplete qTDs? */ + { + utr = qh->qtd_list->utr; + while (qh->qtd_list) + { + qtd = qh->qtd_list; + qh->qtd_list = qtd->next; + free_ehci_qTD(qtd); + } + utr->status = USBH_ERR_ABORT; + utr->bIsTransferDone = 1; + if (utr->func) + utr->func(utr); /* call back */ + } + free_ehci_QH(qh); /* free the QH */ + } + + /*------------------------------------------------------------------------------------*/ + /* Free all qTD in done_list of each asynchronous QH */ + /*------------------------------------------------------------------------------------*/ + qh = QH_PTR(_H_qh->HLink); + while (qh != _H_qh) + { + while (qh->done_list) /* we can free the qTDs now */ + { + qtd = qh->done_list; + qh->done_list = qtd->next; + free_ehci_qTD(qtd); + } + qh = QH_PTR(qh->HLink); /* advance to the next QH */ + } + + /*------------------------------------------------------------------------------------*/ + /* Free all qTD in done_list of each QH of periodic frame list */ + /*------------------------------------------------------------------------------------*/ + qh = _Iqh[NUM_IQH - 1]; + while (qh != NULL) + { + while (qh->done_list) /* we can free the qTDs now */ + { + qtd = qh->done_list; + qh->done_list = qtd->next; + free_ehci_qTD(qtd); + } + qh = QH_PTR(qh->HLink); /* advance to the next QH */ + } +} + +//static irqreturn_t ehci_irq (struct usb_hcd *hcd) +void EHCI_IRQHandler(int vector, void *param) +{ + uint32_t intsts; + + intsts = _ehci->USTSR; + _ehci->USTSR = intsts; /* clear interrupt status */ + + //rt_kprintf("[%s]ehci int_sts = 0x%x\n", __func__, intsts); + + if (intsts & HSUSBH_USTSR_UERRINT_Msk) + { + USB_error("Transfer error!\n"); + } + + if (intsts & HSUSBH_USTSR_USBINT_Msk) + { + /* some transfers completed, travel asynchronous */ + /* and periodic lists to find and reclaim them. */ + scan_asynchronous_list(); + + scan_periodic_frame_list(); + } + + if (intsts & HSUSBH_USTSR_IAA_Msk) + { + iaad_remove_qh(); + } +} + +static UDEV_T *ehci_find_device_by_port(int port) +{ + UDEV_T *udev; + + udev = g_udev_list; + while (udev != NULL) + { + if ((udev->parent == NULL) && (udev->port_num == port) && (udev->speed == SPEED_HIGH)) + return udev; + udev = udev->next; + } + return NULL; +} + +static int ehci_rh_port_reset(int port) +{ + int retry; + int reset_time; + uint32_t t0; + + reset_time = usbh_tick_from_millisecond(PORT_RESET_TIME_MS); + + for (retry = 0; retry < PORT_RESET_RETRY; retry++) + { + _ehci->UPSCR[port] = (_ehci->UPSCR[port] | HSUSBH_UPSCR_PRST_Msk) & ~HSUSBH_UPSCR_PE_Msk; + + t0 = usbh_get_ticks(); + while (usbh_get_ticks() - t0 < (reset_time) + 1) ; /* wait at least 50 ms */ + + _ehci->UPSCR[port] &= ~HSUSBH_UPSCR_PRST_Msk; + + t0 = usbh_get_ticks(); + while (usbh_get_ticks() - t0 < (reset_time) + 1) + { + if (!(_ehci->UPSCR[port] & HSUSBH_UPSCR_CCS_Msk) || + ((_ehci->UPSCR[port] & (HSUSBH_UPSCR_CCS_Msk | HSUSBH_UPSCR_PE_Msk)) == (HSUSBH_UPSCR_CCS_Msk | HSUSBH_UPSCR_PE_Msk))) + goto port_reset_done; + } + reset_time += PORT_RESET_RETRY_INC_MS; + } + + USB_debug("EHCI port %d - port reset failed!\n", port + 1); + return USBH_ERR_PORT_RESET; + +port_reset_done: + if ((_ehci->UPSCR[port] & HSUSBH_UPSCR_CCS_Msk) == 0) /* check again if device disconnected */ + { + _ehci->UPSCR[port] |= HSUSBH_UPSCR_CSC_Msk; /* clear CSC */ + return USBH_ERR_DISCONNECTED; + } + _ehci->UPSCR[port] |= HSUSBH_UPSCR_PEC_Msk; /* clear port enable change status */ + return USBH_OK; /* port reset success */ +} + +static int ehci_rh_polling(void) +{ + UDEV_T *udev; + int ret, change = 0; + int port; + int connect_status, t0, debounce_tick; + + for (port = 0; port < EHCI_PORT_CNT; port++) + { + if (!(_ehci->UPSCR[port] & HSUSBH_UPSCR_CSC_Msk)) + continue; + + change = 1; + rt_kprintf("EHCI port%d status change: 0x%x\n", port + 1, _ehci->UPSCR[port]); + + /*--------------------------------------------------------------------------------*/ + /* Disconnect the devices attached to this port. */ + /*--------------------------------------------------------------------------------*/ + while (1) + { + udev = ehci_find_device_by_port(port + 1); + if (udev == NULL) + break; + usbh_disconnect_device(udev); + } + + /*--------------------------------------------------------------------------------*/ + /* Port de-bounce */ + /*--------------------------------------------------------------------------------*/ + t0 = usbh_get_ticks(); + debounce_tick = usbh_tick_from_millisecond(HUB_DEBOUNCE_TIME); + connect_status = _ehci->UPSCR[port] & HSUSBH_UPSCR_CCS_Msk; + while (usbh_get_ticks() - t0 < debounce_tick) + { + if (connect_status != (_ehci->UPSCR[port] & HSUSBH_UPSCR_CCS_Msk)) + { + /* reset stable time counting */ + t0 = usbh_get_ticks(); + connect_status = _ehci->UPSCR[port] & HSUSBH_UPSCR_CCS_Msk; + } + } + + _ehci->UPSCR[port] |= HSUSBH_UPSCR_CSC_Msk; /* clear connect status change bit */ + + if (connect_status == HSUSBH_UPSCR_CCS_Msk) + { + /*----------------------------------------------------------------------------*/ + /* A new device connected. */ + /*----------------------------------------------------------------------------*/ + if (ehci_rh_port_reset(port) != USBH_OK) + { + /* port reset failed, maybe an USB 1.1 device */ + _ehci->UPSCR[port] |= HSUSBH_UPSCR_PO_Msk; /* change port owner to OHCI */ + _ehci->UPSCR[port] |= HSUSBH_UPSCR_CSC_Msk; /* clear all status change bits */ + return 0; + } + + /* + * Port reset success. Start to enumerate this new device. + */ + udev = alloc_device(); + if (udev == NULL) + return 0; /* out-of-memory, do nothing... */ + + udev->parent = NULL; + udev->port_num = port + 1; + udev->speed = SPEED_HIGH; + udev->hc_driver = &ehci_driver; + + ret = usbh_connect_device(udev); + if (ret < 0) + { + USB_error("connect_device error! [%d]\n", ret); + free_device(udev); + } + } + else + { + /* Device disconnected */ + while (1) + { + udev = ehci_find_device_by_port(port + 1); + if (udev == NULL) + break; + usbh_disconnect_device(udev); + } + } + } + return change; +} + + +/// @endcond HIDDEN_SYMBOLS + +/*** (C) COPYRIGHT 2017 Nuvoton Technology Corp. ***/ diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ehci_iso.c_ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ehci_iso.c_ new file mode 100644 index 0000000000..148132adf3 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ehci_iso.c_ @@ -0,0 +1,902 @@ +/**************************************************************************//** + * @file ehci_iso.c + * @version V1.10 + * @brief USB EHCI isochronous transfer driver. + * + * @note + * SPDX-License-Identifier: Apache-2.0 + * Copyright (C) 2017 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +/// @cond HIDDEN_SYMBOLS + +//static uint32_t g_flr_cnt; /* frame list rollover counter */ + +static const uint16_t sitd_OUT_Smask [] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f }; + +static int ehci_iso_split_xfer(UTR_T *utr, ISO_EP_T *iso_ep); + +/* + * Inspect the iTD can be reclaimed or not. If yes, collect the transaction results. + * Return: 1 - reclaimed + * 0 - not completed + */ +static int review_itd(iTD_T *itd) +{ + UTR_T *utr; + uint32_t frnidx = itd->sched_frnidx; + uint32_t now_frame = (_ehci->UFINDR >> 3) & 0x3FF; + int i, fidx; + + // printf("R - %d %d, 0x%x\n", now_frame, frnidx, itd->Transaction[0]); + + if (now_frame == frnidx) + { + for (i = 0; i < 8; i++) + { + if (itd->Transaction[i] & ITD_STATUS_ACTIVE) + return 0; /* have any not completed frames */ + } + } + else if (now_frame > frnidx) + { + if ((now_frame - frnidx) > EHCI_ISO_RCLM_RANGE) + return 0; /* don't touch it */ + } + else + { + if (now_frame + FL_SIZE - frnidx > EHCI_ISO_RCLM_RANGE) + return 0; /* don't touch it */ + } + + /* + * Reclaim this iTD + */ + utr = itd->utr; + fidx = itd->fidx; + for (i = 0; i < 8; i++) + { + if (!(itd->trans_mask & (0x1 << i))) + continue; /* not scheduled micro-frame */ + + if (ITD_STATUS(itd->Transaction[i])) + { + if (itd->Transaction[i] & ITD_STATUS_ACTIVE) + { + utr->iso_status[fidx] = USBH_ERR_NOT_ACCESS0; + utr->status = USBH_ERR_NOT_ACCESS0; + } + else if (itd->Transaction[i] & ITD_STATUS_BABBLE) + { + utr->iso_status[fidx] = USBH_ERR_BABBLE_DETECTED; + utr->status = USBH_ERR_TRANSFER; + } + else if (itd->Transaction[i] & ITD_STATUS_BUFF_ERR) + { + utr->iso_status[fidx] = USBH_ERR_DATA_BUFF; + utr->status = USBH_ERR_TRANSFER; + } + else + { + utr->iso_status[fidx] = USBH_ERR_TRANSACTION; + utr->status = USBH_ERR_TRANSFER; + } + } + else + { + utr->iso_status[fidx] = 0; + utr->iso_xlen[fidx] = ITD_XFER_LEN(itd->Transaction[i]); + } + fidx++; + } + utr->td_cnt--; + + if (utr->td_cnt == 0) /* All iTD of this UTR done */ + { + utr->bIsTransferDone = 1; + if (utr->func) + utr->func(utr); + } + + return 1; /* to be reclaimed */ +} + +/* + * Inspect the siTD can be reclaimed or not. If yes, collect the transaction results. + * Return: 1 - reclaimed + * 0 - not completed + */ +static int review_sitd(siTD_T *sitd) +{ + UTR_T *utr; + uint32_t frnidx = sitd->sched_frnidx; + uint32_t now_frame = (_ehci->UFINDR >> 3) & 0x3FF; + int fidx; + uint32_t TotalBytesToTransfer; + + if (now_frame == frnidx) + { + if (SITD_STATUS(sitd->StsCtrl) == SITD_STATUS_ACTIVE) + return 0; + } + else if (now_frame > frnidx) + { + if ((now_frame - frnidx) > EHCI_ISO_RCLM_RANGE) + return 0; /* don't touch it */ + } + else + { + if (now_frame + FL_SIZE - frnidx > EHCI_ISO_RCLM_RANGE) + return 0; /* don't touch it */ + } + + /* + * Reclaim this siTD + */ + utr = sitd->utr; + fidx = sitd->fidx; + + if (SITD_STATUS(sitd->StsCtrl)) + { + if (sitd->StsCtrl & SITD_STATUS_ACTIVE) + { + utr->iso_status[fidx] = USBH_ERR_NOT_ACCESS0; + } + else if (sitd->StsCtrl & SITD_BABBLE_DETECTED) + { + utr->iso_status[fidx] = USBH_ERR_BABBLE_DETECTED; + utr->status = USBH_ERR_TRANSFER; + } + else if (sitd->StsCtrl & SITD_STATUS_BUFF_ERR) + { + utr->iso_status[fidx] = USBH_ERR_DATA_BUFF; + utr->status = USBH_ERR_TRANSFER; + } + else + { + utr->iso_status[fidx] = USBH_ERR_TRANSACTION; + utr->status = USBH_ERR_TRANSFER; + } + } + else + { + TotalBytesToTransfer = (sitd->StsCtrl & SITD_XFER_CNT_Msk) >> SITD_XFER_CNT_Pos; + utr->iso_xlen[fidx] = utr->iso_xlen[fidx] - TotalBytesToTransfer; + utr->iso_status[fidx] = 0; + } + utr->td_cnt--; + + if (utr->td_cnt == 0) /* All iTD of this UTR done */ + { + utr->bIsTransferDone = 1; + if (utr->func) + utr->func(utr); + } + return 1; /* to be reclaimed */ +} + +/* + * Some iTD/siTD may be scheduled but not serviced due to time missed. + * This function scan several earlier frames and drop unserviced iTD/siTD if found. + */ +static void scan_isochronous_list(void) +{ + ISO_EP_T *iso_ep = iso_ep_list; + iTD_T *itd, *itd_pre, *p; + siTD_T *sitd, *sitd_pre, *sp; + uint32_t frnidx; + + DISABLE_EHCI_IRQ(); + + while (iso_ep != NULL) /* Search all activated iso endpoints */ + { + /*--------------------------------------------------------------------------------*/ + /* Scan all iTDs */ + /*--------------------------------------------------------------------------------*/ + itd = iso_ep->itd_list; /* get the first iTD from iso_ep's iTD list */ + itd_pre = NULL; + while (itd != NULL) /* traverse all iTDs of itd list */ + { + if (review_itd(itd)) /* inspect and reclaim iTD */ + { + /*------------------------------------------------------------------------*/ + /* Remove this iTD from period frame list */ + /*------------------------------------------------------------------------*/ + frnidx = itd->sched_frnidx; + if (_PFList[frnidx] == ITD_HLNK_ITD(itd)) + { + /* is the first entry, just change to next */ + _PFList[frnidx] = itd->Next_Link; + } + else + { + p = ITD_PTR(_PFList[frnidx]); /* find the preceding iTD */ + while ((ITD_PTR(p->Next_Link) != itd) && (p != NULL)) + { + p = ITD_PTR(p->Next_Link); + } + + if (p == NULL) /* link list out of control! */ + { + USB_error("An iTD lost refernece to periodic frame list! 0x%x -> %d\n", (int)itd, frnidx); + } + else /* remove iTD from list */ + { + p->Next_Link = itd->Next_Link; + } + } + + /*------------------------------------------------------------------------*/ + /* Remove this iTD from iso_ep's iTD list */ + /*------------------------------------------------------------------------*/ + if (itd_pre == NULL) + { + iso_ep->itd_list = itd->next; + } + else + { + itd_pre->next = itd->next; + } + p = itd->next; + free_ehci_iTD(itd); + itd = p; + } + else + { + itd_pre = itd; + itd = itd->next; /* traverse to the next iTD of iTD list */ + } + } + + /*--------------------------------------------------------------------------------*/ + /* Scan all siTDs */ + /*--------------------------------------------------------------------------------*/ + sitd = iso_ep->sitd_list; /* get the first siTD from iso_ep's siTD list */ + sitd_pre = NULL; + while (sitd != NULL) /* traverse all siTDs of sitd list */ + { + if (review_sitd(sitd)) /* inspect and reclaim siTD */ + { + /*------------------------------------------------------------------------*/ + /* Remove this siTD from period frame list */ + /*------------------------------------------------------------------------*/ + frnidx = sitd->sched_frnidx; + if (_PFList[frnidx] == SITD_HLNK_SITD(sitd)) + { + /* is the first entry, just change to next */ + _PFList[frnidx] = sitd->Next_Link; + } + else + { + sp = SITD_PTR(_PFList[frnidx]); /* find the preceding siTD */ + while ((SITD_PTR(sp->Next_Link) != sitd) && (sp != NULL)) + { + sp = SITD_PTR(sp->Next_Link); + } + + if (sp == NULL) /* link list out of control! */ + { + USB_error("An siTD lost reference to periodic frame list! 0x%x -> %d\n", (int)sitd, frnidx); + } + else /* remove iTD from list */ + { + sp->Next_Link = sitd->Next_Link; + } + } + + /*------------------------------------------------------------------------*/ + /* Remove this siTD from iso_ep's siTD list */ + /*------------------------------------------------------------------------*/ + if (sitd_pre == NULL) + { + iso_ep->sitd_list = sitd->next; + } + else + { + sitd_pre->next = sitd->next; + } + sp = sitd->next; + free_ehci_siTD(sitd); + sitd = sp; + } + else + { + sitd_pre = sitd; + sitd = sitd->next; /* traverse to the next siTD of siTD list */ + } + } + + iso_ep = iso_ep->next; + } + + ENABLE_EHCI_IRQ(); +} + + +static void write_itd_info(UTR_T *utr, iTD_T *itd) +{ + UDEV_T *udev = utr->udev; + EP_INFO_T *ep = utr->ep; /* reference to isochronous endpoint */ + uint32_t buff_page_addr; + int i; + + buff_page_addr = itd->buff_base & 0xFFFFF000; /* 4K page */ + + for (i = 0; i < 7; i++) + { + itd->Bptr[i] = buff_page_addr + (0x1000 * i); + } + /* EndPtr R Device Address */ + itd->Bptr[0] |= (udev->dev_num) | ((ep->bEndpointAddress & 0xF) << ITD_EP_NUM_Pos); + itd->Bptr[1] |= ep->wMaxPacketSize; /* Maximum Packet Size */ + + if ((ep->bEndpointAddress & EP_ADDR_DIR_MASK) == EP_ADDR_DIR_IN) /* I/O */ + itd->Bptr[1] |= ITD_DIR_IN; + else + itd->Bptr[1] |= ITD_DIR_OUT; + + itd->Bptr[2] |= (ep->wMaxPacketSize + 1023) / 1024; /* Mult */ +} + +static void write_itd_micro_frame(UTR_T *utr, int fidx, iTD_T *itd, int mf) +{ + uint32_t buff_addr; + + buff_addr = (uint32_t)(utr->iso_buff[fidx]); /* xfer buffer start address of this frame */ + + itd->Transaction[mf] = ITD_STATUS_ACTIVE | /* Status */ + ((utr->iso_xlen[fidx] & 0xFFF) << ITD_XLEN_Pos) | /* Transaction Length */ + ((buff_addr & 0xFFFFF000) - (itd->buff_base & 0xFFFFF000)) | /* PG */ + (buff_addr & 0xFFF); /* Transaction offset */ +} + + +static void remove_iso_ep_from_list(ISO_EP_T *iso_ep) +{ + ISO_EP_T *p; + + if (iso_ep_list == iso_ep) + { + iso_ep_list = iso_ep->next; /* it's the first entry, remove it */ + return; + } + + p = iso_ep_list; /* find the previous entry of iso_ep */ + while (p->next != NULL) + { + if (p->next == iso_ep) + { + break; + } + p = p->next; + } + + if (p->next == NULL) + { + return; /* not found */ + } + p->next = iso_ep->next; /* remove iso_ep from list */ +} + + +static __inline void add_itd_to_iso_ep(ISO_EP_T *iso_ep, iTD_T *itd) +{ + iTD_T *p; + + itd->next = NULL; + + if (iso_ep->itd_list == NULL) + { + iso_ep->itd_list = itd; + return; + } + + /* + * Find the tail entry of iso_ep->itd_list + */ + p = iso_ep->itd_list; + while (p->next != NULL) + { + p = p->next; + } + p->next = itd; +} + +static int ehci_iso_xfer(UTR_T *utr) +{ + EP_INFO_T *ep = utr->ep; /* reference to isochronous endpoint */ + ISO_EP_T *iso_ep; /* software iso endpoint descriptor */ + iTD_T *itd, *itd_next, *itd_list = NULL; + int i, itd_cnt; + int trans_mask; /* bit mask of used xfer in an iTD */ + int fidx; /* index to the 8 iso frames of UTR */ + int interval; /* frame interval of iTD */ + + if (ep->hw_pipe != NULL) + { + iso_ep = (ISO_EP_T *)ep->hw_pipe; /* get reference of the isochronous endpoint */ + + if (utr->bIsoNewSched) + iso_ep->next_frame = (((_ehci->UFINDR + (EHCI_ISO_DELAY * 8)) & HSUSBH_UFINDR_FI_Msk) >> 3) & 0x3FF; + } + else + { + /* first time transfer of this iso endpoint */ + iso_ep = usbh_alloc_mem(sizeof(*iso_ep)); + if (iso_ep == NULL) + return USBH_ERR_MEMORY_OUT; + + memset(iso_ep, 0, sizeof(*iso_ep)); + iso_ep->ep = ep; + iso_ep->next_frame = (((_ehci->UFINDR + (EHCI_ISO_DELAY * 8)) & HSUSBH_UFINDR_FI_Msk) >> 3) & 0x3FF; + + ep->hw_pipe = iso_ep; + + /* + * Add this iso_ep into iso_ep_list + */ + DISABLE_EHCI_IRQ(); + iso_ep->next = iso_ep_list; + iso_ep_list = iso_ep; + ENABLE_EHCI_IRQ(); + } + + if (utr->udev->speed == SPEED_FULL) + return ehci_iso_split_xfer(utr, iso_ep); + + /*------------------------------------------------------------------------------------*/ + /* Allocate iTDs */ + /*------------------------------------------------------------------------------------*/ + + if (ep->bInterval < 2) /* transfer interval is 1 micro-frame */ + { + trans_mask = 0xFF; + itd_cnt = 1; /* required 1 iTD for one UTR */ + interval = 1; /* iTD frame interval of this endpoint */ + } + else if (ep->bInterval < 4) /* transfer interval is 2 micro-frames */ + { + trans_mask = 0x55; + itd_cnt = 2; /* required 2 iTDs for one UTR */ + interval = 1; /* iTD frame interval of this endpoint */ + } + else if (ep->bInterval < 8) /* transfer interval is 4 micro-frames */ + { + trans_mask = 0x44; + itd_cnt = 4; /* required 4 iTDs for one UTR */ + interval = 1; /* iTD frame interval of this endpoint */ + } + else if (ep->bInterval < 16) /* transfer interval is 8 micro-frames */ + { + trans_mask = 0x08; /* there's 1 transfer in one iTD */ + itd_cnt = 8; /* required 8 iTDs for one UTR */ + interval = 1; /* iTD frame interval of this endpoint */ + } + else if (ep->bInterval < 32) /* transfer interval is 16 micro-frames */ + { + trans_mask = 0x10; /* there's 1 transfer in one iTD */ + itd_cnt = 8; /* required 8 iTDs for one UTR */ + interval = 2; /* iTD frame interval of this endpoint */ + } + else if (ep->bInterval < 64) /* transfer interval is 32 micro-frames */ + { + trans_mask = 0x02; /* there's 1 transfer in one iTD */ + itd_cnt = 8; /* required 8 iTDs for one UTR */ + interval = 4; /* iTD frame interval of this endpoint */ + } + else /* transfer interval is 64 micro-frames */ + { + trans_mask = 0x04; /* there's 1 transfer in one iTD */ + itd_cnt = 8; /* required 8 iTDs for one UTR */ + interval = 8; /* iTD frame interval of this endpoint */ + } + + for (i = 0; i < itd_cnt; i++) /* allocate all iTDs required by UTR */ + { + itd = alloc_ehci_iTD(); + if (itd == NULL) + goto malloc_failed; + + if (itd_list == NULL) /* link all iTDs */ + { + itd_list = itd; + } + else + { + itd->next = itd_list; + itd_list = itd; + } + } + + utr->td_cnt = itd_cnt; + + /*------------------------------------------------------------------------------------*/ + /* Fill and link all iTDs */ + /*------------------------------------------------------------------------------------*/ + + utr->iso_sf = iso_ep->next_frame; + fidx = 0; /* index to UTR iso frmes (total IF_PER_UTR) */ + + for (itd = itd_list; (itd != NULL);) + { + if (fidx >= IF_PER_UTR) /* unlikely */ + { + USB_error("EHCI driver ITD bug!?\n"); + goto malloc_failed; + } + + itd->utr = utr; + itd->fidx = fidx; /* index to UTR's n'th IF_PER_UTR frame */ + itd->buff_base = (uint32_t)(utr->iso_buff[fidx]); /* iTD buffer base is buffer of the first UTR iso frame serviced by this iTD */ + itd->trans_mask = trans_mask; + + write_itd_info(utr, itd); + + for (i = 0; i < 8; i++) /* settle xfer into micro-frames */ + { + if (!(trans_mask & (0x1 << i))) + { + itd->Transaction[i] = 0; /* not accesed */ + continue; /* not scheduled micro-frame */ + } + + write_itd_micro_frame(utr, fidx, itd, i); + + fidx++; /* preceed to next UTR iso frame */ + + if (fidx == IF_PER_UTR) /* is the last scheduled micro-frame? */ + { + /* raise interrupt on completed */ + itd->Transaction[i] |= ITD_IOC; + break; + } + } + + itd_next = itd->next; /* remember the next itd */ + + // USB_debug("Link iTD 0x%x, %d\n", (int)itd, iso_ep->next_frame); + /* + * Link iTD to period frame list + */ + DISABLE_EHCI_IRQ(); + itd->sched_frnidx = iso_ep->next_frame; /* remember it for reclamation scan */ + add_itd_to_iso_ep(iso_ep, itd); /* add to software itd list */ + itd->Next_Link = _PFList[itd->sched_frnidx]; /* keep the next link */ + _PFList[itd->sched_frnidx] = ITD_HLNK_ITD(itd); + iso_ep->next_frame = (iso_ep->next_frame + interval) % FL_SIZE; + ENABLE_EHCI_IRQ(); + + itd = itd_next; + } + + _ehci->UCMDR |= HSUSBH_UCMDR_PSEN_Msk; /* periodic list enable */ + return 0; + +malloc_failed: + + while (itd_list != NULL) + { + itd = itd_list; + itd_list = itd->next; + free_ehci_iTD(itd); + } + return USBH_ERR_MEMORY_OUT; +} + +static __inline void add_sitd_to_iso_ep(ISO_EP_T *iso_ep, siTD_T *sitd) +{ + siTD_T *p; + + sitd->next = NULL; + + if (iso_ep->sitd_list == NULL) + { + iso_ep->sitd_list = sitd; + return; + } + + /* + * Find the tail entry of iso_ep->itd_list + */ + p = iso_ep->sitd_list; + while (p->next != NULL) + { + p = p->next; + } + p->next = sitd; +} + +static void write_sitd_info(UTR_T *utr, siTD_T *sitd) +{ + UDEV_T *udev = utr->udev; + EP_INFO_T *ep = utr->ep; /* reference to isochronous endpoint */ + uint32_t buff_page_addr; + int xlen = utr->iso_xlen[sitd->fidx]; + int scnt; + + sitd->Chrst = (udev->port_num << SITD_PORT_NUM_Pos) | + (udev->parent->iface->udev->dev_num << SITD_HUB_ADDR_Pos) | + ((ep->bEndpointAddress & 0xF) << SITD_EP_NUM_Pos) | + (udev->dev_num << SITD_DEV_ADDR_Pos); + + buff_page_addr = ((uint32_t)utr->iso_buff[sitd->fidx]) & 0xFFFFF000; + sitd->Bptr[0] = (uint32_t)(utr->iso_buff[sitd->fidx]); + sitd->Bptr[1] = buff_page_addr + 0x1000; + + scnt = (xlen + 187) / 188; + + if ((ep->bEndpointAddress & EP_ADDR_DIR_MASK) == EP_ADDR_DIR_IN) /* I/O */ + { + sitd->Chrst |= SITD_XFER_IN; + sitd->Sched = (1 << (scnt + 2)) - 1; + sitd->Sched = (sitd->Sched << 10) | 0x1; + //sitd->Sched <<= 1; + } + else + { + sitd->Chrst |= SITD_XFER_OUT; + sitd->Sched = sitd_OUT_Smask[scnt - 1]; + if (scnt > 1) + { + sitd->Bptr[1] |= (0x1 << 3); /* Transaction position (TP) 01b: Begin */ + } + sitd->Bptr[1] |= scnt; /* Transaction count (T-Count) */ + } + + if (sitd->fidx == IF_PER_UTR) + { + sitd->Sched |= SITD_IOC; + } + + sitd->StsCtrl = (xlen << SITD_XFER_CNT_Pos) | SITD_STATUS_ACTIVE; + + sitd->BackLink = SITD_LIST_END; +} + + +static void ehci_sitd_adjust_schedule(siTD_T *sitd) +{ + siTD_T *hlink = (siTD_T *)_PFList[sitd->sched_frnidx]; + uint32_t uframe_mask = 0x00; + + while (hlink && !HLINK_IS_TERMINATED(hlink) && HLINK_IS_SITD(hlink)) + { + hlink = SITD_PTR(hlink); + if (hlink != sitd) + { + if ((hlink->Chrst & SITD_XFER_IO_Msk) == SITD_XFER_IN) + { + uframe_mask |= (hlink->Sched & 0xFF); /* mark micro-frames used by IN S-mask */ + uframe_mask |= ((hlink->Sched >> 8) & 0xFF); /* mark micro-frames used by IN C-mask */ + } + else + { + uframe_mask |= (hlink->Sched & 0xFF); /* mark micro-frames used by OUT S-mask */ + } + } + hlink = SITD_PTR(hlink->Next_Link); + } + + uframe_mask = uframe_mask | (uframe_mask << 8); /* mark both S-mask and C-mask */ + + if (uframe_mask) + { + /* + * Shift afterward one micro-frame until no conflicts. + */ + while (1) + { + if (sitd->Sched & uframe_mask) + { + sitd->Sched = (sitd->Sched & 0xFFFF0000) | ((sitd->Sched << 1) & 0xFFFF); + } + else + { + break; /* no conflit, done. */ + } + } + } +} + + +static int ehci_iso_split_xfer(UTR_T *utr, ISO_EP_T *iso_ep) +{ + EP_INFO_T *ep = utr->ep; /* reference to isochronous endpoint */ + siTD_T *sitd, *sitd_next, *sitd_list = NULL; + int i; + int fidx; /* index to the 8 iso frames of UTR */ + + if (utr->udev->parent == NULL) + { + USB_error("siso xfer - parent lost!\n"); + return USBH_ERR_INVALID_PARAM; + } + + /*------------------------------------------------------------------------------------*/ + /* Allocate siTDs */ + /*------------------------------------------------------------------------------------*/ + for (i = 0; i < IF_PER_UTR; i++) /* allocate all siTDs required by UTR */ + { + sitd = alloc_ehci_siTD(); + if (sitd == NULL) + goto malloc_failed; + + if (sitd_list == NULL) /* link all siTDs */ + { + sitd_list = sitd; + } + else + { + sitd->next = sitd_list; + sitd_list = sitd; + } + } + + utr->td_cnt = IF_PER_UTR; + + /*------------------------------------------------------------------------------------*/ + /* Fill and link all siTDs */ + /*------------------------------------------------------------------------------------*/ + + utr->iso_sf = iso_ep->next_frame; + fidx = 0; /* index to UTR iso frmes (total IF_PER_UTR) */ + + for (sitd = sitd_list; (sitd != NULL); fidx++) + { + if (fidx >= IF_PER_UTR) /* unlikely */ + { + USB_error("EHCI driver siTD bug!?\n"); + goto malloc_failed; + } + + sitd->utr = utr; + sitd->fidx = fidx; /* index to UTR's n'th IF_PER_UTR frame */ + + write_sitd_info(utr, sitd); + + sitd_next = sitd->next; /* remember the next itd */ + + // USB_debug("Link iTD 0x%x, %d\n", (int)itd, iso_ep->next_frame); + /* + * Link iTD to period frame list + */ + sitd->sched_frnidx = iso_ep->next_frame; /* remember it for reclamation scan */ + DISABLE_EHCI_IRQ(); + ehci_sitd_adjust_schedule(sitd); + add_sitd_to_iso_ep(iso_ep, sitd); /* add to software itd list */ + sitd->Next_Link = _PFList[sitd->sched_frnidx];/* keep the next link */ + _PFList[sitd->sched_frnidx] = SITD_HLNK_SITD(sitd); + iso_ep->next_frame = (iso_ep->next_frame + ep->bInterval) % FL_SIZE; + ENABLE_EHCI_IRQ(); + + sitd = sitd_next; + } + + _ehci->UCMDR |= HSUSBH_UCMDR_PSEN_Msk; /* periodic list enable */ + return 0; + +malloc_failed: + + while (sitd_list != NULL) + { + sitd = sitd_list; + sitd_list = sitd->next; + free_ehci_siTD(sitd); + } + return USBH_ERR_MEMORY_OUT; +} + +/* + * If it's an isochronous endpoint, quit current transfer via UTR or hardware EP. + */ +static int ehci_quit_iso_xfer(UTR_T *utr, EP_INFO_T *ep) +{ + ISO_EP_T *iso_ep; + iTD_T *itd, *itd_next, *p; + uint32_t frnidx; + uint32_t now_frame; + + if (ep == NULL) + { + if (utr == NULL) + return USBH_ERR_NOT_FOUND; + + if (utr->ep == NULL) + return USBH_ERR_NOT_FOUND; + + ep = utr->ep; + } + + if ((ep->bmAttributes & EP_ATTR_TT_MASK) != EP_ATTR_TT_ISO) + return USBH_ERR_NOT_FOUND; /* not isochronous endpoint */ + + /*------------------------------------------------------------------------------------*/ + /* It's an iso endpoint. Remove it as required. */ + /*------------------------------------------------------------------------------------*/ + iso_ep = iso_ep_list; + while (iso_ep != NULL) /* Search all activated iso endpoints */ + { + if (iso_ep->ep == ep) + break; + iso_ep = iso_ep->next; + } + if (iso_ep == NULL) + return 0; /* should have been removed */ + + itd = iso_ep->itd_list; /* get the first iTD from iso_ep's iTD list */ + + while (itd != NULL) /* traverse all iTDs of itd list */ + { + itd_next = itd->next; /* remember the next iTD */ + utr = itd->utr; + + /*--------------------------------------------------------------------------------*/ + /* Remove this iTD from period frame list */ + /*--------------------------------------------------------------------------------*/ + frnidx = itd->sched_frnidx; + + /* + * Prevent to race with Host Controller. If the iTD to be removed is located in + * current or next frame, wait until HC passed through it. + */ + while (1) + { + now_frame = (_ehci->UFINDR >> 3) & 0x3FF; + if ((now_frame == frnidx) || (((now_frame + 1) % 1024) == frnidx)) + continue; + break; + } + + if (_PFList[frnidx] == ITD_HLNK_ITD(itd)) + { + /* is the first entry, just change to next */ + _PFList[frnidx] = itd->Next_Link; + } + else + { + p = ITD_PTR(_PFList[frnidx]); /* find the preceding iTD */ + while ((ITD_PTR(p->Next_Link) != itd) && (p != NULL)) + { + p = ITD_PTR(p->Next_Link); + } + + if (p == NULL) /* link list out of control! */ + { + USB_error("ehci_quit_iso_xfer - An iTD lost reference to periodic frame list! 0x%x on %d\n", (int)itd, frnidx); + } + else /* remove iTD from list */ + { + p->Next_Link = itd->Next_Link; + } + } + + utr->td_cnt--; + + if (utr->td_cnt == 0) /* All iTD of this UTR done */ + { + utr->bIsTransferDone = 1; + if (utr->func) + utr->func(utr); + utr->status = USBH_ERR_ABORT; + } + free_ehci_iTD(itd); + itd = itd_next; + } + + /* + * Remove iso_ep from iso_ep_list + */ + remove_iso_ep_from_list(iso_ep); + usbh_free_mem(iso_ep, sizeof(*iso_ep)); /* free this iso_ep */ + ep->hw_pipe = NULL; + + if (iso_ep_list == NULL) + _ehci->UCMDR &= ~HSUSBH_UCMDR_PSEN_Msk; + + return 0; +} + + +/// @endcond HIDDEN_SYMBOLS + +/*** (C) COPYRIGHT 2017 Nuvoton Technology Corp. ***/ diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ohci.c_ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ohci.c_ new file mode 100644 index 0000000000..a551648248 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ohci.c_ @@ -0,0 +1,1283 @@ +/**************************************************************************//** + * @file ohci.c + * @version V1.10 + * @brief USB Host library OHCI (USB 1.1) host controller driver. + * + * @copyright (C) 2017 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +/// @cond HIDDEN_SYMBOLS + +//#define TD_debug rt_kprintf +#define TD_debug(...) + +//#define ED_debug rt_kprintf +#define ED_debug(...) + + +#define PORT_CNT (_ohci->HcRhDescriptorA & 0xf) + +static uint8_t _hcca_mem[256] __attribute__((aligned(256))); + +static HCCA_T *_hcca; + +static ED_T *_Ied[6]; + + +static ED_T *ed_remove_list; + +#ifdef ENABLE_DEBUG_MSG +static void dump_ohci_regs(void); +#endif + +static void add_to_ED_remove_list(ED_T *ed) +{ + ED_T *p; + + ED_debug("add_to_ED_remove_list - 0x%x (0x%x)\n", (int)ed, ed->Info); + DISABLE_OHCI_IRQ(); + + /* check if this ED found in ed_remove_list */ + p = ed_remove_list; + while (p) + { + if (p == ed) + { + ENABLE_OHCI_IRQ(); /* This ED found in ed_remove_list */ + return; /* do nothing */ + } + p = p->next; + } + + ed->Info |= ED_SKIP; /* ask OHCI controller skip this ED */ + ed->next = ed_remove_list; + ed_remove_list = ed; /* insert to the head of ed_remove_list */ + ENABLE_OHCI_IRQ(); + _ohci->HcInterruptStatus = USBH_HcInterruptStatus_SF_Msk; + _ohci->HcInterruptEnable |= USBH_HcInterruptEnable_SF_Msk; + usbh_delay_ms(2); /* Full speed wait 2 ms is enough */ +} + +static int ohci_reset(void) +{ + /* Disable HC interrupts */ + _ohci->HcInterruptDisable = USBH_HcInterruptDisable_MIE_Msk; + + /* HC Reset requires max 10 ms delay */ + _ohci->HcControl = 0; + _ohci->HcCommandStatus = USBH_HcCommandStatus_HCR_Msk; + + usbh_delay_ms(10); + + /* Check if OHCI reset completed? */ + if ((_ohci->HcCommandStatus & USBH_HcCommandStatus_HCR_Msk) != 0) + { + USB_error("Error! - USB OHCI reset timed out!\n"); + return -1; + } + + _ohci->HcRhStatus = USBH_HcRhStatus_OCI_Msk | USBH_HcRhStatus_LPS_Msk; + + _ohci->HcControl = HCFS_RESET; + + usbh_delay_ms(10); + + /* Check if OHCI reset completed? */ + if ((_ohci->HcCommandStatus & USBH_HcCommandStatus_HCR_Msk) != 0) + { + USB_error("Error! - USB HC reset timed out!\n"); + return -1; + } + + return 0; +} + +static void init_hcca_int_table() +{ + ED_T *ed_p; + int i, idx, interval; + + memset(_hcca->int_table, 0, sizeof(_hcca->int_table)); + + for (i = 5; i >= 0; i--) /* interval = i^2 */ + { + _Ied[i] = alloc_ohci_ED(); + _Ied[i]->Info = ED_SKIP; + + interval = 0x1 << i; + + for (idx = interval - 1; idx < 32; idx += interval) + { + if (_hcca->int_table[idx] == 0) /* is empty list, insert directly */ + { + _hcca->int_table[idx] = (uint32_t)_Ied[i]; + } + else + { + ed_p = (ED_T *)_hcca->int_table[idx]; + + while (1) + { + if (ed_p == _Ied[i]) + break; /* already chained by previous visit */ + + if (ed_p->NextED == 0) /* reach end of list? */ + { + ed_p->NextED = (uint32_t)_Ied[i]; + break; + } + ed_p = (ED_T *)ed_p->NextED; + } + } + } + } +} + +static ED_T *get_int_tree_head_node(int interval) +{ + int i; + + for (i = 0; i < 5; i++) + { + interval >>= 1; + if (interval == 0) + return _Ied[i]; + } + return _Ied[5]; /* for interval >= 32 */ +} + +static int get_ohci_interval(int interval) +{ + int i, bInterval = 1; + + for (i = 0; i < 5; i++) + { + interval >>= 1; + if (interval == 0) + return bInterval; + bInterval *= 2; + } + return 32; /* for interval >= 32 */ +} + + +static int ohci_init(void) +{ + uint32_t fminterval; + volatile int i; + + _hcca = (HCCA_T *)((uint32_t)_hcca_mem | NON_CACHE_MASK); + + if (ohci_reset() < 0) + return -1; + + ed_remove_list = NULL; + + init_hcca_int_table(); + + /* Tell the controller where the control and bulk lists are + * The lists are empty now. */ + _ohci->HcControlHeadED = 0; /* control ED list head */ + _ohci->HcBulkHeadED = 0; /* bulk ED list head */ + + _ohci->HcHCCA = (uint32_t)_hcca; /* HCCA area */ + + /* periodic start 90% of frame interval */ + fminterval = 0x2edf; /* 11,999 */ + _ohci->HcPeriodicStart = (fminterval * 9) / 10; + + /* set FSLargestDataPacket, 10,104 for 0x2edf frame interval */ + fminterval |= ((((fminterval - 210) * 6) / 7) << 16); + _ohci->HcFmInterval = fminterval; + + _ohci->HcLSThreshold = 0x628; + + /* start controller operations */ + _ohci->HcControl = HCFS_OPER | (0x3 << USBH_HcControl_CBSR_Pos); + + if (_ohci->HcRhDescriptorA & USBH_HcRhDescriptorA_PSM_Msk) + { + /* is per-port powered */ + if (PORT_CNT == 1) + _ohci->HcRhDescriptorB = 0x20000; + else + _ohci->HcRhDescriptorB = 0x7E0000; + for (i = 0; i < PORT_CNT; i++) + _ohci->HcRhPortStatus[i] = USBH_HcRhPortStatus_PPS_Msk; + } + else + { + /* is global port powered */ + _ohci->HcRhDescriptorA = (_ohci->HcRhDescriptorA | (1<<9)) & ~USBH_HcRhDescriptorA_PSM_Msk; + _ohci->HcRhStatus = USBH_HcRhStatus_LPSC_Msk; + } + + _ohci->HcInterruptEnable = USBH_HcInterruptEnable_MIE_Msk | USBH_HcInterruptEnable_WDH_Msk | USBH_HcInterruptEnable_SF_Msk; + + /* POTPGT delay is bits 24-31, in 20 ms units. */ + usbh_delay_ms(20); + return 0; +} + +static void ohci_suspend(void) +{ + int i; + + /* set port suspend if connected */ + for (i = 0; i < PORT_CNT; i++) + { + if (_ohci->HcRhPortStatus[i] & 0x1) + _ohci->HcRhPortStatus[i] = 0x4; + } + + /* enable Device Remote Wakeup */ + _ohci->HcRhStatus |= USBH_HcRhStatus_DRWE_Msk; + + /* enable USBH RHSC interrupt for system wakeup */ + _ohci->HcInterruptEnable |= USBH_HcInterruptEnable_RHSC_Msk | USBH_HcInterruptEnable_RD_Msk; + + /* set Host Controller enter suspend state */ + _ohci->HcControl = (_ohci->HcControl & ~USBH_HcControl_HCFS_Msk) | (3 << USBH_HcControl_HCFS_Pos); +} + +static void ohci_resume(void) +{ + int i; + + _ohci->HcControl = (_ohci->HcControl & ~USBH_HcControl_HCFS_Msk) | (1 << USBH_HcControl_HCFS_Pos); + _ohci->HcControl = (_ohci->HcControl & ~USBH_HcControl_HCFS_Msk) | (2 << USBH_HcControl_HCFS_Pos); + + for (i = 0; i < PORT_CNT; i++) + { + if (_ohci->HcRhPortStatus[i] & 0x4) + _ohci->HcRhPortStatus[i] = 0x8; + } +} + +static void ohci_shutdown(void) +{ + ohci_suspend(); + // NVIC_DisableIRQ(USBH_IRQn); +#ifndef OHCI_PER_PORT_POWER + _ohci->HcRhStatus = USBH_HcRhStatus_LPS_Msk; +#endif +} + + +/* + * Quit current trasnfer via UTR or hardware EP. + */ +static int ohci_quit_xfer(UTR_T *utr, EP_INFO_T *ep) +{ + ED_T *ed; + + if (utr != NULL) + { + if (utr->ep == NULL) + return USBH_ERR_NOT_FOUND; + + ed = (ED_T *)(utr->ep->hw_pipe); + + if (!ed) + return USBH_ERR_NOT_FOUND; + + /* add the endpoint to remove list, it will be removed on the next start of frame */ + add_to_ED_remove_list(ed); + utr->ep->hw_pipe = NULL; + } + + if ((ep != NULL) && (ep->hw_pipe != NULL)) + { + ed = (ED_T *)(ep->hw_pipe); + /* add the endpoint to remove list, it will be removed on the next start of frame */ + add_to_ED_remove_list(ed); + ep->hw_pipe = NULL; + } + + return 0; +} + +static uint32_t ed_make_info(UDEV_T *udev, EP_INFO_T *ep) +{ + uint32_t info; + + if (ep == NULL) /* is a control endpoint */ + { + /* control endpoint direction is from TD */ + if (udev->descriptor.bMaxPacketSize0 == 0) /* is 0 if device descriptor still not obtained. */ + { + if (udev->speed == SPEED_LOW) /* give a default maximum packet size */ + udev->descriptor.bMaxPacketSize0 = 8; + else + udev->descriptor.bMaxPacketSize0 = 64; + } + info = (udev->descriptor.bMaxPacketSize0 << 16) /* Control endpoint Maximum Packet Size from device descriptor */ + | ED_DIR_BY_TD /* Direction (Get direction From TD) */ + | ED_FORMAT_GENERAL /* General format */ + | (0 << ED_CTRL_EN_Pos); /* Endpoint address 0 */ + } + else /* Other endpoint direction is from endpoint descriptor */ + { + info = (ep->wMaxPacketSize << 16); /* Maximum Packet Size from endpoint */ + + info |= ((ep->bEndpointAddress & 0xf) << ED_CTRL_EN_Pos); /* Endpoint Number */ + + if ((ep->bEndpointAddress & EP_ADDR_DIR_MASK) == EP_ADDR_DIR_IN) + info |= ED_DIR_IN; + else + info |= ED_DIR_OUT; + + if ((ep->bmAttributes & EP_ATTR_TT_MASK) == EP_ATTR_TT_ISO) + info |= ED_FORMAT_ISO; + else + info |= ED_FORMAT_GENERAL; + } + + info |= ((udev->speed == SPEED_LOW) ? ED_SPEED_LOW : ED_SPEED_FULL); /* Speed */ + info |= (udev->dev_num); /* Function Address */ + + return info; +} + +static void write_td(TD_T *td, uint32_t info, uint8_t *buff, uint32_t data_len) +{ + uint32_t baddr = ptr_to_u32(buff); + + td->Info = info; + td->CBP = (((baddr == 0) || !data_len) ? 0 : baddr); + td->BE = (((baddr == 0) || !data_len) ? 0 : baddr + data_len - 1); + td->buff_start = td->CBP; + // TD_debug("TD [0x%x]: 0x%x, 0x%x, 0x%x\n", (int)td, td->Info, td->CBP, td->BE); +} + +static int ohci_ctrl_xfer(UTR_T *utr) +{ + UDEV_T *udev; + ED_T *ed; + TD_T *td_setup, *td_data, *td_status; + uint32_t info; + + udev = utr->udev; + + /*------------------------------------------------------------------------------------*/ + /* Allocate ED and TDs */ + /*------------------------------------------------------------------------------------*/ + td_setup = alloc_ohci_TD(utr); + + if (utr->data_len > 0) + td_data = alloc_ohci_TD(utr); + else + td_data = NULL; + + td_status = alloc_ohci_TD(utr); + + if (td_status == NULL) + { + free_ohci_TD(td_setup); + if (utr->data_len > 0) + free_ohci_TD(td_data); + return USBH_ERR_MEMORY_OUT; + } + + /* Check if there's any transfer pending on this endpoint... */ + if (udev->ep0.hw_pipe == NULL) + { + ed = alloc_ohci_ED(); + if (ed == NULL) + { + free_ohci_TD(td_setup); + free_ohci_TD(td_status); + if (utr->data_len > 0) + free_ohci_TD(td_data); + return USBH_ERR_MEMORY_OUT; + } + } + else + ed = (ED_T *)udev->ep0.hw_pipe; + + /*------------------------------------------------------------------------------------*/ + /* prepare SETUP stage TD */ + /*------------------------------------------------------------------------------------*/ + info = TD_CC | TD_T_DATA0 | TD_TYPE_CTRL; + write_td(td_setup, info, (uint8_t *)&utr->setup, 8); + td_setup->ed = ed; + + /*------------------------------------------------------------------------------------*/ + /* prepare DATA stage TD */ + /*------------------------------------------------------------------------------------*/ + if (utr->data_len > 0) + { + if ((utr->setup.bmRequestType & 0x80) == REQ_TYPE_OUT) + info = (TD_CC | TD_R | TD_DP_OUT | TD_T_DATA1 | TD_TYPE_CTRL | TD_CTRL_DATA); + else + info = (TD_CC | TD_R | TD_DP_IN | TD_T_DATA1 | TD_TYPE_CTRL | TD_CTRL_DATA); + + write_td(td_data, info, utr->buff, utr->data_len); + td_data->ed = ed; + td_setup->NextTD = ptr_to_u32(td_data); + td_setup->next = td_data; + td_data->NextTD = ptr_to_u32(td_status); + td_data->next = td_status; + } + else + { + td_setup->NextTD = ptr_to_u32(td_status); + td_setup->next = td_status; + } + + /*------------------------------------------------------------------------------------*/ + /* prepare STATUS stage TD */ + /*------------------------------------------------------------------------------------*/ + ed->Info = ed_make_info(udev, NULL); + if ((utr->setup.bmRequestType & 0x80) == REQ_TYPE_OUT) + info = (TD_CC | TD_DP_IN | TD_T_DATA1 | TD_TYPE_CTRL); + else + info = (TD_CC | TD_DP_OUT | TD_T_DATA1 | TD_TYPE_CTRL); + + write_td(td_status, info, NULL, 0); + td_status->ed = ed; + td_status->NextTD = 0; + td_status->next = 0; + + /*------------------------------------------------------------------------------------*/ + /* prepare ED */ + /*------------------------------------------------------------------------------------*/ + ed->TailP = 0; + ed->HeadP = ptr_to_u32(td_setup); + ed->Info = ed_make_info(udev, NULL); + ed->NextED = 0; + + //TD_debug("TD SETUP [0x%x]: 0x%x, 0x%x, 0x%x, 0x%x\n", (int)td_setup, td_setup->Info, td_setup->CBP, td_setup->BE, td_setup->NextTD); + //if (td_data) + // TD_debug("TD DATA [0x%x]: 0x%x, 0x%x, 0x%x, 0x%x\n", (int)td_data, td_data->Info, td_data->CBP, td_data->BE, td_data->NextTD); + //TD_debug("TD STATUS [0x%x]: 0x%x, 0x%x, 0x%x, 0x%x\n", (int)td_status, td_status->Info, td_status->CBP, td_status->BE, td_status->NextTD); + ED_debug("Xfer ED 0x%x: 0x%x 0x%x 0x%x 0x%x\n", ptr_to_u32(ed), ed->Info, ed->TailP, ed->HeadP, ed->NextED); + + if (utr->data_len > 0) + utr->td_cnt = 3; + else + utr->td_cnt = 2; + + utr->ep = &udev->ep0; /* driver can find EP from UTR */ + udev->ep0.hw_pipe = (void *)ed; /* driver can find ED from EP */ + + /*------------------------------------------------------------------------------------*/ + /* Start transfer */ + /*------------------------------------------------------------------------------------*/ + DISABLE_OHCI_IRQ(); + _ohci->HcControlHeadED = ptr_to_u32(ed); /* Link ED to OHCI */ + _ohci->HcControl |= USBH_HcControl_CLE_Msk; /* enable control list */ + ENABLE_OHCI_IRQ(); + _ohci->HcCommandStatus = USBH_HcCommandStatus_CLF_Msk; /* start Control list */ + + return 0; +} + +static int ohci_bulk_xfer(UTR_T *utr) +{ + UDEV_T *udev = utr->udev; + EP_INFO_T *ep = utr->ep; + ED_T *ed; + TD_T *td, *td_p, *td_list = NULL; + uint32_t info; + uint32_t data_len, xfer_len; + int8_t bIsNewED = 0; + uint8_t *buff; + + /*------------------------------------------------------------------------------------*/ + /* Check if there's uncompleted transfer on this endpoint... */ + /* Prepare ED */ + /*------------------------------------------------------------------------------------*/ + info = ed_make_info(udev, ep); + + /* Check if there's any transfer pending on this endpoint... */ + ed = (ED_T *)_ohci->HcBulkHeadED; /* get the head of bulk endpoint list */ + while (ed != NULL) + { + if (ed->Info == info) /* have transfer of this EP not completed? */ + { + if ((ed->HeadP & 0xFFFFFFF0) != (ed->TailP & 0xFFFFFFF0)) + return USBH_ERR_OHCI_EP_BUSY; /* endpoint is busy */ + else + break; /* ED already there... */ + } + ed = (ED_T *)ed->NextED; + } + + if (ed == NULL) + { + bIsNewED = 1; + ed = alloc_ohci_ED(); /* allocate an Endpoint Descriptor */ + if (ed == NULL) + return USBH_ERR_MEMORY_OUT; + ed->Info = info; + ed->HeadP = 0; + ED_debug("Link BULK ED 0x%x: 0x%x 0x%x 0x%x 0x%x\n", (int)ed, ed->Info, ed->TailP, ed->HeadP, ed->NextED); + } + + ep->hw_pipe = (void *)ed; + + /*------------------------------------------------------------------------------------*/ + /* Prepare TDs */ + /*------------------------------------------------------------------------------------*/ + utr->td_cnt = 0; + data_len = utr->data_len; + buff = utr->buff; + + do + { + if ((ep->bEndpointAddress & EP_ADDR_DIR_MASK) == EP_ADDR_DIR_OUT) + info = (TD_CC | TD_R | TD_DP_OUT | TD_TYPE_BULK); + else + info = (TD_CC | TD_R | TD_DP_IN | TD_TYPE_BULK); + + info &= ~(1 << 25); /* Data toggle from ED toggleCarry bit */ + + if (data_len > 4096) /* maximum transfer length is 4K for each TD */ + xfer_len = 4096; + else + xfer_len = data_len; /* remaining data length < 4K */ + + td = alloc_ohci_TD(utr); /* allocate a TD */ + if (td == NULL) + goto mem_out; + /* fill this TD */ + write_td(td, info, buff, xfer_len); + td->ed = ed; + + utr->td_cnt++; /* increase TD count, for recalim counter */ + + buff += xfer_len; /* advanced buffer pointer */ + data_len -= xfer_len; + + /* chain to end of TD list */ + if (td_list == NULL) + { + td_list = td; + } + else + { + td_p = td_list; + while (td_p->NextTD != 0) + td_p = (TD_T *)td_p->NextTD; + td_p->NextTD = (uint32_t)td; + } + + } + while (data_len > 0); + + /*------------------------------------------------------------------------------------*/ + /* Start transfer */ + /*------------------------------------------------------------------------------------*/ + utr->status = 0; + DISABLE_OHCI_IRQ(); + ed->HeadP = (ed->HeadP & 0x2) | ptr_to_u32(td_list); /* keep toggleCarry bit */ + if (bIsNewED) + { + ed->HeadP = ptr_to_u32(td_list); + /* Link ED to OHCI Bulk List */ + ed->NextED = _ohci->HcBulkHeadED; + _ohci->HcBulkHeadED = ptr_to_u32(ed); + } + ENABLE_OHCI_IRQ(); + _ohci->HcControl |= USBH_HcControl_BLE_Msk; /* enable bulk list */ + _ohci->HcCommandStatus = USBH_HcCommandStatus_BLF_Msk; /* start bulk list */ + + return 0; + +mem_out: + while (td_list != NULL) + { + td = td_list; + td_list = (TD_T *)td_list->NextTD; + free_ohci_TD(td); + } + free_ohci_ED(ed); + return USBH_ERR_MEMORY_OUT; +} + +static int ohci_int_xfer(UTR_T *utr) +{ + UDEV_T *udev = utr->udev; + EP_INFO_T *ep = utr->ep; + ED_T *ed, *ied; + TD_T *td, *td_new; + uint32_t info; + int8_t bIsNewED = 0; + + if (utr->data_len > 64) /* USB 1.1 interrupt transfer maximum packet size is 64 */ + return USBH_ERR_INVALID_PARAM; + + td_new = alloc_ohci_TD(utr); /* allocate a TD for dummy TD */ + if (td_new == NULL) + return USBH_ERR_MEMORY_OUT; + + ied = get_int_tree_head_node(ep->bInterval); /* get head node of this interval */ + + /*------------------------------------------------------------------------------------*/ + /* Find if this ED was already in the list */ + /*------------------------------------------------------------------------------------*/ + info = ed_make_info(udev, ep); + ed = ied; + while (ed != NULL) + { + if (ed->Info == info) + break; /* Endpoint found */ + ed = (ED_T *)ed->NextED; + } + + if (ed == NULL) /* ED not found, create it */ + { + bIsNewED = 1; + ed = alloc_ohci_ED(); /* allocate an Endpoint Descriptor */ + if (ed == NULL) + return USBH_ERR_MEMORY_OUT; + ed->Info = info; + ed->HeadP = 0; + ed->bInterval = ep->bInterval; + + td = alloc_ohci_TD(NULL); /* allocate the initial dummy TD for ED */ + if (td == NULL) + { + free_ohci_ED(ed); + free_ohci_TD(td_new); + return USBH_ERR_MEMORY_OUT; + } + ed->HeadP = ptr_to_u32(td); /* Let both HeadP and TailP point to dummy TD */ + ed->TailP = ed->HeadP; + } + else + { + td = (TD_T *)(ed->TailP & ~0xf); /* TailP always point to the dummy TD */ + } + ep->hw_pipe = (void *)ed; + + /*------------------------------------------------------------------------------------*/ + /* Prepare TD */ + /*------------------------------------------------------------------------------------*/ + if ((ep->bEndpointAddress & EP_ADDR_DIR_MASK) == EP_ADDR_DIR_OUT) + info = (TD_CC | TD_R | TD_DP_OUT | TD_TYPE_INT); + else + info = (TD_CC | TD_R | TD_DP_IN | TD_TYPE_INT); + + /* Keep data toggle */ + info = (info & ~(1 << 25)) | (td->Info & (1 << 25)); + + /* fill this TD */ + write_td(td, info, utr->buff, utr->data_len); + td->ed = ed; + td->NextTD = ptr_to_u32(td_new); + td->utr = utr; + utr->td_cnt = 1; /* increase TD count, for recalim counter */ + utr->status = 0; + + /*------------------------------------------------------------------------------------*/ + /* Hook ED and TD list to HCCA interrupt table */ + /*------------------------------------------------------------------------------------*/ + DISABLE_OHCI_IRQ(); + + ed->TailP = ptr_to_u32(td_new); + if (bIsNewED) + { + /* Add to list of the same interval */ + ed->NextED = ied->NextED; + ied->NextED = ptr_to_u32(ed); + } + + ENABLE_OHCI_IRQ(); + + //printf("Link INT ED 0x%x: 0x%x 0x%x 0x%x 0x%x\n", (int)ed, ed->Info, ed->TailP, ed->HeadP, ed->NextED); + + _ohci->HcControl |= USBH_HcControl_PLE_Msk; /* periodic list enable */ + return 0; +} + +static int ohci_iso_xfer(UTR_T *utr) +{ + UDEV_T *udev = utr->udev; + EP_INFO_T *ep = utr->ep; + ED_T *ed, *ied; + TD_T *td, *td_list, *last_td; + int i; + uint32_t info; + uint32_t buff_addr; + int8_t bIsNewED = 0; + + ied = get_int_tree_head_node(ep->bInterval); /* get head node of this interval */ + + /*------------------------------------------------------------------------------------*/ + /* Find if this ED was already in the list */ + /*------------------------------------------------------------------------------------*/ + info = ed_make_info(udev, ep); + ed = ied; + while (ed != NULL) + { + if (ed->Info == info) + break; /* Endpoint found */ + ed = (ED_T *)ed->NextED; + } + + if (ed == NULL) /* ED not found, create it */ + { + bIsNewED = 1; + ed = alloc_ohci_ED(); /* allocate an Endpoint Descriptor */ + if (ed == NULL) + return USBH_ERR_MEMORY_OUT; + ed->Info = info; + ed->HeadP = 0; + ed->bInterval = ep->bInterval; + } + else + + ep->hw_pipe = (void *)ed; + + /*------------------------------------------------------------------------------------*/ + /* Prepare TDs */ + /*------------------------------------------------------------------------------------*/ + if (utr->bIsoNewSched) /* Is the starting of isochronous streaming? */ + ed->next_sf = _hcca->frame_no + OHCI_ISO_DELAY; + + utr->td_cnt = 0; + utr->iso_sf = ed->next_sf; + + last_td = NULL; + td_list = NULL; + + for (i = 0; i < IF_PER_UTR; i++) + { + utr->iso_status[i] = USBH_ERR_NOT_ACCESS1; + + td = alloc_ohci_TD(utr); /* allocate a TD */ + if (td == NULL) + goto mem_out; + /* fill this TD */ + buff_addr = ptr_to_u32(utr->iso_buff[i]); + td->Info = (TD_CC | TD_TYPE_ISO) | ed->next_sf; + ed->next_sf += get_ohci_interval(ed->bInterval); + td->CBP = buff_addr & ~0xFFF; + td->BE = buff_addr + utr->iso_xlen[i] - 1; + td->PSW[0] = 0xE000 | (buff_addr & 0xFFF); + + td->ed = ed; + utr->td_cnt++; /* increase TD count, for recalim counter */ + + /* chain to end of TD list */ + if (td_list == NULL) + td_list = td; + else + last_td->NextTD = ptr_to_u32(td); + + last_td = td; + }; + + /*------------------------------------------------------------------------------------*/ + /* Hook ED and TD list to HCCA interrupt table */ + /*------------------------------------------------------------------------------------*/ + utr->status = 0; + DISABLE_OHCI_IRQ(); + + if ((ed->HeadP & ~0x3) == 0) + ed->HeadP = (ed->HeadP & 0x2) | ptr_to_u32(td_list); /* keep toggleCarry bit */ + else + { + /* find the tail of TDs under this ED */ + td = (TD_T *)(ed->HeadP & ~0x3); + while (td->NextTD != 0) + { + td = (TD_T *)td->NextTD; + } + td->NextTD = (uint32_t)td_list; + } + + if (bIsNewED) + { + /* Add to list of the same interval */ + ed->NextED = ied->NextED; + ied->NextED = ptr_to_u32(ed); + } + + ENABLE_OHCI_IRQ(); + ED_debug("Link ISO ED 0x%x: 0x%x 0x%x 0x%x 0x%x\n", (int)ed, ed->Info, ed->TailP, ed->HeadP, ed->NextED); + _ohci->HcControl |= USBH_HcControl_PLE_Msk | USBH_HcControl_IE_Msk; /* enable periodic list and isochronous transfer */ + + return 0; + +mem_out: + while (td_list != NULL) + { + td = td_list; + td_list = (TD_T *)td_list->NextTD; + free_ohci_TD(td); + } + free_ohci_ED(ed); + return USBH_ERR_MEMORY_OUT; +} + +static UDEV_T * ohci_find_device_by_port(int port) +{ + UDEV_T *udev; + + udev = g_udev_list; + while (udev != NULL) + { + if ((udev->parent == NULL) && (udev->port_num == port) && + ((udev->speed == SPEED_LOW) || (udev->speed == SPEED_FULL))) + return udev; + udev = udev->next; + } + return NULL; +} + +static int ohci_rh_port_reset(int port) +{ + int retry; + int reset_time; + uint32_t t0; + + reset_time = usbh_tick_from_millisecond(PORT_RESET_TIME_MS); + + for (retry = 0; retry < PORT_RESET_RETRY; retry++) + { + _ohci->HcRhPortStatus[port] = USBH_HcRhPortStatus_PRS_Msk; + + t0 = usbh_get_ticks(); + while (usbh_get_ticks() - t0 < (reset_time) + 1) + { + /* + * If device is disconnected or port enabled, we can stop port reset. + */ + if (((_ohci->HcRhPortStatus[port] & USBH_HcRhPortStatus_CCS_Msk) == 0) || + ((_ohci->HcRhPortStatus[port] & (USBH_HcRhPortStatus_PES_Msk | USBH_HcRhPortStatus_CCS_Msk)) == (USBH_HcRhPortStatus_PES_Msk | USBH_HcRhPortStatus_CCS_Msk))) + goto port_reset_done; + } + reset_time += PORT_RESET_RETRY_INC_MS; + } + + USB_debug("OHCI port %d - port reset failed!\n", port + 1); + return USBH_ERR_PORT_RESET; + +port_reset_done: + if ((_ohci->HcRhPortStatus[port] & USBH_HcRhPortStatus_CCS_Msk) == 0) /* check again if device disconnected */ + { + _ohci->HcRhPortStatus[port] = USBH_HcRhPortStatus_CSC_Msk; /* clear CSC */ + return USBH_ERR_DISCONNECTED; + } + return USBH_OK; /* port reset success */ +} + +static int ohci_rh_polling(void) +{ + int i, change = 0; + UDEV_T *udev; + int ret; + + for (i = 0; i < OHCI_PORT_CNT; i++) + { + /* clear unwanted port change status */ + _ohci->HcRhPortStatus[i] = USBH_HcRhPortStatus_OCIC_Msk | USBH_HcRhPortStatus_PRSC_Msk | + USBH_HcRhPortStatus_PSSC_Msk | USBH_HcRhPortStatus_PESC_Msk; + + if ((_ohci->HcRhPortStatus[i] & USBH_HcRhPortStatus_CSC_Msk) == 0) + continue; + rt_kprintf("OHCI port%d status change: 0x%x\n", i + 1, _ohci->HcRhPortStatus[i]); + + /*--------------------------------------------------------------------------------*/ + /* connect status change */ + /*--------------------------------------------------------------------------------*/ + + _ohci->HcRhPortStatus[i] = USBH_HcRhPortStatus_CSC_Msk; /* clear CSC */ + + if (_ohci->HcRhPortStatus[i] & USBH_HcRhPortStatus_CCS_Msk) + { + /*----------------------------------------------------------------------------*/ + /* First of all, check if there's any previously connected device. */ + /*----------------------------------------------------------------------------*/ + while (1) + { + udev = ohci_find_device_by_port(i + 1); + if (udev == NULL) + break; + usbh_disconnect_device(udev); + } + + rt_kprintf("OHCI connect device.\n"); + + if (ohci_rh_port_reset(i) != USBH_OK) + continue; + + /* + * Port reset success... + */ + udev = alloc_device(); + if (udev == NULL) + continue; + + udev->parent = NULL; + udev->port_num = i + 1; + if (_ohci->HcRhPortStatus[i] & USBH_HcRhPortStatus_LSDA_Msk) + udev->speed = SPEED_LOW; + else + udev->speed = SPEED_FULL; + udev->hc_driver = &ohci_driver; + + ret = usbh_connect_device(udev); + if (ret < 0) + { + USB_error("connect_device error! [%d]\n", ret); + free_device(udev); + } + + change = 1; + } + else + { + /* + * Device disconnected + */ + rt_kprintf("OHCI disconnect device.\n"); + while (1) + { + udev = ohci_find_device_by_port(i + 1); + if (udev == NULL) + break; + usbh_disconnect_device(udev); + } + change = 1; + } + } + return change; +} + +static void td_done(TD_T *td) +{ + UTR_T *utr = td->utr; + uint32_t info; + int cc; + + info = td->Info; + + TD_debug("td_done: 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", (int)td, td->Info, td->CBP, td->NextTD, td->BE); + + /* ISO ... drivers see per-TD length/status */ + if ((info & TD_TYPE_Msk) == TD_TYPE_ISO) + { + uint16_t sf; + int idx; + + sf = info & 0xFFFF; + idx = ((sf + 0x10000 - utr->iso_sf) & 0xFFFF) / get_ohci_interval(td->ed->bInterval); + if (idx >= IF_PER_UTR) + { + USB_error("ISO invalid index!! %d, %d\n", sf, utr->iso_sf); + goto td_out; + } + + cc = (td->PSW[0] >> 12) & 0xF; + if (cc == 0xF) /* this frame was not transferred */ + { + USB_debug("ISO F %d N/A!\n", sf); + utr->iso_status[idx] = USBH_ERR_SCH_OVERRUN; + goto td_out; + } + if ((cc != 0) && (cc != CC_DATA_UNDERRUN)) + { + utr->iso_status[idx] = USBH_ERR_CC_NO_ERR - cc; + goto td_out; + } + utr->iso_status[idx] = 0; + utr->iso_xlen[idx] = td->PSW[0] & 0x7FF; + } + else + { + cc = TD_CC_GET(info); + + /* short packet is fine */ + if ((cc != CC_NOERROR) && (cc != CC_DATA_UNDERRUN)) + { + USB_error("TD error, CC = 0x%x\n", cc); + if (cc == CC_STALL) + utr->status = USBH_ERR_STALL; + else + utr->status = USBH_ERR_TRANSFER; + } + + switch (info & TD_TYPE_Msk) + { + case TD_TYPE_CTRL: + if (info & TD_CTRL_DATA) + { + if (td->CBP == 0) + utr->xfer_len += td->BE - td->buff_start + 1; + else + utr->xfer_len += td->CBP - td->buff_start; + } + break; + + case TD_TYPE_BULK: + case TD_TYPE_INT: + if (td->CBP == 0) + utr->xfer_len += td->BE - td->buff_start + 1; + else + utr->xfer_len += td->CBP - td->buff_start; + break; + } + } + +td_out: + + utr->td_cnt--; + + /* If all TDs are done, call-back to requester. */ + if (utr->td_cnt == 0) + { + utr->bIsTransferDone = 1; + if (utr->func) + utr->func(utr); + } +} + +/* in IRQ context */ +static void remove_ed() +{ + ED_T *ed, *ed_p, *ied; + TD_T *td, *td_next; + UTR_T *utr; + int found; + + while (ed_remove_list != NULL) + { + ED_debug("Remove ED: 0x%x, %d\n", (int)ed_remove_list, ed_remove_list->bInterval); + ed_p = ed_remove_list; + found = 0; + + /*--------------------------------------------------------------------------------*/ + /* Remove endpoint from Control List if found */ + /*--------------------------------------------------------------------------------*/ + if ((ed_p->Info & ED_EP_ADDR_Msk) == 0) + { + if (_ohci->HcControlHeadED == ptr_to_u32(ed_p)) + { + _ohci->HcControlHeadED = ed_p->NextED; + found = 1; + } + else + { + ed = (ED_T *)_ohci->HcControlHeadED; + while (ed != NULL) + { + if (ed->NextED == ptr_to_u32(ed_p)) + { + ed->NextED = ed_p->NextED; + found = 1; + } + ed = (ED_T *)ed->NextED; + } + } + } + + /*--------------------------------------------------------------------------------*/ + /* Remove INT or ISO endpoint from HCCA interrupt table */ + /*--------------------------------------------------------------------------------*/ + else if (ed_p->bInterval > 0) + { + ied = get_int_tree_head_node(ed_p->bInterval); + + ed = ied; + while (ed != NULL) + { + if (ed->NextED == ptr_to_u32(ed_p)) + { + ed->NextED = ed_p->NextED; + found = 1; + break; + } + ed = (ED_T *)ed->NextED; + } + } + + /*--------------------------------------------------------------------------------*/ + /* Remove endpoint from Bulk List if found */ + /*--------------------------------------------------------------------------------*/ + else + { + if (_ohci->HcBulkHeadED == ptr_to_u32(ed_p)) + { + ed = (ED_T *)ed_p; + _ohci->HcBulkHeadED = ed_p->NextED; + found = 1; + } + else + { + ed = (ED_T *)_ohci->HcBulkHeadED; + while (ed != NULL) + { + if (ed->NextED == ptr_to_u32(ed_p)) + { + ed->NextED = ed_p->NextED; + found = 1; + } + ed = (ED_T *)ed->NextED; + } + } + } + + /*--------------------------------------------------------------------------------*/ + /* Remove and free all TDs under this endpoint */ + /*--------------------------------------------------------------------------------*/ + if (found) + { + td = (TD_T *)(ed_p->HeadP & ~0x3); + if (td != NULL) + { + while (td != NULL) + { + utr = td->utr; + td_next = (TD_T *)td->NextTD; + free_ohci_TD(td); + td = td_next; + + utr->td_cnt--; + if (utr->td_cnt == 0) + { + utr->status = USBH_ERR_ABORT; + utr->bIsTransferDone = 1; + if (utr->func) + utr->func(utr); + } + } + } + } + + /* + * Done. Remove this ED from [ed_remove_list] and free it. + */ + ed_remove_list = ed_p->next; + free_ohci_ED(ed_p); + } +} + + +//static irqreturn_t ohci_irq (struct usb_hcd *hcd) +void OHCI_IRQHandler(int vector, void *param) +{ + TD_T *td, *td_prev, *td_next; + uint32_t int_sts; + + int_sts = _ohci->HcInterruptStatus; + + //rt_kprintf("[%s]ohci int_sts = 0x%x\n", __func__, int_sts); + + if ((_ohci->HcInterruptEnable & USBH_HcInterruptEnable_SF_Msk) && + (int_sts & USBH_HcInterruptStatus_SF_Msk)) + { + int_sts &= ~USBH_HcInterruptStatus_SF_Msk; + + _ohci->HcInterruptDisable = USBH_HcInterruptDisable_SF_Msk; + remove_ed(); + _ohci->HcInterruptStatus = USBH_HcInterruptStatus_SF_Msk; + } + + if (int_sts & USBH_HcInterruptStatus_WDH_Msk) + { + int_sts &= ~USBH_HcInterruptStatus_WDH_Msk; + /* + * reverse done list + */ + td = (TD_T *)(_hcca->done_head & TD_ADDR_MASK); + _hcca->done_head = 0; + td_prev = NULL; + _ohci->HcInterruptStatus = USBH_HcInterruptStatus_WDH_Msk; + + while (td != NULL) + { + //TD_debug("Done list TD 0x%x => 0x%x\n", (int)td, (int)td->NextTD); + td_next = (TD_T *)(td->NextTD & TD_ADDR_MASK); + td->NextTD = ptr_to_u32(td_prev); + td_prev = td; + td = td_next; + } + td = td_prev; /* first TD of the reversed done list */ + + /* + * reclaim TDs + */ + while (td != NULL) + { + TD_debug("Reclaim TD 0x%x, next 0x%x\n", (int)td, td->NextTD); + td_next = (TD_T *)td->NextTD; + td_done(td); + free_ohci_TD(td); + td = td_next; + } + } + + if (int_sts & USBH_HcInterruptStatus_RHSC_Msk) + { + _ohci->HcInterruptDisable = USBH_HcInterruptDisable_RHSC_Msk; + } + + _ohci->HcInterruptStatus = int_sts; +} + +#ifdef ENABLE_DEBUG_MSG + +static void dump_ohci_int_table() +{ + int i; + ED_T *ed; + + for (i = 0; i < 32; i++) +// for (i = 0; i < 1; i++) + + { + USB_debug("%02d: ", i); + + ed = (ED_T *)_hcca->int_table[i]; + + while (ed != NULL) + { + USB_debug("0x%x (0x%x) => ", ptr_to_u32(ed), ed->HeadP); + ed = (ED_T *)ed->NextED; + } + rt_kprintf("0\n"); + } +} + +static void dump_ohci_regs() +{ + USB_debug("Dump OCHI registers: [0x%x]\n", ptr_to_u32(&_ohci->HcRevision)); + USB_debug(" HcRevision = 0x%x\n", _ohci->HcRevision); + USB_debug(" HcControl = 0x%x\n", _ohci->HcControl); + USB_debug(" HcCommandStatus = 0x%x\n", _ohci->HcCommandStatus); + USB_debug(" HcInterruptStatus = 0x%x\n", _ohci->HcInterruptStatus); + USB_debug(" HcInterruptEnable = 0x%x\n", _ohci->HcInterruptEnable); + USB_debug(" HcInterruptDisable = 0x%x\n", _ohci->HcInterruptDisable); + USB_debug(" HcHCCA = 0x%x\n", _ohci->HcHCCA); + USB_debug(" HcPeriodCurrentED = 0x%x\n", _ohci->HcPeriodCurrentED); + USB_debug(" HcControlHeadED = 0x%x\n", _ohci->HcControlHeadED); + USB_debug(" HcControlCurrentED = 0x%x\n", _ohci->HcControlCurrentED); + USB_debug(" HcBulkHeadED = 0x%x\n", _ohci->HcBulkHeadED); + USB_debug(" HcBulkCurrentED = 0x%x\n", _ohci->HcBulkCurrentED); + USB_debug(" HcDoneHead = 0x%x\n", _ohci->HcDoneHead); + USB_debug(" HcFmInterval = 0x%x\n", _ohci->HcFmInterval); + USB_debug(" HcFmRemaining = 0x%x\n", _ohci->HcFmRemaining); + USB_debug(" HcFmNumber = 0x%x\n", _ohci->HcFmNumber); + USB_debug(" HcPeriodicStart = 0x%x\n", _ohci->HcPeriodicStart); + USB_debug(" HcLSThreshold = 0x%x\n", _ohci->HcLSThreshold); + USB_debug(" HcRhDescriptorA = 0x%x\n", _ohci->HcRhDescriptorA); + USB_debug(" HcRhDescriptorB = 0x%x\n", _ohci->HcRhDescriptorB); + USB_debug(" HcRhStatus = 0x%x\n", _ohci->HcRhStatus); + USB_debug(" HcRhPortStatus0 = 0x%x\n", _ohci->HcRhPortStatus[0]); + USB_debug(" HcPhyControl = 0x%x\n", _ohci->HcPhyControl); +} + +static void dump_ohci_ports() +{ + USB_debug("_ohci port0=0x%x\n", _ohci->HcRhPortStatus[0]); +} + +#endif // ENABLE_DEBUG_MSG + +/// @endcond HIDDEN_SYMBOLS + +/*** (C) COPYRIGHT 2017 Nuvoton Technology Corp. ***/ diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/ehci_0.c b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/ehci_0.c new file mode 100644 index 0000000000..ffb1afe021 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/ehci_0.c @@ -0,0 +1,43 @@ +/**************************************************************************//** + * @file ehci_0.c + * @version V1.10 + * @brief USB Host library EHCI (USB 2.0) host controller driver. + * + * @copyright (C) 2017 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#include +#include +#include + +#include "usb.h" +#include "hub.h" +#include "ehci.h" + +#define _ehci _ehci0 +#define ehci_driver ehci0_driver + +#define EHCI_IRQHandler EHCI0_IRQHandler + +//static uint16_t port_mask = 0x0001; +static ISO_EP_T *iso_ep_list; /* list of activated isochronous pipes */ + +#include "_ehci.c_" +#include "_ehci_iso.c_" + +HC_DRV_T ehci0_driver = +{ + ehci_init, /* init */ + ehci_shutdown, /* shutdown */ + ehci_suspend, /* suspend */ + ehci_resume, /* resume */ + ehci_ctrl_xfer, /* ctrl_xfer */ + ehci_bulk_xfer, /* bulk_xfer */ + ehci_int_xfer, /* int_xfer */ + ehci_iso_xfer, /* iso_xfer */ + ehci_quit_xfer, /* quit_xfer */ + ehci_rh_port_reset, /* rthub_port_reset */ + ehci_rh_polling, /* rthub_polling */ +}; + + diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/ehci_1.c b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/ehci_1.c new file mode 100644 index 0000000000..bd6343d903 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/ehci_1.c @@ -0,0 +1,43 @@ +/**************************************************************************//** + * @file ehci_0.c + * @version V1.10 + * @brief USB Host library EHCI (USB 2.0) host controller driver. + * + * @copyright (C) 2017 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#include +#include +#include + +#include "usb.h" +#include "hub.h" +#include "ehci.h" + +#define _ehci _ehci1 +#define ehci_driver ehci1_driver + +#define EHCI_IRQHandler EHCI1_IRQHandler + +//static uint16_t port_mask = 0x0002; +static ISO_EP_T *iso_ep_list; /* list of activated isochronous pipes */ + +#include "_ehci.c_" +#include "_ehci_iso.c_" + +HC_DRV_T ehci1_driver = +{ + ehci_init, /* init */ + ehci_shutdown, /* shutdown */ + ehci_suspend, /* suspend */ + ehci_resume, /* resume */ + ehci_ctrl_xfer, /* ctrl_xfer */ + ehci_bulk_xfer, /* bulk_xfer */ + ehci_int_xfer, /* int_xfer */ + ehci_iso_xfer, /* iso_xfer */ + ehci_quit_xfer, /* quit_xfer */ + ehci_rh_port_reset, /* rthub_port_reset */ + ehci_rh_polling, /* rthub_polling */ +}; + + diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/mem_alloc.c b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/mem_alloc.c new file mode 100644 index 0000000000..75a7b60e38 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/mem_alloc.c @@ -0,0 +1,538 @@ +/**************************************************************************//** + * @file mem_alloc.c + * @version V1.10 + * @brief USB host library memory allocation functions. + * + * @note + * SPDX-License-Identifier: Apache-2.0 + * Copyright (C) 2018 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#include +#include +#include + +#include "usb.h" + + +/// @cond HIDDEN_SYMBOLS + +//#define MEM_DEBUG + +#ifdef MEM_DEBUG + #define mem_debug rt_kprintf +#else + #define mem_debug(...) +#endif + +#ifdef __ICCARM__ + #pragma data_alignment=1024 + uint8_t _mem_pool_buff[MEM_POOL_UNIT_NUM][MEM_POOL_UNIT_SIZE]; +#else + uint8_t _mem_pool_buff[MEM_POOL_UNIT_NUM][MEM_POOL_UNIT_SIZE] __attribute__((aligned(1024))); +#endif + +static uint8_t *_mem_pool[MEM_POOL_UNIT_NUM]; +static uint8_t _unit_used[MEM_POOL_UNIT_NUM]; + +static volatile int _usbh_mem_used; +static volatile int _usbh_max_mem_used; +static volatile int _mem_pool_used; + + +UDEV_T *g_udev_list; + +uint8_t _dev_addr_pool[128]; +static volatile int _device_addr; + +static int _sidx = 0;; + +/*--------------------------------------------------------------------------*/ +/* Memory alloc/free recording */ +/*--------------------------------------------------------------------------*/ + +void usbh_memory_init(void) +{ + int i; + + if (sizeof(TD_T) > MEM_POOL_UNIT_SIZE) + { + USB_error("TD_T - MEM_POOL_UNIT_SIZE too small!\n"); + while (1); + } + + if (sizeof(ED_T) > MEM_POOL_UNIT_SIZE) + { + USB_error("ED_T - MEM_POOL_UNIT_SIZE too small!\n"); + while (1); + } + + for (i = 0; i < MEM_POOL_UNIT_NUM; i++) + { + _unit_used[i] = 0; + _mem_pool[i] = (uint8_t *)((uint32_t)&_mem_pool_buff[i] | NON_CACHE_MASK); + } + + _usbh_mem_used = 0L; + _usbh_max_mem_used = 0L; + + _mem_pool_used = 0; + _sidx = 0; + + g_udev_list = NULL; + + memset(_dev_addr_pool, 0, sizeof(_dev_addr_pool)); + _device_addr = 1; + + USB_InitializeMemoryPool(); +} + +uint32_t usbh_memory_used(void) +{ + mem_debug("USB static memory: %d/%d, heap used: %d\n", _mem_pool_used, MEM_POOL_UNIT_NUM, _usbh_mem_used); + return _usbh_mem_used; +} + +static void memory_counter(int size) +{ + _usbh_mem_used += size; + if (_usbh_mem_used > _usbh_max_mem_used) + _usbh_max_mem_used = _usbh_mem_used; +} + +void *usbh_alloc_mem(int size) +{ + void *p; + + p = USB_malloc(size, 16); + if (p == NULL) + { + USB_error("usbh_alloc_mem failed! %d\n", size); + return NULL; + } + + memset(p, 0, size); + memory_counter(size); + return p; +} + +void usbh_free_mem(void *p, int size) +{ + USB_free(p); + memory_counter(0 - size); +} + + +/*--------------------------------------------------------------------------*/ +/* USB device allocate/free */ +/*--------------------------------------------------------------------------*/ + +UDEV_T *alloc_device(void) +{ + UDEV_T *udev; + + udev = (UDEV_T *)USB_malloc(sizeof(*udev), 16); + if (udev == NULL) + { + USB_error("alloc_device failed!\n"); + return NULL; + } + + memset(udev, 0, sizeof(*udev)); + memory_counter(sizeof(*udev)); + udev->cur_conf = -1; /* must! used to identify the first SET CONFIGURATION */ + udev->next = g_udev_list; /* chain to global device list */ + g_udev_list = udev; + return udev; +} + +void free_device(UDEV_T *udev) +{ + UDEV_T *d; + + if (udev == NULL) + return; + + if (udev->cfd_buff != NULL) + usbh_free_mem(udev->cfd_buff, MAX_DESC_BUFF_SIZE); + + /* + * Remove it from the global device list + */ + if (g_udev_list == udev) + { + g_udev_list = g_udev_list->next; + } + else + { + d = g_udev_list; + while (d != NULL) + { + if (d->next == udev) + { + d->next = udev->next; + break; + } + d = d->next; + } + } + USB_free(udev); + memory_counter(-sizeof(*udev)); +} + +int alloc_dev_address(void) +{ + _device_addr++; + + if (_device_addr >= 128) + _device_addr = 1; + + while (1) + { + if (_dev_addr_pool[_device_addr] == 0) + { + _dev_addr_pool[_device_addr] = 1; + return _device_addr; + } + _device_addr++; + if (_device_addr >= 128) + _device_addr = 1; + } +} + +void free_dev_address(int dev_addr) +{ + if (dev_addr < 128) + _dev_addr_pool[dev_addr] = 0; +} + +/*--------------------------------------------------------------------------*/ +/* UTR (USB Transfer Request) allocate/free */ +/*--------------------------------------------------------------------------*/ + +UTR_T *alloc_utr(UDEV_T *udev) +{ +#if 0 + UTR_T *utr, *utr_noncache; + + utr = (UTR_T *)USB_malloc(sizeof(*utr), 16); + if (utr == NULL) + { + USB_error("alloc_utr failed!\n"); + return NULL; + } + + utr_noncache = (UTR_T *)((uint32_t)utr | NONCACHEABLE); + + memory_counter(sizeof(*utr)); + memset(utr_noncache, 0, sizeof(*utr)); + utr_noncache->udev = udev; + mem_debug("[ALLOC] [UTR] - 0x%x\n", (int)utr_noncache); + return utr_noncache; +#else + UTR_T *utr; + + utr = (UTR_T *)USB_malloc(sizeof(*utr), 16); + if (utr == NULL) + { + USB_error("alloc_utr failed!\n"); + return NULL; + } + + memory_counter(sizeof(*utr)); + memset(utr, 0, sizeof(*utr)); + utr->udev = udev; + mem_debug("[ALLOC] [UTR] - 0x%x\n", (int)utr_noncache); + return utr; +#endif +} + +void free_utr(UTR_T *utr) +{ + if (utr == NULL) + return; + + mem_debug("[FREE] [UTR] - 0x%x\n", (int)utr); + +#if 0 + if ((uint32_t)utr & NONCACHEABLE) + utr = (UTR_T *)((uint32_t)utr & ~NONCACHEABLE); +#endif + + USB_free(utr); + memory_counter(0 - (int)sizeof(*utr)); +} + +/*--------------------------------------------------------------------------*/ +/* OHCI ED allocate/free */ +/*--------------------------------------------------------------------------*/ + +ED_T *alloc_ohci_ED(void) +{ + int i; + ED_T *ed; + + for (i = 0; i < MEM_POOL_UNIT_NUM; i++) + { + if (_unit_used[i] == 0) + { + _unit_used[i] = 1; + _mem_pool_used++; + ed = (ED_T *)_mem_pool[i]; + memset(ed, 0, sizeof(*ed)); + mem_debug("[ALLOC] [ED] - 0x%x\n", (int)ed); + return ed; + } + } + USB_error("alloc_ohci_ED failed!\n"); + return NULL; +} + +void free_ohci_ED(ED_T *ed) +{ + int i; + + for (i = 0; i < MEM_POOL_UNIT_NUM; i++) + { + if ((uint32_t)_mem_pool[i] == (uint32_t)ed) + { + mem_debug("[FREE] [ED] - 0x%x\n", (int)ed); + _unit_used[i] = 0; + _mem_pool_used--; + return; + } + } + USB_debug("free_ohci_ED - not found! (ignored in case of multiple UTR)\n"); +} + +/*--------------------------------------------------------------------------*/ +/* OHCI TD allocate/free */ +/*--------------------------------------------------------------------------*/ +TD_T *alloc_ohci_TD(UTR_T *utr) +{ + int i; + TD_T *td; + + for (i = 0; i < MEM_POOL_UNIT_NUM; i++) + { + if (_unit_used[i] == 0) + { + _unit_used[i] = 1; + _mem_pool_used++; + td = (TD_T *)_mem_pool[i]; + + memset(td, 0, sizeof(*td)); + td->utr = utr; + mem_debug("[ALLOC] [TD] - 0x%x\n", (int)td); + return td; + } + } + USB_error("alloc_ohci_TD failed!\n"); + return NULL; +} + +void free_ohci_TD(TD_T *td) +{ + int i; + + for (i = 0; i < MEM_POOL_UNIT_NUM; i++) + { + if ((uint32_t)_mem_pool[i] == (uint32_t)td) + { + mem_debug("[FREE] [TD] - 0x%x\n", (int)td); + _unit_used[i] = 0; + _mem_pool_used--; + return; + } + } + USB_error("free_ohci_TD - not found!\n"); +} + +/*--------------------------------------------------------------------------*/ +/* EHCI QH allocate/free */ +/*--------------------------------------------------------------------------*/ +QH_T *alloc_ehci_QH(void) +{ + int i; + QH_T *qh = NULL; + + for (i = (_sidx + 1) % MEM_POOL_UNIT_NUM; i != _sidx; i = (i + 1) % MEM_POOL_UNIT_NUM) + { + if (_unit_used[i] == 0) + { + _unit_used[i] = 1; + _sidx = i; + _mem_pool_used++; + qh = (QH_T *)_mem_pool[i]; + memset(qh, 0, sizeof(*qh)); + mem_debug("[ALLOC] [QH] - 0x%x\n", (int)qh); + break; + } + } + if (qh == NULL) + { + USB_error("alloc_ehci_QH failed!\n"); + return NULL; + } + qh->Curr_qTD = QTD_LIST_END; + qh->OL_Next_qTD = QTD_LIST_END; + qh->OL_Alt_Next_qTD = QTD_LIST_END; + qh->OL_Token = QTD_STS_HALT; + return qh; +} + +void free_ehci_QH(QH_T *qh) +{ + int i; + + for (i = 0; i < MEM_POOL_UNIT_NUM; i++) + { + if ((uint32_t)_mem_pool[i] == (uint32_t)qh) + { + mem_debug("[FREE] [QH] - 0x%x\n", (int)qh); + _unit_used[i] = 0; + _mem_pool_used--; + return; + } + } + USB_debug("free_ehci_QH - not found! (ignored in case of multiple UTR)\n"); +} + +/*--------------------------------------------------------------------------*/ +/* EHCI qTD allocate/free */ +/*--------------------------------------------------------------------------*/ +qTD_T *alloc_ehci_qTD(UTR_T *utr) +{ + int i; + qTD_T *qtd; + + for (i = (_sidx + 1) % MEM_POOL_UNIT_NUM; i != _sidx; i = (i + 1) % MEM_POOL_UNIT_NUM) + { + if (_unit_used[i] == 0) + { + _unit_used[i] = 1; + _sidx = i; + _mem_pool_used++; + qtd = (qTD_T *)_mem_pool[i]; + + memset(qtd, 0, sizeof(*qtd)); + qtd->Next_qTD = QTD_LIST_END; + qtd->Alt_Next_qTD = QTD_LIST_END; + qtd->Token = 0x1197B7F; // QTD_STS_HALT; visit_qtd() will not remove a qTD with this mark. It means the qTD still not ready for transfer. + qtd->utr = utr; + mem_debug("[ALLOC] [qTD] - 0x%x\n", (int)qtd); + return qtd; + } + } + USB_error("alloc_ehci_qTD failed!\n"); + return NULL; +} + +void free_ehci_qTD(qTD_T *qtd) +{ + int i; + + for (i = 0; i < MEM_POOL_UNIT_NUM; i++) + { + if ((uint32_t)_mem_pool[i] == (uint32_t)qtd) + { + mem_debug("[FREE] [qTD] - 0x%x\n", (int)qtd); + _unit_used[i] = 0; + _mem_pool_used--; + return; + } + } + USB_error("free_ehci_qTD 0x%x - not found!\n", (int)qtd); +} + +/*--------------------------------------------------------------------------*/ +/* EHCI iTD allocate/free */ +/*--------------------------------------------------------------------------*/ +iTD_T *alloc_ehci_iTD(void) +{ + int i; + iTD_T *itd; + + for (i = (_sidx + 1) % MEM_POOL_UNIT_NUM; i != _sidx; i = (i + 1) % MEM_POOL_UNIT_NUM) + { + if (i + 2 >= MEM_POOL_UNIT_NUM) + continue; + + if ((_unit_used[i] == 0) && (_unit_used[i + 1] == 0)) + { + _unit_used[i] = _unit_used[i + 1] = 1; + _sidx = i + 1; + _mem_pool_used += 2; + itd = (iTD_T *)_mem_pool[i]; + memset(itd, 0, sizeof(*itd)); + mem_debug("[ALLOC] [iTD] - 0x%x\n", (int)itd); + return itd; + } + } + USB_error("alloc_ehci_iTD failed!\n"); + return NULL; +} + +void free_ehci_iTD(iTD_T *itd) +{ + int i; + + for (i = 0; i + 1 < MEM_POOL_UNIT_NUM; i++) + { + if ((uint32_t)_mem_pool[i] == (uint32_t)itd) + { + mem_debug("[FREE] [iTD] - 0x%x\n", (int)itd); + _unit_used[i] = _unit_used[i + 1] = 0; + _mem_pool_used -= 2; + return; + } + } + USB_error("free_ehci_iTD 0x%x - not found!\n", (int)itd); +} + +/*--------------------------------------------------------------------------*/ +/* EHCI iTD allocate/free */ +/*--------------------------------------------------------------------------*/ +siTD_T *alloc_ehci_siTD(void) +{ + int i; + siTD_T *sitd; + + for (i = (_sidx + 1) % MEM_POOL_UNIT_NUM; i != _sidx; i = (i + 1) % MEM_POOL_UNIT_NUM) + { + if (_unit_used[i] == 0) + { + _unit_used[i] = 1; + _sidx = i; + _mem_pool_used ++; + sitd = (siTD_T *)_mem_pool[i]; + memset(sitd, 0, sizeof(*sitd)); + mem_debug("[ALLOC] [siTD] - 0x%x\n", (int)sitd); + return sitd; + } + } + USB_error("alloc_ehci_siTD failed!\n"); + return NULL; +} + +void free_ehci_siTD(siTD_T *sitd) +{ + int i; + + for (i = 0; i < MEM_POOL_UNIT_NUM; i++) + { + if ((uint32_t)_mem_pool[i] == (uint32_t)sitd) + { + mem_debug("[FREE] [siTD] - 0x%x\n", (int)sitd); + _unit_used[i] = 0; + _mem_pool_used--; + return; + } + } + USB_error("free_ehci_siTD 0x%x - not found!\n", (int)sitd); +} + +/// @endcond HIDDEN_SYMBOLS + +/*** (C) COPYRIGHT 2018 Nuvoton Technology Corp. ***/ + diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/ohci_0.c b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/ohci_0.c new file mode 100644 index 0000000000..40875bb99d --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/ohci_0.c @@ -0,0 +1,41 @@ +/**************************************************************************//** + * @file ohci.c + * @version V1.10 + * @brief USB Host library OHCI (USB 1.1) host controller driver. + * + * @copyright (C) 2017 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#include +#include +#include + +#include "usb.h" +#include "hub.h" +#include "ohci.h" + +/// @cond HIDDEN_SYMBOLS + +#define _ohci _ohci0 +#define ohci_driver ohci0_driver + +#define OHCI_IRQHandler OHCI0_IRQHandler + +#include "_ohci.c_" + +HC_DRV_T ohci0_driver = +{ + ohci_init, /* init */ + ohci_shutdown, /* shutdown */ + ohci_suspend, /* suspend */ + ohci_resume, /* resume */ + ohci_ctrl_xfer, /* ctrl_xfer */ + ohci_bulk_xfer, /* bulk_xfer */ + ohci_int_xfer, /* int_xfer */ + ohci_iso_xfer, /* iso_xfer */ + ohci_quit_xfer, /* quit_xfer */ + ohci_rh_port_reset, /* rthub_port_reset */ + ohci_rh_polling, /* rthub_polling */ +}; + + diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/ohci_1.c b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/ohci_1.c new file mode 100644 index 0000000000..2dfb1d08ad --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/ohci_1.c @@ -0,0 +1,41 @@ +/**************************************************************************//** + * @file ohci.c + * @version V1.10 + * @brief USB Host library OHCI (USB 1.1) host controller driver. + * + * @copyright (C) 2017 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#include +#include +#include + +#include "usb.h" +#include "hub.h" +#include "ohci.h" + +/// @cond HIDDEN_SYMBOLS + +#define _ohci _ohci1 +#define ohci_driver ohci1_driver + +#define OHCI_IRQHandler OHCI1_IRQHandler + +#include "_ohci.c_" + +HC_DRV_T ohci1_driver = +{ + ohci_init, /* init */ + ohci_shutdown, /* shutdown */ + ohci_suspend, /* suspend */ + ohci_resume, /* resume */ + ohci_ctrl_xfer, /* ctrl_xfer */ + ohci_bulk_xfer, /* bulk_xfer */ + ohci_int_xfer, /* int_xfer */ + ohci_iso_xfer, /* iso_xfer */ + ohci_quit_xfer, /* quit_xfer */ + ohci_rh_port_reset, /* rthub_port_reset */ + ohci_rh_polling, /* rthub_polling */ +}; + + diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/support.c b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/support.c new file mode 100644 index 0000000000..7338f41ab7 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/support.c @@ -0,0 +1,274 @@ +/**************************************************************************//** + * @file support.c + * @version V1.10 + * $Revision: 11 $ + * $Date: 14/10/03 1:54p $ + * @brief Functions to support USB host driver. + * + * @note + * SPDX-License-Identifier: Apache-2.0 + * Copyright (C) 2018 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#include +#include +#include + +#include "usb.h" + +/// @cond HIDDEN_SYMBOLS + + +#define USB_MEMORY_POOL_SIZE (32*1024) +#define USB_MEM_BLOCK_SIZE 128 + +#define BOUNDARY_WORD 4 + + +static uint32_t _FreeMemorySize; +uint32_t _AllocatedMemorySize; + + +#define USB_MEM_ALLOC_MAGIC 0x19685788 /* magic number in leading block */ + +typedef struct USB_mhdr +{ + uint32_t flag; /* 0:free, 1:allocated, 0x3:first block */ + uint32_t bcnt; /* if allocated, the block count of allocated memory block */ + uint32_t magic; + uint32_t reserved; +} USB_MHDR_T; + +uint8_t _USBMemoryPool[USB_MEMORY_POOL_SIZE] __attribute__((aligned(USB_MEM_BLOCK_SIZE))); + + +static USB_MHDR_T *_pCurrent; +uint32_t *_USB_pCurrent = (uint32_t *) &_pCurrent; + +static uint32_t _MemoryPoolBase, _MemoryPoolEnd; + + +void USB_InitializeMemoryPool() +{ + _MemoryPoolBase = (uint32_t)&_USBMemoryPool[0] | NON_CACHE_MASK; + _MemoryPoolEnd = _MemoryPoolBase + USB_MEMORY_POOL_SIZE; + _FreeMemorySize = _MemoryPoolEnd - _MemoryPoolBase; + _AllocatedMemorySize = 0; + _pCurrent = (USB_MHDR_T *)_MemoryPoolBase; + memset((char *)_MemoryPoolBase, 0, _FreeMemorySize); +} + + +int USB_available_memory() +{ + return _FreeMemorySize; +} + + +int USB_allocated_memory() +{ + return _AllocatedMemorySize; +} + + +void *USB_malloc(int wanted_size, int boundary) +{ + USB_MHDR_T *pPrimitivePos = _pCurrent; + USB_MHDR_T *pFound; + int found_size = -1; + int i, block_count; + int wrap = 0; + void *pvBuf = NULL; + rt_base_t level; + + level = rt_hw_interrupt_disable(); + + if (wanted_size >= _FreeMemorySize) + { + rt_kprintf("USB_malloc - want=%d, free=%d\n", wanted_size, _FreeMemorySize); + goto exit_USB_malloc; + } + + + if ((uint32_t)_pCurrent >= _MemoryPoolEnd) + _pCurrent = (USB_MHDR_T *)_MemoryPoolBase; /* wrapped */ + + do + { + if (_pCurrent->flag) /* is not a free block */ + { + if (_pCurrent->magic != USB_MEM_ALLOC_MAGIC) + { + rt_kprintf("\nUSB_malloc - incorrect magic number! C:%x F:%x, wanted:%d, Base:0x%x, End:0x%x\n", (uint32_t)_pCurrent, _FreeMemorySize, wanted_size, (uint32_t)_MemoryPoolBase, (uint32_t)_MemoryPoolEnd); + goto exit_USB_malloc; + } + + if (_pCurrent->flag == 0x3) + _pCurrent = (USB_MHDR_T *)((uint32_t)_pCurrent + _pCurrent->bcnt * USB_MEM_BLOCK_SIZE); + else + { + rt_kprintf("USB_malloc warning - not the first block!\n"); + _pCurrent = (USB_MHDR_T *)((uint32_t)_pCurrent + USB_MEM_BLOCK_SIZE); + } + + if ((uint32_t)_pCurrent > _MemoryPoolEnd) + rt_kprintf("USB_malloc - behind limit!!\n"); + + if ((uint32_t)_pCurrent == _MemoryPoolEnd) + { + //rt_kprintf("USB_alloc - warp!!\n"); + wrap = 1; + _pCurrent = (USB_MHDR_T *)_MemoryPoolBase; /* wrapped */ + } + + found_size = -1; /* reset the accumlator */ + } + else /* is a free block */ + { + if (found_size == -1) /* the leading block */ + { + pFound = _pCurrent; + block_count = 1; + + if (boundary > BOUNDARY_WORD) + found_size = 0; /* not use the data area of the leading block */ + else + found_size = USB_MEM_BLOCK_SIZE - sizeof(USB_MHDR_T); + + /* check boundary - + * If boundary > BOUNDARY_WORD, the start of next block should + * be the beginning address of allocated memory. Thus, we check + * the boundary of the next block. The leading block will be + * used as a header only. + */ + if ((boundary > BOUNDARY_WORD) && + ((((uint32_t)_pCurrent) + USB_MEM_BLOCK_SIZE >= _MemoryPoolEnd) || + ((((uint32_t)_pCurrent) + USB_MEM_BLOCK_SIZE) % boundary != 0))) + found_size = -1; /* violate boundary, reset the accumlator */ + } + else /* not the leading block */ + { + found_size += USB_MEM_BLOCK_SIZE; + block_count++; + } + + if (found_size >= wanted_size) + { + pFound->bcnt = block_count; + pFound->magic = USB_MEM_ALLOC_MAGIC; + _FreeMemorySize -= block_count * USB_MEM_BLOCK_SIZE; + _AllocatedMemorySize += block_count * USB_MEM_BLOCK_SIZE; + _pCurrent = pFound; + for (i = 0; i < block_count; i++) + { + _pCurrent->flag = 1; /* allocate block */ + _pCurrent = (USB_MHDR_T *)((uint32_t)_pCurrent + USB_MEM_BLOCK_SIZE); + } + pFound->flag = 0x3; + + if (boundary > BOUNDARY_WORD) + { + pvBuf = (void *)((uint32_t)pFound + USB_MEM_BLOCK_SIZE); + goto exit_USB_malloc; + } + else + { + //USB_debug("USB_malloc(%d,%d):%x\tsize:%d, C:0x%x, %d\n", wanted_size, boundary, (uint32_t)pFound + sizeof(USB_MHDR_T), block_count * USB_MEM_BLOCK_SIZE, _pCurrent, block_count); + pvBuf = (void *)((uint32_t)pFound + sizeof(USB_MHDR_T)); + goto exit_USB_malloc; + } + } + + /* advance to the next block */ + _pCurrent = (USB_MHDR_T *)((uint32_t)_pCurrent + USB_MEM_BLOCK_SIZE); + if ((uint32_t)_pCurrent >= _MemoryPoolEnd) + { + wrap = 1; + _pCurrent = (USB_MHDR_T *)_MemoryPoolBase; /* wrapped */ + found_size = -1; /* reset accumlator */ + } + } + } + while ((wrap == 0) || (_pCurrent < pPrimitivePos)); + + rt_kprintf("USB_malloc - No free memory!\n"); + +exit_USB_malloc: + + rt_hw_interrupt_enable(level); + + return pvBuf; +} + + +void USB_free(void *alloc_addr) +{ + USB_MHDR_T *pMblk; + uint32_t addr = (uint32_t)alloc_addr; + int i, count; + rt_base_t level; + + //rt_kprintf("USB_free: 0x%x\n", (int)alloc_addr); + + level = rt_hw_interrupt_disable(); + + if ((addr < _MemoryPoolBase) || (addr >= _MemoryPoolEnd)) + { + if (addr) + { + rt_kprintf("[%s]Wrong!!\n", __func__); + } + goto Exit_USB_free; + } + + //rt_kprintf("USB_free:%x\n", (int32_t)addr+USB_MEM_BLOCK_SIZE); + + /* get the leading block address */ + if (addr % USB_MEM_BLOCK_SIZE == 0) + addr -= USB_MEM_BLOCK_SIZE; + else + addr -= sizeof(USB_MHDR_T); + + if (addr % USB_MEM_BLOCK_SIZE != 0) + { + rt_kprintf("USB_free fatal error on address: %x!!\n", (uint32_t)alloc_addr); + goto Exit_USB_free; + } + + pMblk = (USB_MHDR_T *)addr; + if (pMblk->flag == 0) + { + rt_kprintf("USB_free(), warning - try to free a free block: %x\n", (uint32_t)alloc_addr); + goto Exit_USB_free; + } + if (pMblk->magic != USB_MEM_ALLOC_MAGIC) + { + rt_kprintf("USB_free(), warning - try to free an unknow block at address:%x.\n", addr); + goto Exit_USB_free; + } + + //_pCurrent = pMblk; + + //rt_kprintf("+ 0x%x, %d\n", (int)pMblk, pMblk->bcnt); + + count = pMblk->bcnt; + for (i = 0; i < count; i++) + { + pMblk->flag = 0; /* release block */ + pMblk = (USB_MHDR_T *)((uint32_t)pMblk + USB_MEM_BLOCK_SIZE); + } + + _FreeMemorySize += count * USB_MEM_BLOCK_SIZE; + _AllocatedMemorySize -= count * USB_MEM_BLOCK_SIZE; + + +Exit_USB_free: + + rt_hw_interrupt_enable(level); + + return; +} + + +/// @endcond HIDDEN_SYMBOLS + diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/usb_core.c b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/usb_core.c new file mode 100644 index 0000000000..bd85008f9c --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/usb_core.c @@ -0,0 +1,335 @@ +/**************************************************************************//** + * @file usb_core.c + * @version V1.10 + * @brief USB Host library core. + * + * @note + * SPDX-License-Identifier: Apache-2.0 + * Copyright (C) 2018 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#include +#include +#include + +#include "usb.h" +#include "hub.h" + + +/// @cond HIDDEN_SYMBOLS + +USBH_T *_ohci0, *_ohci1; +HSUSBH_T *_ehci0, *_ehci1; + +int _IsInUsbInterrupt = 0; + +static UDEV_DRV_T *_drivers[MAX_UDEV_DRIVER]; + +static CONN_FUNC *g_conn_func, *g_disconn_func; + +extern void OHCI0_IRQHandler(int vector, void *param); +extern void OHCI1_IRQHandler(int vector, void *param); +extern void EHCI0_IRQHandler(int vector, void *param); +extern void EHCI1_IRQHandler(int vector, void *param); + + +/// @endcond HIDDEN_SYMBOLS + + +/** + * @brief Initialize MA35D1 USB Host controller and USB stack. + * + * @return None. + */ +void usbh_core_init() +{ + _ehci0 = (HSUSBH_T *)HSUSBH0_BASE; + _ohci0 = (USBH_T *)USBH0_BASE; + _ehci1 = (HSUSBH_T *)HSUSBH1_BASE; + _ohci1 = (USBH_T *)USBH1_BASE; + + memset(_drivers, 0, sizeof(_drivers)); + + g_conn_func = NULL; + g_disconn_func = NULL; + +// usbh_hub_init(); + usbh_memory_init(); + +#ifdef ENABLE_OHCI0 + rt_hw_interrupt_install(USBH0_IRQn, OHCI0_IRQHandler, NULL, "ohci0"); + rt_hw_interrupt_umask(USBH0_IRQn); + ohci0_driver.init(); + rt_kprintf("OHCI0 init done.\n"); +#endif + +#ifdef ENABLE_EHCI0 + rt_hw_interrupt_install(HSUSBH0_IRQn, EHCI0_IRQHandler, NULL, "ehci0"); + rt_hw_interrupt_umask(HSUSBH0_IRQn); + ehci0_driver.init(); + rt_kprintf("EHCI0 init done.\n"); +#endif + +#ifdef ENABLE_OHCI1 + rt_hw_interrupt_install(USBH1_IRQn, OHCI1_IRQHandler, NULL, "ohci1"); + rt_hw_interrupt_umask(USBH1_IRQn); + ohci1_driver.init(); + rt_kprintf("OHCI1 init done.\n"); +#endif + +#ifdef ENABLE_EHCI1 + rt_hw_interrupt_install(HSUSBH1_IRQn, EHCI1_IRQHandler, NULL, "ehci1"); + rt_hw_interrupt_umask(HSUSBH1_IRQn); + ehci1_driver.init(); + rt_kprintf("EHCI1 init done.\n"); +#endif +} + + + + +/** + * @brief Let USB stack polls all root hubs. If there's any hub port + * change found, USB stack will manage the hub events in this function call. + * In this function, USB stack enumerates newly connected devices and remove staff + * of disconnected devices. User's application should periodically invoke this + * function. + * @return There's hub port change or not. + * @retval 0 No any hub port status changes found. + * @retval 1 There's hub port status changes. + */ +int usbh_polling_root_hubs(void) +{ + int ret, change = 0; + +#ifdef ENABLE_EHCI0 + do + { + ret = ehci0_driver.rthub_polling(); + if (ret) + change = 1; + } + while (ret == 1); + // scan_isochronous_list(); +#endif + +#ifdef ENABLE_EHCI1 + do + { + ret = ehci1_driver.rthub_polling(); + if (ret) + change = 1; + } + while (ret == 1); + // scan_isochronous_list(); +#endif + +#ifdef ENABLE_OHCI0 + do + { + ret = ohci0_driver.rthub_polling(); + if (ret) + change = 1; + } + while (ret == 1); +#endif + +#ifdef ENABLE_OHCI1 + do + { + ret = ohci1_driver.rthub_polling(); + if (ret) + change = 1; + } + while (ret == 1); +#endif + + return change; +} + +/** + * @brief Force to quit an endpoint transfer. + * @param[in] udev The USB device. + * @param[in] ep The endpoint to be quit. + * @retval 0 Transfer success + * @retval < 0 Failed. Refer to error code definitions. + */ +int usbh_quit_xfer(UDEV_T *udev, EP_INFO_T *ep) +{ + return udev->hc_driver->quit_xfer(NULL, ep); +} + + +int usbh_connect_device(UDEV_T *udev) +{ + usbh_delay_ms(100); /* initially, give 100 ms delay */ + + if (g_conn_func) + g_conn_func(udev, 0); + + return 0; +} + + +void usbh_disconnect_device(UDEV_T *udev) +{ + USB_debug("disconnect device...\n"); + + if (g_disconn_func) + g_disconn_func(udev, 0); + + +#if 1 //CHECK: Maybe create a new API to quit_xfer and free udev for application + usbh_quit_xfer(udev, &(udev->ep0)); /* Quit control transfer if hw_pipe is not NULL. */ + + /* remove device from global device list */ +// free_dev_address(udev->dev_num); + free_device(udev); + +// usbh_memory_used(); +#endif +} + +/** + * @brief Install device connect and disconnect callback function. + * + * @param[in] conn_func Device connect callback function. + * @param[in] disconn_func Device disconnect callback function. + * @return None. + */ +void usbh_install_conn_callback(CONN_FUNC *conn_func, CONN_FUNC *disconn_func) +{ + g_conn_func = conn_func; + g_disconn_func = disconn_func; +} + +int usbh_reset_port(UDEV_T *udev) +{ + if (udev->parent == NULL) + { + if (udev->hc_driver) + return udev->hc_driver->rthub_port_reset(udev->port_num - 1); + else + return USBH_ERR_NOT_FOUND; + } + else + { + return udev->parent->port_reset(udev->parent, udev->port_num); + } +} + + +/** + * @brief Force to quit an UTR transfer. + * @param[in] utr The UTR transfer to be quit. + * @retval 0 Transfer success + * @retval < 0 Failed. Refer to error code definitions. + */ +int usbh_quit_utr(UTR_T *utr) +{ + if (!utr || !utr->udev) + return USBH_ERR_NOT_FOUND; + + return utr->udev->hc_driver->quit_xfer(utr, NULL); +} + + +/** + * @brief Execute an USB request in control transfer. This function returns after the request + * was done or aborted. + * @param[in] udev The target USB device. + * @param[in] bmRequestType Characteristics of request + * @param[in] bRequest Specific request + * @param[in] wValue Word-sized field that varies according to request + * @param[in] wIndex Word-sized field that varies according to request + * @param[in] wLength Number of bytes to transfer if there is a Data stage + * @param[in] buff Data buffer used in data stage + * @param[out] xfer_len Transmitted/received length of data + * @param[in] timeout Time-out limit (in 10ms - timer tick) of this transfer + * @retval 0 Transfer success + * @retval < 0 Transfer failed. Refer to error code definitions. + */ +int usbh_ctrl_xfer(UDEV_T *udev, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + uint16_t wLength, uint8_t *buff, uint32_t *xfer_len, uint32_t timeout) +{ + UTR_T *utr; + uint32_t t0, timeout_tick; + int status; + + *xfer_len = 0; + + //if (check_device(udev)) + // return USBH_ERR_INVALID_PARAM; + + utr = alloc_utr(udev); + if (utr == NULL) + return USBH_ERR_MEMORY_OUT; + + utr->setup.bmRequestType = bmRequestType; + utr->setup.bRequest = bRequest; + utr->setup.wValue = wValue; + utr->setup.wIndex = wIndex; + utr->setup.wLength = wLength; + + utr->buff = buff; + utr->data_len = wLength; + utr->bIsTransferDone = 0; + status = udev->hc_driver->ctrl_xfer(utr); + if (status < 0) + { + udev->ep0.hw_pipe = NULL; + free_utr(utr); + return status; + } + + timeout_tick = usbh_tick_from_millisecond(timeout); + t0 = usbh_get_ticks(); + while (utr->bIsTransferDone == 0) + { + if (usbh_get_ticks() - t0 > timeout_tick) + { + usbh_quit_utr(utr); + free_utr(utr); + udev->ep0.hw_pipe = NULL; + return USBH_ERR_TIMEOUT; + } + } + + status = utr->status; + + if (status == 0) + { + *xfer_len = utr->xfer_len; + } + free_utr(utr); + + return status; +} + +/** + * @brief Execute a bulk transfer request. This function will return immediately after + * issued the bulk transfer. USB stack will later call back utr->func() once the bulk + * transfer was done or aborted. + * @param[in] utr The bulk transfer request. + * @retval 0 Transfer success + * @retval < 0 Failed. Refer to error code definitions. + */ +int usbh_bulk_xfer(UTR_T *utr) +{ + return utr->udev->hc_driver->bulk_xfer(utr); +} + +/** + * @brief Execute an interrupt transfer request. This function will return immediately after + * issued the interrupt transfer. USB stack will later call back utr->func() once the + * interrupt transfer was done or aborted. + * @param[in] utr The interrupt transfer request. + * @retval 0 Transfer success + * @retval < 0 Failed. Refer to error code definitions. + */ +int usbh_int_xfer(UTR_T *utr) +{ + return utr->udev->hc_driver->int_xfer(utr); +} + + diff --git a/bsp/nuvoton/libraries/ma35/libcpu/SConscript b/bsp/nuvoton/libraries/ma35/libcpu/SConscript new file mode 100644 index 0000000000..6092707e6d --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/SConscript @@ -0,0 +1,15 @@ +# RT-Thread building script for bridge + +import os +from building import * + +Import('rtconfig') + +cwd = GetCurrentDir() +group = [] +list = os.listdir(cwd) + +if rtconfig.ARCH in list: + group = group + SConscript(os.path.join(rtconfig.ARCH, 'SConscript')) + +Return('group') diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/SConscript b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/SConscript new file mode 100644 index 0000000000..0b74223c6f --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/SConscript @@ -0,0 +1,13 @@ +# RT-Thread building script for component + +from building import * + +Import('rtconfig') + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') + Glob('*.S') +CPPPATH = [cwd] + +group = DefineGroup('CPU', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/armv8.h b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/armv8.h new file mode 100644 index 0000000000..1e74ced48e --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/armv8.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2011-09-15 Bernard first version + */ + +#ifndef __ARMV8_H__ +#define __ARMV8_H__ + +/* the exception stack without VFP registers */ +struct rt_hw_exp_stack +{ + unsigned long long pc; + unsigned long long spsr; + unsigned long long x30; + unsigned long long xz; + unsigned long long x28; + unsigned long long x29; + unsigned long long x26; + unsigned long long x27; + unsigned long long x24; + unsigned long long x25; + unsigned long long x22; + unsigned long long x23; + unsigned long long x20; + unsigned long long x21; + unsigned long long x18; + unsigned long long x19; + unsigned long long x16; + unsigned long long x17; + unsigned long long x14; + unsigned long long x15; + unsigned long long x12; + unsigned long long x13; + unsigned long long x10; + unsigned long long x11; + unsigned long long x8; + unsigned long long x9; + unsigned long long x6; + unsigned long long x7; + unsigned long long x4; + unsigned long long x5; + unsigned long long x2; + unsigned long long x3; + unsigned long long x0; + unsigned long long x1; +}; + +#define SP_ELx ( ( unsigned long long ) 0x01 ) +#define SP_EL0 ( ( unsigned long long ) 0x00 ) +#define PSTATE_EL1 ( ( unsigned long long ) 0x04 ) +#define PSTATE_EL2 ( ( unsigned long long ) 0x08 ) +#define PSTATE_EL3 ( ( unsigned long long ) 0x0c ) + +rt_ubase_t rt_hw_get_current_el(void); +void rt_hw_set_elx_env(void); +void rt_hw_set_current_vbar(rt_ubase_t addr); + +#endif diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/cache.S b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/cache.S new file mode 100644 index 0000000000..7f295a2b02 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/cache.S @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-03-17 bigmagic first version + */ + +/* + * void __asm_dcache_level(level) + * + * flush or invalidate one level cache. + * + * x0: cache level + * x1: 0 clean & invalidate, 1 invalidate only + * x2~x9: clobbered + */ +.globl __asm_dcache_level +__asm_dcache_level: + lsl x12, x0, #1 + msr csselr_el1, x12 /* select cache level */ + isb /* sync change of cssidr_el1 */ + mrs x6, ccsidr_el1 /* read the new cssidr_el1 */ + and x2, x6, #7 /* x2 <- log2(cache line size)-4 */ + add x2, x2, #4 /* x2 <- log2(cache line size) */ + mov x3, #0x3ff + and x3, x3, x6, lsr #3 /* x3 <- max number of #ways */ + clz w5, w3 /* bit position of #ways */ + mov x4, #0x7fff + and x4, x4, x6, lsr #13 /* x4 <- max number of #sets */ + /* x12 <- cache level << 1 */ + /* x2 <- line length offset */ + /* x3 <- number of cache ways - 1 */ + /* x4 <- number of cache sets - 1 */ + /* x5 <- bit position of #ways */ + +loop_set: + mov x6, x3 /* x6 <- working copy of #ways */ +loop_way: + lsl x7, x6, x5 + orr x9, x12, x7 /* map way and level to cisw value */ + lsl x7, x4, x2 + orr x9, x9, x7 /* map set number to cisw value */ + tbz w1, #0, 1f + dc isw, x9 + b 2f +1: dc cisw, x9 /* clean & invalidate by set/way */ +2: subs x6, x6, #1 /* decrement the way */ + b.ge loop_way + subs x4, x4, #1 /* decrement the set */ + b.ge loop_set + + ret + +/* + * void __asm_flush_dcache_all(int invalidate_only) + * + * x0: 0 clean & invalidate, 1 invalidate only + * + * flush or invalidate all data cache by SET/WAY. + */ +.globl __asm_dcache_all +__asm_dcache_all: + mov x1, x0 + dsb sy + mrs x10, clidr_el1 /* read clidr_el1 */ + lsr x11, x10, #24 + and x11, x11, #0x7 /* x11 <- loc */ + cbz x11, finished /* if loc is 0, exit */ + mov x15, lr + mov x0, #0 /* start flush at cache level 0 */ + /* x0 <- cache level */ + /* x10 <- clidr_el1 */ + /* x11 <- loc */ + /* x15 <- return address */ + +loop_level: + lsl x12, x0, #1 + add x12, x12, x0 /* x0 <- tripled cache level */ + lsr x12, x10, x12 + and x12, x12, #7 /* x12 <- cache type */ + cmp x12, #2 + b.lt skip /* skip if no cache or icache */ + bl __asm_dcache_level /* x1 = 0 flush, 1 invalidate */ +skip: + add x0, x0, #1 /* increment cache level */ + cmp x11, x0 + b.gt loop_level + + mov x0, #0 + msr csselr_el1, x0 /* restore csselr_el1 */ + dsb sy + isb + mov lr, x15 + +finished: + ret + +.globl __asm_flush_dcache_all +__asm_flush_dcache_all: + mov x0, #0 + b __asm_dcache_all + +.globl __asm_invalidate_dcache_all +__asm_invalidate_dcache_all: + mov x0, #0x1 + b __asm_dcache_all + +/* + * void __asm_flush_dcache_range(start, end) + * + * clean & invalidate data cache in the range + * + * x0: start address + * x1: end address + */ +.globl __asm_flush_dcache_range +__asm_flush_dcache_range: + mrs x3, ctr_el0 + lsr x3, x3, #16 + and x3, x3, #0xf + mov x2, #4 + lsl x2, x2, x3 /* cache line size */ + + /* x2 <- minimal cache line size in cache system */ + sub x3, x2, #1 + bic x0, x0, x3 +1: dc civac, x0 /* clean & invalidate data or unified cache */ + add x0, x0, x2 + cmp x0, x1 + b.lo 1b + dsb sy + ret + +/* + * void __asm_invalidate_icache_all(void) + * + * invalidate all tlb entries. + */ +.globl __asm_invalidate_icache_all +__asm_invalidate_icache_all: + ic ialluis + isb sy + ret + +.globl __asm_flush_l3_cache +__asm_flush_l3_cache: + mov x0, #0 /* return status as success */ + ret \ No newline at end of file diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/context_gcc.S b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/context_gcc.S new file mode 100644 index 0000000000..f58ea1b15d --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/context_gcc.S @@ -0,0 +1,312 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-10-06 ZhaoXiaowei the first version + */ + +.macro SAVE_CONTEXT + + /* Switch to use the EL0 stack pointer. */ + MSR SPSEL, #0 + + /* Save the entire context. */ + STP X0, X1, [SP, #-0x10]! + STP X2, X3, [SP, #-0x10]! + STP X4, X5, [SP, #-0x10]! + STP X6, X7, [SP, #-0x10]! + STP X8, X9, [SP, #-0x10]! + STP X10, X11, [SP, #-0x10]! + STP X12, X13, [SP, #-0x10]! + STP X14, X15, [SP, #-0x10]! + STP X16, X17, [SP, #-0x10]! + STP X18, X19, [SP, #-0x10]! + STP X20, X21, [SP, #-0x10]! + STP X22, X23, [SP, #-0x10]! + STP X24, X25, [SP, #-0x10]! + STP X26, X27, [SP, #-0x10]! + STP X28, X29, [SP, #-0x10]! + STP X30, XZR, [SP, #-0x10]! + + MRS X0, CurrentEL + CMP X0, 0xc + B.EQ 3f + CMP X0, 0x8 + B.EQ 2f + CMP X0, 0x4 + B.EQ 1f + B . +3: + MRS X3, SPSR_EL3 + /* Save the ELR. */ + MRS X2, ELR_EL3 + B 0f +2: + MRS X3, SPSR_EL2 + /* Save the ELR. */ + MRS X2, ELR_EL2 + B 0f +1: + MRS X3, SPSR_EL1 + MRS X2, ELR_EL1 + B 0f +0: + + STP X2, X3, [SP, #-0x10]! + + MOV X0, SP /* Move SP into X0 for saving. */ + + /* Switch to use the ELx stack pointer. */ + MSR SPSEL, #1 + + .endm + +.macro SAVE_CONTEXT_T + + /* Switch to use the EL0 stack pointer. */ + MSR SPSEL, #0 + + /* Save the entire context. */ + STP X0, X1, [SP, #-0x10]! + STP X2, X3, [SP, #-0x10]! + STP X4, X5, [SP, #-0x10]! + STP X6, X7, [SP, #-0x10]! + STP X8, X9, [SP, #-0x10]! + STP X10, X11, [SP, #-0x10]! + STP X12, X13, [SP, #-0x10]! + STP X14, X15, [SP, #-0x10]! + STP X16, X17, [SP, #-0x10]! + STP X18, X19, [SP, #-0x10]! + STP X20, X21, [SP, #-0x10]! + STP X22, X23, [SP, #-0x10]! + STP X24, X25, [SP, #-0x10]! + STP X26, X27, [SP, #-0x10]! + STP X28, X29, [SP, #-0x10]! + STP X30, XZR, [SP, #-0x10]! + + MRS X0, CurrentEL + CMP X0, 0xc + B.EQ 3f + CMP X0, 0x8 + B.EQ 2f + CMP X0, 0x4 + B.EQ 1f + B . +3: + MRS X3, SPSR_EL3 + MOV X2, X30 + B 0f +2: + MRS X3, SPSR_EL2 + MOV X2, X30 + B 0f +1: + MRS X3, SPSR_EL1 + MOV X2, X30 + B 0f +0: + + STP X2, X3, [SP, #-0x10]! + + MOV X0, SP /* Move SP into X0 for saving. */ + + /* Switch to use the ELx stack pointer. */ + MSR SPSEL, #1 + + .endm + +.macro RESTORE_CONTEXT + + /* Switch to use the EL0 stack pointer. */ + MSR SPSEL, #0 + + /* Set the SP to point to the stack of the task being restored. */ + MOV SP, X0 + + LDP X2, X3, [SP], #0x10 /* SPSR and ELR. */ + + MRS X0, CurrentEL + CMP X0, 0xc + B.EQ 3f + CMP X0, 0x8 + B.EQ 2f + CMP X0, 0x4 + B.EQ 1f + B . +3: + MSR SPSR_EL3, X3 + MSR ELR_EL3, X2 + B 0f +2: + MSR SPSR_EL2, X3 + MSR ELR_EL2, X2 + B 0f +1: + MSR SPSR_EL1, X3 + MSR ELR_EL1, X2 + B 0f +0: + + LDP X30, XZR, [SP], #0x10 + LDP X28, X29, [SP], #0x10 + LDP X26, X27, [SP], #0x10 + LDP X24, X25, [SP], #0x10 + LDP X22, X23, [SP], #0x10 + LDP X20, X21, [SP], #0x10 + LDP X18, X19, [SP], #0x10 + LDP X16, X17, [SP], #0x10 + LDP X14, X15, [SP], #0x10 + LDP X12, X13, [SP], #0x10 + LDP X10, X11, [SP], #0x10 + LDP X8, X9, [SP], #0x10 + LDP X6, X7, [SP], #0x10 + LDP X4, X5, [SP], #0x10 + LDP X2, X3, [SP], #0x10 + LDP X0, X1, [SP], #0x10 + + /* Switch to use the ELx stack pointer. _RB_ Might not be required. */ + MSR SPSEL, #1 + + ERET + + .endm + +.text +/* + * rt_base_t rt_hw_interrupt_disable(); + */ +.globl rt_hw_interrupt_disable +rt_hw_interrupt_disable: + MRS X0, DAIF + MSR DAIFSet, #3 + DSB SY + RET + +/* + * void rt_hw_interrupt_enable(rt_base_t level); + */ +.globl rt_hw_interrupt_enable +rt_hw_interrupt_enable: + DSB SY + MOV X1, #0xC0 + ANDS X0, X0, X1 + B.NE rt_hw_interrupt_enable_exit + MSR DAIFClr, #3 +rt_hw_interrupt_enable_exit: + RET + +/* + * void rt_hw_context_switch_to(rt_ubase_t to); + * r0 --> to + */ +.globl rt_hw_context_switch_to +rt_hw_context_switch_to: + LDR X0, [X0] + RESTORE_CONTEXT + +.text +/* + * void rt_hw_context_switch(rt_ubase_t from, rt_ubase_t to); + * r0 --> from + * r1 --> to + */ +.globl rt_hw_context_switch +rt_hw_context_switch: + + MOV X8,X0 + MOV X9,X1 + + SAVE_CONTEXT_T + + STR X0, [X8] // store sp in preempted tasks TCB + LDR X0, [X9] // get new task stack pointer + + RESTORE_CONTEXT + +/* + * void rt_hw_context_switch_interrupt(rt_ubase_t from, rt_ubase_t to); + */ +.globl rt_thread_switch_interrupt_flag +.globl rt_interrupt_from_thread +.globl rt_interrupt_to_thread +.globl rt_hw_context_switch_interrupt +rt_hw_context_switch_interrupt: + ADR X2, rt_thread_switch_interrupt_flag + LDR X3, [X2] + CMP X3, #1 + B.EQ _reswitch + ADR X4, rt_interrupt_from_thread // set rt_interrupt_from_thread + MOV X3, #1 // set rt_thread_switch_interrupt_flag to 1 + STR X0, [X4] + STR X3, [X2] +_reswitch: + ADR X2, rt_interrupt_to_thread // set rt_interrupt_to_thread + STR X1, [X2] + RET + +.text + +// -- Exception handlers ---------------------------------- + + .align 8 +.globl vector_fiq +vector_fiq: + SAVE_CONTEXT + STP X0, X1, [SP, #-0x10]! + BL rt_hw_trap_fiq + LDP X0, X1, [SP], #0x10 + RESTORE_CONTEXT + +.globl rt_interrupt_enter +.globl rt_interrupt_leave +.globl rt_thread_switch_interrupt_flag +.globl rt_interrupt_from_thread +.globl rt_interrupt_to_thread + + +// ------------------------------------------------------------------- + + .align 8 +.globl vector_irq +vector_irq: + SAVE_CONTEXT + STP X0, X1, [SP, #-0x10]! + + BL rt_interrupt_enter + BL rt_hw_trap_irq + BL rt_interrupt_leave + + LDP X0, X1, [SP], #0x10 + + // if rt_thread_switch_interrupt_flag set, jump to + // rt_hw_context_switch_interrupt_do and don't return + ADR X1, rt_thread_switch_interrupt_flag + LDR X2, [X1] + CMP X2, #1 + B.NE vector_irq_exit + + MOV X2, #0 // clear flag + STR X2, [X1] + + ADR X3, rt_interrupt_from_thread + LDR X4, [X3] + STR x0, [X4] // store sp in preempted tasks's TCB + + ADR x3, rt_interrupt_to_thread + LDR X4, [X3] + LDR x0, [X4] // get new task's stack pointer + +vector_irq_exit: + RESTORE_CONTEXT + +// ------------------------------------------------- + + .align 8 + .globl vector_error +vector_error: + SAVE_CONTEXT + BL rt_hw_trap_error + B . diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/cp15.h b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/cp15.h new file mode 100644 index 0000000000..7c64f23c9e --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/cp15.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2011-09-15 Bernard first version + */ + +#ifndef __CP15_H__ +#define __CP15_H__ + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif + +#define __WFI() __asm__ volatile ("wfi":::"memory") + +#define __WFE() __asm__ volatile ("wfe":::"memory") + +#define __SEV() __asm__ volatile ("sev") + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __asm__ volatile("isb 0xF":::"memory"); +} + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __asm__ volatile("dsb 0xF":::"memory"); +} + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __asm__ volatile("dmb 0xF":::"memory"); +} + +unsigned long rt_cpu_get_smp_id(void); + +void rt_cpu_mmu_disable(void); +void rt_cpu_mmu_enable(void); +void rt_cpu_tlb_set(volatile unsigned long *); + +void rt_cpu_dcache_clean_flush(void); +void rt_cpu_icache_flush(void); + +void rt_cpu_vector_set_base(rt_ubase_t addr); +void rt_hw_mmu_init(void); +void rt_hw_vector_init(void); + +#endif diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/cpu.c b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/cpu.c new file mode 100644 index 0000000000..3f4fe52b46 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/cpu.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2011-09-15 Bernard first version + * 2019-07-28 zdzn add smp support + */ + +#include +#include +#include +#include "cp15.h" + +int rt_hw_cpu_id(void) +{ + int cpu_id; + rt_base_t value; + + __asm__ volatile( + "mrs %0, mpidr_el1" + :"=r"(value) + ); + cpu_id = value & 0xf; + return cpu_id; +}; + +#ifdef RT_USING_SMP +void rt_hw_spin_lock_init(rt_hw_spinlock_t *lock) +{ + lock->slock = 0; +} + +void rt_hw_spin_lock(rt_hw_spinlock_t *lock) +{ + unsigned long tmp; + unsigned long newval; + rt_hw_spinlock_t lockval; + + __asm__ __volatile__( + " prfm pstl1strm, %3\n" + "1: ldaxr %w0, %3\n" + " add %w1, %w0, %w5\n" + " stxr %w2, %w1, %3\n" + " cbnz %w2, 1b\n" + /* Did we get the lock? */ + " eor %w1, %w0, %w0, ror #16\n" + " cbz %w1, 3f\n" + " sevl\n" + "2: wfe\n" + " ldaxrh %w2, %4\n" + " eor %w1, %w2, %w0, lsr #16\n" + " cbnz %w1, 2b\n" + "3:" + : "=&r"(lockval), "=&r"(newval), "=&r"(tmp), "+Q"(*lock) + : "Q"(lock->slock), "I"(1 << 16) + : "memory"); + + +} + +void rt_hw_spin_unlock(rt_hw_spinlock_t *lock) +{ + __DMB(); + lock->tickets.owner++; + __DSB(); + __SEV(); +} +#endif /*RT_USING_SMP*/ + +/** + * @addtogroup ARM CPU + */ +/*@{*/ + +/** shutdown CPU */ +RT_WEAK void rt_hw_cpu_shutdown() +{ + rt_uint32_t level; + rt_kprintf("shutdown...\n"); + + level = rt_hw_interrupt_disable(); + while (level) + { + RT_ASSERT(0); + } +} + +#ifdef RT_USING_CPU_FFS +/** + * This function finds the first bit set (beginning with the least significant bit) + * in value and return the index of that bit. + * + * Bits are numbered starting at 1 (the least significant bit). A return value of + * zero from any of these functions means that the argument was zero. + * + * @return return the index of the first bit set. If value is 0, then this function + * shall return 0. + */ +int __rt_ffs(int value) +{ + return __builtin_ffs(value); +} +#endif + +/*@}*/ diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/cpu_gcc.S b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/cpu_gcc.S new file mode 100644 index 0000000000..b8c8b8768c --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/cpu_gcc.S @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Date Author Notes + * 2018-10-06 ZhaoXiaowei the first version + */ + +.text +.globl rt_hw_get_current_el +rt_hw_get_current_el: + MRS X0, CurrentEL + CMP X0, 0xc + B.EQ 3f + CMP X0, 0x8 + B.EQ 2f + CMP X0, 0x4 + B.EQ 1f + + LDR X0, =0 + B 0f +3: + LDR X0, =3 + B 0f +2: + LDR X0, =2 + B 0f +1: + LDR X0, =1 + B 0f +0: + RET + + +.globl rt_hw_set_current_vbar +rt_hw_set_current_vbar: + MRS X1, CurrentEL + CMP X1, 0xc + B.EQ 3f + CMP X1, 0x8 + B.EQ 2f + CMP X1, 0x4 + B.EQ 1f + B 0f +3: + MSR VBAR_EL3,X0 + B 0f +2: + MSR VBAR_EL2,X0 + B 0f +1: + MSR VBAR_EL1,X0 + B 0f +0: + RET + + +.globl rt_hw_set_elx_env +rt_hw_set_elx_env: + MRS X1, CurrentEL + CMP X1, 0xc + B.EQ 3f + CMP X1, 0x8 + B.EQ 2f + CMP X1, 0x4 + B.EQ 1f + B 0f +3: + MRS X0, SCR_EL3 + ORR X0, X0, #0xF /* SCR_EL3.NS|IRQ|FIQ|EA */ + MSR SCR_EL3, X0 + B 0f +2: + MRS X0, HCR_EL2 + ORR X0, X0, #0x38 + MSR HCR_EL2, X0 + B 0f +1: + B 0f +0: + RET diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/entry_point.S b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/entry_point.S new file mode 100644 index 0000000000..2212d07511 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/entry_point.S @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Date Author Notes + * 2021-06-29 Wayne the first version + */ + +/* GICv2 - Distributor Registers */ +#define GICD_CTLR 0x0000 +#define GICD_TYPER 0x0004 +#define GICD_IIDR 0x0008 +#define GICD_STATUSR 0x0010 +#define GICD_SETSPI_NSR 0x0040 +#define GICD_CLRSPI_NSR 0x0048 +#define GICD_SETSPI_SR 0x0050 +#define GICD_CLRSPI_SR 0x0058 +#define GICD_SEIR 0x0068 +#define GICD_IGROUPRn 0x0080 +#define GICD_ISENABLERn 0x0100 +#define GICD_ICENABLERn 0x0180 +#define GICD_ISPENDRn 0x0200 +#define GICD_ICPENDRn 0x0280 +#define GICD_ISACTIVERn 0x0300 +#define GICD_ICACTIVERn 0x0380 +#define GICD_IPRIORITYRn 0x0400 +#define GICD_ITARGETSRn 0x0800 +#define GICD_ICFGR 0x0c00 +#define GICD_IGROUPMODRn 0x0d00 +#define GICD_NSACRn 0x0e00 +#define GICD_SGIR 0x0f00 +#define GICD_CPENDSGIRn 0x0f10 +#define GICD_SPENDSGIRn 0x0f20 +#define GICD_IROUTERn 0x6000 + +/* GICv2 - CPU Interface Memory Mapped Registers */ +#define GICC_CTLR 0x0000 +#define GICC_PMR 0x0004 +#define GICC_BPR 0x0008 +#define GICC_IAR 0x000C +#define GICC_EOIR 0x0010 +#define GICC_RPR 0x0014 +#define GICC_HPPIR 0x0018 +#define GICC_ABPR 0x001c +#define GICC_AIAR 0x0020 +#define GICC_AEOIR 0x0024 +#define GICC_AHPPIR 0x0028 +#define GICC_APRn 0x00d0 +#define GICC_NSAPRn 0x00e0 +#define GICC_IIDR 0x00fc +#define GICC_DIR 0x1000 + +.section ".text.entrypoint" +.global _start + +_start: + /*=============================================================*/ + /* Read CPU id */ + /* Primary core(id=0): Help Secondary core leaving. */ + /* Secondary core(id>0): Notice 'Ready' to Primary core. */ + /*=============================================================*/ + /* MPIDR_EL1: Multi-Processor Affinity Register */ + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, .L__cpu_0 + +.L__current_cpu_idle: + /*=============================================================*/ + /* Secondary CPUs */ + /*=============================================================*/ + wfe + b .L__current_cpu_idle + +.L__cpu_0: + + /*=============================================================*/ + /* Initialize Gtimer. Set frequency to 12MHz. */ + /*=============================================================*/ + mov x0, #0x1B00 + movk x0, #0xB7, LSL #16 + msr CNTFRQ_EL0, x0 + + /*=============================================================*/ + /* Enable GICv2. */ + /* Assign all IRQs to secure group. */ + /*=============================================================*/ + /* Route to secure Group */ + mov x0, #0x1000 + movk x0, #0x5080, LSL #16 + mov w9, #0x3 + str w9, [x0, GICD_CTLR] + ldr w9, [x0, GICD_TYPER] + and w10, w9, #0x1f + cbz w10, 1f + add x11, x0, GICD_IGROUPRn + mov w9, #0 + str w9, [x11], #0x04 +0: str w9, [x11], #0x04 + sub w10, w10, #0x1 + cbnz w10, 0b + + mov x1, #0x2000 + movk x1, #0x5080, LSL #16 + mov w0, #3 + str w0, [x1] + + mov w0, #1 << 7 + str w0, [x1, #4] +1: + mov x0, #0x1000 + movk x0, #0x5080, LSL #16 + mov x1, #0x2000 + movk x1, #0x5080, LSL #16 + + mov w9, #0 + str w9, [x0, GICD_IGROUPRn] + mov w9, #0x1 + str w9, [x0, GICD_ISENABLERn] + + mov w9, #0x1e7 + str w9, [x1, GICC_CTLR] + + mov w9, #0x1 << 7 + str w9, [x1, GICC_PMR] + + /*=============================================================*/ + /* Enable the SMP bit. */ + /*=============================================================*/ + mrs x0, S3_1_C15_C2_1 + orr x0, x0, #(1<<6) + msr S3_1_C15_C2_1, x0 + + /*=============================================================*/ + /* Enable FP/SIMD at EL1 */ + /*=============================================================*/ + mov x0, #(3 << 20) + msr cpacr_el1, x0 /* Enable FP/SIMD at EL1 */ + + /*=============================================================*/ + /* Initialize sctlr_el1 */ + /*=============================================================*/ + mov x0, xzr + orr x0, x0, #(1 << 29) /* Enable LSMAOE at EL1 */ + orr x0, x0, #(1 << 28) /* Enable nTLSMD at EL1 */ + orr x0, x0, #(1 << 23) /* Enable SPAN at EL1 */ + orr x0, x0, #(1 << 22) /* Enable EIS at EL1 */ + orr x0, x0, #(1 << 20) /* Enable TSCXT at EL1 */ + orr x0, x0, #(1 << 11) /* Enable EOS at EL1 */ + msr sctlr_el1, x0 + + /*=============================================================*/ + /* Initialize scr_el3 */ + /*=============================================================*/ + mov x0, xzr + orr x0, x0, #(1 << 10) /* Enable AARCH64 */ + orr x0, x0, #(1 << 9) /* Enable SIF */ + orr x0, x0, #(1 << 8) /* Enable HCE */ + orr x0, x0, #(1 << 7) /* Enable SMD */ + orr x0, x0, #(1 << 5) /* RES1[5:4] */ + orr x0, x0, #(1 << 4) + /* Disable FIQ routing */ + /* Disable IRQ routing */ + /* Disable NS */ + msr scr_el3, x0 + + /*=============================================================*/ + /* Initialize spsr_el3 */ + /*=============================================================*/ + mov x0, xzr + mov x0, #0b00101 /* AARCH64_EL1 */ + orr x0, x0, #(1 << 8) /* Enable SError and External Abort. */ + orr x0, x0, #(1 << 7) /* IRQ interrupt Process state mask. */ + orr x0, x0, #(1 << 6) /* FIQ interrupt Process state mask. */ + msr spsr_el3, x0 + + /*=============================================================*/ + /* Initialize elr_el3 */ + /* Jump to Secure EL1 from EL3. */ + /*=============================================================*/ + adr x0, .aarch64_code /* Exception return to aarch64_code */ + msr elr_el3, x0 + eret + +.aarch64_code: + ldr x1, =_start + mov sp, x1 + + /*=============================================================*/ + /* clear bbs */ + /*=============================================================*/ + ldr x1, =__bss_start + ldr w2, =__bss_size + +.L__clean_bss_loop: + cbz w2, .L__jump_to_entry + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, .L__clean_bss_loop + + /*=============================================================*/ + /* jump to C code */ + /*=============================================================*/ +.L__jump_to_entry: + + bl entry + + /*=============================================================*/ + /* for failsafe, halt this core too */ + /*=============================================================*/ + + b .L__current_cpu_idle diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/gic.c b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/gic.c new file mode 100644 index 0000000000..3559969042 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/gic.c @@ -0,0 +1,491 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2013-07-20 Bernard first version + * 2014-04-03 Grissiom many enhancements + * 2018-11-22 Jesven add rt_hw_ipi_send() + * add rt_hw_ipi_handler_install() + */ + +#include +#include + +#include "gic.h" +#include "cp15.h" + +struct arm_gic +{ + rt_uint32_t offset; /* the first interrupt index in the vector table */ + + rt_uint32_t dist_hw_base; /* the base address of the gic distributor */ + rt_uint32_t cpu_hw_base; /* the base addrees of the gic cpu interface */ +}; + +/* 'ARM_GIC_MAX_NR' is the number of cores */ +static struct arm_gic _gic_table[ARM_GIC_MAX_NR]; + +/** Macro to access the Generic Interrupt Controller Interface (GICC) +*/ +#define GIC_CPU_CTRL(hw_base) __REG32((hw_base) + 0x00U) +#define GIC_CPU_PRIMASK(hw_base) __REG32((hw_base) + 0x04U) +#define GIC_CPU_BINPOINT(hw_base) __REG32((hw_base) + 0x08U) +#define GIC_CPU_INTACK(hw_base) __REG32((hw_base) + 0x0cU) +#define GIC_CPU_EOI(hw_base) __REG32((hw_base) + 0x10U) +#define GIC_CPU_RUNNINGPRI(hw_base) __REG32((hw_base) + 0x14U) +#define GIC_CPU_HIGHPRI(hw_base) __REG32((hw_base) + 0x18U) +#define GIC_CPU_IIDR(hw_base) __REG32((hw_base) + 0xFCU) + +/** Macro to access the Generic Interrupt Controller Distributor (GICD) +*/ +#define GIC_DIST_CTRL(hw_base) __REG32((hw_base) + 0x000U) +#define GIC_DIST_TYPE(hw_base) __REG32((hw_base) + 0x004U) +#define GIC_DIST_IGROUP(hw_base, n) __REG32((hw_base) + 0x080U + ((n)/32U) * 4U) +#define GIC_DIST_ENABLE_SET(hw_base, n) __REG32((hw_base) + 0x100U + ((n)/32U) * 4U) +#define GIC_DIST_ENABLE_CLEAR(hw_base, n) __REG32((hw_base) + 0x180U + ((n)/32U) * 4U) +#define GIC_DIST_PENDING_SET(hw_base, n) __REG32((hw_base) + 0x200U + ((n)/32U) * 4U) +#define GIC_DIST_PENDING_CLEAR(hw_base, n) __REG32((hw_base) + 0x280U + ((n)/32U) * 4U) +#define GIC_DIST_ACTIVE_SET(hw_base, n) __REG32((hw_base) + 0x300U + ((n)/32U) * 4U) +#define GIC_DIST_ACTIVE_CLEAR(hw_base, n) __REG32((hw_base) + 0x380U + ((n)/32U) * 4U) +#define GIC_DIST_PRI(hw_base, n) __REG32((hw_base) + 0x400U + ((n)/4U) * 4U) +#define GIC_DIST_TARGET(hw_base, n) __REG32((hw_base) + 0x800U + ((n)/4U) * 4U) +#define GIC_DIST_CONFIG(hw_base, n) __REG32((hw_base) + 0xc00U + ((n)/16U) * 4U) +#define GIC_DIST_SOFTINT(hw_base) __REG32((hw_base) + 0xf00U) +#define GIC_DIST_CPENDSGI(hw_base, n) __REG32((hw_base) + 0xf10U + ((n)/4U) * 4U) +#define GIC_DIST_SPENDSGI(hw_base, n) __REG32((hw_base) + 0xf20U + ((n)/4U) * 4U) +#define GIC_DIST_ICPIDR2(hw_base) __REG32((hw_base) + 0xfe8U) + +static unsigned int _gic_max_irq; + +int arm_gic_get_active_irq(rt_uint32_t index) +{ + int irq; + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = GIC_CPU_INTACK(_gic_table[index].cpu_hw_base); + irq += _gic_table[index].offset; + return irq; +} + +void arm_gic_ack(rt_uint32_t index, int irq) +{ + rt_uint32_t mask = 1U << (irq % 32U); + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + GIC_DIST_PENDING_CLEAR(_gic_table[index].dist_hw_base, irq) = mask; + GIC_CPU_EOI(_gic_table[index].cpu_hw_base) = irq; +} + +void arm_gic_mask(rt_uint32_t index, int irq) +{ + rt_uint32_t mask = 1U << (irq % 32U); + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + GIC_DIST_ENABLE_CLEAR(_gic_table[index].dist_hw_base, irq) = mask; +} + +void arm_gic_umask(rt_uint32_t index, int irq) +{ + rt_uint32_t mask = 1U << (irq % 32U); + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + GIC_DIST_ENABLE_SET(_gic_table[index].dist_hw_base, irq) = mask; +} + +rt_uint32_t arm_gic_get_pending_irq(rt_uint32_t index, int irq) +{ + rt_uint32_t pend; + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + if (irq >= 16U) + { + pend = (GIC_DIST_PENDING_SET(_gic_table[index].dist_hw_base, irq) >> (irq % 32U)) & 0x1UL; + } + else + { + /* INTID 0-15 Software Generated Interrupt */ + pend = (GIC_DIST_SPENDSGI(_gic_table[index].dist_hw_base, irq) >> ((irq % 4U) * 8U)) & 0xFFUL; + /* No CPU identification offered */ + if (pend != 0U) + { + pend = 1U; + } + else + { + pend = 0U; + } + } + + return (pend); +} + +void arm_gic_set_pending_irq(rt_uint32_t index, int irq) +{ + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + if (irq >= 16U) + { + GIC_DIST_PENDING_SET(_gic_table[index].dist_hw_base, irq) = 1U << (irq % 32U); + } + else + { + /* INTID 0-15 Software Generated Interrupt */ + /* Forward the interrupt to the CPU interface that requested it */ + GIC_DIST_SOFTINT(_gic_table[index].dist_hw_base) = (irq | 0x02000000U); + } +} + +void arm_gic_clear_pending_irq(rt_uint32_t index, int irq) +{ + rt_uint32_t mask; + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + if (irq >= 16U) + { + mask = 1U << (irq % 32U); + GIC_DIST_PENDING_CLEAR(_gic_table[index].dist_hw_base, irq) = mask; + } + else + { + mask = 1U << ((irq % 4U) * 8U); + GIC_DIST_CPENDSGI(_gic_table[index].dist_hw_base, irq) = mask; + } +} + +void arm_gic_set_configuration(rt_uint32_t index, int irq, uint32_t config) +{ + rt_uint32_t icfgr; + rt_uint32_t shift; + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + icfgr = GIC_DIST_CONFIG(_gic_table[index].dist_hw_base, irq); + shift = (irq % 16U) << 1U; + + icfgr &= (~(3U << shift)); + icfgr |= (config << shift); + + GIC_DIST_CONFIG(_gic_table[index].dist_hw_base, irq) = icfgr; +} + +rt_uint32_t arm_gic_get_configuration(rt_uint32_t index, int irq) +{ + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + return (GIC_DIST_CONFIG(_gic_table[index].dist_hw_base, irq) >> ((irq % 16U) >> 1U)); +} + +void arm_gic_clear_active(rt_uint32_t index, int irq) +{ + rt_uint32_t mask = 1U << (irq % 32U); + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + GIC_DIST_ACTIVE_CLEAR(_gic_table[index].dist_hw_base, irq) = mask; +} + +/* Set up the cpu mask for the specific interrupt */ +void arm_gic_set_cpu(rt_uint32_t index, int irq, unsigned int cpumask) +{ + rt_uint32_t old_tgt; + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + old_tgt = GIC_DIST_TARGET(_gic_table[index].dist_hw_base, irq); + + old_tgt &= ~(0x0FFUL << ((irq % 4U) * 8U)); + old_tgt |= cpumask << ((irq % 4U) * 8U); + + GIC_DIST_TARGET(_gic_table[index].dist_hw_base, irq) = old_tgt; +} + +rt_uint32_t arm_gic_get_target_cpu(rt_uint32_t index, int irq) +{ + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + return (GIC_DIST_TARGET(_gic_table[index].dist_hw_base, irq) >> ((irq % 4U) * 8U)) & 0xFFUL; +} + +void arm_gic_set_priority(rt_uint32_t index, int irq, rt_uint32_t priority) +{ + rt_uint32_t mask; + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + mask = GIC_DIST_PRI(_gic_table[index].dist_hw_base, irq); + mask &= ~(0xFFUL << ((irq % 4U) * 8U)); + mask |= ((priority & 0xFFUL) << ((irq % 4U) * 8U)); + GIC_DIST_PRI(_gic_table[index].dist_hw_base, irq) = mask; +} + +rt_uint32_t arm_gic_get_priority(rt_uint32_t index, int irq) +{ + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + return (GIC_DIST_PRI(_gic_table[index].dist_hw_base, irq) >> ((irq % 4U) * 8U)) & 0xFFUL; +} + +void arm_gic_set_interface_prior_mask(rt_uint32_t index, rt_uint32_t priority) +{ + RT_ASSERT(index < ARM_GIC_MAX_NR); + + /* set priority mask */ + GIC_CPU_PRIMASK(_gic_table[index].cpu_hw_base) = priority & 0xFFUL; +} + +rt_uint32_t arm_gic_get_interface_prior_mask(rt_uint32_t index) +{ + RT_ASSERT(index < ARM_GIC_MAX_NR); + + return GIC_CPU_PRIMASK(_gic_table[index].cpu_hw_base); +} + +void arm_gic_set_binary_point(rt_uint32_t index, rt_uint32_t binary_point) +{ + GIC_CPU_BINPOINT(_gic_table[index].cpu_hw_base) = binary_point & 0x7U; +} + +rt_uint32_t arm_gic_get_binary_point(rt_uint32_t index) +{ + return GIC_CPU_BINPOINT(_gic_table[index].cpu_hw_base); +} + +rt_uint32_t arm_gic_get_irq_status(rt_uint32_t index, int irq) +{ + rt_uint32_t pending; + rt_uint32_t active; + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + active = (GIC_DIST_ACTIVE_SET(_gic_table[index].dist_hw_base, irq) >> (irq % 32U)) & 0x1UL; + pending = (GIC_DIST_PENDING_SET(_gic_table[index].dist_hw_base, irq) >> (irq % 32U)) & 0x1UL; + + return ((active << 1U) | pending); +} + +void arm_gic_send_sgi(rt_uint32_t index, int irq, rt_uint32_t target_list, rt_uint32_t filter_list) +{ + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + GIC_DIST_SOFTINT(_gic_table[index].dist_hw_base) = ((filter_list & 0x3U) << 24U) | ((target_list & 0xFFUL) << 16U) | (irq & 0x0FUL); +} + +rt_uint32_t arm_gic_get_high_pending_irq(rt_uint32_t index) +{ + RT_ASSERT(index < ARM_GIC_MAX_NR); + + return GIC_CPU_HIGHPRI(_gic_table[index].cpu_hw_base); +} + +rt_uint32_t arm_gic_get_interface_id(rt_uint32_t index) +{ + RT_ASSERT(index < ARM_GIC_MAX_NR); + + return GIC_CPU_IIDR(_gic_table[index].cpu_hw_base); +} + +void arm_gic_set_group(rt_uint32_t index, int irq, rt_uint32_t group) +{ + uint32_t igroupr; + uint32_t shift; + + RT_ASSERT(index < ARM_GIC_MAX_NR); + RT_ASSERT(group <= 1U); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + igroupr = GIC_DIST_IGROUP(_gic_table[index].dist_hw_base, irq); + shift = (irq % 32U); + igroupr &= (~(1U << shift)); + igroupr |= ((group & 0x1U) << shift); + + GIC_DIST_IGROUP(_gic_table[index].dist_hw_base, irq) = igroupr; +} + +rt_uint32_t arm_gic_get_group(rt_uint32_t index, int irq) +{ + RT_ASSERT(index < ARM_GIC_MAX_NR); + + irq = irq - _gic_table[index].offset; + RT_ASSERT(irq >= 0U); + + return (GIC_DIST_IGROUP(_gic_table[index].dist_hw_base, irq) >> (irq % 32U)) & 0x1UL; +} + +int arm_gic_dist_init(rt_uint32_t index, rt_uint32_t dist_base, int irq_start) +{ + unsigned int gic_type, i; + rt_uint32_t cpumask = 1U << 0U; + + RT_ASSERT(index < ARM_GIC_MAX_NR); + + _gic_table[index].dist_hw_base = dist_base; + _gic_table[index].offset = irq_start; + + /* Find out how many interrupts are supported. */ + gic_type = GIC_DIST_TYPE(dist_base); + _gic_max_irq = ((gic_type & 0x1fU) + 1U) * 32U; + + /* + * The GIC only supports up to 1020 interrupt sources. + * Limit this to either the architected maximum, or the + * platform maximum. + */ + if (_gic_max_irq > 1020U) + _gic_max_irq = 1020U; + if (_gic_max_irq > ARM_GIC_NR_IRQS) /* the platform maximum interrupts */ + _gic_max_irq = ARM_GIC_NR_IRQS; + + cpumask |= cpumask << 8U; + cpumask |= cpumask << 16U; + cpumask |= cpumask << 24U; + + GIC_DIST_CTRL(dist_base) = 0x0U; + + /* Set all global interrupts to be level triggered, active low. */ + for (i = 32U; i < _gic_max_irq; i += 16U) + GIC_DIST_CONFIG(dist_base, i) = 0x0U; + + /* Set all global interrupts to this CPU only. */ + for (i = 32U; i < _gic_max_irq; i += 4U) + GIC_DIST_TARGET(dist_base, i) = cpumask; + + /* Set priority on all interrupts. */ + for (i = 0U; i < _gic_max_irq; i += 4U) + GIC_DIST_PRI(dist_base, i) = 0xa0a0a0a0U; + + /* Disable all interrupts. */ + for (i = 0U; i < _gic_max_irq; i += 32U) + GIC_DIST_ENABLE_CLEAR(dist_base, i) = 0xffffffffU; + + /* Important: Below setting need be done in Secure world. */ + for (i = 0U; i < _gic_max_irq; i += 32U) + GIC_DIST_IGROUP(dist_base, i) = 0U; + + /* Enable group0 interrupt forwarding. */ + GIC_DIST_CTRL(dist_base) = 0x01U; + + return 0; +} + +int arm_gic_cpu_init(rt_uint32_t index, rt_uint32_t cpu_base) +{ + RT_ASSERT(index < ARM_GIC_MAX_NR); + + _gic_table[index].cpu_hw_base = cpu_base; + + GIC_CPU_PRIMASK(cpu_base) = 0xf0U; + GIC_CPU_BINPOINT(cpu_base) = 0x7U; + /* Enable CPU interrupt */ + GIC_CPU_CTRL(cpu_base) = 0x01U; + + return 0; +} + +void arm_gic_dump_type(rt_uint32_t index) +{ + unsigned int gic_type; + + gic_type = GIC_DIST_TYPE(_gic_table[index].dist_hw_base); + rt_kprintf("GICv%d on %p, max IRQs: %d, %s security extension(%08x)\n", + (GIC_DIST_ICPIDR2(_gic_table[index].dist_hw_base) >> 4U) & 0xfUL, + _gic_table[index].dist_hw_base, + _gic_max_irq, + gic_type & (1U << 10U) ? "has" : "no", + gic_type); +} + +void arm_gic_dump(rt_uint32_t index) +{ + unsigned int i, k; + + k = GIC_CPU_HIGHPRI(_gic_table[index].cpu_hw_base); + rt_kprintf("--- high pending priority: %d(%08x)\n", k, k); + rt_kprintf("--- hw mask ---\n"); + for (i = 0U; i < _gic_max_irq / 32U; i++) + { + rt_kprintf("0x%08x, ", + GIC_DIST_ENABLE_SET(_gic_table[index].dist_hw_base, + i * 32U)); + } + rt_kprintf("\n--- hw pending ---\n"); + for (i = 0U; i < _gic_max_irq / 32U; i++) + { + rt_kprintf("0x%08x, ", + GIC_DIST_PENDING_SET(_gic_table[index].dist_hw_base, + i * 32U)); + } + rt_kprintf("\n--- hw active ---\n"); + for (i = 0U; i < _gic_max_irq / 32U; i++) + { + rt_kprintf("0x%08x, ", + GIC_DIST_ACTIVE_SET(_gic_table[index].dist_hw_base, + i * 32U)); + } + rt_kprintf("\n"); +} + +long gic_dump(void) +{ + arm_gic_dump_type(0); + arm_gic_dump(0); + + return 0; +} +MSH_CMD_EXPORT(gic_dump, show gic status); + diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/gic.h b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/gic.h new file mode 100644 index 0000000000..c896442f8b --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/gic.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2013-07-20 Bernard first version + */ + +#ifndef __GIC_H__ +#define __GIC_H__ + +#include +#include + +int arm_gic_get_active_irq(rt_uint32_t index); +void arm_gic_ack(rt_uint32_t index, int irq); + +void arm_gic_mask(rt_uint32_t index, int irq); +void arm_gic_umask(rt_uint32_t index, int irq); + +rt_uint32_t arm_gic_get_pending_irq(rt_uint32_t index, int irq); +void arm_gic_set_pending_irq(rt_uint32_t index, int irq); +void arm_gic_clear_pending_irq(rt_uint32_t index, int irq); + +void arm_gic_set_configuration(rt_uint32_t index, int irq, uint32_t config); +rt_uint32_t arm_gic_get_configuration(rt_uint32_t index, int irq); + +void arm_gic_clear_active(rt_uint32_t index, int irq); + +void arm_gic_set_cpu(rt_uint32_t index, int irq, unsigned int cpumask); +rt_uint32_t arm_gic_get_target_cpu(rt_uint32_t index, int irq); + +void arm_gic_set_priority(rt_uint32_t index, int irq, rt_uint32_t priority); +rt_uint32_t arm_gic_get_priority(rt_uint32_t index, int irq); + +void arm_gic_set_interface_prior_mask(rt_uint32_t index, rt_uint32_t priority); +rt_uint32_t arm_gic_get_interface_prior_mask(rt_uint32_t index); + +void arm_gic_set_binary_point(rt_uint32_t index, rt_uint32_t binary_point); +rt_uint32_t arm_gic_get_binary_point(rt_uint32_t index); + +rt_uint32_t arm_gic_get_irq_status(rt_uint32_t index, int irq); + +void arm_gic_send_sgi(rt_uint32_t index, int irq, rt_uint32_t target_list, rt_uint32_t filter_list); + +rt_uint32_t arm_gic_get_high_pending_irq(rt_uint32_t index); + +rt_uint32_t arm_gic_get_interface_id(rt_uint32_t index); + +void arm_gic_set_group(rt_uint32_t index, int irq, rt_uint32_t group); +rt_uint32_t arm_gic_get_group(rt_uint32_t index, int irq); + +int arm_gic_dist_init(rt_uint32_t index, rt_uint32_t dist_base, int irq_start); +int arm_gic_cpu_init(rt_uint32_t index, rt_uint32_t cpu_base); + +void arm_gic_dump_type(rt_uint32_t index); +void arm_gic_dump(rt_uint32_t index); + +#endif + diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/gtimer.S b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/gtimer.S new file mode 100644 index 0000000000..ed18ae8d41 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/gtimer.S @@ -0,0 +1,44 @@ +#include "rtconfig.h" + +/* + *enable gtimer + */ +.globl gtimer_set_control +gtimer_set_control: + MSR CNTP_CTL_EL0, X0 + RET + +/* + *set gtimer CNTP_TVAL_EL0 value + */ + +.globl gtimer_set_load_value +gtimer_set_load_value: + MSR CNTP_TVAL_EL0,X0 + RET + +/* + *get gtimer CNTP_TVAL_EL0 value + */ +.globl rt_hw_get_gtimer_val +rt_hw_get_gtimer_val: + MRS X0,CNTP_TVAL_EL0 + RET + +.globl gtimer_get_current_value +gtimer_get_current_value: + MRS X0,CNTP_TVAL_EL0 + RET + +.globl rt_hw_get_cntpct_val +rt_hw_get_cntpct_val: + MRS X0, CNTPCT_EL0 + RET + +/* + *get gtimer frq value + */ +.globl gtimer_get_counter_frequency +gtimer_get_counter_frequency: + MRS X0,CNTFRQ_EL0 + RET diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/gtimer.h b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/gtimer.h new file mode 100644 index 0000000000..2e1f33df50 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/gtimer.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-03-30 huijie.feng first version + */ + +#ifndef __GTIMER_H__ +#define __GTIMER_H__ + +#include + +void gtimer_set_counter_frequency(rt_uint32_t value); +rt_uint32_t gtimer_get_counter_frequency(void); +void gtimer_set_load_value(rt_uint32_t value); +rt_uint32_t gtimer_get_current_value(void); +rt_uint64_t gtimer_get_current_physical_value(void); +void gtimer_set_physical_compare_value(rt_uint64_t value); +rt_uint64_t gtimer_get_physical_compare_value(void); +void gtimer_set_control(rt_uint32_t value); +rt_uint32_t gtimer_get_control(void); + +#endif + diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/interrupt.c b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/interrupt.c new file mode 100644 index 0000000000..756fea0d09 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/interrupt.c @@ -0,0 +1,285 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-16 bigmagic first version + */ + +#include +#include +#include +#include +#include + +#define MAX_HANDLERS 256 +#define GIC_ACK_INTID_MASK 0x000003ff + +#ifdef RT_USING_SMP + #define rt_interrupt_nest rt_cpu_self()->irq_nest +#else + extern volatile rt_uint8_t rt_interrupt_nest; +#endif + +/* exception and interrupt handler table */ +struct rt_irq_desc isr_table[MAX_HANDLERS]; + +#ifndef RT_USING_SMP + /* Those varibles will be accessed in ISR, so we need to share them. */ + rt_ubase_t rt_interrupt_from_thread; + rt_ubase_t rt_interrupt_to_thread; + rt_ubase_t rt_thread_switch_interrupt_flag; +#endif + +extern int system_vectors; + +void rt_hw_vector_init(void) +{ + rt_hw_set_current_vbar((rt_ubase_t)&system_vectors); // cpu_gcc.S +} + +/** + * This function will initialize hardware interrupt + */ +void rt_hw_interrupt_init(void) +{ + rt_uint32_t gic_cpu_base; + rt_uint32_t gic_dist_base; + rt_uint32_t gic_irq_start; + + /* initialize vector table */ + rt_hw_vector_init(); + + /* initialize exceptions table */ + rt_memset(isr_table, 0x00, sizeof(isr_table)); + /* initialize ARM GIC */ + gic_dist_base = GIC_DISTRIBUTOR_BASE; + gic_cpu_base = GIC_INTERFACE_BASE; + gic_irq_start = GIC_IRQ_START; + + arm_gic_dist_init(0, gic_dist_base, gic_irq_start); + arm_gic_cpu_init(0, gic_cpu_base); +} + +/** + * This function will mask a interrupt. + * @param vector the interrupt number + */ +void rt_hw_interrupt_mask(int vector) +{ + arm_gic_mask(0, vector); +} + +/** + * This function will un-mask a interrupt. + * @param vector the interrupt number + */ +void rt_hw_interrupt_umask(int vector) +{ + arm_gic_umask(0, vector); +} + +/** + * This function returns the active interrupt number. + * @param none + */ +int rt_hw_interrupt_get_irq(void) +{ + return arm_gic_get_active_irq(0); +} + +/** + * This function acknowledges the interrupt. + * @param vector the interrupt number + */ +void rt_hw_interrupt_ack(int vector) +{ + arm_gic_ack(0, vector); +} + +/** + * This function set interrupt CPU targets. + * @param vector: the interrupt number + * cpu_mask: target cpus mask, one bit for one core + */ +void rt_hw_interrupt_set_target_cpus(int vector, unsigned int cpu_mask) +{ + arm_gic_set_cpu(0, vector, cpu_mask); +} + +/** + * This function get interrupt CPU targets. + * @param vector: the interrupt number + * @return target cpus mask, one bit for one core + */ +unsigned int rt_hw_interrupt_get_target_cpus(int vector) +{ + return arm_gic_get_target_cpu(0, vector); +} + +/** + * This function set interrupt triger mode. + * @param vector: the interrupt number + * mode: interrupt triger mode; 0: level triger, 1: edge triger + */ +void rt_hw_interrupt_set_triger_mode(int vector, unsigned int mode) +{ + arm_gic_set_configuration(0, vector, mode); +} + +/** + * This function get interrupt triger mode. + * @param vector: the interrupt number + * @return interrupt triger mode; 0: level triger, 1: edge triger + */ +unsigned int rt_hw_interrupt_get_triger_mode(int vector) +{ + return arm_gic_get_configuration(0, vector); +} + +/** + * This function set interrupt pending flag. + * @param vector: the interrupt number + */ +void rt_hw_interrupt_set_pending(int vector) +{ + arm_gic_set_pending_irq(0, vector); +} + +/** + * This function get interrupt pending flag. + * @param vector: the interrupt number + * @return interrupt pending flag, 0: not pending; 1: pending + */ +unsigned int rt_hw_interrupt_get_pending(int vector) +{ + return arm_gic_get_pending_irq(0, vector); +} + +/** + * This function clear interrupt pending flag. + * @param vector: the interrupt number + */ +void rt_hw_interrupt_clear_pending(int vector) +{ + arm_gic_clear_pending_irq(0, vector); +} + +/** + * This function set interrupt priority value. + * @param vector: the interrupt number + * priority: the priority of interrupt to set + */ +void rt_hw_interrupt_set_priority(int vector, unsigned int priority) +{ + arm_gic_set_priority(0, vector, priority); +} + +/** + * This function get interrupt priority. + * @param vector: the interrupt number + * @return interrupt priority value + */ +unsigned int rt_hw_interrupt_get_priority(int vector) +{ + return arm_gic_get_priority(0, vector); +} + +/** + * This function set priority masking threshold. + * @param priority: priority masking threshold + */ +void rt_hw_interrupt_set_priority_mask(unsigned int priority) +{ + arm_gic_set_interface_prior_mask(0, priority); +} + +/** + * This function get priority masking threshold. + * @param none + * @return priority masking threshold + */ +unsigned int rt_hw_interrupt_get_priority_mask(void) +{ + return arm_gic_get_interface_prior_mask(0); +} + +/** + * This function set priority grouping field split point. + * @param bits: priority grouping field split point + * @return 0: success; -1: failed + */ +int rt_hw_interrupt_set_prior_group_bits(unsigned int bits) +{ + int status; + + if (bits < 8) + { + arm_gic_set_binary_point(0, (7 - bits)); + status = 0; + } + else + { + status = -1; + } + + return (status); +} + +/** + * This function get priority grouping field split point. + * @param none + * @return priority grouping field split point + */ +unsigned int rt_hw_interrupt_get_prior_group_bits(void) +{ + unsigned int bp; + + bp = arm_gic_get_binary_point(0) & 0x07; + + return (7 - bp); +} + +/** + * This function will install a interrupt service routine to a interrupt. + * @param vector the interrupt number + * @param new_handler the interrupt service routine to be installed + * @param old_handler the old interrupt service routine + */ +rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, + void *param, const char *name) +{ + rt_isr_handler_t old_handler = RT_NULL; + + if (vector < MAX_HANDLERS) + { + old_handler = isr_table[vector].handler; + + if (handler != RT_NULL) + { +#ifdef RT_USING_INTERRUPT_INFO + rt_strncpy(isr_table[vector].name, name, RT_NAME_MAX); +#endif /* RT_USING_INTERRUPT_INFO */ + isr_table[vector].handler = handler; + isr_table[vector].param = param; + } + } + + return old_handler; +} + +#ifdef RT_USING_SMP +void rt_hw_ipi_send(int ipi_vector, unsigned int cpu_mask) +{ + arm_gic_send_sgi(0, ipi_vector, cpu_mask, 0); +} + +void rt_hw_ipi_handler_install(int ipi_vector, rt_isr_handler_t ipi_isr_handler) +{ + /* note: ipi_vector maybe different with irq_vector */ + rt_hw_interrupt_install(ipi_vector, ipi_isr_handler, 0, "IPI_HANDLER"); +} +#endif + diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/interrupt.h b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/interrupt.h new file mode 100644 index 0000000000..27c62ad285 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/interrupt.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-16 bigmagic first version + */ + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#include +#include + +#define INT_IRQ 0x00 +#define INT_FIQ 0x01 + +void rt_hw_interrupt_init(void); +void rt_hw_interrupt_mask(int vector); +void rt_hw_interrupt_umask(int vector); + +int rt_hw_interrupt_get_irq(void); +void rt_hw_interrupt_ack(int vector); + +void rt_hw_interrupt_set_target_cpus(int vector, unsigned int cpu_mask); +unsigned int rt_hw_interrupt_get_target_cpus(int vector); + +void rt_hw_interrupt_set_triger_mode(int vector, unsigned int mode); +unsigned int rt_hw_interrupt_get_triger_mode(int vector); + +void rt_hw_interrupt_set_pending(int vector); +unsigned int rt_hw_interrupt_get_pending(int vector); +void rt_hw_interrupt_clear_pending(int vector); + +void rt_hw_interrupt_set_priority(int vector, unsigned int priority); +unsigned int rt_hw_interrupt_get_priority(int vector); + +void rt_hw_interrupt_set_priority_mask(unsigned int priority); +unsigned int rt_hw_interrupt_get_priority_mask(void); + +int rt_hw_interrupt_set_prior_group_bits(unsigned int bits); +unsigned int rt_hw_interrupt_get_prior_group_bits(void); + +rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, + void *param, const char *name); + +#ifdef RT_USING_SMP + void rt_hw_ipi_send(int ipi_vector, unsigned int cpu_mask); + void rt_hw_ipi_handler_install(int ipi_vector, rt_isr_handler_t ipi_isr_handler); +#endif + +#endif + diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/mmu.c b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/mmu.c new file mode 100644 index 0000000000..3ce9ab2641 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/mmu.c @@ -0,0 +1,371 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-02-20 bigmagic first version + * 2021-06-25 Wayne Support EL3 + */ +#include +#include +#include + +#define TTBR_CNP 1 + +typedef unsigned long int uint64_t; + +static unsigned long main_tbl[512 * 20] __attribute__((aligned(4096))); + +#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0) + +#define PMD_TYPE_SECT (1 << 0) + +#define PMD_TYPE_TABLE (3 << 0) + +#define PTE_TYPE_PAGE (3 << 0) + +#define BITS_PER_VA 39 + +/* Granule size of 4KB is being used */ +#define GRANULE_SIZE_SHIFT 12 +#define GRANULE_SIZE (1 << GRANULE_SIZE_SHIFT) +#define XLAT_ADDR_MASK ((1UL << BITS_PER_VA) - GRANULE_SIZE) + +#define PMD_TYPE_MASK (3 << 0) + +int free_idx = 1; + +void __asm_invalidate_icache_all(void); +void __asm_flush_dcache_all(void); +int __asm_flush_l3_cache(void); +void __asm_flush_dcache_range(unsigned long long start, unsigned long long end); +void __asm_invalidate_dcache_all(void); +void __asm_invalidate_icache_all(void); + +static void nonmmu_memset(char *dst, char v, size_t len) +{ + while (len--) + { + *dst++ = v; + } +} + +static unsigned long __page_off = 0; +static unsigned long get_free_page(void) +{ + __page_off += 512; + return (unsigned long)(main_tbl + __page_off); +} + + +static inline unsigned int get_sctlr(void) +{ + unsigned int val; + asm volatile("mrs %0, sctlr_el1" : "=r"(val) : : "cc"); + return val; +} + +static inline void set_sctlr(unsigned int val) +{ + asm volatile("msr sctlr_el1, %0" : : "r"(val) : "cc"); + asm volatile("isb"); +} + +void mmu_init(void) +{ + unsigned long val64; + unsigned long val32; + + val64 = 0x007f6eUL; + __asm__ volatile("msr MAIR_EL1, %0\n dsb sy\n"::"r"(val64)); + __asm__ volatile("mrs %0, MAIR_EL1\n dsb sy\n":"=r"(val64)); + + //TCR_EL1 + val32 = (16UL << 0)//48bit + | (0x0UL << 6) + | (0x0UL << 7) + | (0x3UL << 8) + | (0x3UL << 10)//Inner Shareable + | (0x2UL << 12) + | (0x0UL << 14)//4K + | (0x0UL << 16) + | (0x0UL << 22) + | (0x1UL << 23) + | (0x2UL << 30) + | (0x1UL << 32) + | (0x0UL << 35) + | (0x0UL << 36) + | (0x0UL << 37) + | (0x0UL << 38); + __asm__ volatile("msr TCR_EL1, %0\n"::"r"(val32)); + __asm__ volatile("mrs %0, TCR_EL1\n":"=r"(val32)); + + __asm__ volatile("msr TTBR0_EL1, %0\n dsb sy\n"::"r"(main_tbl)); + __asm__ volatile("mrs %0, TTBR0_EL1\n dsb sy\n":"=r"(val64)); + + nonmmu_memset((char *)main_tbl, 0, 4096); +} + +void mmu_enable(void) +{ + unsigned long val64; + unsigned long val32; + + __asm__ volatile("mrs %0, SCTLR_EL1\n":"=r"(val64)); + val64 &= ~0x1000; //disable I + __asm__ volatile("dmb sy\n msr SCTLR_EL1, %0\n isb sy\n"::"r"(val64)); + + __asm__ volatile("IC IALLUIS\n dsb sy\n isb sy\n"); + __asm__ volatile("tlbi vmalle1\n dsb sy\n isb sy\n"); + + //SCTLR_EL1, turn on mmu + __asm__ volatile("mrs %0, SCTLR_EL1\n":"=r"(val32)); + val32 |= 0x1005; //enable mmu, I C M + __asm__ volatile("dmb sy\n msr SCTLR_EL1, %0\nisb sy\n"::"r"(val32)); + rt_hw_icache_enable(); + rt_hw_dcache_enable(); + +} + +static int map_single_page_2M(unsigned long *lv0_tbl, unsigned long va, unsigned long pa, unsigned long attr) +{ + int level; + unsigned long *cur_lv_tbl = lv0_tbl; + unsigned long page; + unsigned long off; + int level_shift = 39; + + if (va & (0x200000UL - 1)) + { + return MMU_MAP_ERROR_VANOTALIGN; + } + if (pa & (0x200000UL - 1)) + { + return MMU_MAP_ERROR_PANOTALIGN; + } + for (level = 0; level < 2; level++) + { + off = (va >> level_shift); + off &= MMU_LEVEL_MASK; + if ((cur_lv_tbl[off] & 1) == 0) + { + page = get_free_page(); + if (!page) + { + return MMU_MAP_ERROR_NOPAGE; + } + nonmmu_memset((char *)page, 0, 4096); + cur_lv_tbl[off] = page | 0x3UL; + } + page = cur_lv_tbl[off]; + if (!(page & 0x2)) + { + //is block! error! + return MMU_MAP_ERROR_CONFLICT; + } + cur_lv_tbl = (unsigned long *)(page & 0x0000fffffffff000UL); + level_shift -= 9; + } + attr &= 0xfff0000000000ffcUL; + pa |= (attr | 0x1UL); //block + off = (va >> 21); + off &= MMU_LEVEL_MASK; + cur_lv_tbl[off] = pa; + return 0; +} + +int armv8_map_2M(unsigned long va, unsigned long pa, int count, unsigned long attr) +{ + int i; + int ret; + + if (va & (0x200000 - 1)) + { + return -1; + } + if (pa & (0x200000 - 1)) + { + return -1; + } + for (i = 0; i < count; i++) + { + ret = map_single_page_2M((unsigned long *)main_tbl, va, pa, attr); + va += 0x200000; + pa += 0x200000; + if (ret != 0) + { + return ret; + } + } + return 0; +} + +static void set_table(uint64_t *pt, uint64_t *table_addr) +{ + uint64_t val; + val = (0x3UL | (uint64_t)table_addr); + *pt = val; +} + +static uint64_t *create_table(void) +{ + uint64_t *new_table = (uint64_t *)((unsigned char *)&main_tbl[0] + free_idx * 4096); //+ free_idx * GRANULE_SIZE; + /* Mark all entries as invalid */ + nonmmu_memset((char *)new_table, 0, 4096); + free_idx++; + return new_table; +} + +static int pte_type(uint64_t *pte) +{ + return *pte & PMD_TYPE_MASK; +} + +static int level2shift(int level) +{ + /* Page is 12 bits wide, every level translates 9 bits */ + return (12 + 9 * (3 - level)); +} + +static uint64_t *get_level_table(uint64_t *pte) +{ + uint64_t *table = (uint64_t *)(*pte & XLAT_ADDR_MASK); + + if (pte_type(pte) != PMD_TYPE_TABLE) + { + table = create_table(); + set_table(pte, table); + } + return table; +} + +static void map_region(uint64_t virt, uint64_t phys, uint64_t size, uint64_t attr) +{ + uint64_t block_size = 0; + uint64_t block_shift = 0; + uint64_t *pte; + uint64_t idx = 0; + uint64_t addr = 0; + uint64_t *table = 0; + int level = 0; + + addr = virt; + while (size) + { + table = &main_tbl[0]; + for (level = 0; level < 4; level++) + { + block_shift = level2shift(level); + idx = addr >> block_shift; + idx = idx % 512; + block_size = (uint64_t)(1L << block_shift); + pte = table + idx; + + if (size >= block_size && IS_ALIGNED(addr, block_size)) + { + attr &= 0xfff0000000000ffcUL; + if (level != 3) + { + *pte = phys | (attr | 0x1UL); + } + else + { + *pte = phys | (attr | 0x3UL); + } + addr += block_size; + phys += block_size; + size -= block_size; + break; + } + table = get_level_table(pte); + } + } +} + +void armv8_map(unsigned long va, unsigned long pa, unsigned long size, unsigned long attr) +{ + map_region(va, pa, size, attr); +} + +void rt_hw_dcache_enable(void) +{ + if (!(get_sctlr() & CR_M)) + { + rt_kprintf("please init mmu!\n"); + } + else + { + set_sctlr(get_sctlr() | CR_C); + } +} + +void rt_hw_dcache_flush_all(void) +{ + int ret; + + __asm_flush_dcache_all(); + ret = __asm_flush_l3_cache(); + if (ret) + { + rt_kprintf("flushing dcache returns 0x%x\n", ret); + } + else + { + rt_kprintf("flushing dcache successfully.\n"); + } +} + +void rt_hw_dcache_flush_range(unsigned long start_addr, unsigned long size) +{ + __asm_flush_dcache_range(start_addr, start_addr + size); +} + +void rt_hw_dcache_invalidate_range(unsigned long start_addr, unsigned long size) +{ + __asm_flush_dcache_range(start_addr, start_addr + size); +} + +void rt_hw_cpu_dcache_clean_inv(unsigned long start_addr, unsigned long size) +{ + __asm_flush_dcache_range(start_addr, start_addr + size); +} + +void rt_hw_cpu_dcache_invalidate(void *start_addr, int size) +{ + rt_hw_dcache_invalidate_range((unsigned long)start_addr, (unsigned long)size); +} + +void rt_hw_dcache_invalidate_all(void) +{ + __asm_invalidate_dcache_all(); +} + +void rt_hw_dcache_disable(void) +{ + /* if cache isn't enabled no need to disable */ + if (!(get_sctlr() & CR_C)) + { + rt_kprintf("need enable cache!\n"); + return; + } + set_sctlr(get_sctlr() & ~CR_C); +} + +//icache +void rt_hw_icache_enable(void) +{ + __asm_invalidate_icache_all(); + set_sctlr(get_sctlr() | CR_I); +} + +void rt_hw_icache_invalidate_all(void) +{ + __asm_invalidate_icache_all(); +} + +void rt_hw_icache_disable(void) +{ + set_sctlr(get_sctlr() & ~CR_I); +} diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/mmu.h b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/mmu.h new file mode 100644 index 0000000000..8295116c08 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/mmu.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-02-20 bigmagic first version + */ + +#ifndef __MMU_H__ +#define __MMU_H__ + +/* + * CR1 bits (CP#15 CR1) + */ +#define CR_M (1 << 0) /* MMU enable */ +#define CR_A (1 << 1) /* Alignment abort enable */ +#define CR_C (1 << 2) /* Dcache enable */ +#define CR_W (1 << 3) /* Write buffer enable */ +#define CR_P (1 << 4) /* 32-bit exception handler */ +#define CR_D (1 << 5) /* 32-bit data address range */ +#define CR_L (1 << 6) /* Implementation defined */ +#define CR_B (1 << 7) /* Big endian */ +#define CR_S (1 << 8) /* System MMU protection */ +#define CR_R (1 << 9) /* ROM MMU protection */ +#define CR_F (1 << 10) /* Implementation defined */ +#define CR_Z (1 << 11) /* Implementation defined */ +#define CR_I (1 << 12) /* Icache enable */ +#define CR_V (1 << 13) /* Vectors relocated to 0xffff0000 */ +#define CR_RR (1 << 14) /* Round Robin cache replacement */ +#define CR_L4 (1 << 15) /* LDR pc can set T bit */ +#define CR_DT (1 << 16) +#define CR_IT (1 << 18) +#define CR_ST (1 << 19) +#define CR_FI (1 << 21) /* Fast interrupt (lower latency mode) */ +#define CR_U (1 << 22) /* Unaligned access operation */ +#define CR_XP (1 << 23) /* Extended page tables */ +#define CR_VE (1 << 24) /* Vectored interrupts */ +#define CR_EE (1 << 25) /* Exception (Big) Endian */ +#define CR_TRE (1 << 28) /* TEX remap enable */ +#define CR_AFE (1 << 29) /* Access flag enable */ +#define CR_TE (1 << 30) /* Thumb exception enable */ + +#define MMU_LEVEL_MASK 0x1ffUL +#define MMU_MAP_ERROR_VANOTALIGN -1 +#define MMU_MAP_ERROR_PANOTALIGN -2 +#define MMU_MAP_ERROR_NOPAGE -3 +#define MMU_MAP_ERROR_CONFLICT -4 + +#define MEM_ATTR_MEMORY ((0x1UL << 10) | (0x2UL << 8) | (0x0UL << 6) | (0x1UL << 2)) +#define MEM_ATTR_IO ((0x1UL << 10) | (0x2UL << 8) | (0x0UL << 6) | (0x2UL << 2)) + +#define BUS_ADDRESS(phys) (((phys) & ~0xC0000000) | 0xC0000000) + +void mmu_init(void); + +void mmu_enable(void); + +int armv8_map_2M(unsigned long va, unsigned long pa, int count, unsigned long attr); + +void armv8_map(unsigned long va, unsigned long pa, unsigned long size, unsigned long attr); + +//dcache +void rt_hw_dcache_enable(void); +void rt_hw_dcache_flush_all(void); +void rt_hw_dcache_flush_range(unsigned long start_addr, unsigned long size); +void rt_hw_dcache_invalidate_range(unsigned long start_addr, unsigned long size); +void rt_hw_dcache_invalidate_all(void); +void rt_hw_dcache_disable(void); + +//icache +void rt_hw_icache_enable(void); +void rt_hw_icache_invalidate_all(void); +void rt_hw_icache_disable(void); + + +#endif /*__MMU_H__*/ diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/secondary_cpu.c b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/secondary_cpu.c new file mode 100644 index 0000000000..bb1ab62974 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/secondary_cpu.c @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Date Author Notes + * 2021-06-17 Wayne the first version + */ + +#include +#include "board.h" +#include "gic.h" +#include "cp15.h" + +#ifdef RT_USING_SMP +#include "interrupt.h" + +extern int rt_hw_timer_init(void); +extern void secondary_cpu_start(void); + +/* + For core-1, core-2 and core-3. +*/ +void rt_hw_secondary_cpu_up(void) +{ + rt_uint32_t cpu_mask = 2; + rt_int32_t i; + + rt_cpu_dcache_clean_flush(); + rt_cpu_icache_flush(); + + rt_kprintf("rt_hw_secondary_cpu_up is processing \r\n"); + for (i = 1; i < RT_CPUS_NR, i != 4; i++) + { + rt_kprintf("Boot Core-%d\n", i); + //FPsci_CpuOn(1 << i, (rt_uint32_t)secondary_cpu_start); + cpu_mask <<= 1; + __SEV(); + __DSB(); + __ISB(); + + __DSB(); + rt_hw_ipi_send(RT_SCHEDULE_IPI, cpu_mask); + } +} + +void secondary_cpu_c_start(void) +{ + uint32_t id = rt_hw_cpu_id(); + rt_kprintf("cpu = 0x%08x\n", id); + + rt_hw_timer_init(); + + /* initialize vector table */ + rt_hw_vector_init(); + + rt_hw_spin_lock(&_cpus_lock); + + rt_hw_interrupt_set_priority(RT_SCHEDULE_IPI, 16); + rt_hw_interrupt_umask(RT_SCHEDULE_IPI); + + rt_system_scheduler_start(); +} + +void rt_hw_secondary_cpu_idle_exec(void) +{ + asm volatile("wfe" :: + : "memory", "cc"); +} + +#endif diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/stack.c b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/stack.c new file mode 100644 index 0000000000..5f41d391b4 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/stack.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2011-09-23 Bernard the first version + * 2011-10-05 Bernard add thumb mode + */ +#include +#include + +#include + +#define INITIAL_SPSR_EL3 (PSTATE_EL3 | SP_EL0) +#define INITIAL_SPSR_EL2 (PSTATE_EL2 | SP_EL0) +#define INITIAL_SPSR_EL1 (PSTATE_EL1 | SP_EL0) + +/** + * This function will initialize thread stack + * + * @param tentry the entry of thread + * @param parameter the parameter of entry + * @param stack_addr the beginning stack address + * @param texit the function will be called when thread exit + * + * @return stack address + */ +rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, + rt_uint8_t *stack_addr, void *texit) +{ + rt_ubase_t *stk; + rt_ubase_t current_el; + + stk = (rt_ubase_t *)stack_addr; + + *(--stk) = (rt_ubase_t) 11; /* X1 */ + *(--stk) = (rt_ubase_t) parameter; /* X0 */ + *(--stk) = (rt_ubase_t) 33; /* X3 */ + *(--stk) = (rt_ubase_t) 22; /* X2 */ + *(--stk) = (rt_ubase_t) 55; /* X5 */ + *(--stk) = (rt_ubase_t) 44; /* X4 */ + *(--stk) = (rt_ubase_t) 77; /* X7 */ + *(--stk) = (rt_ubase_t) 66; /* X6 */ + *(--stk) = (rt_ubase_t) 99; /* X9 */ + *(--stk) = (rt_ubase_t) 88; /* X8 */ + *(--stk) = (rt_ubase_t) 11; /* X11 */ + *(--stk) = (rt_ubase_t) 10; /* X10 */ + *(--stk) = (rt_ubase_t) 13; /* X13 */ + *(--stk) = (rt_ubase_t) 12; /* X12 */ + *(--stk) = (rt_ubase_t) 15; /* X15 */ + *(--stk) = (rt_ubase_t) 14; /* X14 */ + *(--stk) = (rt_ubase_t) 17; /* X17 */ + *(--stk) = (rt_ubase_t) 16; /* X16 */ + *(--stk) = (rt_ubase_t) 19; /* X19 */ + *(--stk) = (rt_ubase_t) 18; /* X18 */ + *(--stk) = (rt_ubase_t) 21; /* X21 */ + *(--stk) = (rt_ubase_t) 20; /* X20 */ + *(--stk) = (rt_ubase_t) 23; /* X23 */ + *(--stk) = (rt_ubase_t) 22; /* X22 */ + *(--stk) = (rt_ubase_t) 25; /* X25 */ + *(--stk) = (rt_ubase_t) 24; /* X24 */ + *(--stk) = (rt_ubase_t) 27; /* X27 */ + *(--stk) = (rt_ubase_t) 26; /* X26 */ + *(--stk) = (rt_ubase_t) 29; /* X29 */ + *(--stk) = (rt_ubase_t) 28; /* X28 */ + *(--stk) = (rt_ubase_t) 0; /* XZR - has no effect, used so there are an even number of registers. */ + *(--stk) = (rt_ubase_t) texit; /* X30 - procedure call link register. */ + + current_el = rt_hw_get_current_el(); + + if (current_el == 3) + { + *(--stk) = INITIAL_SPSR_EL3; + } + else if (current_el == 2) + { + *(--stk) = INITIAL_SPSR_EL2; + } + else + { + *(--stk) = INITIAL_SPSR_EL1; + } + + *(--stk) = (rt_ubase_t) tentry; /* Exception return address. */ + + /* return task's current stack address */ + return (rt_uint8_t *)stk; +} diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/trap.c b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/trap.c new file mode 100644 index 0000000000..a4f837c05d --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/trap.c @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Date Author Notes + * 2018-10-06 ZhaoXiaowei the first version + */ + +#include +#include + +#include "interrupt.h" +#include "armv8.h" + +extern struct rt_thread *rt_current_thread; +#ifdef RT_USING_FINSH + extern long list_thread(void); +#endif + +/** + * this function will show registers of CPU + * + * @param regs the registers point + */ +void rt_hw_show_register(struct rt_hw_exp_stack *regs) +{ + rt_kprintf("Execption:\n"); + rt_kprintf("r00:0x%16.16lx r01:0x%16.16lx r02:0x%16.16lx r03:0x%16.16lx\n", regs->x0, regs->x1, regs->x2, regs->x3); + rt_kprintf("r04:0x%16.16lx r05:0x%16.16lx r06:0x%16.16lx r07:0x%16.16lx\n", regs->x4, regs->x5, regs->x6, regs->x7); + rt_kprintf("r08:0x%16.16lx r09:0x%16.16lx r10:0x%16.16lx r11:0x%16.16lx\n", regs->x8, regs->x9, regs->x10, regs->x11); + rt_kprintf("r12:0x%16.16lx r13:0x%16.16lx r14:0x%16.16lx r15:0x%16.16lx\n", regs->x12, regs->x13, regs->x14, regs->x15); + rt_kprintf("r16:0x%16.16lx r17:0x%16.16lx r18:0x%16.16lx r19:0x%16.16lx\n", regs->x16, regs->x17, regs->x18, regs->x19); + rt_kprintf("r20:0x%16.16lx r21:0x%16.16lx r22:0x%16.16lx r23:0x%16.16lx\n", regs->x20, regs->x21, regs->x22, regs->x23); + rt_kprintf("r24:0x%16.16lx r25:0x%16.16lx r26:0x%16.16lx r27:0x%16.16lx\n", regs->x24, regs->x25, regs->x26, regs->x27); + rt_kprintf("r28:0x%16.16lx r29:0x%16.16lx r30:0x%16.16lx\n", regs->x28, regs->x29, regs->x30); + rt_kprintf("spsr:0x%16.16lx\n", regs->spsr); + rt_kprintf("return pc:0x%16.16lx\n", regs->pc); +} + +/** + * When comes across an instruction which it cannot handle, + * it takes the undefined instruction trap. + * + * @param regs system registers + * + * @note never invoke this function in application + */ +void rt_hw_trap_error(struct rt_hw_exp_stack *regs) +{ + rt_kprintf("error exception:\n"); + rt_hw_show_register(regs); +#ifdef RT_USING_FINSH + list_thread(); +#endif + rt_hw_cpu_shutdown(); +} + +#define GIC_ACK_INTID_MASK 0x000003ff + + +void rt_hw_trap_irq(void) +{ + void *param; + int ir; + rt_isr_handler_t isr_func; + extern struct rt_irq_desc isr_table[]; + + ir = rt_hw_interrupt_get_irq(); + if (ir == 1023) + { + /* Spurious interrupt */ + return; + } + + /* get interrupt service routine */ + isr_func = isr_table[ir].handler; +#ifdef RT_USING_INTERRUPT_INFO + isr_table[ir].counter++; +#endif + if (isr_func) + { + /* Interrupt for myself. */ + param = isr_table[ir].param; + /* turn to interrupt service routine */ + isr_func(ir, param); + } + + /* end of interrupt */ + rt_hw_interrupt_ack(ir); +} + +void rt_hw_trap_fiq(void) +{ + void *param; + int ir; + rt_isr_handler_t isr_func; + extern struct rt_irq_desc isr_table[]; + + ir = rt_hw_interrupt_get_irq(); + + /* get interrupt service routine */ + isr_func = isr_table[ir].handler; + if (isr_func) + { + param = isr_table[ir].param; + + /* turn to interrupt service routine */ + isr_func(ir, param); + } + + /* end of interrupt */ + rt_hw_interrupt_ack(ir); +} diff --git a/bsp/nuvoton/libraries/ma35/libcpu/aarch64/vector_gcc.S b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/vector_gcc.S new file mode 100644 index 0000000000..fc88cce7f8 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/aarch64/vector_gcc.S @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Date Author Notes + * 2018-10-06 ZhaoXiaowei the first version + */ + +.text + +.globl system_vectors +.globl vector_error +.globl vector_irq +.globl vector_fiq + +system_vectors: +.align 11 + .set VBAR, system_vectors + .org VBAR + // Exception from CurrentEL (EL1) with SP_EL0 (SPSEL=1) + .org (VBAR + 0x00 + 0) + B vector_error // Synchronous + .org (VBAR + 0x80 + 0) + B vector_irq // IRQ/vIRQ + .org (VBAR + 0x100 + 0) + B vector_fiq // FIQ/vFIQ + .org (VBAR + 0x180 + 0) + B vector_error // Error/vError + + // Exception from CurrentEL (EL1) with SP_ELn + .org (VBAR + 0x200 + 0) + B vector_error // Synchronous + .org (VBAR + 0x280 + 0) + B vector_irq // IRQ/vIRQ + .org (VBAR + 0x300 + 0) + B vector_fiq // FIQ/vFIQ + .org (VBAR + 0x380 + 0) + B vector_error + + // Exception from lower EL, aarch64 + .org (VBAR + 0x400 + 0) + B vector_error + .org (VBAR + 0x480 + 0) + B vector_error + .org (VBAR + 0x500 + 0) + B vector_error + .org (VBAR + 0x580 + 0) + B vector_error + + // Exception from lower EL, aarch32 + .org (VBAR + 0x600 + 0) + B vector_error + .org (VBAR + 0x680 + 0) + B vector_error + .org (VBAR + 0x700 + 0) + B vector_error + .org (VBAR + 0x780 + 0) + B vector_error + .org (VBAR + 0x800 + 0) + B vector_error diff --git a/bsp/nuvoton/libraries/ma35/libcpu/arm/SConscript b/bsp/nuvoton/libraries/ma35/libcpu/arm/SConscript new file mode 100644 index 0000000000..0bf1ca703a --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/arm/SConscript @@ -0,0 +1,17 @@ +# RT-Thread building script for bridge + +import os +from building import * + +Import('rtconfig') + +cwd = GetCurrentDir() +list = os.listdir(cwd) + +group = [] + +# cpu porting code files +if rtconfig.CPU in list: + group = group + SConscript(os.path.join(rtconfig.CPU, 'SConscript')) + +Return('group') diff --git a/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/SConscript b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/SConscript new file mode 100644 index 0000000000..337a027276 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/SConscript @@ -0,0 +1,14 @@ +# RT-Thread building script for component + +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') +CPPPATH = [cwd] +group = [] + +# USB driver constrain +group = DefineGroup('CPU', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/gtimer.c b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/gtimer.c new file mode 100644 index 0000000000..149230a00e --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/gtimer.c @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-03-30 huijie.feng first version + */ + +#include "cp15.h" +#include + +/** Set CNTFRQ + * This function assigns the given value to PL1 Physical Timer Counter Frequency Register (CNTFRQ). + * @param value: CNTFRQ Register value to set + */ +static inline void __set_cntfrq(rt_uint32_t value) +{ + __set_cp(15, 0, value, 14, 0, 0); +} + +/** Get CNTFRQ + * This function returns the value of the PL1 Physical Timer Counter Frequency Register (CNTFRQ). + * return CNTFRQ Register value + */ +static inline rt_uint32_t __get_cntfrq(void) +{ + rt_uint32_t result; + __get_cp(15, 0, result, 14, 0, 0); + return result; +} + +/** Set CNTP_TVAL + * This function assigns the given value to PL1 Physical Timer Value Register (CNTP_TVAL). + * param value: CNTP_TVAL Register value to set + */ +static inline void __set_cntp_tval(rt_uint32_t value) +{ + __set_cp(15, 0, value, 14, 2, 0); +} + +/** Get CNTP_TVAL + * This function returns the value of the PL1 Physical Timer Value Register (CNTP_TVAL). + * return CNTP_TVAL Register value + */ +static inline rt_uint32_t __get_cntp_tval(void) +{ + rt_uint32_t result; + __get_cp(15, 0, result, 14, 2, 0); + return result; +} + +/** Get CNTPCT + * This function returns the value of the 64 bits PL1 Physical Count Register (CNTPCT). + * return CNTPCT Register value + */ +static inline rt_uint64_t __get_cntpct(void) +{ + rt_uint64_t result; + __get_cp64(15, 0, result, 14); + return result; +} + +/** Set CNTP_CVAL + * This function assigns the given value to 64bits PL1 Physical Timer CompareValue Register (CNTP_CVAL). + * param value: CNTP_CVAL Register value to set +*/ +static inline void __set_cntp_cval(rt_uint64_t value) +{ + __set_cp64(15, 2, value, 14); +} + +/** Get CNTP_CVAL + * This function returns the value of the 64 bits PL1 Physical Timer CompareValue Register (CNTP_CVAL). + * return CNTP_CVAL Register value + */ +static inline rt_uint64_t __get_cntp_cval(void) +{ + rt_uint64_t result; + __get_cp64(15, 2, result, 14); + return result; +} + +/** Set CNTP_CTL + * This function assigns the given value to PL1 Physical Timer Control Register (CNTP_CTL). + * param value: CNTP_CTL Register value to set + */ +static inline void __set_cntp_ctl(rt_uint32_t value) +{ + __set_cp(15, 0, value, 14, 2, 1); +} + +/** Get CNTP_CTL register + * return CNTP_CTL Register value + */ +static inline rt_uint32_t __get_cntp_ctl(void) +{ + rt_uint32_t result; + __get_cp(15, 0, result, 14, 2, 1); + return result; +} + +/** Configures the frequency the timer shall run at. + * param value The timer frequency in Hz. + */ +void gtimer_set_counter_frequency(rt_uint32_t value) +{ + __set_cntfrq(value); + __asm__ volatile("isb 0xF":::"memory"); +} + +/** Get the frequency the timer shall run at. + * return timer frequency in Hz. + */ +rt_uint32_t gtimer_get_counter_frequency(void) +{ + return (__get_cntfrq()); +} + +/** Sets the reset value of the timer. + * param value: The value the timer is loaded with. + */ +void gtimer_set_load_value(rt_uint32_t value) +{ + __set_cntp_tval(value); + __asm__ volatile("isb 0xF":::"memory"); +} + +/** Get the current counter value. + * return Current counter value. + */ +rt_uint32_t gtimer_get_current_value(void) +{ + return (__get_cntp_tval()); +} + +/** Get the current physical counter value. + * return Current physical counter value. + */ +rt_uint64_t gtimer_get_current_physical_value(void) +{ + return (__get_cntpct()); +} + +/** Set the physical compare value. + * param value: New physical timer compare value. + */ +void gtimer_set_physical_compare_value(rt_uint64_t value) +{ + __set_cntp_cval(value); + __asm__ volatile("isb 0xF":::"memory"); +} + +/** Get the physical compare value. + * return Physical compare value. + */ +rt_uint64_t gtimer_get_physical_compare_value(void) +{ + return (__get_cntp_cval()); +} + +/** Configure the timer by setting the control value. + * param value: New timer control value. + */ +void gtimer_set_control(rt_uint32_t value) +{ + __set_cntp_ctl(value); + __asm__ volatile("isb 0xF":::"memory"); +} + +/** Get the control value. + * return Control value. + */ +rt_uint32_t gtimer_get_control(void) +{ + return (__get_cntp_ctl()); +} + diff --git a/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/gtimer.h b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/gtimer.h new file mode 100644 index 0000000000..2e1f33df50 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/gtimer.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-03-30 huijie.feng first version + */ + +#ifndef __GTIMER_H__ +#define __GTIMER_H__ + +#include + +void gtimer_set_counter_frequency(rt_uint32_t value); +rt_uint32_t gtimer_get_counter_frequency(void); +void gtimer_set_load_value(rt_uint32_t value); +rt_uint32_t gtimer_get_current_value(void); +rt_uint64_t gtimer_get_current_physical_value(void); +void gtimer_set_physical_compare_value(rt_uint64_t value); +rt_uint64_t gtimer_get_physical_compare_value(void); +void gtimer_set_control(rt_uint32_t value); +rt_uint32_t gtimer_get_control(void); + +#endif + diff --git a/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/pmu.c b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/pmu.c new file mode 100644 index 0000000000..0f1975dfc0 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/pmu.c @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ +#include +#include "pmu.h" + +void rt_hw_pmu_dump_feature(void) +{ + unsigned long reg; + + reg = rt_hw_pmu_get_control(); + rt_kprintf("ARM PMU Implementor: %c, ID code: %02x, %d counters\n", + reg >> 24, (reg >> 16) & 0xff, (reg >> 11) & 0x1f); + RT_ASSERT(ARM_PMU_CNTER_NR == ((reg >> 11) & 0x1f)); +} diff --git a/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/pmu.h b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/pmu.h new file mode 100644 index 0000000000..f8dcf1d584 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-a/pmu.h @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ +#ifndef __PMU_H__ +#define __PMU_H__ + +#include "board.h" + +/* Number of counters */ +#define ARM_PMU_CNTER_NR 4 + +enum rt_hw_pmu_event_type +{ + ARM_PMU_EVENT_PMNC_SW_INCR = 0x00, + ARM_PMU_EVENT_L1_ICACHE_REFILL = 0x01, + ARM_PMU_EVENT_ITLB_REFILL = 0x02, + ARM_PMU_EVENT_L1_DCACHE_REFILL = 0x03, + ARM_PMU_EVENT_L1_DCACHE_ACCESS = 0x04, + ARM_PMU_EVENT_DTLB_REFILL = 0x05, + ARM_PMU_EVENT_MEM_READ = 0x06, + ARM_PMU_EVENT_MEM_WRITE = 0x07, + ARM_PMU_EVENT_INSTR_EXECUTED = 0x08, + ARM_PMU_EVENT_EXC_TAKEN = 0x09, + ARM_PMU_EVENT_EXC_EXECUTED = 0x0A, + ARM_PMU_EVENT_CID_WRITE = 0x0B, +}; + +/* Enable bit */ +#define ARM_PMU_PMCR_E (0x01 << 0) +/* Event counter reset */ +#define ARM_PMU_PMCR_P (0x01 << 1) +/* Cycle counter reset */ +#define ARM_PMU_PMCR_C (0x01 << 2) +/* Cycle counter divider */ +#define ARM_PMU_PMCR_D (0x01 << 3) + +#ifdef __GNUC__ +rt_inline void rt_hw_pmu_enable_cnt(int divide64) +{ + unsigned long pmcr; + unsigned long pmcntenset; + + asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r"(pmcr)); + pmcr |= ARM_PMU_PMCR_E | ARM_PMU_PMCR_P | ARM_PMU_PMCR_C; + if (divide64) + pmcr |= ARM_PMU_PMCR_D; + else + pmcr &= ~ARM_PMU_PMCR_D; + asm volatile("mcr p15, 0, %0, c9, c12, 0" :: "r"(pmcr)); + + /* enable all the counters */ + pmcntenset = ~0; + asm volatile("mcr p15, 0, %0, c9, c12, 1" :: "r"(pmcntenset)); + /* clear overflows(just in case) */ + asm volatile("mcr p15, 0, %0, c9, c12, 3" :: "r"(pmcntenset)); +} + +rt_inline unsigned long rt_hw_pmu_get_control(void) +{ + unsigned long pmcr; + asm("mrc p15, 0, %0, c9, c12, 0" : "=r"(pmcr)); + return pmcr; +} + +rt_inline unsigned long rt_hw_pmu_get_ceid(void) +{ + unsigned long reg; + /* only PMCEID0 is supported, PMCEID1 is RAZ. */ + asm("mrc p15, 0, %0, c9, c12, 6" : "=r"(reg)); + return reg; +} + +rt_inline unsigned long rt_hw_pmu_get_cnten(void) +{ + unsigned long pmcnt; + asm("mrc p15, 0, %0, c9, c12, 1" : "=r"(pmcnt)); + return pmcnt; +} + +rt_inline void rt_hw_pmu_reset_cycle(void) +{ + unsigned long pmcr; + + asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r"(pmcr)); + pmcr |= ARM_PMU_PMCR_C; + asm volatile("mcr p15, 0, %0, c9, c12, 0" :: "r"(pmcr)); + asm volatile("isb"); +} + +rt_inline void rt_hw_pmu_reset_event(void) +{ + unsigned long pmcr; + + asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r"(pmcr)); + pmcr |= ARM_PMU_PMCR_P; + asm volatile("mcr p15, 0, %0, c9, c12, 0" :: "r"(pmcr)); + asm volatile("isb"); +} + +rt_inline unsigned long rt_hw_pmu_get_cycle(void) +{ + unsigned long cyc; + asm volatile("isb"); + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(cyc)); + return cyc; +} + +rt_inline void rt_hw_pmu_select_counter(int idx) +{ + RT_ASSERT(idx < ARM_PMU_CNTER_NR); + + asm volatile("mcr p15, 0, %0, c9, c12, 5" : : "r"(idx)); + /* Linux add an isb here, don't know why here. */ + asm volatile("isb"); +} + +rt_inline void rt_hw_pmu_select_event(int idx, + enum rt_hw_pmu_event_type eve) +{ + RT_ASSERT(idx < ARM_PMU_CNTER_NR); + + rt_hw_pmu_select_counter(idx); + asm volatile("mcr p15, 0, %0, c9, c13, 1" : : "r"(eve)); +} + +rt_inline unsigned long rt_hw_pmu_read_counter(int idx) +{ + unsigned long reg; + + rt_hw_pmu_select_counter(idx); + asm volatile("isb"); + asm volatile("mrc p15, 0, %0, c9, c13, 2" : "=r"(reg)); + return reg; +} + +rt_inline unsigned long rt_hw_pmu_get_ovsr(void) +{ + unsigned long reg; + asm volatile("isb"); + asm("mrc p15, 0, %0, c9, c12, 3" : "=r"(reg)); + return reg; +} + +rt_inline void rt_hw_pmu_clear_ovsr(unsigned long reg) +{ + asm("mcr p15, 0, %0, c9, c12, 3" : : "r"(reg)); + asm volatile("isb"); +} + +#endif + +void rt_hw_pmu_dump_feature(void); + +#endif /* end of include guard: __PMU_H__ */ + diff --git a/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-m4/SConscript b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-m4/SConscript new file mode 100644 index 0000000000..337a027276 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-m4/SConscript @@ -0,0 +1,14 @@ +# RT-Thread building script for component + +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') +CPPPATH = [cwd] +group = [] + +# USB driver constrain +group = DefineGroup('CPU', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-m4/interrupt.c b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-m4/interrupt.c new file mode 100644 index 0000000000..38ee902044 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-m4/interrupt.c @@ -0,0 +1,156 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-07-19 Wayne First version +* +******************************************************************************/ + +#include +#include "interrupt.h" + +#define NVIC_INT_OFFSET (16) +#define SYS_MAX_INT_SOURCE (IRQn_Max) + +static struct rt_irq_desc irq_desc[SYS_MAX_INT_SOURCE] = {0}; + +void rt_hw_interrupt_dummy_handler(int vector, void *param) +{ + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); + + RT_ASSERT(0); +} + +static uint32_t rt_hw_interrupt_current_irq(void) +{ + return ((SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) >> SCB_ICSR_VECTACTIVE_Pos); +} + +void ISR_Trapper(void) +{ + int irq; + + /* Enter interrupt */ + rt_interrupt_enter(); + + /* Get irq number */ + irq = rt_hw_interrupt_current_irq(); + if (irq >= SYS_MAX_INT_SOURCE) + { + rt_kprintf("Over interrupt range - %d!!!\n", irq); + goto exit_rt_interrupt_trap; + } + else if (irq_desc[irq].handler == RT_NULL) + { + rt_kprintf("Unhandled interrupt %d occurred!!!\n", irq); + goto exit_rt_interrupt_trap; + } + else + { + void *param; + rt_isr_handler_t isr_func; + + /* get interrupt service routine */ + isr_func = irq_desc[irq].handler; + param = irq_desc[irq].param; + + /* turn to interrupt service routine */ + isr_func(irq, param); + } + +#ifdef RT_USING_INTERRUPT_INFO + irq_desc[irq].counter ++; +#endif + +exit_rt_interrupt_trap: + + /* Enter interrupt */ + rt_interrupt_leave(); +} + +void rt_hw_interrupt_init(void) +{ + int i; + vu32 *vpu32Vector; + + /* Enter interrupt */ + rt_interrupt_enter(); + + /* Replace user-handler in RAM to ISR_Trapper */ + vpu32Vector = (vu32 *)SCB->VTOR; + for (i = NVIC_INT_OFFSET; i < IRQn_Max; i++) + { + vpu32Vector[i] = (uint32_t)ISR_Trapper; + } + + /* Initial all interrupt handler */ + for (i = 0; i < SYS_MAX_INT_SOURCE; i++) + { + rt_hw_interrupt_install(i, RT_NULL, RT_NULL, (char *)"dummy"); + rt_hw_interrupt_mask(i); + } + + NVIC_SetPriorityGrouping(7); + + /* Enter interrupt */ + rt_interrupt_leave(); +} + +rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, void *param, const char *name) +{ + rt_isr_handler_t old_handler = RT_NULL; + + if (vector > SYS_MAX_INT_SOURCE) + return RT_NULL; + + /* Set default priority IRQ_LEVEL_7 */ + //rt_hw_interrupt_set_priority(vector, IRQ_LEVEL_7); + + old_handler = irq_desc[vector + NVIC_INT_OFFSET].handler; + if (handler != RT_NULL) + { + irq_desc[vector + NVIC_INT_OFFSET].handler = (rt_isr_handler_t)handler; + irq_desc[vector + NVIC_INT_OFFSET].param = param; +#ifdef RT_USING_INTERRUPT_INFO + rt_snprintf(irq_desc[vector + NVIC_INT_OFFSET].name, RT_NAME_MAX - 1, "%s", name); + irq_desc[vector + NVIC_INT_OFFSET].counter = 0; +#endif + } + + return old_handler; +} + +/* Disable interrupt */ +void rt_hw_interrupt_mask(int vector) +{ + NVIC_DisableIRQ((IRQn_Type)vector); + NVIC_ClearPendingIRQ((IRQn_Type)vector); +} + +/* Enable interrupt */ +void rt_hw_interrupt_umask(int vector) +{ + NVIC_EnableIRQ((IRQn_Type)vector); +} + +#ifdef RT_USING_INTERRUPT_INFO +int list_interrupt(int argc, char **argv) +{ + int i; + + for (i = 0; i <= SYS_MAX_INT_SOURCE; i++) + { + if (irq_desc[i].handler != rt_hw_interrupt_dummy_handler) + { + rt_kprintf("[%d] %s: %d\n", i, irq_desc[i].name, irq_desc[i].counter); + } + } + + return 0; +} +MSH_CMD_EXPORT(list_interrupt, list registered interrupts); +#endif diff --git a/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-m4/interrupt.h b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-m4/interrupt.h new file mode 100644 index 0000000000..ff8ca32cba --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/libcpu/arm/cortex-m4/interrupt.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-07-16 Wayne First version + */ + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#include +#include + +#define INT_IRQ 0x00 +#define INT_FIQ 0x01 + +void rt_hw_interrupt_init(void); +void rt_hw_interrupt_mask(int vector); +void rt_hw_interrupt_umask(int vector); +rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, + void *param, const char *name); + +#endif + diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/Kconfig b/bsp/nuvoton/libraries/ma35/rtt_port/Kconfig new file mode 100644 index 0000000000..035e80155e --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/Kconfig @@ -0,0 +1,1119 @@ + config SOC_SERIES_MA35D1 + bool + select SOC_FAMILY_NUMICRO + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + + config USE_MA35D1_AARCH32 + bool + select ARCH_ARM_CORTEX_A + select RT_USING_GIC_V2 + select RT_USING_FPU + select ARCH_ARMV8 + select RT_SMP_AUTO_BOOT + + config USE_MA35D1_AARCH64 + bool + select ARCH_ARMV8 + + config USE_MA35D1_SUBM + bool + select ARCH_ARM_CORTEX_M4 + + config RT_USING_FPU + bool + + config BSP_USE_STDDRIVER_SOURCE + bool "Build StdDriver source" + default n + + menuconfig BSP_USING_PDMA + bool "Enable Peripheral Direct Memory Access Controller(PDMA)" + default y + + if BSP_USING_PDMA + config BSP_USING_PDMA0 + bool "Enable PDMA0" + depends on !USE_MA35D1_SUBM + + config BSP_USING_PDMA1 + bool "Enable PDMA1" + depends on !USE_MA35D1_SUBM + + config BSP_USING_PDMA2 + bool "Enable PDMA2" + + config BSP_USING_PDMA3 + bool "Enable PDMA3" + + config NU_PDMA_MEMFUN_ACTOR_MAX + int "Specify maximum mem actor for memfun" + range 1 4 + default 2 + endif + + config BSP_USING_GPIO + bool "Enable General Purpose I/O(GPIO)" + select RT_USING_PIN + default y + + menuconfig BSP_USING_GMAC + bool "Enable Ethernet Gigabit MAC Controller(GMAC)" + select RT_USING_LWIP + select RT_USING_NETDEV + depends on !USE_MA35D1_SUBM + + if BSP_USING_GMAC + config BSP_USING_GMAC0 + bool "Enable GMAC0" + + config BSP_USING_GMAC1 + bool "Enable GMAC1" + endif + + menuconfig BSP_USING_RTC + bool "Enable Real Time Clock(RTC)" + select RT_USING_RTC + + config NU_RTC_SUPPORT_IO_RW + bool "Support device RW entry" + depends on BSP_USING_RTC && RT_USING_RTC + + config NU_RTC_SUPPORT_MSH_CMD + bool "Support module shell command" + depends on BSP_USING_RTC && RT_USING_RTC + + menuconfig BSP_USING_ADC + bool "Enable Analog-to-Digital Converter(ADC)" + select RT_USING_ADC + depends on !USE_MA35D1_SUBM + + if BSP_USING_ADC + config BSP_USING_ADC_TOUCH + bool "Enable ADC Touching function" + select RT_USING_TOUCH + default y + endif + + menuconfig BSP_USING_CCAP + bool "Enable Camera Capture Interface Controller(CCAP)" + select RT_USING_PIN + depends on !USE_MA35D1_SUBM + + if BSP_USING_CCAP + config BSP_USING_CCAP0 + bool "Enable CCAP0" + config BSP_USING_CCAP1 + bool "Enable CCAP1" + endif + menuconfig BSP_USING_EADC + bool "Enable Enhanced Analog-to-Digital Converter(EADC)" + select RT_USING_ADC + + if BSP_USING_EADC + config BSP_USING_EADC0 + bool "Enable EADC0" + endif + + menuconfig BSP_USING_TMR + bool "Enable Timer Controller(TIMER)" + + if BSP_USING_TMR + + config BSP_USING_TIMER + bool + + config BSP_USING_TPWM + bool + + config BSP_USING_TMR0 + bool "Enable TIMER0" + depends on BSP_USING_TMR && !USE_MA35D1_SUBM + + if BSP_USING_TMR0 + choice + prompt "Select TIMER0 function mode" + + config BSP_USING_TIMER0 + select BSP_USING_TIMER + select RT_USING_HWTIMER + bool "Timer" + help + Choose this option if you need TIMER function mode. + + config BSP_USING_TPWM0 + select BSP_USING_TPWM + select RT_USING_PWM + bool "Timer PWM" + help + Choose this option if you need Timer PWM function mode. + + endchoice + endif + + config BSP_USING_TMR1 + bool "Enable TIMER1" + depends on BSP_USING_TMR && !USE_MA35D1_SUBM + + if BSP_USING_TMR1 + choice + prompt "Select TIMER1 function mode" + + config BSP_USING_TIMER1 + select BSP_USING_TIMER + select RT_USING_HWTIMER + bool "Timer" + help + Choose this option if you need TIMER function mode. + + config BSP_USING_TPWM1 + select BSP_USING_TPWM + select RT_USING_PWM + bool "Timer PWM" + help + Choose this option if you need Timer PWM function mode. + endchoice + endif + + config BSP_USING_TMR2 + bool "Enable TIMER2" + depends on BSP_USING_TMR + + if BSP_USING_TMR2 + choice + prompt "Select TIMER2 function mode" + + config BSP_USING_TIMER2 + select BSP_USING_TIMER + select RT_USING_HWTIMER + bool "Timer" + help + Choose this option if you need TIMER function mode. + + config BSP_USING_TPWM2 + select BSP_USING_TPWM + select RT_USING_PWM + bool "Timer PWM" + help + Choose this option if you need Timer PWM function mode. + endchoice + endif + + config BSP_USING_TMR3 + bool "Enable TIMER3" + depends on BSP_USING_TMR + + if BSP_USING_TMR3 + choice + prompt "Select TIMER3 function mode" + + config BSP_USING_TIMER3 + select BSP_USING_TIMER + select RT_USING_HWTIMER + bool "Timer" + help + Choose this option if you need TIMER function mode. + + config BSP_USING_TPWM3 + select BSP_USING_TPWM + select RT_USING_PWM + bool "Timer PWM" + help + Choose this option if you need Timer PWM function mode. + endchoice + endif + + config BSP_USING_TMR4 + bool "Enable TIMER4" + depends on BSP_USING_TMR + + if BSP_USING_TMR4 + choice + prompt "Select TIMER4 function mode" + + config BSP_USING_TIMER4 + select BSP_USING_TIMER + select RT_USING_HWTIMER + bool "Timer" + help + Choose this option if you need TIMER function mode. + + config BSP_USING_TPWM4 + select BSP_USING_TPWM + select RT_USING_PWM + bool "Timer PWM" + help + Choose this option if you need Timer PWM function mode. + + endchoice + endif + + config BSP_USING_TMR5 + bool "Enable TIMER5" + depends on BSP_USING_TMR + + if BSP_USING_TMR5 + choice + prompt "Select TIMER5 function mode" + + config BSP_USING_TIMER5 + select BSP_USING_TIMER + select RT_USING_HWTIMER + bool "Timer" + help + Choose this option if you need TIMER function mode. + + config BSP_USING_TPWM5 + select BSP_USING_TPWM + select RT_USING_PWM + bool "Timer PWM" + help + Choose this option if you need Timer PWM function mode. + + endchoice + endif + + config BSP_USING_TMR6 + bool "Enable TIMER6" + depends on BSP_USING_TMR + + if BSP_USING_TMR6 + choice + prompt "Select TIMER6 function mode" + + config BSP_USING_TIMER6 + select BSP_USING_TIMER + select RT_USING_HWTIMER + bool "Timer" + help + Choose this option if you need TIMER function mode. + + config BSP_USING_TPWM6 + select BSP_USING_TPWM + select RT_USING_PWM + bool "Timer PWM" + help + Choose this option if you need Timer PWM function mode. + + endchoice + endif + + + config BSP_USING_TMR7 + bool "Enable TIMER7" + depends on BSP_USING_TMR + + if BSP_USING_TMR7 + choice + prompt "Select TIMER7 function mode" + + config BSP_USING_TIMER7 + select BSP_USING_TIMER + select RT_USING_HWTIMER + bool "Timer" + help + Choose this option if you need TIMER function mode. + + config BSP_USING_TPWM7 + select BSP_USING_TPWM + select RT_USING_PWM + bool "Timer PWM" + help + Choose this option if you need Timer PWM function mode. + + endchoice + endif + + config BSP_USING_TMR8 + bool "Enable TIMER8" + depends on BSP_USING_TMR + + if BSP_USING_TMR8 + choice + prompt "Select TIMER8 function mode" + + config BSP_USING_TIMER8 + select BSP_USING_TIMER + select RT_USING_HWTIMER + bool "Timer" + help + Choose this option if you need TIMER function mode. + + config BSP_USING_TPWM8 + select BSP_USING_TPWM + select RT_USING_PWM + bool "Timer PWM" + help + Choose this option if you need Timer PWM function mode. + + endchoice + endif + + config BSP_USING_TMR9 + bool "Enable TIMER9" + depends on BSP_USING_TMR + + if BSP_USING_TMR9 + choice + prompt "Select TIMER9 function mode" + + config BSP_USING_TIMER9 + select BSP_USING_TIMER + select RT_USING_HWTIMER + bool "Timer" + help + Choose this option if you need TIMER function mode. + + config BSP_USING_TPWM9 + select BSP_USING_TPWM + select RT_USING_PWM + bool "Timer PWM" + help + Choose this option if you need Timer PWM function mode. + + endchoice + endif + + config BSP_USING_TMR10 + bool "Enable TIMER10" + depends on BSP_USING_TMR + + if BSP_USING_TMR10 + choice + prompt "Select TIMER10 function mode" + + config BSP_USING_TIMER10 + select BSP_USING_TIMER + select RT_USING_HWTIMER + bool "Timer" + help + Choose this option if you need TIMER function mode. + + config BSP_USING_TPWM10 + select BSP_USING_TPWM + select RT_USING_PWM + bool "Timer PWM" + help + Choose this option if you need Timer PWM function mode. + + endchoice + endif + + config BSP_USING_TMR11 + bool "Enable TIMER11" + depends on BSP_USING_TMR + + if BSP_USING_TMR11 + choice + prompt "Select TIMER11 function mode" + + config BSP_USING_TIMER11 + select BSP_USING_TIMER + select RT_USING_HWTIMER + bool "Timer" + help + Choose this option if you need TIMER function mode. + + config BSP_USING_TPWM11 + select BSP_USING_TPWM + select RT_USING_PWM + bool "Timer PWM" + help + Choose this option if you need Timer PWM function mode. + + endchoice + endif + + endif + + menuconfig BSP_USING_UART + bool "Enable Universal Asynchronous Receiver/Transmitters(UART)" + select RT_USING_SERIAL + + if BSP_USING_UART + config BSP_USING_UART0 + bool "Enable UART0" + depends on !USE_MA35D1_SUBM + + config BSP_USING_UART0_TX_DMA + bool "Enable UART0 TX DMA" + depends on BSP_USING_UART0 && RT_SERIAL_USING_DMA + + config BSP_USING_UART0_RX_DMA + bool "Enable UART0 RX DMA" + depends on BSP_USING_UART0 && RT_SERIAL_USING_DMA + + config BSP_USING_UART1 + bool "Enable UART1" + + config BSP_USING_UART1_TX_DMA + bool "Enable UART1 TX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + + config BSP_USING_UART1_RX_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + + config BSP_USING_UART2 + bool "Enable UART2" + + config BSP_USING_UART2_TX_DMA + bool "Enable UART2 TX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + + config BSP_USING_UART2_RX_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + + config BSP_USING_UART3 + bool "Enable UART3" + + config BSP_USING_UART3_TX_DMA + bool "Enable UART3 TX DMA" + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA + + config BSP_USING_UART3_RX_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA + + config BSP_USING_UART4 + bool "Enable UART4" + + config BSP_USING_UART4_TX_DMA + bool "Enable UART4 TX DMA" + depends on BSP_USING_UART4 && RT_SERIAL_USING_DMA + + config BSP_USING_UART4_RX_DMA + bool "Enable UART4 RX DMA" + depends on BSP_USING_UART4 && RT_SERIAL_USING_DMA + + config BSP_USING_UART5 + bool "Enable UART5" + + config BSP_USING_UART5_TX_DMA + bool "Enable UART5 TX DMA" + depends on BSP_USING_UART5 && RT_SERIAL_USING_DMA + + config BSP_USING_UART5_RX_DMA + bool "Enable UART5 RX DMA" + depends on BSP_USING_UART5 && RT_SERIAL_USING_DMA + + config BSP_USING_UART6 + bool "Enable UART6" + + config BSP_USING_UART6_TX_DMA + bool "Enable UART6 TX DMA" + depends on BSP_USING_UART6 && RT_SERIAL_USING_DMA + + config BSP_USING_UART6_RX_DMA + bool "Enable UART6 RX DMA" + depends on BSP_USING_UART6 && RT_SERIAL_USING_DMA + + config BSP_USING_UART7 + bool "Enable UART7" + + config BSP_USING_UART7_TX_DMA + bool "Enable UART7 TX DMA" + depends on BSP_USING_UART7 && RT_SERIAL_USING_DMA + + config BSP_USING_UART7_RX_DMA + bool "Enable UART7 RX DMA" + depends on BSP_USING_UART7 && RT_SERIAL_USING_DMA + + config BSP_USING_UART8 + bool "Enable UART8" + + config BSP_USING_UART8_TX_DMA + bool "Enable UART8 TX DMA" + depends on BSP_USING_UART8 && RT_SERIAL_USING_DMA + + config BSP_USING_UART8_RX_DMA + bool "Enable UART8 RX DMA" + depends on BSP_USING_UART8 && RT_SERIAL_USING_DMA + + config BSP_USING_UART9 + bool "Enable UART9" + + config BSP_USING_UART9_TX_DMA + bool "Enable UART9 TX DMA" + depends on BSP_USING_UART9 && RT_SERIAL_USING_DMA + + config BSP_USING_UART9_RX_DMA + bool "Enable UART9 RX DMA" + depends on BSP_USING_UART9 && RT_SERIAL_USING_DMA + + config BSP_USING_UART10 + bool "Enable UART10" + + config BSP_USING_UART10_TX_DMA + bool "Enable UART10 TX DMA" + depends on BSP_USING_UART10 && RT_SERIAL_USING_DMA + + config BSP_USING_UART10_RX_DMA + bool "Enable UART10 RX DMA" + depends on BSP_USING_UART10 && RT_SERIAL_USING_DMA + + config BSP_USING_UART11 + bool "Enable UART11" + + config BSP_USING_UART11_TX_DMA + bool "Enable UART11 TX DMA" + depends on BSP_USING_UART11 && RT_SERIAL_USING_DMA + + config BSP_USING_UART11_RX_DMA + bool "Enable UART11 RX DMA" + depends on BSP_USING_UART11 && RT_SERIAL_USING_DMA + + config BSP_USING_UART12 + bool "Enable UART12" + + config BSP_USING_UART12_TX_DMA + bool "Enable UART12 TX DMA" + depends on BSP_USING_UART12 && RT_SERIAL_USING_DMA + + config BSP_USING_UART12_RX_DMA + bool "Enable UART12 RX DMA" + depends on BSP_USING_UART12 && RT_SERIAL_USING_DMA + + config BSP_USING_UART13 + bool "Enable UART13" + + config BSP_USING_UART13_TX_DMA + bool "Enable UART13 TX DMA" + depends on BSP_USING_UART13 && RT_SERIAL_USING_DMA + + config BSP_USING_UART13_RX_DMA + bool "Enable UART13 RX DMA" + depends on BSP_USING_UART13 && RT_SERIAL_USING_DMA + + config BSP_USING_UART14 + bool "Enable UART14" + + config BSP_USING_UART14_TX_DMA + bool "Enable UART14 TX DMA" + depends on BSP_USING_UART14 && RT_SERIAL_USING_DMA + + config BSP_USING_UART14_RX_DMA + bool "Enable UART14 RX DMA" + depends on BSP_USING_UART14 && RT_SERIAL_USING_DMA + + config BSP_USING_UART15 + bool "Enable UART15" + + config BSP_USING_UART15_TX_DMA + bool "Enable UART15 TX DMA" + depends on BSP_USING_UART15 && RT_SERIAL_USING_DMA + + config BSP_USING_UART15_RX_DMA + bool "Enable UART15 RX DMA" + depends on BSP_USING_UART15 && RT_SERIAL_USING_DMA + + config BSP_USING_UART16 + bool "Enable UART16" + + config BSP_USING_UART16_TX_DMA + bool "Enable UART16 TX DMA" + depends on BSP_USING_UART16 && RT_SERIAL_USING_DMA + + config BSP_USING_UART16_RX_DMA + bool "Enable UART16 RX DMA" + depends on BSP_USING_UART16 && RT_SERIAL_USING_DMA + + endif + + menuconfig BSP_USING_I2C + bool "Enable I2C Serial Interface Controller(I2C)" + select RT_USING_I2C + + if BSP_USING_I2C + config BSP_USING_I2C0 + bool "Enable I2C0" + + config BSP_USING_I2C1 + bool "Enable I2C1" + + config BSP_USING_I2C2 + bool "Enable I2C2" + + config BSP_USING_I2C3 + bool "Enable I2C3" + + config BSP_USING_I2C4 + bool "Enable I2C4" + + config BSP_USING_I2C5 + bool "Enable I2C5" + + endif + + menuconfig BSP_USING_SDH + bool "Enable Secure Digital Host Controller(SDH)" + select RT_USING_DFS + select RT_USING_SDIO + depends on !USE_MA35D1_SUBM + + if BSP_USING_SDH + config BSP_USING_SDH0 + bool "Enable SDH0" + + config BSP_USING_SDH1 + bool "Enable SDH1" + endif + + menuconfig BSP_USING_CANFD + bool "Enable CAN with Flexible Data-rate(CAN FD)" + select RT_USING_CAN + + if BSP_USING_CANFD + config BSP_USING_CANFD0 + bool "Enable CANFD0" + + config BSP_USING_CANFD1 + bool "Enable CANFD1" + + config BSP_USING_CANFD2 + bool "Enable CANFD2" + + config BSP_USING_CANFD3 + bool "Enable CANFD3" + endif + + menuconfig BSP_USING_EPWM + bool "Enable EPWM Generator and Capture Timer(EPWM)" + + if BSP_USING_EPWM + + config BSP_USING_EPWM0 + bool "Enable EPWM0" + depends on BSP_USING_EPWM && !USE_MA35D1_SUBM + + config BSP_USING_EPWM_CAPTURE + bool + + if BSP_USING_EPWM0 + choice + prompt "Select EPWM0 function mode" + config BSP_USING_EPWM0_PWM + select RT_USING_PWM + bool "EPWM0 PWM" + help + Choose this option if you need PWM function mode. + + config BSP_USING_EPWM0_CAPTURE + select RT_USING_INPUT_CAPTURE + select BSP_USING_EPWM_CAPTURE + bool "EPWM0 CAPTURE" + help + Choose this option if you need PWM capture function mode. + endchoice + endif + + config BSP_USING_EPWM1 + bool "Enable EPWM1" + depends on BSP_USING_EPWM && !USE_MA35D1_SUBM + + if BSP_USING_EPWM1 + choice + prompt "Select EPWM1 function mode" + config BSP_USING_EPWM1_PWM + select RT_USING_PWM + bool "EPWM1 PWM" + help + Choose this option if you need PWM function mode. + + config BSP_USING_EPWM1_CAPTURE + select RT_USING_INPUT_CAPTURE + select BSP_USING_EPWM_CAPTURE + bool "EPWM1 CAPTURE" + help + Choose this option if you need PWM capture function mode. + endchoice + endif + + config BSP_USING_EPWM2 + bool "Enable EPWM2" + depends on BSP_USING_EPWM && !USE_MA35D1_SUBM + + if BSP_USING_EPWM2 + choice + prompt "Select EPWM2 function mode" + config BSP_USING_EPWM2_PWM + select RT_USING_PWM + bool "EPWM2 PWM" + help + Choose this option if you need PWM function mode. + + config BSP_USING_EPWM2_CAPTURE + select RT_USING_INPUT_CAPTURE + select BSP_USING_EPWM_CAPTURE + bool "EPWM2 CAPTURE" + help + Choose this option if you need PWM capture function mode. + endchoice + endif + + endif + + menuconfig BSP_USING_SPI + bool "Enable Serial Peripheral Interface(SPI)" + select RT_USING_SPI + + if BSP_USING_SPI + config BSP_USING_SPI_PDMA + bool + default n + + config BSP_USING_SPII2S + bool + + choice + prompt "Select SPI0 function mode" + config BSP_USING_SPI0_NONE + bool "NONE" + help + Choose this option if you need not SPI0. + + config BSP_USING_SPI0 + bool "Enable SPI0" + help + Choose this option if you need SPI function mode. + + config BSP_USING_SPII2S0 + select RT_USING_AUDIO + select BSP_USING_SPII2S + bool "Enable SPII2S0" + help + Choose this option if you need SPII2S function mode. + + endchoice + + if BSP_USING_SPI0 + config BSP_USING_SPI0_PDMA + bool "Enable PDMA for SPI0" + select BSP_USING_SPI_PDMA + depends on BSP_USING_SPI0 + endif + + choice + prompt "Select SPI1 function mode" + config BSP_USING_SPI1_NONE + bool "NONE" + help + Choose this option if you need not SPI1. + + config BSP_USING_SPI1 + bool "Enable SPI1" + help + Choose this option if you need SPI function mode. + + config BSP_USING_SPII2S1 + select RT_USING_AUDIO + select BSP_USING_SPII2S + bool "Enable SPII2S1" + help + Choose this option if you need SPII2S function mode. + + endchoice + + if BSP_USING_SPI1 + config BSP_USING_SPI1_PDMA + bool "Enable PDMA for SPI1" + select BSP_USING_SPI_PDMA + depends on BSP_USING_SPI1 + endif + + choice + prompt "Select SPI2 function mode" + config BSP_USING_SPI2_NONE + bool "NONE" + help + Choose this option if you need not SPI2. + + config BSP_USING_SPI2 + bool "Enable SPI2" + help + Choose this option if you need SPI function mode. + + config BSP_USING_SPII2S2 + select RT_USING_AUDIO + select BSP_USING_SPII2S + bool "Enable SPII2S2" + help + Choose this option if you need SPII2S function mode. + + endchoice + + if BSP_USING_SPI2 + config BSP_USING_SPI1_PDMA + bool "Enable PDMA for SPI2" + select BSP_USING_SPI_PDMA + depends on BSP_USING_SPI2 + endif + + choice + prompt "Select SPI3 function mode" + config BSP_USING_SPI3_NONE + bool "NONE" + help + Choose this option if you need not SPI3. + + config BSP_USING_SPI3 + bool "Enable SPI3" + help + Choose this option if you need SPI function mode. + + config BSP_USING_SPII2S3 + select RT_USING_AUDIO + select BSP_USING_SPII2S + bool "Enable SPII2S3" + help + Choose this option if you need SPII2S function mode. + + endchoice + + if BSP_USING_SPI3 + config BSP_USING_SPI3_PDMA + bool "Enable PDMA for SPI3" + select BSP_USING_SPI_PDMA + depends on BSP_USING_SPI3 + endif + + endif + + menuconfig BSP_USING_I2S + bool "Enable I2S Controller(I2S)" + select RT_USING_AUDIO + + if BSP_USING_I2S + config BSP_USING_I2S0 + bool "Enable I2S0" + + config BSP_USING_I2S1 + bool "Enable I2S1" + + config NU_I2S_DMA_FIFO_SIZE + int "DMA Buffer size of capture and playback" + range 2048 4096 + default 2048 + endif + + menuconfig BSP_USING_QSPI + bool "Enable Quad Serial Peripheral Interface(QSPI)" + select RT_USING_SPI + select RT_USING_QSPI + select BSP_USING_SPI + + if BSP_USING_QSPI + + config BSP_USING_QSPI_PDMA + bool + select BSP_USING_SPI_PDMA + default n + + config BSP_USING_QSPI0 + bool "Enable QSPI0" + + config BSP_USING_QSPI0_PDMA + bool "Enable PDMA for QSPI0" + select BSP_USING_QSPI_PDMA + depends on BSP_USING_QSPI0 + + config BSP_USING_QSPI1 + bool "Enable QSPI1" + + config BSP_USING_QSPI1_PDMA + bool "Enable PDMA for QSPI1" + select BSP_USING_QSPI_PDMA + depends on BSP_USING_QSPI1 + + endif + + menuconfig BSP_USING_SCUART + bool "Enable Smart Card Host Interface - UART(SCUART)" + + if BSP_USING_SCUART + config BSP_USING_SCUART0 + bool "Enable SCUART0" + + config BSP_USING_SCUART1 + bool "Enable SCUART1" + + endif + + menuconfig BSP_USING_ECAP + bool "Enable Enhanced Input Capture Timer(ECAP)" + select RT_USING_INPUT_CAPTURE + + if BSP_USING_ECAP + + config BSP_USING_ECAP0 + select RT_USING_INPUT_CAPTURE + bool "Enable ECAP0" + help + Choose this option if you need ECAP0. + + config BSP_USING_ECAP1 + select RT_USING_INPUT_CAPTURE + bool "Enable ECAP1" + help + Choose this option if you need ECAP1. + + config BSP_USING_ECAP2 + select RT_USING_INPUT_CAPTURE + bool "Enable ECAP2" + help + Choose this option if you need ECAP2. + + endif + + menuconfig BSP_USING_QEI + bool "Enable Quadrature Encoder Interface(QEI)" + + if BSP_USING_QEI + config BSP_USING_QEI0 + bool "Enable QEI0" + select RT_USING_PULSE_ENCODER + + config BSP_USING_QEI1 + bool "Enable QEI1" + select RT_USING_PULSE_ENCODER + + config BSP_USING_QEI2 + bool "Enable QEI2" + select RT_USING_PULSE_ENCODER + + endif + + menuconfig BSP_USING_SOFT_I2C + bool "Enable SOFT I2C" + + if BSP_USING_SOFT_I2C + config BSP_USING_SOFT_I2C0 + bool "Enable SOFT I2C0" + select RT_USING_I2C + select RT_USING_I2C_BITOPS + default n + + if BSP_USING_SOFT_I2C0 + config BSP_SOFT_I2C0_SCL_PIN + hex "Specify the pin index of SCL of SOFT I2C0" + range 0 0xDF + default 0x19 + + config BSP_SOFT_I2C0_SDA_PIN + hex "Specify the pin index of SDA of SOFT I2C0" + range 0 0xDF + default 0x18 + endif + + config BSP_USING_SOFT_I2C1 + bool "Enable SOFT I2C1" + select RT_USING_I2C + select RT_USING_I2C_BITOPS + default n + + if BSP_USING_SOFT_I2C1 + config BSP_SOFT_I2C1_SCL_PIN + hex "Specify the pin index of SCL of SOFT I2C1" + range 0 0xDF + default 0x0B + + config BSP_SOFT_I2C1_SDA_PIN + hex "Specify the pin index of SDA of SOFT I2C1" + range 0 0xDF + default 0x0A + endif + endif + + config BSP_USING_DISP + bool "Enable Display" + depends on !USE_MA35D1_SUBM + default y + + if BSP_USING_DISP + choice + prompt "Select Supported LCM panel" + default LCM_USING_FW070TFT_WSVGA + config LCM_USING_FW070TFT_WSVGA + bool "eDispLcd_1024x600(1024x600-RGB888)" + + config LCM_USING_FW070TFT_WVGA + bool "eDispLcd_800x480(800x480-RGB888)" + + config LCM_USING_FHD + bool "eDispLcd_1920x1080(1920x1080-RGB888)" + endchoice + + config DISP_USING_LCD_IDX + int + default 0 if LCM_USING_FW070TFT_WSVGA + default 1 if LCM_USING_FW070TFT_WVGA + default 2 if LCM_USING_FHD + + config BSP_LCD_BPP + int + default 32 if LCM_USING_FW070TFT_WSVGA + default 32 if LCM_USING_FW070TFT_WVGA + default 32 if LCM_USING_FHD + + config BSP_LCD_WIDTH + int + default 1024 if LCM_USING_FW070TFT_WSVGA + default 800 if LCM_USING_FW070TFT_WVGA + default 1920 if LCM_USING_FHD + + config BSP_LCD_HEIGHT + int + default 600 if LCM_USING_FW070TFT_WSVGA + default 480 if LCM_USING_FW070TFT_WVGA + default 1080 if LCM_USING_FHD + + config DISP_USING_OVERLAY + bool "Enable Overlay layer" + default n + endif + + config BSP_USING_WDT + bool "Enable Watchdog Timer(WDT)" + select RT_USING_WDT + default y + + if BSP_USING_WDT + config BSP_USING_WDT0 + bool "Enable WDT0" + select RT_USING_WATCHDOG + depends on !USE_MA35D1_SUBM + default n + + config BSP_USING_WDT1 + bool "Enable WDT1" + select RT_USING_WATCHDOG + depends on !USE_MA35D1_SUBM + default n + + config BSP_USING_WDT2 + bool "Enable WDT2" + select RT_USING_WATCHDOG + default n + endif + + config BSP_USING_EBI + bool "Enable External Bus Interface(EBI)" + default n + + config BSP_USING_USBH + bool "Enable USB Host Controller(USBH)" + select RT_USING_USB_HOST + select RT_USBH_MSTORAGE + depends on !USE_MA35D1_SUBM + + if BSP_USING_USBH + config BSP_USING_HSUSBH0 + bool "Enable HSUSBH0" + default y + + config BSP_USING_HSUSBH1 + bool "Enable HSUSBH1" + default y + endif diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/SConscript b/bsp/nuvoton/libraries/ma35/rtt_port/SConscript new file mode 100644 index 0000000000..8e375e6708 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/SConscript @@ -0,0 +1,21 @@ +# RT-Thread building script for component + +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) +src = Glob('*.c') + Glob('*.cpp') +CPPPATH = [cwd] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) + +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')) + +objs += group + +Return('objs') diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_adc.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_adc.c new file mode 100644 index 0000000000..1156803603 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_adc.c @@ -0,0 +1,615 @@ +/**************************************************************************//** +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-12-12 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_ADC) + +#include +#include "NuMicro.h" +#include "drv_sys.h" +#include "nu_bitutil.h" +#include "drv_adc.h" + +/* Private define ---------------------------------------------------------------*/ +#define DEF_ADC_TOUCH_SMPL_TICK 20 +#define TOUCH_MQ_LENGTH 64 + +/* Private Typedef --------------------------------------------------------------*/ +struct nu_adc +{ + struct rt_adc_device dev; + char *name; + ADC_T *base; + uint32_t bReset; + IRQn_Type irqn; + uint32_t rstidx; + uint32_t modid; + uint32_t chn_mask; + rt_sem_t m_psSem; + +#if defined(BSP_USING_ADC_TOUCH) + rt_touch_t psRtTouch; + rt_timer_t psRtTouchMenuTimer; + rt_mq_t m_pmqTouchXYZ; +#endif + + nu_adc_cb m_isr[eAdc_ISR_CNT]; + nu_adc_cb m_wkisr[eAdc_WKISR_CNT]; +}; +typedef struct nu_adc *nu_adc_t; + +#if defined(BSP_USING_ADC_TOUCH) +struct nu_adc_touch_data +{ + uint32_t u32X; + uint32_t u32Y; + uint32_t u32Z0; + uint32_t u32Z1; +}; +typedef struct nu_adc_touch_data *nu_adc_touch_data_t; +#endif + +/* Private functions ------------------------------------------------------------*/ +static rt_err_t nu_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled); +static rt_err_t nu_adc_convert(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value); +static rt_err_t _nu_adc_control(rt_device_t dev, int cmd, void *args); + +/* Public functions ------------------------------------------------------------*/ +int rt_hw_adc_init(void); + +/* Private variables ------------------------------------------------------------*/ + +static struct nu_adc g_sNuADC = +{ + .name = "adc", + .base = ADC0, + .bReset = 1, + .irqn = ADC0_IRQn, + .rstidx = ADC0_RST, + .modid = ADC_MODULE, + .chn_mask = 0 +}; + +static void nu_adc_isr(int vector, void *param) +{ + volatile rt_int32_t isr, wkisr; + nu_adc_t psNuAdc = (nu_adc_t)param; + rt_int32_t irqidx; + ADC_T *adc = psNuAdc->base; + + //rt_kprintf("[%s %d] CTL: %08x CONF:%08x IER:%08x ISR:%08x\n", __func__, __LINE__, adc->CTL, adc->CONF, adc->IER, adc->ISR); + + isr = adc->ISR; + wkisr = adc->WKISR; + + adc->ISR = isr; + + while ((irqidx = nu_ctz(isr)) < eAdc_ISR_CNT) + { + uint32_t u32IsrBitMask = 1 << irqidx ; + + if (psNuAdc->m_isr[irqidx].cbfunc != RT_NULL) + { + // rt_kprintf("[%s] %d %x\n", __func__, irqidx, psNuAdc->m_isr[irqidx].cbfunc); + psNuAdc->m_isr[irqidx].cbfunc(isr, psNuAdc->m_isr[irqidx].private_data); + } + + /* Clear sent bit */ + isr &= ~(u32IsrBitMask); + } //while + + while ((irqidx = nu_ctz(wkisr)) < eAdc_WKISR_CNT) + { + uint32_t u32IsrBitMask = 1 << irqidx ; + + if (psNuAdc->m_wkisr[irqidx].cbfunc != RT_NULL) + { + psNuAdc->m_wkisr[irqidx].cbfunc(wkisr, psNuAdc->m_wkisr[irqidx].private_data); + } + + wkisr &= ~(u32IsrBitMask); + } //while +} + +static rt_err_t _nu_adc_init(rt_device_t dev) +{ + nu_adc_t psNuAdc = (nu_adc_t)dev; + + /* ADC Engine Clock is set to freq Khz */ + CLK_SetModuleClock(psNuAdc->modid, 0, CLK_CLKDIV4_ADC(180)); // Set ADC clock rate to 9MHz + + /* Install interrupt service routine */ + rt_hw_interrupt_install(psNuAdc->irqn, nu_adc_isr, (void *)psNuAdc, psNuAdc->name); + + return RT_EOK; +} + +#define ADC_TOUCH_Z0_ACTIVE 20 +static int32_t AdcMenuStartCallback(uint32_t status, uint32_t userData) +{ + nu_adc_t psNuAdc = (nu_adc_t)userData; + +#if defined(BSP_USING_ADC_TOUCH) + ADC_T *adc = psNuAdc->base; + static struct nu_adc_touch_data point; + static rt_bool_t bDrop = RT_FALSE; + static uint32_t u32LastZ0 = 0xffffu; + + if (psNuAdc->psRtTouch != RT_NULL) + { + point.u32X = ADC_GET_CONVERSION_XDATA(adc); + point.u32Y = ADC_GET_CONVERSION_YDATA(adc); + + point.u32Z0 = ADC_GET_CONVERSION_Z1DATA(adc); + point.u32Z1 = ADC_GET_CONVERSION_Z2DATA(adc); + + //rt_kprintf("x=%d y=%d z0=%d z1=%d\n", point.u32X, point.u32Y, point.u32Z0, point.u32Z1); + /* Trigger next or not. */ + if (point.u32Z0 < ADC_TOUCH_Z0_ACTIVE) + { + /* Stop sampling procedure. */ + rt_timer_stop(g_sNuADC.psRtTouchMenuTimer); + + /* Re-start pendown detection */ + nu_adc_touch_detect(RT_TRUE); + + psNuAdc->bReset = 1; + + point.u32Z0 = point.u32Z1 = 0; + + bDrop = RT_TRUE; + } + else + { + bDrop = RT_FALSE; + } + + /* Notify upper layer. */ + if ((!bDrop || (u32LastZ0 > ADC_TOUCH_Z0_ACTIVE)) && rt_mq_send(psNuAdc->m_pmqTouchXYZ, (const void *)&point, sizeof(struct nu_adc_touch_data)) == RT_EOK) + { + rt_hw_touch_isr(psNuAdc->psRtTouch); + } + + u32LastZ0 = point.u32Z0; + } + else +#endif + { + rt_err_t result = rt_sem_release(psNuAdc->m_psSem); + RT_ASSERT(result == RT_EOK); + } + + return 0; +} + +#if defined(BSP_USING_ADC_TOUCH) + +static void nu_adc_touch_antiglitch(ADC_T *adc) +{ + int count = 10; + do + { + rt_hw_us_delay(1000); // 1ms + ADC_CLR_INT_FLAG(adc, adc->ISR); + if (adc->ISR == 0) + break; + } + while (count-- > 0); +} + +void nu_adc_touch_detect(rt_bool_t bStartDetect) +{ + nu_adc_t psNuAdc = (nu_adc_t)&g_sNuADC; + ADC_T *adc = psNuAdc->base; + + /* Disable interrupt */ + rt_hw_interrupt_mask(psNuAdc->irqn); + + ADC_POWER_DOWN(adc); + + /* Disable interrupt */ + ADC_DISABLE_INT(adc, ADC_IER_PEDEIEN_Msk | ADC_IER_MIEN_Msk); + nu_adc_touch_antiglitch(adc); + + if (bStartDetect == RT_TRUE) + { + /* Switch to PenDown detection mode */ + ADC_DETECT_PD_MODE(adc); + nu_adc_touch_antiglitch(adc); + + /* Enable interrupt */ + ADC_ENABLE_INT(adc, ADC_IER_PEDEIEN_Msk); + } + else + { + /* Switch to XY coordination converting mode */ + ADC_CONVERT_XY_MODE(adc); + nu_adc_touch_antiglitch(adc); + + /* Enable interrupt */ + ADC_ENABLE_INT(adc, ADC_IER_MIEN_Msk); + } + + ADC_POWER_ON(adc); + + /* Enable interrupt */ + rt_hw_interrupt_umask(psNuAdc->irqn); +} + +static int32_t PenDownCallback(uint32_t status, uint32_t userData) +{ + nu_adc_t psNuAdc = (nu_adc_t)userData; + return rt_timer_start(psNuAdc->psRtTouchMenuTimer); +} + +int32_t nu_adc_touch_read_xyz(uint32_t *bufX, uint32_t *bufY, uint32_t *bufZ0, uint32_t *bufZ1, int32_t dataCnt) +{ + int i; + struct nu_adc_touch_data value; + + for (i = 0 ; i < dataCnt; i++) + { + if (rt_mq_recv(g_sNuADC.m_pmqTouchXYZ, (void *)&value, sizeof(struct nu_adc_touch_data), 0) == -RT_ETIMEOUT) + break; + + bufX[i] = value.u32X; + bufY[i] = value.u32Y; + bufZ0[i] = value.u32Z0; + bufZ1[i] = value.u32Z1; + } + return i; +} + +rt_err_t nu_adc_touch_enable(rt_touch_t psRtTouch) +{ + nu_adc_t psNuAdc = (nu_adc_t)&g_sNuADC; + nu_adc_cb sNuAdcCb; + ADC_T *adc = psNuAdc->base; + + adc->CONF = 0x0; + + rt_adc_enable((rt_adc_device_t)psNuAdc, 4); //Channel number 4 + rt_adc_enable((rt_adc_device_t)psNuAdc, 5); //Channel number 5 + rt_adc_enable((rt_adc_device_t)psNuAdc, 6); //Channel number 6 + rt_adc_enable((rt_adc_device_t)psNuAdc, 7); //Channel number 7 + + /* Register touch device. */ + psNuAdc->psRtTouch = psRtTouch; + + /* Register PenDown callback. */ + sNuAdcCb.cbfunc = PenDownCallback; + sNuAdcCb.private_data = (rt_uint32_t)psNuAdc; + rt_memcpy(&psNuAdc->m_isr[eAdc_PEDEF], &sNuAdcCb, sizeof(nu_adc_cb)); + + nu_adc_touch_detect(RT_TRUE); + + return RT_EOK; +} + +rt_err_t nu_adc_touch_disable(void) +{ + nu_adc_t psNuAdc = (nu_adc_t)&g_sNuADC; + + nu_adc_touch_detect(RT_FALSE); + + _nu_adc_control((rt_device_t)psNuAdc, T_OFF, RT_NULL); + _nu_adc_control((rt_device_t)psNuAdc, Z_OFF, RT_NULL); + _nu_adc_control((rt_device_t)psNuAdc, PEDEF_OFF, RT_NULL); + + rt_adc_disable((rt_adc_device_t)psNuAdc, 4); //Channel number 4 + rt_adc_disable((rt_adc_device_t)psNuAdc, 5); //Channel number 5 + rt_adc_disable((rt_adc_device_t)psNuAdc, 6); //Channel number 6 + rt_adc_disable((rt_adc_device_t)psNuAdc, 7); //Channel number 7 + + return RT_EOK; +} + +static void nu_adc_touch_smpl(void *p) +{ + nu_adc_t psNuAdc = (nu_adc_t)p; + if (psNuAdc->bReset) + { + psNuAdc->bReset = 0; + nu_adc_touch_detect(RT_FALSE); + } + + /* Start conversion */ + ADC_START_CONV(psNuAdc->base); +} +#endif + +static rt_err_t _nu_adc_control(rt_device_t dev, int cmd, void *args) +{ + rt_err_t ret = RT_EINVAL ; + nu_adc_t psNuAdc = (nu_adc_t)dev; + ADC_T *adc = psNuAdc->base; + + nu_adc_cb_t psAdcCb = (nu_adc_cb_t)args; + + switch (cmd) + { + case START_MST: /* Menu Start Conversion */ + { + /* Enable interrupt */ + ADC_ENABLE_INT(adc, ADC_IER_MIEN_Msk); + + /* Start conversion */ + ADC_START_CONV(adc); + + /* Wait it done */ + ret = rt_sem_take(psNuAdc->m_psSem, RT_WAITING_FOREVER); + RT_ASSERT(ret == RT_EOK); + + /* Get data: valid data is 12-bit */ + if (args != RT_NULL) + *((uint32_t *)args) = ADC_GET_CONVERSION_DATA(adc, 0); + } + break; + + case WKT_ON: /* Enable Touch Wake Up */ + { + if (psAdcCb) + { + rt_memcpy(&psNuAdc->m_wkisr[eAdc_WPEDEF], psAdcCb, sizeof(nu_adc_cb)); + } + adc->CTL |= ADC_CTL_WKTEN_Msk; + adc->IER |= ADC_IER_WKTIEN_Msk; + + //TODO outpw(REG_SYS_WKUPSER, inpw(REG_SYS_WKUPSER) | (1 << 26)); + } + break; + + case WKT_OFF: /* Disable Touch Wake Up */ + { + adc->CTL &= ~ADC_CTL_WKTEN_Msk; + adc->IER &= ~ADC_IER_WKTIEN_Msk; + + //TODO outpw(REG_SYS_WKUPSER, inpw(REG_SYS_WKUPSER) & ~(1 << 26)); + } + break; + + case SWITCH_5WIRE_ON: /* Wire Mode Switch to 5-Wire */ + { + adc->CTL |= ADC_CTL_WMSWCH_Msk; + } + break; + + case SWITCH_5WIRE_OFF: /* Wire Mode Switch to 4-Wire */ + { + adc->CTL &= ~ADC_CTL_WMSWCH_Msk; + } + break; + + case T_ON: /* Enable Touch detection function */ + { + adc->CONF |= ADC_CONF_TEN_Msk; + } + break; + + case T_OFF: /* Disable Touch detection function */ + { + adc->CONF &= ~ADC_CONF_TEN_Msk; + } + break; + + case TAVG_ON: /* Enable Touch Mean average for X and Y function */ + { + adc->CONF |= ADC_CONF_TMAVDIS_Msk; + } + break; + + case TAVG_OFF: /* Disable Touch Mean average for X and Y function */ + { + adc->CONF &= ~ADC_CONF_TMAVDIS_Msk; + } + break; + + case Z_ON: /* Enable Press measure function */ + { + adc->CONF |= ADC_CONF_ZEN_Msk; + } + break; + + case Z_OFF: /* Disable Press measure function */ + { + adc->CONF &= ~ADC_CONF_ZEN_Msk; +#if defined(BSP_USING_ADC_TOUCH) + rt_mq_control(psNuAdc->m_pmqTouchXYZ, RT_IPC_CMD_RESET, RT_NULL); +#endif + } + break; + + case TZAVG_ON: /* Enable Pressure Mean average for Z1 and Z2 function */ + { + adc->CONF |= ADC_CONF_ZMAVDIS_Msk; + } + break; + + case TZAVG_OFF: /* Disable Pressure Mean average for Z1 and Z2 function */ + { + adc->CONF &= ~ADC_CONF_ZMAVDIS_Msk; + } + break; + + case NAC_ON: /* Enable Normal AD Conversion */ + { + adc->CONF |= (ADC_CONF_NACEN_Msk | ADC_CONF_REFSEL_AVDD33); + } + break; + + case NAC_OFF: /* Disable Normal AD Conversion */ + { + adc->CONF &= ~ADC_CONF_NACEN_Msk; + } + break; + + case SWITCH_CH: + { + int chn = (int)args; + if (chn >= ADC_CH_NUM) + { + return -ret; + } + adc->CONF &= ~ADC_CONF_CHSEL_Msk; + adc->CONF |= (chn << ADC_CONF_CHSEL_Pos); + } + break; + + default: + return -(ret); + } + + return RT_EOK; +} + +static rt_err_t _nu_adc_open(rt_device_t dev, rt_uint16_t oflag) +{ + nu_adc_t psNuAdc = (nu_adc_t)dev; + ADC_T *adc = psNuAdc->base; + + /* Enable ADC engine clock */ + CLK_EnableModuleClock(psNuAdc->modid); + + /* Reset the ADC IP */ + SYS_ResetModule(psNuAdc->modid); + + /* Enable ADC Power */ + ADC_POWER_ON(adc); + + /* Enable ADC to high speed mode */ + adc->CONF |= ADC_CONF_SPEED_Msk; + + /* Enable interrupt */ + rt_hw_interrupt_umask(psNuAdc->irqn); + + /* Enable Normal AD Conversion */ + _nu_adc_control(dev, NAC_ON, RT_NULL); + + return RT_EOK; +} + +static rt_err_t _nu_adc_close(rt_device_t dev) +{ + nu_adc_t psNuAdc = (nu_adc_t)dev; + ADC_T *adc = psNuAdc->base; + + /* Disable Normal AD Conversion */ + _nu_adc_control(dev, NAC_OFF, RT_NULL); + + /* Disable interrupt */ + rt_hw_interrupt_mask(psNuAdc->irqn); + + /* Disable ADC Power */ + ADC_POWER_DOWN(adc); + + /* Disable ADC engine clock */ + CLK_DisableModuleClock(psNuAdc->modid); + + return RT_EOK; +} + +static const struct rt_adc_ops nu_adc_ops = +{ + nu_adc_enabled, + nu_adc_convert, +}; + +/* nu_adc_enabled - Enable ADC clock and wait for ready */ +static rt_err_t nu_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled) +{ + nu_adc_t psNuADC = (nu_adc_t)device; + RT_ASSERT(device); + + if (channel >= ADC_CH_NUM) + return -(RT_EINVAL); + + if (enabled) + { + psNuADC->chn_mask |= (1 << channel); + } + else + { + psNuADC->chn_mask &= ~(1 << channel); + } + + if (psNuADC->chn_mask > 0 && ((rt_device_t)device)->ref_count == 0) + { + _nu_adc_open((rt_device_t)device, 0); + ((rt_device_t)device)->ref_count = 1; + } + else if ((psNuADC->chn_mask == 0) && ((rt_device_t)device)->ref_count == 1) + { + _nu_adc_close((rt_device_t)device); + ((rt_device_t)device)->ref_count = 0; + } + return RT_EOK; +} + +static rt_err_t nu_adc_convert(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value) +{ + rt_err_t ret = RT_EOK; + + RT_ASSERT(device); + RT_ASSERT(value); + + if (channel >= ADC_CH_NUM) + { + ret = RT_EINVAL; + goto exit_nu_adc_convert; + } + else if ((ret = _nu_adc_control((rt_device_t)device, SWITCH_CH, (void *)channel)) != RT_EOK) + { + goto exit_nu_adc_convert; + } + else if ((ret = _nu_adc_control((rt_device_t)device, START_MST, (void *)value)) != RT_EOK) + { + goto exit_nu_adc_convert; + } + +exit_nu_adc_convert: + + return (-ret) ; +} + +int rt_hw_adc_init(void) +{ + rt_err_t result = RT_ERROR; + rt_device_t psDev = &g_sNuADC.dev.parent; + + result = rt_hw_adc_register(&g_sNuADC.dev, g_sNuADC.name, &nu_adc_ops, &g_sNuADC); + RT_ASSERT(result == RT_EOK); + + result = _nu_adc_init(psDev); + RT_ASSERT(result == RT_EOK); + + g_sNuADC.m_psSem = rt_sem_create("adc_mst_sem", 0, RT_IPC_FLAG_FIFO); + RT_ASSERT(g_sNuADC.m_psSem); + +#if defined(BSP_USING_ADC_TOUCH) + g_sNuADC.m_pmqTouchXYZ = rt_mq_create("ADC_TOUCH_XYZ", sizeof(struct nu_adc_touch_data), TOUCH_MQ_LENGTH, RT_IPC_FLAG_FIFO); + RT_ASSERT(g_sNuADC.m_pmqTouchXYZ); + + g_sNuADC.psRtTouchMenuTimer = rt_timer_create("TOUCH_SMPL_TIMER", nu_adc_touch_smpl, (void *)&g_sNuADC, DEF_ADC_TOUCH_SMPL_TICK, RT_TIMER_FLAG_PERIODIC); + RT_ASSERT(g_sNuADC.psRtTouchMenuTimer); +#endif + + rt_memset(&g_sNuADC.m_isr, 0, sizeof(g_sNuADC.m_isr)); + rt_memset(&g_sNuADC.m_wkisr, 0, sizeof(g_sNuADC.m_wkisr)); + + g_sNuADC.m_isr[eAdc_MF].cbfunc = AdcMenuStartCallback; + g_sNuADC.m_isr[eAdc_MF].private_data = (uint32_t)&g_sNuADC; + + return (int)result; +} +INIT_BOARD_EXPORT(rt_hw_adc_init); + +#endif //#if defined(BSP_USING_ADC) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_adc.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_adc.h new file mode 100644 index 0000000000..1ccba61d18 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_adc.h @@ -0,0 +1,63 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-4-7 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_ADC_H__ +#define __DRV_ADC_H__ + +#include +#include "nu_adc.h" + +#if defined(BSP_USING_ADC_TOUCH) + #include "touch.h" +#endif + +typedef enum +{ + eAdc_MF, //0 + eAdc_KPEF, //1 + eAdc_PEDEF, //2 + eAdc_KPUEF, //3 + eAdc_PEUEF, //4 + eAdc_TF = 8, //8 + eAdc_ZF, //9 + eAdc_NACF, //10 + eAdc_VBF, //11 + eAdc_KPCF, //12 + eAdc_SELFTF, //13 + eAdc_INTKP = 16, //16 + eAdc_INTTC, //17 + eAdc_ISR_CNT //18 +} E_ADC_ISR_EVENT; + +typedef enum +{ + eAdc_WKPEF, + eAdc_WPEDEF, + eAdc_WKISR_CNT +} E_ADC_WKISR_EVENT; + +typedef struct +{ + ADC_CALLBACK cbfunc; + uint32_t private_data; +} nu_adc_cb; + +typedef nu_adc_cb *nu_adc_cb_t; + +#if defined(BSP_USING_ADC_TOUCH) + void nu_adc_touch_detect(rt_bool_t bStartDetect); + int32_t nu_adc_touch_read_xyz(uint32_t *bufX, uint32_t *bufY, uint32_t *bufZ0, uint32_t *bufZ1, int32_t dataCnt); + rt_err_t nu_adc_touch_enable(rt_touch_t psRtTouch); + rt_err_t nu_adc_touch_disable(void); +#endif + +#endif /* __DRV_ADC_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_canfd.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_canfd.c new file mode 100644 index 0000000000..a8a2914b77 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_canfd.c @@ -0,0 +1,660 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-4-27 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_CANFD) + +#include +#include + +#include "drv_sys.h" +#include "drv_common.h" +#include "nu_bitutil.h" + +#define LOG_TAG "drv.canfd" +#undef DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_ERROR +#define DBG_COLOR +#include + +/* Private Define ---------------------------------------------------------------*/ +#define IS_CAN_STDID(STDID) ((STDID) <= 0x7FFU) +#define IS_CAN_EXTID(EXTID) ((EXTID) <= 0x1FFFFFFFU) +#define IS_CAN_DLC(DLC) ((DLC) <= 8U) + +/* Default config for serial_configure structure */ +#define NU_CANFD_CONFIG_DEFAULT \ +{ \ + CAN1MBaud, /* 1M bits/s */ \ + RT_CANMSG_BOX_SZ, /* message box max size */ \ + RT_CANSND_BOX_NUM, /* message box number */ \ + RT_CAN_MODE_NORMAL, /* Normal mode */ \ + 0, /* privmode */ \ + 0, /* reserved */ \ + 100, /* Timeout Tick */ \ +} + +enum +{ + CANFD_START = -1, +#if defined(BSP_USING_CANFD0) + CANFD0_IDX, +#endif +#if defined(BSP_USING_CANFD1) + CANFD1_IDX, +#endif +#if defined(BSP_USING_CANFD2) + CANFD2_IDX, +#endif +#if defined(BSP_USING_CANFD3) + CANFD3_IDX, +#endif + CANFD_CNT +}; + +/* Private Typedef --------------------------------------------------------------*/ +struct nu_canfd +{ + struct rt_can_device dev; + char *name; + CANFD_T *base; + uint32_t rstidx; + IRQn_Type irqn0; + IRQn_Type irqn1; + uint32_t int_flag; + CANFD_FD_T sCANFD_Config; +}; +typedef struct nu_canfd *nu_canfd_t; + +/* Private functions ------------------------------------------------------------*/ +static rt_err_t nu_canfd_configure(struct rt_can_device *can, struct can_configure *cfg); +static rt_err_t nu_canfd_control(struct rt_can_device *can, int cmd, void *arg); +static int nu_canfd_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno); +static int nu_canfd_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno); + +static struct nu_canfd nu_canfd_arr[] = +{ +#if defined(BSP_USING_CANFD0) + { + .name = "canfd0", + .base = CANFD0, + .rstidx = CANFD0_RST, + .irqn0 = CANFD00_IRQn, + .irqn1 = CANFD01_IRQn, + }, +#endif +#if defined(BSP_USING_CANFD1) + { + .name = "canfd1", + .base = CANFD1, + .rstidx = CANFD1_RST, + .irqn0 = CANFD10_IRQn, + .irqn1 = CANFD11_IRQn, + }, +#endif +#if defined(BSP_USING_CANFD2) + { + .name = "canfd2", + .base = CANFD2, + .rstidx = CANFD2_RST, + .irqn0 = CANFD20_IRQn, + .irqn1 = CANFD21_IRQn, + }, +#endif +#if defined(BSP_USING_CANFD3) + { + .name = "canfd3", + .base = CANFD3, + .rstidx = CANFD3_RST, + .irqn0 = CANFD30_IRQn, + .irqn1 = CANFD31_IRQn, + }, +#endif +}; /* struct nu_can */ + +/* Public functions ------------------------------------------------------------*/ + +/* Private variables ------------------------------------------------------------*/ +static const struct rt_can_ops nu_canfd_ops = +{ + .configure = nu_canfd_configure, + .control = nu_canfd_control, + .sendmsg = nu_canfd_sendmsg, + .recvmsg = nu_canfd_recvmsg, +}; + +static const struct can_configure nu_canfd_default_config = NU_CANFD_CONFIG_DEFAULT; + +/* Interrupt Handle Function ----------------------------------------------------*/ + +/* Private Variables ------------------------------------------------------------*/ +const char *szIR[] = +{ + "CANFD_IR_RF0N - Rx FIFO 0 New Message", + "CANFD_IR_RF0W - Rx FIFO 0 Watermark Reached", + "CANFD_IR_RF0F - Rx FIFO 0 Full", + "CANFD_IR_RF0L - Rx FIFO 0 Message Lost", + "CANFD_IR_RF1N - Rx FIFO 1 New Message", + "CANFD_IR_RF1W - Rx FIFO 1 Watermark Reached", + "CANFD_IR_RF1F - Rx FIFO 1 Full", + "CANFD_IR_RF1L - Rx FIFO 1 Message Lost", + "CANFD_IR_HPM - High Priority Message", + "CANFD_IR_TC - Transmission Completed", + "CANFD_IR_TCF - Transmission Cancellation Finished", + "CANFD_IR_TFE - Tx FIFO Empty", + "CANFD_IR_TEFN - Tx Event FIFO New Entry", + "CANFD_IR_TEFW - Tx Event FIFO Watermark Reached", + "CANFD_IR_TEFF - Tx Event FIFO Full", + "CANFD_IR_TEFL - Tx Event FIFO Event Lost", + "CANFD_IR_TSW - Timestamp Wraparound", + "CANFD_IR_MRAF - Message RAM Access Failure", + "CANFD_IR_TOO - Timeout Occurred", + "CANFD_IR_DRX - Message stored to Dedicated Rx Buffer", + "BIT20", + "BIT21", + "CANFD_IR_ELO - Error Logging Overflow", + "CANFD_IR_EP - Error Passive", + "CANFD_IR_EW - Warning Status", + "CANFD_IR_BO - Bus_Off Status", + "CANFD_IR_WDI - Watchdog", + "CANFD_IR_PEA - Protocol Error in Arbitration Phase", + "CANFD_IR_PED - Protocol Error in Data Phase", + "CANFD_IR_ARA - Access to Reserved Address", + "BIT30", + "BIT31" +}; + +static void dump_interrupt_event(uint32_t u32Status) +{ + uint32_t idx; + while ((idx = nu_ctz(u32Status)) < 32) // Count Trailing Zeros ==> Find First One + { + LOG_D("[%s]", szIR[idx]); + u32Status &= ~(1 << idx); + } +} + +static void nu_canfd_isr(int vector, void *param) +{ + /* Get base address of canfd register */ + nu_canfd_t psNuCANFD = (nu_canfd_t)param; + + /* Get base address of CAN register */ + CANFD_T *base = psNuCANFD->base; + + /* Get interrupt status */ + uint32_t u32Status = base->IR; + CANFD_ClearStatusFlag(base, u32Status); + + /* Dump IR event */ + dump_interrupt_event(u32Status); + + /* Check Status Interrupt Flag (Error status Int and Status change Int) */ + /**************************/ + /* Status Change interrupt*/ + /**************************/ + + if (u32Status & CANFD_IR_TC_Msk) + { + if (psNuCANFD->int_flag & RT_DEVICE_FLAG_INT_TX) + { + rt_hw_can_isr(&psNuCANFD->dev, RT_CAN_EVENT_TX_DONE); + } + } + + if (u32Status & (CANFD_IR_RF0N_Msk | CANFD_IR_RF1N_Msk)) + { + if (psNuCANFD->int_flag & RT_DEVICE_FLAG_INT_RX) + { + rt_hw_can_isr(&psNuCANFD->dev, RT_CAN_EVENT_RX_IND); + } + } + + if (u32Status & (CANFD_IR_RF0L_Msk | CANFD_IR_RF1L_Msk)) + { + rt_hw_can_isr(&psNuCANFD->dev, RT_CAN_EVENT_RXOF_IND); + } + + if (u32Status & (CANFD_IR_TEFF_Msk | CANFD_IR_TOO_Msk)) + { + rt_hw_can_isr(&psNuCANFD->dev, RT_CAN_EVENT_TX_FAIL); + } + + /**************************/ + /* Error Status interrupt */ + /**************************/ + if (u32Status & CANFD_IR_EW_Msk) + { + LOG_E("[%s]EWARN", psNuCANFD->name) ; + } + + if (u32Status & CANFD_IR_BO_Msk) + { + LOG_E("[%s]BUSOFF", psNuCANFD->name) ; + + /* To release busoff pin */ + } + + if (u32Status & CANFD_IR_PED_Msk) + { + LOG_E("[%s] LEC: %03x\n", psNuCANFD->name, base->PSR & CANFD_PSR_LEC_Msk) ; + } +} + +static void nu_canfd_ie(nu_canfd_t psNuCANFD) +{ + uint32_t u32CanFDIE = CANFD_IE_BOE_Msk; + + if (psNuCANFD->int_flag & (RT_DEVICE_FLAG_INT_RX)) + { + /* Rx FIFO 0 New Message Interrupt */ + u32CanFDIE |= (CANFD_IE_RF0NE_Msk | CANFD_IE_RF1NE_Msk); + } + + if (psNuCANFD->int_flag & (RT_DEVICE_FLAG_INT_TX)) + { + /* Transmission Completed Interrupt */ + /* Timeout Occurred Interrupt */ + u32CanFDIE |= (CANFD_IE_TCE_Msk | CANFD_IE_TEFNE_Msk); + } + + if (psNuCANFD->int_flag & RT_DEVICE_CAN_INT_ERR) + { + /* Bus_Off Status Interrupt */ + /* Warning Status Interrupt */ + /* Error Passive Interrupt */ + /* Error Logging Overflow Interrupt */ + /* Protocol Error in Data Phase interrupt Indicator */ + u32CanFDIE |= (CANFD_IE_EPE_Msk | CANFD_IE_EWE_Msk | CANFD_IE_ELOE_Msk | CANFD_IE_TOOE_Msk | CANFD_IR_PED_Msk); + } + + //u32CanFDIE = 0xffffffff; + + CANFD_EnableInt(psNuCANFD->base, u32CanFDIE, 0, + (psNuCANFD->int_flag & (RT_DEVICE_FLAG_INT_TX)) ? CANFD_TXBTIE_TIEn_Msk : 0, + (psNuCANFD->int_flag & (RT_DEVICE_FLAG_INT_TX)) ? CANFD_TXBCIE_CFIEn_Msk : 0); +} + +static rt_err_t nu_canfd_configure(struct rt_can_device *can, struct can_configure *cfg) +{ + nu_canfd_t psNuCANFD = (nu_canfd_t)can; + CANFD_FD_T *psCANFDConf; + + RT_ASSERT(can); + RT_ASSERT(cfg); + + psCANFDConf = &psNuCANFD->sCANFD_Config; + + /* Get base address of CAN register */ + CANFD_T *base = psNuCANFD->base; + + CANFD_GetDefaultConfig(psCANFDConf, CANFD_OP_CAN_MODE); + + LOG_I("Message Ram Size: %d @%08x ~ %08x", psCANFDConf->u32MRamSize, CANFD_SRAM_BASE_ADDR(base), psCANFDConf->u32MRamSize + CANFD_SRAM_BASE_ADDR(base)); + LOG_I("SIDFC: %d @%08x Size:%d", psCANFDConf->sElemSize.u32SIDFC, CANFD_SRAM_BASE_ADDR(base) + psCANFDConf->sMRamStartAddr.u32SIDFC_FLSSA, psCANFDConf->sElemSize.u32SIDFC * sizeof(CANFD_STD_FILTER_T)); + LOG_I("XIDFC: %d @%08x Size:%d", psCANFDConf->sElemSize.u32XIDFC, CANFD_SRAM_BASE_ADDR(base) + psCANFDConf->sMRamStartAddr.u32XIDFC_FLESA, psCANFDConf->sElemSize.u32XIDFC * sizeof(CANFD_EXT_FILTER_T)); + LOG_I("RxFifo0: %d @%08x Size:%d", psCANFDConf->sElemSize.u32RxFifo0, CANFD_SRAM_BASE_ADDR(base) + psCANFDConf->sMRamStartAddr.u32RXF0C_F0SA, psCANFDConf->sElemSize.u32RxFifo0 * sizeof(CANFD_BUF_T)); + LOG_I("RxFifo1: %d @%08x Size:%d", psCANFDConf->sElemSize.u32RxFifo1, CANFD_SRAM_BASE_ADDR(base) + psCANFDConf->sMRamStartAddr.u32RXF1C_F1SA, psCANFDConf->sElemSize.u32RxFifo1 * sizeof(CANFD_BUF_T)); + LOG_I("RxBuf: %d @%08x Size:%d", psCANFDConf->sElemSize.u32RxBuf, CANFD_SRAM_BASE_ADDR(base) + psCANFDConf->sMRamStartAddr.u32RXBC_RBSA, psCANFDConf->sElemSize.u32RxBuf * sizeof(CANFD_BUF_T)); + LOG_I("TxEventFifo: %d @%08x Size:%d", psCANFDConf->sElemSize.u32TxEventFifo, CANFD_SRAM_BASE_ADDR(base) + psCANFDConf->sMRamStartAddr.u32TXEFC_EFSA, psCANFDConf->sElemSize.u32TxEventFifo * sizeof(CANFD_EXT_FILTER_T)); + LOG_I("TxBuf: %d @%08x Size:%d", psCANFDConf->sElemSize.u32TxBuf, CANFD_SRAM_BASE_ADDR(base) + psCANFDConf->sMRamStartAddr.u32TXBC_TBSA, psCANFDConf->sElemSize.u32TxBuf * sizeof(CANFD_BUF_T)); + + psCANFDConf->sBtConfig.sNormBitRate.u32BitRate = cfg->baud_rate; + psCANFDConf->sBtConfig.sDataBitRate.u32BitRate = 0; + + LOG_I("CAN Baud rate: %d bps", cfg->baud_rate); + + switch (cfg->mode) + { + case RT_CAN_MODE_NORMAL: // Normal + psCANFDConf->sBtConfig.evTestMode = eCANFD_NORMAL; + break; + + case RT_CAN_MODE_LISTEN: // Bus monitor Mode, can't start a transmission + psCANFDConf->sBtConfig.evTestMode = eCANFD_BUS_MONITOR; + break; + + case RT_CAN_MODE_LOOPBACK: // Test - Internal loopback + psCANFDConf->sBtConfig.evTestMode = eCANFD_LOOPBACK_INTERNAL; + break; + + case RT_CAN_MODE_LOOPBACKANLISTEN: + default: + rt_kprintf("Unsupported Operating mode\n"); + goto exit_nu_canfd_configure; + } + + /*Set the CAN Bit Rate and Operating mode*/ + CANFD_Open(base, psCANFDConf); + + /* Set FIFO policy */ +#if defined(RT_CAN_USING_HDR) + /* Whitelist filtering */ + CANFD_SetGFC(base, eCANFD_REJ_NON_MATCH_FRM, eCANFD_REJ_NON_MATCH_FRM, 0, 0); +#else + /* Blacklist filtering. */ + CANFD_SetGFC(base, eCANFD_ACC_NON_MATCH_FRM_RX_FIFO0, eCANFD_ACC_NON_MATCH_FRM_RX_FIFO0, 0, 0); +#endif + + /* Enable interrupt */ + nu_canfd_ie(psNuCANFD); + + //LOG_HEX("canfd", 16, (void *)base, sizeof(CANFD_T)); + + /* Lock protected registers & Run */ + CANFD_RunToNormal(base, TRUE); + + return RT_EOK; + +exit_nu_canfd_configure: + + CANFD_Close(base); + + return -(RT_ERROR); +} + +static rt_err_t nu_canfd_control(struct rt_can_device *can, int cmd, void *arg) +{ + rt_uint32_t argval = (rt_uint32_t)arg; + nu_canfd_t psNuCANFD = (nu_canfd_t)can; + + RT_ASSERT(can); + + switch (cmd) + { + case RT_DEVICE_CTRL_SET_INT: + psNuCANFD->int_flag |= argval; + return nu_canfd_configure(can, &can->config); + + case RT_DEVICE_CTRL_CLR_INT: + psNuCANFD->int_flag &= ~argval; + return nu_canfd_configure(can, &can->config); + +#if defined(RT_CAN_USING_HDR) + case RT_CAN_CMD_SET_FILTER: + { + struct rt_can_filter_config *filter_cfg = (struct rt_can_filter_config *)arg; + + RT_ASSERT(filter_cfg); + + for (int i = 0; i < filter_cfg->count; i++) + { + uint32_t u32FEC = (filter_cfg->items[i].mode == RT_CAN_MODE_PRIV) ? eCANFD_FLTR_ELEM_SET_PRI_STO_FIFO0 : eCANFD_FLTR_ELEM_STO_FIFO0; + + /* Set the filter rule */ + if (filter_cfg->items[i].ide == RT_CAN_STDID) + { + /* for 11-bit */ + CANFD_STD_FILTER_T sStdFilter; + + if (i >= CANFD_MAX_11_BIT_FTR_ELEMS) // Check filter entry limitation + return -(RT_ERROR); + + sStdFilter.SFID2 = filter_cfg->items[i].mask; /*!items[i].id; /*!base, i, sStdFilter.VALUE); + } + else + { + /* for 29-bit */ + CANFD_EXT_FILTER_T sXidFilter; + + if (i >= CANFD_MAX_29_BIT_FTR_ELEMS) // Check filter entry limitation + return -(RT_ERROR); + + sXidFilter.EFID1 = filter_cfg->items[i].mask; /*!items[i].id; /*!base, i, sXidFilter.LOWVALUE, sXidFilter.HIGHVALUE); + } + + } //for (int i = 0; i < filter_cfg->count; i++) + } + break; +#endif + + case RT_CAN_CMD_SET_MODE: + if ((argval == RT_CAN_MODE_NORMAL) || + (argval == RT_CAN_MODE_LISTEN) || + (argval == RT_CAN_MODE_LOOPBACK) || + (argval == RT_CAN_MODE_LOOPBACKANLISTEN)) + { + if (argval != can->config.mode) + { + can->config.mode = argval; + return nu_canfd_configure(can, &can->config); + } + } + else + { + return -(RT_ERROR); + } + break; + + case RT_CAN_CMD_SET_BAUD: + { + if ((argval == CAN1MBaud) || + (argval == CAN800kBaud) || + (argval == CAN500kBaud) || + (argval == CAN250kBaud) || + (argval == CAN125kBaud) || + (argval == CAN100kBaud) || + (argval == CAN50kBaud) || + (argval == CAN20kBaud) || + (argval == CAN10kBaud)) + { + if (argval != can->config.baud_rate) + { + can->config.baud_rate = argval; + return nu_canfd_configure(can, &can->config); + } + } + else + { + return -(RT_ERROR); + } + } + break; + + case RT_CAN_CMD_SET_PRIV: + if (argval != RT_CAN_MODE_PRIV && + argval != RT_CAN_MODE_NOPRIV) + { + return -(RT_ERROR); + } + if (argval != can->config.privmode) + { + can->config.privmode = argval; + return nu_canfd_configure(can, &can->config); + } + break; + + case RT_CAN_CMD_GET_STATUS: + { + rt_uint32_t u32ErrCounter = psNuCANFD->base->ECR; + rt_uint32_t u32ProtocolStatus = psNuCANFD->base->PSR; + + RT_ASSERT(arg); + + /*Receive Error Counter, return value is with Receive Error Passive.*/ + can->status.rcverrcnt = ((u32ErrCounter & CANFD_ECR_REC_Msk) >> CANFD_ECR_REC_Pos); + + /*Transmit Error Counter*/ + can->status.snderrcnt = ((u32ErrCounter & CANFD_ECR_TEC_Msk) >> CANFD_ECR_TEC_Pos); + + /*Last Error Type*/ + can->status.lasterrtype = ((u32ProtocolStatus & CANFD_PSR_LEC_Msk) >> CANFD_PSR_LEC_Pos); + + /*Status error code*/ + can->status.errcode = (u32ProtocolStatus & CANFD_PSR_EW_Msk) ? 1 : + (u32ProtocolStatus & CANFD_PSR_EP_Msk) ? 2 : + (u32ProtocolStatus & CANFD_PSR_BO_Msk) ? 3 : + 0; + + rt_memcpy(arg, &can->status, sizeof(struct rt_can_status)); + } + break; + + default: + return -(RT_EINVAL); + + } + + return RT_EOK; +} + +static int nu_canfd_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno) +{ + CANFD_FD_MSG_T sTxMsg; + struct rt_can_msg *pmsg; + nu_canfd_t psNuCANFD = (nu_canfd_t)can; + + RT_ASSERT(can); + RT_ASSERT(buf); + + pmsg = (struct rt_can_msg *) buf; + + if (pmsg->ide == RT_CAN_STDID && IS_CAN_STDID(pmsg->id)) + { + /* Standard ID (11 bits)*/ + sTxMsg.u32Id = pmsg->id; + sTxMsg.eIdType = eCANFD_SID; + } + else if (pmsg->ide == RT_CAN_EXTID && IS_CAN_EXTID(pmsg->id)) + { + /* Extended ID (29 bits)*/ + sTxMsg.u32Id = pmsg->id; + sTxMsg.eIdType = eCANFD_XID; + } + else + { + goto exit_nu_canfd_sendmsg; + } + + sTxMsg.bBitRateSwitch = 0; + + if (pmsg->rtr == RT_CAN_DTR) + { + /* Data frame */ + sTxMsg.eFrmType = eCANFD_DATA_FRM; + } + else if (pmsg->rtr == RT_CAN_RTR) + { + /* Remote frame */ + sTxMsg.eFrmType = eCANFD_REMOTE_FRM; + } + else + { + goto exit_nu_canfd_sendmsg; + } + + /* Check the parameters */ + if (IS_CAN_DLC(pmsg->len)) + { + sTxMsg.u32DLC = pmsg->len; + } + else + { + goto exit_nu_canfd_sendmsg; + } + + if (pmsg->len > 0) + { + rt_memcpy(&sTxMsg.au8Data[0], pmsg->data, pmsg->len); + } + + if (!CANFD_TransmitTxMsg(psNuCANFD->base, 0, &sTxMsg)) + { + goto exit_nu_canfd_sendmsg; + } + + return RT_EOK; + +exit_nu_canfd_sendmsg: + + return -(RT_ERROR); +} + +static int nu_canfd_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno) +{ + CANFD_FD_MSG_T sRxMsg; + struct rt_can_msg *pmsg; + nu_canfd_t psNuCANFD = (nu_canfd_t)can; + + RT_ASSERT(can); + RT_ASSERT(buf); + + pmsg = (struct rt_can_msg *) buf; + + /* get data */ + if (CANFD_ReadRxFifoMsg(psNuCANFD->base, 0, &sRxMsg) == FALSE) + { + rt_kprintf("No available RX Msg.\n"); + return -(RT_ERROR); + } + +#ifdef RT_CAN_USING_HDR + /* Hardware filter messages are valid */ + pmsg->hdr = boxno; + can->hdr[pmsg->hdr].connected = 1; +#endif + + pmsg->ide = (sRxMsg.eIdType == eCANFD_SID) ? RT_CAN_STDID : RT_CAN_EXTID; + pmsg->rtr = (sRxMsg.eFrmType == eCANFD_DATA_FRM) ? RT_CAN_DTR : RT_CAN_RTR; + pmsg->id = sRxMsg.u32Id; + pmsg->len = sRxMsg.u32DLC; + + if (pmsg->len > 0) + rt_memcpy(&pmsg->data[0], &sRxMsg.au8Data[0], pmsg->len); + + return RT_EOK; +} + +/** + * Hardware CAN Initialization + */ +static int rt_hw_canfd_init(void) +{ + int i; + rt_err_t ret = RT_EOK; + + for (i = (CANFD_START + 1); i < CANFD_CNT; i++) + { + nu_canfd_arr[i].dev.config = nu_canfd_default_config; + +#ifdef RT_CAN_USING_HDR + nu_canfd_arr[i].dev.config.maxhdr = RT_CANMSG_BOX_SZ; +#endif + /* Register can device */ + ret = rt_hw_can_register(&nu_canfd_arr[i].dev, nu_canfd_arr[i].name, &nu_canfd_ops, NULL); + RT_ASSERT(ret == RT_EOK); + + /* Register ISR. */ + rt_hw_interrupt_install(nu_canfd_arr[i].irqn0, nu_canfd_isr, &nu_canfd_arr[i], nu_canfd_arr[i].name); + rt_hw_interrupt_install(nu_canfd_arr[i].irqn1, nu_canfd_isr, &nu_canfd_arr[i], nu_canfd_arr[i].name); + + /* Unmask interrupt. */ + rt_hw_interrupt_umask(nu_canfd_arr[i].irqn0); + rt_hw_interrupt_umask(nu_canfd_arr[i].irqn1); + } + + return (int)ret; +} +INIT_DEVICE_EXPORT(rt_hw_canfd_init); +#endif //#if defined(BSP_USING_CANFD) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_ccap.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_ccap.c new file mode 100644 index 0000000000..1c9292baf2 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_ccap.c @@ -0,0 +1,489 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-8-16 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_CCAP) + +#include +#include "NuMicro.h" +#include "ccap_sensor.h" +#include "drv_ccap.h" + +#define LOG_TAG "drv.ccap" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_INFO +#define DBG_COLOR +#include + + +/* Private Typedef --------------------------------------------------------------*/ + +enum +{ + CCAP_START = -1, +#if defined(BSP_USING_CCAP0) + CCAP0_IDX, +#endif +#if defined(BSP_USING_CCAP1) + CCAP1_IDX, +#endif + CCAP_CNT +}; + +struct nu_ccap +{ + struct rt_device device; + char *name; + CCAP_T *base; + uint32_t rstidx; + uint32_t modid_ccap; + IRQn_Type irqn; + + ccap_config sConfig; +}; +typedef struct nu_ccap *nu_ccap_t; + +static struct nu_ccap nu_ccap_arr [] = +{ +#if defined(BSP_USING_CCAP0) + { + .name = "ccap0", + .base = CCAP0, + .rstidx = CCAP0_RST, + .modid_ccap = CCAP0_MODULE, + .irqn = CCAP0_IRQn, + }, +#endif +#if defined(BSP_USING_CCAP1) + { + .name = "ccap1", + .base = CCAP1, + .rstidx = CCAP1_RST, + .modid_ccap = CCAP1_MODULE, + .irqn = CCAP1_IRQn, + }, +#endif +}; + +static void nu_ccap_isr(int vector, void *param) +{ + nu_ccap_t ccap = (nu_ccap_t)param; + CCAP_T *base = ccap->base; + uint32_t u32CapInt, u32EvtMsk; + + u32CapInt = base->INT; + u32EvtMsk = 0; + + if ((u32CapInt & (CCAP_INT_VIEN_Msk | CCAP_INT_VINTF_Msk)) == (CCAP_INT_VIEN_Msk | CCAP_INT_VINTF_Msk)) + { + base->INT |= CCAP_INT_VINTF_Msk; /* Clear Frame end interrupt */ + u32EvtMsk |= NU_CCAP_FRAME_END; + } + + if ((u32CapInt & (CCAP_INT_ADDRMIEN_Msk | CCAP_INT_ADDRMINTF_Msk)) == (CCAP_INT_ADDRMIEN_Msk | CCAP_INT_ADDRMINTF_Msk)) + { + base->INT |= CCAP_INT_ADDRMINTF_Msk; /* Clear Address match interrupt */ + u32EvtMsk |= NU_CCAP_ADDRESS_MATCH; + } + + if ((u32CapInt & (CCAP_INT_MEIEN_Msk | CCAP_INT_MEINTF_Msk)) == (CCAP_INT_MEIEN_Msk | CCAP_INT_MEINTF_Msk)) + { + base->INT |= CCAP_INT_MEINTF_Msk; /* Clear Memory error interrupt */ + u32EvtMsk |= NU_CCAP_MEMORY_ERROR; + } + + /* Invoke callback */ + if (ccap->device.rx_indicate != RT_NULL) + ccap->device.rx_indicate(&ccap->device, 1); + + if (ccap->sConfig.pfnEvHndler && u32EvtMsk) + ccap->sConfig.pfnEvHndler(ccap->sConfig.pvData, u32EvtMsk); + + base->CTL = base->CTL | CCAP_CTL_UPDATE; +} + +/* common device interface */ +static rt_err_t ccap_init(rt_device_t dev) +{ + return RT_EOK; +} + +static void ccap_sensor_setfreq(nu_ccap_t psNuCcap, uint32_t u32SensorFreq) +{ + uint32_t u32RegLockLevel = SYS_IsRegLocked(); + + /* Unlock protected registers */ + if (u32RegLockLevel) + SYS_UnlockReg(); + + if (u32SensorFreq > 0) + { + int32_t i32Div; + + /* Specified sensor clock */ + i32Div = CLK_GetPLLClockFreq(SYSPLL) / u32SensorFreq; + + if (i32Div == 0) + i32Div = 1; + + CLK_EnableModuleClock(psNuCcap->modid_ccap); + if (psNuCcap->base == CCAP0) + CLK_SetModuleClock(psNuCcap->modid_ccap, CLK_CLKSEL0_CCAP0SEL_SYSPLL, CLK_CLKDIV1_CCAP0(i32Div)); + else if (psNuCcap->base == CCAP1) + CLK_SetModuleClock(psNuCcap->modid_ccap, CLK_CLKSEL0_CCAP1SEL_SYSPLL, CLK_CLKDIV1_CCAP1(i32Div)); + else + return; + + LOG_I("CCAP Engine clock:%d", CLK_GetPLLClockFreq(SYSPLL)); + LOG_I("CCAP Sensor preferred clock %d, divider:%d", u32SensorFreq, i32Div); + LOG_I("CCAP Sensor actully clock:%d", CLK_GetPLLClockFreq(SYSPLL) / i32Div); + } + else + { + CLK_DisableModuleClock(psNuCcap->modid_ccap); + } + + /* Lock protected registers */ + if (u32RegLockLevel) + SYS_LockReg(); +} + +static rt_err_t ccap_pipe_configure(nu_ccap_t psNuCcap, ccap_view_info_t psViewInfo) +{ + sensor_mode_info_t psSensorModeInfo = (sensor_mode_info_t)psViewInfo; + ccap_config_t psCcapConf = &psNuCcap->sConfig; + uint32_t u32PipeEnabling = 0; + struct rt_device_rect_info *psRectCropping = &psCcapConf->sRectCropping; + + /* Set Cropping Window Vertical/Horizontal Starting Address and Cropping Window Size */ + CCAP_SetCroppingWindow(psNuCcap->base, psRectCropping->y, psRectCropping->x, psRectCropping->height, psRectCropping->width); + + if (psCcapConf->sPipeInfo_Packet.pu8FarmAddr) + { + uint32_t u32WM, u32WN, u32HM, u32HN; + + /* Set System Memory Packet Base Address Register */ + CCAP_SetPacketBuf(psNuCcap->base, (uint32_t)psCcapConf->sPipeInfo_Packet.pu8FarmAddr); + + u32WM = u32WN = u32HM = u32HN = 0; + /* Set Packet Scaling Vertical/Horizontal Factor Register */ + if (psCcapConf->sPipeInfo_Packet.u32Height < psRectCropping->height) + { + u32HN = psCcapConf->sPipeInfo_Packet.u32Height; + u32HM = psRectCropping->height; + } + + if (psCcapConf->sPipeInfo_Packet.u32Width < psRectCropping->width) + { + u32WN = psCcapConf->sPipeInfo_Packet.u32Width; + u32WM = psRectCropping->width; + } + + CCAP_SetPacketScaling(psNuCcap->base, + u32HN, + u32HM, + u32WN, + u32WM); + + /* Set Packet Frame Output Pixel Stride Width */ + CCAP_SetPacketStride(psNuCcap->base, psCcapConf->u32Stride_Packet); + + u32PipeEnabling |= CCAP_CTL_PKTEN; + } + + if (psCcapConf->sPipeInfo_Planar.pu8FarmAddr) + { + uint32_t u32Offset = 0; + uint32_t u32WM, u32WN, u32HM, u32HN; + uint32_t u32Div = 0; + + if (psCcapConf->sPipeInfo_Planar.u32PixFmt == CCAP_PAR_PLNFMT_YUV422) + { + /* U/V farm size equals Y/2 farm size */ + u32Div = 2; + } + else if (psCcapConf->sPipeInfo_Planar.u32PixFmt == CCAP_PAR_PLNFMT_YUV420) + { + /* U/V farm size equals Y/4 farm size */ + u32Div = 4; + } + else + { + goto fail_ccap_pipe_configure; + } + + /* Set System Memory Planar Y Base Address Register */ + CCAP_SetPlanarYBuf(psNuCcap->base, (uint32_t)psCcapConf->sPipeInfo_Planar.pu8FarmAddr + u32Offset); + + u32Offset = psCcapConf->sPipeInfo_Planar.u32Height * psCcapConf->sPipeInfo_Planar.u32Width; + + /* Set System Memory Planar U Base Address Register */ + CCAP_SetPlanarUBuf(psNuCcap->base, (uint32_t)psCcapConf->sPipeInfo_Planar.pu8FarmAddr + u32Offset); + + u32Offset += ((psCcapConf->sPipeInfo_Planar.u32Height * psCcapConf->sPipeInfo_Planar.u32Width) / u32Div); + + /* Set System Memory Planar V Base Address Register */ + CCAP_SetPlanarVBuf(psNuCcap->base, (uint32_t)psCcapConf->sPipeInfo_Planar.pu8FarmAddr + u32Offset); + + u32WM = u32WN = u32HM = u32HN = 0; + /* Set Planar Scaling Vertical/Horizontal Factor Register */ + if (psCcapConf->sPipeInfo_Planar.u32Height < psRectCropping->height) + { + u32HN = psCcapConf->sPipeInfo_Planar.u32Height; + u32HM = psRectCropping->height; + } + + if (psCcapConf->sPipeInfo_Planar.u32Width < psRectCropping->width) + { + u32WN = psCcapConf->sPipeInfo_Planar.u32Width; + u32WM = psRectCropping->width; + } + + /* Set Planar Scaling Vertical/Horizontal Factor Register */ + CCAP_SetPlanarScaling(psNuCcap->base, + u32HN, + u32HM, + u32WN, + u32WM); + + /* Set Planar Frame Output Pixel Stride Width */ + CCAP_SetPlanarStride(psNuCcap->base, psCcapConf->u32Stride_Planar); + + u32PipeEnabling |= CCAP_CTL_PLNEN; + } + + /* Set Vsync polarity, Hsync polarity, pixel clock polarity, Sensor Format and Order */ + CCAP_Open(psNuCcap->base, + psSensorModeInfo->u32Polarity | + psViewInfo->u32PixFmt | + psCcapConf->sPipeInfo_Packet.u32PixFmt | + psCcapConf->sPipeInfo_Planar.u32PixFmt, + u32PipeEnabling); + + return RT_EOK; + +fail_ccap_pipe_configure: + + return -RT_ERROR; +} + +static rt_err_t ccap_open(rt_device_t dev, rt_uint16_t oflag) +{ + nu_ccap_t psNuCcap = (nu_ccap_t)dev; + + uint32_t u32RegLockLevel = SYS_IsRegLocked(); + + /* Unlock protected registers */ + if (u32RegLockLevel) + SYS_UnlockReg(); + + /* Enable clock */ + ccap_sensor_setfreq(psNuCcap, 24000000); + + /* Reset IP */ + SYS_ResetModule(psNuCcap->rstidx); + + /* Lock protected registers */ + if (u32RegLockLevel) + SYS_LockReg(); + + /* Unmask External CCAP Interrupt */ + rt_hw_interrupt_umask(psNuCcap->irqn); + + return RT_EOK; +} + +static rt_err_t ccap_close(rt_device_t dev) +{ + nu_ccap_t psNuCcap = (nu_ccap_t)dev; + + /* Stop capture engine */ + CCAP_Stop(psNuCcap->base, FALSE); + + /* Disable CCAP Interrupt */ + CCAP_DisableInt(psNuCcap->base, CCAP_INT_VIEN_Msk); + + /* Mask External CCAP Interrupt */ + rt_hw_interrupt_mask(psNuCcap->irqn); + + /* Disable clock */ + ccap_sensor_setfreq(psNuCcap, 0); + + return RT_EOK; +} + +static rt_err_t ccap_control(rt_device_t dev, int cmd, void *args) +{ + nu_ccap_t psNuCcap = (nu_ccap_t)dev; + rt_err_t ret = -RT_ERROR; + + if (psNuCcap == RT_NULL) + goto exit_ccap_control; + + switch (cmd) + { + case CCAP_CMD_CONFIG: + { + ccap_config *psCcapConf = (ccap_config *)args; + if (args == RT_NULL) + goto exit_ccap_control; + + rt_memcpy(&psNuCcap->sConfig, psCcapConf, sizeof(ccap_config)); + } + break; + + case CCAP_CMD_START_CAPTURE: + + /* Enable CCAP Interrupt */ + CCAP_EnableInt(psNuCcap->base, CCAP_INT_VIEN_Msk); + + /* Start capture engine */ + CCAP_Start(psNuCcap->base); + + break; + + case CCAP_CMD_STOP_CAPTURE: + + /* Disable CCAP Interrupt */ + CCAP_DisableInt(psNuCcap->base, CCAP_INT_VIEN_Msk); + + /* Stop capture engine */ + CCAP_Stop(psNuCcap->base, FALSE); + + break; + + case CCAP_CMD_SET_SENCLK: + { + rt_uint32_t u32SenClk; + + RT_ASSERT(args); + + u32SenClk = *((rt_uint32_t *)args); + if (u32SenClk > 0) + ccap_sensor_setfreq(psNuCcap, u32SenClk); + } + break; + + case CCAP_CMD_SET_PIPES: + { + ccap_view_info_t psViewInfo; + + RT_ASSERT(args); + psViewInfo = (ccap_view_info_t)args; + + ret = ccap_pipe_configure(psNuCcap, psViewInfo); + } + break; + + case CCAP_CMD_SET_OPMODE: + { + RT_ASSERT(args); + int i32IsOneSutterMode = *((int *)args); + + /* Set shutter or continuous mode */ + CCAP_SET_CTL(psNuCcap->base, (i32IsOneSutterMode > 0) ? CCAP_CTL_SHUTTER_Msk : 0); + } + break; + + case CCAP_CMD_SET_BASEADDR: + { + uint32_t u32Offset = 0; + ccap_config_t psCcapConf; + + RT_ASSERT(args); + psCcapConf = (ccap_config_t)args; + + /* Set System Memory Packet Base Address Register */ + CCAP_SetPacketBuf(psNuCcap->base, (uint32_t)psCcapConf->sPipeInfo_Packet.pu8FarmAddr); + + /* Set System Memory Planar Y Base Address Register */ + CCAP_SetPlanarYBuf(psNuCcap->base, (uint32_t)psCcapConf->sPipeInfo_Planar.pu8FarmAddr + u32Offset); + u32Offset = psCcapConf->sPipeInfo_Planar.u32Height * psCcapConf->sPipeInfo_Planar.u32Width; + /* Set System Memory Planar U Base Address Register */ + CCAP_SetPlanarUBuf(psNuCcap->base, (uint32_t)psCcapConf->sPipeInfo_Planar.pu8FarmAddr + u32Offset); + u32Offset += ((psCcapConf->sPipeInfo_Planar.u32Height * psCcapConf->sPipeInfo_Planar.u32Width) / 2); + /* Set System Memory Planar V Base Address Register */ + CCAP_SetPlanarVBuf(psNuCcap->base, (uint32_t)psCcapConf->sPipeInfo_Planar.pu8FarmAddr + u32Offset); + } + break; + + default: + return -RT_ENOSYS; + } + + ret = RT_EOK; + +exit_ccap_control: + + return ret; +} + +#ifdef RT_USING_DEVICE_OPS +static struct rt_device_ops ccap_ops = +{ + .init = ccap_init, + .open = ccap_open, + .close = ccap_close, + .read = RT_NULL, + .write = RT_NULL, + .control = ccap_control, +}; +#endif + +static rt_err_t ccap_register(struct rt_device *device, const char *name, void *user_data) +{ + RT_ASSERT(device); + + device->type = RT_Device_Class_Miscellaneous; + device->rx_indicate = RT_NULL; + device->tx_complete = RT_NULL; + +#ifdef RT_USING_DEVICE_OPS + device->ops = &inputcapture_ops; +#else + device->init = ccap_init; + device->open = ccap_open; + device->close = ccap_close; + device->read = RT_NULL; + device->write = RT_NULL; + device->control = ccap_control; +#endif + device->user_data = user_data; + + return rt_device_register(device, name, RT_DEVICE_FLAG_RDONLY | RT_DEVICE_FLAG_STANDALONE); +} + +/** + * Hardware CCAP Initialization + */ +int rt_hw_ccap_init(void) +{ + int i; + rt_err_t ret = RT_EOK; + + for (i = (CCAP_START + 1); i < CCAP_CNT; i++) + { + rt_memset(&nu_ccap_arr[i].sConfig, 0, sizeof(ccap_config)); + + rt_hw_interrupt_install(nu_ccap_arr[i].irqn, nu_ccap_isr, &nu_ccap_arr[i], nu_ccap_arr[i].name); + + ret = ccap_register(&nu_ccap_arr[i].device, nu_ccap_arr[i].name, NULL); + RT_ASSERT(ret == RT_EOK); + } + + return ret; +} +INIT_DEVICE_EXPORT(rt_hw_ccap_init); + +#endif diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_ccap.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_ccap.h new file mode 100644 index 0000000000..711971421f --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_ccap.h @@ -0,0 +1,49 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-8-16 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_CCAP_H__ +#define __DRV_CCAP_H__ + +#include "ccap_sensor.h" + +#define NU_CCAP_FRAME_END (1<<0) +#define NU_CCAP_ADDRESS_MATCH (1<<1) +#define NU_CCAP_MEMORY_ERROR (1<<2) +#define NU_CCAP_MOTION_DETECT (1<<3) + +typedef void (*nu_ccap_event_handler_t)(void *pvData, uint32_t u32EvtMask); + +typedef enum +{ + CCAP_CMD_CONFIG, + CCAP_CMD_START_CAPTURE, + CCAP_CMD_STOP_CAPTURE, + CCAP_CMD_SET_SENCLK, + CCAP_CMD_SET_PIPES, + CCAP_CMD_SET_OPMODE, + CCAP_CMD_SET_BASEADDR, +} ccap_cmd; + +typedef struct +{ + struct rt_device_rect_info sRectCropping; + ccap_view_info sPipeInfo_Packet; + ccap_view_info sPipeInfo_Planar; + uint32_t u32Stride_Packet; + uint32_t u32Stride_Planar; + + nu_ccap_event_handler_t pfnEvHndler; // Callback function in ISR + void *pvData; // For ISR callback argument. +} ccap_config; +typedef ccap_config *ccap_config_t; + +#endif //__DRV_CCAP_H__ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_common.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_common.c new file mode 100644 index 0000000000..75bee5bd6c --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_common.c @@ -0,0 +1,437 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-07-14 Wayne First version +* +******************************************************************************/ + +#include +#include +#include + +#include "drv_common.h" +#include "board.h" +#include "drv_uart.h" + +#define LOG_TAG "drv.common" +#undef DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_DBG +#define DBG_COLOR +#include + +#if defined(USE_MA35D1_AARCH32) +#define NORMAL_MEM_UNCACHED (SHARED|AP_RW|DOMAIN0|STRONGORDER|DESC_SEC) + +/* +MMU TLB setting: +0xFFFFFFFF ---------------------------- + | 1GB DDR(non-cacheable) | +0xC0000000 ---------------------------- + | 1GB DDR(cacheable) | +0x80000000 ---------------------------- + | DEVICE_MEM | + | | +0x00000000 ---------------------------- +*/ +struct mem_desc platform_mem_desc[] = +{ + {0x00000000, 0x7FFFFFFF, 0x00000000, DEVICE_MEM}, // Peripherals + {0x80000000, DDR_LIMIT_SIZE - 1, 0x80000000, NORMAL_MEM}, // 1GB DDR, cacheable + {0xC0000000, 0xFFFFFFFF, 0x80000000, NORMAL_MEM_UNCACHED} // 1GB DDR, non-cacheable +}; +const rt_uint32_t platform_mem_desc_size = sizeof(platform_mem_desc) / sizeof(platform_mem_desc[0]); +#endif + +static void nu_mmu_initialize(void) +{ +#if defined(USE_MA35D1_AARCH64) + mmu_init(); + /* device memory 0x0000_0000 - 0x3FFF_FFFF */ + armv8_map(0x00000000, 0x00000000, 0x40000000, MEM_ATTR_IO); + /* device memory 0x4000_0000 - 0x7FFF_FFFF */ + armv8_map(0x40000000, 0x40000000, 0x40000000, MEM_ATTR_IO); + /* system memory 0x8000_0000 - 0xFFFF_FFFF */ + armv8_map(0x80000000, 0x80000000, 0x80000000, MEM_ATTR_MEMORY); + mmu_enable(); +#endif +} + +#if !defined(USE_MA35D1_SUBM) + +volatile uint32_t secondary_cpu_entry __attribute__((aligned(32))) = 0; +static rt_uint32_t timerStep; +void rt_hw_systick_isr(int vector, void *parameter) +{ + gtimer_set_load_value(timerStep); + rt_tick_increase(); +} + +int rt_hw_systick_init(void) +{ + rt_hw_interrupt_install(NonSecPhysicalTimer_IRQn, rt_hw_systick_isr, RT_NULL, "systick"); + rt_hw_interrupt_umask(NonSecPhysicalTimer_IRQn); + timerStep = gtimer_get_counter_frequency(); + timerStep /= RT_TICK_PER_SECOND; + gtimer_set_load_value(timerStep); + gtimer_set_control(1); + return 0; +} + +void nu_sspcc_init(void) +{ + int i, j; + + CLK->APBCLK2 |= CLK_APBCLK2_SSPCCEN_Msk; + /* Set all GPIO security set to TZNS. */ + for (i = 0; i < 16; i++) + { + for (j = 0; j < 14; j++) + { + SSPCC_SetRealm_GPIO(GPIO_BASE + (j * 0x40), i, SSPCC_SSET_TZNS); + } + } +} + +void nu_ssmcc_init(void) +{ + CLK->APBCLK2 |= CLK_APBCLK2_SSMCCEN_Msk; + + /* set region 0 to secure region, non-secure and m4 all can access */ + SSMCC_SetRegion0(SSMCC_SECURE_READ | SSMCC_SECURE_WRITE | SSMCC_NONSECURE_READ | SSMCC_NONSECURE_WRITE | SSMCC_M4NS_READ | SSMCC_M4NS_WRITE); +} + +void nu_ddr_init(void) +{ + UMCTL2->PCTRL_0 = UMCTL2_PCTRL_0_port_en_Msk; //[0x0490] + UMCTL2->PCTRL_1 = UMCTL2_PCTRL_1_port_en_Msk; //[0x0540] + UMCTL2->PCTRL_2 = UMCTL2_PCTRL_2_port_en_Msk; //[0x05f0] + UMCTL2->PCTRL_3 = UMCTL2_PCTRL_3_port_en_Msk; //[0x06a0] + + UMCTL2->PCTRL_4 = UMCTL2_PCTRL_4_port_en_Msk; //[0x0750] + UMCTL2->PCTRL_5 = UMCTL2_PCTRL_5_port_en_Msk; //[0x0800] + UMCTL2->PCTRL_6 = UMCTL2_PCTRL_6_port_en_Msk; //[0x08b0] + UMCTL2->PCTRL_7 = UMCTL2_PCTRL_7_port_en_Msk; //[0x0960] +} + +void rt_hw_us_delay(rt_uint32_t us) +{ + rt_uint32_t ticks; + volatile rt_uint32_t told, tnow, tcnt = 0; + rt_uint32_t cmp = timerStep; // 12000 count / 1ms + + ticks = us * (cmp / 1000); // us * 12(count/1us) + told = gtimer_get_current_value(); + + while (1) + { + /* Timer counter is increment. */ + tnow = gtimer_get_current_value(); + if (tnow != told) + { + /* 0 -- now === old -------- cmp */ + if (tnow < told) + { + tcnt += (told - tnow); + } + else + { + /* 0 == old --- new ======== cmp */ + tcnt += (cmp - tnow + told); + } + told = tnow; + + /* Timeout */ + if (tcnt >= ticks) + { + break; + } + } + __NOP(); + } +} /* rt_hw_us_delay */ + +#else + +void SysTick_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +int rt_hw_systick_init(void) +{ + /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */ + SystemCoreClockUpdate(); + + /* Configure SysTick */ + SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + + + return 0; +} + +/** + * The time delay function. + * + * @param microseconds. + */ +void rt_hw_us_delay(rt_uint32_t us) +{ + rt_uint32_t ticks; + rt_uint32_t told, tnow, tcnt = 0; + rt_uint32_t reload = SysTick->LOAD; + + ticks = us * reload / (1000000 / RT_TICK_PER_SECOND); + told = SysTick->VAL; + while (1) + { + tnow = SysTick->VAL; + if (tnow != told) + { + if (tnow < told) + { + tcnt += told - tnow; + } + else + { + tcnt += reload - tnow + told; + } + told = tnow; + if (tcnt >= ticks) + { + break; + } + } + } +} + +#endif + + +void devmem(int argc, char *argv[]) +{ + volatile unsigned int u32Addr; + unsigned int value = 0, mode = 0; + + if (argc < 2 || argc > 3) + { + goto exit_devmem; + } + + if (argc == 3) + { + if (sscanf(argv[2], "0x%x", &value) != 1) + goto exit_devmem; + mode = 1; //Write + } + + if (sscanf(argv[1], "0x%x", &u32Addr) != 1) + goto exit_devmem; + else if (u32Addr & (4 - 1)) + goto exit_devmem; + + if (mode) + { + *((volatile uint32_t *)u32Addr) = value; + } + rt_kprintf("0x%08x\n", *((volatile uint32_t *)u32Addr)); + + return; +exit_devmem: + rt_kprintf("Read: devmem \n"); + rt_kprintf("Write: devmem \n"); + return; +} +MSH_CMD_EXPORT(devmem, dump device registers); + +void devmem2(int argc, char *argv[]) +{ + volatile unsigned int u32Addr; + unsigned int value = 0, word_count = 1; + + if (argc < 2 || argc > 3) + { + goto exit_devmem; + } + + if (argc == 3) + { + if (sscanf(argv[2], "%d", &value) != 1) + goto exit_devmem; + word_count = value; + } + + if (sscanf(argv[1], "0x%x", &u32Addr) != 1) + goto exit_devmem; + else if (u32Addr & (4 - 1)) + goto exit_devmem; + + if (word_count > 0) + { + LOG_HEX("devmem", 16, (void *)u32Addr, word_count * sizeof(rt_base_t)); + } + + return; +exit_devmem: + rt_kprintf("devmem2: \n"); + return; +} +MSH_CMD_EXPORT(devmem2, dump device registers); + +void idle_wfi(void) +{ +#if defined(USE_MA35D1_SUBM) + __WFI(); +#else + asm volatile("wfi"); +#endif +} + +extern void nu_clock_dump(void); +extern void nu_clock_raise(void); + +RT_WEAK void nutool_pincfg_init(void) +{ + +} + +/** + * This function will initial board. + */ +RT_WEAK void rt_hw_board_init(void) +{ + /* Unlock protected registers */ + SYS_UnlockReg(); + +#if !defined(USE_MA35D1_SUBM) + /* initialize SSPCC */ + nu_sspcc_init(); + + /* initialize SSMCC */ + nu_ssmcc_init(); + + /* initialize UMCTL2 */ + nu_ddr_init(); + +#endif + + /* initialize base clock */ + nu_clock_init(); + + + /* initialize peripheral pin function */ + nutool_pincfg_init(); + + /* initialize hardware interrupt */ + rt_hw_interrupt_init(); + + /* initialize MMU */ + nu_mmu_initialize(); + +#if defined(RT_USING_HEAP) + rt_system_heap_init((void *)BOARD_HEAP_START, (void *)BOARD_HEAP_END); +#endif + + /* initialize uart */ + rt_hw_uart_init(); + +#if defined(RT_USING_CONSOLE) + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif + +#if !defined(USE_MA35D1_SUBM) +#if !defined(USE_MA35D1_AARCH64) + //TOFIX + nu_clock_raise(); +#endif + nu_clock_dump(); +#endif + +#if defined(RT_USING_HEAP) + /* Dump heap information */ + rt_kprintf("Heap: Begin@%08x, END@%08x, SIZE: %d KiB\n", BOARD_HEAP_START, BOARD_HEAP_END, ((rt_uint32_t)BOARD_HEAP_END - (rt_uint32_t)BOARD_HEAP_START) / 1024); +#endif + + /* initialize systick */ + rt_hw_systick_init(); + rt_thread_idle_sethook(idle_wfi); + +#if defined(RT_USING_COMPONENTS_INIT) + rt_components_board_init(); +#endif + +#if defined(RT_USING_SMP) + /* install IPI handle */ + rt_hw_interrupt_set_priority(RT_SCHEDULE_IPI, 16); + rt_hw_ipi_handler_install(RT_SCHEDULE_IPI, rt_scheduler_ipi_handler); + rt_hw_interrupt_umask(RT_SCHEDULE_IPI); +#endif + +} + +#if defined(RT_USING_SMP) + +extern void secondary_cpu_start(void); +void set_secondary_cpu_boot_address(void) +{ + secondary_cpu_entry = (uint32_t)&secondary_cpu_start; + rt_kprintf("Wake up cpu-1 goto -> 0x%08x\n", secondary_cpu_entry); +} + +void rt_hw_secondary_cpu_up(void) +{ + rt_uint32_t i; + rt_uint32_t cpu_mask; + + rt_kprintf("rt_hw_secondary_cpu_up is processing \r\n"); + + set_secondary_cpu_boot_address(); + + /* Flush to memory */ + rt_cpu_dcache_clean_flush(); + + for (i = 1; i < RT_CPUS_NR; i++) + { + rt_kprintf("Bring up cpu-%d\r\n", i); + cpu_mask = 1 << i; + __asm__ volatile("dsb" :: + : "memory"); + __asm__ volatile("isb" :: + : "memory"); + __asm__ volatile("sev"); + rt_hw_ipi_send(RT_SCHEDULE_IPI, cpu_mask); + } +} + +void secondary_cpu_c_start(void) +{ + rt_kprintf("[%s] cpu-%d\r\n", __func__, rt_hw_cpu_id()); + + rt_hw_vector_init(); + + rt_hw_spin_lock(&_cpus_lock); + + arm_gic_cpu_init(0, platform_get_gic_cpu_base()); + rt_hw_systick_init(); + + rt_system_scheduler_start(); +} + +void rt_hw_secondary_cpu_idle_exec(void) +{ + asm volatile("wfe" :: + : "memory", "cc"); +} + +#endif diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_common.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_common.h new file mode 100644 index 0000000000..fc0e3ee187 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_common.h @@ -0,0 +1,83 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-12-12 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_COMMON_H__ +#define __DRV_COMMON_H__ + +#include +#include "NuMicro.h" +#include "interrupt.h" + +#if !defined(USE_MA35D1_SUBM) + +#include "gic.h" +#include "mmu.h" +#include "cp15.h" +#include "gtimer.h" + +#define __REG32(x) (*((volatile unsigned int*)((rt_ubase_t)x))) + +#define GIC_ACK_INTID_MASK 0x000003ff +#define ARM_GIC_NR_IRQS 256 +#define MAX_HANDLERS ARM_GIC_NR_IRQS +#define ARM_GIC_MAX_NR 1 +#define GIC_IRQ_START 0 + +#define DDR_LIMIT_SIZE 0xC0000000u +#define UNCACHEABLE 0x40000000u + +#define SSPCC_SET_REALM(IP, REALM) \ + do { \ + rt_kprintf("Set %s realm to %s(%d)\n", #IP, #REALM, REALM); \ + SSPCC_SetRealm(IP, REALM); \ + rt_kprintf("Get %s realm is %d ....%s\n", #IP, SSPCC_GetRealm(IP), (SSPCC_GetRealm(IP)==REALM)?"Success":"Failure"); \ + } while(0) + +#define SSPCC_SET_GPIO_REALM(PORT, PIN, REALM) \ + do { \ + rt_kprintf("Set %s%s realm to %s(%d)\n", #PORT, #PIN, #REALM, REALM); \ + SSPCC_SetRealm_GPIO((uint32_t)PORT, PIN, REALM); \ + rt_kprintf("Get %s%s realm is %d ....%s\n", #PORT, #PIN, SSPCC_GetRealm_GPIO((uint32_t)PORT, PIN), (SSPCC_GetRealm_GPIO((uint32_t)PORT, PIN)==REALM)?"Success":"Failure"); \ + } while(0) + + +/* the basic constants needed by gic */ +rt_inline rt_uint32_t platform_get_gic_dist_base(void) +{ + return GIC_DISTRIBUTOR_BASE; +} + +rt_inline rt_uint32_t platform_get_gic_cpu_base(void) +{ + return GIC_INTERFACE_BASE; +} + +rt_inline rt_uint32_t nu_cpu_dcache_line_size(void) +{ + rt_uint32_t ctr = 0; +#if defined(USE_MA35D1_AARCH32) + asm volatile("mrc p15, 0, %0, c0, c0, 1" : "=r"(ctr)); +#elif defined(USE_MA35D1_AARCH64) + asm volatile("mrs %0, ctr_el0" : "=r"(ctr)); +#endif + return 4 << ((ctr >> 16) & 0xF); +} +extern void rt_hw_cpu_dcache_clean(void *addr, int size); +extern void rt_hw_cpu_dcache_clean_inv(void *addr, int size); +extern void rt_hw_cpu_dcache_invalidate(void *addr, int size); +#else +#define UNCACHEABLE 0 +#endif + +void nu_clock_init(void); + +#endif /* __DRV_COMMON_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_disp.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_disp.c new file mode 100644 index 0000000000..2319257273 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_disp.c @@ -0,0 +1,450 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-8-11 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_DISP) + +#include +#include +#include +#include "NuMicro.h" +#include +#include +#include +#include + +#if !defined(DISP_USING_LCD_IDX) + #define DISP_USING_LCD_IDX eDispLcd_1024x600 +#endif + +#if !defined(BSP_LCD_BPP) + #define BSP_LCD_BPP 32 +#endif + +#if !defined(DISP_USING_OVERLAY) + #define DISP_USING_OVERLAY +#endif + +#define DEF_VPOST_BUFFER_NUMBER 3 + +/* Private typedef --------------------------------------------------------------*/ +struct nu_disp +{ + struct rt_device dev; + char *name; + E_DISP_LAYER layer; + uint32_t last_commit; + uint32_t ref_count; + struct rt_device_graphic_info info; + rt_uint8_t *pu8FBDMABuf; +}; +typedef struct nu_disp *nu_disp_t; + +static volatile uint32_t g_u32VSyncBlank = 0; +static struct rt_completion vsync_wq; + +static struct nu_disp nu_fbdev[eLayer_Cnt] = +{ + { + .name = "lcd", + .layer = eLayer_Video, + .ref_count = 0, + } +#if defined(DISP_USING_OVERLAY) + , { + .name = "overlay", + .layer = eLayer_Overlay, + .ref_count = 0, + } +#endif +}; + +RT_WEAK void nu_lcd_backlight_on(void) { } + +RT_WEAK void nu_lcd_backlight_off(void) { } + +static void nu_disp_isr(int vector, void *param) +{ + /* Get DISP INTSTS */ + if (DISP_GET_INTSTS()) + { + g_u32VSyncBlank++; + rt_completion_done(&vsync_wq); + } +} + +static rt_err_t disp_layer_open(rt_device_t dev, rt_uint16_t oflag) +{ + nu_disp_t psDisp = (nu_disp_t)dev; + RT_ASSERT(psDisp != RT_NULL); + + psDisp->ref_count++; + +#if defined(DISP_USING_OVERLAY) + if (psDisp->layer == eLayer_Overlay) // Depend on video layer + { + nu_fbdev[eLayer_Video].ref_count++; + } +#endif + + if (nu_fbdev[eLayer_Video].ref_count == 1) + { + DISP_SetTransparencyMode(eLayer_Video, eMASK); + DISP_ENABLE_INT(); + DISP_Trigger(eLayer_Video, 1); + } + +#if defined(DISP_USING_OVERLAY) + if (nu_fbdev[eLayer_Overlay].ref_count == 1) + { + DISP_SetTransparencyMode(eLayer_Overlay, eOPAQUE); + DISP_Trigger(eLayer_Overlay, 1); + } +#endif + + return RT_EOK; +} + +static rt_err_t disp_layer_close(rt_device_t dev) +{ + nu_disp_t psDisp = (nu_disp_t)dev; + RT_ASSERT(psDisp != RT_NULL); + + psDisp->ref_count--; + +#if defined(DISP_USING_OVERLAY) + if (psDisp->layer == eLayer_Overlay) // Depend on video layer + { + nu_fbdev[eLayer_Video].ref_count--; + } + + if (nu_fbdev[eLayer_Overlay].ref_count == 0) + { + DISP_Trigger(eLayer_Overlay, 0); + } +#endif + + if (nu_fbdev[eLayer_Video].ref_count == 0) + { + DISP_DISABLE_INT(); + DISP_Trigger(eLayer_Video, 0); + } + + return RT_EOK; +} + +static rt_err_t disp_layer_control(rt_device_t dev, int cmd, void *args) +{ + nu_disp_t psDisp = (nu_disp_t)dev; + RT_ASSERT(psDisp != RT_NULL); + + switch (cmd) + { + case RTGRAPHIC_CTRL_POWERON: + { + nu_lcd_backlight_on(); + } + break; + + case RTGRAPHIC_CTRL_POWEROFF: + { + nu_lcd_backlight_off(); + } + break; + + case RTGRAPHIC_CTRL_GET_INFO: + { + struct rt_device_graphic_info *info = (struct rt_device_graphic_info *) args; + RT_ASSERT(info != RT_NULL); + rt_memcpy(args, (void *)&psDisp->info, sizeof(struct rt_device_graphic_info)); + } + break; + + case RTGRAPHIC_CTRL_SET_MODE: + { + int pixfmt, bpp; + E_FB_FMT eFBFmt; + + RT_ASSERT(args); + pixfmt = *((int *)args); + + switch (pixfmt) + { + case RTGRAPHIC_PIXEL_FORMAT_RGB565: + eFBFmt = eFBFmt_R5G6B5; + bpp = 16; + break; + case RTGRAPHIC_PIXEL_FORMAT_ARGB888: + eFBFmt = eFBFmt_A8R8G8B8; + bpp = 32; + break; + case RTGRAPHIC_PIXEL_FORMAT_MONO: + case RTGRAPHIC_PIXEL_FORMAT_GRAY4: + case RTGRAPHIC_PIXEL_FORMAT_GRAY16: + case RTGRAPHIC_PIXEL_FORMAT_RGB332: + case RTGRAPHIC_PIXEL_FORMAT_RGB444: + case RTGRAPHIC_PIXEL_FORMAT_BGR565: + case RTGRAPHIC_PIXEL_FORMAT_RGB666: + case RTGRAPHIC_PIXEL_FORMAT_RGB888: + case RTGRAPHIC_PIXEL_FORMAT_BGR888: + case RTGRAPHIC_PIXEL_FORMAT_ABGR888: + case RTGRAPHIC_PIXEL_FORMAT_RESERVED: + default: + return -RT_ERROR; + } + psDisp->info.bits_per_pixel = bpp; + psDisp->info.pixel_format = pixfmt; + psDisp->info.pitch = psDisp->info.width * (bpp >> 3U); + + /* Initial LCD */ + DISP_SetFBFmt(psDisp->layer, eFBFmt, psDisp->info.pitch); + + + } + break; + + case RTGRAPHIC_CTRL_GET_MODE: + { + RT_ASSERT(args); + *((int *)args) = psDisp->info.pixel_format; + } + break; + + case RTGRAPHIC_CTRL_PAN_DISPLAY: + { + if (args != RT_NULL) + { + uint32_t u32BufPtr = (uint32_t)args; + psDisp->last_commit = g_u32VSyncBlank; + + /* Pan display */ + return (DISP_SetFBAddr(psDisp->layer, u32BufPtr) == 0) ? RT_EOK : -RT_ERROR; + } + else + return -RT_ERROR; + } + break; + + case RTGRAPHIC_CTRL_WAIT_VSYNC: + { + if (args != RT_NULL) + psDisp->last_commit = g_u32VSyncBlank + 1; + + if (psDisp->last_commit >= g_u32VSyncBlank) + { + rt_completion_init(&vsync_wq); + rt_completion_wait(&vsync_wq, RT_TICK_PER_SECOND / 60); + } + } + break; + + default: + return -RT_ERROR; + } + + return RT_EOK; +} + +static rt_err_t disp_layer_init(rt_device_t dev) +{ + nu_disp_t psDisp = (nu_disp_t)dev; + RT_ASSERT(psDisp != RT_NULL); + + rt_completion_init(&vsync_wq); + return RT_EOK; +} + +int rt_hw_disp_init(void) +{ + int i; + rt_err_t ret; + + /* Get LCD panel instance by ID. */ + const DISP_LCD_INFO *psDispLcdInstance = DISP_GetLCDInst(DISP_USING_LCD_IDX); + RT_ASSERT(psDispLcdInstance != RT_NULL); + + /* Initial LCD */ + DISP_LCDInit(psDispLcdInstance); + + for (i = eLayer_Video; +#if defined(DISP_USING_OVERLAY) + i < eLayer_Cnt; +#else + i < eLayer_Overlay; +#endif + i++) + { + E_FB_FMT eFbFmt; + nu_disp_t psDisp = &nu_fbdev[i]; + rt_memset((void *)&psDisp->info, 0, sizeof(struct rt_device_graphic_info)); + + /* Register Disp device information */ + psDisp->info.bits_per_pixel = BSP_LCD_BPP; + psDisp->info.pixel_format = (BSP_LCD_BPP == 32) ? RTGRAPHIC_PIXEL_FORMAT_ARGB888 : RTGRAPHIC_PIXEL_FORMAT_RGB565; + psDisp->info.pitch = psDispLcdInstance->u32ResolutionWidth * (BSP_LCD_BPP / 8); + psDisp->info.width = psDispLcdInstance->u32ResolutionWidth; + psDisp->info.height = psDispLcdInstance->u32ResolutionHeight; + + /* Get pointer of video frame buffer */ + rt_uint8_t *pu8FBDMABuf = rt_malloc_align(psDisp->info.pitch * psDisp->info.height * DEF_VPOST_BUFFER_NUMBER, 128); + if (pu8FBDMABuf == NULL) + { + rt_kprintf("Fail to get VRAM buffer for %s layer.\n", psDisp->name); + RT_ASSERT(0); + } + else + { + /* Register non-cacheable DMA address to upper layer. */ + psDisp->info.framebuffer = (rt_uint8_t *)((uint32_t)pu8FBDMABuf | UNCACHEABLE); + + uint32_t u32FBSize = psDisp->info.pitch * psDispLcdInstance->u32ResolutionHeight; + psDisp->info.smem_len = u32FBSize * DEF_VPOST_BUFFER_NUMBER; + rt_memset(psDisp->info.framebuffer, 0, psDisp->info.smem_len); + } + + eFbFmt = (psDisp->info.pixel_format == RTGRAPHIC_PIXEL_FORMAT_ARGB888) ? eFBFmt_A8R8G8B8 : eFBFmt_R5G6B5 ; + ret = (rt_err_t)DISP_SetFBConfig(i, eFbFmt, psDisp->info.width, psDisp->info.height, (uint32_t)pu8FBDMABuf); + RT_ASSERT(ret == RT_EOK); + psDisp->pu8FBDMABuf = pu8FBDMABuf; + + /* Register member functions of lcd device */ + psDisp->dev.type = RT_Device_Class_Graphic; + psDisp->dev.init = disp_layer_init; + psDisp->dev.open = disp_layer_open; + psDisp->dev.close = disp_layer_close; + psDisp->dev.control = disp_layer_control; + + /* register graphic device driver */ + ret = rt_device_register(&psDisp->dev, psDisp->name, RT_DEVICE_FLAG_RDWR); + RT_ASSERT(ret == RT_EOK); + + rt_kprintf("%s's fbdev video memory at 0x%08x.\n", psDisp->name, psDisp->info.framebuffer); + } + + /* Register ISR */ + rt_hw_interrupt_install(DISP_IRQn, nu_disp_isr, RT_NULL, "DISP"); + + /* Enable interrupt. */ + rt_hw_interrupt_umask(DISP_IRQn); + + return (int)ret; +} +INIT_DEVICE_EXPORT(rt_hw_disp_init); + +static void lcd_show_video_layer(void) +{ + rt_device_open(&nu_fbdev[eLayer_Video].dev, RT_DEVICE_FLAG_RDWR); +} +MSH_CMD_EXPORT(lcd_show_video_layer, show video layer); + +static void lcd_hide_video_layer(void) +{ + rt_device_close(&nu_fbdev[eLayer_Video].dev); +} +MSH_CMD_EXPORT(lcd_hide_video_layer, hide video layer); + +#if defined(DISP_USING_OVERLAY) + +int nu_overlay_set_colkey(uint32_t u32Low, uint32_t u32High) +{ + DISP_SetColorKeyValue(u32Low, u32High); + DISP_SetTransparencyMode(eLayer_Overlay, eKEY); + return 0; +} +RTM_EXPORT(nu_overlay_set_colkey); + +/* Support "lcd_set_overlay_colkey" command line in msh mode */ +static rt_err_t lcd_set_overlay_colkey(int argc, char **argv) +{ + unsigned int index, len, arg[2]; + + rt_memset(arg, 0, sizeof(arg)); + len = (argc >= 3) ? 3 : argc; + + for (index = 0; index < (len - 1); index ++) + { + if (sscanf(argv[index + 1], "%x", &arg[index]) != 1) + return -1; + } + rt_kprintf("colkeylow:0x%08x colkeyhigh:0x%08x\n", arg[0], arg[1]); + nu_overlay_set_colkey(arg[0], arg[1]); + + return 0; +} +MSH_CMD_EXPORT(lcd_set_overlay_colkey, e.g: lcd_set_overlay_colkey colkeylow colkeyhigh); + +static void lcd_show_overlay_layer(void) +{ + rt_device_open(&nu_fbdev[eLayer_Overlay].dev, RT_DEVICE_FLAG_RDWR); +} + +static void lcd_hide_overlay_layer(void) +{ + rt_device_close(&nu_fbdev[eLayer_Overlay].dev); +} +MSH_CMD_EXPORT(lcd_show_overlay_layer, show overlay layer); +MSH_CMD_EXPORT(lcd_hide_overlay_layer, hide overlay layer); + +static void lcd_fill_layer_color(void) +{ + nu_disp_t psDispLayer; + int idx; + for (idx = eLayer_Overlay; //eLayer_Video; +#if defined(DISP_USING_OVERLAY) + idx < eLayer_Cnt; +#else + idx < eLayer_Overlay; +#endif + idx++) + { + psDispLayer = &nu_fbdev[idx]; + if (psDispLayer->info.framebuffer != RT_NULL) + { + int i; + uint32_t fill_num = psDispLayer->info.height * psDispLayer->info.width; + uint32_t *fbmem_start = (uint32_t *)psDispLayer->info.framebuffer; + uint32_t color = (0x3F << 24) | (rand() % 0x1000000) ; + rt_kprintf("fill color=0x%08x on %s layer\n", color, psDispLayer->name); + for (i = 0; i < fill_num; i++) + { + rt_memcpy((void *)&fbmem_start[i], &color, (psDispLayer->info.bits_per_pixel / 8)); + } + } + } +} +MSH_CMD_EXPORT(lcd_fill_layer_color, fill random color on overlay layer); + +static rt_err_t lcd_set_alphablend_opmode(int argc, char **argv) +{ + unsigned int index, len, arg[1]; + + rt_memset(arg, 0, sizeof(arg)); + len = (argc >= 2) ? 2 : argc; + + for (index = 0; index < (len - 1); index ++) + { + if (sscanf(argv[index + 1], "%x", &arg[index]) != 1) + return -1; + } + + rt_kprintf("opmode:0x%08x\n", arg[0]); + + if (arg[0] <= DC_BLEND_MODE_SRC_OUT) + DISP_SetBlendOpMode(arg[0], eGloAM_NORMAL, eGloAM_NORMAL); + + return 0; +} +MSH_CMD_EXPORT(lcd_set_alphablend_opmode, Set alpha blending opmode); +#endif + +#endif /* if defined(BSP_USING_DISP) */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_eadc.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_eadc.c new file mode 100644 index 0000000000..f022392aa0 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_eadc.c @@ -0,0 +1,154 @@ +/**************************************************************************//** +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-9-23 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_EADC) + +#include +#include "NuMicro.h" + +/* Private define ---------------------------------------------------------------*/ +#define DEF_EADC_MAX_CHANNEL_NUM 8 + +enum +{ + EADC_START = -1, +#if defined(BSP_USING_EADC0) + EADC0_IDX, +#endif + EADC_CNT +}; + +/* Private Typedef --------------------------------------------------------------*/ +struct nu_eadc +{ + struct rt_adc_device parent; + char *name; + EADC_T *base; + uint32_t rstidx; + uint32_t modid; + uint32_t chnmask; +}; +typedef struct nu_eadc *nu_eadc_t; + +/* Private functions ------------------------------------------------------------*/ +static rt_err_t nu_eadc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled); +static rt_err_t nu_get_eadc_value(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value); +static rt_err_t nu_get_eadc_value(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value); + +/* Public functions ------------------------------------------------------------*/ +int rt_hw_eadc_init(void); + +/* Private variables ------------------------------------------------------------*/ + +static struct nu_eadc nu_eadc_arr [] = +{ +#if defined(BSP_USING_EADC0) + { .name = "eadc0", .base = EADC0, .rstidx = EADC0_RST, .modid = EADC0_MODULE, .chnmask = 0 }, +#endif +}; + +static const struct rt_adc_ops nu_adc_ops = +{ + nu_eadc_enabled, + nu_get_eadc_value, +}; +typedef struct rt_adc_ops *rt_adc_ops_t; + + +/* nu_adc_enabled - Enable ADC clock and wait for ready */ +static rt_err_t nu_eadc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled) +{ + nu_eadc_t psNuEadc = (nu_eadc_t)device; + RT_ASSERT(device != RT_NULL); + + if (channel >= DEF_EADC_MAX_CHANNEL_NUM) + return -(RT_EINVAL); + + if (enabled) + { + if (psNuEadc->chnmask == 0) + { + /* Invoke Open function at first call. */ + EADC_Open(psNuEadc->base, EADC_CTL_DIFFEN_SINGLE_END); + } + psNuEadc->chnmask |= (1 << channel); + } + else + { + psNuEadc->chnmask &= ~(1 << channel); + + if (psNuEadc->chnmask == 0) + { + /* Invoke Open function at last call. */ + EADC_Close(psNuEadc->base); + } + } + + return RT_EOK; +} + +static rt_err_t nu_get_eadc_value(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value) +{ + nu_eadc_t psNuEadc = (nu_eadc_t)device; + + RT_ASSERT(device != RT_NULL); + RT_ASSERT(value != RT_NULL); + + if (channel >= DEF_EADC_MAX_CHANNEL_NUM) + { + *value = 0xFFFFFFFF; + return -(RT_EINVAL); + } + + if ((psNuEadc->chnmask & (1 << channel)) == 0) + { + *value = 0xFFFFFFFF; + return -(RT_EBUSY); + } + + EADC_ConfigSampleModule(psNuEadc->base, 0, EADC_SOFTWARE_TRIGGER, channel); + + EADC_CLR_INT_FLAG(psNuEadc->base, EADC_STATUS2_ADIF0_Msk); + + EADC_ENABLE_INT(psNuEadc->base, BIT0); + + EADC_ENABLE_SAMPLE_MODULE_INT(psNuEadc->base, 0, BIT0); + + EADC_START_CONV(psNuEadc->base, BIT0); + + while (EADC_GET_INT_FLAG(psNuEadc->base, BIT0) == 0); + + *value = EADC_GET_CONV_DATA(psNuEadc->base, 0); + + return RT_EOK; +} + +int rt_hw_eadc_init(void) +{ + int i; + rt_err_t ret = RT_EOK; + + for (i = (EADC_START + 1); i < EADC_CNT; i++) + { + CLK_EnableModuleClock(nu_eadc_arr[i].modid); + SYS_ResetModule(nu_eadc_arr[i].rstidx); + + ret = rt_hw_adc_register(&nu_eadc_arr[i].parent, nu_eadc_arr[i].name, &nu_adc_ops, &nu_eadc_arr[i]); + RT_ASSERT(ret == RT_EOK); + } + + return (int)ret; +} +INIT_BOARD_EXPORT(rt_hw_eadc_init); + +#endif //#if defined(BSP_USING_EADC) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_ecap.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_ecap.c new file mode 100644 index 0000000000..c5729cadc4 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_ecap.c @@ -0,0 +1,287 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-10-7 Wayne First version +* +******************************************************************************/ +#include + +#if defined(BSP_USING_ECAP) + +#include +#include "drv_sys.h" +#include "drv_common.h" +#include "nu_bitutil.h" + +#define ECAP_CHANNEL_NUM 0x3 +#define ECAP_CHANNEL_MSK ((1<CTL1 = ((ecap)->CTL1 & ECAP_CTL1_CLKSEL_Msk)>>ECAP_CTL1_CLKSEL_Pos) + +/* Public functions -------------------------------------------------------------*/ + + +/* Private variables ------------------------------------------------------------*/ +static struct nu_ecap nu_ecap_arr [] = +{ +#if defined(BSP_USING_ECAP0) + { .base = ECAP0, .name = "ecap0i0", .irqn = ECAP0_IRQn, .rstidx = ECAP0_RST, .modid = ECAP0_MODULE }, + { .base = ECAP0, .name = "ecap0i1", .irqn = ECAP0_IRQn, .rstidx = ECAP0_RST, .modid = ECAP0_MODULE }, + { .base = ECAP0, .name = "ecap0i2", .irqn = ECAP0_IRQn, .rstidx = ECAP0_RST, .modid = ECAP0_MODULE }, +#endif +#if defined(BSP_USING_ECAP1) + { .base = ECAP1, .name = "ecap1i0", .irqn = ECAP1_IRQn, .rstidx = ECAP1_RST, .modid = ECAP1_MODULE }, + { .base = ECAP1, .name = "ecap1i1", .irqn = ECAP1_IRQn, .rstidx = ECAP1_RST, .modid = ECAP1_MODULE }, + { .base = ECAP1, .name = "ecap1i2", .irqn = ECAP1_IRQn, .rstidx = ECAP1_RST, .modid = ECAP1_MODULE }, +#endif +#if defined(BSP_USING_ECAP2) + { .base = ECAP2, .name = "ecap2i0", .irqn = ECAP2_IRQn, .rstidx = ECAP1_RST, .modid = ECAP2_MODULE }, + { .base = ECAP2, .name = "ecap2i1", .irqn = ECAP2_IRQn, .rstidx = ECAP1_RST, .modid = ECAP2_MODULE }, + { .base = ECAP2, .name = "ecap2i2", .irqn = ECAP2_IRQn, .rstidx = ECAP1_RST, .modid = ECAP2_MODULE }, +#endif +}; + +static struct rt_inputcapture_ops nu_ecap_ops = +{ + .init = nu_ecap_init, + .open = nu_ecap_open, + .close = nu_ecap_close, + .get_pulsewidth = nu_ecap_get_pulsewidth, +}; + +/* Functions define ------------------------------------------------------------*/ +static void nu_ecap_isr(int vector, void *param) +{ + /* Get base address of uart register */ + rt_int32_t irqindex; + nu_ecap_t psNuEcap = (nu_ecap_t)param; + ECAP_T *base = psNuEcap->base; + + /* Get input Capture status */ + uint32_t u32Status = ECAP_GET_INT_STATUS(base); + uint32_t u32ChStatus = u32Status & ECAP_CHANNEL_MSK; + + /* Check input capture channel flag */ + /* Find index of pin is attached in pool. */ + while ((irqindex = nu_ctz(u32ChStatus)) < ECAP_CHANNEL_NUM) // Count Trailing Zeros ==> Find First One + { + if (u32Status & (ECAP_STATUS_CAPTF0_Msk << (psNuEcap->u8Channel))) + { + /* Clear input capture channel flag */ + ECAP_CLR_CAPTURE_FLAG(base, ECAP_STATUS_CAPTF0_Msk << (psNuEcap->u8Channel)); + + psNuEcap->input_data_level = NU_ECAP_GET_LEVEL(u32Status, psNuEcap->u8Channel); + + psNuEcap->u32CurrentCnt = ECAP_GET_CNT_HOLD_VALUE(base, psNuEcap->u8Channel); + + rt_hw_inputcapture_isr(&psNuEcap->parent, psNuEcap->input_data_level); + } + } +} + +static rt_err_t nu_ecap_get_pulsewidth(struct rt_inputcapture_device *inputcapture, rt_uint32_t *pulsewidth_us) +{ + rt_err_t ret = RT_EOK; + float fTempCnt; + nu_ecap_t psNuEcap = (nu_ecap_t) inputcapture; + + RT_ASSERT(inputcapture != RT_NULL); + + if (psNuEcap->bfirstData) + { + psNuEcap->bfirstData = RT_FALSE; + ret = RT_ERROR; + + return -(ret); + } + + if (psNuEcap->u32CurrentCnt > psNuEcap->u32LastCnt) + fTempCnt = psNuEcap->u32CurrentCnt - psNuEcap->u32LastCnt; + else /* Overrun case */ + fTempCnt = psNuEcap->u32CurrentCnt + ((0x1000000 - psNuEcap->u32LastCnt) + 1); + + *pulsewidth_us = (int)(fTempCnt * psNuEcap->fUsPerTick); + + psNuEcap->u32LastCnt = psNuEcap->u32CurrentCnt; + + return -(ret); +} + +static float get_ecap_tick_time_us(nu_ecap_t psNuEcap) +{ + uint8_t u8ClockDivider[8] = { 1, 4, 16, 32, 64, 96, 112, 128}; + + if (psNuEcap->base == ECAP0) + return ((float)1000000 / ((float)CLK_GetPCLK2Freq() / u8ClockDivider[(psNuEcap->base->CTL1 & ECAP_CTL1_CLKSEL_Msk) >> ECAP_CTL1_CLKSEL_Pos])); + else + return ((float)1000000 / ((float)CLK_GetPCLK1Freq() / u8ClockDivider[(psNuEcap->base->CTL1 & ECAP_CTL1_CLKSEL_Msk) >> ECAP_CTL1_CLKSEL_Pos])); +} + +static rt_err_t nu_ecap_init(struct rt_inputcapture_device *inputcapture) +{ + return RT_EOK; +} + +static rt_err_t nu_ecap_open(struct rt_inputcapture_device *inputcapture) +{ + rt_err_t ret = RT_EOK; + nu_ecap_t psNuEcap = (nu_ecap_t) inputcapture; + + RT_ASSERT(inputcapture != RT_NULL); + + psNuEcap->fUsPerTick = get_ecap_tick_time_us(psNuEcap); + + /* Enable ECAP Input Channel */ + ECAP_ENABLE_INPUT_CHANNEL(psNuEcap->base, 0x1 << (ECAP_CTL0_IC0EN_Pos + psNuEcap->u8Channel)); + + /* Input Channel interrupt enabled */ + ECAP_EnableINT(psNuEcap->base, 0x1 << (ECAP_CTL0_CAPIEN0_Pos + psNuEcap->u8Channel)); + + /* Enable interrupt. */ + if ((psNuEcap->base->CTL0 & (ECAP_CHANNEL_MSK << ECAP_CTL0_CAPIEN0_Pos)) != 0U) + rt_hw_interrupt_umask(psNuEcap->irqn); + + /* ECAP_CNT starts up-counting */ + ECAP_CNT_START(psNuEcap->base); + + return ret; +} + +static rt_err_t nu_ecap_close(struct rt_inputcapture_device *inputcapture) +{ + rt_err_t ret = RT_EOK; + + nu_ecap_t psNuEcap = (nu_ecap_t) inputcapture; + + RT_ASSERT(inputcapture != RT_NULL); + + /* Input Channel interrupt disabled */ + ECAP_DisableINT(psNuEcap->base, 0x1 << (ECAP_CTL0_CAPIEN0_Pos + psNuEcap->u8Channel)); + + /* Disable interrupt. */ + if ((psNuEcap->base->CTL0 & (ECAP_CHANNEL_MSK << ECAP_CTL0_CAPIEN0_Pos)) == 0U) + rt_hw_interrupt_mask(psNuEcap->irqn); + + /* Disable ECAP Input Channel */ + ECAP_DISABLE_INPUT_CHANNEL(psNuEcap->base, 0x1 << (ECAP_CTL0_IC0EN_Pos + psNuEcap->u8Channel)); + + /* Clear input capture channel flag */ + ECAP_CLR_CAPTURE_FLAG(psNuEcap->base, 0x1 << (ECAP_STATUS_CAPTF0_Pos + psNuEcap->u8Channel)); + + return ret; +} + +static void nu_ecap_channel_init(ECAP_T *base) +{ + /* Enable ECAP */ + ECAP_Open(base, ECAP_DISABLE_COMPARE); + + ECAP_SEL_TIMER_CLK_DIV(base, ECAP_CLK_DIV); + + /* Select Reload function */ + ECAP_SET_CNT_CLEAR_EVENT(base, ECAP_CTL1_OVRLDEN_Msk); + + /* Enable ECAP source IC */ + ECAP_SEL_INPUT_SRC(base, ECAP_IC0, ECAP_CAP_INPUT_SRC_FROM_IC); + ECAP_SEL_INPUT_SRC(base, ECAP_IC1, ECAP_CAP_INPUT_SRC_FROM_IC); + ECAP_SEL_INPUT_SRC(base, ECAP_IC2, ECAP_CAP_INPUT_SRC_FROM_IC); + + /* Select IC detect rising edge */ + ECAP_SEL_CAPTURE_EDGE(base, ECAP_IC0, ECAP_RISING_FALLING_EDGE); + ECAP_SEL_CAPTURE_EDGE(base, ECAP_IC1, ECAP_RISING_FALLING_EDGE); + ECAP_SEL_CAPTURE_EDGE(base, ECAP_IC2, ECAP_RISING_FALLING_EDGE); +} + +/* Init and register ecap capture */ +static int rt_hw_ecap_init(void) +{ + int i; + rt_err_t ret = RT_EOK; + + for (i = (ECAP_START + 1); i < ECAP_CNT; i++) + { + nu_ecap_t psNuEcap = &nu_ecap_arr[i]; + + psNuEcap->u8Channel = i % ECAP_CHANNEL_NUM; + psNuEcap->bfirstData = RT_TRUE; + psNuEcap->u32CurrentCnt = 0; + psNuEcap->u32LastCnt = 0; + psNuEcap->parent.ops = &nu_ecap_ops; + + if ((psNuEcap->u8Channel % ECAP_CHANNEL_NUM) == 0) + { + /* register ecap module */ + CLK_EnableModuleClock(psNuEcap->modid); + SYS_ResetModule(psNuEcap->rstidx); + + nu_ecap_channel_init(psNuEcap->base); + + /* register isr */ + rt_hw_interrupt_install(psNuEcap->irqn, nu_ecap_isr, psNuEcap, psNuEcap->name); + } + + /* register inputcapture device */ + ret = rt_device_inputcapture_register(&psNuEcap->parent, psNuEcap->name, psNuEcap); + RT_ASSERT(ret == RT_EOK); + } + + return 0; +} +INIT_DEVICE_EXPORT(rt_hw_ecap_init); + +#endif //#if defined(BSP_USING_ECAP) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_epwm.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_epwm.c new file mode 100644 index 0000000000..40fb503e83 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_epwm.c @@ -0,0 +1,210 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-9-22 Wayne First version +* +******************************************************************************/ + +#include + +#if (defined(BSP_USING_EPWM) && defined(RT_USING_PWM)) + +#define LOG_TAG "drv.epwm" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL DBG_INFO +#define DBG_COLOR +#include + +#include +#include +#include "NuMicro.h" + +enum +{ + EPWM_START = -1, +#if defined(BSP_USING_EPWM0_PWM) + EPWM0_IDX, +#endif +#if defined(BSP_USING_EPWM1_PWM) + EPWM1_IDX, +#endif +#if defined(BSP_USING_EPWM2_PWM) + EPWM2_IDX, +#endif + EPWM_CNT +}; + +struct nu_epwm +{ + struct rt_device_pwm dev; + char *name; + EPWM_T *base; + uint32_t rstidx; + uint32_t modid; +}; + +typedef struct nu_epwm *nu_epwm_t; + +static struct nu_epwm nu_epwm_arr [] = +{ +#if defined(BSP_USING_EPWM0_PWM) + { .name = "epwm0", .base = EPWM0, .rstidx = EPWM0_RST, .modid = EPWM0_MODULE }, +#endif + +#if defined(BSP_USING_EPWM1_PWM) + { .name = "epwm1", .base = EPWM1, .rstidx = EPWM1_RST, .modid = EPWM1_MODULE }, +#endif + +#if defined(BSP_USING_EPWM2_PWM) + { .name = "epwm2", .base = EPWM2, .rstidx = EPWM2_RST, .modid = EPWM2_MODULE }, +#endif + +}; /* epwm nu_epwm */ + +static rt_err_t nu_epwm_control(struct rt_device_pwm *device, int cmd, void *arg); + +static struct rt_pwm_ops nu_epwm_ops = +{ + .control = nu_epwm_control +}; + +static rt_err_t nu_epwm_enable(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration, rt_bool_t enable) +{ + rt_err_t result = RT_EOK; + + EPWM_T *pwm_base = ((nu_epwm_t)device)->base; + rt_uint32_t pwm_channel = ((struct rt_pwm_configuration *)configuration)->channel; + + if (enable == RT_TRUE) + { + EPWM_EnableOutput(pwm_base, 1 << pwm_channel); + EPWM_Start(pwm_base, 1 << pwm_channel); + } + else + { + EPWM_DisableOutput(pwm_base, 1 << pwm_channel); + EPWM_ForceStop(pwm_base, 1 << pwm_channel); + } + + return result; +} + +static rt_err_t nu_epwm_set(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration) +{ + if ((((struct rt_pwm_configuration *)configuration)->period) <= 0) + return -(RT_ERROR); + + rt_uint8_t pwm_channel_pair; + rt_uint32_t pwm_freq, pwm_dutycycle ; + EPWM_T *pwm_base = ((nu_epwm_t)device)->base; + rt_uint8_t pwm_channel = ((struct rt_pwm_configuration *)configuration)->channel; + rt_uint32_t pwm_period = ((struct rt_pwm_configuration *)configuration)->period; + rt_uint32_t pwm_pulse = ((struct rt_pwm_configuration *)configuration)->pulse; + rt_uint32_t pre_pwm_prescaler = EPWM_GET_PRESCALER(pwm_base, pwm_channel); + + if ((pwm_channel % 2) == 0) + pwm_channel_pair = pwm_channel + 1; + else + pwm_channel_pair = pwm_channel - 1; + + pwm_freq = (uint64_t)1000000000 / pwm_period; + pwm_dutycycle = (pwm_pulse * 100) / pwm_period; + + EPWM_ConfigOutputChannel(pwm_base, pwm_channel, pwm_freq, pwm_dutycycle) ; + + if ((pre_pwm_prescaler != 0) || (EPWM_GET_CNR(pwm_base, pwm_channel_pair) != 0) || (EPWM_GET_CMR(pwm_base, pwm_channel_pair) != 0)) + { + if (pre_pwm_prescaler < EPWM_GET_PRESCALER(pwm_base, pwm_channel)) + { + EPWM_SET_CNR(pwm_base, pwm_channel_pair, ((EPWM_GET_CNR(pwm_base, pwm_channel_pair) + 1) * (pre_pwm_prescaler + 1)) / (EPWM_GET_PRESCALER(pwm_base, pwm_channel) + 1)); + EPWM_SET_CMR(pwm_base, pwm_channel_pair, (EPWM_GET_CMR(pwm_base, pwm_channel_pair) * (pre_pwm_prescaler + 1)) / (EPWM_GET_PRESCALER(pwm_base, pwm_channel) + 1)); + } + else if (pre_pwm_prescaler > EPWM_GET_PRESCALER(pwm_base, pwm_channel)) + { + EPWM_SET_CNR(pwm_base, pwm_channel, ((EPWM_GET_CNR(pwm_base, pwm_channel) + 1) * (EPWM_GET_PRESCALER(pwm_base, pwm_channel) + 1)) / (pre_pwm_prescaler + 1)); + EPWM_SET_CMR(pwm_base, pwm_channel, (EPWM_GET_CMR(pwm_base, pwm_channel) * (EPWM_GET_PRESCALER(pwm_base, pwm_channel) + 1)) / (pre_pwm_prescaler + 1)); + } + } + return RT_EOK; +} + +static rt_uint32_t nu_epwm_clksr(struct rt_device_pwm *device) +{ + return CLK_GetPCLK0Freq(); //Both PCLK0 && PCLK1 are the same. +} + +static rt_err_t nu_epwm_get(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration) +{ + rt_uint32_t pwm_real_period, pwm_real_duty, time_tick, u32EPWMClockSrc ; + + EPWM_T *pwm_base = ((nu_epwm_t)device)->base; + rt_uint32_t pwm_channel = ((struct rt_pwm_configuration *)configuration)->channel; + rt_uint32_t pwm_prescale = EPWM_GET_PRESCALER(pwm_base, pwm_channel); + rt_uint32_t pwm_period = EPWM_GET_CNR(pwm_base, pwm_channel); + rt_uint32_t pwm_pulse = EPWM_GET_CMR(pwm_base, pwm_channel); + + u32EPWMClockSrc = nu_epwm_clksr(device); + time_tick = (uint64_t)1000000000000 / u32EPWMClockSrc; + + pwm_real_period = (((pwm_prescale + 1) * (pwm_period + 1)) * time_tick) / 1000; + pwm_real_duty = (((pwm_prescale + 1) * pwm_pulse * time_tick)) / 1000; + ((struct rt_pwm_configuration *)configuration)->period = pwm_real_period; + ((struct rt_pwm_configuration *)configuration)->pulse = pwm_real_duty; + + LOG_I("%s %d %d %d\n", ((nu_epwm_t)device)->name, configuration->channel, configuration->period, configuration->pulse); + + return RT_EOK; +} + +static rt_err_t nu_epwm_control(struct rt_device_pwm *device, int cmd, void *arg) +{ + struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg; + + RT_ASSERT(device != RT_NULL); + RT_ASSERT(configuration != RT_NULL); + + if (((((struct rt_pwm_configuration *)configuration)->channel) + 1) > EPWM_CHANNEL_NUM) + return -(RT_ERROR); + + switch (cmd) + { + case PWM_CMD_ENABLE: + return nu_epwm_enable(device, configuration, RT_TRUE); + case PWM_CMD_DISABLE: + return nu_epwm_enable(device, configuration, RT_FALSE); + case PWM_CMD_SET: + return nu_epwm_set(device, configuration); + case PWM_CMD_GET: + return nu_epwm_get(device, configuration); + } + return -(RT_EINVAL); +} + +int rt_hw_epwm_init(void) +{ + rt_err_t ret; + int i; + + for (i = (EPWM_START + 1); i < EPWM_CNT; i++) + { + + CLK_EnableModuleClock(nu_epwm_arr[i].modid); + + SYS_ResetModule(nu_epwm_arr[i].rstidx); + + ret = rt_device_pwm_register(&nu_epwm_arr[i].dev, nu_epwm_arr[i].name, &nu_epwm_ops, &nu_epwm_arr[i]); + RT_ASSERT(ret == RT_EOK); + } + + return 0; +} + +INIT_DEVICE_EXPORT(rt_hw_epwm_init); + +#endif diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_epwm_capture.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_epwm_capture.c new file mode 100644 index 0000000000..4e97fe5e03 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_epwm_capture.c @@ -0,0 +1,289 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-10-19 Wayne First version +* +******************************************************************************/ +#include + +#if defined(BSP_USING_EPWM_CAPTURE) + +#include +#include "drv_sys.h" +#include "drv_common.h" + +/* Private typedef --------------------------------------------------------------*/ +enum +{ + EPWM_START = -1, +#if defined(BSP_USING_EPWM0_CAPTURE) + EPWM0I0_IDX, + EPWM0I1_IDX, + EPWM0I2_IDX, + EPWM0I3_IDX, + EPWM0I4_IDX, + EPWM0I5_IDX, +#endif +#if defined(BSP_USING_EPWM1_CAPTURE) + EPWM1I0_IDX, + EPWM1I1_IDX, + EPWM1I2_IDX, + EPWM1I3_IDX, + EPWM1I4_IDX, + EPWM1I5_IDX, +#endif +#if defined(BSP_USING_EPWM2_CAPTURE) + EPWM2I0_IDX, + EPWM2I1_IDX, + EPWM2I2_IDX, + EPWM2I3_IDX, + EPWM2I4_IDX, + EPWM2I5_IDX, +#endif + EPWM_CNT +}; + +struct nu_epwmcap +{ + struct rt_inputcapture_device parent; + EPWM_T *base; + char *name; + IRQn_Type irqn; + uint32_t rstidx; + uint32_t modid; + + uint8_t u8Channel; + uint32_t u32CurrentRisingCnt; + uint32_t u32CurrentFallingCnt; + rt_bool_t input_data_level; +}; +typedef struct nu_epwmcap *nu_epwmcap_t; + +/* Private functions ------------------------------------------------------------*/ +static rt_err_t nu_epwmcap_init(struct rt_inputcapture_device *inputcapture); +static rt_err_t nu_epwmcap_open(struct rt_inputcapture_device *inputcapture); +static rt_err_t nu_epwmcap_close(struct rt_inputcapture_device *inputcapture); +static rt_err_t nu_epwmcap_get_pulsewidth(struct rt_inputcapture_device *inputcapture, rt_uint32_t *pulsewidth_us); + +/* Public functions -------------------------------------------------------------*/ + + +/* Private variables ------------------------------------------------------------*/ +static struct nu_epwmcap nu_epwmcap_arr [] = +{ +#if defined(BSP_USING_EPWM0_CAPTURE) + { .base = EPWM0, .name = "epwm0i0", .irqn = EPWM0P0_IRQn, .rstidx = EPWM0_RST, .modid = EPWM0_MODULE }, + { .base = EPWM0, .name = "epwm0i1", .irqn = EPWM0P0_IRQn, .rstidx = EPWM0_RST, .modid = EPWM0_MODULE }, + { .base = EPWM0, .name = "epwm0i2", .irqn = EPWM0P1_IRQn, .rstidx = EPWM0_RST, .modid = EPWM0_MODULE }, + { .base = EPWM0, .name = "epwm0i3", .irqn = EPWM0P1_IRQn, .rstidx = EPWM0_RST, .modid = EPWM0_MODULE }, + { .base = EPWM0, .name = "epwm0i4", .irqn = EPWM0P2_IRQn, .rstidx = EPWM0_RST, .modid = EPWM0_MODULE }, + { .base = EPWM0, .name = "epwm0i5", .irqn = EPWM0P2_IRQn, .rstidx = EPWM0_RST, .modid = EPWM0_MODULE }, +#endif +#if defined(BSP_USING_EPWM1_CAPTURE) + { .base = EPWM1, .name = "epwm1i0", .irqn = EPWM1P0_IRQn, .rstidx = EPWM1_RST, .modid = EPWM1_MODULE }, + { .base = EPWM1, .name = "epwm1i1", .irqn = EPWM1P0_IRQn, .rstidx = EPWM1_RST, .modid = EPWM1_MODULE }, + { .base = EPWM1, .name = "epwm1i2", .irqn = EPWM1P1_IRQn, .rstidx = EPWM1_RST, .modid = EPWM1_MODULE }, + { .base = EPWM1, .name = "epwm1i3", .irqn = EPWM1P1_IRQn, .rstidx = EPWM1_RST, .modid = EPWM1_MODULE }, + { .base = EPWM1, .name = "epwm1i4", .irqn = EPWM1P2_IRQn, .rstidx = EPWM1_RST, .modid = EPWM1_MODULE }, + { .base = EPWM1, .name = "epwm1i5", .irqn = EPWM1P2_IRQn, .rstidx = EPWM1_RST, .modid = EPWM1_MODULE }, +#endif +#if defined(BSP_USING_EPWM2_CAPTURE) + { .base = EPWM2, .name = "epwm2i0", .irqn = EPWM2P0_IRQn, .rstidx = EPWM2_RST, .modid = EPWM2_MODULE }, + { .base = EPWM2, .name = "epwm2i1", .irqn = EPWM2P0_IRQn, .rstidx = EPWM2_RST, .modid = EPWM2_MODULE }, + { .base = EPWM2, .name = "epwm2i2", .irqn = EPWM2P1_IRQn, .rstidx = EPWM2_RST, .modid = EPWM2_MODULE }, + { .base = EPWM2, .name = "epwm2i3", .irqn = EPWM2P1_IRQn, .rstidx = EPWM2_RST, .modid = EPWM2_MODULE }, + { .base = EPWM2, .name = "epwm2i4", .irqn = EPWM2P2_IRQn, .rstidx = EPWM2_RST, .modid = EPWM2_MODULE }, + { .base = EPWM2, .name = "epwm2i5", .irqn = EPWM2P2_IRQn, .rstidx = EPWM2_RST, .modid = EPWM2_MODULE }, +#endif +}; + +static struct rt_inputcapture_ops nu_epwmcap_ops = +{ + .init = nu_epwmcap_init, + .open = nu_epwmcap_open, + .close = nu_epwmcap_close, + .get_pulsewidth = nu_epwmcap_get_pulsewidth, +}; + +/* Functions define ------------------------------------------------------------*/ +static rt_err_t CalPulseWidth(nu_epwmcap_t psNuEpwmCap) +{ + rt_bool_t bWrapAroundFlag = RT_FALSE; + + /* Check rising/falling capture counter is overflow or not */ + if (EPWM_GetWrapAroundFlag(psNuEpwmCap->base, psNuEpwmCap->u8Channel)) + { + EPWM_ClearWrapAroundFlag(psNuEpwmCap->base, psNuEpwmCap->u8Channel); + bWrapAroundFlag = RT_TRUE; + } + + /* Read the capture counter value if falling/rising edge */ + if (EPWM_GetCaptureIntFlag(psNuEpwmCap->base, psNuEpwmCap->u8Channel) == 1)//Rising edge + { + EPWM_ClearCaptureIntFlag(psNuEpwmCap->base, psNuEpwmCap->u8Channel, EPWM_CAPTURE_INT_RISING_LATCH); + + if (bWrapAroundFlag) + { + psNuEpwmCap->u32CurrentRisingCnt = 0x10000; + } + psNuEpwmCap->u32CurrentRisingCnt += EPWM_GET_CAPTURE_RISING_DATA(psNuEpwmCap->base, psNuEpwmCap->u8Channel); + } + else if (EPWM_GetCaptureIntFlag(psNuEpwmCap->base, psNuEpwmCap->u8Channel) == 2)//Falling edge + { + EPWM_ClearCaptureIntFlag(psNuEpwmCap->base, psNuEpwmCap->u8Channel, EPWM_CAPTURE_INT_FALLING_LATCH); + + if (bWrapAroundFlag) + { + psNuEpwmCap->u32CurrentFallingCnt = 0x10000; + } + psNuEpwmCap->u32CurrentFallingCnt += EPWM_GET_CAPTURE_FALLING_DATA(psNuEpwmCap->base, psNuEpwmCap->u8Channel); + } + else //Rising & Falling edge + { + EPWM_ClearCaptureIntFlag(psNuEpwmCap->base, psNuEpwmCap->u8Channel, EPWM_CAPTURE_INT_RISING_LATCH); + EPWM_ClearCaptureIntFlag(psNuEpwmCap->base, psNuEpwmCap->u8Channel, EPWM_CAPTURE_INT_FALLING_LATCH); + + return -(RT_ERROR); + } + + return RT_EOK; +} + +static void nu_epwmcap_isr(int vector, void *param) +{ + nu_epwmcap_t psNuEpwmCap = (nu_epwmcap_t)param; + + if (EPWM_GetCaptureIntFlag(psNuEpwmCap->base, psNuEpwmCap->u8Channel) != 0) + { + /* Calculate pulse width */ + if (CalPulseWidth(psNuEpwmCap) == RT_EOK) + { + rt_hw_inputcapture_isr(&psNuEpwmCap->parent, psNuEpwmCap->input_data_level); + } + } +} + +static rt_err_t nu_epwmcap_get_pulsewidth(struct rt_inputcapture_device *inputcapture, rt_uint32_t *pulsewidth_us) +{ + rt_err_t ret = RT_EOK; + nu_epwmcap_t psNuEpwmCap = (nu_epwmcap_t)inputcapture; + + RT_ASSERT(psNuEpwmCap != RT_NULL); + + if (psNuEpwmCap->u32CurrentFallingCnt) + { + *pulsewidth_us = psNuEpwmCap->u32CurrentFallingCnt; + psNuEpwmCap->input_data_level = RT_FALSE; + psNuEpwmCap->u32CurrentFallingCnt = 0; + } + else if (psNuEpwmCap->u32CurrentRisingCnt) + { + *pulsewidth_us = psNuEpwmCap->u32CurrentRisingCnt; + psNuEpwmCap->input_data_level = RT_TRUE; + psNuEpwmCap->u32CurrentRisingCnt = 0; + } + else + { + ret = RT_ERROR; + } + return -(ret); +} + +static rt_err_t nu_epwmcap_init(struct rt_inputcapture_device *inputcapture) +{ + return RT_EOK; +} + +static rt_err_t nu_epwmcap_open(struct rt_inputcapture_device *inputcapture) +{ + rt_err_t ret = RT_EOK; + nu_epwmcap_t psNuEpwmCap = (nu_epwmcap_t) inputcapture; + + RT_ASSERT(psNuEpwmCap != RT_NULL); + + /* Set capture time as 1000 nanosecond */ + EPWM_ConfigCaptureChannel(psNuEpwmCap->base, psNuEpwmCap->u8Channel, 1000, 0); + + /* Enable capture rising/falling edge interrupt */ + EPWM_EnableCaptureInt(psNuEpwmCap->base, psNuEpwmCap->u8Channel, EPWM_CAPTURE_INT_FALLING_LATCH | EPWM_CAPTURE_INT_RISING_LATCH); + + /* Enable Capture Function for EPWM */ + EPWM_EnableCapture(psNuEpwmCap->base, 0x1 << psNuEpwmCap->u8Channel); + + /* Enable rising/falling capture reload */ + psNuEpwmCap->base->CAPCTL |= (0x1 << (EPWM_CAPCTL_RCRLDEN0_Pos + psNuEpwmCap->u8Channel)) + | (0x1 << (EPWM_CAPCTL_FCRLDEN0_Pos + psNuEpwmCap->u8Channel)); + + /* Set counter type as down count */ + EPWM_SET_ALIGNED_TYPE(psNuEpwmCap->base, 0x1 << psNuEpwmCap->u8Channel, EPWM_UP_COUNTER); + + /* Enable EPWM Timer */ + EPWM_Start(psNuEpwmCap->base, 0x1 << psNuEpwmCap->u8Channel); + + /* Enable EPWMxPx interrupt. */ + rt_hw_interrupt_umask(psNuEpwmCap->irqn); + + return ret; +} + +static rt_err_t nu_epwmcap_close(struct rt_inputcapture_device *inputcapture) +{ + rt_err_t ret = RT_EOK; + + nu_epwmcap_t psNuEpwmCap = (nu_epwmcap_t) inputcapture; + + RT_ASSERT(psNuEpwmCap != RT_NULL); + + /* Disable capture rising/falling edge interrupt */ + EPWM_DisableCaptureInt(psNuEpwmCap->base, psNuEpwmCap->u8Channel, EPWM_CAPTURE_INT_FALLING_LATCH | EPWM_CAPTURE_INT_RISING_LATCH); + + /* Stop EPWM Timer */ + EPWM_ForceStop(psNuEpwmCap->base, 0x1 << psNuEpwmCap->u8Channel); + + /* Disable EPWMxPx interrupt */ + if ((psNuEpwmCap->base->CNTEN & (0x3 << (psNuEpwmCap->u8Channel / 2 * 2))) == 0u) + rt_hw_interrupt_mask(psNuEpwmCap->irqn); + + return ret; +} + +/* Init and register epwm capture */ +int rt_hw_epwmcap_init(void) +{ + int i; + rt_err_t ret = RT_EOK; + + for (i = (EPWM_START + 1); i < EPWM_CNT; i++) + { + nu_epwmcap_t psNuEpwmCap = &nu_epwmcap_arr[i]; + + psNuEpwmCap->u8Channel = i % EPWM_CHANNEL_NUM; + psNuEpwmCap->u32CurrentRisingCnt = 0; + psNuEpwmCap->u32CurrentFallingCnt = 0; + psNuEpwmCap->parent.ops = &nu_epwmcap_ops; + + if ((psNuEpwmCap->u8Channel % EPWM_CHANNEL_NUM) == 0) + { + /* Enable epwm module */ + CLK_EnableModuleClock(psNuEpwmCap->modid); + SYS_ResetModule(psNuEpwmCap->rstidx); + + /* register isr */ + rt_hw_interrupt_install(psNuEpwmCap->irqn, nu_epwmcap_isr, psNuEpwmCap, psNuEpwmCap->name); + } + + /* register inputcapture device */ + ret = rt_device_inputcapture_register(&psNuEpwmCap->parent, psNuEpwmCap->name, psNuEpwmCap); + RT_ASSERT(ret == RT_EOK); + } + + return 0; +} +INIT_DEVICE_EXPORT(rt_hw_epwmcap_init); + +#endif //#if defined(BSP_USING_EPWM_CAPTURE) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_gpio.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_gpio.c new file mode 100644 index 0000000000..0a7a75ee9b --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_gpio.c @@ -0,0 +1,341 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-07-23 Wayne First version +* +******************************************************************************/ + +#include + +#if (defined(BSP_USING_GPIO) && defined(RT_USING_PIN)) + +#include +#include +#include "drv_common.h" +#include +#include "nu_bitutil.h" +#include "stdlib.h" + +/* Private define ---------------------------------------------------------------*/ + +#define PORT_OFFSET 0x40 +#define IRQ_MAX_NUM 16 //Max support 32 + +/* Private functions ------------------------------------------------------------*/ + +static void nu_gpio_mode(struct rt_device *device, rt_base_t pin, rt_base_t mode); +static void nu_gpio_write(struct rt_device *device, rt_base_t pin, rt_base_t value); +static int nu_gpio_read(struct rt_device *device, rt_base_t pin); +static rt_err_t nu_gpio_attach_irq(struct rt_device *device, rt_int32_t pin, rt_uint32_t mode, void (*hdr)(void *args), void *args); +static rt_err_t nu_gpio_detach_irq(struct rt_device *device, rt_int32_t pin); +static rt_err_t nu_gpio_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled); +static rt_base_t nu_gpio_pin_get(const char *name); + +/* Private variables ------------------------------------------------------------*/ +static struct rt_pin_irq_hdr pin_irq_hdr_tab[IRQ_MAX_NUM]; +static struct rt_pin_ops nu_gpio_ops = +{ + nu_gpio_mode, + nu_gpio_write, + nu_gpio_read, + nu_gpio_attach_irq, + nu_gpio_detach_irq, + nu_gpio_irq_enable, + nu_gpio_pin_get, +}; + +static IRQn_Type au32GPIRQ[NU_PORT_CNT] = {GPA_IRQn, GPB_IRQn, GPC_IRQn, GPD_IRQn, GPE_IRQn, GPF_IRQn, GPG_IRQn, GPH_IRQn, GPI_IRQn, GPJ_IRQn, GPK_IRQn, GPL_IRQn, GPM_IRQn, GPN_IRQn}; + +static rt_uint32_t g_u32PinIrqMask = 0x0; + +/* Functions define ------------------------------------------------------------*/ + +static rt_err_t nu_port_check(rt_int32_t pin) +{ + if (NU_GET_PORT(pin) >= NU_PORT_CNT) + return -(RT_ERROR); + + return RT_EOK; +} + +static rt_int32_t nu_find_irqindex(rt_uint32_t pin_index) +{ + rt_int32_t irqindex; + rt_int32_t u32PinIrqStatus = g_u32PinIrqMask; + + // Find index of pin is attached in pool. + while ((irqindex = nu_ctz(u32PinIrqStatus)) < IRQ_MAX_NUM) // Count Trailing Zeros ==> Find First One + { + if (pin_irq_hdr_tab[irqindex].pin == pin_index) + return irqindex; + + u32PinIrqStatus &= ~(1 << irqindex); + } + + return -(RT_ERROR); +} + +static void pin_irq_hdr(rt_uint32_t irq_status, rt_uint32_t port_index) +{ + rt_int32_t irqindex, i; + rt_int32_t pinindex = port_index * GPIO_PIN_MAX ; + + while ((i = nu_ctz(irq_status)) < GPIO_PIN_MAX)// Count Trailing Zeros ==> Find First One + { + int pin_mask = (1 << i); + irqindex = nu_find_irqindex(pinindex + i); + if (irqindex != -(RT_ERROR)) + { + if (pin_irq_hdr_tab[irqindex].hdr) + { + pin_irq_hdr_tab[irqindex].hdr(pin_irq_hdr_tab[irqindex].args); + } + } + // Clear the served bit. + irq_status &= ~pin_mask; + } +} + +static rt_base_t nu_gpio_pin_get(const char *name) +{ + /* Get pin number by name,such as PA.0, PF12 */ + if ((name[2] == '\0') || ((name[2] == '.') && (name[3] == '\0'))) + return -(RT_EINVAL); + + long number; + + if ((name[2] == '.')) + number = atol(&name[3]); + else + number = atol(&name[2]); + + if (number > 15) + return -(RT_EINVAL); + + if (name[1] >= 'A' && name[1] <= 'N') + return ((name[1] - 'A') * 0x10) + number; + + if (name[1] >= 'a' && name[1] <= 'n') + return ((name[1] - 'a') * 0x10) + number; + + return -(RT_EINVAL); +} + +static void nu_gpio_mode(struct rt_device *device, rt_base_t pin, rt_base_t mode) +{ + GPIO_T *PORT; + + if (nu_port_check(pin)) + return; + + PORT = (GPIO_T *)(GPIOA_BASE + (NU_GET_PORT(pin) * PORT_OFFSET)); + + if (mode == PIN_MODE_INPUT_PULLUP) + { + GPIO_SetMode(PORT, NU_GET_PIN_MASK(NU_GET_PINS(pin)), GPIO_MODE_INPUT); + GPIO_SetPullCtl(PORT, NU_GET_PIN_MASK(NU_GET_PINS(pin)), GPIO_PUSEL_PULL_UP); + } + else if (mode == PIN_MODE_INPUT_PULLDOWN) + { + GPIO_SetMode(PORT, NU_GET_PIN_MASK(NU_GET_PINS(pin)), GPIO_MODE_INPUT); + GPIO_SetPullCtl(PORT, NU_GET_PIN_MASK(NU_GET_PINS(pin)), GPIO_PUSEL_PULL_DOWN); + } + else if (mode == PIN_MODE_OUTPUT) + { + GPIO_SetMode(PORT, NU_GET_PIN_MASK(NU_GET_PINS(pin)), GPIO_MODE_OUTPUT); + } + else if (mode == PIN_MODE_INPUT) + { + GPIO_SetMode(PORT, NU_GET_PIN_MASK(NU_GET_PINS(pin)), GPIO_MODE_INPUT); + GPIO_SetPullCtl(PORT, NU_GET_PIN_MASK(NU_GET_PINS(pin)), GPIO_PUSEL_DISABLE); + } + else if (mode == PIN_MODE_OUTPUT_OD) + { + GPIO_SetMode(PORT, NU_GET_PIN_MASK(NU_GET_PINS(pin)), GPIO_MODE_OPEN_DRAIN); + GPIO_SetPullCtl(PORT, NU_GET_PIN_MASK(NU_GET_PINS(pin)), GPIO_PUSEL_DISABLE); + } +} + +static void nu_gpio_write(struct rt_device *device, rt_base_t pin, rt_base_t value) +{ + if (nu_port_check(pin)) + return; + + GPIO_PIN_DATA(NU_GET_PORT(pin), NU_GET_PINS(pin)) = value; +} + +static int nu_gpio_read(struct rt_device *device, rt_base_t pin) +{ + if (nu_port_check(pin)) + return PIN_LOW; + + return GPIO_PIN_DATA(NU_GET_PORT(pin), NU_GET_PINS(pin)); +} + +static rt_err_t nu_gpio_attach_irq(struct rt_device *device, rt_int32_t pin, rt_uint32_t mode, void (*hdr)(void *args), void *args) +{ + rt_base_t level; + rt_int32_t irqindex; + + if (nu_port_check(pin)) + return -(RT_ERROR); + + level = rt_hw_interrupt_disable(); + + // Find index of pin is attached in pool. + if ((irqindex = nu_find_irqindex(pin)) >= 0) + goto exit_nu_gpio_attach_irq; + + // Find available index of pin in pool. + if ((irqindex = nu_cto(g_u32PinIrqMask)) < IRQ_MAX_NUM) // Count Trailing Ones ==> Find First Zero + goto exit_nu_gpio_attach_irq; + + rt_hw_interrupt_enable(level); + + return -(RT_EBUSY); + +exit_nu_gpio_attach_irq: + + pin_irq_hdr_tab[irqindex].pin = pin; + pin_irq_hdr_tab[irqindex].hdr = hdr; + pin_irq_hdr_tab[irqindex].mode = mode; + pin_irq_hdr_tab[irqindex].args = args; + + g_u32PinIrqMask |= (1 << irqindex); + rt_hw_interrupt_enable(level); + + return RT_EOK; +} + +static rt_err_t nu_gpio_detach_irq(struct rt_device *device, rt_int32_t pin) +{ + rt_base_t level; + rt_int32_t irqindex; + rt_int32_t u32PinIrqStatus; + + if (nu_port_check(pin)) + return -(RT_ERROR); + + level = rt_hw_interrupt_disable(); + + u32PinIrqStatus = g_u32PinIrqMask; + + // Find index of pin is attached in pool. + while ((irqindex = nu_ctz(u32PinIrqStatus)) < IRQ_MAX_NUM)// Count Trailing Zeros ==> Find First One + { + if (pin_irq_hdr_tab[irqindex].pin == pin) + { + pin_irq_hdr_tab[irqindex].pin = PIN_IRQ_PIN_NONE; + pin_irq_hdr_tab[irqindex].hdr = RT_NULL; + pin_irq_hdr_tab[irqindex].mode = PIN_IRQ_MODE_RISING; + pin_irq_hdr_tab[irqindex].args = RT_NULL; + g_u32PinIrqMask &= ~(1 << irqindex); + break; + } + u32PinIrqStatus &= ~(1 << irqindex); + } + + rt_hw_interrupt_enable(level); + return RT_EOK; +} + +static void nu_gpio_isr(int vector, void *param) +{ + rt_uint32_t int_status; + GPIO_T *PORT = (GPIO_T *)param; + rt_uint32_t port_idx = ((rt_uint32_t)PORT - GPIOA_BASE) / PORT_OFFSET ; + + int_status = PORT->INTSRC; + pin_irq_hdr(int_status, port_idx); + PORT->INTSRC = int_status; +} + +static rt_err_t nu_gpio_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled) +{ + GPIO_T *PORT; + rt_base_t level; + uint32_t u32IntAttribs; + rt_int32_t irqindex; + rt_err_t ret = RT_EOK; + IRQn_Type irqn; + + if (nu_port_check(pin)) + return -(RT_ERROR); + + level = rt_hw_interrupt_disable(); + + irqindex = nu_find_irqindex(pin); + if (irqindex == -(RT_ERROR)) + { + ret = RT_ERROR; + goto exit_nu_gpio_irq_enable; + } + + PORT = (GPIO_T *)(GPIOA_BASE + (NU_GET_PORT(pin) * PORT_OFFSET)); + + irqn = au32GPIRQ[NU_GET_PORT(pin)]; + + if (enabled == PIN_IRQ_ENABLE) + { + if (pin_irq_hdr_tab[irqindex].mode == PIN_IRQ_MODE_RISING) + u32IntAttribs = GPIO_INT_RISING; + else if (pin_irq_hdr_tab[irqindex].mode == PIN_IRQ_MODE_FALLING) + u32IntAttribs = GPIO_INT_FALLING; + else if (pin_irq_hdr_tab[irqindex].mode == PIN_IRQ_MODE_RISING_FALLING) + u32IntAttribs = GPIO_INT_BOTH_EDGE; + else if (pin_irq_hdr_tab[irqindex].mode == PIN_IRQ_MODE_HIGH_LEVEL) + u32IntAttribs = GPIO_INT_HIGH; + else if (pin_irq_hdr_tab[irqindex].mode == PIN_IRQ_MODE_LOW_LEVEL) + u32IntAttribs = GPIO_INT_LOW; + else + goto exit_nu_gpio_irq_enable; + + GPIO_EnableInt(PORT, NU_GET_PINS(pin), u32IntAttribs); + + rt_hw_interrupt_umask(irqn); + + } + else + { + GPIO_DisableInt(PORT, NU_GET_PINS(pin)); + rt_hw_interrupt_mask(irqn); + } + +exit_nu_gpio_irq_enable: + + rt_hw_interrupt_enable(level); + return -(ret); +} + +int rt_hw_gpio_init(void) +{ + char szTmp[16]; + int i; + rt_int32_t irqindex; + + for (irqindex = 0; irqindex < IRQ_MAX_NUM ; irqindex++) + { + pin_irq_hdr_tab[irqindex].pin = PIN_IRQ_PIN_NONE; + pin_irq_hdr_tab[irqindex].hdr = RT_NULL; + pin_irq_hdr_tab[irqindex].mode = PIN_IRQ_MODE_RISING; + pin_irq_hdr_tab[irqindex].args = RT_NULL; + } + + for (i = 0; i < NU_PORT_CNT ; i++) + { + IRQn_Type irqn = au32GPIRQ[i]; + rt_snprintf(szTmp, sizeof(szTmp), "gpio-%d", i); + rt_hw_interrupt_install(irqn, nu_gpio_isr, (void *)(GPIOA_BASE + (i * PORT_OFFSET)), szTmp); + } + + return rt_device_pin_register("gpio", &nu_gpio_ops, RT_NULL); +} + +INIT_BOARD_EXPORT(rt_hw_gpio_init); + +#endif //#if (defined(BSP_USING_GPIO) && defined(RT_USING_PIN)) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_gpio.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_gpio.h new file mode 100644 index 0000000000..6807ac408c --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_gpio.h @@ -0,0 +1,40 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-8-17 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_GPIO_H__ +#define __DRV_GPIO_H__ + +typedef enum +{ + NU_PA, + NU_PB, + NU_PC, + NU_PD, + NU_PE, + NU_PF, + NU_PG, + NU_PH, + NU_PI, + NU_PJ, + NU_PK, + NU_PL, + NU_PM, + NU_PN, + NU_PORT_CNT, +} nu_gpio_port; + +#define NU_GET_PININDEX(port, pin) (((port)<<4) + (pin)) +#define NU_GET_PINS(rt_pin_index) ((rt_pin_index) & 0x0000000F) +#define NU_GET_PORT(rt_pin_index) (((rt_pin_index)>>4) & 0x0000000F) +#define NU_GET_PIN_MASK(nu_gpio_pin) (1 << (nu_gpio_pin)) + +#endif //__DRV_GPIO_H__ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_i2c.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_i2c.c new file mode 100644 index 0000000000..c4f9781681 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_i2c.c @@ -0,0 +1,409 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-11-11 Wayne First version +******************************************************************************/ + + +#include + +#if defined( BSP_USING_I2C) + +#include +#include "NuMicro.h" +#include +#include + +/* Private define ---------------------------------------------------------------*/ +#define LOG_TAG "drv.i2c" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL DBG_INFO +#define DBG_COLOR +#include + +enum +{ + I2C_START = -1, +#if defined(BSP_USING_I2C0) + I2C0_IDX, +#endif +#if defined(BSP_USING_I2C1) + I2C1_IDX, +#endif +#if defined(BSP_USING_I2C2) + I2C2_IDX, +#endif +#if defined(BSP_USING_I2C3) + I2C3_IDX, +#endif +#if defined(BSP_USING_I2C4) + I2C4_IDX, +#endif +#if defined(BSP_USING_I2C5) + I2C5_IDX, +#endif + I2C_CNT +}; + +/* Private typedef --------------------------------------------------------------*/ +typedef struct _nu_i2c_bus +{ + struct rt_i2c_bus_device parent; + I2C_T *I2C; + struct rt_i2c_msg *msg; + char *device_name; +} nu_i2c_bus_t; + +/* Private variables ------------------------------------------------------------*/ + + +static nu_i2c_bus_t nu_i2c_arr [ ] = +{ +#if defined(BSP_USING_I2C0) + { + .I2C = I2C0, .device_name = "i2c0", + }, +#endif +#if defined(BSP_USING_I2C1) + { + .I2C = I2C1, .device_name = "i2c1", + }, +#endif +#if defined(BSP_USING_I2C2) + { + .I2C = I2C2, .device_name = "i2c2", + }, +#endif +#if defined(BSP_USING_I2C3) + { + .I2C = I2C3, .device_name = "i2c3", + }, +#endif +#if defined(BSP_USING_I2C4) + { + .I2C = I2C4, .device_name = "i2c4", + }, +#endif +#if defined(BSP_USING_I2C5) + { + .I2C = I2C5, .device_name = "i2c5", + }, +#endif +}; + +/* Private functions ------------------------------------------------------------*/ +#if defined(BSP_USING_I2C) +static rt_size_t nu_i2c_mst_xfer(struct rt_i2c_bus_device *bus, + struct rt_i2c_msg msgs[], + rt_uint32_t num); +static rt_err_t nu_i2c_bus_control(struct rt_i2c_bus_device *bus, + rt_uint32_t u32Cmd, + rt_uint32_t u32Value); + +static const struct rt_i2c_bus_device_ops nu_i2c_ops = +{ + .master_xfer = nu_i2c_mst_xfer, + .slave_xfer = NULL, + .i2c_bus_control = nu_i2c_bus_control +}; + +static rt_err_t nu_i2c_bus_control(struct rt_i2c_bus_device *bus, rt_uint32_t u32Cmd, rt_uint32_t u32Value) +{ + nu_i2c_bus_t *nu_i2c; + + RT_ASSERT(bus != RT_NULL); + nu_i2c = (nu_i2c_bus_t *) bus; + + switch (u32Cmd) + { + case RT_I2C_DEV_CTRL_CLK: + I2C_SetBusClockFreq(nu_i2c->I2C, u32Value); + break; + default: + return -RT_EIO; + } + + return RT_EOK; +} + +static inline rt_err_t nu_i2c_wait_ready_with_timeout(nu_i2c_bus_t *bus) +{ + rt_tick_t start = rt_tick_get(); + while (!(bus->I2C->CTL0 & I2C_CTL0_SI_Msk)) + { + if ((rt_tick_get() - start) > bus->parent.timeout) + { + LOG_E("\ni2c: timeout!\n"); + return -RT_ETIMEOUT; + } + } + + return RT_EOK; +} + +static inline rt_err_t nu_i2c_send_data(nu_i2c_bus_t *nu_i2c, rt_uint8_t data) +{ + I2C_SET_DATA(nu_i2c->I2C, data); + I2C_SET_CONTROL_REG(nu_i2c->I2C, I2C_CTL_SI); + return nu_i2c_wait_ready_with_timeout(nu_i2c); +} + +static rt_err_t nu_i2c_send_address(nu_i2c_bus_t *nu_i2c, + struct rt_i2c_msg *msg) +{ + rt_uint16_t flags = msg->flags; + rt_uint16_t ignore_nack = msg->flags & RT_I2C_IGNORE_NACK; + rt_uint8_t addr1, addr2; + rt_err_t ret; + + + if (flags & RT_I2C_ADDR_10BIT) + { + nu_i2c->I2C->CTL1 |= I2C_CTL1_ADDR10EN_Msk; + addr1 = 0xf0 | ((msg->addr >> 7) & 0x06); + addr2 = msg->addr & 0xff; + + LOG_D("address1: %d, address2: %d\n", addr1, addr2); + + ret = nu_i2c_send_data(nu_i2c, addr1); + if (ret != RT_EOK) /* for timeout condition */ + return -RT_EIO; + + if ((I2C_GET_STATUS(nu_i2c->I2C) != NU_I2C_MASTER_STATUS_TRANSMIT_ADDRESS_ACK) && !ignore_nack) + { + LOG_E("NACK: sending first address failed\n"); + + return -RT_EIO; + } + + ret = nu_i2c_send_data(nu_i2c, addr2); + if (ret != RT_EOK) /* for timeout condition */ + return -RT_EIO; + + if ((I2C_GET_STATUS(nu_i2c->I2C) != NU_I2C_MASTER_STATUS_TRANSMIT_ADDRESS_ACK) && !ignore_nack) + { + LOG_E("NACK: sending second address failed\n"); + + return -RT_EIO; + } + + if (flags & RT_I2C_RD) + { + LOG_D("send repeated START signal\n"); + + I2C_SET_CONTROL_REG(nu_i2c->I2C, I2C_CTL_STA_SI); + ret = nu_i2c_wait_ready_with_timeout(nu_i2c); + if (ret != RT_EOK) /* for timeout condition */ + return -RT_EIO; + + if ((I2C_GET_STATUS(nu_i2c->I2C) != NU_I2C_MASTER_STATUS_REPEAT_START) && !ignore_nack) + { + //LOG_E("sending repeated START failed\n"); + + return -RT_EIO; + } + + addr1 |= 0x01; + + ret = nu_i2c_send_data(nu_i2c, addr1); + if (ret != RT_EOK) /* for timeout condition */ + return -RT_EIO; + + if ((I2C_GET_STATUS(nu_i2c->I2C) != NU_I2C_MASTER_STATUS_RECEIVE_ADDRESS_ACK) && !ignore_nack) + { + LOG_E("NACK: sending read address failed\n"); + + return -RT_EIO; + } + } + } + else + { + /* 7-bit addr */ + addr1 = msg->addr << 1; + if (flags & RT_I2C_RD) + addr1 |= 1; + + /* Send device address */ + ret = nu_i2c_send_data(nu_i2c, addr1); /* Send Address */ + if (ret != RT_EOK) /* for timeout condition */ + return -RT_EIO; + + if ((I2C_GET_STATUS(nu_i2c->I2C) + != ((flags & RT_I2C_RD) ? NU_I2C_MASTER_STATUS_RECEIVE_ADDRESS_ACK : NU_I2C_MASTER_STATUS_TRANSMIT_ADDRESS_ACK)) + && !ignore_nack) + { + LOG_E("sending address failed\n"); + return -RT_EIO; + } + } + + return RT_EOK; +} + +static rt_size_t nu_i2c_mst_xfer(struct rt_i2c_bus_device *bus, + struct rt_i2c_msg msgs[], + rt_uint32_t num) +{ + struct rt_i2c_msg *msg; + nu_i2c_bus_t *nu_i2c; + rt_size_t i; + rt_uint32_t cnt_data; + rt_uint16_t ignore_nack; + rt_err_t ret; + + RT_ASSERT(bus != RT_NULL); + nu_i2c = (nu_i2c_bus_t *) bus; + + nu_i2c->msg = msgs; + + nu_i2c->I2C->CTL0 |= I2C_CTL0_STA_Msk | I2C_CTL0_SI_Msk; + ret = nu_i2c_wait_ready_with_timeout(nu_i2c); + if (ret != RT_EOK) /* for timeout condition */ + { + rt_set_errno(-RT_ETIMEOUT); + return 0; + } + if (I2C_GET_STATUS(nu_i2c->I2C) != NU_I2C_MASTER_STATUS_START) + { + i = 0; + LOG_E("Send START Failed"); + return i; + } + + for (i = 0; i < num; i++) + { + msg = &msgs[i]; + ignore_nack = msg->flags & RT_I2C_IGNORE_NACK; + + if (!(msg->flags & RT_I2C_NO_START)) + { + if (i) + { + I2C_SET_CONTROL_REG(nu_i2c->I2C, I2C_CTL_STA_SI); + ret = nu_i2c_wait_ready_with_timeout(nu_i2c); + if (ret != RT_EOK) /* for timeout condition */ + break; + + if (I2C_GET_STATUS(nu_i2c->I2C) != NU_I2C_MASTER_STATUS_REPEAT_START) + { + i = 0; + //LOG_E("Send repeat START Fail"); + break; + } + } + + if ((RT_EOK != nu_i2c_send_address(nu_i2c, msg)) + && !ignore_nack) + { + i = 0; + LOG_E("Send Address Fail"); + break; + } + } + + + if (nu_i2c->msg[i].flags & RT_I2C_RD) /* Receive Bytes */ + { + rt_uint32_t do_rd_nack = (i == (num - 1)); + for (cnt_data = 0 ; cnt_data < (nu_i2c->msg[i].len) ; cnt_data++) + { + do_rd_nack += (cnt_data == (nu_i2c->msg[i].len - 1)); /* NACK after last byte for hardware setting */ + if (do_rd_nack == 2) + { + I2C_SET_CONTROL_REG(nu_i2c->I2C, I2C_CTL_SI); + } + else + { + I2C_SET_CONTROL_REG(nu_i2c->I2C, I2C_CTL_SI_AA); + } + + ret = nu_i2c_wait_ready_with_timeout(nu_i2c); + if (ret != RT_EOK) /* for timeout condition */ + break; + + if (nu_i2c->I2C->CTL0 & I2C_CTL_AA) + { + if (I2C_GET_STATUS(nu_i2c->I2C) != NU_I2C_MASTER_STATUS_RECEIVE_DATA_ACK) + { + i = 0; + break; + } + } + else + { + if (I2C_GET_STATUS(nu_i2c->I2C) != NU_I2C_MASTER_STATUS_RECEIVE_DATA_NACK) + { + i = 0; + break; + } + } + + nu_i2c->msg[i].buf[cnt_data] = nu_i2c->I2C->DAT; + } + } + else /* Send Bytes */ + { + for (cnt_data = 0 ; cnt_data < (nu_i2c->msg[i].len) ; cnt_data++) + { + /* Send register number and MSB of data */ + ret = nu_i2c_send_data(nu_i2c, (uint8_t)(nu_i2c->msg[i].buf[cnt_data])); + if (ret != RT_EOK) /* for timeout condition */ + break; + + if (I2C_GET_STATUS(nu_i2c->I2C) != NU_I2C_MASTER_STATUS_TRANSMIT_DATA_ACK + && !ignore_nack + ) /* Send aata and get Ack */ + { + i = 0; + break; + } + } + } + } + + I2C_STOP(nu_i2c->I2C); + + RT_ASSERT(I2C_GET_STATUS(nu_i2c->I2C) == NU_I2C_MASTER_STATUS_BUS_RELEASED); + if (I2C_GET_STATUS(nu_i2c->I2C) != NU_I2C_MASTER_STATUS_BUS_RELEASED) + { + i = 0; + } + + nu_i2c->msg = RT_NULL; + nu_i2c->I2C->CTL1 = 0; /*clear all sub modes like 10 bit mode*/ + return i; +} +#endif + +/* Public functions -------------------------------------------------------------*/ +int rt_hw_i2c_init(void) +{ + int i; + rt_err_t ret = RT_EOK; + + for (i = (I2C_START + 1); i < I2C_CNT; i++) + { + /* Reset and initial IP engine. */ + I2C_Close(nu_i2c_arr[i].I2C); + I2C_Open(nu_i2c_arr[i].I2C, 100000); + + nu_i2c_arr[i].parent.ops = &nu_i2c_ops; + + ret = rt_i2c_bus_device_register(&nu_i2c_arr[i].parent, nu_i2c_arr[i].device_name); + RT_ASSERT(RT_EOK == ret); + } + + return 0; +} + +INIT_DEVICE_EXPORT(rt_hw_i2c_init); + +#endif /* BSP_USING_I2C */ + diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_i2c.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_i2c.h new file mode 100644 index 0000000000..6a314fa0b9 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_i2c.h @@ -0,0 +1,36 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-11-11 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_I2C_H__ +#define __DRV_I2C_H__ + +#define NU_I2C_MASTER_STATUS_START 0x08UL +#define NU_I2C_MASTER_STATUS_REPEAT_START 0x10UL +#define NU_I2C_MASTER_STATUS_TRANSMIT_ADDRESS_ACK 0x18UL +#define NU_I2C_MASTER_STATUS_TRANSMIT_ADDRESS_NACK 0x20UL +#define NU_I2C_MASTER_STATUS_TRANSMIT_DATA_ACK 0x28UL +#define NU_I2C_MASTER_STATUS_TRANSMIT_DATA_NACK 0x30UL +#define NU_I2C_MASTER_STATUS_ARBITRATION_LOST 0x38UL +#define NU_I2C_MASTER_STATUS_RECEIVE_ADDRESS_ACK 0x40UL +#define NU_I2C_MASTER_STATUS_RECEIVE_ADDRESS_NACK 0x48UL +#define NU_I2C_MASTER_STATUS_RECEIVE_DATA_ACK 0x50UL +#define NU_I2C_MASTER_STATUS_RECEIVE_DATA_NACK 0x58UL +#define NU_I2C_MASTER_STATUS_BUS_ERROR 0x00UL +#define NU_I2C_MASTER_STATUS_BUS_RELEASED 0xF8UL + +#define NU_I2C_SLAVE_STATUS_TRANSMIT_REPEAT_START_OR_STOP 0xA0UL +#define NU_I2C_SLAVE_STATUS_TRANSMIT_ADDRESS_ACK 0xA8UL +#define NU_I2C_SLAVE_STATUS_TRANSMIT_DATA_NACK 0xC0UL +#define NU_I2C_SLAVE_STATUS_RECEIVE_ADDRESS_ACK 0x60UL +#define NU_I2C_SLAVE_STATUS_RECEIVE_DATA_ACK 0x80UL + +#endif /* __DRV_I2C_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_i2s.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_i2s.c new file mode 100644 index 0000000000..0bcb5b88cb --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_i2s.c @@ -0,0 +1,637 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-2-7 Wayne Lin First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_I2S) + +#include +#include "drv_pdma.h" +#include "drv_i2s.h" +#include "drv_common.h" + +/* Private define ---------------------------------------------------------------*/ +#define DBG_ENABLE +#define DBG_LEVEL DBG_LOG +#define DBG_SECTION_NAME "i2s" +#define DBG_COLOR +#include + +enum +{ + I2S_START = -1, +#if defined(BSP_USING_I2S0) + I2S0_IDX, +#endif +#if defined(BSP_USING_I2S1) + I2S1_IDX, +#endif + I2S_CNT +}; + +/* Private functions ------------------------------------------------------------*/ +static rt_err_t nu_i2s_getcaps(struct rt_audio_device *audio, struct rt_audio_caps *caps); +static rt_err_t nu_i2s_configure(struct rt_audio_device *audio, struct rt_audio_caps *caps); +static rt_err_t nu_i2s_init(struct rt_audio_device *audio); +static rt_err_t nu_i2s_start(struct rt_audio_device *audio, int stream); +static rt_err_t nu_i2s_stop(struct rt_audio_device *audio, int stream); +static void nu_i2s_buffer_info(struct rt_audio_device *audio, struct rt_audio_buf_info *info); +/* Public functions -------------------------------------------------------------*/ +rt_err_t nu_i2s_acodec_register(nu_acodec_ops_t); + +/* Private variables ------------------------------------------------------------*/ +static struct nu_i2s nu_i2s_arr[] = +{ +#if defined(BSP_USING_I2S0) + { + .name = "sound0", + .i2s_base = I2S0, + .i2s_rst = I2S0_RST, + .i2s_dais = { + [NU_I2S_DAI_PLAYBACK] = { + .pdma_perp = PDMA_I2S0_TX, + }, + [NU_I2S_DAI_CAPTURE] = { + .pdma_perp = PDMA_I2S0_RX, + } + } + }, +#endif +#if defined(BSP_USING_I2S1) + { + .name = "sound1", + .i2s_base = I2S1, + .i2s_rst = I2S1_RST, + .i2s_dais = { + [NU_I2S_DAI_PLAYBACK] = { + .pdma_perp = PDMA_I2S1_TX, + }, + [NU_I2S_DAI_CAPTURE] = { + .pdma_perp = PDMA_I2S1_RX, + } + } + }, +#endif +}; + +static void nu_pdma_i2s_rx_cb(void *pvUserData, uint32_t u32EventFilter) +{ + nu_i2s_t psNuI2s = (nu_i2s_t)pvUserData; + nu_i2s_dai_t psNuI2sDai; + + RT_ASSERT(psNuI2s != RT_NULL); + psNuI2sDai = &psNuI2s->i2s_dais[NU_I2S_DAI_CAPTURE]; + + if (u32EventFilter & NU_PDMA_EVENT_TRANSFER_DONE) + { + /* Report uncacheable memory address to upper layer. */ + rt_uint8_t *pbuf_old = (rt_uint8_t *)((uint32_t)&psNuI2sDai->fifo[psNuI2sDai->fifo_block_idx * NU_I2S_DMA_BUF_BLOCK_SIZE] | UNCACHEABLE) ; + psNuI2sDai->fifo_block_idx = (psNuI2sDai->fifo_block_idx + 1) % NU_I2S_DMA_BUF_BLOCK_NUMBER; + + /* Report upper layer. */ + rt_audio_rx_done(&psNuI2s->audio, pbuf_old, NU_I2S_DMA_BUF_BLOCK_SIZE); + } +} + +static void nu_pdma_i2s_tx_cb(void *pvUserData, uint32_t u32EventFilter) +{ + nu_i2s_t psNuI2s = (nu_i2s_t)pvUserData; + nu_i2s_dai_t psNuI2sDai; + + RT_ASSERT(psNuI2s != RT_NULL); + psNuI2sDai = &psNuI2s->i2s_dais[NU_I2S_DAI_PLAYBACK]; + + if (u32EventFilter & NU_PDMA_EVENT_TRANSFER_DONE) + { + rt_audio_tx_complete(&psNuI2s->audio); + psNuI2sDai->fifo_block_idx = (psNuI2sDai->fifo_block_idx + 1) % NU_I2S_DMA_BUF_BLOCK_NUMBER; + } +} + +static rt_err_t nu_i2s_pdma_sc_config(nu_i2s_t psNuI2s, E_NU_I2S_DAI dai) +{ + rt_err_t result = RT_EOK; + I2S_T *i2s_base; + nu_i2s_dai_t psNuI2sDai; + int i; + uint32_t u32Src, u32Dst; + nu_pdma_cb_handler_t pfm_pdma_cb; + struct nu_pdma_chn_cb sChnCB; + + RT_ASSERT(psNuI2s != RT_NULL); + + /* Get base address of i2s register */ + i2s_base = psNuI2s->i2s_base; + psNuI2sDai = &psNuI2s->i2s_dais[dai]; + + switch ((int)dai) + { + case NU_I2S_DAI_PLAYBACK: + pfm_pdma_cb = nu_pdma_i2s_tx_cb; + u32Src = (uint32_t)&psNuI2sDai->fifo[0]; + u32Dst = (uint32_t)&i2s_base->TXFIFO; + break; + + case NU_I2S_DAI_CAPTURE: + pfm_pdma_cb = nu_pdma_i2s_rx_cb; + u32Src = (uint32_t)&i2s_base->RXFIFO; + u32Dst = (uint32_t)&psNuI2sDai->fifo[0]; + break; + + default: + return -RT_EINVAL; + } + /* Register ISR callback function */ + sChnCB.m_eCBType = eCBType_Event; + sChnCB.m_pfnCBHandler = pfm_pdma_cb; + sChnCB.m_pvUserData = (void *)psNuI2s; + + nu_pdma_filtering_set(psNuI2sDai->pdma_chanid, NU_PDMA_EVENT_TRANSFER_DONE); + result = nu_pdma_callback_register(psNuI2sDai->pdma_chanid, &sChnCB); + + RT_ASSERT(result == RT_EOK); + + for (i = 0; i < NU_I2S_DMA_BUF_BLOCK_NUMBER; i++) + { + /* Setup dma descriptor entry */ + result = nu_pdma_desc_setup(psNuI2sDai->pdma_chanid, // Channel ID + psNuI2sDai->pdma_descs[i], // this descriptor + 32, // 32-bits + (dai == NU_I2S_DAI_PLAYBACK) ? u32Src + (i * NU_I2S_DMA_BUF_BLOCK_SIZE) : u32Src, //Memory or RXFIFO + (dai == NU_I2S_DAI_PLAYBACK) ? u32Dst : u32Dst + (i * NU_I2S_DMA_BUF_BLOCK_SIZE), //TXFIFO or Memory + (int32_t)NU_I2S_DMA_BUF_BLOCK_SIZE / 4, // Transfer count + psNuI2sDai->pdma_descs[(i + 1) % NU_I2S_DMA_BUF_BLOCK_NUMBER], // Next descriptor + 0); // Interrupt assert when every SG-table done. + RT_ASSERT(result == RT_EOK); + } + + /* Assign head descriptor */ + result = nu_pdma_sg_transfer(psNuI2sDai->pdma_chanid, psNuI2sDai->pdma_descs[0], 0); + RT_ASSERT(result == RT_EOK); + + return result; +} + +static rt_bool_t nu_i2s_capacity_check(struct rt_audio_configure *pconfig) +{ + switch (pconfig->samplebits) + { + case 8: + case 16: + /* case 24: PDMA constrain */ + case 32: + break; + default: + goto exit_nu_i2s_capacity_check; + } + + switch (pconfig->channels) + { + case 1: + case 2: + break; + default: + goto exit_nu_i2s_capacity_check; + } + + return RT_TRUE; + +exit_nu_i2s_capacity_check: + + return RT_FALSE; +} + +static rt_err_t nu_i2s_dai_setup(nu_i2s_t psNuI2s, struct rt_audio_configure *pconfig) +{ + rt_err_t result = RT_EOK; + nu_acodec_ops_t pNuACodecOps = RT_NULL; + RT_ASSERT(psNuI2s->AcodecOps != RT_NULL); + pNuACodecOps = psNuI2s->AcodecOps; + rt_uint32_t real_samplerate; + + /* Open I2S */ + if (nu_i2s_capacity_check(pconfig) == RT_TRUE) + { + /* Reset audio codec */ + if (pNuACodecOps->nu_acodec_reset) + result = pNuACodecOps->nu_acodec_reset(); + + if (result != RT_EOK) + goto exit_nu_i2s_dai_setup; + + /* Setup audio codec */ + if (pNuACodecOps->nu_acodec_init) + result = pNuACodecOps->nu_acodec_init(); + + if (!pNuACodecOps->nu_acodec_init || result != RT_EOK) + goto exit_nu_i2s_dai_setup; + + /* Setup acodec samplerate/samplebit/channel */ + if (pNuACodecOps->nu_acodec_dsp_control) + result = pNuACodecOps->nu_acodec_dsp_control(pconfig); + + if (!pNuACodecOps->nu_acodec_dsp_control || result != RT_EOK) + goto exit_nu_i2s_dai_setup; + + real_samplerate = I2S_Open(psNuI2s->i2s_base, + (psNuI2s->AcodecOps->role == NU_ACODEC_ROLE_MASTER) ? I2S_MODE_SLAVE : I2S_MODE_MASTER, + pconfig->samplerate, + (((pconfig->samplebits / 8) - 1) << I2S_CTL0_DATWIDTH_Pos), + (pconfig->channels == 1) ? I2S_ENABLE_MONO : I2S_DISABLE_MONO, + I2S_FORMAT_I2S); + LOG_I("Open I2S."); + + /* Open I2S0 interface and set to slave mode, stereo channel, I2S format */ + if (pconfig->samplerate != real_samplerate) + { + LOG_W("Real sample rate: %d Hz != preferred sample rate: %d Hz\n", real_samplerate, pconfig->samplerate); + } + + /* Set MCLK and enable MCLK */ + /* The target MCLK is related to audio codec setting. */ + I2S_EnableMCLK(psNuI2s->i2s_base, 12000000); + + /* Set unmute */ + if (pNuACodecOps->nu_acodec_mixer_control) + pNuACodecOps->nu_acodec_mixer_control(AUDIO_MIXER_MUTE, RT_FALSE); + } + else + result = -RT_EINVAL; + +exit_nu_i2s_dai_setup: + + return result; +} + +static rt_err_t nu_i2s_getcaps(struct rt_audio_device *audio, struct rt_audio_caps *caps) +{ + rt_err_t result = RT_EOK; + nu_i2s_t psNuI2s; + nu_acodec_ops_t pNuACodecOps = RT_NULL; + + RT_ASSERT(audio != RT_NULL); + RT_ASSERT(caps != RT_NULL); + + psNuI2s = (nu_i2s_t)audio; + + RT_ASSERT(psNuI2s->AcodecOps != RT_NULL); + + pNuACodecOps = psNuI2s->AcodecOps; + + switch (caps->main_type) + { + case AUDIO_TYPE_QUERY: + switch (caps->sub_type) + { + case AUDIO_TYPE_QUERY: + caps->udata.mask = AUDIO_TYPE_INPUT | AUDIO_TYPE_OUTPUT | AUDIO_TYPE_MIXER; + break; + default: + result = -RT_ERROR; + break; + } // switch (caps->sub_type) + break; + + case AUDIO_TYPE_MIXER: + + if (pNuACodecOps->nu_acodec_mixer_query) + { + switch (caps->sub_type) + { + case AUDIO_MIXER_QUERY: + return pNuACodecOps->nu_acodec_mixer_query(AUDIO_MIXER_QUERY, &caps->udata.mask); + + default: + return pNuACodecOps->nu_acodec_mixer_query(caps->sub_type, (rt_uint32_t *)&caps->udata.value); + } // switch (caps->sub_type) + + } // if (pNuACodecOps->nu_acodec_mixer_query) + + result = -RT_ERROR; + break; + + case AUDIO_TYPE_INPUT: + case AUDIO_TYPE_OUTPUT: + + switch (caps->sub_type) + { + case AUDIO_DSP_PARAM: + caps->udata.config.channels = psNuI2s->config.channels; + caps->udata.config.samplebits = psNuI2s->config.samplebits; + caps->udata.config.samplerate = psNuI2s->config.samplerate; + break; + case AUDIO_DSP_SAMPLERATE: + caps->udata.config.samplerate = psNuI2s->config.samplerate; + break; + case AUDIO_DSP_CHANNELS: + caps->udata.config.channels = psNuI2s->config.channels; + break; + case AUDIO_DSP_SAMPLEBITS: + caps->udata.config.samplebits = psNuI2s->config.samplebits; + break; + default: + result = -RT_ERROR; + break; + } // switch (caps->sub_type) + break; + + default: + result = -RT_ERROR; + break; + + } // switch (caps->main_type) + + return result; +} + +static rt_err_t nu_i2s_configure(struct rt_audio_device *audio, struct rt_audio_caps *caps) +{ + rt_err_t result = RT_EOK; + nu_i2s_t psNuI2s; + nu_acodec_ops_t pNuACodecOps = RT_NULL; + int stream = -1; + + RT_ASSERT(audio != RT_NULL); + RT_ASSERT(caps != RT_NULL); + + psNuI2s = (nu_i2s_t)audio; + + RT_ASSERT(psNuI2s->AcodecOps != RT_NULL); + pNuACodecOps = psNuI2s->AcodecOps; + + switch (caps->main_type) + { + case AUDIO_TYPE_MIXER: + if (psNuI2s->AcodecOps->nu_acodec_mixer_control) + psNuI2s->AcodecOps->nu_acodec_mixer_control(caps->sub_type, caps->udata.value); + break; + + + case AUDIO_TYPE_INPUT: + stream = AUDIO_STREAM_RECORD; + case AUDIO_TYPE_OUTPUT: + { + rt_bool_t bNeedReset = RT_FALSE; + + if (stream < 0) + stream = AUDIO_STREAM_REPLAY; + + switch (caps->sub_type) + { + case AUDIO_DSP_PARAM: + if (rt_memcmp(&psNuI2s->config, &caps->udata.config, sizeof(struct rt_audio_configure)) != 0) + { + rt_memcpy(&psNuI2s->config, &caps->udata.config, sizeof(struct rt_audio_configure)); + bNeedReset = RT_TRUE; + } + break; + case AUDIO_DSP_SAMPLEBITS: + if (psNuI2s->config.samplerate != caps->udata.config.samplebits) + { + psNuI2s->config.samplerate = caps->udata.config.samplebits; + bNeedReset = RT_TRUE; + } + break; + case AUDIO_DSP_CHANNELS: + if (psNuI2s->config.channels != caps->udata.config.channels) + { + pNuACodecOps->config.channels = caps->udata.config.channels; + bNeedReset = RT_TRUE; + } + break; + case AUDIO_DSP_SAMPLERATE: + if (psNuI2s->config.samplerate != caps->udata.config.samplerate) + { + psNuI2s->config.samplerate = caps->udata.config.samplerate; + bNeedReset = RT_TRUE; + } + break; + default: + result = -RT_ERROR; + break; + } // switch (caps->sub_type) + + if (bNeedReset) + { + return nu_i2s_start(audio, stream); + } + } + break; + default: + result = -RT_ERROR; + break; + } // switch (caps->main_type) + + return result; +} + +static rt_err_t nu_i2s_init(struct rt_audio_device *audio) +{ + rt_err_t result = RT_EOK; + nu_i2s_t psNuI2s; + + RT_ASSERT(audio != RT_NULL); + + psNuI2s = (nu_i2s_t)audio; + + /* Reset this module */ + SYS_ResetModule(psNuI2s->i2s_rst); + + return -(result); +} + +static rt_err_t nu_i2s_start(struct rt_audio_device *audio, int stream) +{ + nu_i2s_t psNuI2s; + + RT_ASSERT(audio != RT_NULL); + + psNuI2s = (nu_i2s_t)audio; + + /* Restart all: I2S and codec. */ + nu_i2s_stop(audio, stream); + if (nu_i2s_dai_setup(psNuI2s, &psNuI2s->config) != RT_EOK) + return -RT_ERROR; + + switch (stream) + { + case AUDIO_STREAM_REPLAY: + { + nu_i2s_pdma_sc_config(psNuI2s, NU_I2S_DAI_PLAYBACK); + + /* Start TX DMA */ + I2S_ENABLE_TXDMA(psNuI2s->i2s_base); + + /* Enable I2S Tx function */ + I2S_ENABLE_TX(psNuI2s->i2s_base); + + LOG_I("Start replay."); + } + break; + + case AUDIO_STREAM_RECORD: + { + nu_i2s_pdma_sc_config(psNuI2s, NU_I2S_DAI_CAPTURE); + + /* Start RX DMA */ + I2S_ENABLE_RXDMA(psNuI2s->i2s_base); + + /* Enable I2S Rx function */ + I2S_ENABLE_RX(psNuI2s->i2s_base); + + LOG_I("Start record."); + } + break; + + default: + return -RT_ERROR; + } + + return RT_EOK; +} + +static rt_err_t nu_i2s_stop(struct rt_audio_device *audio, int stream) +{ + nu_i2s_t psNuI2s; + nu_i2s_dai_t psNuI2sDai = RT_NULL; + + RT_ASSERT(audio != RT_NULL); + + psNuI2s = (nu_i2s_t)audio; + + switch (stream) + { + case AUDIO_STREAM_REPLAY: + psNuI2sDai = &psNuI2s->i2s_dais[NU_I2S_DAI_PLAYBACK]; + + // Disable TX + I2S_DISABLE_TXDMA(psNuI2s->i2s_base); + I2S_DISABLE_TX(psNuI2s->i2s_base); + + LOG_I("Stop replay."); + break; + + case AUDIO_STREAM_RECORD: + psNuI2sDai = &psNuI2s->i2s_dais[NU_I2S_DAI_CAPTURE]; + + // Disable RX + I2S_DISABLE_RXDMA(psNuI2s->i2s_base); + I2S_DISABLE_RX(psNuI2s->i2s_base); + + LOG_I("Stop record."); + break; + + default: + return -RT_EINVAL; + } + + /* Stop DMA transfer. */ + nu_pdma_channel_terminate(psNuI2sDai->pdma_chanid); + + /* Close I2S */ + if (!(psNuI2s->i2s_base->CTL0 & (I2S_CTL0_TXEN_Msk | I2S_CTL0_RXEN_Msk))) + { + I2S_DisableMCLK(psNuI2s->i2s_base); + I2S_Close(psNuI2s->i2s_base); + LOG_I("Close I2S."); + } + + /* Silence */ + rt_memset((void *)psNuI2sDai->fifo, 0, NU_I2S_DMA_FIFO_SIZE); + psNuI2sDai->fifo_block_idx = 0; + + return RT_EOK; +} + +static void nu_i2s_buffer_info(struct rt_audio_device *audio, struct rt_audio_buf_info *info) +{ + nu_i2s_t psNuI2s; + + RT_ASSERT(audio != RT_NULL); + RT_ASSERT(info != RT_NULL); + + psNuI2s = (nu_i2s_t)audio; + + /* Report uncacheable memory address to upper layer. */ + info->buffer = (rt_uint8_t *)((uint32_t)psNuI2s->i2s_dais[NU_I2S_DAI_PLAYBACK].fifo | UNCACHEABLE); + info->total_size = NU_I2S_DMA_FIFO_SIZE; + info->block_size = NU_I2S_DMA_BUF_BLOCK_SIZE; + info->block_count = NU_I2S_DMA_BUF_BLOCK_NUMBER; + + //rt_kprintf("info->buffer=%08x\n", (uint32_t)info->buffer); + //rt_kprintf("info->total_size=%d\n", (uint32_t)info->total_size); + //rt_kprintf("info->block_size=%d\n", (uint32_t)info->block_size); + //rt_kprintf("info->block_count=%d\n", (uint32_t)info->block_count); + + return; +} + +static struct rt_audio_ops nu_i2s_audio_ops = +{ + .getcaps = nu_i2s_getcaps, + .configure = nu_i2s_configure, + + .init = nu_i2s_init, + .start = nu_i2s_start, + .stop = nu_i2s_stop, + .transmit = RT_NULL, + .buffer_info = nu_i2s_buffer_info +}; + +static rt_err_t nu_hw_i2s_pdma_allocate(nu_i2s_dai_t psNuI2sDai) +{ + /* Allocate I2S nu_dma channel */ + if ((psNuI2sDai->pdma_chanid = nu_pdma_channel_allocate(psNuI2sDai->pdma_perp)) < 0) + { + goto nu_hw_i2s_pdma_allocate; + } + + return RT_EOK; + +nu_hw_i2s_pdma_allocate: + + return -(RT_ERROR); +} + +int rt_hw_i2s_init(void) +{ + int i, j; + nu_i2s_dai_t psNuI2sDai; + + for (j = (I2S_START + 1); j < I2S_CNT; j++) + { + for (i = 0; i < NU_I2S_DAI_CNT; i++) + { + uint8_t *pu8ptr = rt_malloc_align(NU_I2S_DMA_FIFO_SIZE, 64); + psNuI2sDai = &nu_i2s_arr[j].i2s_dais[i]; + psNuI2sDai->fifo = pu8ptr; + rt_memset(pu8ptr, 0, NU_I2S_DMA_FIFO_SIZE); + RT_ASSERT(psNuI2sDai->fifo != RT_NULL); + rt_kprintf("psNuI2sDai->fifo=%08x\n", (uint32_t)psNuI2sDai->fifo); + + psNuI2sDai->pdma_chanid = -1; + psNuI2sDai->fifo_block_idx = 0; + RT_ASSERT(nu_hw_i2s_pdma_allocate(psNuI2sDai) == RT_EOK); + + RT_ASSERT(nu_pdma_sgtbls_allocate(&psNuI2sDai->pdma_descs[0], NU_I2S_DMA_BUF_BLOCK_NUMBER) == RT_EOK); + } + + /* Register ops of audio device */ + nu_i2s_arr[j].audio.ops = &nu_i2s_audio_ops; + + /* Register device, RW: it is with replay and record functions. */ + rt_audio_register(&nu_i2s_arr[j].audio, nu_i2s_arr[j].name, RT_DEVICE_FLAG_RDWR, &nu_i2s_arr[j]); + } + return RT_EOK; +} +INIT_DEVICE_EXPORT(rt_hw_i2s_init); +#endif //#if defined(BSP_USING_I2S) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_i2s.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_i2s.h new file mode 100644 index 0000000000..9ee00646b8 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_i2s.h @@ -0,0 +1,96 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-2-7 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_I2S_H__ +#define __DRV_I2S_H__ + +#include +#include "NuMicro.h" +#include + +#if !defined(NU_I2S_DMA_FIFO_SIZE) + #define NU_I2S_DMA_FIFO_SIZE (2048) +#endif + +#if !defined(NU_I2S_DMA_BUF_BLOCK_NUMBER) + #define NU_I2S_DMA_BUF_BLOCK_NUMBER (2) +#endif + +#if ( (NU_I2S_DMA_FIFO_SIZE % NU_I2S_DMA_BUF_BLOCK_NUMBER) != 0 ) + #error "Please give an aligned definition" +#endif +#if ( NU_I2S_DMA_FIFO_SIZE < 2048 ) + #warning "DMA FIFO too small, miss voice?" +#endif + +#define NU_I2S_DMA_BUF_BLOCK_SIZE (NU_I2S_DMA_FIFO_SIZE/NU_I2S_DMA_BUF_BLOCK_NUMBER) + +typedef enum +{ + NU_I2S_DAI_PLAYBACK, + NU_I2S_DAI_CAPTURE, + NU_I2S_DAI_CNT +} E_NU_I2S_DAI; + +typedef enum +{ + NU_ACODEC_ROLE_MASTER, + NU_ACODEC_ROLE_SLAVE, +} E_NU_ACODEC_ROLE; + +typedef struct +{ + char *name; + + E_NU_ACODEC_ROLE role; + + struct rt_audio_configure config; + + rt_err_t (*nu_acodec_init)(void); + + rt_err_t (*nu_acodec_reset)(void); + + rt_err_t (*nu_acodec_dsp_control)(struct rt_audio_configure *config); + + rt_err_t (*nu_acodec_mixer_control)(rt_uint32_t ui32Item, rt_uint32_t ui32Value); + + rt_err_t (*nu_acodec_mixer_query)(rt_uint32_t ui32Item, rt_uint32_t *ui32Value); + +} nu_acodec_ops; + +typedef nu_acodec_ops *nu_acodec_ops_t; + +struct nu_i2s_dai +{ + int16_t pdma_perp; + int8_t pdma_chanid; + rt_uint8_t *fifo; + int16_t fifo_block_idx; + nu_pdma_desc_t pdma_descs[NU_I2S_DMA_BUF_BLOCK_NUMBER]; +}; +typedef struct nu_i2s_dai *nu_i2s_dai_t; + +struct nu_i2s +{ + struct rt_audio_device audio; + struct rt_audio_configure config; + + char *name; + I2S_T *i2s_base; + uint32_t i2s_rst; + + struct nu_i2s_dai i2s_dais[NU_I2S_DAI_CNT]; + nu_acodec_ops_t AcodecOps; +}; +typedef struct nu_i2s *nu_i2s_t; + +#endif // __DRV_I2S_H___ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.c new file mode 100644 index 0000000000..1c015ef704 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.c @@ -0,0 +1,1265 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-7-15 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_PDMA) + +#include +#include +#include +#include +#include "drv_sys.h" + +/* Private define ---------------------------------------------------------------*/ +// RT_DEV_NAME_PREFIX pdma + +#ifndef NU_PDMA_MEMFUN_ACTOR_MAX + #define NU_PDMA_MEMFUN_ACTOR_MAX (4) +#endif + +/* To select the first PDMA base */ +#if !defined(USE_MA35D1_SUBM) + #define DEF_PDMA_BASE_START PDMA0_BASE +#else + #define DEF_PDMA_BASE_START PDMA2_BASE +#endif + +enum +{ + PDMA_START = -1, +#if defined(BSP_USING_PDMA0) + PDMA0_IDX, +#endif +#if defined(BSP_USING_PDMA1) + PDMA1_IDX, +#endif +#if defined(BSP_USING_PDMA2) + PDMA2_IDX, +#endif +#if defined(BSP_USING_PDMA3) + PDMA3_IDX, +#endif + PDMA_CNT +}; + +#define NU_PDMA_SG_TBL_MAXSIZE (NU_PDMA_SG_LIMITED_DISTANCE/sizeof(DSCT_T)) + +#define NU_PDMA_CH_MAX (PDMA_CNT*PDMA_CH_MAX) /* Specify maximum channels of PDMA */ +#define NU_PDMA_CH_Pos (0) /* Specify first channel number of PDMA */ +#define NU_PDMA_CH_Msk (PDMA_CH_Msk << NU_PDMA_CH_Pos) +#define NU_PDMA_GET_BASE(ch) (PDMA_T *)((((ch)/PDMA_CH_MAX)*0x10000UL) + DEF_PDMA_BASE_START) +#define NU_PDMA_GET_MOD_IDX(ch) ((ch)/PDMA_CH_MAX) +#define NU_PDMA_GET_MOD_CHIDX(ch) ((ch)%PDMA_CH_MAX) + +/* Private typedef --------------------------------------------------------------*/ +struct nu_pdma_periph_ctl +{ + uint32_t m_u32Peripheral; + nu_pdma_memctrl_t m_eMemCtl; +}; +typedef struct nu_pdma_periph_ctl nu_pdma_periph_ctl_t; + +struct nu_pdma_chn +{ + struct nu_pdma_chn_cb m_sCB_Event; + struct nu_pdma_chn_cb m_sCB_Trigger; + struct nu_pdma_chn_cb m_sCB_Disable; + + nu_pdma_desc_t *m_ppsSgtbl; + uint32_t m_u32WantedSGTblNum; + + uint32_t m_u32EventFilter; + uint32_t m_u32IdleTimeout_us; + nu_pdma_periph_ctl_t m_spPeripCtl; +}; +typedef struct nu_pdma_chn nu_pdma_chn_t; + +struct nu_pdma_memfun_actor +{ + int m_i32ChannID; + uint32_t m_u32Result; + rt_sem_t m_psSemMemFun; +} ; +typedef struct nu_pdma_memfun_actor *nu_pdma_memfun_actor_t; + +/* Private functions ------------------------------------------------------------*/ +static int nu_pdma_peripheral_set(uint32_t u32PeriphType); +static void nu_pdma_init(void); +static void nu_pdma_channel_enable(int i32ChannID); +static void nu_pdma_channel_disable(int i32ChannID); +static void nu_pdma_channel_reset(int i32ChannID); +static rt_err_t nu_pdma_timeout_set(int i32ChannID, int i32Timeout_us); +static void nu_pdma_periph_ctrl_fill(int i32ChannID, int i32CtlPoolIdx); +static rt_size_t nu_pdma_memfun(void *dest, void *src, uint32_t u32DataWidth, unsigned int u32TransferCnt, nu_pdma_memctrl_t eMemCtl); +static void nu_pdma_memfun_cb(void *pvUserData, uint32_t u32Events); +static void nu_pdma_memfun_actor_init(void); +static int nu_pdma_memfun_employ(void); +static int nu_pdma_non_transfer_count_get(int32_t i32ChannID); + +/* Public functions -------------------------------------------------------------*/ + + +/* Private variables ------------------------------------------------------------*/ +static volatile int nu_pdma_inited = 0; +static volatile uint32_t nu_pdma_chn_mask_arr[PDMA_CNT] = {0}; +static nu_pdma_chn_t nu_pdma_chn_arr[NU_PDMA_CH_MAX]; +static volatile uint32_t nu_pdma_memfun_actor_mask = 0; +static volatile uint32_t nu_pdma_memfun_actor_maxnum = 0; +static rt_sem_t nu_pdma_memfun_actor_pool_sem = RT_NULL; +static rt_mutex_t nu_pdma_memfun_actor_pool_lock = RT_NULL; +static void nu_pdma_isr(int vector, void *pvdata); + +const static struct nu_module nu_pdma_arr[] = +{ +#if defined(BSP_USING_PDMA0) + { + .name = "pdma0", + .m_pvBase = (void *)PDMA0, + .u32RstId = PDMA0_RST, + .eIRQn = PDMA0_IRQn + }, +#endif +#if defined(BSP_USING_PDMA1) + { + .name = "pdma1", + .m_pvBase = (void *)PDMA1, + .u32RstId = PDMA1_RST, + .eIRQn = PDMA1_IRQn + }, +#endif +#if defined(BSP_USING_PDMA2) + { + .name = "pdma2", + .m_pvBase = (void *)PDMA2, + .u32RstId = PDMA2_RST, + .eIRQn = PDMA2_IRQn + }, +#endif +#if defined(BSP_USING_PDMA3) + { + .name = "pdma3", + .m_pvBase = (void *)PDMA3, + .u32RstId = PDMA3_RST, + .eIRQn = PDMA3_IRQn + } +#endif +}; + +static const nu_pdma_periph_ctl_t g_nu_pdma_peripheral_ctl_pool[ ] = +{ + // M2M + { PDMA_MEM, eMemCtl_SrcInc_DstInc }, + + // M2P + { PDMA_UART0_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART1_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART2_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART3_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART4_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART5_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART6_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART7_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART8_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART9_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART10_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART11_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART12_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART13_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART14_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART15_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_UART16_TX, eMemCtl_SrcInc_DstFix }, + + { PDMA_QSPI0_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_QSPI1_TX, eMemCtl_SrcInc_DstFix }, + + { PDMA_SPI0_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_SPI1_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_SPI2_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_SPI3_TX, eMemCtl_SrcInc_DstFix }, + + { PDMA_I2C0_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_I2C1_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_I2C2_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_I2C3_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_I2C4_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_I2C5_TX, eMemCtl_SrcInc_DstFix }, + + { PDMA_I2S0_TX, eMemCtl_SrcInc_DstFix }, + { PDMA_I2S1_TX, eMemCtl_SrcInc_DstFix }, + + // P2M + { PDMA_UART0_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART1_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART2_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART3_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART4_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART5_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART6_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART7_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART8_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART9_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART10_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART11_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART12_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART13_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART14_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART15_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_UART16_RX, eMemCtl_SrcFix_DstInc }, + + { PDMA_QSPI0_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_QSPI1_RX, eMemCtl_SrcFix_DstInc }, + + { PDMA_SPI0_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_SPI1_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_SPI2_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_SPI3_RX, eMemCtl_SrcFix_DstInc }, + + { PDMA_I2C0_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_I2C1_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_I2C2_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_I2C3_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_I2C4_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_I2C5_RX, eMemCtl_SrcFix_DstInc }, + + { PDMA_I2S0_RX, eMemCtl_SrcFix_DstInc }, + { PDMA_I2S1_RX, eMemCtl_SrcFix_DstInc }, + +}; +#define NU_PERIPHERAL_SIZE ( sizeof(g_nu_pdma_peripheral_ctl_pool) / sizeof(g_nu_pdma_peripheral_ctl_pool[0]) ) + +static struct nu_pdma_memfun_actor nu_pdma_memfun_actor_arr[NU_PDMA_MEMFUN_ACTOR_MAX]; + +static int nu_pdma_check_is_nonallocated(uint32_t u32ChnId) +{ + uint32_t mod_idx = NU_PDMA_GET_MOD_IDX(u32ChnId); + RT_ASSERT(mod_idx < PDMA_CNT); + return !(nu_pdma_chn_mask_arr[mod_idx] & (1 << NU_PDMA_GET_MOD_CHIDX(u32ChnId))); +} + +static int nu_pdma_peripheral_set(uint32_t u32PeriphType) +{ + int idx = 0; + + while (idx < NU_PERIPHERAL_SIZE) + { + if (g_nu_pdma_peripheral_ctl_pool[idx].m_u32Peripheral == u32PeriphType) + return idx; + idx++; + } + + // Not such peripheral + return -1; +} + +static void nu_pdma_periph_ctrl_fill(int i32ChannID, int i32CtlPoolIdx) +{ + nu_pdma_chn_t *psPdmaChann = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos]; + psPdmaChann->m_spPeripCtl.m_u32Peripheral = g_nu_pdma_peripheral_ctl_pool[i32CtlPoolIdx].m_u32Peripheral; + psPdmaChann->m_spPeripCtl.m_eMemCtl = g_nu_pdma_peripheral_ctl_pool[i32CtlPoolIdx].m_eMemCtl; +} + +/** + * Hardware PDMA Initialization + */ +static void nu_pdma_init(void) +{ + int i; + + if (nu_pdma_inited) + return; + + rt_memset(nu_pdma_chn_arr, 0x00, NU_PDMA_CH_MAX * sizeof(nu_pdma_chn_t)); + + for (i = (PDMA_START + 1); i < PDMA_CNT; i++) + { + nu_pdma_chn_mask_arr[i] = ~(NU_PDMA_CH_Msk); + + nu_sys_ip_reset(nu_pdma_arr[i].u32RstId); + + /* Initialize PDMA setting */ + PDMA_Open((PDMA_T *)nu_pdma_arr[i].m_pvBase, PDMA_CH_Msk); + + PDMA_Close((PDMA_T *)nu_pdma_arr[i].m_pvBase); + + /* Register PDMA ISR */ + rt_hw_interrupt_install(nu_pdma_arr[i].eIRQn, nu_pdma_isr, nu_pdma_arr[i].m_pvBase, nu_pdma_arr[i].name); + rt_hw_interrupt_umask(nu_pdma_arr[i].eIRQn); + } + + nu_pdma_inited = 1; +} + +static inline void nu_pdma_channel_enable(int i32ChannID) +{ + PDMA_T *PDMA = NU_PDMA_GET_BASE(i32ChannID); + int u32ModChannId = NU_PDMA_GET_MOD_CHIDX(i32ChannID); + + /* Clean descriptor table control register. */ + PDMA->DSCT[u32ModChannId].CTL = 0UL; + + /* Enable the channel */ + PDMA->CHCTL |= (1 << u32ModChannId); +} + +static inline void nu_pdma_channel_disable(int i32ChannID) +{ + PDMA_T *PDMA = NU_PDMA_GET_BASE(i32ChannID); + PDMA->CHCTL &= ~(1 << NU_PDMA_GET_MOD_CHIDX(i32ChannID)); +} + +static inline void nu_pdma_channel_reset(int i32ChannID) +{ + PDMA_T *PDMA = NU_PDMA_GET_BASE(i32ChannID); + int u32ModChannId = NU_PDMA_GET_MOD_CHIDX(i32ChannID); + + PDMA->CHRST = (1 << u32ModChannId); + + /* Wait for cleared channel CHCTL. */ + while ((PDMA->CHCTL & (1 << u32ModChannId))); +} + +void nu_pdma_channel_terminate(int i32ChannID) +{ + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_pdma_channel_terminate; + + /* Reset specified channel. */ + nu_pdma_channel_reset(i32ChannID); + + /* Enable specified channel after reset. */ + nu_pdma_channel_enable(i32ChannID); + +exit_pdma_channel_terminate: + + return; +} + +static rt_err_t nu_pdma_timeout_set(int i32ChannID, int i32Timeout_us) +{ + rt_err_t ret = RT_EINVAL; + PDMA_T *PDMA = NULL; + uint32_t u32ModChannId; + + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_timeout_set; + + PDMA = NU_PDMA_GET_BASE(i32ChannID); + + u32ModChannId = NU_PDMA_GET_MOD_CHIDX(i32ChannID); + + nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_u32IdleTimeout_us = i32Timeout_us; + + if (i32Timeout_us) + { + uint32_t u32ToClk_Max = 1000000ul / (CLK_GetSYSCLK1Freq() / (1 << 8)); + uint32_t u32Divider = (i32Timeout_us / u32ToClk_Max) / (1 << 16); + uint32_t u32TOutCnt = (i32Timeout_us / u32ToClk_Max) % (1 << 16); + + PDMA_DisableTimeout(PDMA, 1 << u32ModChannId); + PDMA_EnableInt(PDMA, u32ModChannId, PDMA_INT_TIMEOUT); // Interrupt type + + if (u32Divider > 7) + { + u32Divider = 7; + u32TOutCnt = (1 << 16) - 1; + } + + if (u32ModChannId < 8) + PDMA->TOUTPSC = (PDMA->TOUTPSC & ~(0x7ul << (PDMA_TOUTPSC_TOUTPSC1_Pos * u32ModChannId))) | (u32Divider << (PDMA_TOUTPSC_TOUTPSC1_Pos * u32ModChannId)); + else + PDMA->TOUTPSC1 = (PDMA->TOUTPSC1 & ~(0x7ul << (PDMA_TOUTPSC_TOUTPSC1_Pos * u32ModChannId))) | (u32Divider << (PDMA_TOUTPSC_TOUTPSC1_Pos * u32ModChannId)); + + //rt_kprintf("[%d]HCLK=%d, u32Divider=%d, u32TOutCnt=%d\n", i32Timeout_us, CLK_GetSYSCLK1Freq(), u32Divider, u32TOutCnt ); + + PDMA_SetTimeOut(PDMA, u32ModChannId, 1, u32TOutCnt); + + ret = RT_EOK; + } + else + { + PDMA_DisableInt(PDMA, u32ModChannId, PDMA_INT_TIMEOUT); // Interrupt type + PDMA_DisableTimeout(PDMA, 1 << u32ModChannId); + } + +exit_nu_pdma_timeout_set: + + return -(ret); +} + +int nu_pdma_channel_allocate(int32_t i32PeripType) +{ + int ChnId, i32PeripCtlIdx, j; + + nu_pdma_init(); + + if ((i32PeripCtlIdx = nu_pdma_peripheral_set(i32PeripType)) < 0) + goto exit_nu_pdma_channel_allocate; + + for (j = (PDMA_START + 1); j < PDMA_CNT; j++) + { + /* Find the position of first '0' in nu_pdma_chn_mask_arr[j]. */ + ChnId = nu_cto(nu_pdma_chn_mask_arr[j]); + if (ChnId < PDMA_CH_MAX) + { + nu_pdma_chn_mask_arr[j] |= (1 << ChnId); + ChnId += (j * PDMA_CH_MAX); + rt_memset(nu_pdma_chn_arr + ChnId - NU_PDMA_CH_Pos, 0x00, sizeof(nu_pdma_chn_t)); + + /* Set idx number of g_nu_pdma_peripheral_ctl_pool */ + nu_pdma_periph_ctrl_fill(ChnId, i32PeripCtlIdx); + + /* Reset channel */ + nu_pdma_channel_terminate(ChnId); + + return ChnId; + } + } + +exit_nu_pdma_channel_allocate: + // No channel available + return -(RT_ERROR); +} + +rt_err_t nu_pdma_channel_free(int i32ChannID) +{ + rt_err_t ret = RT_EINVAL; + + if (! nu_pdma_inited) + goto exit_nu_pdma_channel_free; + + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_channel_free; + + if ((i32ChannID < NU_PDMA_CH_MAX) && (i32ChannID >= NU_PDMA_CH_Pos)) + { + nu_pdma_chn_mask_arr[NU_PDMA_GET_MOD_IDX(i32ChannID)] &= ~(1 << NU_PDMA_GET_MOD_CHIDX(i32ChannID)); + nu_pdma_channel_disable(i32ChannID); + ret = RT_EOK; + } +exit_nu_pdma_channel_free: + + return -(ret); +} + +rt_err_t nu_pdma_filtering_set(int i32ChannID, uint32_t u32EventFilter) +{ + rt_err_t ret = RT_EINVAL; + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_filtering_set; + + nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_u32EventFilter = u32EventFilter; + + ret = RT_EOK; + +exit_nu_pdma_filtering_set: + + return -(ret) ; +} + +uint32_t nu_pdma_filtering_get(int i32ChannID) +{ + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_filtering_get; + + return nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_u32EventFilter; + +exit_nu_pdma_filtering_get: + + return 0; +} + +rt_err_t nu_pdma_callback_register(int i32ChannID, nu_pdma_chn_cb_t psChnCb) +{ + rt_err_t ret = RT_EINVAL; + nu_pdma_chn_cb_t psChnCb_Current = RT_NULL; + + RT_ASSERT(psChnCb != RT_NULL); + + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_callback_register; + + switch (psChnCb->m_eCBType) + { + case eCBType_Event: + psChnCb_Current = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_sCB_Event; + break; + case eCBType_Trigger: + psChnCb_Current = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_sCB_Trigger; + break; + case eCBType_Disable: + psChnCb_Current = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_sCB_Disable; + break; + default: + goto exit_nu_pdma_callback_register; + } + + psChnCb_Current->m_pfnCBHandler = psChnCb->m_pfnCBHandler; + psChnCb_Current->m_pvUserData = psChnCb->m_pvUserData; + + ret = RT_EOK; + +exit_nu_pdma_callback_register: + + return -(ret) ; +} + +nu_pdma_cb_handler_t nu_pdma_callback_hijack(int i32ChannID, nu_pdma_cbtype_t eCBType, nu_pdma_chn_cb_t psChnCb_Hijack) +{ + nu_pdma_chn_cb_t psChnCb_Current = RT_NULL; + struct nu_pdma_chn_cb sChnCB_Tmp; + + RT_ASSERT(psChnCb_Hijack != NULL); + + sChnCB_Tmp.m_pfnCBHandler = RT_NULL; + + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_callback_hijack; + + switch (eCBType) + { + case eCBType_Event: + psChnCb_Current = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_sCB_Event; + break; + case eCBType_Trigger: + psChnCb_Current = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_sCB_Trigger; + break; + case eCBType_Disable: + psChnCb_Current = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_sCB_Disable; + break; + default: + goto exit_nu_pdma_callback_hijack; + } + + /* Backup */ + sChnCB_Tmp.m_pfnCBHandler = psChnCb_Current->m_pfnCBHandler; + sChnCB_Tmp.m_pvUserData = psChnCb_Current->m_pvUserData; + + /* Update */ + psChnCb_Current->m_pfnCBHandler = psChnCb_Hijack->m_pfnCBHandler; + psChnCb_Current->m_pvUserData = psChnCb_Hijack->m_pvUserData; + + /* Restore */ + psChnCb_Hijack->m_pfnCBHandler = sChnCB_Tmp.m_pfnCBHandler; + psChnCb_Hijack->m_pvUserData = sChnCB_Tmp.m_pvUserData; + +exit_nu_pdma_callback_hijack: + + return sChnCB_Tmp.m_pfnCBHandler; +} + +static int nu_pdma_non_transfer_count_get(int32_t i32ChannID) +{ + PDMA_T *PDMA = NU_PDMA_GET_BASE(i32ChannID); + return ((PDMA->DSCT[NU_PDMA_GET_MOD_CHIDX(i32ChannID)].CTL & PDMA_DSCT_CTL_TXCNT_Msk) >> PDMA_DSCT_CTL_TXCNT_Pos) + 1; +} + +int nu_pdma_transferred_byte_get(int32_t i32ChannID, int32_t i32TriggerByteLen) +{ + int i32BitWidth = 0; + int cur_txcnt = 0; + PDMA_T *PDMA; + + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_transferred_byte_get; + + PDMA = NU_PDMA_GET_BASE(i32ChannID); + + if ((PDMA->DSCT[NU_PDMA_GET_MOD_CHIDX(i32ChannID)].CTL & PDMA_DSCT_CTL_OPMODE_Msk) != PDMA_OP_SCATTER) + { + i32BitWidth = PDMA->DSCT[NU_PDMA_GET_MOD_CHIDX(i32ChannID)].CTL & PDMA_DSCT_CTL_TXWIDTH_Msk; + i32BitWidth = (i32BitWidth == PDMA_WIDTH_8) ? 1 : (i32BitWidth == PDMA_WIDTH_16) ? 2 : (i32BitWidth == PDMA_WIDTH_32) ? 4 : 0; + + cur_txcnt = nu_pdma_non_transfer_count_get(i32ChannID); + + // rt_kprintf("\n[%s] %d %d %02x\n", __func__, i32ChannID, cur_txcnt, (PDMA->DSCT[NU_PDMA_GET_MOD_CHIDX(i32ChannID)].CTL & PDMA_DSCT_CTL_OPMODE_Msk) ); + + return (i32TriggerByteLen - (cur_txcnt) * i32BitWidth); + } + + // rt_kprintf("\n@@@@ %d %02x @@@@\n", i32ChannID, PDMA->DSCT[NU_PDMA_GET_MOD_CHIDX(i32ChannID)].CTL & PDMA_DSCT_CTL_OPMODE_Msk); + + return 0; + +exit_nu_pdma_transferred_byte_get: + + return -1; +} + +nu_pdma_memctrl_t nu_pdma_channel_memctrl_get(int i32ChannID) +{ + nu_pdma_memctrl_t eMemCtrl = eMemCtl_Undefined; + + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_channel_memctrl_get; + + eMemCtrl = nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_spPeripCtl.m_eMemCtl; + +exit_nu_pdma_channel_memctrl_get: + + return eMemCtrl; +} + +rt_err_t nu_pdma_channel_memctrl_set(int i32ChannID, nu_pdma_memctrl_t eMemCtrl) +{ + rt_err_t ret = RT_EINVAL; + nu_pdma_chn_t *psPdmaChann = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos]; + + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_channel_memctrl_set; + else if ((eMemCtrl < eMemCtl_SrcFix_DstFix) || (eMemCtrl > eMemCtl_SrcInc_DstInc)) + goto exit_nu_pdma_channel_memctrl_set; + + /* PDMA_MEM/SAR_FIX/BURST mode is not supported. */ + if ((psPdmaChann->m_spPeripCtl.m_u32Peripheral == PDMA_MEM) && + ((eMemCtrl == eMemCtl_SrcFix_DstInc) || (eMemCtrl == eMemCtl_SrcFix_DstFix))) + goto exit_nu_pdma_channel_memctrl_set; + + nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_spPeripCtl.m_eMemCtl = eMemCtrl; + + ret = RT_EOK; + +exit_nu_pdma_channel_memctrl_set: + + return -(ret); +} + +static void nu_pdma_channel_memctrl_fill(nu_pdma_memctrl_t eMemCtl, uint32_t *pu32SrcCtl, uint32_t *pu32DstCtl) +{ + switch ((int)eMemCtl) + { + case eMemCtl_SrcFix_DstFix: + *pu32SrcCtl = PDMA_SAR_FIX; + *pu32DstCtl = PDMA_DAR_FIX; + break; + case eMemCtl_SrcFix_DstInc: + *pu32SrcCtl = PDMA_SAR_FIX; + *pu32DstCtl = PDMA_DAR_INC; + break; + case eMemCtl_SrcInc_DstFix: + *pu32SrcCtl = PDMA_SAR_INC; + *pu32DstCtl = PDMA_DAR_FIX; + break; + case eMemCtl_SrcInc_DstInc: + *pu32SrcCtl = PDMA_SAR_INC; + *pu32DstCtl = PDMA_DAR_INC; + break; + default: + break; + } +} + +/* This is for Scatter-gather DMA. */ +rt_err_t nu_pdma_desc_setup(int i32ChannID, nu_pdma_desc_t dma_desc, uint32_t u32DataWidth, uint32_t u32AddrSrc, + uint32_t u32AddrDst, int32_t i32TransferCnt, nu_pdma_desc_t next, uint32_t u32BeSilent) +{ + nu_pdma_periph_ctl_t *psPeriphCtl = NULL; + + uint32_t u32SrcCtl = 0; + uint32_t u32DstCtl = 0; + + rt_err_t ret = RT_EINVAL; + + if (!dma_desc) + goto exit_nu_pdma_desc_setup; + else if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_desc_setup; + else if (!(u32DataWidth == 8 || u32DataWidth == 16 || u32DataWidth == 32)) + goto exit_nu_pdma_desc_setup; + else if ((u32AddrSrc % (u32DataWidth / 8)) || (u32AddrDst % (u32DataWidth / 8))) + goto exit_nu_pdma_desc_setup; + else if (i32TransferCnt > NU_PDMA_MAX_TXCNT) + goto exit_nu_pdma_desc_setup; + + psPeriphCtl = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_spPeripCtl; + + nu_pdma_channel_memctrl_fill(psPeriphCtl->m_eMemCtl, &u32SrcCtl, &u32DstCtl); + + dma_desc->CTL = ((i32TransferCnt - 1) << PDMA_DSCT_CTL_TXCNT_Pos) | + ((u32DataWidth == 8) ? PDMA_WIDTH_8 : (u32DataWidth == 16) ? PDMA_WIDTH_16 : PDMA_WIDTH_32) | + u32SrcCtl | + u32DstCtl | + PDMA_OP_BASIC; + + dma_desc->SA = u32AddrSrc; + dma_desc->DA = u32AddrDst; + dma_desc->NEXT = 0; /* Terminating node by default. */ + + if (psPeriphCtl->m_u32Peripheral == PDMA_MEM) + { + /* For M2M transfer */ + dma_desc->CTL |= (PDMA_REQ_BURST | PDMA_BURST_32); + } + else + { + /* For P2M and M2P transfer */ + dma_desc->CTL |= (PDMA_REQ_SINGLE); + } + + if (next) + { + /* Link to Next and modify to scatter-gather DMA mode. */ + dma_desc->CTL = (dma_desc->CTL & ~PDMA_DSCT_CTL_OPMODE_Msk) | PDMA_OP_SCATTER; + dma_desc->NEXT = (uint32_t)next; + + } + + /* Be silent */ + if (u32BeSilent) + dma_desc->CTL |= PDMA_DSCT_CTL_TBINTDIS_Msk; + + ret = RT_EOK; + +exit_nu_pdma_desc_setup: + + return -(ret); +} + +rt_err_t nu_pdma_sgtbls_allocate(nu_pdma_desc_t *ppsSgtbls, int num) +{ + int i; + nu_pdma_desc_t psSgTblHead; + + RT_ASSERT(ppsSgtbls != NULL); + RT_ASSERT(num > 0); + + psSgTblHead = (nu_pdma_desc_t) rt_malloc_align(RT_ALIGN(sizeof(DSCT_T) * num, 64), 64); + RT_ASSERT(psSgTblHead != RT_NULL); + + rt_memset((void *)psSgTblHead, 0, sizeof(DSCT_T) * num); + + for (i = 0; i < num; i++) + ppsSgtbls[i] = &psSgTblHead[i]; + + return RT_EOK; +} + +void nu_pdma_sgtbls_free(nu_pdma_desc_t *ppsSgtbls, int num) +{ + nu_pdma_desc_t psSgTblHead; + + RT_ASSERT(ppsSgtbls != NULL); + psSgTblHead = *ppsSgtbls; + RT_ASSERT(psSgTblHead != NULL); + + rt_free_align(psSgTblHead); +} + +static void _nu_pdma_transfer(int i32ChannID, uint32_t u32Peripheral, nu_pdma_desc_t head, uint32_t u32IdleTimeout_us) +{ + PDMA_T *PDMA = NU_PDMA_GET_BASE(i32ChannID); + nu_pdma_chn_t *psPdmaChann = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos]; + +#if !defined(USE_MA35D1_SUBM) + /* Writeback data in dcache to memory before transferring. */ + { + static uint32_t bNonCacheAlignedWarning = 1; + nu_pdma_desc_t next = head; + int CACHE_LINE_SIZE = nu_cpu_dcache_line_size(); + while (next != RT_NULL) + { + uint32_t u32TxCnt = ((next->CTL & PDMA_DSCT_CTL_TXCNT_Msk) >> PDMA_DSCT_CTL_TXCNT_Pos) + 1; + uint32_t u32DataWidth = (1 << ((next->CTL & PDMA_DSCT_CTL_TXWIDTH_Msk) >> PDMA_DSCT_CTL_TXWIDTH_Pos)); + uint32_t u32SrcCtl = (next->CTL & PDMA_DSCT_CTL_SAINC_Msk); + uint32_t u32DstCtl = (next->CTL & PDMA_DSCT_CTL_DAINC_Msk); + uint32_t u32FlushLen = u32TxCnt * u32DataWidth; + +#if 0 + rt_kprintf("[%s] i32ChannID=%d\n", __func__, i32ChannID); + rt_kprintf("[%s] PDMA=0x%08x\n", __func__, (uint32_t)PDMA); + rt_kprintf("[%s] u32TxCnt=%d\n", __func__, u32TxCnt); + rt_kprintf("[%s] u32DataWidth=%d\n", __func__, u32DataWidth); + rt_kprintf("[%s] u32SrcCtl=0x%08x\n", __func__, u32SrcCtl); + rt_kprintf("[%s] u32DstCtl=0x%08x\n", __func__, u32DstCtl); + rt_kprintf("[%s] u32FlushLen=%d\n", __func__, u32FlushLen); +#endif + + /* Flush Src buffer into memory. */ + if ((u32SrcCtl == PDMA_SAR_INC)) // for M2P, M2M + rt_hw_cpu_dcache_clean_inv((void *)next->SA, u32FlushLen); + + /* Flush Dst buffer into memory. */ + if ((u32DstCtl == PDMA_DAR_INC)) // for P2M, M2M + rt_hw_cpu_dcache_clean_inv((void *)next->DA, u32FlushLen); + + /* Flush descriptor into memory */ + rt_hw_cpu_dcache_clean_inv((void *)next, sizeof(DSCT_T)); + + if (bNonCacheAlignedWarning) + { + if ((u32FlushLen & (CACHE_LINE_SIZE - 1)) || + (next->SA & (CACHE_LINE_SIZE - 1)) || + (next->DA & (CACHE_LINE_SIZE - 1)) || + ((rt_uint32_t)next & (CACHE_LINE_SIZE - 1))) + { + /* + Race-condition avoidance between DMA-transferring and DCache write-back: + Source, destination, DMA descriptor address and length should be aligned at len(CACHE_LINE_SIZE) + */ + bNonCacheAlignedWarning = 0; + rt_kprintf("[PDMA-W]\n"); + } + } + + next = (nu_pdma_desc_t)next->NEXT; + + if (next == head) break; + } + } +#endif + + PDMA_DisableTimeout(PDMA, 1 << NU_PDMA_GET_MOD_CHIDX(i32ChannID)); + + PDMA_EnableInt(PDMA, NU_PDMA_GET_MOD_CHIDX(i32ChannID), PDMA_INT_TRANS_DONE); + + nu_pdma_timeout_set(i32ChannID, u32IdleTimeout_us); + + /* Set scatter-gather mode and head */ + /* Take care the head structure, you should make sure cache-coherence. */ + PDMA_SetTransferMode(PDMA, + NU_PDMA_GET_MOD_CHIDX(i32ChannID), + u32Peripheral, + (head->NEXT != 0) ? 1 : 0, + (uint32_t)head); + + /* If peripheral is M2M, trigger it. */ + if (u32Peripheral == PDMA_MEM) + { + PDMA_Trigger(PDMA, NU_PDMA_GET_MOD_CHIDX(i32ChannID)); + } + else if (psPdmaChann->m_sCB_Trigger.m_pfnCBHandler) + { + psPdmaChann->m_sCB_Trigger.m_pfnCBHandler(psPdmaChann->m_sCB_Trigger.m_pvUserData, psPdmaChann->m_sCB_Trigger.m_u32Reserved); + } +} + +static void _nu_pdma_free_sgtbls(nu_pdma_chn_t *psPdmaChann) +{ + if (psPdmaChann->m_ppsSgtbl) + { + nu_pdma_sgtbls_free(psPdmaChann->m_ppsSgtbl, psPdmaChann->m_u32WantedSGTblNum); + rt_free_align((void *)psPdmaChann->m_ppsSgtbl); + psPdmaChann->m_ppsSgtbl = RT_NULL; + psPdmaChann->m_u32WantedSGTblNum = 0; + } +} + +static rt_err_t _nu_pdma_transfer_chain(int i32ChannID, uint32_t u32DataWidth, uint32_t u32AddrSrc, uint32_t u32AddrDst, uint32_t u32TransferCnt, uint32_t u32IdleTimeout_us) +{ + int i = 0; + rt_err_t ret = RT_ERROR; + nu_pdma_periph_ctl_t *psPeriphCtl = NULL; + nu_pdma_chn_t *psPdmaChann = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos]; + + nu_pdma_memctrl_t eMemCtl = nu_pdma_channel_memctrl_get(i32ChannID); + + rt_uint32_t u32Offset = 0; + rt_uint32_t u32TxCnt = 0; + + psPeriphCtl = &psPdmaChann->m_spPeripCtl; + + if (psPdmaChann->m_u32WantedSGTblNum != (u32TransferCnt / NU_PDMA_MAX_TXCNT + 1)) + { + if (psPdmaChann->m_u32WantedSGTblNum > 0) + _nu_pdma_free_sgtbls(psPdmaChann); + + psPdmaChann->m_u32WantedSGTblNum = u32TransferCnt / NU_PDMA_MAX_TXCNT + 1; + + psPdmaChann->m_ppsSgtbl = (nu_pdma_desc_t *)rt_malloc_align(sizeof(nu_pdma_desc_t) * psPdmaChann->m_u32WantedSGTblNum, 4); + if (!psPdmaChann->m_ppsSgtbl) + goto exit__nu_pdma_transfer_chain; + + ret = nu_pdma_sgtbls_allocate(psPdmaChann->m_ppsSgtbl, psPdmaChann->m_u32WantedSGTblNum); + if (ret != RT_EOK) + goto exit__nu_pdma_transfer_chain; + } + + for (i = 0; i < psPdmaChann->m_u32WantedSGTblNum; i++) + { + u32TxCnt = (u32TransferCnt > NU_PDMA_MAX_TXCNT) ? NU_PDMA_MAX_TXCNT : u32TransferCnt; + + ret = nu_pdma_desc_setup(i32ChannID, + psPdmaChann->m_ppsSgtbl[i], + u32DataWidth, + (eMemCtl & 0x2ul) ? u32AddrSrc + u32Offset : u32AddrSrc, /* Src address is Inc or not. */ + (eMemCtl & 0x1ul) ? u32AddrDst + u32Offset : u32AddrDst, /* Dst address is Inc or not. */ + u32TxCnt, + ((i + 1) == psPdmaChann->m_u32WantedSGTblNum) ? RT_NULL : psPdmaChann->m_ppsSgtbl[i + 1], + ((i + 1) == psPdmaChann->m_u32WantedSGTblNum) ? 0 : 1); // Silent, w/o TD interrupt + + if (ret != RT_EOK) + goto exit__nu_pdma_transfer_chain; + + u32TransferCnt -= u32TxCnt; + u32Offset += (u32TxCnt * u32DataWidth / 8); + } + + _nu_pdma_transfer(i32ChannID, psPeriphCtl->m_u32Peripheral, psPdmaChann->m_ppsSgtbl[0], u32IdleTimeout_us); + + ret = RT_EOK; + + return ret; + +exit__nu_pdma_transfer_chain: + + _nu_pdma_free_sgtbls(psPdmaChann); + + return -(ret); +} + +rt_err_t nu_pdma_transfer(int i32ChannID, uint32_t u32DataWidth, uint32_t u32AddrSrc, uint32_t u32AddrDst, uint32_t u32TransferCnt, uint32_t u32IdleTimeout_us) +{ + rt_err_t ret = RT_EINVAL; + PDMA_T *PDMA = NU_PDMA_GET_BASE(i32ChannID); + nu_pdma_desc_t head; + nu_pdma_chn_t *psPdmaChann; + + nu_pdma_periph_ctl_t *psPeriphCtl = NULL; + + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_transfer; + else if (!u32TransferCnt) + goto exit_nu_pdma_transfer; + else if (u32TransferCnt > NU_PDMA_MAX_TXCNT) + return _nu_pdma_transfer_chain(i32ChannID, u32DataWidth, u32AddrSrc, u32AddrDst, u32TransferCnt, u32IdleTimeout_us); + + psPdmaChann = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos]; + psPeriphCtl = &psPdmaChann->m_spPeripCtl; + + head = &PDMA->DSCT[NU_PDMA_GET_MOD_CHIDX(i32ChannID)]; + + ret = nu_pdma_desc_setup(i32ChannID, + head, + u32DataWidth, + u32AddrSrc, + u32AddrDst, + u32TransferCnt, + RT_NULL, + 0); + if (ret != RT_EOK) + goto exit_nu_pdma_transfer; + + _nu_pdma_transfer(i32ChannID, psPeriphCtl->m_u32Peripheral, head, u32IdleTimeout_us); + + ret = RT_EOK; + +exit_nu_pdma_transfer: + + return -(ret); +} + +rt_err_t nu_pdma_sg_transfer(int i32ChannID, nu_pdma_desc_t head, uint32_t u32IdleTimeout_us) +{ + rt_err_t ret = RT_EINVAL; + nu_pdma_periph_ctl_t *psPeriphCtl = NULL; + + if (!head) + goto exit_nu_pdma_sg_transfer; + else if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_sg_transfer; + + psPeriphCtl = &nu_pdma_chn_arr[i32ChannID - NU_PDMA_CH_Pos].m_spPeripCtl; + + _nu_pdma_transfer(i32ChannID, psPeriphCtl->m_u32Peripheral, head, u32IdleTimeout_us); + + ret = RT_EOK; + +exit_nu_pdma_sg_transfer: + + return -(ret); +} + +static void nu_pdma_isr(int vector, void *pvdata) +{ + int i; + PDMA_T *PDMA = (void *)pvdata; + + uint32_t intsts = PDMA_GET_INT_STATUS(PDMA); + uint32_t abtsts = PDMA_GET_ABORT_STS(PDMA); + uint32_t tdsts = PDMA_GET_TD_STS(PDMA); + uint32_t unalignsts = PDMA_GET_ALIGN_STS(PDMA); + uint32_t reqto = intsts & PDMA_INTSTS_REQTOFn_Msk; + uint32_t reqto_ch = (reqto >> PDMA_INTSTS_REQTOFn_Pos); + + int allch_sts = (reqto_ch | tdsts | abtsts | unalignsts); + + // Abort + if (intsts & PDMA_INTSTS_ABTIF_Msk) + { + // Clear all Abort flags + PDMA_CLR_ABORT_FLAG(PDMA, abtsts); + } + + // Transfer done + if (intsts & PDMA_INTSTS_TDIF_Msk) + { + // Clear all transfer done flags + PDMA_CLR_TD_FLAG(PDMA, tdsts); + } + + // Unaligned + if (intsts & PDMA_INTSTS_ALIGNF_Msk) + { + // Clear all Unaligned flags + PDMA_CLR_ALIGN_FLAG(PDMA, unalignsts); + } + + // Timeout + if (reqto) + { + // Clear all Timeout flags + PDMA->INTSTS = reqto; + } + + // Find the position of first '1' in allch_sts. + while ((i = nu_ctz(allch_sts)) < PDMA_CH_MAX) + { + int module_id = ((uint32_t)PDMA - DEF_PDMA_BASE_START) / 0x10000UL; + int j = i + (module_id * PDMA_CH_MAX); + int ch_mask = (1 << i); + + if (nu_pdma_chn_mask_arr[module_id] & ch_mask) + { + int ch_event = 0; + nu_pdma_chn_t *dma_chn = nu_pdma_chn_arr + j - NU_PDMA_CH_Pos; + + if (dma_chn->m_sCB_Event.m_pfnCBHandler) + { + if (abtsts & ch_mask) + { + ch_event |= NU_PDMA_EVENT_ABORT; + } + + if (tdsts & ch_mask) + { + ch_event |= NU_PDMA_EVENT_TRANSFER_DONE; + } + + if (unalignsts & ch_mask) + { + ch_event |= NU_PDMA_EVENT_ALIGNMENT; + } + + if (reqto_ch & ch_mask) + { + PDMA_DisableTimeout(PDMA, ch_mask); + ch_event |= NU_PDMA_EVENT_TIMEOUT; + } + + if (dma_chn->m_sCB_Disable.m_pfnCBHandler) + dma_chn->m_sCB_Disable.m_pfnCBHandler(dma_chn->m_sCB_Disable.m_pvUserData, dma_chn->m_sCB_Disable.m_u32Reserved); + + if ((dma_chn->m_u32EventFilter & ch_event) && dma_chn->m_sCB_Event.m_pfnCBHandler) + dma_chn->m_sCB_Event.m_pfnCBHandler(dma_chn->m_sCB_Event.m_pvUserData, ch_event); + + if (reqto_ch & ch_mask) + nu_pdma_timeout_set(j, nu_pdma_chn_arr[j - NU_PDMA_CH_Pos].m_u32IdleTimeout_us); + + }//if(dma_chn->handler) + + } //if (nu_pdma_chn_mask & ch_mask) + + // Clear the served bit. + allch_sts &= ~ch_mask; + + } //while +} + +static void nu_pdma_memfun_actor_init(void) +{ + int i = 0 ; + nu_pdma_init(); + for (i = 0; i < NU_PDMA_MEMFUN_ACTOR_MAX; i++) + { + rt_memset(&nu_pdma_memfun_actor_arr[i], 0, sizeof(struct nu_pdma_memfun_actor)); + if (-(RT_ERROR) != (nu_pdma_memfun_actor_arr[i].m_i32ChannID = nu_pdma_channel_allocate(PDMA_MEM))) + { + nu_pdma_memfun_actor_arr[i].m_psSemMemFun = rt_sem_create("memactor_sem", 0, RT_IPC_FLAG_FIFO); + RT_ASSERT(nu_pdma_memfun_actor_arr[i].m_psSemMemFun != RT_NULL); + } + else + break; + } + if (i) + { + nu_pdma_memfun_actor_maxnum = i; + nu_pdma_memfun_actor_mask = ~(((1 << i) - 1)); + + nu_pdma_memfun_actor_pool_sem = rt_sem_create("mempool_sem", nu_pdma_memfun_actor_maxnum, RT_IPC_FLAG_FIFO); + RT_ASSERT(nu_pdma_memfun_actor_pool_sem != RT_NULL); + + nu_pdma_memfun_actor_pool_lock = rt_mutex_create("mempool_lock", RT_IPC_FLAG_PRIO); + RT_ASSERT(nu_pdma_memfun_actor_pool_lock != RT_NULL); + } +} + +static void nu_pdma_memfun_cb(void *pvUserData, uint32_t u32Events) +{ + rt_err_t result = RT_EOK; + + nu_pdma_memfun_actor_t psMemFunActor = (nu_pdma_memfun_actor_t)pvUserData; + psMemFunActor->m_u32Result = u32Events; + + result = rt_sem_release(psMemFunActor->m_psSemMemFun); + RT_ASSERT(result == RT_EOK); +} + +static int nu_pdma_memfun_employ(void) +{ + int idx = -1 ; + rt_err_t result = RT_EOK; + + /* Headhunter */ + if (nu_pdma_memfun_actor_pool_sem && + ((result = rt_sem_take(nu_pdma_memfun_actor_pool_sem, RT_WAITING_FOREVER)) == RT_EOK)) + { + RT_ASSERT(result == RT_EOK); + + result = rt_mutex_take(nu_pdma_memfun_actor_pool_lock, RT_WAITING_FOREVER); + RT_ASSERT(result == RT_EOK); + + /* Find the position of first '0' in nu_pdma_memfun_actor_mask. */ + idx = nu_cto(nu_pdma_memfun_actor_mask); + if (idx != 32) + { + nu_pdma_memfun_actor_mask |= (1 << idx); + } + else + { + idx = -1; + } + result = rt_mutex_release(nu_pdma_memfun_actor_pool_lock); + RT_ASSERT(result == RT_EOK); + } + + return idx; +} + +static rt_size_t nu_pdma_memfun(void *dest, void *src, uint32_t u32DataWidth, unsigned int u32TransferCnt, nu_pdma_memctrl_t eMemCtl) +{ + nu_pdma_memfun_actor_t psMemFunActor = NULL; + struct nu_pdma_chn_cb sChnCB; + rt_err_t result = RT_ERROR; + + int idx; + rt_size_t ret = 0; + + /* Employ actor */ + while ((idx = nu_pdma_memfun_employ()) < 0); + + psMemFunActor = &nu_pdma_memfun_actor_arr[idx]; + + /* Set PDMA memory control to eMemCtl. */ + nu_pdma_channel_memctrl_set(psMemFunActor->m_i32ChannID, eMemCtl); + + /* Register ISR callback function */ + sChnCB.m_eCBType = eCBType_Event; + sChnCB.m_pfnCBHandler = nu_pdma_memfun_cb; + sChnCB.m_pvUserData = (void *)psMemFunActor; + + nu_pdma_filtering_set(psMemFunActor->m_i32ChannID, NU_PDMA_EVENT_ABORT | NU_PDMA_EVENT_TRANSFER_DONE); + nu_pdma_callback_register(psMemFunActor->m_i32ChannID, &sChnCB); + + psMemFunActor->m_u32Result = 0; + + /* Trigger it */ + nu_pdma_transfer(psMemFunActor->m_i32ChannID, + u32DataWidth, + (uint32_t)src, + (uint32_t)dest, + u32TransferCnt, + 0); + + /* Wait it done. */ + result = rt_sem_take(psMemFunActor->m_psSemMemFun, RT_WAITING_FOREVER); + RT_ASSERT(result == RT_EOK); + + /* Give result if get NU_PDMA_EVENT_TRANSFER_DONE.*/ + if (psMemFunActor->m_u32Result & NU_PDMA_EVENT_TRANSFER_DONE) + { + ret += u32TransferCnt; + } + else + { + ret += (u32TransferCnt - nu_pdma_non_transfer_count_get(psMemFunActor->m_i32ChannID)); + } + + /* Terminate it if get ABORT event */ + if (psMemFunActor->m_u32Result & NU_PDMA_EVENT_ABORT) + { + nu_pdma_channel_terminate(psMemFunActor->m_i32ChannID); + } + + result = rt_mutex_take(nu_pdma_memfun_actor_pool_lock, RT_WAITING_FOREVER); + RT_ASSERT(result == RT_EOK); + + nu_pdma_memfun_actor_mask &= ~(1 << idx); + + result = rt_mutex_release(nu_pdma_memfun_actor_pool_lock); + RT_ASSERT(result == RT_EOK); + + /* Fire actor */ + result = rt_sem_release(nu_pdma_memfun_actor_pool_sem); + RT_ASSERT(result == RT_EOK); + + return ret; +} + +rt_size_t nu_pdma_mempush(void *dest, void *src, uint32_t data_width, unsigned int transfer_count) +{ + if (data_width == 8 || data_width == 16 || data_width == 32) + return nu_pdma_memfun(dest, src, data_width, transfer_count, eMemCtl_SrcInc_DstFix); + return 0; +} + +void *nu_pdma_memcpy(void *dest, void *src, unsigned int count) +{ + int i = 0; + uint32_t u32Offset = 0; + uint32_t u32Remaining = count; + + for (i = 4; (i > 0) && (u32Remaining > 0) ; i >>= 1) + { + uint32_t u32src = (uint32_t)src + u32Offset; + uint32_t u32dest = (uint32_t)dest + u32Offset; + + if (((u32src % i) == (u32dest % i)) && + ((u32src % i) == 0) && + (RT_ALIGN_DOWN(u32Remaining, i) >= i)) + { + uint32_t u32TXCnt = u32Remaining / i; + if (u32TXCnt != nu_pdma_memfun((void *)u32dest, (void *)u32src, i * 8, u32TXCnt, eMemCtl_SrcInc_DstInc)) + goto exit_nu_pdma_memcpy; + + u32Offset += (u32TXCnt * i); + u32Remaining -= (u32TXCnt * i); + } + } + + if (count == u32Offset) + return dest; + +exit_nu_pdma_memcpy: + + return NULL; +} + +/** + * PDMA memfun actor initialization + */ +int rt_hw_pdma_memfun_init(void) +{ + nu_pdma_memfun_actor_init(); + return 0; +} +INIT_DEVICE_EXPORT(rt_hw_pdma_memfun_init); +#endif // #if defined(BSP_USING_PDMA) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.h new file mode 100644 index 0000000000..1267dcb9fa --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.h @@ -0,0 +1,87 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-2-7 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_PDMA_H__ +#define __DRV_PDMA_H__ + +#include +#include +#include "NuMicro.h" +#include + +#define NU_PDMA_CAP_NONE (0 << 0) + +#define NU_PDMA_EVENT_ABORT (1 << 0) +#define NU_PDMA_EVENT_TRANSFER_DONE (1 << 1) +#define NU_PDMA_EVENT_ALIGNMENT (1 << 2) +#define NU_PDMA_EVENT_TIMEOUT (1 << 3) +#define NU_PDMA_EVENT_ALL (NU_PDMA_EVENT_ABORT | NU_PDMA_EVENT_TRANSFER_DONE | NU_PDMA_EVENT_TIMEOUT) +#define NU_PDMA_EVENT_MASK NU_PDMA_EVENT_ALL +#define NU_PDMA_UNUSED (-1) + +#define NU_PDMA_SG_LIMITED_DISTANCE (BOARD_SDRAM_SIZE) +#define NU_PDMA_MAX_TXCNT ((PDMA_DSCT_CTL_TXCNT_Msk>>PDMA_DSCT_CTL_TXCNT_Pos) + 1) + +typedef enum +{ + eMemCtl_SrcFix_DstFix, + eMemCtl_SrcFix_DstInc, + eMemCtl_SrcInc_DstFix, + eMemCtl_SrcInc_DstInc, + eMemCtl_Undefined = (-1) +} nu_pdma_memctrl_t; + +typedef DSCT_T *nu_pdma_desc_t; + +typedef void (*nu_pdma_cb_handler_t)(void *, uint32_t); + +typedef enum +{ + eCBType_Event, + eCBType_Trigger, + eCBType_Disable, + eCBType_Undefined = (-1) +} nu_pdma_cbtype_t; + +struct nu_pdma_chn_cb +{ + nu_pdma_cbtype_t m_eCBType; + nu_pdma_cb_handler_t m_pfnCBHandler; + void *m_pvUserData; + uint32_t m_u32Reserved; +}; +typedef struct nu_pdma_chn_cb *nu_pdma_chn_cb_t; + +int nu_pdma_channel_allocate(int32_t i32PeripType); +rt_err_t nu_pdma_channel_free(int i32ChannID); +rt_err_t nu_pdma_callback_register(int i32ChannID, nu_pdma_chn_cb_t psChnCb); +rt_err_t nu_pdma_transfer(int i32ChannID, uint32_t u32DataWidth, uint32_t u32AddrSrc, uint32_t u32AddrDst, uint32_t i32TransferCnt, uint32_t u32IdleTimeout_us); +int nu_pdma_transferred_byte_get(int32_t i32ChannID, int32_t i32TriggerByteLen); +void nu_pdma_channel_terminate(int i32ChannID); +nu_pdma_memctrl_t nu_pdma_channel_memctrl_get(int i32ChannID); +rt_err_t nu_pdma_channel_memctrl_set(int i32ChannID, nu_pdma_memctrl_t eMemCtrl); + +nu_pdma_cb_handler_t nu_pdma_callback_hijack(int i32ChannID, nu_pdma_cbtype_t eCBType, nu_pdma_chn_cb_t psChnCb_Hijack); +rt_err_t nu_pdma_filtering_set(int i32ChannID, uint32_t u32EventFilter); +uint32_t nu_pdma_filtering_get(int i32ChannID); + +// For scatter-gather DMA +rt_err_t nu_pdma_desc_setup(int i32ChannID, nu_pdma_desc_t dma_desc, uint32_t u32DataWidth, uint32_t u32AddrSrc, uint32_t u32AddrDst, int32_t TransferCnt, nu_pdma_desc_t next, uint32_t u32BeSilent); +rt_err_t nu_pdma_sg_transfer(int i32ChannID, nu_pdma_desc_t head, uint32_t u32IdleTimeout_us); +rt_err_t nu_pdma_sgtbls_allocate(nu_pdma_desc_t *ppsSgtbls, int num); +void nu_pdma_sgtbls_free(nu_pdma_desc_t *ppsSgtbls, int num); + +// For memory actor +void *nu_pdma_memcpy(void *dest, void *src, unsigned int count); +rt_size_t nu_pdma_mempush(void *dest, void *src, uint32_t data_width, unsigned int transfer_count); + +#endif // __DRV_PDMA_H___ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_qei.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_qei.c new file mode 100644 index 0000000000..023c70ac9a --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_qei.c @@ -0,0 +1,298 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-10-21 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_QEI) + +#include +#include "drv_sys.h" +#include "drv_common.h" + +/* Private define ---------------------------------------------------------------*/ +enum +{ + QEI_START = -1, +#if defined(BSP_USING_QEI0) + QEI0_START, +#endif +#if defined(BSP_USING_QEI1) + QEI1_START, +#endif +#if defined(BSP_USING_QEI2) + QEI2_START, +#endif + QEI_CNT +}; + +/* Private typedef --------------------------------------------------------------*/ +struct nu_qei +{ + struct rt_pulse_encoder_device dev; + char *name; + QEI_T *base; + IRQn_Type irqn; + uint32_t rstidx; + uint32_t modid; + + rt_uint32_t max_cntval; + rt_uint32_t cmp_val; + rt_uint8_t qei_flag; +}; +typedef struct nu_qei *nu_qei_t; + +/* Private functions ------------------------------------------------------------*/ +static rt_uint32_t nu_qei_type(struct rt_pulse_encoder_device *pulse_encoder); +static rt_err_t nu_qei_init(struct rt_pulse_encoder_device *pulse_encoder); +static rt_int32_t nu_qei_get_count(struct rt_pulse_encoder_device *pulse_encoder); +static rt_err_t nu_qei_clear_count(struct rt_pulse_encoder_device *pulse_encoder); +static rt_err_t nu_qei_control(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t cmd, void *args); + +/* Public functions -------------------------------------------------------------*/ +rt_int32_t nu_qei_get_maxval(struct rt_pulse_encoder_device *pulse_encoder); +rt_int32_t nu_qei_get_cmpval(struct rt_pulse_encoder_device *pulse_encoder); +rt_int32_t nu_qei_get_type(struct rt_pulse_encoder_device *pulse_encoder); +void nu_qei_set_maxval_type(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t u32val, rt_uint8_t u8type); +void nu_qei_set_cmpval(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t u32val); + +/* Private variables ------------------------------------------------------------*/ +static struct nu_qei nu_qei_arr [] = +{ +#if defined(BSP_USING_QEI0) + { + .name = "qei0", + .base = QEI0, + .irqn = QEI0_IRQn, + .rstidx = QEI0_RST, + .modid = QEI0_MODULE, + + .max_cntval = 1000, + .cmp_val = 100, + }, +#endif + +#if defined(BSP_USING_QEI1) + { + .name = "qei1", + .base = QEI1, + .irqn = QEI1_IRQn, + .rstidx = QEI1_RST, + .modid = QEI1_MODULE, + + .max_cntval = 1000, + .cmp_val = 100, + }, +#endif + +#if defined(BSP_USING_QEI2) + { + .name = "qei2", + .base = QEI2, + .irqn = QEI2_IRQn, + .rstidx = QEI2_RST, + .modid = QEI2_MODULE, + + .max_cntval = 1000, + .cmp_val = 100, + }, +#endif +}; + +static const struct rt_pulse_encoder_ops nu_qei_ops = +{ + .init = nu_qei_init, + .get_count = nu_qei_get_count, + .clear_count = nu_qei_clear_count, + .control = nu_qei_control, +}; + +/* Public variables -------------------------------------------------------------*/ +static rt_uint32_t nu_qei_type(struct rt_pulse_encoder_device *pulse_encoder) +{ + rt_uint32_t u32type; + nu_qei_t psNuQei = (nu_qei_t)pulse_encoder; + + RT_ASSERT(pulse_encoder != RT_NULL); + + switch (pulse_encoder->type) + { + case SINGLE_PHASE_PULSE_ENCODER: + u32type = (psNuQei->cmp_val) ? QEI_CTL_X2_COMPARE_COUNTING_MODE : QEI_CTL_X2_FREE_COUNTING_MODE; + break; + + case UNKNOWN_PULSE_ENCODER_TYPE: + case AB_PHASE_PULSE_ENCODER: + default: + u32type = (psNuQei->cmp_val) ? QEI_CTL_X4_COMPARE_COUNTING_MODE : QEI_CTL_X4_FREE_COUNTING_MODE; + break; + } + + return u32type; +} + +void nu_qei_set_cmpval(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t u32val) +{ + nu_qei_t psNuQei = (nu_qei_t)pulse_encoder; + + RT_ASSERT(pulse_encoder != RT_NULL); + + QEI_SET_CNT_CMP(psNuQei->base, u32val); + if (u32val > 0) + { + QEI_EnableInt(psNuQei->base, QEI_CTL_CMPIEN_Msk); + QEI_ENABLE_CNT_CMP(psNuQei->base); + rt_hw_interrupt_umask(psNuQei->irqn); + } + else + { + QEI_DisableInt(psNuQei->base, QEI_CTL_CMPIEN_Msk); + QEI_DISABLE_CNT_CMP(psNuQei->base); + rt_hw_interrupt_mask(psNuQei->irqn); + } +} + +static rt_err_t nu_qei_init(struct rt_pulse_encoder_device *pulse_encoder) +{ + nu_qei_t psNuQei = (nu_qei_t)pulse_encoder; + + RT_ASSERT(pulse_encoder != RT_NULL); + + /* enable noise filter */ + QEI_ENABLE_NOISE_FILTER(psNuQei->base, QEI_CTL_NFCLKSEL_DIV2); + + /* set compare value and interrupt */ + nu_qei_set_cmpval(pulse_encoder, psNuQei->cmp_val); + + /* set qei mode */ + QEI_Open(psNuQei->base, nu_qei_type(pulse_encoder), psNuQei->max_cntval); + + return RT_EOK; +} + +static rt_int32_t nu_qei_get_count(struct rt_pulse_encoder_device *pulse_encoder) +{ + nu_qei_t psNuQei = (nu_qei_t)pulse_encoder; + RT_ASSERT(pulse_encoder != RT_NULL); + return (rt_int32_t)QEI_GET_CNT_VALUE(psNuQei->base); +} + +static rt_err_t nu_qei_clear_count(struct rt_pulse_encoder_device *pulse_encoder) +{ + nu_qei_t psNuQei = (nu_qei_t)pulse_encoder; + RT_ASSERT(pulse_encoder != RT_NULL); + + QEI_Stop(psNuQei->base); + QEI_SET_CNT_VALUE(psNuQei->base, 0); + QEI_Start(psNuQei->base); + + return RT_EOK; +} + +static rt_err_t nu_qei_control(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t cmd, void *args) +{ + rt_err_t result = RT_EOK; + nu_qei_t psNuQei = (nu_qei_t)pulse_encoder; + + RT_ASSERT(pulse_encoder != RT_NULL); + + switch (cmd) + { + case PULSE_ENCODER_CMD_ENABLE: + /* set compare value and interrupt */ + QEI_Start(psNuQei->base); + nu_qei_set_cmpval(pulse_encoder, psNuQei->cmp_val); + break; + case PULSE_ENCODER_CMD_DISABLE: + QEI_Stop(psNuQei->base); + nu_qei_set_cmpval(pulse_encoder, 0); + break; + default: + result = -RT_ENOSYS; + break; + } + + return result; +} + +static void nu_qei_isr(int vector, void *param) +{ + nu_qei_t psNuQei = (nu_qei_t)param; + + if (QEI_GET_INT_FLAG(psNuQei->base, QEI_STATUS_CMPF_Msk)) + { + QEI_CLR_INT_FLAG(psNuQei->base, QEI_STATUS_CMPF_Msk); + rt_kprintf("%s: CMP flag rising\n", psNuQei->name) ; + } +} + +rt_int32_t nu_qei_get_maxval(struct rt_pulse_encoder_device *pulse_encoder) +{ + nu_qei_t psNuQei = (nu_qei_t)pulse_encoder; + RT_ASSERT(pulse_encoder != RT_NULL); + + return psNuQei->max_cntval; +} + +rt_int32_t nu_qei_get_cmpval(struct rt_pulse_encoder_device *pulse_encoder) +{ + nu_qei_t psNuQei = (nu_qei_t)pulse_encoder; + RT_ASSERT(pulse_encoder != RT_NULL); + + return psNuQei->cmp_val; +} + +rt_int32_t nu_qei_get_type(struct rt_pulse_encoder_device *pulse_encoder) +{ + RT_ASSERT(pulse_encoder != RT_NULL); + return nu_qei_type(pulse_encoder); +} + +void nu_qei_set_maxval_type(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t u32val, enum rt_pulse_encoder_type eType) +{ + nu_qei_t psNuQei = (nu_qei_t)pulse_encoder; + + RT_ASSERT(pulse_encoder != RT_NULL); + RT_ASSERT(eType <= AB_PHASE_PULSE_ENCODER); + + psNuQei->dev.type = eType; + psNuQei->max_cntval = u32val; + QEI_Open(psNuQei->base, nu_qei_type(&psNuQei->dev), u32val); +} + +int rt_hw_qei_init(void) +{ + int i; + rt_err_t result = RT_EOK; + + for (i = (QEI_START + 1); i < QEI_CNT; i++) + { + nu_qei_t psNuQei = &nu_qei_arr[i]; + + psNuQei->dev.type = AB_PHASE_PULSE_ENCODER; + psNuQei->dev.ops = &nu_qei_ops; + + /* Enable QEI module */ + CLK_EnableModuleClock(psNuQei->modid); + SYS_ResetModule(psNuQei->rstidx); + + /* register isr */ + rt_hw_interrupt_install(psNuQei->irqn, nu_qei_isr, psNuQei, psNuQei->name); + + result = rt_device_pulse_encoder_register((struct rt_pulse_encoder_device *)&nu_qei_arr[i].dev, nu_qei_arr[i].name, RT_NULL); + RT_ASSERT(result == RT_EOK); + } + + return (int)result; +} +INIT_APP_EXPORT(rt_hw_qei_init); + +#endif /* BSP_USING_QEI */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_qei.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_qei.h new file mode 100644 index 0000000000..94bfb558c7 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_qei.h @@ -0,0 +1,29 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-10-21 Wayne First version +* +* Tips: +* QEI compare interrupt flag *(pulse_encoder->user_data): If compare value is +* not null, after execute device init, compare interrupt will be enabled automatic. +* When the interrupt occur, interrupt flag will be set 1. +* +******************************************************************************/ + +#ifndef __DRV_QEI_H__ +#define __DRV_QEI_H__ + +#include + +rt_int32_t nu_qei_get_maxval(struct rt_pulse_encoder_device *pulse_encoder); +rt_int32_t nu_qei_get_cmpval(struct rt_pulse_encoder_device *pulse_encoder); +rt_int32_t nu_qei_get_type(struct rt_pulse_encoder_device *pulse_encoder); +void nu_qei_set_maxval_type(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t u32val, enum rt_pulse_encoder_type eType); +void nu_qei_set_cmpval(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t u32val); + +#endif // __DRV_QEI_H___ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_qspi.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_qspi.c new file mode 100644 index 0000000000..a81632284e --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_qspi.c @@ -0,0 +1,442 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-11-11 Wayne First version +* +******************************************************************************/ +#include + +#if defined(BSP_USING_QSPI) + +#define LOG_TAG "drv.qspi" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL DBG_INFO +#define DBG_COLOR +#include + +#include +#include + +#include + +/* Private define ---------------------------------------------------------------*/ +enum +{ + QSPI_START = -1, +#if defined(BSP_USING_QSPI0) + QSPI0_IDX, +#endif +#if defined(BSP_USING_QSPI1) + QSPI1_IDX, +#endif + QSPI_CNT +}; + +/* Private typedef --------------------------------------------------------------*/ + +/* Private functions ------------------------------------------------------------*/ +static rt_err_t nu_qspi_bus_configure(struct rt_spi_device *device, struct rt_spi_configuration *configuration); +static rt_uint32_t nu_qspi_bus_xfer(struct rt_spi_device *device, struct rt_spi_message *message); +static int nu_qspi_register_bus(struct nu_spi *qspi_bus, const char *name); + +/* Public functions -------------------------------------------------------------*/ + +/* Private variables ------------------------------------------------------------*/ +static struct rt_spi_ops nu_qspi_poll_ops = +{ + .configure = nu_qspi_bus_configure, + .xfer = nu_qspi_bus_xfer, +}; + +static struct nu_spi nu_qspi_arr [] = +{ +#if defined(BSP_USING_QSPI0) + { + .name = "qspi0", + .spi_base = (SPI_T *)QSPI0, + .rstidx = QSPI0_RST, +#if defined(BSP_USING_SPI_PDMA) +#if defined(BSP_USING_QSPI0_PDMA) + .pdma_perp_tx = PDMA_QSPI0_TX, + .pdma_perp_rx = PDMA_QSPI0_RX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif +#if defined(BSP_USING_QSPI1) + { + .name = "qspi1", + .spi_base = (SPI_T *)QSPI1, + .rstidx = QSPI1_RST, +#if defined(BSP_USING_SPI_PDMA) +#if defined(BSP_USING_QSPI1_PDMA) + .pdma_perp_tx = PDMA_QSPI1_TX, + .pdma_perp_rx = PDMA_QSPI1_RX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif +}; /* qspi nu_qspi */ + +static rt_err_t nu_qspi_bus_configure(struct rt_spi_device *device, + struct rt_spi_configuration *configuration) +{ + struct nu_spi *spi_bus; + rt_uint32_t u32SPIMode; + rt_err_t ret = RT_EOK; + + RT_ASSERT(device != RT_NULL); + RT_ASSERT(configuration != RT_NULL); + + spi_bus = (struct nu_spi *) device->bus; + + /* Check mode */ + switch (configuration->mode & RT_SPI_MODE_3) + { + case RT_SPI_MODE_0: + u32SPIMode = SPI_MODE_0; + break; + case RT_SPI_MODE_1: + u32SPIMode = SPI_MODE_1; + break; + case RT_SPI_MODE_2: + u32SPIMode = SPI_MODE_2; + break; + case RT_SPI_MODE_3: + u32SPIMode = SPI_MODE_3; + break; + default: + ret = RT_EIO; + goto exit_nu_qspi_bus_configure; + } + + /* Check data width */ + if (!(configuration->data_width == 8 || + configuration->data_width == 16 || + configuration->data_width == 24 || + configuration->data_width == 32)) + { + ret = RT_EINVAL; + goto exit_nu_qspi_bus_configure; + } + + /* Need to initialize new configuration? */ + if (rt_memcmp(configuration, &spi_bus->configuration, sizeof(struct rt_spi_configuration)) != 0) + { + uint32_t u32ActualClk; + rt_memcpy(&spi_bus->configuration, configuration, sizeof(struct rt_spi_configuration)); + + u32ActualClk = QSPI_Open((QSPI_T *)spi_bus->spi_base, SPI_MASTER, u32SPIMode, configuration->data_width, configuration->max_hz); + LOG_I("[%s] Preferred clock:%d, Actually:%d", spi_bus->name, configuration->max_hz, u32ActualClk); + + if (configuration->mode & RT_SPI_CS_HIGH) + { + /* Set CS pin to LOW */ + SPI_SET_SS_LOW(spi_bus->spi_base); + } + else + { + /* Set CS pin to HIGH */ + SPI_SET_SS_HIGH(spi_bus->spi_base); + } + + if (configuration->mode & RT_SPI_MSB) + { + /* Set sequence to MSB first */ + SPI_SET_MSB_FIRST(spi_bus->spi_base); + } + else + { + /* Set sequence to LSB first */ + SPI_SET_LSB_FIRST(spi_bus->spi_base); + } + } + + /* Clear SPI RX FIFO */ + nu_spi_drain_rxfifo(spi_bus->spi_base); + +exit_nu_qspi_bus_configure: + + return -(ret); +} + +static int nu_qspi_mode_config(struct nu_spi *qspi_bus, rt_uint8_t *tx, rt_uint8_t *rx, int qspi_lines) +{ + QSPI_T *qspi_base = (QSPI_T *)qspi_bus->spi_base; + if (qspi_lines > 1) + { + if (tx) + { + switch (qspi_lines) + { + case 2: + QSPI_ENABLE_DUAL_OUTPUT_MODE(qspi_base); + break; + case 4: + QSPI_ENABLE_QUAD_OUTPUT_MODE(qspi_base); + break; + default: + LOG_E("Data line is not supported.\n"); + break; + } + } + else + { + switch (qspi_lines) + { + case 2: + QSPI_ENABLE_DUAL_INPUT_MODE(qspi_base); + break; + case 4: + QSPI_ENABLE_QUAD_INPUT_MODE(qspi_base); + break; + default: + LOG_E("Data line is not supported.\n"); + break; + } + } + } + else + { + QSPI_DISABLE_DUAL_MODE(qspi_base); + QSPI_DISABLE_QUAD_MODE(qspi_base); + } + return qspi_lines; +} + +static rt_uint32_t nu_qspi_bus_xfer(struct rt_spi_device *device, struct rt_spi_message *message) +{ + struct nu_spi *qspi_bus; + struct rt_qspi_configuration *qspi_configuration; + struct rt_qspi_message *qspi_message; + rt_uint8_t u8last = 1; + + rt_uint8_t bytes_per_word; + QSPI_T *qspi_base; + rt_uint32_t u32len = 0; + + RT_ASSERT(device != RT_NULL); + RT_ASSERT(message != RT_NULL); + + qspi_bus = (struct nu_spi *) device->bus; + qspi_base = (QSPI_T *)qspi_bus->spi_base; + qspi_configuration = &qspi_bus->configuration; + + bytes_per_word = qspi_configuration->parent.data_width / 8; + + if (message->cs_take && !(qspi_configuration->parent.mode & RT_SPI_NO_CS)) + { + if (qspi_configuration->parent.mode & RT_SPI_CS_HIGH) + { + QSPI_SET_SS_HIGH(qspi_base); + } + else + { + QSPI_SET_SS_LOW(qspi_base); + } + } + + qspi_message = (struct rt_qspi_message *)message; + + /* Command + Address + Dummy + Data */ + /* Command stage */ + if (qspi_message->instruction.content != 0) + { + u8last = nu_qspi_mode_config(qspi_bus, (rt_uint8_t *) &qspi_message->instruction.content, RT_NULL, qspi_message->instruction.qspi_lines); + nu_spi_transfer((struct nu_spi *)qspi_bus, + (rt_uint8_t *) &qspi_message->instruction.content, + RT_NULL, + 1, + 1); + } + + /* Address stage */ + if (qspi_message->address.size > 0) + { + rt_uint32_t u32ReversedAddr = 0; + rt_uint32_t u32AddrNumOfByte = qspi_message->address.size / 8; + switch (u32AddrNumOfByte) + { + case 1: + u32ReversedAddr = (qspi_message->address.content & 0xff); + break; + case 2: + nu_set16_be((rt_uint8_t *)&u32ReversedAddr, qspi_message->address.content); + break; + case 3: + nu_set24_be((rt_uint8_t *)&u32ReversedAddr, qspi_message->address.content); + break; + case 4: + nu_set32_be((rt_uint8_t *)&u32ReversedAddr, qspi_message->address.content); + break; + default: + RT_ASSERT(0); + break; + } + u8last = nu_qspi_mode_config(qspi_bus, (rt_uint8_t *)&u32ReversedAddr, RT_NULL, qspi_message->address.qspi_lines); + nu_spi_transfer((struct nu_spi *)qspi_bus, + (rt_uint8_t *) &u32ReversedAddr, + RT_NULL, + u32AddrNumOfByte, + 1); + } + + /* alternate_bytes stage */ + if ((qspi_message->alternate_bytes.size > 0) && (qspi_message->alternate_bytes.size <= 4)) + { + rt_uint32_t u32AlternateByte = 0; + rt_uint32_t u32NumOfByte = qspi_message->alternate_bytes.size / 8; + switch (u32NumOfByte) + { + case 1: + u32AlternateByte = (qspi_message->alternate_bytes.content & 0xff); + break; + case 2: + nu_set16_be((rt_uint8_t *)&u32AlternateByte, qspi_message->alternate_bytes.content); + break; + case 3: + nu_set24_be((rt_uint8_t *)&u32AlternateByte, qspi_message->alternate_bytes.content); + break; + case 4: + nu_set32_be((rt_uint8_t *)&u32AlternateByte, qspi_message->alternate_bytes.content); + break; + default: + RT_ASSERT(0); + break; + } + u8last = nu_qspi_mode_config(qspi_bus, (rt_uint8_t *)&u32AlternateByte, RT_NULL, qspi_message->alternate_bytes.qspi_lines); + nu_spi_transfer((struct nu_spi *)qspi_bus, + (rt_uint8_t *) &u32AlternateByte, + RT_NULL, + u32NumOfByte, + 1); + } + + /* Dummy_cycles stage */ + if (qspi_message->dummy_cycles > 0) + { + qspi_bus->dummy = 0x00; + + u8last = nu_qspi_mode_config(qspi_bus, (rt_uint8_t *) &qspi_bus->dummy, RT_NULL, u8last); + nu_spi_transfer((struct nu_spi *)qspi_bus, + (rt_uint8_t *) &qspi_bus->dummy, + RT_NULL, + qspi_message->dummy_cycles / (8 / u8last), + 1); + } + + if (message->length > 0) + { + /* Data stage */ + nu_qspi_mode_config(qspi_bus, (rt_uint8_t *) message->send_buf, (rt_uint8_t *) message->recv_buf, qspi_message->qspi_data_lines); + nu_spi_transfer((struct nu_spi *)qspi_bus, + (rt_uint8_t *) message->send_buf, + (rt_uint8_t *) message->recv_buf, + message->length, + bytes_per_word); + u32len = message->length; + } + else + { + u32len = 1; + } + + if (message->cs_release && !(qspi_configuration->parent.mode & RT_SPI_NO_CS)) + { + if (qspi_configuration->parent.mode & RT_SPI_CS_HIGH) + { + QSPI_SET_SS_LOW(qspi_base); + } + else + { + QSPI_SET_SS_HIGH(qspi_base); + } + } + + return u32len; +} + +static int nu_qspi_register_bus(struct nu_spi *qspi_bus, const char *name) +{ + return rt_qspi_bus_register(&qspi_bus->dev, name, &nu_qspi_poll_ops); +} + +/** + * Hardware SPI Initial + */ +static int rt_hw_qspi_init(void) +{ + rt_uint8_t i; + + for (i = (QSPI_START + 1); i < QSPI_CNT; i++) + { + nu_sys_ip_reset(nu_qspi_arr[i].rstidx); + + nu_qspi_register_bus(&nu_qspi_arr[i], nu_qspi_arr[i].name); +#if defined(BSP_USING_SPI_PDMA) + nu_qspi_arr[i].pdma_chanid_tx = -1; + nu_qspi_arr[i].pdma_chanid_rx = -1; +#endif +#if defined(BSP_USING_QSPI_PDMA) + if ((nu_qspi_arr[i].pdma_perp_tx != NU_PDMA_UNUSED) && (nu_qspi_arr[i].pdma_perp_rx != NU_PDMA_UNUSED)) + { + if (nu_hw_spi_pdma_allocate(&nu_qspi_arr[i]) != RT_EOK) + { + LOG_E("Failed to allocate DMA channels for %s. We will use poll-mode for this bus.\n", nu_qspi_arr[i].name); + } + } +#endif + } + + return 0; +} +INIT_DEVICE_EXPORT(rt_hw_qspi_init); + +rt_err_t nu_qspi_bus_attach_device(const char *bus_name, const char *device_name, rt_uint8_t data_line_width, void (*enter_qspi_mode)(), void (*exit_qspi_mode)()) +{ + struct rt_qspi_device *qspi_device = RT_NULL; + rt_err_t result = RT_EOK; + + RT_ASSERT(bus_name != RT_NULL); + RT_ASSERT(device_name != RT_NULL); + RT_ASSERT(data_line_width == 1 || data_line_width == 2 || data_line_width == 4); + + qspi_device = (struct rt_qspi_device *)rt_malloc(sizeof(struct rt_qspi_device)); + if (qspi_device == RT_NULL) + { + LOG_E("no memory, qspi bus attach device failed!\n"); + result = -RT_ENOMEM; + goto __exit; + } + + qspi_device->enter_qspi_mode = enter_qspi_mode; + qspi_device->exit_qspi_mode = exit_qspi_mode; + qspi_device->config.qspi_dl_width = data_line_width; + + result = rt_spi_bus_attach_device(&qspi_device->parent, device_name, bus_name, RT_NULL); + +__exit: + if (result != RT_EOK) + { + if (qspi_device) + { + rt_free(qspi_device); + } + } + + return result; +} + +#endif //#if defined(BSP_USING_QSPI) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_qspi.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_qspi.h new file mode 100644 index 0000000000..87be3e6e42 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_qspi.h @@ -0,0 +1,20 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-2-7 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_QSPI_H__ +#define __DRV_QSPI_H__ + +#include + +rt_err_t nu_qspi_bus_attach_device(const char *bus_name, const char *device_name, rt_uint8_t data_line_width, void (*enter_qspi_mode)(), void (*exit_qspi_mode)()); + +#endif // __DRV_QSPI_H___ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_rtc.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_rtc.c new file mode 100644 index 0000000000..e960ae63b2 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_rtc.c @@ -0,0 +1,371 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-09-27 Wayne First version +* +******************************************************************************/ +#include + +#if defined(BSP_USING_RTC) + +#include +#include +#include "NuMicro.h" +#include "drv_sys.h" +#include "drv_common.h" + +/* Private define ---------------------------------------------------------------*/ + +/* convert the real year and month value to the format of struct tm. */ +#define CONV_TO_TM_YEAR(year) ((year) - 1900) +#define CONV_TO_TM_MON(mon) ((mon) - 1) + +/* convert the tm_year and tm_mon from struct tm to the real value. */ +#define CONV_FROM_TM_YEAR(tm_year) ((tm_year) + 1900) +#define CONV_FROM_TM_MON(tm_mon) ((tm_mon) + 1) + +/* rtc date upper bound reaches the year of 2099. */ +#define RTC_TM_UPPER_BOUND \ +{ .tm_year = CONV_TO_TM_YEAR(2038), \ + .tm_mon = CONV_TO_TM_MON(1), \ + .tm_mday = 19, \ + .tm_hour = 3, \ + .tm_min = 14, \ + .tm_sec = 07, \ +} + +/* rtc date lower bound reaches the year of 2000. */ +#define RTC_TM_LOWER_BOUND \ +{ .tm_year = CONV_TO_TM_YEAR(2000), \ + .tm_mon = CONV_TO_TM_MON(1), \ + .tm_mday = 1, \ + .tm_hour = 0, \ + .tm_min = 0, \ + .tm_sec = 0, \ +} + +/* Private typedef --------------------------------------------------------------*/ + +/* Private functions ------------------------------------------------------------*/ +static rt_err_t nu_rtc_control(rt_device_t dev, int cmd, void *args); + +#if defined (NU_RTC_SUPPORT_IO_RW) + static rt_size_t nu_rtc_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size); + static rt_size_t nu_rtc_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size); +#endif + +static rt_err_t nu_rtc_is_date_valid(const time_t t); +static rt_err_t nu_rtc_init(void); + +#if defined(RT_USING_ALARM) + static void nu_rtc_alarm_reset(void); + static void nu_rtc_isr(int vector, void *param); +#endif + +/* Public functions -------------------------------------------------------------*/ +#if defined (NU_RTC_SUPPORT_MSH_CMD) + extern rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day); + extern rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second); +#endif + +/* Private variables ------------------------------------------------------------*/ +static struct rt_device device_rtc; + +static rt_err_t nu_rtc_init(void) +{ + /* hw rtc initialise */ + CLK_EnableModuleClock(RTC_MODULE); + if (RTC_Open(NULL) < 0) + { + rt_kprintf("*** RTC initialization is failure. Is LXT clock ready?\n"); + rt_kprintf("*** Please also press RTC Wakeup button before pressing Reset button.\n"); + return -RT_ERROR; + } + RTC_DisableInt(RTC_INTEN_ALMIEN_Msk | RTC_INTEN_TICKIEN_Msk | + RTC_INTEN_TAMP0IEN_Msk | RTC_INTEN_TAMP1IEN_Msk); + +#if defined(RT_USING_ALARM) + + nu_rtc_alarm_reset(); + RTC_EnableInt(RTC_INTEN_ALMIEN_Msk); + + rt_hw_interrupt_install(RTC_IRQn, nu_rtc_isr, &device_rtc, "rtc"); + rt_hw_interrupt_umask(RTC_IRQn); + +#endif + + return RT_EOK; +} + + +#if defined(RT_USING_ALARM) +/* Reset alarm settings to avoid the unwanted values remain in rtc registers. */ +static void nu_rtc_alarm_reset(void) +{ + S_RTC_TIME_DATA_T alarm; + + /* Reset alarm time and calendar. */ + alarm.u32Year = RTC_YEAR2000; + alarm.u32Month = 0; + alarm.u32Day = 0; + alarm.u32Hour = 0; + alarm.u32Minute = 0; + alarm.u32Second = 0; + alarm.u32TimeScale = RTC_CLOCK_24; + + RTC_SetAlarmDateAndTime(&alarm); + + /* Reset alarm time mask and calendar mask. */ + RTC_SetAlarmDateMask(0, 0, 0, 0, 0, 0); + RTC_SetAlarmTimeMask(0, 0, 0, 0, 0, 0); + + /* Clear alarm flag for safe */ + RTC_CLEAR_ALARM_INT_FLAG(); +} +#endif + + +/* rtc device driver initialise. */ +int rt_hw_rtc_init(void) +{ + rt_err_t ret; + + ret = nu_rtc_init(); + if (ret != RT_EOK) + { + return -1; + } + + /* register rtc device IO operations */ + device_rtc.type = RT_Device_Class_RTC; + device_rtc.init = NULL; + device_rtc.open = NULL; + device_rtc.close = NULL; + device_rtc.control = nu_rtc_control; + +#if defined (NU_RTC_SUPPORT_IO_RW) + device_rtc.read = nu_rtc_read; + device_rtc.write = nu_rtc_write; +#else + device_rtc.read = NULL; + device_rtc.write = NULL; +#endif + + device_rtc.user_data = RT_NULL; + device_rtc.rx_indicate = RT_NULL; + device_rtc.tx_complete = RT_NULL; + + ret = rt_device_register(&device_rtc, "rtc", RT_DEVICE_FLAG_RDWR); + + return (int)ret; +} +INIT_BOARD_EXPORT(rt_hw_rtc_init); + + +#if defined (NU_RTC_SUPPORT_IO_RW) +/* Register rt-thread device.read() entry. */ +static rt_size_t nu_rtc_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + (void) pos; + nu_rtc_control(dev, RT_DEVICE_CTRL_RTC_GET_TIME, buffer); + + return size; +} +#endif + + +#if defined (NU_RTC_SUPPORT_IO_RW) +/* Register rt-thread device.write() entry. */ +static rt_size_t nu_rtc_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + (void) pos; + nu_rtc_control(dev, RT_DEVICE_CTRL_RTC_SET_TIME, (void *)buffer); + + return size; +} +#endif + + +static rt_err_t nu_rtc_is_date_valid(const time_t t) +{ + static struct tm tm_upper = RTC_TM_UPPER_BOUND; + static struct tm tm_lower = RTC_TM_LOWER_BOUND; + static time_t t_upper, t_lower; + static rt_bool_t initialised = RT_FALSE; + + if (!initialised) + { + t_upper = timegm((struct tm *)&tm_upper); + t_lower = timegm((struct tm *)&tm_lower); + initialised = RT_TRUE; + } + + /* check the date is supported by rtc. */ + if ((t > t_upper) || (t < t_lower)) + return -(RT_EINVAL); + + return RT_EOK; +} + + +/* Register rt-thread device.control() entry. */ +static rt_err_t nu_rtc_control(rt_device_t dev, int cmd, void *args) +{ + struct tm tm_out, tm_in; + time_t *time; + S_RTC_TIME_DATA_T hw_time; + +#if defined(RT_USING_ALARM) + + struct rt_rtc_wkalarm *wkalarm; + S_RTC_TIME_DATA_T hw_alarm; +#endif + + if ((dev == NULL) || (args == NULL)) + return -(RT_EINVAL); + + switch (cmd) + { + case RT_DEVICE_CTRL_RTC_GET_TIME: + + time = (time_t *)args; + RTC_GetDateAndTime(&hw_time); + + tm_out.tm_year = CONV_TO_TM_YEAR(hw_time.u32Year); + tm_out.tm_mon = CONV_TO_TM_MON(hw_time.u32Month); + tm_out.tm_mday = hw_time.u32Day; + tm_out.tm_hour = hw_time.u32Hour; + tm_out.tm_min = hw_time.u32Minute; + tm_out.tm_sec = hw_time.u32Second; + *time = timegm(&tm_out); + break; + + case RT_DEVICE_CTRL_RTC_SET_TIME: + + time = (time_t *) args; + + if (nu_rtc_is_date_valid(*time) != RT_EOK) + return -(RT_ERROR); + + gmtime_r(time, &tm_in); + hw_time.u32Year = CONV_FROM_TM_YEAR(tm_in.tm_year); + hw_time.u32Month = CONV_FROM_TM_MON(tm_in.tm_mon); + hw_time.u32Day = tm_in.tm_mday; + hw_time.u32Hour = tm_in.tm_hour; + hw_time.u32Minute = tm_in.tm_min; + hw_time.u32Second = tm_in.tm_sec; + hw_time.u32TimeScale = RTC_CLOCK_24; + hw_time.u32AmPm = 0; + + RTC_SetDateAndTime(&hw_time); + break; + +#if defined(RT_USING_ALARM) + case RT_DEVICE_CTRL_RTC_GET_ALARM: + + wkalarm = (struct rt_rtc_wkalarm *) args; + RTC_GetAlarmDateAndTime(&hw_alarm); + + wkalarm->tm_hour = hw_alarm.u32Hour; + wkalarm->tm_min = hw_alarm.u32Minute; + wkalarm->tm_sec = hw_alarm.u32Second; + break; + + case RT_DEVICE_CTRL_RTC_SET_ALARM: + + wkalarm = (struct rt_rtc_wkalarm *) args; + hw_alarm.u32Hour = wkalarm->tm_hour; + hw_alarm.u32Minute = wkalarm->tm_min; + hw_alarm.u32Second = wkalarm->tm_sec; + + RTC_SetAlarmDateMask(1, 1, 1, 1, 1, 1); + RTC_SetAlarmDateAndTime(&hw_alarm); + break; + + default: + return -(RT_EINVAL); +#endif + } + + return RT_EOK; +} + + +#if defined (NU_RTC_SUPPORT_MSH_CMD) + +/* Support "rtc_det_date" command line in msh mode */ +static rt_err_t msh_rtc_set_date(int argc, char **argv) +{ + rt_uint32_t index, len, arg[3]; + + rt_memset(arg, 0, sizeof(arg)); + len = (argc >= 4) ? 4 : argc; + + /* The date information stored in argv is represented by the following order : + argv[0,1,2,3] = [cmd, year, month, day] */ + for (index = 0; index < (len - 1); index ++) + { + arg[index] = atol(argv[index + 1]); + } + + return set_date(arg[0], arg[1], arg[2]); +} +MSH_CMD_EXPORT_ALIAS(msh_rtc_set_date, rtc_set_date, e.g: rtc_set_date 2020 1 20); +#endif + + +#if defined (NU_RTC_SUPPORT_MSH_CMD) + +/* Support "rtc_det_time" command line in msh mode */ +static rt_err_t msh_rtc_set_time(int argc, char **argv) +{ + rt_uint32_t index, len, arg[3]; + + rt_memset(arg, 0, sizeof(arg)); + len = (argc >= 4) ? 4 : argc; + + /* The time information stored in argv is represented by the following order : + argv[0,1,2,3] = [cmd, hour, minute, second] */ + for (index = 0; index < (len - 1); index ++) + { + arg[index] = atol(argv[index + 1]); + } + + return set_time(arg[0], arg[1], arg[2]); +} +MSH_CMD_EXPORT_ALIAS(msh_rtc_set_time, rtc_set_time, e.g: rtc_set_time 18 30 00); +#endif + +#if defined(RT_USING_ALARM) +/* rtc interrupt entry */ +static void nu_rtc_isr(int vector, void *param) +{ + rt_interrupt_enter(); + + if (RTC_GET_TICK_INT_FLAG()) + { + RTC_CLEAR_TICK_INT_FLAG(); + } + +#if defined(RT_USING_ALARM) + + if (RTC_GET_ALARM_INT_FLAG()) + { + RTC_CLEAR_ALARM_INT_FLAG(); + + /* Send an alarm event to notify rt-thread alarm service. */ + rt_alarm_update(&device_rtc, (rt_uint32_t)NULL); + } +#endif + + rt_interrupt_leave(); +} +#endif + +#endif /* BSP_USING_RTC */ + diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_rtp.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_rtp.c new file mode 100644 index 0000000000..08ed8e0513 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_rtp.c @@ -0,0 +1,250 @@ +/**************************************************************************//** +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-9-27 Wayne First version +* +******************************************************************************/ + +#include + +#if !defined(USE_MA35D1_SUBM) + +#define LOG_TAG "drv.rtp" +#undef DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_DBG +#define DBG_COLOR +#include + +#include +#include "drv_sys.h" +#include +#include +#include +#include +#include + +#define RTP_USING_AT_STARTUP + +/* Link to rtthread.bin in ma35-rtp folder. */ +#define PATH_RTP_INCBIN "..//ma35-rtp//rtthread.bin" + +#define READ_BLOCK_SIZE 128 +#define REGION_ADDR_SRAM0 0x24000000 +#define REGION_ADDR_DDR (0x80020000|UNCACHEABLE) +#define REGION_MAXSIZE_SRAM0 (128*1024) +#define REGION_MAXSIZE_DDR (4*1024*1024-REGION_MAXSIZE_SRAM0) +#define REGION_MAXSIZE_LIMIT (REGION_MAXSIZE_SRAM0+REGION_MAXSIZE_DDR) + +#if !defined(PATH_RTP_FW_FILE) + #define PATH_RTP_FW_FILE "/mnt/sd1p0/rtp.bin" +#endif + +#if defined(RTP_USING_AT_STARTUP) + +#define STR2(x) #x +#define STR(x) STR2(x) + +#define INCBIN(name, file) \ + __asm__(".section .rodata\n" \ + ".global incbin_" STR(name) "_start\n" \ + ".balign 16\n" \ + "incbin_" STR(name) "_start:\n" \ + ".incbin \"" file "\"\n" \ + \ + ".global incbin_" STR(name) "_end\n" \ + ".balign 1\n" \ + "incbin_" STR(name) "_end:\n" \ + ".byte 0\n" \ + ); \ + extern const __attribute__((aligned(16))) void* incbin_ ## name ## _start; \ + extern const void* incbin_ ## name ## _end; \ + +INCBIN(rtp, PATH_RTP_INCBIN); + +static int nu_rtp_load_from_memory(void *pvBuf, int len) +{ + int remaining; + + if (!pvBuf || !len) + goto exit_nu_rtp_load_from_memory; + + /* Limit memory usage to 4MB. */ + if (len > REGION_MAXSIZE_LIMIT) + goto exit_nu_rtp_load_from_memory; + + remaining = len; + + /* Copy to SRAM0 */ + if (remaining > REGION_MAXSIZE_SRAM0) + { + rt_memcpy((void *)REGION_ADDR_SRAM0, pvBuf, REGION_MAXSIZE_SRAM0); + remaining -= REGION_MAXSIZE_SRAM0; + } + else + { + rt_memcpy((void *)REGION_ADDR_SRAM0, pvBuf, remaining); + remaining -= remaining; + } + + /* Copy to non-cacheable DDR memory if the size over 128KB. */ + if (remaining > 0) + { + rt_memcpy((void *)REGION_ADDR_DDR, (pvBuf + REGION_MAXSIZE_SRAM0), remaining); + remaining -= remaining; + } + + return 0; + +exit_nu_rtp_load_from_memory: + + return -1; +} +#endif + +RT_WEAK void nu_rtp_sspcc_setup(void) +{ + SSPCC_SET_REALM(SSPCC_UART16, SSPCC_SSET_SUBM); + + SSPCC_SET_GPIO_REALM(PK, 0, SSPCC_SSET_SUBM); + SSPCC_SET_GPIO_REALM(PK, 1, SSPCC_SSET_SUBM); + SSPCC_SET_GPIO_REALM(PK, 2, SSPCC_SSET_SUBM); + SSPCC_SET_GPIO_REALM(PK, 3, SSPCC_SSET_SUBM); +} + +static void nu_rtp_init(void) +{ + /* Enable WDT1/WDT2 reset */ + SYS->MISCRFCR |= SYS_MISCRFCR_WDT1RSTAEN_Msk | SYS_MISCRFCR_WDT2RSTAEN_Msk | SYS_MISCRFCR_WDT1RSTMEN_Msk; + + /* Enable M4 I/D cache */ + SYS->MISCFCR0 |= (SYS_MISCFCR0_RTPICACHEN_Msk | SYS_MISCFCR0_RTPDCACHEN_Msk | SYS_MISCFCR0_RTPDRMAEN_Msk); + + nu_rtp_sspcc_setup(); +} + +void nu_rtp_start(void) +{ + /* Enable RTP clock */ + CLK_EnableModuleClock(RTP_MODULE); + + /* Disable M4 Core reset*/ + SYS->IPRST0 &= ~SYS_IPRST0_CM4RST_Msk; +} +MSH_CMD_EXPORT(nu_rtp_start, start rtp); + +void nu_rtp_stop(void) +{ + /* Enable M4 Core reset*/ + SYS->IPRST0 |= SYS_IPRST0_CM4RST_Msk; + + /* Disable RTP clock */ + CLK_DisableModuleClock(RTP_MODULE); +} +MSH_CMD_EXPORT(nu_rtp_stop, stop rtp); + + +#if defined(RT_USING_DFS) +static int nu_rtp_load_from_file(char *szAbsFilePath) +{ + int fd, ret = -1; + char *buff_ptr = RT_NULL; + rt_size_t offset = 0; + + fd = open(szAbsFilePath, O_RDONLY); + if (fd < 0) + { + LOG_E("Could not open %s for rtp loading.", szAbsFilePath); + goto exit_nu_rtp_load_from_file; + } + + while (1) + { + int length; + + if (offset < REGION_MAXSIZE_SRAM0) + { + buff_ptr = (char *)(REGION_ADDR_SRAM0 + offset); + } + else + { + buff_ptr = (char *)(REGION_ADDR_DDR + offset - REGION_MAXSIZE_SRAM0); + } + + /* Limit memory usage to 4MB. */ + if ((offset + READ_BLOCK_SIZE) >= REGION_MAXSIZE_SRAM0) + goto exit_nu_rtp_load_from_file; + + length = read(fd, buff_ptr, READ_BLOCK_SIZE); + + if (length <= 0) break; + offset += length; + + //rt_kprintf("readed (%d/%d) to %08x\n", length, offset, buff_ptr); + } + + ret = 0; + +exit_nu_rtp_load_from_file: + + if (fd >= 0) + close(fd); + + return ret; +} + +int nu_rtp_load_run(int argc, char *argv[]) +{ + char *szFilePath = RT_NULL; + + if (argc == 1) + { + szFilePath = PATH_RTP_FW_FILE; + } + else if (argc == 2) + { + szFilePath = argv[1]; + } + + nu_rtp_stop(); + nu_rtp_init(); + + if (!szFilePath || nu_rtp_load_from_file(szFilePath) < 0) + return -1; + + rt_kprintf("Loaded %s, then run...\n", szFilePath); + + nu_rtp_start(); + + return 0; +} +MSH_CMD_EXPORT(nu_rtp_load_run, load rtp code then run); +#endif + +int rt_hw_rtp_init(void) +{ + int fw_size; + + fw_size = (int)((char *)&incbin_rtp_end - (char *)&incbin_rtp_start); + rt_kprintf("INCBIN RTP Start = %p\n", &incbin_rtp_start); + rt_kprintf("INCBIN RTP Size = %p\n", fw_size); + + /* Enable RTP and reset M4 reset */ + nu_rtp_init(); + +#if defined(RTP_USING_AT_STARTUP) + nu_rtp_stop(); + nu_rtp_load_from_memory(&incbin_rtp_start, fw_size); +#endif + + nu_rtp_start(); + + return 0; +} +INIT_BOARD_EXPORT(rt_hw_rtp_init); + +#endif //#if defined(USE_MA35D1_SUBM) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_scuart.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_scuart.c new file mode 100644 index 0000000000..a0541c360c --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_scuart.c @@ -0,0 +1,323 @@ +/**************************************************************************//** + * + * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-9-27 Wayne First version + * + ******************************************************************************/ + +#include + +#if defined(BSP_USING_SCUART) + +#include "NuMicro.h" +#include +#include +#include + +/* Private definition + * ---------------------------------------------------------------*/ +#define LOG_TAG "drv.scuart" +#define DBG_ENABLE +#define DBG_SECTION_NAME "drv.scuart" +#define DBG_LEVEL DBG_ERROR +#define DBG_COLOR +#include + +enum +{ + SCUART_START = -1, +#if defined(BSP_USING_SCUART0) + SCUART0_IDX, +#endif +#if defined(BSP_USING_SCUART1) + SCUART1_IDX, +#endif + SCUART_CNT +}; + +/* Private typedef + * --------------------------------------------------------------*/ +struct nu_scuart +{ + rt_serial_t dev; + char *name; + SC_T *base; + IRQn_Type irqn; + uint32_t rstidx; + uint32_t modid; +}; +typedef struct nu_scuart *nu_scuart_t; + +/* Private functions + * ------------------------------------------------------------*/ +static rt_err_t nu_scuart_configure(struct rt_serial_device *serial, + struct serial_configure *cfg); +static rt_err_t nu_scuart_control(struct rt_serial_device *serial, int cmd, + void *arg); +static int nu_scuart_send(struct rt_serial_device *serial, char c); +static int nu_scuart_receive(struct rt_serial_device *serial); +static void nu_scuart_isr(int vector, void *param); + +static const struct rt_uart_ops nu_scuart_ops = +{ + .configure = nu_scuart_configure, + .control = nu_scuart_control, + .putc = nu_scuart_send, + .getc = nu_scuart_receive, + .dma_transmit = RT_NULL /* not support DMA mode */ +}; + +static const struct serial_configure nu_scuart_default_config = + RT_SERIAL_CONFIG_DEFAULT; + +static struct nu_scuart nu_scuart_arr[] = +{ +#if defined(BSP_USING_SCUART0) + { + .name = "scuart0", .base = SC0, .irqn = SC0_IRQn, .rstidx = SC0_RST, .modid = SC0_MODULE, + }, +#endif +#if defined(BSP_USING_SCUART1) + { + .name = "scuart1", .base = SC1, .irqn = SC1_IRQn, .rstidx = SC1_RST, .modid = SC1_MODULE, + }, +#endif +}; /* scuart nu_scuart */ + +/** + * All SCUART interrupt service routine + */ +static void nu_scuart_isr(int vector, void *param) +{ + nu_scuart_t psNuSCUart = (nu_scuart_t)param; + + /* Handle RX event */ + if (SCUART_GET_INT_FLAG(psNuSCUart->base, SC_INTSTS_RXTOIF_Msk) || + SCUART_GET_INT_FLAG(psNuSCUart->base, SC_INTSTS_RDAIF_Msk)) + { + rt_hw_serial_isr(&psNuSCUart->dev, RT_SERIAL_EVENT_RX_IND); + + // RDA is the only interrupt enabled in this driver, this status bit + // automatically cleared after Rx FIFO empty. So no need to clear interrupt + // status here. + SCUART_CLR_INT_FLAG(psNuSCUart->base, SC_INTSTS_RXTOIF_Msk); + } +} + +/** + * Configure scuart port + */ +static rt_err_t nu_scuart_configure(struct rt_serial_device *serial, + struct serial_configure *cfg) +{ + rt_err_t ret = RT_EOK; + uint32_t scuart_word_len = 0; + uint32_t scuart_stop_bit = 0; + uint32_t scuart_parity = 0; + nu_scuart_t psNuSCUart = (nu_scuart_t)serial; + RT_ASSERT(psNuSCUart); + + /* Check baud rate */ + RT_ASSERT(cfg->baud_rate); + + /* Check word len */ + switch (cfg->data_bits) + { + case DATA_BITS_5: + scuart_word_len = SCUART_CHAR_LEN_5; + break; + + case DATA_BITS_6: + scuart_word_len = SCUART_CHAR_LEN_6; + break; + + case DATA_BITS_7: + scuart_word_len = SCUART_CHAR_LEN_7; + break; + + case DATA_BITS_8: + scuart_word_len = SCUART_CHAR_LEN_8; + break; + + default: + LOG_E("Unsupported data length"); + ret = RT_EINVAL; + goto exit_nu_scuart_configure; + } + + /* Check stop bit */ + switch (cfg->stop_bits) + { + case STOP_BITS_1: + scuart_stop_bit = SCUART_STOP_BIT_1; + break; + + case STOP_BITS_2: + scuart_stop_bit = SCUART_STOP_BIT_2; + break; + + default: + LOG_E("Unsupported stop bit"); + ret = RT_EINVAL; + goto exit_nu_scuart_configure; + } + + /* Check parity */ + switch (cfg->parity) + { + case PARITY_NONE: + scuart_parity = SCUART_PARITY_NONE; + break; + + case PARITY_ODD: + scuart_parity = SCUART_PARITY_ODD; + break; + + case PARITY_EVEN: + scuart_parity = SCUART_PARITY_EVEN; + break; + + default: + LOG_E("Unsupported parity"); + ret = RT_EINVAL; + goto exit_nu_scuart_configure; + } + + nu_sys_ip_reset(psNuSCUart->rstidx); + + /* Open SCUART and set SCUART baud rate */ + SCUART_Open(psNuSCUart->base, cfg->baud_rate); + + /* Set line configuration. */ + SCUART_SetLineConfig(psNuSCUart->base, 0, scuart_word_len, scuart_parity, + scuart_stop_bit); + + /* Enable interrupt. */ + rt_hw_interrupt_umask(psNuSCUart->irqn); + +exit_nu_scuart_configure: + + if (ret != RT_EOK) + SCUART_Close(psNuSCUart->base); + + return -(ret); +} + +/** + * SCUART interrupt control + */ +static rt_err_t nu_scuart_control(struct rt_serial_device *serial, int cmd, + void *arg) +{ + rt_err_t result = RT_EOK; + rt_uint32_t flag; + rt_ubase_t ctrl_arg = (rt_ubase_t)arg; + nu_scuart_t psNuSCUart = (nu_scuart_t)serial; + RT_ASSERT(psNuSCUart); + + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT: + + if (ctrl_arg == RT_DEVICE_FLAG_INT_RX) /* Disable INT-RX */ + { + flag = SC_INTEN_RDAIEN_Msk | SC_INTEN_RXTOIEN_Msk; + SCUART_DISABLE_INT(psNuSCUart->base, flag); + } + break; + + case RT_DEVICE_CTRL_SET_INT: + + if (ctrl_arg == RT_DEVICE_FLAG_INT_RX) /* Enable INT-RX */ + { + flag = SC_INTEN_RDAIEN_Msk | SC_INTEN_RXTOIEN_Msk; + SCUART_ENABLE_INT(psNuSCUart->base, flag); + } + break; + + case RT_DEVICE_CTRL_CLOSE: + + /* Disable interrupt. */ + rt_hw_interrupt_mask(psNuSCUart->irqn); + + /* Close SCUART port */ + SCUART_Close(psNuSCUart->base); + + break; + + default: + + result = -RT_EINVAL; + break; + } + return result; +} + +/** + * SCUART put char + */ +static int nu_scuart_send(struct rt_serial_device *serial, char c) +{ + nu_scuart_t psNuSCUart = (nu_scuart_t)serial; + RT_ASSERT(psNuSCUart); + + /* Waiting if TX-FIFO is full. */ + while (SCUART_IS_TX_FULL(psNuSCUart->base)) ; + + /* Put char into TX-FIFO */ + SCUART_WRITE(psNuSCUart->base, c); + + return 1; +} + +/** + * SCUART get char + */ +static int nu_scuart_receive(struct rt_serial_device *serial) +{ + nu_scuart_t psNuSCUart = (nu_scuart_t)serial; + RT_ASSERT(psNuSCUart); + + /* Return failure if RX-FIFO is empty. */ + if (SCUART_GET_RX_EMPTY(psNuSCUart->base)) + { + return -1; + } + + /* Get char from RX-FIFO */ + return SCUART_READ(psNuSCUart->base); +} + +/** + * Hardware SCUART Initialization + */ +static int rt_hw_scuart_init(void) +{ + int i; + rt_uint32_t flag; + rt_err_t ret = RT_EOK; + + for (i = (SCUART_START + 1); i < SCUART_CNT; i++) + { + flag = RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX; + + nu_scuart_arr[i].dev.ops = &nu_scuart_ops; + nu_scuart_arr[i].dev.config = nu_scuart_default_config; + + SYS_ResetModule(nu_scuart_arr[i].rstidx); + + rt_hw_interrupt_install(nu_scuart_arr[i].irqn, nu_scuart_isr, &nu_scuart_arr[i], nu_scuart_arr[i].name); + + ret = rt_hw_serial_register(&nu_scuart_arr[i].dev, nu_scuart_arr[i].name, flag, NULL); + RT_ASSERT(ret == RT_EOK); + } + + return (int)ret; +} +INIT_DEVICE_EXPORT(rt_hw_scuart_init); +#endif //#if defined(BSP_USING_SCUART) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_sdio.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sdio.c new file mode 100644 index 0000000000..503c591c87 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sdio.c @@ -0,0 +1,1061 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-11-19 Wayne First version +* +******************************************************************************/ + +#include "rtconfig.h" + +#if defined(BSP_USING_SDH) + +#include +#include +#include + +#include "NuMicro.h" +#include "drv_common.h" + +#define LOG_TAG "drv.sdio" +#undef DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_INFO +#define DBG_COLOR +#include + +#define SDH_ALIGN_LEN 64 +#define SDH_BUFF_SIZE (512*1024) + +enum +{ + SDH_START = -1, +#if defined(BSP_USING_SDH0) + SDH0_IDX, +#endif +#if defined(BSP_USING_SDH1) + SDH1_IDX, +#endif + SDH_CNT +}; + +struct nu_sdh +{ + struct rt_mmcsd_host *host; + char *name; + SDH_T *base; + IRQn_Type irqn; + uint32_t rstidx; + uint32_t modid; + uint8_t *cachebuf; + + struct rt_event event; +}; +typedef struct nu_sdh *nu_sdh_t; + +/* Private variables ------------------------------------------------------------*/ +#if defined(BSP_USING_SDH0) + ALIGN(SDH_ALIGN_LEN) + static uint8_t g_au8CacheBuf_SDH0[SDH_BUFF_SIZE]; +#endif + +#if defined(BSP_USING_SDH1) + ALIGN(SDH_ALIGN_LEN) + static uint8_t g_au8CacheBuf_SDH1[SDH_BUFF_SIZE]; +#endif + +static struct nu_sdh nu_sdh_arr [] = +{ +#if defined(BSP_USING_SDH0) + { + .name = "sdh0", + .base = SDH0, + .irqn = SDH0_IRQn, + .rstidx = SDH0_RST, + .modid = SDH0_MODULE, + .cachebuf = g_au8CacheBuf_SDH0, + }, +#endif +#if defined(BSP_USING_SDH1) + { + .name = "sdh1", + .base = SDH1, + .irqn = SDH1_IRQn, + .rstidx = SDH1_RST, + .modid = SDH1_MODULE, + .cachebuf = g_au8CacheBuf_SDH1, + }, +#endif +}; /* struct nu_sdh nu_sdh_arr [] */ + +static uint32_t nu_sdh_get_cmd_resptype(uint32_t rt_resp_type) +{ + uint32_t nu_resptype = 0; + switch (rt_resp_type) + { + case RESP_NONE: + nu_resptype = MMC_RSP_NONE; + break; + case RESP_R1: + nu_resptype = MMC_RSP_R1; + break; + case RESP_R1B: + nu_resptype = MMC_RSP_R1b; + break; + case RESP_R2: + nu_resptype = MMC_RSP_R2; + break; + case RESP_R3: + nu_resptype = MMC_RSP_R3; + break; + case RESP_R4: + nu_resptype = MMC_RSP_R4; + break; + case RESP_R6: + nu_resptype = MMC_RSP_R6; + break; + case RESP_R7: + nu_resptype = MMC_RSP_R7; + break; + case RESP_R5: + nu_resptype = MMC_RSP_R5; + break; + default: + nu_resptype = 0xffffffff; + } + return nu_resptype ; +} + +static void nu_sdh_send_commanddone(SDH_T *sdh, struct mmc_cmd *cmd) +{ + if (cmd->resp_type & MMC_RSP_136) + { + /* CRC is stripped so we need to do some shifting. */ + cmd->response[0] = (sdh->RESP67 << 8) | sdh->S_RESP45.B3; + cmd->response[1] = (sdh->RESP45 << 8) | sdh->S_RESP23.B3; + cmd->response[2] = (sdh->RESP23 << 8) | sdh->S_RESP01.B3; + cmd->response[3] = (sdh->RESP01 << 8); + } + else + { + cmd->response[0] = sdh->RESP01; + cmd->response[1] = cmd->response[2] = cmd->response[3] = 0; + } +} + +static int nu_sdh_xfer_data(SDH_T *sdh, struct mmc_data *data) +{ + uint32_t start_addr, timeout; + + if (data->flags & DATA_DIR_READ) + { + start_addr = (uint32_t)data->dest; + } + else + { + start_addr = (uint32_t)data->src; + } + + timeout = 1000000; + + while (!sdh->S_NORMAL_INT_STAT.XFER_COMPLETE) /* SDHCI_INT_DATA_END? */ + { + if (sdh->S_NORMAL_INT_STAT.ERR_INTERRUPT == 1) + return -1; + + if (sdh->S_NORMAL_INT_STAT.DMA_INTERRUPT) /* SDHCI_INT_DMA_END */ + { + sdh->S_NORMAL_INT_STAT.DMA_INTERRUPT = 1; /* Clear SDHCI_INT_DMA_END */ + + start_addr &= ~(SDH_BLOCK_SIZE * 1024 - 1); + start_addr += SDH_BLOCK_SIZE * 1024; + + sdh->SDMASA = start_addr; + } + if (timeout-- > 0) + rt_hw_us_delay(10); + else + return -2; + } + + return 0; +} + +static void nu_sdh_list_errors(SDH_T *sdh) +{ + if (sdh->S_NORMAL_INT_STAT.ERR_INTERRUPT) + { + LOG_D("Error List:"); + if (sdh->S_ERROR_INT_STAT.CMD_TOUT_ERR) + LOG_D("\tCMD_TOUT_ERR."); + if (sdh->S_ERROR_INT_STAT.CMD_CRC_ERR) + LOG_D("\tCMD_CRC_ERR."); + if (sdh->S_ERROR_INT_STAT.CMD_END_BIT_ERR) + LOG_D("\tCMD_END_BIT_ERR."); + if (sdh->S_ERROR_INT_STAT.CMD_IDX_ERR) + LOG_D("\tCMD_IDX_ERR."); + if (sdh->S_ERROR_INT_STAT.DATA_TOUT_ERR) + LOG_D("\tDATA_TOUT_ERR."); + if (sdh->S_ERROR_INT_STAT.DATA_CRC_ERR) + LOG_D("\tDATA_CRC_ERR."); + if (sdh->S_ERROR_INT_STAT.DATA_END_BIT_ERR) + LOG_D("\tDATA_END_BIT_ERR."); + if (sdh->S_ERROR_INT_STAT.CUR_LMT_ERR) + LOG_D("\tCUR_LMT_ERR."); + + if (sdh->S_ERROR_INT_STAT.AUTO_CMD_ERR) + LOG_D("\tAUTO_CMD_ERR."); + if (sdh->S_ERROR_INT_STAT.ADMA_ERR) + LOG_D("\tADMA_ERR."); + if (sdh->S_ERROR_INT_STAT.TUNING_ERR) + LOG_D("\tTUNING_ERR."); + if (sdh->S_ERROR_INT_STAT.RESP_ERR) + LOG_D("\tRESP_ERR."); + if (sdh->S_ERROR_INT_STAT.BOOT_ACK_ERR) + LOG_D("\tBOOT_ACK_ERR."); + if (sdh->S_ERROR_INT_STAT.VENDOR_ERR1) + LOG_D("\tVENDOR_ERR1."); + if (sdh->S_ERROR_INT_STAT.VENDOR_ERR2) + LOG_D("\tVENDOR_ERR2."); + if (sdh->S_ERROR_INT_STAT.VENDOR_ERR3) + LOG_D("\tVENDOR_ERR3."); + } +} + +/** + * @brief This function send command. + * @param sdio rthw_sdio + * @param pkg sdio package + * @retval None + */ +static int nu_sdh_send_command(SDH_T *sdh, struct mmc_cmd *cmd, struct mmc_data *data) +{ + int ret; + uint32_t mask, flags, mode; + volatile unsigned int time = 0; + volatile unsigned int cmd_timeout, stat; + + LOG_D("[CMD:%d ARG:0x%08x] RESP_TYPE:0x%08x rw:%c addr:0x%08x len:%d blksize:%d", + cmd->cmdidx, + cmd->cmdarg, + cmd->resp_type, + data ? (data->flags & DATA_DIR_WRITE ? 'w' : 'r') : '-', + data ? data->src : 0, + data ? data->blocks * data->blocksize : 0, + data ? data->blocksize : 0); + + mask = 0x3; /* SDH_CMD_INHIBIT | SDH_DATA_INHIBIT */ + if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION) + mask &= ~0x2; /* SDH_DATA_INHIBIT */ + + ret = SD_GetBusStatus(sdh, mask); + if (ret) + { + LOG_E("ERROR: Busy %d\n", ret); + ret = __LINE__; + goto exit_nu_sdh_send_command; + } + + /* SDHCI_INT_ALL_MASK */ + sdh->NORMAL_INT_STAT = 0xFFFF; + sdh->ERROR_INT_STAT = 0xFFFF; + + mask = 0x1; /* SDHCI_INT_RESPONSE */ + + if (!(cmd->resp_type & MMC_RSP_PRESENT)) + flags = SDH_CMD_RESP_NONE; + else if (cmd->resp_type & MMC_RSP_136) + flags = SDH_CMD_RESP_LONG; + else if (cmd->resp_type & MMC_RSP_BUSY) + { + flags = SDH_CMD_RESP_SHORT_BUSY; + if (data) + mask |= 0x2; /* SDHCI_INT_DATA_END */ + } + else + flags = SDH_CMD_RESP_SHORT; + + if (cmd->resp_type & MMC_RSP_CRC) + flags |= SDH_CMD_CRC; + + if (cmd->resp_type & MMC_RSP_OPCODE) + flags |= SDH_CMD_INDEX; + + /* Set Transfer mode regarding to data flag */ + if (data) + { + flags |= SDH_CMD_DATA; + + sdh->S_TOUT_CTRL.TOUT_CNT = 0xE; + + mode = 0x2; /* SDHCI_TRNS_BLK_CNT_EN */ + if (data->blocks > 1) + mode |= 0x20; /* SDHCI_TRNS_MULTI */ + + if (data->flags & DATA_DIR_READ) + { + mode |= 0x10; /* SDHCI_TRNS_READ */ + sdh->SDMASA = (uint32_t)data->dest; + } + else + { + sdh->SDMASA = (uint32_t)data->src; + } + + mode |= 0x1; + sdh->S_HOST_CTRL1.DMA_SEL = 0; //SDMA is selected + + /* 512 Kbytes SDMA Buffer Boundary */ + sdh->S_BLOCKSIZE.SDMA_BUF_BDARY = 0x7; + + /* Set Block Size */ + sdh->S_BLOCKSIZE.XFER_BLOCK_SIZE = data->blocksize; + + /* Set Block count */ + sdh->S_BLOCKCOUNT.BLOCK_CNT = data->blocks; + + /* Set transfer mode */ + sdh->XFER_MODE = mode; + } + else if (cmd->resp_type & MMC_RSP_BUSY) + { + sdh->S_TOUT_CTRL.TOUT_CNT = 0xE; + } + + sdh->ARGUMENT = cmd->cmdarg; + sdh->CMD = ((cmd->cmdidx & 0xff) << 8) | (flags & 0xff); + + cmd_timeout = 10000000; + time = 0; + do + { + stat = sdh->NORMAL_INT_STAT; + if (stat & 0x8000) /* SDHCI_INT_ERROR */ + break; + + if (time > cmd_timeout) + { + ret = __LINE__; + LOG_E("[%s %d] timeout stat=%04x, mask=%04x", __func__, __LINE__, stat, mask); + goto exit_nu_sdh_send_command; + } + time++; + } + while ((stat & mask) != mask); + + if ((stat & (0x8000 | mask)) == mask) + { + //LOG_D("[%s %d] Done. cmdid=%d restore", __func__, __LINE__, cmd->cmdidx); + + nu_sdh_send_commanddone(sdh, cmd); + nu_sdh_list_errors(sdh); + + /* Send data */ + if (data) + { + ret = nu_sdh_xfer_data(sdh, data); + } + stat = sdh->ERROR_INT_STAT; + + sdh->NORMAL_INT_STAT = mask; + ret = 0; + } + else + { + //LOG_E("[%s %d] Error. cmdid=%d not restored %08x %08x", __func__, __LINE__, cmd->cmdidx, stat, mask); + ret = __LINE__; + + nu_sdh_list_errors(sdh); + goto exit_nu_sdh_send_command; + } + + /* SDHCI_INT_ALL_MASK */ + sdh->NORMAL_INT_STAT = 0xFFFF; + sdh->ERROR_INT_STAT = 0xFFFF; + + if (ret) + { + LOG_E("[%s %d] ret=%d cmd->cmdidx=%d, error=0x%x", __func__, __LINE__, ret, cmd->cmdidx, stat); + ret = __LINE__; + goto exit_nu_sdh_send_command; + } + + return 0; + +exit_nu_sdh_send_command: + + SDH_Reset(sdh, SDH_RESET_CMD); + SDH_Reset(sdh, SDH_RESET_DATA); + + //LOG_E("[%s %d] cmdid=%d error line=%d", __func__, __LINE__, cmd->cmdidx, ret); + + return ret; +} + + +/** + * @brief This function send sdio request. + * @param host rt_mmcsd_host + * @param req request + * @retval None + */ +static void nu_sdh_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req) +{ + nu_sdh_t sdh = (nu_sdh_t)host->private_data; + + RT_ASSERT(host); + RT_ASSERT(req); + + if (host->card) + { + if (host->card->card_type == CARD_TYPE_MMC) + { + sdh->base->S_EMMC_CTRL.CARD_IS_EMMC = 1; + sdh->base->S_EMMC_CTRL.DISABLE_DATA_CRC_CHK = 1; + } + else + { + sdh->base->S_EMMC_CTRL.CARD_IS_EMMC = 0; + sdh->base->S_EMMC_CTRL.DISABLE_DATA_CRC_CHK = 0; + } + } + + if (req->cmd != RT_NULL) + { + struct mmc_cmd cmd; + + LOG_D("[%s%s%s%s%s]REQ: CMD:%d ARG:0x%08x RESP_TYPE:0x%08x, 0x%08x", + (host->card == RT_NULL) ? "Unknown" : "", + (host->card) && (host->card->card_type == CARD_TYPE_MMC) ? "MMC" : "", + (host->card) && (host->card->card_type == CARD_TYPE_SD) ? "SD" : "", + (host->card) && (host->card->card_type == CARD_TYPE_SDIO) ? "SDIO" : "", + (host->card) && (host->card->card_type == CARD_TYPE_SDIO_COMBO) ? "SDIO_COMBO" : "", + req->cmd->cmd_code, + req->cmd->arg, + resp_type(req->cmd), + nu_sdh_get_cmd_resptype(resp_type(req->cmd))); + + rt_memset(&cmd, 0, sizeof(struct mmc_cmd)); + + cmd.cmdidx = req->cmd->cmd_code; + cmd.cmdarg = req->cmd->arg; + cmd.resp_type = nu_sdh_get_cmd_resptype(resp_type(req->cmd)); + + if (req->data != RT_NULL) + { + struct mmc_data data; + rt_uint32_t size; + rt_int32_t IsNonaligned = 0; + + + LOG_D("[%s]REQ: BUF:%08x FLAGS:0x%08x BLKSIZE:%d, BLKCOUNT:%d", + sdh->name, + req->data->buf, + req->data->flags, + req->data->blksize, + req->data->blks); + + rt_memset(&data, 0, sizeof(struct mmc_data)); + + data.dest = (char *)req->data->buf; + data.flags = req->data->flags; + data.blocksize = req->data->blksize; + data.blocks = req->data->blks; + + size = data.blocksize * data.blocks; + + RT_ASSERT(size <= SDH_BUFF_SIZE); + + IsNonaligned = (((rt_uint32_t)data.dest & (SDH_ALIGN_LEN - 1)) > 0) ? 1 : 0; + if (IsNonaligned) + { + data.dest = (char *)sdh->cachebuf; + if (data.flags & DATA_DIR_WRITE) + { + LOG_D("Un-aligned, prepare into cache buf(%d)", size); + rt_memcpy(data.dest, req->data->buf, size); + } + } + + rt_hw_cpu_dcache_clean_inv((void *)data.dest, size); + req->cmd->err = nu_sdh_send_command(sdh->base, &cmd, &data); + rt_hw_cpu_dcache_invalidate((void *)data.dest, size); + + if (!req->cmd->err && IsNonaligned) + { + if (data.flags & DATA_DIR_READ) + { + LOG_D("Un-aligned, restore from cache buf(%d)", size); + rt_memcpy(req->data->buf, data.dest, size); + } + } + LOG_HEX("data.dest", 16, (void *)data.dest, size); + + } + else + { + req->cmd->err = nu_sdh_send_command(sdh->base, &cmd, NULL); + } + + /* Report response words */ + req->cmd->resp[3] = cmd.response[3]; + req->cmd->resp[2] = cmd.response[2]; + req->cmd->resp[1] = cmd.response[1]; + req->cmd->resp[0] = cmd.response[0]; + + LOG_HEX("req->cmd->resp", 16, (void *)&req->cmd->resp[0], 16); + + } + + if (req->stop != RT_NULL) + { + struct mmc_cmd stop; + rt_memset(&stop, 0, sizeof(struct mmc_cmd)); + + stop.cmdidx = req->stop->cmd_code; + stop.cmdarg = req->stop->arg; + stop.resp_type = nu_sdh_get_cmd_resptype(resp_type(req->stop)); + + req->stop->err = nu_sdh_send_command(sdh->base, &stop, NULL); + + /* Report response words */ + req->stop->resp[3] = stop.response[3]; + req->stop->resp[2] = stop.response[2]; + req->stop->resp[1] = stop.response[1]; + req->stop->resp[0] = stop.response[0]; + + LOG_HEX("req->stop->resp", 16, (void *)&req->stop->resp[0], 16); + + } + + mmcsd_req_complete(host); +} + +/** + * @brief This function config sdio. + * @param host rt_mmcsd_host + * @param io_cfg rt_mmcsd_io_cfg + * @retval None + */ +static void nu_sdh_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg) +{ + nu_sdh_t NuSdh; + rt_uint32_t clk = io_cfg->clock; + SDH_T *sdh; + + RT_ASSERT(host); + RT_ASSERT(io_cfg); + + NuSdh = (nu_sdh_t)host->private_data; + sdh = NuSdh->base; + + LOG_D("[%s]clk:%d width:%s%s%s power:%s%s%s", + NuSdh->name, + clk, + io_cfg->bus_width == MMCSD_BUS_WIDTH_8 ? "8" : "", + io_cfg->bus_width == MMCSD_BUS_WIDTH_4 ? "4" : "", + io_cfg->bus_width == MMCSD_BUS_WIDTH_1 ? "1" : "", + io_cfg->power_mode == MMCSD_POWER_OFF ? "OFF" : "", + io_cfg->power_mode == MMCSD_POWER_UP ? "UP" : "", + io_cfg->power_mode == MMCSD_POWER_ON ? "ON" : ""); + + /* Bus width */ + switch (io_cfg->bus_width) + { + case MMCSD_BUS_WIDTH_1: + case MMCSD_BUS_WIDTH_4: + case MMCSD_BUS_WIDTH_8: + SDH_SetBusWidth(sdh, 1 << io_cfg->bus_width); + break; + default: + break; + } + + /* Power */ + switch (io_cfg->power_mode) + { + case MMCSD_POWER_UP: + case MMCSD_POWER_ON: + SDH_SetPower(sdh, 1); + break; + + case MMCSD_POWER_OFF: + SDH_SetPower(sdh, 0); + break; + default: + break; + } + + /* Clock */ + if (clk > host->freq_max) + clk = host->freq_max; + + if (clk < host->freq_min) + clk = host->freq_min; + + if (clk) + { + uint32_t u32SrcFreqInHz = 0, u32ModRealFreqInHz; + uint32_t u32ModSrcIdx = CLK_GetModuleClockSource(NuSdh->modid); + + switch (u32ModSrcIdx) + { + case 0: // From SYSPLL + u32SrcFreqInHz = CLK_GetPLLClockFreq(SYSPLL); + break; + default: // From APLL + u32SrcFreqInHz = CLK_GetPLLClockFreq(APLL); + break; + } + + u32ModRealFreqInHz = SDH_SetClock(sdh, u32SrcFreqInHz, clk); + u32ModRealFreqInHz = u32ModRealFreqInHz; //Avoid warning + + LOG_D("[%s] SrcClock: %d kHz, ExceptedFreq: %d kHz, RealFreq: %d kHz", NuSdh->name, u32SrcFreqInHz / 1000, clk / 1000, u32ModRealFreqInHz / 1000); + } + +} + +/** + * @brief This function detect sdcard. + * @param host rt_mmcsd_host + * @retval 0x01 + */ +static rt_int32_t nu_sdh_card_detect(struct rt_mmcsd_host *host) +{ + LOG_D("try to detect device"); + return 0x01; +} + +/** + * @brief This function interrupt process function. + * @param host rt_mmcsd_host + * @retval None + */ +static void nu_sdh_isr(int vector, void *param) +{ + nu_sdh_t sdh = (nu_sdh_t)param; + struct rt_mmcsd_host *host = sdh->host; + SDH_T *base = sdh->base; + volatile unsigned int isr = base->NORMAL_INT_STAT; + + /* We just catch card detection here. */ + if (isr & 0xc0) + { + /* ready to change */ + mmcsd_change(host); + base->NORMAL_INT_STAT = 0xC0; + } +} + +/** + * @brief This function update sdh interrupt. + * @param host rt_mmcsd_host + * @param enable + * @retval None + */ +void nu_sdh_irq_update(struct rt_mmcsd_host *host, rt_int32_t enable) +{ + nu_sdh_t sdh = (nu_sdh_t)host->private_data; + SDH_T *sdh_base = sdh->base; + + if (enable) + { + LOG_D("Enable %s irq", sdh->name); + + /* Enable only interrupts served by the SD controller */ + /* sdh_base->NORMAL_INT_STAT_EN = 0x00FB; */ + sdh_base->S_NORMAL_INT_STAT_EN.CMD_COMPLETE_STAT_EN = 1; + sdh_base->S_NORMAL_INT_STAT_EN.XFER_COMPLETE_STAT_EN = 1; + sdh_base->S_NORMAL_INT_STAT_EN.DMA_INTERRUPT_STAT_EN = 1; + + sdh_base->S_NORMAL_INT_STAT_EN.BUF_WR_READY_STAT_EN = 1; + sdh_base->S_NORMAL_INT_STAT_EN.BUF_RD_READY_STAT_EN = 1; + sdh_base->S_NORMAL_INT_STAT_EN.CARD_INSERTION_STAT_EN = 1; + sdh_base->S_NORMAL_INT_STAT_EN.CARD_REMOVAL_STAT_EN = 1; + + /* sdh_base->ERROR_INT_STAT_EN = 0x0271; */ + sdh_base->S_ERROR_INT_STAT_EN.CMD_TOUT_ERR_STAT_EN = 1; + sdh_base->S_ERROR_INT_STAT_EN.DATA_TOUT_ERR_STAT_EN = 1; + sdh_base->S_ERROR_INT_STAT_EN.DATA_CRC_ERR_STAT_EN = 1; + sdh_base->S_ERROR_INT_STAT_EN.DATA_END_BIT_ERR_STAT_EN = 1; + sdh_base->S_ERROR_INT_STAT_EN.ADMA_ERR_STAT_EN = 1; + + /* Mask all interrupt sources */ + /* sdh_base->NORMAL_INT_SIGNAL_EN = 0xC0; */ + sdh_base->S_NORMAL_INT_SIGNAL_EN.CARD_INSERTION_SIGNAL_EN = 1; + sdh_base->S_NORMAL_INT_SIGNAL_EN.CARD_REMOVAL_SIGNAL_EN = 1; + + sdh_base->ERROR_INT_SIGNAL_EN = 0; + + //sdh_base->NORMAL_INT_STAT_EN = 0x7FFF; + //sdh_base->ERROR_INT_STAT_EN = 0xFFFF; + //sdh_base->NORMAL_INT_SIGNAL_EN=0x7FFF; + //sdh_base->ERROR_INT_SIGNAL_EN=0xFFFF; + } + else + { + LOG_D("Disable %s irq", sdh->name); + + sdh_base->NORMAL_INT_STAT_EN = 0x0; + sdh_base->ERROR_INT_STAT_EN = 0x0; + sdh_base->NORMAL_INT_SIGNAL_EN = 0x0; + sdh_base->ERROR_INT_SIGNAL_EN = 0x0; + } +} + +static const struct rt_mmcsd_host_ops ops = +{ + nu_sdh_request, + nu_sdh_iocfg, + nu_sdh_card_detect, + nu_sdh_irq_update, +}; + +/** + * @brief This function create mmcsd host. + * @param sdh nu_sdh_t + * @retval nuvton + */ +void nu_sdh_host_initial(nu_sdh_t sdh) +{ + struct rt_mmcsd_host *host; + rt_err_t ret = RT_EOK; + + host = mmcsd_alloc_host(); + RT_ASSERT(host != RT_NULL); + + ret = rt_event_init(&sdh->event, "sdh_event", RT_IPC_FLAG_FIFO); + RT_ASSERT(ret == RT_EOK); + + /* Reset sdh at first. */ + SDH_Reset(sdh->base, SDH_RESET_ALL); + + /* set host default attributes */ + host->ops = &ops; + host->freq_min = 200 * 1000; + host->freq_max = 50 * 1000 * 1000; + host->valid_ocr = VDD_30_31 | VDD_31_32 | VDD_32_33 | VDD_33_34; // | VDD_165_195; + + host->flags = MMCSD_BUSWIDTH_4 | MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ | MMCSD_SUP_HIGHSPEED; + + host->max_seg_size = SDH_BUFF_SIZE; + host->max_dma_segs = 1; + host->max_blk_size = SDH_BLOCK_SIZE; + host->max_blk_count = (SDH_BUFF_SIZE / SDH_BLOCK_SIZE); + + /* link up host and sdio */ + host->private_data = sdh; + sdh->host = host; + + /* Set initial state: high speed */ + sdh->base->S_HOST_CTRL1.HIGH_SPEED_EN = 1; + + /* Set SDR50 mode */ + sdh->base->S_HOST_CTRL2.UHS_MODE_SEL = 2; + + /* Install ISR. */ + rt_hw_interrupt_install(sdh->irqn, nu_sdh_isr, (void *)sdh, sdh->name); + rt_hw_interrupt_umask(sdh->irqn); + + /* Enable interrupt. */ + nu_sdh_irq_update(host, 1); + + /* ready to change */ + mmcsd_change(host); +} + +void nu_sd_attach(void) +{ + int i; + /* ready to change */ + for (i = (SDH_START + 1); i < SDH_CNT; i++) + { + if (nu_sdh_arr[i].host) + mmcsd_change(nu_sdh_arr[i].host); + } +} +MSH_CMD_EXPORT(nu_sd_attach, attach card); + +void nu_sd_regdump(void) +{ + int i; + /* ready to change */ + for (i = (SDH_START + 1); i < SDH_CNT; i++) + { + if (nu_sdh_arr[i].host) + SDH_DumpReg(nu_sdh_arr[i].base); + } +} +MSH_CMD_EXPORT(nu_sd_regdump, dump sdh registers); + +static int rt_hw_sdh_init(void) +{ + int i; + + for (i = (SDH_START + 1); i < SDH_CNT; i++) + { + CLK_EnableModuleClock(nu_sdh_arr[i].modid); + SYS_ResetModule(nu_sdh_arr[i].rstidx); + + nu_sdh_host_initial(&nu_sdh_arr[i]); + } + + return 0; +} +INIT_DEVICE_EXPORT(rt_hw_sdh_init); + +/* A simple MBR writer. */ +struct mbr +{ + uint8_t code[440]; + union + { + uint32_t disk_signature; + struct + { + uint32_t disk_signature_B0: 8; + uint32_t disk_signature_B1: 8; + uint32_t disk_signature_B2: 8; + uint32_t disk_signature_B3: 8; + } s_disk_signature; + }; + uint16_t unused; + struct mbr_partition + { + uint8_t status; + + uint8_t first_cylinder; + uint8_t first_head; + uint8_t first_sector; + + uint8_t partition_type; + + uint8_t last_cylinder; + uint8_t last_head; + uint8_t last_sector; + + union + { + uint32_t first_sector_lba; + struct + { + uint32_t first_sector_lba_B0: 8; + uint32_t first_sector_lba_B1: 8; + uint32_t first_sector_lba_B2: 8; + uint32_t first_sector_lba_B3: 8; + } s_first_sector_lba; + }; + + union + { + uint32_t sectors ; + struct + { + uint32_t sectors_B0: 8; + uint32_t sectors_B1: 8; + uint32_t sectors_B2: 8; + uint32_t sectors_B3: 8; + } s_sectors; + }; + + } partition[4]; + + uint16_t mbr_signature; + +} __attribute__((packed)); + +#define MBR_SIGNATURE 0xAA55 +#define MBR_STATUS_BOOTABLE 0x80 + +#define le2(a, o) ((a)[o] << 0 | (a)[(o)+1] << 8) +#define le4(a, o) (le2(a,o) | (a)[(o)+2] << 16 | (a)[(o)+3] << 24) + +static int nu_sd_mbr_read(const char *devname) +{ + rt_device_t mmc_device = RT_NULL; + rt_err_t ret; + struct rt_device_blk_geometry geo = {0}; + struct mbr *psMbr = RT_NULL; + + if ((mmc_device = rt_device_find(devname)) == RT_NULL) + { + LOG_E("find device %s failed!\n", devname); + goto fail_nu_sd_mbr_read; + } + + if (rt_device_open(mmc_device, RT_DEVICE_OFLAG_RDWR) != RT_EOK) + { + LOG_E("open device %s failed!\n", devname); + mmc_device = RT_NULL; + goto fail_nu_sd_mbr_read; + } + + if (rt_device_control(mmc_device, RT_DEVICE_CTRL_BLK_GETGEOME, &geo) != RT_EOK) + { + LOG_E("control device %s failed!\n", devname); + goto fail_nu_sd_mbr_read; + } + + LOG_I("device information:\n"); + LOG_I("sector size : %d byte\n", geo.bytes_per_sector); + LOG_I("sector count : %d \n", geo.sector_count); + LOG_I("block size : %d byte\n", geo.block_size); + LOG_I("MBR size : %d byte\n", sizeof(struct mbr)); + + psMbr = rt_malloc(sizeof(struct mbr)); + if (psMbr == RT_NULL) + { + LOG_E("no memory for mbr buffer!\n"); + goto fail_nu_sd_mbr_read; + } + rt_memset(psMbr, 0, sizeof(struct mbr)); + + ret = rt_device_read(mmc_device, 0, psMbr, 1); + if (ret != 1) + { + LOG_E("read device %s %d failed!\n", devname, ret); + goto fail_nu_sd_mbr_read; + } + + LOG_I("disk_signature = %08x\n", psMbr->disk_signature); + LOG_I("unused = %02x\n", psMbr->unused); + for (int i = 0; i < 4; i++) + { + LOG_I("[%d] status = %02x\n", i, psMbr->partition[i].status); + LOG_I("[%d] first_cylinder = %d\n", i, psMbr->partition[i].first_cylinder); + LOG_I("[%d] first_head = %d\n", i, psMbr->partition[i].first_head); + LOG_I("[%d] first_sector = %d\n", i, psMbr->partition[i].first_sector); + LOG_I("[%d] partition_type = %02x\n", i, psMbr->partition[i].partition_type); + LOG_I("[%d] last_cylinder = %d\n", i, psMbr->partition[i].last_cylinder); + LOG_I("[%d] last_head = %d\n", i, psMbr->partition[i].last_head); + LOG_I("[%d] last_sector = %d\n", i, psMbr->partition[i].last_sector); + LOG_I("[%d] first_sector_lba = %u\n", i, psMbr->partition[i].first_sector_lba); + LOG_I("[%d] sectors = %u\n", i, psMbr->partition[i].sectors); + } + + LOG_I("signature = %02x\n", psMbr->mbr_signature); + + rt_free(psMbr); + + rt_device_close(mmc_device); + + return 0; + +fail_nu_sd_mbr_read: + + if (psMbr != RT_NULL) + rt_free(psMbr); + + if (mmc_device != RT_NULL) + rt_device_close(mmc_device); + + return -1; +} + + +int nu_sd_mbr_dump(int argc, char *argv[]) +{ +// argc=1: string, mmcblk device name. + if (argc != 2) + return -1; + return nu_sd_mbr_read(argv[1]); +} +MSH_CMD_EXPORT(nu_sd_mbr_dump, dump sd card device); + +static int nu_sd_mbr_write(const char *devname, int32_t u32Sectors) +{ + rt_device_t mmc_device = RT_NULL; + rt_err_t ret; + struct rt_device_blk_geometry geo; + struct mbr *psMbr = RT_NULL; + + if ((mmc_device = rt_device_find(devname)) == RT_NULL) + { + LOG_E("find device %s failed!\n", devname); + goto fail_nu_sd_mbr_write; + } + + if (rt_device_open(mmc_device, RT_DEVICE_OFLAG_RDWR) != RT_EOK) + { + mmc_device = RT_NULL; + LOG_E("open device %s failed!\n", devname); + goto fail_nu_sd_mbr_write; + } + + rt_memset(&geo, 0, sizeof(geo)); + ret = rt_device_control(mmc_device, RT_DEVICE_CTRL_BLK_GETGEOME, &geo); + if (ret != RT_EOK) + { + LOG_E("control device %s failed!\n", devname); + goto fail_nu_sd_mbr_write; + } + LOG_I("device information:\n"); + LOG_I("sector size : %d byte\n", geo.bytes_per_sector); + LOG_I("sector count : %d \n", geo.sector_count); + LOG_I("block size : %d byte\n", geo.block_size); + + if (u32Sectors >= geo.sector_count) + { + LOG_E("no enough sectors for reserved. %s failed!\n", devname); + goto fail_nu_sd_mbr_write; + } + + psMbr = rt_malloc(sizeof(struct mbr)); + if (psMbr == RT_NULL) + { + LOG_E("no memory for mbr buffer!\n"); + goto fail_nu_sd_mbr_write; + } + rt_memset(psMbr, 0, sizeof(struct mbr)); + + psMbr->disk_signature = 0xa8e7d068; + psMbr->mbr_signature = MBR_SIGNATURE; + + psMbr->partition[0].status = 0; + + //psMbr->partition[0].first_cylinder = 0x00; + //psMbr->partition[0].first_head = 0x21; + //psMbr->partition[0].first_sector = 0x21; + psMbr->partition[0].partition_type = 0x0C; + //psMbr->partition[0].last_head = 0xFE; + //psMbr->partition[0].last_sector = 0x3F; + //psMbr->partition[0].last_cylinder = 0xFF; + psMbr->partition[0].first_sector_lba = u32Sectors; + psMbr->partition[0].sectors = geo.sector_count - u32Sectors; + + ret = rt_device_write(mmc_device, 0, psMbr, 1); + if (ret != 1) + { + LOG_E("write device %s %d failed!\n", devname, ret); + goto fail_nu_sd_mbr_write; + } + +fail_nu_sd_mbr_write: + + if (psMbr != RT_NULL) + rt_free(psMbr); + + if (mmc_device) + rt_device_close(mmc_device); + + return -1; +} + +int nu_sd_mbr_layout(int argc, char *argv[]) +{ +// argc=1: string, mmcblk device name. +// argc=2: Reserved sectors for bootable code and remains sectors are for elm mounting. + + if (argc != 3) + return -1; + + return nu_sd_mbr_write((const char *)argv[1], atoi(argv[2])); +} +MSH_CMD_EXPORT(nu_sd_mbr_layout, layout sd device); + +#endif diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_softi2c.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_softi2c.c new file mode 100644 index 0000000000..69462bfa39 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_softi2c.c @@ -0,0 +1,232 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-9-6 Wayne First version +* +******************************************************************************/ + +#include + +#if (defined(BSP_USING_SOFT_I2C) && defined(RT_USING_I2C_BITOPS) && defined(RT_USING_I2C) && defined(RT_USING_PIN)) + +#include +#include +#include +#include "NuMicro.h" + +/* Private define ---------------------------------------------------------------*/ +#define LOG_TAG "drv.softi2c" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL DBG_INFO +#include + +#ifdef BSP_USING_SOFT_I2C0 +#define NU_SOFT_I2C0_BUS_CONFIG \ + { \ + .scl = BSP_SOFT_I2C0_SCL_PIN, \ + .sda = BSP_SOFT_I2C0_SDA_PIN, \ + .bus_name = "softi2c0", \ + } +#endif + +#ifdef BSP_USING_SOFT_I2C1 +#define NU_SOFT_I2C1_BUS_CONFIG \ + { \ + .scl = BSP_SOFT_I2C1_SCL_PIN, \ + .sda = BSP_SOFT_I2C1_SDA_PIN, \ + .bus_name = "softi2c1", \ + } +#endif + +#if (!defined(BSP_USING_SOFT_I2C0) && !defined(BSP_USING_SOFT_I2C1)) + #error "Please define at least one BSP_USING_SOFT_I2Cx" + /* this driver can be disabled at menuconfig ? RT-Thread Components ? Device Drivers */ +#endif + +/* Private typedef --------------------------------------------------------------*/ +/* soft i2c config class */ +struct nu_soft_i2c_config +{ + rt_uint8_t scl; + rt_uint8_t sda; + const char *bus_name; +}; +/* soft i2c driver class */ +struct nu_soft_i2c +{ + struct rt_i2c_bit_ops ops; + struct rt_i2c_bus_device soft_i2c_bus; +}; + +/* Private functions ------------------------------------------------------------*/ +static void nu_soft_i2c_udelay(rt_uint32_t us); +static void nu_soft_i2c_set_sda(void *data, rt_int32_t state); +static void nu_soft_i2c_set_scl(void *data, rt_int32_t state); +static rt_int32_t nu_soft_i2c_get_sda(void *data); +static rt_int32_t nu_soft_i2c_get_scl(void *data); + +/* Private variables ------------------------------------------------------------*/ +static const struct nu_soft_i2c_config nu_soft_i2c_cfg[] = +{ +#ifdef BSP_USING_SOFT_I2C0 + NU_SOFT_I2C0_BUS_CONFIG, +#endif +#ifdef BSP_USING_SOFT_I2C1 + NU_SOFT_I2C1_BUS_CONFIG, +#endif +}; + +static struct nu_soft_i2c nu_soft_i2c_obj[sizeof(nu_soft_i2c_cfg) / sizeof(nu_soft_i2c_cfg[0])]; + +static const struct rt_i2c_bit_ops nu_soft_i2c_bit_ops = +{ + .data = RT_NULL, + .set_sda = nu_soft_i2c_set_sda, + .set_scl = nu_soft_i2c_set_scl, + .get_sda = nu_soft_i2c_get_sda, + .get_scl = nu_soft_i2c_get_scl, + .udelay = nu_soft_i2c_udelay, + .delay_us = 1, + .timeout = 100 +}; + +/* Functions define ------------------------------------------------------------*/ + +/** + * The time delay function. + * + * @param microseconds. + */ +static void nu_soft_i2c_udelay(rt_uint32_t us) +{ + rt_hw_us_delay(us); +} + +/** + * This function initializes the soft i2c pin. + * + * @param soft i2c config class. + */ +static void nu_soft_i2c_gpio_init(const struct nu_soft_i2c_config *cfg) +{ + rt_pin_mode(cfg->scl, PIN_MODE_OUTPUT_OD); + rt_pin_mode(cfg->sda, PIN_MODE_OUTPUT_OD); + + rt_pin_write(cfg->scl, PIN_HIGH); + rt_pin_write(cfg->sda, PIN_HIGH); +} + +/** + * if i2c is locked, this function will unlock it + * + * @param soft i2c config class + * + * @return RT_EOK indicates successful unlock. + */ +static rt_err_t nu_soft_i2c_bus_unlock(const struct nu_soft_i2c_config *cfg) +{ + rt_int32_t i = 0; + + if (PIN_LOW == rt_pin_read(cfg->sda)) + { + while (i++ < 9) + { + rt_pin_write(cfg->scl, PIN_HIGH); + nu_soft_i2c_udelay(100); + rt_pin_write(cfg->scl, PIN_LOW); + nu_soft_i2c_udelay(100); + } + } + if (PIN_LOW == rt_pin_read(cfg->sda)) + { + return -RT_ERROR; + } + + return RT_EOK; +} + +/** + * This function sets the sda pin. + * + * @param soft i2c config class. + * @param The sda pin state. + */ +static void nu_soft_i2c_set_sda(void *data, rt_int32_t state) +{ + struct nu_soft_i2c_config *cfg = (struct nu_soft_i2c_config *)data; + + rt_pin_write(cfg->sda, state ? PIN_HIGH : PIN_LOW); +} + +/** + * This function sets the scl pin. + * + * @param soft i2c config class. + * @param The scl pin state. + */ +static void nu_soft_i2c_set_scl(void *data, rt_int32_t state) +{ + struct nu_soft_i2c_config *cfg = (struct nu_soft_i2c_config *)data; + + rt_pin_write(cfg->scl, state ? PIN_HIGH : PIN_LOW); +} + +/** + * This function gets the sda pin state. + * + * @param The sda pin state. + */ +static rt_int32_t nu_soft_i2c_get_sda(void *data) +{ + struct nu_soft_i2c_config *cfg = (struct nu_soft_i2c_config *)data; + + return rt_pin_read(cfg->sda); +} + +/** + * This function gets the scl pin state. + * + * @param The scl pin state. + */ +static rt_int32_t nu_soft_i2c_get_scl(void *data) +{ + struct nu_soft_i2c_config *cfg = (struct nu_soft_i2c_config *)data; + + return rt_pin_read(cfg->scl); +} + +/* Soft I2C initialization function */ +int rt_soft_i2c_init(void) +{ + rt_size_t obj_num = sizeof(nu_soft_i2c_obj) / sizeof(struct nu_soft_i2c); + rt_err_t result; + + for (int i = 0; i < obj_num; i++) + { + nu_soft_i2c_obj[i].ops = nu_soft_i2c_bit_ops; + nu_soft_i2c_obj[i].ops.data = (void *)&nu_soft_i2c_cfg[i]; + nu_soft_i2c_obj[i].soft_i2c_bus.priv = &nu_soft_i2c_obj[i].ops; + nu_soft_i2c_gpio_init(&nu_soft_i2c_cfg[i]); + + result = rt_i2c_bit_add_bus(&nu_soft_i2c_obj[i].soft_i2c_bus, nu_soft_i2c_cfg[i].bus_name); + RT_ASSERT(result == RT_EOK); + + nu_soft_i2c_bus_unlock(&nu_soft_i2c_cfg[i]); + + LOG_D("software simulation %s init done, pin scl: %d, pin sda %d", + nu_soft_i2c_cfg[i].bus_name, + nu_soft_i2c_cfg[i].scl, + nu_soft_i2c_cfg[i].sda); + } + + return 0; +} +INIT_DEVICE_EXPORT(rt_soft_i2c_init); + +#endif //#if (defined(BSP_USING_SOFT_I2C) && defined(RT_USING_I2C_BITOPS) && defined(RT_USING_I2C) && defined(RT_USING_PIN)) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_spi.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_spi.c new file mode 100644 index 0000000000..e8d2a69c9d --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_spi.c @@ -0,0 +1,726 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-11-11 Wayne First version +* +******************************************************************************/ +#include + +#if defined(BSP_USING_SPI) + +#define LOG_TAG "drv.spi" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL DBG_INFO +#define DBG_COLOR +#include + +#include +#include +#include + +#include + + +/* Private define ---------------------------------------------------------------*/ + +#ifndef NU_SPI_USE_PDMA_MIN_THRESHOLD + #define NU_SPI_USE_PDMA_MIN_THRESHOLD (128) +#endif + +enum +{ + SPI_START = -1, +#if defined(BSP_USING_SPI0) + SPI0_IDX, +#endif +#if defined(BSP_USING_SPI1) + SPI1_IDX, +#endif +#if defined(BSP_USING_SPI2) + SPI2_IDX, +#endif +#if defined(BSP_USING_SPI3) + SPI3_IDX, +#endif + SPI_CNT +}; + +/* Private typedef --------------------------------------------------------------*/ + +/* Private functions ------------------------------------------------------------*/ +static void nu_spi_transmission_with_poll(struct nu_spi *spi_bus, + uint8_t *send_addr, uint8_t *recv_addr, int length, uint8_t bytes_per_word); +static int nu_spi_register_bus(struct nu_spi *spi_bus, const char *name); +static rt_uint32_t nu_spi_bus_xfer(struct rt_spi_device *device, struct rt_spi_message *message); +static rt_err_t nu_spi_bus_configure(struct rt_spi_device *device, struct rt_spi_configuration *configuration); + +#if defined(BSP_USING_SPI_PDMA) + static void nu_pdma_spi_rx_cb_event(void *pvUserData, uint32_t u32EventFilter); + static rt_err_t nu_pdma_spi_rx_config(struct nu_spi *spi_bus, uint8_t *pu8Buf, int32_t i32RcvLen, uint8_t bytes_per_word); + static rt_err_t nu_pdma_spi_tx_config(struct nu_spi *spi_bus, const uint8_t *pu8Buf, int32_t i32SndLen, uint8_t bytes_per_word); + static rt_size_t nu_spi_pdma_transmit(struct nu_spi *spi_bus, const uint8_t *send_addr, uint8_t *recv_addr, int length, uint8_t bytes_per_word); +#endif +/* Public functions -------------------------------------------------------------*/ +void nu_spi_transfer(struct nu_spi *spi_bus, uint8_t *tx, uint8_t *rx, int length, uint8_t bytes_per_word); +void nu_spi_drain_rxfifo(SPI_T *spi_base); + +/* Private variables ------------------------------------------------------------*/ +static struct rt_spi_ops nu_spi_poll_ops = +{ + .configure = nu_spi_bus_configure, + .xfer = nu_spi_bus_xfer, +}; + +static struct nu_spi nu_spi_arr [] = +{ +#if defined(BSP_USING_SPI0) + { + .name = "spi0", + .spi_base = SPI0, + .rstidx = SPI0_RST, +#if defined(BSP_USING_SPI_PDMA) +#if defined(BSP_USING_SPI0_PDMA) + .pdma_perp_tx = PDMA_SPI0_TX, + .pdma_perp_rx = PDMA_SPI0_RX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif +#if defined(BSP_USING_SPI1) + { + .name = "spi1", + .spi_base = SPI1, + .rstidx = SPI1_RST, +#if defined(BSP_USING_SPI_PDMA) +#if defined(BSP_USING_SPI1_PDMA) + .pdma_perp_tx = PDMA_SPI1_TX, + .pdma_perp_rx = PDMA_SPI1_RX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif +#if defined(BSP_USING_SPI2) + { + .name = "spi2", + .spi_base = SPI2, + .rstidx = SPI2_RST, +#if defined(BSP_USING_SPI_PDMA) +#if defined(BSP_USING_SPI2_PDMA) + .pdma_perp_tx = PDMA_SPI2_TX, + .pdma_perp_rx = PDMA_SPI2_RX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif +#if defined(BSP_USING_SPI3) + { + .name = "spi3", + .spi_base = SPI3, + .rstidx = SPI3_RST, +#if defined(BSP_USING_SPI_PDMA) +#if defined(BSP_USING_SPI3_PDMA) + .pdma_perp_tx = PDMA_SPI3_TX, + .pdma_perp_rx = PDMA_SPI3_RX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif +}; /* spi nu_spi */ + +static rt_err_t nu_spi_bus_configure(struct rt_spi_device *device, + struct rt_spi_configuration *configuration) +{ + struct nu_spi *spi_bus; + uint32_t u32SPIMode; + rt_err_t ret = RT_EOK; + void *pvUserData; + + RT_ASSERT(device != RT_NULL); + RT_ASSERT(configuration != RT_NULL); + + spi_bus = (struct nu_spi *) device->bus; + pvUserData = device->parent.user_data; + + /* Check mode */ + switch (configuration->mode & RT_SPI_MODE_3) + { + case RT_SPI_MODE_0: + u32SPIMode = SPI_MODE_0; + break; + case RT_SPI_MODE_1: + u32SPIMode = SPI_MODE_1; + break; + case RT_SPI_MODE_2: + u32SPIMode = SPI_MODE_2; + break; + case RT_SPI_MODE_3: + u32SPIMode = SPI_MODE_3; + break; + default: + ret = RT_EIO; + goto exit_nu_spi_bus_configure; + } + + /* Check data width */ + if (!(configuration->data_width == 8 || + configuration->data_width == 16 || + configuration->data_width == 24 || + configuration->data_width == 32)) + { + ret = RT_EINVAL; + goto exit_nu_spi_bus_configure; + } + + /* Need to initialize new configuration? */ + if (rt_memcmp(configuration, &spi_bus->configuration, sizeof(*configuration)) != 0) + { + rt_memcpy(&spi_bus->configuration, configuration, sizeof(*configuration)); + + SPI_Open(spi_bus->spi_base, SPI_MASTER, u32SPIMode, configuration->data_width, configuration->max_hz); + + if (configuration->mode & RT_SPI_CS_HIGH) + { + /* Set CS pin to LOW */ + if (pvUserData != RT_NULL) + { + // set to LOW */ + rt_pin_write(*((rt_base_t *)pvUserData), PIN_LOW); + } + else + { + SPI_SET_SS_LOW(spi_bus->spi_base); + } + } + else + { + /* Set CS pin to HIGH */ + if (pvUserData != RT_NULL) + { + // set to HIGH */ + rt_pin_write(*((rt_base_t *)pvUserData), PIN_HIGH); + } + else + { + /* Set CS pin to HIGH */ + SPI_SET_SS_HIGH(spi_bus->spi_base); + } + } + + if (configuration->mode & RT_SPI_MSB) + { + /* Set sequence to MSB first */ + SPI_SET_MSB_FIRST(spi_bus->spi_base); + } + else + { + /* Set sequence to LSB first */ + SPI_SET_LSB_FIRST(spi_bus->spi_base); + } + } + + /* Clear SPI RX FIFO */ + nu_spi_drain_rxfifo(spi_bus->spi_base); + +exit_nu_spi_bus_configure: + + return -(ret); +} + +#if defined(BSP_USING_SPI_PDMA) +static void nu_pdma_spi_rx_cb_event(void *pvUserData, uint32_t u32EventFilter) +{ + rt_err_t result = RT_EOK; + struct nu_spi *spi_bus = (struct nu_spi *)pvUserData; + + RT_ASSERT(spi_bus != RT_NULL); + + result = rt_sem_release(spi_bus->m_psSemBus); + RT_ASSERT(result == RT_EOK); +} + +static void nu_pdma_spi_tx_cb_trigger(void *pvUserData, uint32_t u32UserData) +{ + /* Get base address of spi register */ + SPI_T *spi_base = (SPI_T *)pvUserData; + + /* Trigger TX/RX PDMA transfer. */ + SPI_TRIGGER_TX_RX_PDMA(spi_base); +} + +static void nu_pdma_spi_rx_cb_disable(void *pvUserData, uint32_t u32UserData) +{ + /* Get base address of spi register */ + SPI_T *spi_base = (SPI_T *)pvUserData; + + /* Stop TX/RX DMA transfer. */ + SPI_DISABLE_TX_RX_PDMA(spi_base); +} + +static rt_err_t nu_pdma_spi_rx_config(struct nu_spi *spi_bus, uint8_t *pu8Buf, int32_t i32RcvLen, uint8_t bytes_per_word) +{ + struct nu_pdma_chn_cb sChnCB; + + rt_err_t result = RT_EOK; + rt_uint8_t *dst_addr = NULL; + nu_pdma_memctrl_t memctrl = eMemCtl_Undefined; + + /* Get base address of spi register */ + SPI_T *spi_base = spi_bus->spi_base; + + rt_uint8_t spi_pdma_rx_chid = spi_bus->pdma_chanid_rx; + + nu_pdma_filtering_set(spi_pdma_rx_chid, NU_PDMA_EVENT_TRANSFER_DONE); + + /* Register ISR callback function */ + sChnCB.m_eCBType = eCBType_Event; + sChnCB.m_pfnCBHandler = nu_pdma_spi_rx_cb_event; + sChnCB.m_pvUserData = (void *)spi_bus; + result = nu_pdma_callback_register(spi_pdma_rx_chid, &sChnCB); + if (result != RT_EOK) + { + goto exit_nu_pdma_spi_rx_config; + } + + /* Register Disable engine dma trigger callback function */ + sChnCB.m_eCBType = eCBType_Disable; + sChnCB.m_pfnCBHandler = nu_pdma_spi_rx_cb_disable; + sChnCB.m_pvUserData = (void *)spi_base; + result = nu_pdma_callback_register(spi_pdma_rx_chid, &sChnCB); + if (result != RT_EOK) + { + goto exit_nu_pdma_spi_rx_config; + } + + if (pu8Buf == RT_NULL) + { + memctrl = eMemCtl_SrcFix_DstFix; + dst_addr = (rt_uint8_t *) &spi_bus->dummy; + } + else + { + memctrl = eMemCtl_SrcFix_DstInc; + dst_addr = pu8Buf; + } + + result = nu_pdma_channel_memctrl_set(spi_pdma_rx_chid, memctrl); + if (result != RT_EOK) + { + goto exit_nu_pdma_spi_rx_config; + } + + result = nu_pdma_transfer(spi_pdma_rx_chid, + bytes_per_word * 8, + (uint32_t)&spi_base->RX, + (uint32_t)dst_addr, + i32RcvLen / bytes_per_word, + 0); +exit_nu_pdma_spi_rx_config: + + return result; +} + +static rt_err_t nu_pdma_spi_tx_config(struct nu_spi *spi_bus, const uint8_t *pu8Buf, int32_t i32SndLen, uint8_t bytes_per_word) +{ + struct nu_pdma_chn_cb sChnCB; + + rt_err_t result = RT_EOK; + rt_uint8_t *src_addr = NULL; + nu_pdma_memctrl_t memctrl = eMemCtl_Undefined; + + /* Get base address of spi register */ + SPI_T *spi_base = spi_bus->spi_base; + + rt_uint8_t spi_pdma_tx_chid = spi_bus->pdma_chanid_tx; + + if (pu8Buf == RT_NULL) + { + spi_bus->dummy = 0; + memctrl = eMemCtl_SrcFix_DstFix; + src_addr = (rt_uint8_t *)&spi_bus->dummy; + } + else + { + memctrl = eMemCtl_SrcInc_DstFix; + src_addr = (rt_uint8_t *)pu8Buf; + } + + /* Register Disable engine dma trigger callback function */ + sChnCB.m_eCBType = eCBType_Trigger; + sChnCB.m_pfnCBHandler = nu_pdma_spi_tx_cb_trigger; + sChnCB.m_pvUserData = (void *)spi_base; + result = nu_pdma_callback_register(spi_pdma_tx_chid, &sChnCB); + if (result != RT_EOK) + { + goto exit_nu_pdma_spi_tx_config; + } + + result = nu_pdma_channel_memctrl_set(spi_pdma_tx_chid, memctrl); + if (result != RT_EOK) + { + goto exit_nu_pdma_spi_tx_config; + } + + result = nu_pdma_transfer(spi_pdma_tx_chid, + bytes_per_word * 8, + (uint32_t)src_addr, + (uint32_t)&spi_base->TX, + i32SndLen / bytes_per_word, + 0); +exit_nu_pdma_spi_tx_config: + + return result; +} + + +/** + * SPI PDMA transfer + */ +static rt_size_t nu_spi_pdma_transmit(struct nu_spi *spi_bus, const uint8_t *send_addr, uint8_t *recv_addr, int length, uint8_t bytes_per_word) +{ + rt_err_t result = RT_EOK; + + result = nu_pdma_spi_rx_config(spi_bus, recv_addr, length, bytes_per_word); + RT_ASSERT(result == RT_EOK); + + result = nu_pdma_spi_tx_config(spi_bus, send_addr, length, bytes_per_word); + RT_ASSERT(result == RT_EOK); + + /* Wait RX-PDMA transfer done */ + result = rt_sem_take(spi_bus->m_psSemBus, RT_WAITING_FOREVER); + RT_ASSERT(result == RT_EOK); + + return length; +} + +rt_err_t nu_hw_spi_pdma_allocate(struct nu_spi *spi_bus) +{ + /* Allocate SPI_TX nu_dma channel */ + if ((spi_bus->pdma_chanid_tx = nu_pdma_channel_allocate(spi_bus->pdma_perp_tx)) < 0) + { + goto exit_nu_hw_spi_pdma_allocate; + } + /* Allocate SPI_RX nu_dma channel */ + else if ((spi_bus->pdma_chanid_rx = nu_pdma_channel_allocate(spi_bus->pdma_perp_rx)) < 0) + { + nu_pdma_channel_free(spi_bus->pdma_chanid_tx); + goto exit_nu_hw_spi_pdma_allocate; + } + + spi_bus->m_psSemBus = rt_sem_create("spibus_sem", 0, RT_IPC_FLAG_FIFO); + RT_ASSERT(spi_bus->m_psSemBus != RT_NULL); + + return RT_EOK; + +exit_nu_hw_spi_pdma_allocate: + + return -(RT_ERROR); +} +#endif /* #if defined(BSP_USING_SPI_PDMA) */ + +void nu_spi_drain_rxfifo(SPI_T *spi_base) +{ + while (SPI_IS_BUSY(spi_base)); + + // Drain SPI RX FIFO, make sure RX FIFO is empty + while (!SPI_GET_RX_FIFO_EMPTY_FLAG(spi_base)) + { + SPI_ClearRxFIFO(spi_base); + } +} + +static int nu_spi_read(SPI_T *spi_base, uint8_t *recv_addr, uint8_t bytes_per_word) +{ + int size = 0; + + // Read RX data + if (!SPI_GET_RX_FIFO_EMPTY_FLAG(spi_base)) + { + uint32_t val; + // Read data from SPI RX FIFO + switch (bytes_per_word) + { + case 4: + val = SPI_READ_RX(spi_base); + nu_set32_le(recv_addr, val); + break; + case 3: + val = SPI_READ_RX(spi_base); + nu_set24_le(recv_addr, val); + break; + case 2: + val = SPI_READ_RX(spi_base); + nu_set16_le(recv_addr, val); + break; + case 1: + *recv_addr = SPI_READ_RX(spi_base); + break; + default: + LOG_E("Data length is not supported.\n"); + break; + } + size = bytes_per_word; + } + return size; +} + +static int nu_spi_write(SPI_T *spi_base, const uint8_t *send_addr, uint8_t bytes_per_word) +{ + // Wait SPI TX send data + while (SPI_GET_TX_FIFO_FULL_FLAG(spi_base)); + + // Input data to SPI TX + switch (bytes_per_word) + { + case 4: + SPI_WRITE_TX(spi_base, nu_get32_le(send_addr)); + break; + case 3: + SPI_WRITE_TX(spi_base, nu_get24_le(send_addr)); + break; + case 2: + SPI_WRITE_TX(spi_base, nu_get16_le(send_addr)); + break; + case 1: + SPI_WRITE_TX(spi_base, *((uint8_t *)send_addr)); + break; + default: + LOG_E("Data length is not supported.\n"); + break; + } + + return bytes_per_word; +} + +/** + * @brief SPI bus polling + * @param dev : The pointer of the specified SPI module. + * @param send_addr : Source address + * @param recv_addr : Destination address + * @param length : Data length + */ +static void nu_spi_transmission_with_poll(struct nu_spi *spi_bus, + uint8_t *send_addr, uint8_t *recv_addr, int length, uint8_t bytes_per_word) +{ + SPI_T *spi_base = spi_bus->spi_base; + + // Write-only + if ((send_addr != RT_NULL) && (recv_addr == RT_NULL)) + { + while (length > 0) + { + send_addr += nu_spi_write(spi_base, send_addr, bytes_per_word); + length -= bytes_per_word; + } + } // if (send_addr != RT_NULL && recv_addr == RT_NULL) + // Read-only + else if ((send_addr == RT_NULL) && (recv_addr != RT_NULL)) + { + spi_bus->dummy = 0; + while (length > 0) + { + /* Input data to SPI TX FIFO */ + length -= nu_spi_write(spi_base, (const uint8_t *)&spi_bus->dummy, bytes_per_word); + + /* Read data from RX FIFO */ + recv_addr += nu_spi_read(spi_base, recv_addr, bytes_per_word); + } + } // else if (send_addr == RT_NULL && recv_addr != RT_NULL) + // Read&Write + else + { + while (length > 0) + { + /* Input data to SPI TX FIFO */ + send_addr += nu_spi_write(spi_base, send_addr, bytes_per_word); + length -= bytes_per_word; + + /* Read data from RX FIFO */ + recv_addr += nu_spi_read(spi_base, recv_addr, bytes_per_word); + } + } // else + + /* Wait RX or drain RX-FIFO */ + if (recv_addr) + { + // Wait SPI transmission done + while (SPI_IS_BUSY(spi_base)) + { + while (!SPI_GET_RX_FIFO_EMPTY_FLAG(spi_base)) + { + recv_addr += nu_spi_read(spi_base, recv_addr, bytes_per_word); + } + } + + while (!SPI_GET_RX_FIFO_EMPTY_FLAG(spi_base)) + { + recv_addr += nu_spi_read(spi_base, recv_addr, bytes_per_word); + } + } + else + { + /* Clear SPI RX FIFO */ + nu_spi_drain_rxfifo(spi_base); + } +} + +void nu_spi_transfer(struct nu_spi *spi_bus, uint8_t *tx, uint8_t *rx, int length, uint8_t bytes_per_word) +{ + RT_ASSERT(spi_bus != RT_NULL); + +#if defined(BSP_USING_SPI_PDMA) + /* DMA transfer constrains */ + if ((spi_bus->pdma_chanid_rx >= 0) && + !((uint32_t)tx % bytes_per_word) && + !((uint32_t)rx % bytes_per_word) && + (bytes_per_word != 3) && + (length >= NU_SPI_USE_PDMA_MIN_THRESHOLD)) + nu_spi_pdma_transmit(spi_bus, tx, rx, length, bytes_per_word); + else + nu_spi_transmission_with_poll(spi_bus, tx, rx, length, bytes_per_word); +#else + nu_spi_transmission_with_poll(spi_bus, tx, rx, length, bytes_per_word); +#endif +} + +static rt_uint32_t nu_spi_bus_xfer(struct rt_spi_device *device, struct rt_spi_message *message) +{ + struct nu_spi *spi_bus; + struct rt_spi_configuration *configuration; + uint8_t bytes_per_word; + void *pvUserData; + + RT_ASSERT(device != RT_NULL); + RT_ASSERT(device->bus != RT_NULL); + RT_ASSERT(message != RT_NULL); + + spi_bus = (struct nu_spi *) device->bus; + configuration = (struct rt_spi_configuration *)&spi_bus->configuration; + bytes_per_word = configuration->data_width / 8; + pvUserData = device->parent.user_data; + + if ((message->length % bytes_per_word) != 0) + { + /* Say bye. */ + LOG_E("%s: error payload length(%d%%%d != 0).\n", spi_bus->name, message->length, bytes_per_word); + return 0; + } + + if (message->length > 0) + { + if (message->cs_take && !(configuration->mode & RT_SPI_NO_CS)) + { + if (pvUserData != RT_NULL) + { + if (configuration->mode & RT_SPI_CS_HIGH) + { + // set to HIGH */ + rt_pin_write(*((rt_base_t *)pvUserData), PIN_HIGH); + } + else + { + // set to LOW */ + rt_pin_write(*((rt_base_t *)pvUserData), PIN_LOW); + } + } + else + { + if (configuration->mode & RT_SPI_CS_HIGH) + { + SPI_SET_SS_HIGH(spi_bus->spi_base); + } + else + { + SPI_SET_SS_LOW(spi_bus->spi_base); + } + } + } + + nu_spi_transfer(spi_bus, (uint8_t *)message->send_buf, (uint8_t *)message->recv_buf, message->length, bytes_per_word); + + if (message->cs_release && !(configuration->mode & RT_SPI_NO_CS)) + { + if (pvUserData != RT_NULL) + { + if (configuration->mode & RT_SPI_CS_HIGH) + { + // set to LOW */ + rt_pin_write(*((rt_base_t *)pvUserData), PIN_LOW); + } + else + { + // set to HIGH */ + rt_pin_write(*((rt_base_t *)pvUserData), PIN_HIGH); + } + } + else + { + if (configuration->mode & RT_SPI_CS_HIGH) + { + SPI_SET_SS_LOW(spi_bus->spi_base); + } + else + { + SPI_SET_SS_HIGH(spi_bus->spi_base); + } + } + } + + } + + return message->length; +} + +static int nu_spi_register_bus(struct nu_spi *spi_bus, const char *name) +{ + return rt_spi_bus_register(&spi_bus->dev, name, &nu_spi_poll_ops); +} + +/** + * Hardware SPI Initial + */ +static int rt_hw_spi_init(void) +{ + int i; + + for (i = (SPI_START + 1); i < SPI_CNT; i++) + { + nu_sys_ip_reset(nu_spi_arr[i].rstidx); + + nu_spi_register_bus(&nu_spi_arr[i], nu_spi_arr[i].name); +#if defined(BSP_USING_SPI_PDMA) + nu_spi_arr[i].pdma_chanid_tx = -1; + nu_spi_arr[i].pdma_chanid_rx = -1; + if ((nu_spi_arr[i].pdma_perp_tx != NU_PDMA_UNUSED) && (nu_spi_arr[i].pdma_perp_rx != NU_PDMA_UNUSED)) + { + if (nu_hw_spi_pdma_allocate(&nu_spi_arr[i]) != RT_EOK) + { + LOG_W("Failed to allocate DMA channels for %s. We will use poll-mode for this bus.\n", nu_spi_arr[i].name); + } + } +#endif + } + + return 0; +} + +INIT_DEVICE_EXPORT(rt_hw_spi_init); + +#endif //#if defined(BSP_USING_SPI) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_spi.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_spi.h new file mode 100644 index 0000000000..6195009d00 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_spi.h @@ -0,0 +1,53 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-2-7 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_SPI_H__ +#define __DRV_SPI_H__ + +#include + +#include +#include "NuMicro.h" +#include +#include + +#if defined(BSP_USING_SPI_PDMA) + #include +#endif + +struct nu_spi +{ + struct rt_spi_bus dev; + char *name; + SPI_T *spi_base; + uint32_t rstidx; + uint32_t dummy; +#if defined(BSP_USING_SPI_PDMA) + int16_t pdma_perp_tx; + int8_t pdma_chanid_tx; + int16_t pdma_perp_rx; + int8_t pdma_chanid_rx; + rt_sem_t m_psSemBus; +#endif + struct rt_qspi_configuration configuration; +}; + +typedef struct nu_spi *nu_spi_t; + +void nu_spi_drain_rxfifo(SPI_T *spi_base); +void nu_spi_transfer(struct nu_spi *spi_bus, uint8_t *tx, uint8_t *rx, int length, uint8_t bytes_per_word); + +#if defined(BSP_USING_SPI_PDMA) + rt_err_t nu_hw_spi_pdma_allocate(struct nu_spi *spi_bus); +#endif + +#endif // __DRV_SPI_H___ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_spii2s.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_spii2s.c new file mode 100644 index 0000000000..16e11e5b05 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_spii2s.c @@ -0,0 +1,652 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-5-29 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_SPII2S) + +#include +#include +#include + +/* Private define ---------------------------------------------------------------*/ +#define DBG_ENABLE +#define DBG_LEVEL DBG_LOG +#define DBG_SECTION_NAME "spii2s" +#define DBG_COLOR +#include + +enum +{ + SPII2S_START = -1, +#if defined(BSP_USING_SPII2S0) + SPII2S0_IDX, +#endif +#if defined(BSP_USING_SPII2S1) + SPII2S1_IDX, +#endif +#if defined(BSP_USING_SPII2S2) + SPII2S2_IDX, +#endif +#if defined(BSP_USING_SPII2S3) + SPII2S3_IDX, +#endif + SPII2S_CNT +}; + +/* Private functions ------------------------------------------------------------*/ +static rt_err_t nu_spii2s_getcaps(struct rt_audio_device *audio, struct rt_audio_caps *caps); +static rt_err_t nu_spii2s_configure(struct rt_audio_device *audio, struct rt_audio_caps *caps); +static rt_err_t nu_spii2s_init(struct rt_audio_device *audio); +static rt_err_t nu_spii2s_start(struct rt_audio_device *audio, int stream); +static rt_err_t nu_spii2s_stop(struct rt_audio_device *audio, int stream); +static void nu_spii2s_buffer_info(struct rt_audio_device *audio, struct rt_audio_buf_info *info); +/* Public functions -------------------------------------------------------------*/ +rt_err_t nu_spii2s_acodec_register(struct rt_audio_device *audio, nu_acodec_ops_t); + +/* Private variables ------------------------------------------------------------*/ +static struct nu_i2s g_nu_spii2s_arr [] = +{ +#if defined(BSP_USING_SPII2S0) + { + .name = "spii2s0", + .i2s_base = (I2S_T *)SPI0, //Avoid warning + .i2s_rst = SPI0_RST, + .i2s_dais = { + [NU_I2S_DAI_PLAYBACK] = { + .pdma_perp = PDMA_SPI0_TX, + }, + [NU_I2S_DAI_CAPTURE] = { + .pdma_perp = PDMA_SPI0_RX, + } + } + }, +#endif +#if defined(BSP_USING_SPII2S1) + { + .name = "spii2s1", + .i2s_base = (I2S_T *)SPI1, //Avoid warning + .i2s_rst = SPI1_RST, + .i2s_dais = { + [NU_I2S_DAI_PLAYBACK] = { + .pdma_perp = PDMA_SPI1_TX, + }, + [NU_I2S_DAI_CAPTURE] = { + .pdma_perp = PDMA_SPI1_RX, + } + } + }, +#endif +#if defined(BSP_USING_SPII2S2) + { + .name = "spii2s2", + .i2s_base = (I2S_T *)SPI2, //Avoid warning + .i2s_rst = SPI2_RST, + .i2s_dais = { + [NU_I2S_DAI_PLAYBACK] = { + .pdma_perp = PDMA_SPI2_TX, + }, + [NU_I2S_DAI_CAPTURE] = { + .pdma_perp = PDMA_SPI2_RX, + } + } + }, +#endif +#if defined(BSP_USING_SPII2S3) + { + .name = "spii2s3", + .i2s_base = (I2S_T *)SPI3, //Avoid warning + .i2s_rst = SPI3_RST, + .i2s_dais = { + [NU_I2S_DAI_PLAYBACK] = { + .pdma_perp = PDMA_SPI3_TX, + }, + [NU_I2S_DAI_CAPTURE] = { + .pdma_perp = PDMA_SPI3_RX, + } + } + }, +#endif +}; + +static void nu_pdma_spii2s_rx_cb(void *pvUserData, uint32_t u32EventFilter) +{ + nu_i2s_t psNuSPII2s = (nu_i2s_t)pvUserData; + nu_i2s_dai_t psNuSPII2sDai; + + RT_ASSERT(psNuSPII2s != RT_NULL); + psNuSPII2sDai = &psNuSPII2s->i2s_dais[NU_I2S_DAI_CAPTURE]; + + if (u32EventFilter & NU_PDMA_EVENT_TRANSFER_DONE) + { + // Report a buffer ready. + rt_uint8_t *pbuf_old = &psNuSPII2sDai->fifo[psNuSPII2sDai->fifo_block_idx * NU_I2S_DMA_BUF_BLOCK_SIZE] ; + psNuSPII2sDai->fifo_block_idx = (psNuSPII2sDai->fifo_block_idx + 1) % NU_I2S_DMA_BUF_BLOCK_NUMBER; + + /* Report upper layer. */ + rt_audio_rx_done(&psNuSPII2s->audio, pbuf_old, NU_I2S_DMA_BUF_BLOCK_SIZE); + } +} + +static void nu_pdma_spii2s_tx_cb(void *pvUserData, uint32_t u32EventFilter) +{ + nu_i2s_t psNuSPII2s = (nu_i2s_t)pvUserData; + nu_i2s_dai_t psNuSPII2sDai; + + RT_ASSERT(psNuSPII2s != RT_NULL); + psNuSPII2sDai = &psNuSPII2s->i2s_dais[NU_I2S_DAI_PLAYBACK]; + + if (u32EventFilter & NU_PDMA_EVENT_TRANSFER_DONE) + { + rt_audio_tx_complete(&psNuSPII2s->audio); + psNuSPII2sDai->fifo_block_idx = (psNuSPII2sDai->fifo_block_idx + 1) % NU_I2S_DMA_BUF_BLOCK_NUMBER; + } +} + +static rt_err_t nu_spii2s_pdma_sc_config(nu_i2s_t psNuSPII2s, E_NU_I2S_DAI dai) +{ + rt_err_t result = RT_EOK; + SPI_T *spii2s_base; + nu_i2s_dai_t psNuSPII2sDai; + int i; + uint32_t u32Src, u32Dst; + nu_pdma_cb_handler_t pfm_pdma_cb; + struct nu_pdma_chn_cb sChnCB; + + RT_ASSERT(psNuSPII2s != RT_NULL); + + /* Get base address of spii2s register */ + spii2s_base = (SPI_T *)psNuSPII2s->i2s_base; + psNuSPII2sDai = &psNuSPII2s->i2s_dais[dai]; + + switch ((int)dai) + { + case NU_I2S_DAI_PLAYBACK: + pfm_pdma_cb = nu_pdma_spii2s_tx_cb; + u32Src = (uint32_t)&psNuSPII2sDai->fifo[0]; + u32Dst = (uint32_t)&spii2s_base->TX; + break; + + case NU_I2S_DAI_CAPTURE: + pfm_pdma_cb = nu_pdma_spii2s_rx_cb; + u32Src = (uint32_t)&spii2s_base->RX; + u32Dst = (uint32_t)&psNuSPII2sDai->fifo[0]; + break; + + default: + return -RT_EINVAL; + } + /* Register ISR callback function */ + sChnCB.m_eCBType = eCBType_Event; + sChnCB.m_pfnCBHandler = pfm_pdma_cb; + sChnCB.m_pvUserData = (void *)psNuSPII2s; + + nu_pdma_filtering_set(psNuSPII2sDai->pdma_chanid, NU_PDMA_EVENT_TRANSFER_DONE); + result = nu_pdma_callback_register(psNuSPII2sDai->pdma_chanid, &sChnCB); + RT_ASSERT(result == RT_EOK); + + for (i = 0; i < NU_I2S_DMA_BUF_BLOCK_NUMBER; i++) + { + /* Setup dma descriptor entry */ + result = nu_pdma_desc_setup(psNuSPII2sDai->pdma_chanid, // Channel ID + psNuSPII2sDai->pdma_descs[i], // this descriptor + 32, // 32-bits + (dai == NU_I2S_DAI_PLAYBACK) ? u32Src + (i * NU_I2S_DMA_BUF_BLOCK_SIZE) : u32Src, //Memory or RXFIFO + (dai == NU_I2S_DAI_PLAYBACK) ? u32Dst : u32Dst + (i * NU_I2S_DMA_BUF_BLOCK_SIZE), //TXFIFO or Memory + (int32_t)NU_I2S_DMA_BUF_BLOCK_SIZE / 4, // Transfer count + psNuSPII2sDai->pdma_descs[(i + 1) % NU_I2S_DMA_BUF_BLOCK_NUMBER], // Next descriptor + 0); // Interrupt assert when every SG-table done. + RT_ASSERT(result == RT_EOK); + } + + /* Assign head descriptor */ + result = nu_pdma_sg_transfer(psNuSPII2sDai->pdma_chanid, psNuSPII2sDai->pdma_descs[0], 0); + RT_ASSERT(result == RT_EOK); + + return result; +} + +static rt_bool_t nu_spii2s_capacity_check(struct rt_audio_configure *pconfig) +{ + switch (pconfig->samplebits) + { + case 8: + case 16: + /* case 24: PDMA constrain */ + case 32: + break; + default: + goto exit_nu_spii2s_capacity_check; + } + + switch (pconfig->channels) + { + case 1: + case 2: + break; + default: + goto exit_nu_spii2s_capacity_check; + } + + return RT_TRUE; + +exit_nu_spii2s_capacity_check: + + return RT_FALSE; +} + +static rt_err_t nu_spii2s_dai_setup(nu_i2s_t psNuSPII2s, struct rt_audio_configure *pconfig) +{ + rt_err_t result = RT_EOK; + nu_acodec_ops_t pNuACodecOps; + SPI_T *spii2s_base = (SPI_T *)psNuSPII2s->i2s_base; + + RT_ASSERT(psNuSPII2s->AcodecOps != RT_NULL); + pNuACodecOps = psNuSPII2s->AcodecOps; + + /* Open SPII2S */ + if (nu_spii2s_capacity_check(pconfig) == RT_TRUE) + { + /* Reset audio codec */ + if (pNuACodecOps->nu_acodec_reset) + result = pNuACodecOps->nu_acodec_reset(); + + if (result != RT_EOK) + goto exit_nu_spii2s_dai_setup; + + /* Setup audio codec */ + if (pNuACodecOps->nu_acodec_init) + result = pNuACodecOps->nu_acodec_init(); + + if (!pNuACodecOps->nu_acodec_init || result != RT_EOK) + goto exit_nu_spii2s_dai_setup; + + /* Setup acodec samplerate/samplebit/channel */ + if (pNuACodecOps->nu_acodec_dsp_control) + result = pNuACodecOps->nu_acodec_dsp_control(pconfig); + + if (!pNuACodecOps->nu_acodec_dsp_control || result != RT_EOK) + goto exit_nu_spii2s_dai_setup; + + SPII2S_Open(spii2s_base, + (psNuSPII2s->AcodecOps->role == NU_ACODEC_ROLE_MASTER) ? SPII2S_MODE_SLAVE : SPII2S_MODE_MASTER, + pconfig->samplerate, + (((pconfig->samplebits / 8) - 1) << SPI_I2SCTL_WDWIDTH_Pos), + (pconfig->channels == 1) ? SPII2S_MONO : SPII2S_STEREO, + SPII2S_FORMAT_I2S); + LOG_I("Open SPII2S."); + + /* Set MCLK and enable MCLK */ + /* The target MCLK is related to audio codec setting. */ + SPII2S_EnableMCLK(spii2s_base, 12000000); + + /* Set un-mute */ + if (pNuACodecOps->nu_acodec_mixer_control) + pNuACodecOps->nu_acodec_mixer_control(AUDIO_MIXER_MUTE, RT_FALSE); + } + else + result = -RT_EINVAL; + +exit_nu_spii2s_dai_setup: + + return result; +} + +static rt_err_t nu_spii2s_getcaps(struct rt_audio_device *audio, struct rt_audio_caps *caps) +{ + rt_err_t result = RT_EOK; + nu_i2s_t psNuSPII2s = (nu_i2s_t)audio; + nu_acodec_ops_t pNuACodecOps; + + RT_ASSERT(audio != RT_NULL); + RT_ASSERT(caps != RT_NULL); + RT_ASSERT(psNuSPII2s->AcodecOps != RT_NULL); + + pNuACodecOps = psNuSPII2s->AcodecOps; + + switch (caps->main_type) + { + case AUDIO_TYPE_QUERY: + switch (caps->sub_type) + { + case AUDIO_TYPE_QUERY: + caps->udata.mask = AUDIO_TYPE_INPUT | AUDIO_TYPE_OUTPUT | AUDIO_TYPE_MIXER; + break; + default: + result = -RT_ERROR; + break; + } // switch (caps->sub_type) + break; + + case AUDIO_TYPE_MIXER: + + if (pNuACodecOps->nu_acodec_mixer_query) + { + switch (caps->sub_type) + { + case AUDIO_MIXER_QUERY: + return pNuACodecOps->nu_acodec_mixer_query(AUDIO_MIXER_QUERY, &caps->udata.mask); + + default: + return pNuACodecOps->nu_acodec_mixer_query(caps->sub_type, (rt_uint32_t *)&caps->udata.value); + } // switch (caps->sub_type) + + } // if (pNuACodecOps->nu_acodec_mixer_query) + + result = -RT_ERROR; + break; + + case AUDIO_TYPE_INPUT: + case AUDIO_TYPE_OUTPUT: + + switch (caps->sub_type) + { + case AUDIO_DSP_PARAM: + caps->udata.config.channels = psNuSPII2s->config.channels; + caps->udata.config.samplebits = psNuSPII2s->config.samplebits; + caps->udata.config.samplerate = psNuSPII2s->config.samplerate; + break; + case AUDIO_DSP_SAMPLERATE: + caps->udata.config.samplerate = psNuSPII2s->config.samplerate; + break; + case AUDIO_DSP_CHANNELS: + caps->udata.config.channels = psNuSPII2s->config.channels; + break; + case AUDIO_DSP_SAMPLEBITS: + caps->udata.config.samplebits = psNuSPII2s->config.samplebits; + break; + default: + result = -RT_ERROR; + break; + } // switch (caps->sub_type) + break; + + default: + result = -RT_ERROR; + break; + + } // switch (caps->main_type) + + return result; +} + +static rt_err_t nu_spii2s_configure(struct rt_audio_device *audio, struct rt_audio_caps *caps) +{ + rt_err_t result = RT_EOK; + nu_i2s_t psNuSPII2s = (nu_i2s_t)audio; + nu_acodec_ops_t pNuACodecOps; + int stream = -1; + + RT_ASSERT(audio != RT_NULL); + RT_ASSERT(caps != RT_NULL); + RT_ASSERT(psNuSPII2s->AcodecOps != RT_NULL); + + pNuACodecOps = psNuSPII2s->AcodecOps; + + switch (caps->main_type) + { + case AUDIO_TYPE_MIXER: + if (psNuSPII2s->AcodecOps->nu_acodec_mixer_control) + psNuSPII2s->AcodecOps->nu_acodec_mixer_control(caps->sub_type, caps->udata.value); + break; + + case AUDIO_TYPE_INPUT: + stream = AUDIO_STREAM_RECORD; + case AUDIO_TYPE_OUTPUT: + { + rt_bool_t bNeedReset = RT_FALSE; + + if (stream < 0) + stream = AUDIO_STREAM_REPLAY; + + switch (caps->sub_type) + { + case AUDIO_DSP_PARAM: + if (rt_memcmp(&psNuSPII2s->config, &caps->udata.config, sizeof(struct rt_audio_configure)) != 0) + { + rt_memcpy(&psNuSPII2s->config, &caps->udata.config, sizeof(struct rt_audio_configure)); + bNeedReset = RT_TRUE; + } + break; + case AUDIO_DSP_SAMPLEBITS: + if (psNuSPII2s->config.samplerate != caps->udata.config.samplebits) + { + psNuSPII2s->config.samplerate = caps->udata.config.samplebits; + bNeedReset = RT_TRUE; + } + break; + case AUDIO_DSP_CHANNELS: + if (psNuSPII2s->config.channels != caps->udata.config.channels) + { + pNuACodecOps->config.channels = caps->udata.config.channels; + bNeedReset = RT_TRUE; + } + break; + case AUDIO_DSP_SAMPLERATE: + if (psNuSPII2s->config.samplerate != caps->udata.config.samplerate) + { + psNuSPII2s->config.samplerate = caps->udata.config.samplerate; + bNeedReset = RT_TRUE; + } + break; + default: + result = -RT_ERROR; + break; + } // switch (caps->sub_type) + + if (bNeedReset) + { + return nu_spii2s_start(audio, stream); + } + } + break; + + default: + result = -RT_ERROR; + break; + } // switch (caps->main_type) + + return result; +} + +static rt_err_t nu_spii2s_init(struct rt_audio_device *audio) +{ + rt_err_t result = RT_EOK; + nu_i2s_t psNuSPII2s = (nu_i2s_t)audio; + + RT_ASSERT(audio != RT_NULL); + + /* Reset this module */ + SYS_ResetModule(psNuSPII2s->i2s_rst); + + return -(result); +} + +static rt_err_t nu_spii2s_start(struct rt_audio_device *audio, int stream) +{ + nu_i2s_t psNuSPII2s = (nu_i2s_t)audio; + SPI_T *spii2s_base; + + RT_ASSERT(audio != RT_NULL); + + spii2s_base = (SPI_T *)psNuSPII2s->i2s_base; + + /* Restart all: SPII2S and codec. */ + nu_spii2s_stop(audio, stream); + if (nu_spii2s_dai_setup(psNuSPII2s, &psNuSPII2s->config) != RT_EOK) + return -RT_ERROR; + + switch (stream) + { + case AUDIO_STREAM_REPLAY: + { + nu_spii2s_pdma_sc_config(psNuSPII2s, NU_I2S_DAI_PLAYBACK); + + /* Start TX DMA */ + SPII2S_ENABLE_TXDMA(spii2s_base); + + /* Enable I2S Tx function */ + SPII2S_ENABLE_TX(spii2s_base); + + LOG_I("Start replay."); + } + break; + + case AUDIO_STREAM_RECORD: + { + nu_spii2s_pdma_sc_config(psNuSPII2s, NU_I2S_DAI_CAPTURE); + + /* Start RX DMA */ + SPII2S_ENABLE_RXDMA(spii2s_base); + + /* Enable I2S Rx function */ + SPII2S_ENABLE_RX(spii2s_base); + + LOG_I("Start record."); + } + break; + default: + return -RT_ERROR; + } + + return RT_EOK; +} + +static rt_err_t nu_spii2s_stop(struct rt_audio_device *audio, int stream) +{ + nu_i2s_t psNuSPII2s = (nu_i2s_t)audio; + nu_i2s_dai_t psNuSPII2sDai = RT_NULL; + SPI_T *spii2s_base; + + RT_ASSERT(audio != RT_NULL); + + spii2s_base = (SPI_T *)psNuSPII2s->i2s_base; + + switch (stream) + { + case AUDIO_STREAM_REPLAY: + psNuSPII2sDai = &psNuSPII2s->i2s_dais[NU_I2S_DAI_PLAYBACK]; + + // Disable TX + SPII2S_DISABLE_TXDMA(spii2s_base); + SPII2S_DISABLE_TX(spii2s_base); + + LOG_I("Stop replay."); + break; + + case AUDIO_STREAM_RECORD: + psNuSPII2sDai = &psNuSPII2s->i2s_dais[NU_I2S_DAI_CAPTURE]; + + // Disable RX + SPII2S_DISABLE_RXDMA(spii2s_base); + SPII2S_DISABLE_RX(spii2s_base); + + LOG_I("Stop record."); + break; + + default: + return -RT_EINVAL; + } + + /* Stop DMA transfer. */ + nu_pdma_channel_terminate(psNuSPII2sDai->pdma_chanid); + + /* Close SPII2S */ + if (!(spii2s_base->I2SCTL & (SPI_I2SCTL_TXEN_Msk | SPI_I2SCTL_RXEN_Msk))) + { + SPII2S_DisableMCLK(spii2s_base); + SPII2S_Close(spii2s_base); + LOG_I("Close SPII2S."); + } + + /* Silence */ + rt_memset((void *)psNuSPII2sDai->fifo, 0, NU_I2S_DMA_FIFO_SIZE); + psNuSPII2sDai->fifo_block_idx = 0; + + return RT_EOK; +} + +static void nu_spii2s_buffer_info(struct rt_audio_device *audio, struct rt_audio_buf_info *info) +{ + nu_i2s_t psNuSPII2s = (nu_i2s_t)audio; + + RT_ASSERT(audio != RT_NULL); + RT_ASSERT(info != RT_NULL); + + info->buffer = (rt_uint8_t *)psNuSPII2s->i2s_dais[NU_I2S_DAI_PLAYBACK].fifo ; + info->total_size = NU_I2S_DMA_FIFO_SIZE; + info->block_size = NU_I2S_DMA_BUF_BLOCK_SIZE; + info->block_count = NU_I2S_DMA_BUF_BLOCK_NUMBER; + + return; +} + +static struct rt_audio_ops nu_spii2s_audio_ops = +{ + .getcaps = nu_spii2s_getcaps, + .configure = nu_spii2s_configure, + + .init = nu_spii2s_init, + .start = nu_spii2s_start, + .stop = nu_spii2s_stop, + .transmit = RT_NULL, + .buffer_info = nu_spii2s_buffer_info +}; + +static rt_err_t nu_hw_spii2s_pdma_allocate(nu_i2s_dai_t psNuSPII2sDai) +{ + /* Allocate I2S nu_dma channel */ + if ((psNuSPII2sDai->pdma_chanid = nu_pdma_channel_allocate(psNuSPII2sDai->pdma_perp)) < 0) + { + goto nu_hw_spii2s_pdma_allocate; + } + + return RT_EOK; + +nu_hw_spii2s_pdma_allocate: + + return -(RT_ERROR); +} + +int rt_hw_spii2s_init(void) +{ + int j = 0; + nu_i2s_dai_t psNuSPII2sDai; + + for (j = (SPII2S_START + 1); j < SPII2S_CNT; j++) + { + int i = 0; + for (i = 0; i < NU_I2S_DAI_CNT; i++) + { + uint8_t *pu8ptr = rt_malloc(NU_I2S_DMA_FIFO_SIZE); + psNuSPII2sDai = &g_nu_spii2s_arr[j].i2s_dais[i]; + psNuSPII2sDai->fifo = pu8ptr; + rt_memset(pu8ptr, 0, NU_I2S_DMA_FIFO_SIZE); + RT_ASSERT(psNuSPII2sDai->fifo != RT_NULL); + + psNuSPII2sDai->pdma_chanid = -1; + psNuSPII2sDai->fifo_block_idx = 0; + RT_ASSERT(nu_hw_spii2s_pdma_allocate(psNuSPII2sDai) == RT_EOK); + RT_ASSERT(nu_pdma_sgtbls_allocate(&psNuSPII2sDai->pdma_descs[0], NU_I2S_DMA_BUF_BLOCK_NUMBER) == RT_EOK); + } + + /* Register ops of audio device */ + g_nu_spii2s_arr[j].audio.ops = &nu_spii2s_audio_ops; + + /* Register device, RW: it is with replay and record functions. */ + rt_audio_register(&g_nu_spii2s_arr[j].audio, g_nu_spii2s_arr[j].name, RT_DEVICE_FLAG_RDWR, &g_nu_spii2s_arr[j]); + } + + return RT_EOK; +} +INIT_DEVICE_EXPORT(rt_hw_spii2s_init); +#endif //#if defined(BSP_USING_SPII2S) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.c new file mode 100644 index 0000000000..cbf15c750e --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.c @@ -0,0 +1,269 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-11-11 Wayne First version +* +******************************************************************************/ + +#include +#include +#include "drv_sys.h" +#include + +#define DEF_RAISING_CPU_FREQUENCY +//Dont enable #define DEF_RAISING_CPU_VOLTAGE + +void machine_shutdown(void) +{ + rt_kprintf("machine_shutdown...\n"); + rt_hw_interrupt_disable(); + + /* Unlock */ + SYS_UnlockReg(); + + while (1); +} + +void machine_reset(void) +{ + rt_kprintf("machine_reset...\n"); + rt_hw_interrupt_disable(); + + /* Unlock */ + SYS_UnlockReg(); + + SYS->IPRST0 = SYS_IPRST0_CHIPRST_Msk; + SYS->IPRST0 = 0; + while (1); +} + +int reboot(int argc, char **argv) +{ + machine_reset(); + return 0; +} +MSH_CMD_EXPORT(reboot, Reboot System); + + +void nu_sys_ip_reset(uint32_t u32ModuleIndex) +{ + SYS_ResetModule(u32ModuleIndex); +} + +E_SYS_USB0_ID nu_sys_usb0_role(void) +{ +#if 0 + /* Check Role on USB0 dual-role port. */ + /* + [17] USB0_IDS + USB0_ID Status + 0 = USB port 0 used as a USB device port. + 1 = USB port 0 used as a USB host port. + */ + return ((inpw(REG_SYS_MISCISR) & (1 << 17)) > 0) ? USB0_ID_HOST : USB0_ID_DEVICE; +#else + return USB0_ID_DEVICE; +#endif +} + +void nu_sys_check_register(S_NU_REG *psNuReg) +{ + if (psNuReg == RT_NULL) + return; + + while (psNuReg->vu32RegAddr != 0) + { + vu32 vc32RegValue = *((vu32 *)psNuReg->vu32RegAddr); + vu32 vc32BMValue = vc32RegValue & psNuReg->vu32BitMask; + rt_kprintf("[%3s] %32s(0x%08x) %24s(0x%08x): 0x%08x(AndBitMask:0x%08x)\n", + (psNuReg->vu32Value == vc32BMValue) ? "Ok" : "!OK", + psNuReg->szVName, + psNuReg->vu32Value, + psNuReg->szRegName, + psNuReg->vu32RegAddr, + vc32RegValue, + vc32BMValue); + psNuReg++; + } +} + +static int nu_tempsen_init() +{ + SYS->TSENSRFCR &= ~SYS_TSENSRFCR_PD_Msk; // Disable power down, don't wait, takes double conv time (350ms * 2) + return 0; +} + +static int nu_tempsen_get_value() +{ + char sztmp[32]; + double temp; + static rt_tick_t _old_tick = 0; + static int32_t count = 0; + + _old_tick = rt_tick_get(); + + // Wait valid bit set + while ((SYS->TSENSRFCR & SYS_TSENSRFCR_DATAVALID_Msk) == 0) + { + // 700 ms after clear pd bit. other conversion takes 350 ms + if (rt_tick_get() > (500 + _old_tick)) + { + return -1; + } + } + + if (++count == 8) + { + count = 0; + temp = (double)((SYS->TSENSRFCR & 0x0FFF0000) >> 16) * 274.3531 / 4096.0 - 93.3332; + snprintf(sztmp, sizeof(sztmp), "Temperature: %.1f\n", temp); + rt_kprintf("%s", sztmp); + } + + // Clear Valid bit + SYS->TSENSRFCR = SYS_TSENSRFCR_DATAVALID_Msk; + + return 0; +} + +void nu_tempsen_hook(void) +{ + nu_tempsen_get_value(); +} + +static int nu_tempsen_go(void) +{ + rt_err_t err = rt_thread_idle_sethook(nu_tempsen_hook); + + if (err != RT_EOK) + { + rt_kprintf("set %s idle hook failed!\n", __func__); + return -1; + } + + nu_tempsen_init(); + + return 0; +} +//INIT_APP_EXPORT(nu_tempsen_go); +MSH_CMD_EXPORT(nu_tempsen_go, go tempsen); + +void nu_clock_dump(void) +{ + rt_kprintf("HXT: %d Hz\n", CLK_GetHXTFreq()); + rt_kprintf("LXT: %d Hz\n", CLK_GetLXTFreq()); + rt_kprintf("CAPLL: %d Hz(OpMode=%d)\n", CLK_GetPLLClockFreq(CAPLL), CLK_GetPLLOpMode(CAPLL)); + rt_kprintf("DDRPLL: %d Hz(OpMode=%d)\n", CLK_GetPLLClockFreq(DDRPLL), CLK_GetPLLOpMode(DDRPLL)); + rt_kprintf("APLL: %d Hz(OpMode=%d)\n", CLK_GetPLLClockFreq(APLL), CLK_GetPLLOpMode(APLL)); + rt_kprintf("EPLL: %d Hz(OpMode=%d)\n", CLK_GetPLLClockFreq(EPLL), CLK_GetPLLOpMode(EPLL)); + rt_kprintf("VPLL: %d Hz(OpMode=%d)\n", CLK_GetPLLClockFreq(VPLL), CLK_GetPLLOpMode(VPLL)); + + rt_kprintf("M4-CPU: %d Hz\n", CLK_GetCPUFreq()); + + rt_kprintf("SYSCLK0: %d Hz\n", CLK_GetSYSCLK0Freq()); + rt_kprintf("SYSCLK1: %d Hz\n", CLK_GetSYSCLK1Freq()); + rt_kprintf("HCLK0: %d Hz\n", CLK_GetHCLK0Freq()); + rt_kprintf("HCLK1: %d Hz\n", CLK_GetHCLK1Freq()); + rt_kprintf("HCLK2: %d Hz\n", CLK_GetHCLK2Freq()); + rt_kprintf("HCLK3: %d Hz\n", CLK_GetHCLK3Freq()); + rt_kprintf("PCLK0: %d Hz\n", CLK_GetPCLK0Freq()); + rt_kprintf("PCLK1: %d Hz\n", CLK_GetPCLK1Freq()); + rt_kprintf("PCLK2: %d Hz\n", CLK_GetPCLK2Freq()); + rt_kprintf("PCLK3: %d Hz\n", CLK_GetPCLK3Freq()); + rt_kprintf("PCLK4: %d Hz\n", CLK_GetPCLK4Freq()); +} + +const char *szClockName [] = +{ + "HXT", + "LXT", + "N/A", + "LIRC", + "HIRC", + "N/A", + "CAPLL", + "N/A", + "DDRPLL", + "EPLL", + "APLL", + "VPLL" +}; +#define CLOCKNAME_SIZE (sizeof(szClockName)/sizeof(char*)) + +void nu_clock_isready(void) +{ + uint32_t u32IsReady, i; + for (i = 0; i < CLOCKNAME_SIZE; i++) + { + if (i == 5 || i == 7 || i == 2) continue; + u32IsReady = CLK_WaitClockReady(1 << i); + rt_kprintf("%s: %s\n", szClockName[i], (u32IsReady == 1) ? "[Stable]" : "[Unstable]"); + } +} + +extern uint32_t ma35d1_set_cpu_voltage(uint32_t sys_clk, uint32_t u32Vol); +void nu_clock_raise(void) +{ + uint32_t u32PllRefClk; + + /* Unlock protected registers */ + SYS_UnlockReg(); + + /* Enable HXT, LXT */ + CLK->PWRCTL |= (CLK_PWRCTL_HXTEN_Msk | CLK_PWRCTL_HIRCEN_Msk); + if (CLK->STATUS & CLK_STATUS_HXTSTB_Msk) // Check Ready + { + u32PllRefClk = __HXT; + } + else if (CLK->STATUS & CLK_STATUS_HIRCSTB_Msk) // Check Ready + { + u32PllRefClk = __HIRC; // HXT_CHECK_FAIL + } + else + { + return; + } + + CLK_SetPLLFreq(VPLL, PLL_OPMODE_INTEGER, u32PllRefClk, 102000000ul); + CLK_SetPLLFreq(APLL, PLL_OPMODE_INTEGER, u32PllRefClk, 160000000ul); + CLK_SetPLLFreq(EPLL, PLL_OPMODE_INTEGER, u32PllRefClk, 500000000ul); + + /* Waiting clock ready */ + CLK_WaitClockReady(CLK_STATUS_VPLLSTB_Msk | CLK_STATUS_APLLSTB_Msk | CLK_STATUS_EPLLSTB_Msk); + +#if defined(DEF_RAISING_CPU_FREQUENCY) + /* Switch clock source of CA35 to DDRPLL before raising CA-PLL */ + CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_CA35CKSEL_Msk)) | CLK_CLKSEL0_CA35CKSEL_DDRPLL; +#if defined(DEF_RAISING_CPU_VOLTAGE) + if (ma35d1_set_cpu_voltage(CLK_GetPLLClockFreq(SYSPLL), 0x68)) + { + CLK_SetPLLFreq(CAPLL, PLL_OPMODE_INTEGER, u32PllRefClk, 1000000000ul); + } + else +#endif + { + ma35d1_set_cpu_voltage(CLK_GetPLLClockFreq(SYSPLL), 0x5F); + CLK_SetPLLFreq(CAPLL, PLL_OPMODE_INTEGER, u32PllRefClk, 800000000ul); + } + + /* Waiting clock ready */ + CLK_WaitClockReady(CLK_STATUS_CAPLLSTB_Msk); + + /* Switch clock source of CA35 to CA-PLL after raising */ + CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_CA35CKSEL_Msk)) | CLK_CLKSEL0_CA35CKSEL_CAPLL; +#endif + +} + +#ifdef FINSH_USING_MSH + MSH_CMD_EXPORT(nu_clock_dump, Dump all clocks); + MSH_CMD_EXPORT(nu_clock_raise, Raise clock); + MSH_CMD_EXPORT(nu_clock_isready, Check PLL clocks); +#endif + + diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.h new file mode 100644 index 0000000000..63b47fded8 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.h @@ -0,0 +1,95 @@ +#ifndef __DRV_SYS_H__ +#define __DRV_SYS_H__ + +#include +#include "drv_common.h" +#include "NuMicro.h" + +typedef enum +{ + USB0_ID_DEVICE, + USB0_ID_HOST, + USB0_ID_CNT +} E_SYS_USB0_ID; + +struct nu_module +{ + char *name; + void *m_pvBase; + uint32_t u32RstId; + IRQn_Type eIRQn; +} ; +typedef struct nu_module *nu_module_t; + +typedef struct +{ + vu32 vu32RegAddr; + char *szRegName; + vu32 vu32BitMask; + char *szBMName; + vu32 vu32Value; + char *szVName; +} S_NU_REG; + +#define SYS_GPA_MFPL (SYS_BASE + 0x0080U) +#define SYS_GPA_MFPH (SYS_BASE + 0x0084U) +#define SYS_GPB_MFPL (SYS_BASE + 0x0088U) +#define SYS_GPB_MFPH (SYS_BASE + 0x008CU) +#define SYS_GPC_MFPL (SYS_BASE + 0x0090U) +#define SYS_GPC_MFPH (SYS_BASE + 0x0094U) +#define SYS_GPD_MFPL (SYS_BASE + 0x0098U) +#define SYS_GPD_MFPH (SYS_BASE + 0x009CU) +#define SYS_GPE_MFPL (SYS_BASE + 0x00A0U) +#define SYS_GPE_MFPH (SYS_BASE + 0x00A4U) +#define SYS_GPF_MFPL (SYS_BASE + 0x00A8U) +#define SYS_GPF_MFPH (SYS_BASE + 0x00ACU) +#define SYS_GPG_MFPL (SYS_BASE + 0x00B0U) +#define SYS_GPG_MFPH (SYS_BASE + 0x00B4U) +#define SYS_GPH_MFPL (SYS_BASE + 0x00B8U) +#define SYS_GPH_MFPH (SYS_BASE + 0x00BCU) +#define SYS_GPI_MFPL (SYS_BASE + 0x00C0U) +#define SYS_GPI_MFPH (SYS_BASE + 0x00C4U) +#define SYS_GPJ_MFPL (SYS_BASE + 0x00C8U) +#define SYS_GPJ_MFPH (SYS_BASE + 0x00CCU) +#define SYS_GPK_MFPL (SYS_BASE + 0x00D0U) +#define SYS_GPK_MFPH (SYS_BASE + 0x00D4U) +#define SYS_GPL_MFPL (SYS_BASE + 0x00D8U) +#define SYS_GPL_MFPH (SYS_BASE + 0x00DCU) +#define SYS_GPM_MFPL (SYS_BASE + 0x00E0U) +#define SYS_GPM_MFPH (SYS_BASE + 0x00E4U) +#define SYS_GPN_MFPL (SYS_BASE + 0x00E8U) +#define SYS_GPN_MFPH (SYS_BASE + 0x00ECU) + +#define SYS_USBPMISCR (SYS_BASE + 0x0060U) +#define SYS_USBP0PCR (SYS_BASE + 0x0064U) +#define SYS_USBP1PCR (SYS_BASE + 0x0068U) + +#define CLK_PWRCTL (CLK_BASE + 0x0000U) +#define CLK_SYSCLK0 (CLK_BASE + 0x0004U) +#define CLK_SYSCLK1 (CLK_BASE + 0x0008U) +#define CLK_APBCLK0 (CLK_BASE + 0x000CU) +#define CLK_APBCLK1 (CLK_BASE + 0x0010U) +#define CLK_APBCLK2 (CLK_BASE + 0x0014U) +#define CLK_CLKSEL0 (CLK_BASE + 0x0018U) +#define CLK_CLKSEL1 (CLK_BASE + 0x001CU) +#define CLK_CLKSEL2 (CLK_BASE + 0x0020U) +#define CLK_CLKSEL3 (CLK_BASE + 0x0024U) +#define CLK_CLKSEL4 (CLK_BASE + 0x0028U) + +#define CLK_CLKDIV0 (CLK_BASE + 0x002CU) +#define CLK_CLKDIV1 (CLK_BASE + 0x0030U) +#define CLK_CLKDIV2 (CLK_BASE + 0x0034U) +#define CLK_CLKDIV3 (CLK_BASE + 0x0038U) +#define CLK_CLKDIV4 (CLK_BASE + 0x003CU) +#define CLK_CLKOCTL (CLK_BASE + 0x0040U) + +#define NUREG_EXPORT(vu32RegAddr, vu32BitMask, vu32Value) { vu32RegAddr, #vu32RegAddr, vu32BitMask, #vu32BitMask, vu32Value, #vu32Value } + +void nu_clock_base_init(void); +void nu_sys_ip_reset(uint32_t u32ModuleIndex); +void nu_sys_ipclk_enable(uint32_t eIPClkIdx); +void nu_sys_ipclk_disable(uint32_t eIPClkIdx); +E_SYS_USB0_ID nu_sys_usb0_role(void); +void nu_sys_check_register(S_NU_REG *psNuReg); + +#endif diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys_i2c0.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys_i2c0.c new file mode 100644 index 0000000000..9871daf6fb --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys_i2c0.c @@ -0,0 +1,303 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-11-11 Wayne First version +* +******************************************************************************/ + +#include +#include "NuMicro.h" + +#define ERROR rt_kprintf +#define RETRY_COUNT 3 +/*---------------------------------------------------------------------------------------------------------*/ +/* Global variables */ +/*---------------------------------------------------------------------------------------------------------*/ +static uint8_t g_u8DeviceAddr = 0xB0; +static uint8_t g_uPageNum; +static uint8_t g_u8RegAddr; +static uint8_t g_u8WriteData; + +static volatile uint8_t g_u8RxData; +static volatile uint8_t g_u8DataLen; +static volatile uint8_t g_u8EndFlag = 0; + +static void I2C0_MasterRx(uint32_t u32Status) +{ + if (u32Status == 0x08) + { + /* START has been transmitted and prepare SLA+W */ + I2C0->DAT = g_u8DeviceAddr | (g_uPageNum << 1); + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | I2C_CTL_SI; + } + else if (u32Status == 0x18) + { + /* SLA+W has been transmitted and ACK has been received */ + I2C0->DAT = g_u8RegAddr; + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | I2C_CTL_SI; + } + else if (u32Status == 0x20) + { + /* SLA+W has been transmitted and NACK has been received */ + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | (I2C_CTL_STA | I2C_CTL_STO | I2C_CTL_SI); + } + else if (u32Status == 0x28) + { + /* DATA has been transmitted and ACK has been received */ + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | (I2C_CTL_STA | I2C_CTL_SI); // repeat start + } + else if (u32Status == 0x10) + { + /* Repeat START has been transmitted and prepare SLA+R */ + I2C0->DAT = (g_u8DeviceAddr | (g_uPageNum << 1)) | 0x01; + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | I2C_CTL_SI; + } + else if (u32Status == 0x40) + { + /* SLA+R has been transmitted and ACK has been received */ + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | I2C_CTL_SI; + } + else if (u32Status == 0x58) + { + /* DATA has been received and NACK has been returned */ + g_u8RxData = I2C0->DAT; + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | (I2C_CTL_STO | I2C_CTL_SI); + g_u8EndFlag = 1; + } + else + { + ERROR("Status 0x%x is NOT processed\n", u32Status); + } +} + +static void I2C0_MasterTx(uint32_t u32Status) +{ + if (u32Status == 0x08) + { + /* START has been transmitted */ + I2C0->DAT = g_u8DeviceAddr | (g_uPageNum << 1); /* Write SLA+W to Register I2CDAT */ + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | I2C_CTL_SI; + } + else if (u32Status == 0x18) + { + /* SLA+W has been transmitted and ACK has been received */ + I2C0->DAT = g_u8RegAddr; + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | I2C_CTL_SI; + } + else if (u32Status == 0x20) + { + /* SLA+W has been transmitted and NACK has been received */ + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | (I2C_CTL_STA | I2C_CTL_STO | I2C_CTL_SI); + } + else if (u32Status == 0x28) + { + /* DATA has been transmitted and ACK has been received */ + if ((g_u8DataLen == 0) && (g_u8EndFlag == 0)) + { + I2C0->DAT = g_u8WriteData; + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | I2C_CTL_SI; + g_u8DataLen++; + } + else + { + g_u8DataLen = 0; + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | (I2C_CTL_STO | I2C_CTL_SI); + g_u8EndFlag = 1; + } + } + else + { + ERROR("Status 0x%x is NOT processed\n", u32Status); + } +} + +static uint32_t ma35d1_write_i2c_data(uint32_t u32Addr, uint32_t u32Data) +{ + uint32_t I2C_TIME_OUT_COUNT = 0x20000; + uint32_t u32Status; + uint32_t u32time_out = 0; + + g_uPageNum = 0; + if (g_uPageNum == 0xff) + { + ERROR("\n address error !!\n"); + return 0; + } + + g_u8RegAddr = u32Addr; + g_u8WriteData = u32Data; + g_u8EndFlag = 0x0; + + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | I2C_CTL_STA; + + while (1) + { + if (I2C0->CTL0 & I2C_CTL_SI) + { + u32time_out = 0; + u32Status = I2C0->STATUS0; + I2C0_MasterTx(u32Status); + } + + if (g_u8EndFlag) + { + break; + } + u32time_out++; + if (u32time_out > I2C_TIME_OUT_COUNT) + { + ERROR("i2c Write Time Out!\n"); + return 0; // error + } + } + return 1; +} + +static uint32_t ma35d1_read_i2c_data(uint32_t u32Addr, uint32_t *pu32Data) +{ + uint32_t I2C_TIME_OUT_COUNT = 0x200000; + uint32_t u32Status; + uint32_t u32time_out = 0; + + g_uPageNum = 0; + if (g_uPageNum == 0xff) + { + ERROR("\n address error !!\n"); + return 0; + } + + g_u8RegAddr = u32Addr; + g_u8EndFlag = 0x0; + + I2C0->CTL0 = (I2C0->CTL0 & ~0x3c) | I2C_CTL_STA; + + while (1) + { + if (I2C0->CTL0 & I2C_CTL_SI) + { + u32time_out = 0; + u32Status = I2C0->STATUS0; + I2C0_MasterRx(u32Status); + } + + if (g_u8EndFlag) + { + break; + } + + u32time_out++; + if (u32time_out > I2C_TIME_OUT_COUNT) + { + ERROR("i2c Read Time Out!\n"); + return 1; // error + } + } + + *pu32Data = g_u8RxData; + return 2; +} + +static uint32_t ma35d1_read_pmic_data(uint32_t u32Addr, uint32_t *pu32Data) +{ + uint32_t j = RETRY_COUNT; + + while (j-- > 0) + { + if (ma35d1_read_i2c_data(u32Addr, pu32Data) == 2) + { + break; + } + } + + if (j <= 0) + { + ERROR("\n READ ERROR! \n"); + return 0; + } + + return 1; +} + +static uint32_t ma35d1_write_pmic_data(uint32_t u32Addr, uint32_t u32Data) +{ + uint32_t j = RETRY_COUNT; + + while (j-- > 0) + { + if (ma35d1_write_i2c_data(u32Addr, u32Data) == 1) + { + break; + } + } + + if (j <= 0) + { + ERROR("\n WRITE ERROR [%d]! \n", j); + return 0; + } + + return 1; +} + +static void ma35d1_i2c0_init(uint32_t sys_clk) +{ + unsigned long clk_rate; + uint32_t u32Div, speed; + + outpw((void *)0x40460208, inpw((void *)0x40460208) | (0x3fff << 16)); // enable GPIO clock + outpw((void *)0x40460210, inpw((void *)0x40460210) | (0x1 << 0)); // I2C0 CLK + + outpw(0x40460098, ((inpw(0x40460098) & ~0x0f000000) | (0x6 << 24))); // PD.6 I2C0_SDA + outpw(0x40460098, ((inpw(0x40460098) & ~0xf0000000) | (0x6 << 28))); // PD.7 I2C0_CLK + outpw(0x400400F0, 0x5 << 12); // pull high + + /* i2c_clk = 100KHz */ + clk_rate = sys_clk; + speed = 100 * 1000; + + /* assume speed above 1000 are Hz-specified */ + if (speed > 1000) speed = speed / 1000; + if (speed > 400) speed = 400; + + u32Div = (uint32_t)(((clk_rate * 10U) / (speed * 4U) + 5U) / 10U - 1U); + + I2C0->CLKDIV = u32Div; + I2C0->CTL0 = I2C0->CTL0 | I2C_CTL0_I2CEN_Msk; /* i2c enable */ +} + +uint32_t ma35d1_set_cpu_voltage(uint32_t sys_clk, uint32_t u32Vol) +{ + /* + RegValue = (Voltage - 0.3) / 0.01 + RegValue(hex) Voltage(v) + 0x5B 1.22 + 0x5C 1.23 + 0x5D 1.24 + 0x5F 1.25 + 0x60 1.26 + 0x61 1.27 + 0x62 1.28 + 0x63 1.29 + 0x64 1.30 + 0x65 1.31 + 0x66 1.32 + 0x67 1.33 + 0x68 1.34 + 0x69 1.35 + */ + uint32_t u32Data = 0; + + if ((u32Vol < 0x59) || (u32Vol > 0x68)) + return 0; + + ma35d1_i2c0_init(sys_clk); + ma35d1_write_pmic_data(0xA4, u32Vol); + ma35d1_read_pmic_data(0xA4, &u32Data); + + return (u32Data == u32Vol); +} diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_timer.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_timer.c new file mode 100644 index 0000000000..5b98e49718 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_timer.c @@ -0,0 +1,307 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-9-17 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER) + +#include +#include "NuMicro.h" +#include + +/* Private define ---------------------------------------------------------------*/ +#define NU_TIMER_DEVICE(timer) (nu_timer_t)(timer) + +enum +{ + TIMER_START = -1, +#if defined(BSP_USING_TIMER0) + TIMER0_IDX, +#endif +#if defined(BSP_USING_TIMER1) + TIMER1_IDX, +#endif +#if defined(BSP_USING_TIMER2) + TIMER2_IDX, +#endif +#if defined(BSP_USING_TIMER3) + TIMER3_IDX, +#endif +#if defined(BSP_USING_TIMER4) + TIMER4_IDX, +#endif +#if defined(BSP_USING_TIMER5) + TIMER5_IDX, +#endif +#if defined(BSP_USING_TIMER6) + TIMER6_IDX, +#endif +#if defined(BSP_USING_TIMER7) + TIMER7_IDX, +#endif +#if defined(BSP_USING_TIMER8) + TIMER8_IDX, +#endif +#if defined(BSP_USING_TIMER9) + TIMER9_IDX, +#endif +#if defined(BSP_USING_TIMER10) + TIMER10_IDX, +#endif +#if defined(BSP_USING_TIMER11) + TIMER11_IDX, +#endif + TIMER_CNT +}; + +/* Private typedef --------------------------------------------------------------*/ +struct nu_timer +{ + rt_hwtimer_t parent; + char *name; + TIMER_T *base; + IRQn_Type irqn; + uint32_t rstidx; + uint32_t modid; +}; +typedef struct nu_timer *nu_timer_t; + +/* Private functions ------------------------------------------------------------*/ +static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state); +static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode); +static void nu_timer_stop(rt_hwtimer_t *timer); +static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer); +static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); + +/* Public functions -------------------------------------------------------------*/ + + +/* Private variables ------------------------------------------------------------*/ +static struct nu_timer nu_timer_arr [] = +{ +#if defined(BSP_USING_TIMER0) + { .name = "timer0", .base = TIMER0, .irqn = TMR0_IRQn, .rstidx = TMR0_RST, .modid = TMR0_MODULE }, +#endif +#if defined(BSP_USING_TIMER1) + { .name = "timer1", .base = TIMER1, .irqn = TMR1_IRQn, .rstidx = TMR1_RST, .modid = TMR1_MODULE }, +#endif +#if defined(BSP_USING_TIMER2) + { .name = "timer2", .base = TIMER2, .irqn = TMR2_IRQn, .rstidx = TMR2_RST, .modid = TMR2_MODULE }, +#endif +#if defined(BSP_USING_TIMER3) + { .name = "timer3", .base = TIMER3, .irqn = TMR3_IRQn, .rstidx = TMR3_RST, .modid = TMR3_MODULE }, +#endif +#if defined(BSP_USING_TIMER4) + { .name = "timer4", .base = TIMER4, .irqn = TMR4_IRQn, .rstidx = TMR4_RST, .modid = TMR4_MODULE }, +#endif +#if defined(BSP_USING_TIMER5) + { .name = "timer5", .base = TIMER5, .irqn = TMR5_IRQn, .rstidx = TMR5_RST, .modid = TMR5_MODULE }, +#endif +#if defined(BSP_USING_TIMER6) + { .name = "timer6", .base = TIMER6, .irqn = TMR6_IRQn, .rstidx = TMR6_RST, .modid = TMR6_MODULE }, +#endif +#if defined(BSP_USING_TIMER7) + { .name = "timer7", .base = TIMER7, .irqn = TMR7_IRQn, .rstidx = TMR7_RST, .modid = TMR7_MODULE }, +#endif +#if defined(BSP_USING_TIMER8) + { .name = "timer8", .base = TIMER8, .irqn = TMR8_IRQn, .rstidx = TMR8_RST, .modid = TMR8_MODULE }, +#endif +#if defined(BSP_USING_TIMER9) + { .name = "timer9", .base = TIMER9, .irqn = TMR9_IRQn, .rstidx = TMR9_RST, .modid = TMR9_MODULE }, +#endif +#if defined(BSP_USING_TIMER10) + { .name = "timer10", .base = TIMER10, .irqn = TMR10_IRQn, .rstidx = TMR10_RST, .modid = TMR10_MODULE }, +#endif +#if defined(BSP_USING_TIMER11) + { .name = "timer11", .base = TIMER11, .irqn = TMR11_IRQn, .rstidx = TMR11_RST, .modid = TMR11_MODULE }, +#endif +}; + +static struct rt_hwtimer_info nu_timer_info = +{ + __HXT, /* maximum count frequency */ + (__HXT / 256), /* minimum count frequency */ + 0xFFFFFF, /* the maximum counter value */ + HWTIMER_CNTMODE_UP, /* Increment or Decreasing count mode */ +}; + +static struct rt_hwtimer_ops nu_timer_ops = +{ + nu_timer_init, + nu_timer_start, + nu_timer_stop, + nu_timer_count_get, + nu_timer_control +}; + +/* Functions define ------------------------------------------------------------*/ +static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) +{ + nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); + RT_ASSERT(psNuTmr != RT_NULL); + + if (1 == state) + { + uint32_t timer_clk; + struct rt_hwtimer_info *info = &nu_timer_info; + + timer_clk = TIMER_GetModuleClock(psNuTmr->base); + info->maxfreq = timer_clk; + info->minfreq = timer_clk / 256; + TIMER_Open(psNuTmr->base, TIMER_ONESHOT_MODE, 1); + TIMER_EnableInt(psNuTmr->base); + rt_hw_interrupt_umask(psNuTmr->irqn); + } + else + { + rt_hw_interrupt_mask(psNuTmr->irqn); + TIMER_DisableInt(psNuTmr->base); + TIMER_Close(psNuTmr->base); + } +} + +static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode) +{ + rt_err_t ret = RT_EINVAL; + rt_uint32_t u32OpMode; + + nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); + RT_ASSERT(psNuTmr != RT_NULL); + + if (cnt <= 1 || cnt > 0xFFFFFF) + { + goto exit_nu_timer_start; + } + + switch (opmode) + { + case HWTIMER_MODE_PERIOD: + u32OpMode = TIMER_PERIODIC_MODE; + break; + + case HWTIMER_MODE_ONESHOT: + u32OpMode = TIMER_ONESHOT_MODE; + break; + + default: + goto exit_nu_timer_start; + } + + TIMER_SET_CMP_VALUE(psNuTmr->base, cnt); + TIMER_SET_OPMODE(psNuTmr->base, u32OpMode); + TIMER_EnableInt(psNuTmr->base); + rt_hw_interrupt_umask(psNuTmr->irqn); + + TIMER_Start(psNuTmr->base); + + ret = RT_EOK; + +exit_nu_timer_start: + + return -(ret); +} + +static void nu_timer_stop(rt_hwtimer_t *timer) +{ + nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); + RT_ASSERT(psNuTmr != RT_NULL); + + rt_hw_interrupt_mask(psNuTmr->irqn); + TIMER_DisableInt(psNuTmr->base); + TIMER_Stop(psNuTmr->base); + TIMER_ResetCounter(psNuTmr->base); +} + +static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) +{ + nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); + RT_ASSERT(psNuTmr != RT_NULL); + + return TIMER_GetCounter(psNuTmr->base); +} + +static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +{ + rt_err_t ret = RT_EOK; + nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); + RT_ASSERT(psNuTmr != RT_NULL); + + switch (cmd) + { + case HWTIMER_CTRL_FREQ_SET: + { + uint32_t clk; + uint32_t pre; + + clk = TIMER_GetModuleClock(psNuTmr->base); + pre = clk / *((uint32_t *)args) - 1; + TIMER_SET_PRESCALE_VALUE(psNuTmr->base, pre); + *((uint32_t *)args) = clk / (pre + 1) ; + } + break; + + case HWTIMER_CTRL_STOP: + TIMER_Stop(psNuTmr->base); + break; + + default: + ret = RT_EINVAL; + break; + } + + return -(ret); +} + +/** + * All UART interrupt service routine + */ +static void nu_timer_isr(int vector, void *param) +{ + nu_timer_t psNuTmr = NU_TIMER_DEVICE(param); + RT_ASSERT(psNuTmr != RT_NULL); + + if (TIMER_GetIntFlag(psNuTmr->base)) + { + TIMER_ClearIntFlag(psNuTmr->base); + rt_device_hwtimer_isr(&psNuTmr->parent); + } +} + +int rt_hw_timer_init(void) +{ + int i; + rt_err_t ret = RT_EOK; + for (i = (TIMER_START + 1); i < TIMER_CNT; i++) + { + CLK_EnableModuleClock(nu_timer_arr[i].modid); + + SYS_ResetModule(nu_timer_arr[i].rstidx); + + /* Register Timer information. */ + nu_timer_arr[i].parent.info = &nu_timer_info; + + /* Register Timer operation. */ + nu_timer_arr[i].parent.ops = &nu_timer_ops; + + /* Register Timer interrupt service routine. */ + rt_hw_interrupt_install(nu_timer_arr[i].irqn, nu_timer_isr, &nu_timer_arr[i], nu_timer_arr[i].name); + + /* Register RT hwtimer device. */ + ret = rt_device_hwtimer_register(&nu_timer_arr[i].parent, nu_timer_arr[i].name, &nu_timer_arr[i]); + RT_ASSERT(ret == RT_EOK); + } + return 0; +} + +INIT_BOARD_EXPORT(rt_hw_timer_init); + +#endif //#if defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_tpwm.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_tpwm.c new file mode 100644 index 0000000000..7cf2c4ae22 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_tpwm.c @@ -0,0 +1,265 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-9-22 Wayne First version +* +* Note: 2 channels of a tpwm have the same output. +******************************************************************************/ + +#include + +#if (defined(BSP_USING_TPWM) && defined(RT_USING_PWM)) + +#define LOG_TAG "drv.tpwm" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL DBG_INFO +#define TPWM_CHANNEL_NUM 2 +#include + +#include +#include "NuMicro.h" +#include + +/* Private define ---------------------------------------------------------------*/ +#define NU_TPWM_DEVICE(tpwm) (nu_tpwm_t)(tpwm) + +enum +{ + TPWM_START = -1, +#if defined(BSP_USING_TPWM0) + TPWM0_IDX, +#endif +#if defined(BSP_USING_TPWM1) + TPWM1_IDX, +#endif +#if defined(BSP_USING_TPWM2) + TPWM2_IDX, +#endif +#if defined(BSP_USING_TPWM3) + TPWM3_IDX, +#endif +#if defined(BSP_USING_TPWM4) + TPWM4_IDX, +#endif +#if defined(BSP_USING_TPWM5) + TPWM5_IDX, +#endif +#if defined(BSP_USING_TPWM6) + TPWM6_IDX, +#endif +#if defined(BSP_USING_TPWM7) + TPWM7_IDX, +#endif +#if defined(BSP_USING_TPWM8) + TPWM8_IDX, +#endif +#if defined(BSP_USING_TPWM9) + TPWM9_IDX, +#endif +#if defined(BSP_USING_TPWM10) + TPWM10_IDX, +#endif +#if defined(BSP_USING_TPWM11) + TPWM11_IDX, +#endif + TPWM_CNT +}; + +/* Private typedef --------------------------------------------------------------*/ +struct nu_tpwm +{ + struct rt_device_pwm tpwm_dev; + char *name; + TIMER_T *base; + uint32_t rstidx; + uint32_t modid; + rt_uint32_t channel_mask; //TPWM_CH0 | TPWM_CH1 +} ; + +typedef struct nu_tpwm *nu_tpwm_t; + +/* Private functions ------------------------------------------------------------*/ +static rt_err_t nu_tpwm_enable(struct rt_device_pwm *tpwm_dev, struct rt_pwm_configuration *tpwm_config, rt_bool_t enable); +static rt_err_t nu_tpwm_set(struct rt_device_pwm *tpwm_dev, struct rt_pwm_configuration *tpwm_config); +static rt_err_t nu_tpwm_get(struct rt_device_pwm *tpwm_dev, struct rt_pwm_configuration *tpwm_config); +static rt_err_t nu_tpwm_control(struct rt_device_pwm *tpwm_dev, int cmd, void *arg); + +/* Private variables ------------------------------------------------------------*/ +static struct nu_tpwm nu_tpwm_arr [] = +{ +#if defined(BSP_USING_TPWM0) + { .name = "tpwm0", .base = TIMER0, .rstidx = TMR0_RST, .modid = TMR0_MODULE }, +#endif +#if defined(BSP_USING_TPWM1) + { .name = "tpwm1", .base = TIMER1, .rstidx = TMR1_RST, .modid = TMR1_MODULE }, +#endif +#if defined(BSP_USING_TPWM2) + { .name = "tpwm2", .base = TIMER2, .rstidx = TMR2_RST, .modid = TMR2_MODULE }, +#endif +#if defined(BSP_USING_TPWM3) + { .name = "tpwm3", .base = TIMER3, .rstidx = TMR3_RST, .modid = TMR3_MODULE }, +#endif +#if defined(BSP_USING_TPWM4) + { .name = "tpwm4", .base = TIMER4, .rstidx = TMR4_RST, .modid = TMR4_MODULE }, +#endif +#if defined(BSP_USING_TPWM5) + { .name = "tpwm5", .base = TIMER5, .rstidx = TMR5_RST, .modid = TMR5_MODULE }, +#endif +#if defined(BSP_USING_TPWM6) + { .name = "tpwm6", .base = TIMER6, .rstidx = TMR6_RST, .modid = TMR6_MODULE }, +#endif +#if defined(BSP_USING_TPWM7) + { .name = "tpwm7", .base = TIMER7, .rstidx = TMR7_RST, .modid = TMR7_MODULE }, +#endif +#if defined(BSP_USING_TPWM8) + { .name = "tpwm8", .base = TIMER8, .rstidx = TMR8_RST, .modid = TMR8_MODULE }, +#endif +#if defined(BSP_USING_TPWM9) + { .name = "tpwm9", .base = TIMER9, .rstidx = TMR9_RST, .modid = TMR9_MODULE }, +#endif +#if defined(BSP_USING_TPWM10) + { .name = "tpwm10", .base = TIMER10, .rstidx = TMR10_RST, .modid = TMR10_MODULE }, +#endif +#if defined(BSP_USING_TPWM11) + { .name = "tpwm11", .base = TIMER11, .rstidx = TMR11_RST, .modid = TMR11_MODULE }, +#endif +}; + +static struct rt_pwm_ops nu_tpwm_ops = +{ + nu_tpwm_control +}; + +/* Functions define ------------------------------------------------------------*/ +static rt_err_t nu_tpwm_enable(struct rt_device_pwm *tpwm_dev, struct rt_pwm_configuration *tpwm_config, rt_bool_t enable) +{ + rt_err_t result = RT_EOK; + rt_uint32_t tpwm_channel = tpwm_config->channel; + nu_tpwm_t psNuTPWM = NU_TPWM_DEVICE(tpwm_dev->parent.user_data); + + if (enable == RT_TRUE) + { + if (psNuTPWM->channel_mask == 0) + { + TPWM_START_COUNTER(psNuTPWM->base); + } + psNuTPWM->channel_mask |= (1 << tpwm_channel); + TPWM_ENABLE_OUTPUT(psNuTPWM->base, psNuTPWM->channel_mask); + } + else + { + psNuTPWM->channel_mask &= ~(1 << tpwm_channel); + TPWM_ENABLE_OUTPUT(psNuTPWM->base, psNuTPWM->channel_mask); + if (psNuTPWM->channel_mask == 0) + { + TPWM_STOP_COUNTER(psNuTPWM->base); + } + } + + return result; +} + +static rt_err_t nu_tpwm_set(struct rt_device_pwm *tpwm_dev, struct rt_pwm_configuration *tpwm_config) +{ + if (tpwm_config->period <= 0) + return -(RT_ERROR); + + rt_uint32_t tpwm_freq, tpwm_dutycycle ; + rt_uint32_t tpwm_period = tpwm_config->period; + rt_uint32_t tpwm_pulse = tpwm_config->pulse; + nu_tpwm_t psNuTPWM = NU_TPWM_DEVICE(tpwm_dev->parent.user_data); + + //rt_uint32_t pre_tpwm_prescaler = TPWM_GET_PRESCALER(psNuTPWM->base); + + tpwm_freq = 1000000000 / tpwm_period; + tpwm_dutycycle = (tpwm_pulse * 100) / tpwm_period; + + TPWM_ConfigOutputFreqAndDuty(psNuTPWM->base, tpwm_freq, tpwm_dutycycle) ; + + return RT_EOK; +} + +static rt_err_t nu_tpwm_get(struct rt_device_pwm *tpwm_dev, struct rt_pwm_configuration *tpwm_config) +{ + rt_uint32_t tpwm_real_period, tpwm_real_duty, time_tick, u32TPWMClockFreq ; + + nu_tpwm_t psNuTPWM = NU_TPWM_DEVICE(tpwm_dev->parent.user_data); + rt_uint32_t tpwm_prescale = TPWM_GET_PRESCALER(psNuTPWM->base); + rt_uint32_t tpwm_period = TPWM_GET_PERIOD(psNuTPWM->base); + rt_uint32_t tpwm_pulse = TPWM_GET_CMPDAT(psNuTPWM->base); + + u32TPWMClockFreq = TIMER_GetModuleClock(psNuTPWM->base); + time_tick = (uint64_t)1000000000000 / u32TPWMClockFreq; + + LOG_I("%s reg--> %d %d %d %d %d\n", psNuTPWM->name, tpwm_prescale, tpwm_period, tpwm_pulse, u32TPWMClockFreq, time_tick); + + tpwm_real_period = (((tpwm_prescale + 1) * (tpwm_period + 1)) * time_tick) / 1000; + tpwm_real_duty = (((tpwm_prescale + 1) * tpwm_pulse * time_tick)) / 1000; + tpwm_config->period = tpwm_real_period; + tpwm_config->pulse = tpwm_real_duty; + + LOG_I("%s %d %d %d\n", psNuTPWM->name, tpwm_config->channel, tpwm_config->period, tpwm_config->pulse); + + return RT_EOK; +} + +static rt_err_t nu_tpwm_control(struct rt_device_pwm *tpwm_dev, int cmd, void *arg) +{ + struct rt_pwm_configuration *tpwm_config = (struct rt_pwm_configuration *)arg; + + RT_ASSERT(tpwm_dev != RT_NULL); + RT_ASSERT(tpwm_config != RT_NULL); + + nu_tpwm_t psNuTPWM = NU_TPWM_DEVICE(tpwm_dev->parent.user_data); + RT_ASSERT(psNuTPWM != RT_NULL); + RT_ASSERT(psNuTPWM->base != RT_NULL); + + if ((tpwm_config->channel + 1) > TPWM_CHANNEL_NUM) + return -(RT_ERROR); + + switch (cmd) + { + case PWM_CMD_ENABLE: + return nu_tpwm_enable(tpwm_dev, tpwm_config, RT_TRUE); + case PWM_CMD_DISABLE: + return nu_tpwm_enable(tpwm_dev, tpwm_config, RT_FALSE); + case PWM_CMD_SET: + return nu_tpwm_set(tpwm_dev, tpwm_config); + case PWM_CMD_GET: + return nu_tpwm_get(tpwm_dev, tpwm_config); + default: + break; + } + return -(RT_EINVAL); +} + +int rt_hw_tpwm_init(void) +{ + int i; + rt_err_t ret = RT_EOK; + for (i = (TPWM_START + 1); i < TPWM_CNT; i++) + { + nu_tpwm_arr[i].channel_mask = 0; + + CLK_EnableModuleClock(nu_tpwm_arr[i].modid); + + SYS_ResetModule(nu_tpwm_arr[i].rstidx); + + TPWM_ENABLE_PWM_MODE(nu_tpwm_arr[i].base); + + /* Register RT PWM device. */ + ret = rt_device_pwm_register(&nu_tpwm_arr[i].tpwm_dev, nu_tpwm_arr[i].name, &nu_tpwm_ops, &nu_tpwm_arr[i]); + RT_ASSERT(ret == RT_EOK); + } + return 0; +} + +INIT_DEVICE_EXPORT(rt_hw_tpwm_init); + +#endif //#if (defined(BSP_USING_TPWM) && defined(RT_USING_PWM)) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_uart.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_uart.c new file mode 100644 index 0000000000..ce80525109 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_uart.c @@ -0,0 +1,1071 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-12-12 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_UART) + +#include +#include "drv_uart.h" +#include "drv_sys.h" +#include "drv_common.h" + +#if defined(RT_SERIAL_USING_DMA) + #include +#endif + +/* Private define ---------------------------------------------------------------*/ +enum +{ + UART_START = -1, +#if defined(BSP_USING_UART0) + UART0_IDX, +#endif +#if defined(BSP_USING_UART1) + UART1_IDX, +#endif +#if defined(BSP_USING_UART2) + UART2_IDX, +#endif +#if defined(BSP_USING_UART3) + UART3_IDX, +#endif +#if defined(BSP_USING_UART4) + UART4_IDX, +#endif +#if defined(BSP_USING_UART5) + UART5_IDX, +#endif +#if defined(BSP_USING_UART6) + UART6_IDX, +#endif +#if defined(BSP_USING_UART7) + UART7_IDX, +#endif +#if defined(BSP_USING_UART8) + UART8_IDX, +#endif +#if defined(BSP_USING_UART9) + UART9_IDX, +#endif +#if defined(BSP_USING_UART10) + UART10_IDX, +#endif +#if defined(BSP_USING_UART11) + UART11_IDX, +#endif +#if defined(BSP_USING_UART12) + UART12_IDX, +#endif +#if defined(BSP_USING_UART13) + UART13_IDX, +#endif +#if defined(BSP_USING_UART14) + UART14_IDX, +#endif +#if defined(BSP_USING_UART15) + UART15_IDX, +#endif +#if defined(BSP_USING_UART16) + UART16_IDX, +#endif + UART_CNT +}; + +/* Private typedef --------------------------------------------------------------*/ +struct nu_uart +{ + rt_serial_t dev; + char *name; + UART_T *uart_base; + IRQn_Type irqn; + uint32_t rstidx; + +#if defined(RT_SERIAL_USING_DMA) + uint32_t dma_flag; + int16_t pdma_perp_tx; + int8_t pdma_chanid_tx; + + int16_t pdma_perp_rx; + int8_t pdma_chanid_rx; + int32_t rx_write_offset; + int32_t rxdma_trigger_len; + + nu_pdma_desc_t pdma_rx_desc; +#endif + +}; +typedef struct nu_uart *nu_uart_t; + +/* Private functions ------------------------------------------------------------*/ +static rt_err_t nu_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg); +static rt_err_t nu_uart_control(struct rt_serial_device *serial, int cmd, void *arg); +static int nu_uart_send(struct rt_serial_device *serial, char c); +static int nu_uart_receive(struct rt_serial_device *serial); + +#if defined(RT_SERIAL_USING_DMA) + static rt_size_t nu_uart_dma_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction); + static void nu_pdma_uart_rx_cb(void *pvOwner, uint32_t u32Events); + static void nu_pdma_uart_tx_cb(void *pvOwner, uint32_t u32Events); +#endif + +/* Public functions ------------------------------------------------------------*/ + +/* Private variables ------------------------------------------------------------*/ + +static const struct rt_uart_ops nu_uart_ops = +{ + .configure = nu_uart_configure, + .control = nu_uart_control, + .putc = nu_uart_send, + .getc = nu_uart_receive, +#if defined(RT_SERIAL_USING_DMA) + .dma_transmit = nu_uart_dma_transmit +#else + .dma_transmit = RT_NULL +#endif +}; + +static const struct serial_configure nu_uart_default_config = + RT_SERIAL_CONFIG_DEFAULT; + +static struct nu_uart nu_uart_arr [] = +{ +#if defined(BSP_USING_UART0) + { + .name = "uart0", + .uart_base = UART0, + .irqn = UART0_IRQn, + .rstidx = UART0_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART0_TX_DMA) + .pdma_perp_tx = PDMA_UART0_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART0_RX_DMA) + .pdma_perp_rx = PDMA_UART0_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART1) + { + .name = "uart1", + .uart_base = UART1, + .irqn = UART1_IRQn, + .rstidx = UART1_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART1_TX_DMA) + .pdma_perp_tx = PDMA_UART1_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART1_RX_DMA) + .pdma_perp_rx = PDMA_UART1_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART2) + { + .name = "uart2", + .uart_base = UART2, + .irqn = UART2_IRQn, + .rstidx = UART2_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART2_TX_DMA) + .pdma_perp_tx = PDMA_UART2_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART2_RX_DMA) + .pdma_perp_rx = PDMA_UART2_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART3) + { + .name = "uart3", + .uart_base = UART3, + .irqn = UART3_IRQn, + .rstidx = UART3_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART3_TX_DMA) + .pdma_perp_tx = PDMA_UART3_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART3_RX_DMA) + .pdma_perp_rx = PDMA_UART3_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART4) + { + .name = "uart4", + .uart_base = UART4, + .irqn = UART4_IRQn, + .rstidx = UART4_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART4_TX_DMA) + .pdma_perp_tx = PDMA_UART4_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART4_RX_DMA) + .pdma_perp_rx = PDMA_UART4_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART5) + { + .name = "uart5", + .uart_base = UART5, + .irqn = UART5_IRQn, + .rstidx = UART5_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART5_TX_DMA) + .pdma_perp_tx = PDMA_UART5_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART5_RX_DMA) + .pdma_perp_rx = PDMA_UART5_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART6) + { + .name = "uart6", + .uart_base = UART6, + .irqn = UART6_IRQn, + .rstidx = UART6_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART6_TX_DMA) + .pdma_perp_tx = PDMA_UART6_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART6_RX_DMA) + .pdma_perp_rx = PDMA_UART6_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART7) + { + .name = "uart7", + .uart_base = UART7, + .irqn = UART7_IRQn, + .rstidx = UART7_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART7_TX_DMA) + .pdma_perp_tx = PDMA_UART7_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART7_RX_DMA) + .pdma_perp_rx = PDMA_UART7_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART8) + { + .name = "uart8", + .uart_base = UART8, + .irqn = UART8_IRQn, + .rstidx = UART8_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART8_TX_DMA) + .pdma_perp_tx = PDMA_UART8_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART8_RX_DMA) + .pdma_perp_rx = PDMA_UART8_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART9) + { + .name = "uart9", + .uart_base = UART9, + .irqn = UART9_IRQn, + .rstidx = UART9_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART9_TX_DMA) + .pdma_perp_tx = PDMA_UART9_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART9_RX_DMA) + .pdma_perp_rx = PDMA_UART9_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART10) + { + .name = "uart10", + .uart_base = UART10, + .irqn = UART10_IRQn, + .rstidx = UART10_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART10_TX_DMA) + .pdma_perp_tx = PDMA_UART10_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART10_RX_DMA) + .pdma_perp_rx = PDMA_UART10_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART11) + { + .name = "uart11", + .uart_base = UART11, + .irqn = UART11_IRQn, + .rstidx = UART11_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART11_TX_DMA) + .pdma_perp_tx = PDMA_UART11_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART11_RX_DMA) + .pdma_perp_rx = PDMA_UART11_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART12) + { + .name = "uart12", + .uart_base = UART12, + .irqn = UART12_IRQn, + .rstidx = UART12_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART12_TX_DMA) + .pdma_perp_tx = PDMA_UART12_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART12_RX_DMA) + .pdma_perp_rx = PDMA_UART12_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART13) + { + .name = "uart13", + .uart_base = UART13, + .irqn = UART13_IRQn, + .rstidx = UART13_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART13_TX_DMA) + .pdma_perp_tx = PDMA_UART13_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART13_RX_DMA) + .pdma_perp_rx = PDMA_UART13_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART14) + { + .name = "uart14", + .uart_base = UART14, + .irqn = UART14_IRQn, + .rstidx = UART14_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART14_TX_DMA) + .pdma_perp_tx = PDMA_UART14_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART14_RX_DMA) + .pdma_perp_rx = PDMA_UART14_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART15) + { + .name = "uart15", + .uart_base = UART15, + .irqn = UART15_IRQn, + .rstidx = UART15_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART15_TX_DMA) + .pdma_perp_tx = PDMA_UART15_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART15_RX_DMA) + .pdma_perp_rx = PDMA_UART15_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +#if defined(BSP_USING_UART16) + { + .name = "uart16", + .uart_base = UART16, + .irqn = UART16_IRQn, + .rstidx = UART16_RST, + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_USING_UART16_TX_DMA) + .pdma_perp_tx = PDMA_UART16_TX, +#else + .pdma_perp_tx = NU_PDMA_UNUSED, +#endif +#if defined(BSP_USING_UART16_RX_DMA) + .pdma_perp_rx = PDMA_UART16_RX, + .rx_write_offset = 0, +#else + .pdma_perp_rx = NU_PDMA_UNUSED, +#endif +#endif + }, +#endif + +}; /* uart nu_uart */ + +/** + * All UART interrupt service routine + */ +static void nu_uart_isr(int vector, void *param) +{ + /* Get base address of uart register */ + nu_uart_t serial = (nu_uart_t)param; + UART_T *uart_base = serial->uart_base; + + /* Get interrupt event */ + uint32_t u32IntSts = uart_base->INTSTS; + uint32_t u32FIFOSts = uart_base->FIFOSTS; + +#if defined(RT_SERIAL_USING_DMA) + if (u32IntSts & UART_INTSTS_PRLSIF_Msk) + { + /* Drain RX FIFO to remove remain FEF frames in FIFO. */ + uart_base->FIFO |= UART_FIFO_RXRST_Msk; + uart_base->FIFOSTS |= (UART_FIFOSTS_BIF_Msk | UART_FIFOSTS_FEF_Msk | UART_FIFOSTS_PEF_Msk); + return; + } +#endif + + /* Handle RX event */ + if (u32IntSts & (UART_INTSTS_RDAINT_Msk | UART_INTSTS_RXTOINT_Msk)) + { + rt_hw_serial_isr(&serial->dev, RT_SERIAL_EVENT_RX_IND); + } + uart_base->INTSTS = u32IntSts; + uart_base->FIFOSTS = u32FIFOSts; +} + +/** + * Set RS-485 AUD mode + */ +void nu_uart_set_rs485aud(struct rt_serial_device *serial, rt_bool_t bRTSActiveLowLevel) +{ + UART_T *uart_base; + RT_ASSERT(serial); + + /* Get base address of uart register */ + uart_base = ((nu_uart_t)serial)->uart_base; + + /* Set RTS as RS-485 phy direction controlling ping. */ + UART_SelectRS485Mode(uart_base, UART_ALTCTL_RS485AUD_Msk, 0); + + if (bRTSActiveLowLevel) + { + /* Set direction pin as active-low. */ + uart_base->MODEM |= UART_MODEM_RTSACTLV_Msk; + } + else + { + /* Set direction pin as active-high. */ + uart_base->MODEM &= ~UART_MODEM_RTSACTLV_Msk; + } + + rt_kprintf("Set %s to RS-485 AUD function mode. ActiveLowLevel-%s\n", ((nu_uart_t)serial)->name, bRTSActiveLowLevel ? "YES" : "NO"); +} + +/** + * Configure uart port + */ +static rt_err_t nu_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +{ + rt_err_t ret = RT_EOK; + uint32_t uart_word_len = 0; + uint32_t uart_stop_bit = 0; + uint32_t uart_parity = 0; + + RT_ASSERT(serial); + RT_ASSERT(cfg); + + /* Check baudrate */ + RT_ASSERT(cfg->baud_rate != 0); + + /* Get base address of uart register */ + UART_T *uart_base = ((nu_uart_t)serial)->uart_base; + + /* Check word len */ + switch (cfg->data_bits) + { + case DATA_BITS_5: + uart_word_len = UART_WORD_LEN_5; + break; + + case DATA_BITS_6: + uart_word_len = UART_WORD_LEN_6; + break; + + case DATA_BITS_7: + uart_word_len = UART_WORD_LEN_7; + break; + + case DATA_BITS_8: + uart_word_len = UART_WORD_LEN_8; + break; + + default: + rt_kprintf("Unsupported data length\n"); + ret = RT_EINVAL; + goto exit_nu_uart_configure; + } + + /* Check stop bit */ + switch (cfg->stop_bits) + { + case STOP_BITS_1: + uart_stop_bit = UART_STOP_BIT_1; + break; + + case STOP_BITS_2: + uart_stop_bit = UART_STOP_BIT_2; + break; + + default: + rt_kprintf("Unsupported stop bit\n"); + ret = RT_EINVAL; + goto exit_nu_uart_configure; + } + + /* Check parity */ + switch (cfg->parity) + { + case PARITY_NONE: + uart_parity = UART_PARITY_NONE; + break; + + case PARITY_ODD: + uart_parity = UART_PARITY_ODD; + break; + + case PARITY_EVEN: + uart_parity = UART_PARITY_EVEN; + break; + + default: + rt_kprintf("Unsupported parity\n"); + ret = RT_EINVAL; + goto exit_nu_uart_configure; + } + + /* Reset this module */ + nu_sys_ip_reset(((nu_uart_t)serial)->rstidx); + + /* Open Uart and set UART Baudrate */ + UART_Open(uart_base, cfg->baud_rate); + + /* Set line configuration. */ + UART_SetLineConfig(uart_base, 0, uart_word_len, uart_parity, uart_stop_bit); + + /* Enable interrupt. */ + rt_hw_interrupt_umask(((nu_uart_t)serial)->irqn); + +exit_nu_uart_configure: + + if (ret != RT_EOK) + UART_Close(uart_base); + + return -(ret); +} + +#if defined(RT_SERIAL_USING_DMA) +static rt_err_t nu_pdma_uart_rx_config(struct rt_serial_device *serial, uint8_t *pu8Buf, int32_t i32TriggerLen) +{ + rt_err_t result = RT_EOK; + struct nu_pdma_chn_cb sChnCB; + nu_uart_t psNuUart = (nu_uart_t)serial; + + /* Get base address of uart register */ + UART_T *uart_base = psNuUart->uart_base; + + /* Register ISR callback function */ + sChnCB.m_eCBType = eCBType_Event; + sChnCB.m_pfnCBHandler = nu_pdma_uart_rx_cb; + sChnCB.m_pvUserData = (void *)serial; + + nu_pdma_filtering_set(psNuUart->pdma_chanid_rx, NU_PDMA_EVENT_TRANSFER_DONE | NU_PDMA_EVENT_TIMEOUT); + result = nu_pdma_callback_register(psNuUart->pdma_chanid_rx, &sChnCB); + + if (result != RT_EOK) + { + goto exit_nu_pdma_uart_rx_config; + } + + if (serial->config.bufsz == 0) + { + result = nu_pdma_transfer(((nu_uart_t)serial)->pdma_chanid_rx, + 8, + (uint32_t)uart_base, + (uint32_t)pu8Buf, + i32TriggerLen, + 1000); //Idle-timeout, 1ms + if (result != RT_EOK) + { + goto exit_nu_pdma_uart_rx_config; + } + } + else + { + /* For Serial RX FIFO - Single buffer recycle SG trigger */ + /* Link to next */ + nu_pdma_desc_t next = psNuUart->pdma_rx_desc; + + result = nu_pdma_desc_setup(psNuUart->pdma_chanid_rx, + psNuUart->pdma_rx_desc, + 8, + (uint32_t)uart_base, + (uint32_t)pu8Buf, + i32TriggerLen, + next, + 0); + if (result != RT_EOK) + { + goto exit_nu_pdma_uart_rx_config; + } + + /* Assign head descriptor & go */ + result = nu_pdma_sg_transfer(psNuUart->pdma_chanid_rx, psNuUart->pdma_rx_desc, 1000); + if (result != RT_EOK) + { + goto exit_nu_pdma_uart_rx_config; + } + } + + /* Enable Receive Line interrupt & Start DMA RX transfer. */ + UART_ENABLE_INT(uart_base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk); + +exit_nu_pdma_uart_rx_config: + + return result; +} + +static void nu_pdma_uart_rx_cb(void *pvOwner, uint32_t u32Events) +{ + rt_size_t recv_len = 0; + rt_size_t transferred_rxbyte = 0; + struct rt_serial_device *serial = (struct rt_serial_device *)pvOwner; + nu_uart_t puart = (nu_uart_t)serial; + RT_ASSERT(serial); + + /* Get base address of uart register */ + UART_T *uart_base = puart->uart_base; + + transferred_rxbyte = nu_pdma_transferred_byte_get(puart->pdma_chanid_rx, puart->rxdma_trigger_len); + if (u32Events & (NU_PDMA_EVENT_TRANSFER_DONE | NU_PDMA_EVENT_TIMEOUT)) + { + if (u32Events & NU_PDMA_EVENT_TRANSFER_DONE) + { + transferred_rxbyte = puart->rxdma_trigger_len; + } + else if ((u32Events & NU_PDMA_EVENT_TIMEOUT) && !UART_GET_RX_EMPTY(uart_base)) + { + return; + } + + recv_len = transferred_rxbyte - puart->rx_write_offset; + + if (recv_len > 0) + { +#if !defined(USE_MA35D1_SUBM) + struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; + rt_hw_cpu_dcache_invalidate((void *)&rx_fifo->buffer[puart->rx_write_offset], recv_len); +#endif + puart->rx_write_offset = transferred_rxbyte % puart->rxdma_trigger_len; + } + } + + if ((serial->config.bufsz == 0) && (u32Events & NU_PDMA_EVENT_TRANSFER_DONE)) + { + recv_len = puart->rxdma_trigger_len; + } + + if (recv_len > 0) + { + rt_hw_serial_isr(&puart->dev, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8)); + } +} + +static rt_err_t nu_pdma_uart_tx_config(struct rt_serial_device *serial) +{ + struct nu_pdma_chn_cb sChnCB; + RT_ASSERT(serial); + + /* Register ISR callback function */ + sChnCB.m_eCBType = eCBType_Event; + sChnCB.m_pfnCBHandler = nu_pdma_uart_tx_cb; + sChnCB.m_pvUserData = (void *)serial; + + nu_pdma_filtering_set(((nu_uart_t)serial)->pdma_chanid_tx, NU_PDMA_EVENT_TRANSFER_DONE); + return nu_pdma_callback_register(((nu_uart_t)serial)->pdma_chanid_tx, &sChnCB); +} + +static void nu_pdma_uart_tx_cb(void *pvOwner, uint32_t u32Events) +{ + nu_uart_t puart = (nu_uart_t)pvOwner; + + RT_ASSERT(puart); + + UART_DISABLE_INT(puart->uart_base, UART_INTEN_TXPDMAEN_Msk);// Stop DMA TX transfer + + if (u32Events & NU_PDMA_EVENT_TRANSFER_DONE) + { + rt_hw_serial_isr(&puart->dev, RT_SERIAL_EVENT_TX_DMADONE); + } +} + +/** + * Uart DMA transfer + */ +static rt_size_t nu_uart_dma_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction) +{ + rt_err_t result = RT_EOK; + nu_uart_t psNuUart = (nu_uart_t)serial; + + RT_ASSERT(serial); + RT_ASSERT(buf); + + /* Get base address of uart register */ + UART_T *uart_base = psNuUart->uart_base; + if (direction == RT_SERIAL_DMA_TX) + { + result = nu_pdma_transfer(psNuUart->pdma_chanid_tx, + 8, + (uint32_t)buf, + (uint32_t)uart_base, + size, + 0); // wait-forever + // Start DMA TX transfer + UART_ENABLE_INT(uart_base, UART_INTEN_TXPDMAEN_Msk); + } + else if (direction == RT_SERIAL_DMA_RX) + { + UART_DISABLE_INT(uart_base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk); + + // If config.bufsz = 0, serial will trigger once. + psNuUart->rxdma_trigger_len = size; + psNuUart->rx_write_offset = 0; + result = nu_pdma_uart_rx_config(serial, buf, size); + } + else + { + result = RT_ERROR; + } + + return result; +} + +static int nu_hw_uart_dma_allocate(nu_uart_t pusrt) +{ + RT_ASSERT(pusrt); + + /* Allocate UART_TX nu_dma channel */ + if (pusrt->pdma_perp_tx != NU_PDMA_UNUSED) + { + pusrt->pdma_chanid_tx = nu_pdma_channel_allocate(pusrt->pdma_perp_tx); + if (pusrt->pdma_chanid_tx >= 0) + { + pusrt->dma_flag |= RT_DEVICE_FLAG_DMA_TX; + } + } + + /* Allocate UART_RX nu_dma channel */ + if (pusrt->pdma_perp_rx != NU_PDMA_UNUSED) + { + pusrt->pdma_chanid_rx = nu_pdma_channel_allocate(pusrt->pdma_perp_rx); + if (pusrt->pdma_chanid_rx >= 0) + { + rt_err_t ret = RT_EOK; + pusrt->dma_flag |= RT_DEVICE_FLAG_DMA_RX; + ret = nu_pdma_sgtbls_allocate(&pusrt->pdma_rx_desc, 1); + RT_ASSERT(ret == RT_EOK); + } + } + + return RT_EOK; +} +#endif + +/** + * Uart interrupt control + */ +static rt_err_t nu_uart_control(struct rt_serial_device *serial, int cmd, void *arg) +{ + nu_uart_t psNuUart = (nu_uart_t)serial; + rt_err_t result = RT_EOK; + rt_ubase_t ctrl_arg = (rt_ubase_t)arg; + + RT_ASSERT(serial); + + /* Get base address of uart register */ + UART_T *uart_base = psNuUart->uart_base; + + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT: + if (ctrl_arg == RT_DEVICE_FLAG_INT_RX) /* Disable INT-RX */ + { + UART_DISABLE_INT(uart_base, UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk | UART_INTEN_TOCNTEN_Msk); + } + else if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) /* Disable DMA-RX */ + { + /* Disable Receive Line interrupt & Stop DMA RX transfer. */ +#if defined(RT_SERIAL_USING_DMA) + if (psNuUart->dma_flag & RT_DEVICE_FLAG_DMA_RX) + { + nu_pdma_channel_terminate(psNuUart->pdma_chanid_rx); + } + UART_DISABLE_INT(uart_base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk); +#endif + } + break; + + case RT_DEVICE_CTRL_SET_INT: + if (ctrl_arg == RT_DEVICE_FLAG_INT_RX) /* Enable INT-RX */ + { + UART_ENABLE_INT(uart_base, UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk | UART_INTEN_TOCNTEN_Msk); + } + break; + +#if defined(RT_SERIAL_USING_DMA) + case RT_DEVICE_CTRL_CONFIG: + if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) /* Configure and trigger DMA-RX */ + { + struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; + psNuUart->rxdma_trigger_len = serial->config.bufsz; + psNuUart->rx_write_offset = 0; + + result = nu_pdma_uart_rx_config(serial, &rx_fifo->buffer[0], psNuUart->rxdma_trigger_len); // Config & trigger + } + else if (ctrl_arg == RT_DEVICE_FLAG_DMA_TX) /* Configure DMA-TX */ + { + result = nu_pdma_uart_tx_config(serial); + } + break; +#endif + + case RT_DEVICE_CTRL_CLOSE: + /* Disable interrupt. */ + rt_hw_interrupt_mask(psNuUart->irqn); + +#if defined(RT_SERIAL_USING_DMA) + UART_DISABLE_INT(uart_base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk); + UART_DISABLE_INT(uart_base, UART_INTEN_TXPDMAEN_Msk); + + if (psNuUart->dma_flag != 0) + { + nu_pdma_channel_terminate(psNuUart->pdma_chanid_tx); + nu_pdma_channel_terminate(psNuUart->pdma_chanid_rx); + } +#endif + + /* Close UART port */ + UART_Close(uart_base); + + break; + + default: + result = -RT_EINVAL; + break; + + } + return result; +} + +/** + * Uart put char + */ +static int nu_uart_send(struct rt_serial_device *serial, char c) +{ + RT_ASSERT(serial); + + /* Get base address of uart register */ + UART_T *uart_base = ((nu_uart_t)serial)->uart_base; + + /* Waiting if TX-FIFO is full. */ + while (UART_IS_TX_FULL(uart_base)); + + /* Put char into TX-FIFO */ + UART_WRITE(uart_base, c); + + return 1; +} + +/** + * Uart get char + */ +static int nu_uart_receive(struct rt_serial_device *serial) +{ + RT_ASSERT(serial); + + /* Get base address of uart register */ + UART_T *uart_base = ((nu_uart_t)serial)->uart_base; + + /* Return failure if RX-FIFO is empty. */ + if (UART_GET_RX_EMPTY(uart_base)) + { + return -1; + } + + /* Get char from RX-FIFO */ + return UART_READ(uart_base); +} + +/** + * Hardware UART Initialization + */ +rt_err_t rt_hw_uart_init(void) +{ + int i; + rt_uint32_t flag; + rt_err_t ret = RT_EOK; + + for (i = (UART_START + 1); i < UART_CNT; i++) + { + flag = RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX; + + nu_uart_arr[i].dev.ops = &nu_uart_ops; + nu_uart_arr[i].dev.config = nu_uart_default_config; + +#if defined(RT_SERIAL_USING_DMA) + nu_uart_arr[i].dma_flag = 0; + nu_hw_uart_dma_allocate(&nu_uart_arr[i]); + flag |= nu_uart_arr[i].dma_flag; +#endif + + rt_hw_interrupt_install(nu_uart_arr[i].irqn, nu_uart_isr, &nu_uart_arr[i], nu_uart_arr[i].name); + + ret = rt_hw_serial_register(&nu_uart_arr[i].dev, nu_uart_arr[i].name, flag, NULL); + RT_ASSERT(ret == RT_EOK); + } + + return ret; +} + +#endif //#if defined(BSP_USING_UART) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_uart.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_uart.h new file mode 100644 index 0000000000..3dd14c0d8d --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_uart.h @@ -0,0 +1,22 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-2-7 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_UART_H__ +#define __DRV_UART_H__ + +#include +#include "board.h" + +rt_err_t rt_hw_uart_init(void); +void nu_uart_set_rs485aud(struct rt_serial_device *serial, rt_bool_t bRTSActiveLowLevel); + +#endif /* __DRV_UART_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_usbhost.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_usbhost.c new file mode 100644 index 0000000000..2707f1c4dc --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_usbhost.c @@ -0,0 +1,950 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-11-5 Wayne First version +* +******************************************************************************/ +#include + +#if defined(BSP_USING_USBH) + +#include +#include +#include "NuMicro.h" + +#include "usb.h" +#include "usbh_lib.h" + +#define LOG_TAG "drv.usbhost" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_DBG +#define DBG_COLOR +#include + +#if !defined(NU_USBHOST_HUB_POLLING_INTERVAL) + #define NU_USBHOST_HUB_POLLING_INTERVAL (100) +#endif + +#define NU_MAX_USBH_PORT (2+1) // 2* USB2.0 + 1*USB1.2 ports +#define NU_MAX_USBH_PIPE 16 +#define NU_USBH_THREAD_STACK_SIZE 2048 + +#define NU_MAX_USBH_HUB_PORT_DEV USB_HUB_PORT_NUM + +#define NU_USBHOST_HUB_POLLING_LOCK +#if defined(NU_USBHOST_HUB_POLLING_LOCK) +#define NU_USBHOST_MUTEX_INIT() { \ + s_sUSBHDev.lock = rt_mutex_create("usbhost_lock", RT_IPC_FLAG_PRIO); \ + RT_ASSERT(s_sUSBHDev.lock != RT_NULL); \ + } + +#define NU_USBHOST_LOCK() { \ + rt_err_t result = rt_mutex_take(s_sUSBHDev.lock, RT_WAITING_FOREVER); \ + RT_ASSERT(result == RT_EOK); \ + } + +#define NU_USBHOST_UNLOCK() { \ + rt_err_t result = rt_mutex_release(s_sUSBHDev.lock); \ + RT_ASSERT(result == RT_EOK); \ + } +#else +#define NU_USBHOST_MUTEX_INIT() +#define NU_USBHOST_LOCK() +#define NU_USBHOST_UNLOCK() +#endif + +/* Private typedef --------------------------------------------------------------*/ +typedef struct nu_port_dev +{ + rt_bool_t bRHParent; + UDEV_T *pUDev; + EP_INFO_T *apsEPInfo[NU_MAX_USBH_PIPE]; + struct urequest asSetupReq[NU_MAX_USBH_PIPE]; + uint32_t u32SentLength[NU_MAX_USBH_PIPE]; + struct rt_completion utr_completion; + int port_num; + rt_bool_t bEnumDone; + void *asPipePktBuf[NU_MAX_USBH_PIPE]; +} S_NU_PORT_DEV; + + +typedef struct nu_port_ctrl +{ + S_NU_PORT_DEV sRHPortDev; + S_NU_PORT_DEV asHubPortDev[NU_MAX_USBH_HUB_PORT_DEV]; +} S_NU_RH_PORT_CTRL; + + +struct nu_usbh_dev +{ + struct uhcd uhcd; + rt_thread_t polling_thread; + rt_mutex_t lock; + S_NU_RH_PORT_CTRL asPortCtrl[NU_MAX_USBH_PORT]; +}; + +/* Private variables ------------------------------------------------------------*/ +static struct nu_usbh_dev s_sUSBHDev; + +static S_NU_RH_PORT_CTRL * +GetRHPortControlFromPipe( + upipe_t pipe) +{ + uinst_t inst; + int port; + + if (!pipe || + !pipe->inst || + !pipe->inst->parent_hub) + return RT_NULL; + + if (pipe->inst->parent_hub->is_roothub) + { + //case: device ---> root hub + inst = pipe->inst; + port = inst->port; + } + else + { + //case: device ---> hub ---> root hub + inst = pipe->inst->parent_hub->self; + port = inst->port; + } + + if (port > NU_MAX_USBH_PORT) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_open_pipe ERROR: port index over NU_MAX_USBH_PORT\n")); + return RT_NULL; + } + + return &s_sUSBHDev.asPortCtrl[port - 1];; +} + +static S_NU_PORT_DEV * +GetPortDevFromPipe( + upipe_t pipe) +{ + S_NU_RH_PORT_CTRL *psRHPortCtrl = GetRHPortControlFromPipe(pipe); + int i; + + if (psRHPortCtrl == RT_NULL) + return RT_NULL; + + if (pipe->inst->parent_hub->is_roothub) + { + //case: device ---> root hub + return &psRHPortCtrl->sRHPortDev; + } + + //case: device ---> hub ---> root hub + for (i = 0 ; i < NU_MAX_USBH_HUB_PORT_DEV; i ++) + { + if (psRHPortCtrl->asHubPortDev[i].port_num == pipe->inst->port) + break; + } + + if (i >= NU_MAX_USBH_HUB_PORT_DEV) + return RT_NULL; + + return &psRHPortCtrl->asHubPortDev[i]; +} + +static rt_err_t nu_reset_port(rt_uint8_t port) +{ + S_NU_RH_PORT_CTRL *psPortCtrl; + + if (port > NU_MAX_USBH_PORT) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("%s ERROR: port index over NU_MAX_USBH_PORT\n", __func__)); + return RT_EIO; + } + + psPortCtrl = &s_sUSBHDev.asPortCtrl[port - 1]; + if (psPortCtrl->sRHPortDev.pUDev == NULL) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("%s ERROR: udev not found\n", __func__)); + return RT_EIO; + } + + usbh_reset_port(psPortCtrl->sRHPortDev.pUDev); + + return RT_EOK; +} + +static EP_INFO_T *GetFreePipe( + S_NU_RH_PORT_CTRL *psPortCtrl, + S_NU_PORT_DEV *psPortDev, + rt_uint8_t *pu8PipeIndex) +{ + if (psPortCtrl != NULL) + { + int i; + /* Find free Pipe */ + for (i = 0; i < NU_MAX_USBH_PIPE; i ++) + { + if (psPortDev->apsEPInfo[i] == NULL) + break; + } + + if (i < NU_MAX_USBH_PIPE) + { + EP_INFO_T *psEPInfo = rt_malloc(sizeof(EP_INFO_T)); + if (psEPInfo != RT_NULL) + { + psPortDev->apsEPInfo[i] = psEPInfo; + *pu8PipeIndex = i; + return psEPInfo; + } + } + } + return RT_NULL; +} + +static void FreePipe( + S_NU_RH_PORT_CTRL *psPortCtrl, + S_NU_PORT_DEV *psPortDev, + rt_uint8_t u8PipeIndex) +{ + if ((psPortCtrl != RT_NULL) && + (u8PipeIndex < NU_MAX_USBH_PIPE) && + (psPortDev->apsEPInfo[u8PipeIndex] != RT_NULL)) + { + rt_free(psPortDev->apsEPInfo[u8PipeIndex]); + psPortDev->apsEPInfo[u8PipeIndex] = RT_NULL; + } +} + +static S_NU_PORT_DEV * +AllocateNewUDev( + S_NU_RH_PORT_CTRL *psRHPortCtrl) +{ + if (psRHPortCtrl != RT_NULL) + { + int i; + /* Find free Dev */ + for (i = 0 ; i < NU_MAX_USBH_HUB_PORT_DEV; i ++) + { + if (psRHPortCtrl->asHubPortDev[i].pUDev == NULL) + break; + } + + if (i < NU_MAX_USBH_HUB_PORT_DEV) + { + psRHPortCtrl->asHubPortDev[i].pUDev = alloc_device(); + if (psRHPortCtrl->asHubPortDev[i].pUDev == NULL) + { + return RT_NULL; + } + else + { + return &psRHPortCtrl->asHubPortDev[i]; + } + } + } + return RT_NULL; +} + +static rt_err_t nu_open_pipe(upipe_t pipe) +{ + S_NU_RH_PORT_CTRL *psPortCtrl; + S_NU_PORT_DEV *psPortDev; + + psPortCtrl = GetRHPortControlFromPipe(pipe); + if (psPortCtrl == RT_NULL) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("%s ERROR: RHPort not found\n", __func__)); + goto exit_nu_open_pipe; + } + + if (psPortCtrl->sRHPortDev.pUDev == NULL) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("%s ERROR: udev not found\n", __func__)); + goto exit_nu_open_pipe; + } + + psPortDev = GetPortDevFromPipe(pipe); + + if ((psPortDev == NULL) || (psPortDev->pUDev == NULL)) + { + //allocate new dev for hub device + psPortDev = AllocateNewUDev(psPortCtrl); + + if (psPortDev == RT_NULL) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_open_pipe ERROR: udev allocate failed\n")); + goto exit_nu_open_pipe; + } + + if (pipe->inst->speed) + { + psPortDev->pUDev->speed = SPEED_FULL; + } + else + { + psPortDev->pUDev->speed = SPEED_HIGH; + } + + psPortDev->pUDev->parent = NULL; + psPortDev->pUDev->hc_driver = psPortCtrl->sRHPortDev.pUDev->hc_driver; + psPortDev->port_num = pipe->inst->port; + psPortDev->pUDev->port_num = pipe->inst->port; + psPortDev->bEnumDone = FALSE; + } + + //For ep0 control transfer + if ((pipe->ep.bEndpointAddress & 0x7F) == 0) + { + pipe->pipe_index = 0; + } + else + { + int pksz; + EP_INFO_T *psEPInfo = GetFreePipe(psPortCtrl, psPortDev, &pipe->pipe_index); + if (psEPInfo == RT_NULL) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("%s ERROR: get free pipe failed\n", __func__)); + goto exit_nu_open_pipe; + } + + psEPInfo->bEndpointAddress = pipe->ep.bEndpointAddress; + psEPInfo->bmAttributes = pipe->ep.bmAttributes; + + pksz = pipe->ep.wMaxPacketSize; + pksz = (pksz & 0x07ff) * (1 + ((pksz >> 11) & 3)); + psEPInfo->wMaxPacketSize = pksz; + + psEPInfo->bInterval = pipe->ep.bInterval; + psEPInfo->hw_pipe = NULL; + psEPInfo->bToggle = 0; + } + + if (!psPortDev->asPipePktBuf[pipe->pipe_index]) + { + psPortDev->asPipePktBuf[pipe->pipe_index] = rt_malloc_align(512ul, nu_cpu_dcache_line_size()); + RT_ASSERT(psPortDev->asPipePktBuf[pipe->pipe_index] != RT_NULL); + } + + return RT_EOK; + +exit_nu_open_pipe: + + return -RT_ERROR; +} + +static rt_err_t nu_close_pipe(upipe_t pipe) +{ + S_NU_RH_PORT_CTRL *psPortCtrl; + S_NU_PORT_DEV *psPortDev; + + psPortCtrl = GetRHPortControlFromPipe(pipe); + if (psPortCtrl == RT_NULL) + { + return RT_EIO; + } + + psPortDev = GetPortDevFromPipe(pipe); + + //For ep0 control transfer + if ((pipe->ep.bEndpointAddress & 0x7F) == 0) + { + if ((psPortDev) && (psPortDev->bRHParent == FALSE) && (psPortDev->bEnumDone == TRUE)) + { + if (psPortDev->pUDev) + { + int i; + for (i = 0; i < NU_MAX_USBH_PIPE; i++) + { + if (psPortDev->apsEPInfo[i] != NULL) + { + usbh_quit_xfer(psPortDev->pUDev, psPortDev->apsEPInfo[i]); + } + } + + free_device(psPortDev->pUDev); + psPortDev->pUDev = NULL; + } + } + } + + if (psPortDev != NULL) + { + if (psPortDev->asPipePktBuf[pipe->pipe_index]) + { + rt_free_align(psPortDev->asPipePktBuf[pipe->pipe_index]); + psPortDev->asPipePktBuf[pipe->pipe_index] = RT_NULL; + } + + FreePipe(psPortCtrl, psPortDev, pipe->pipe_index); + } + return RT_EOK; +} + +static int nu_ctrl_xfer( + S_NU_PORT_DEV *psPortDev, + struct urequest *psSetup, + void *buffer, + int timeouts) +{ + uint32_t xfer_len = 0; + int ret; + + ret = usbh_ctrl_xfer(psPortDev->pUDev, psSetup->request_type, psSetup->bRequest, psSetup->wValue, psSetup->wIndex, psSetup->wLength, buffer, &xfer_len, timeouts * 10); + if (ret < 0) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_ctrl_xfer ERROR: xfer failed %d\n", ret)); + return ret; + } + + if (xfer_len != psSetup->wLength) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_ctrl_xfer ERROR: xfer length %d %d\n", psSetup->wLength, xfer_len)); + } + + if ((psSetup->bRequest == USB_REQ_SET_ADDRESS) && ((psSetup->request_type & 0x60) == REQ_TYPE_STD_DEV)) + psPortDev->pUDev->dev_num = psSetup->wValue; + + if ((psSetup->bRequest == USB_REQ_SET_CONFIGURATION) && ((psSetup->request_type & 0x60) == REQ_TYPE_STD_DEV)) + { + psPortDev->pUDev->cur_conf = psSetup->wValue; + psPortDev->bEnumDone = TRUE; + } + + return xfer_len; +} + +static int nu_bulk_xfer( + S_NU_PORT_DEV *psPortDev, + UTR_T *psUTR, + int timeouts) +{ + int ret = usbh_bulk_xfer(psUTR); + if (ret < 0) + return ret; + + //wait transfer done + if (rt_completion_wait(&(psPortDev->utr_completion), timeouts) < 0) + { + rt_kprintf("Request Timeout in %d ms!! (bulk_xfer)\n", timeouts); + + rt_kprintf("psUTR->buff: %08x\n", psUTR->buff); + rt_kprintf("psUTR->data_len: %d\n", psUTR->data_len); + rt_kprintf("psUTR->xfer_len: %d\n", psUTR->xfer_len); + rt_kprintf("psUTR->ep: %08x\n", psUTR->ep); + rt_kprintf("psUTR->bIsTransferDone: %08x\n", psUTR->bIsTransferDone); + rt_kprintf("psUTR->status: %08x\n", psUTR->status); + rt_kprintf("psUTR->td_cnt: %08x\n", psUTR->td_cnt); + + return -1; + } + return 0; +} + +static int nu_int_xfer( + upipe_t pipe, + S_NU_PORT_DEV *psPortDev, + UTR_T *psUTR, + int timeouts) +{ + int ret; + + while (1) + { + ret = usbh_int_xfer(psUTR); + if (ret < 0) + return ret; + + if (rt_completion_wait(&(psPortDev->utr_completion), timeouts) != 0) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("Request %08x Timeout in %d ms!!\n", psUTR, timeouts)); + usbh_quit_utr(psUTR); + + rt_completion_init(&(psPortDev->utr_completion)); + rt_thread_mdelay(1); + } + else + { + + RT_DEBUG_LOG(RT_DEBUG_USB, ("Transferring done %08x\n", psUTR)); + usbh_quit_utr(psUTR); + break; + } + } + + return 0; +} + +static void xfer_done_cb(UTR_T *psUTR) +{ + S_NU_PORT_DEV *psPortDev = (S_NU_PORT_DEV *)psUTR->context; + + //transfer done, signal utr_completion + rt_completion_done(&(psPortDev->utr_completion)); +} + +static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts) +{ + S_NU_RH_PORT_CTRL *psPortCtrl; + S_NU_PORT_DEV *psPortDev; + UTR_T *psUTR = NULL; + int i32XferLen = -1; + + void *buffer_nonch = buffer; + + NU_USBHOST_LOCK(); + + psPortCtrl = GetRHPortControlFromPipe(pipe); + if (psPortCtrl == RT_NULL) + { + goto exit_nu_pipe_xfer; + } + + psPortDev = GetPortDevFromPipe(pipe); + if (psPortDev->pUDev == NULL) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_pipe_xfer ERROR: udev not found\n")); + goto exit_nu_pipe_xfer; + } + + if (buffer_nonch && nbytes) + { + buffer_nonch = psPortDev->asPipePktBuf[pipe->pipe_index]; + if ((pipe->ep.bEndpointAddress & USB_DIR_MASK) == USB_DIR_OUT) + { + rt_memcpy(buffer_nonch, buffer, nbytes); + rt_hw_cpu_dcache_clean_inv((void *)buffer_nonch, nbytes); + } + } + + //ctrl xfer + if (pipe->ep.bmAttributes == USB_EP_ATTR_CONTROL) + { + int ret; + + if (token == USBH_PID_SETUP) + { + struct urequest *psSetup = (struct urequest *)buffer_nonch; + RT_ASSERT(buffer_nonch != RT_NULL); + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] = 0; + + /* Read data from USB device. */ + if (psSetup->request_type & USB_REQ_TYPE_DIR_IN) + { + //Store setup request + rt_memcpy(&psPortCtrl->asHubPortDev->asSetupReq[pipe->pipe_index], psSetup, sizeof(struct urequest)); + } + else + { + /* Write data to USB device. */ + //Trigger USBHostLib Ctrl_Xfer + ret = nu_ctrl_xfer(psPortDev, psSetup, NULL, timeouts); + if (ret != psSetup->wLength) + goto exit_nu_pipe_xfer; + } + } + else + { + //token == USBH_PID_DATA + if (buffer_nonch && ((pipe->ep.bEndpointAddress & USB_DIR_MASK) == USB_DIR_IN)) + { + struct urequest *psSetup = &psPortCtrl->asHubPortDev->asSetupReq[pipe->pipe_index]; + + /* Read data from USB device. */ + //Trigger USBHostLib Ctril_Xfer + /* + * Workaround: HCD driver can readback all bytes of setup.wLength, but not support single packet transferring. + */ + if (psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] == 0) + { + ret = nu_ctrl_xfer(psPortDev, psSetup, buffer_nonch, timeouts); + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] = ret; + if (ret > 0) + { + rt_hw_cpu_dcache_invalidate((void *)buffer_nonch, ret); + rt_memcpy(buffer, buffer_nonch, ret); + } + } + else + { + if (psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] < nbytes) + { + ret = 0; + } + else + { + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] -= nbytes; + ret = nbytes; + } + } + if (ret <= 0) + goto exit_nu_pipe_xfer; + } + else + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("%d == USBH_PID_DATA, nil buf-%d \n", token, nbytes)); + } + + } //else + i32XferLen = nbytes; + goto exit_nu_pipe_xfer2; + } // if ( pipe->ep.bmAttributes == USB_EP_ATTR_CONTROL ) + else + { + + psUTR = alloc_utr(psPortDev->pUDev); + + if (!psUTR) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_pipe_xfer ERROR: unable alloc UTR\n")); + goto exit_nu_pipe_xfer; + } + + psUTR->ep = psPortDev->apsEPInfo[pipe->pipe_index]; + psUTR->buff = buffer_nonch; + psUTR->data_len = nbytes; + psUTR->xfer_len = 0; + psUTR->func = xfer_done_cb; + psUTR->context = psPortDev; + psUTR->bIsTransferDone = 0; + psUTR->status = 0; + + //others xfer + rt_completion_init(&(psPortDev->utr_completion)); + + if (pipe->ep.bmAttributes == USB_EP_ATTR_BULK) + { + if (nu_bulk_xfer(psPortDev, psUTR, timeouts) < 0) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_pipe_xfer ERROR: bulk transfer failed\n")); + goto failreport_nu_pipe_xfer; + } + } + else if (pipe->ep.bmAttributes == USB_EP_ATTR_INT) + { + if (nu_int_xfer(pipe, psPortDev, psUTR, timeouts) < 0) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_pipe_xfer ERROR: int transfer failed\n")); + //goto exit_nu_pipe_xfer; + } + else + { + i32XferLen = nbytes; + } + goto exit_nu_pipe_xfer; + } + else if (pipe->ep.bmAttributes == USB_EP_ATTR_ISOC) + { + //TODO: ISO transfer + RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_pipe_xfer ERROR: isoc transfer not support\n")); + goto exit_nu_pipe_xfer; + } + + } //else + +failreport_nu_pipe_xfer: + + if (psUTR->bIsTransferDone == 0) + { + //Timeout + RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_pipe_xfer ERROR: timeout\n")); + pipe->status = UPIPE_STATUS_ERROR; + usbh_quit_utr(psUTR); + } + else + { + // Transfer Done. Get status + if (psUTR->status == 0) + { + pipe->status = UPIPE_STATUS_OK; + } + else if (psUTR->status == USBH_ERR_STALL) + { + pipe->status = UPIPE_STATUS_STALL; + } + else + { + pipe->status = UPIPE_STATUS_ERROR; + } + } + + i32XferLen = psUTR->xfer_len; + +exit_nu_pipe_xfer: + + //Call callback + if (pipe->callback != RT_NULL) + { + pipe->callback(pipe); + } + + if (psUTR) + free_utr(psUTR); + + if ((nbytes) && + (buffer_nonch != buffer)) + { + if ((pipe->ep.bEndpointAddress & USB_DIR_MASK) == USB_DIR_IN) + { + rt_hw_cpu_dcache_invalidate((void *)buffer_nonch, nbytes); + rt_memcpy(buffer, buffer_nonch, nbytes); + } + } + +exit_nu_pipe_xfer2: + + NU_USBHOST_UNLOCK(); + + return i32XferLen; +} + +/* Polling USB root hub status task */ +static void nu_usbh_rh_thread_entry(void *parameter) +{ + while (1) + { + NU_USBHOST_LOCK(); + usbh_polling_root_hubs(); + NU_USBHOST_UNLOCK(); + + rt_thread_mdelay(NU_USBHOST_HUB_POLLING_INTERVAL); + } +} + +static void nu_hcd_connect_callback( + struct udev_t *udev, + int param) +{ + int i; + int port_index; + S_NU_RH_PORT_CTRL *psPortCtrl; + + for (i = 0; i < NU_MAX_USBH_PORT; i++) + { + psPortCtrl = &s_sUSBHDev.asPortCtrl[i]; + if (psPortCtrl->sRHPortDev.pUDev == NULL) + break; + } + + if (i >= NU_MAX_USBH_PORT) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("ERROR: port connect slot is full\n")); + return; + } + + port_index = i + 1; + psPortCtrl->sRHPortDev.pUDev = udev; + psPortCtrl->sRHPortDev.bRHParent = TRUE; + + RT_DEBUG_LOG(RT_DEBUG_USB, ("usb connected\n")); + + if (udev->speed == SPEED_HIGH) + rt_usbh_root_hub_connect_handler(&s_sUSBHDev.uhcd, port_index, RT_TRUE); + else + rt_usbh_root_hub_connect_handler(&s_sUSBHDev.uhcd, port_index, RT_FALSE); +} + +static void nu_hcd_disconnect_callback( + struct udev_t *udev, + int param) +{ + int i; + int port_index; + S_NU_RH_PORT_CTRL *psPortCtrl; + + for (i = 0; i < NU_MAX_USBH_PORT; i++) + { + psPortCtrl = &s_sUSBHDev.asPortCtrl[i]; + if (psPortCtrl->sRHPortDev.pUDev == udev) + break; + } + + if (i >= NU_MAX_USBH_PORT) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("ERROR: udev not found\n")); + return; + } + + port_index = i + 1; + + for (i = 0; i < NU_MAX_USBH_PIPE; i++) + { + if (psPortCtrl->sRHPortDev.apsEPInfo[i] != NULL) + { + usbh_quit_xfer(psPortCtrl->sRHPortDev.pUDev, psPortCtrl->sRHPortDev.apsEPInfo[i]); + } + } + + psPortCtrl->sRHPortDev.pUDev = NULL; + + RT_DEBUG_LOG(RT_DEBUG_USB, ("usb disconnect\n")); + + rt_usbh_root_hub_disconnect_handler(&s_sUSBHDev.uhcd, port_index); +} + + +/* USB host operations -----------------------------------------------------------*/ +static struct uhcd_ops nu_uhcd_ops = +{ + nu_reset_port, + nu_pipe_xfer, + nu_open_pipe, + nu_close_pipe, +}; + +static rt_err_t nu_hcd_init(rt_device_t device) +{ + struct nu_usbh_dev *pNuUSBHDev = (struct nu_usbh_dev *)device; + + usbh_core_init(); + + //install connect/disconnect callback + usbh_install_conn_callback(nu_hcd_connect_callback, nu_hcd_disconnect_callback); + + //create thread for polling usbh port status + /* create usb hub thread */ + pNuUSBHDev->polling_thread = rt_thread_create("usbh_drv", nu_usbh_rh_thread_entry, RT_NULL, + NU_USBH_THREAD_STACK_SIZE, 8, 20); + RT_ASSERT(pNuUSBHDev->polling_thread != RT_NULL); + + /* startup usb host thread */ + rt_thread_startup(pNuUSBHDev->polling_thread); + + return RT_EOK; +} + +/* global function for USB host library -----------------------------*/ +uint32_t usbh_get_ticks(void) +{ + return rt_tick_get(); +} + +void usbh_delay_ms(int msec) +{ + rt_thread_mdelay(msec); +} + +uint32_t usbh_tick_from_millisecond(uint32_t msec) +{ + return rt_tick_from_millisecond(msec); +} + +#if defined(RT_USING_PM) + +/* device pm suspend() entry. */ +static int usbhost_pm_suspend(const struct rt_device *device, rt_uint8_t mode) +{ + rt_err_t result; + + struct nu_usbh_dev *pNuUSBHDev = (struct nu_usbh_dev *)device; + + RT_ASSERT(pNuUSBHDev != RT_NULL); + switch (mode) + { + case PM_SLEEP_MODE_LIGHT: + case PM_SLEEP_MODE_DEEP: + + pNuUSBHDev->polling_thread->stat = RT_THREAD_READY; + result = rt_thread_suspend(pNuUSBHDev->polling_thread); + RT_ASSERT(result == RT_EOK); + + break; + + default: + break; + } + + return (int)RT_EOK; +} + +/* device pm resume() entry. */ +static void usbhost_pm_resume(const struct rt_device *device, rt_uint8_t mode) +{ + rt_err_t result; + struct nu_usbh_dev *pNuUSBHDev = (struct nu_usbh_dev *)device; + RT_ASSERT(pNuUSBHDev != RT_NULL); + + switch (mode) + { + case PM_SLEEP_MODE_LIGHT: + case PM_SLEEP_MODE_DEEP: + result = rt_thread_resume(pNuUSBHDev->polling_thread); + RT_ASSERT(result == RT_EOK); + break; + + default: + break; + } +} + +static struct rt_device_pm_ops device_pm_ops = +{ + .suspend = usbhost_pm_suspend, + .resume = usbhost_pm_resume, + .frequency_change = RT_NULL +}; +#endif + +int nu_usbh_register(void) +{ + rt_err_t res; + uhcd_t psUHCD; + + psUHCD = (uhcd_t)&s_sUSBHDev.uhcd; + + psUHCD->parent.type = RT_Device_Class_USBHost; + psUHCD->parent.init = nu_hcd_init; + psUHCD->parent.user_data = &s_sUSBHDev; + + psUHCD->ops = &nu_uhcd_ops; + psUHCD->num_ports = NU_MAX_USBH_PORT; + +#if defined(BSP_USING_HSUSBH0) + CLK_EnableModuleClock(HUSBH0_MODULE); + SYS_ResetModule(HSUSBH0_RST); +#endif + +#if defined(BSP_USING_HSUSBH1) + CLK_EnableModuleClock(HUSBH1_MODULE); + SYS_ResetModule(HSUSBH1_RST); +#endif + + /* set UHOVRCURH(SYS_MISCFCR0[12]) 1 => USBH Host over-current detect is high-active */ + /* 0 => USBH Host over-current detect is low-active */ + //SYS->MISCFCR0 |= SYS_MISCFCR0_UHOVRCURH_Msk; + SYS->MISCFCR0 &= ~SYS_MISCFCR0_UHOVRCURH_Msk; + +#if defined(BSP_USING_HSUSBH0) + /* Clock engine clock Configuration */ + SYS->USBPMISCR &= ~(SYS_USBPMISCR_PHY0POR_Msk | SYS_USBPMISCR_PHY0COMN_Msk); + SYS->USBPMISCR |= SYS_USBPMISCR_PHY0SUSPEND_Msk; +#endif + +#if defined(BSP_USING_HSUSBH1) + /* Clock engine clock Configuration */ + SYS->USBPMISCR &= ~(SYS_USBPMISCR_PHY1POR_Msk | SYS_USBPMISCR_PHY1COMN_Msk); + SYS->USBPMISCR |= SYS_USBPMISCR_PHY1SUSPEND_Msk; +#endif + + NU_USBHOST_MUTEX_INIT(); + + res = rt_device_register(&psUHCD->parent, "usbh", RT_DEVICE_FLAG_DEACTIVATE); + RT_ASSERT(res == RT_EOK); + + /*initialize the usb host function */ + res = rt_usb_host_init("usbh"); + RT_ASSERT(res == RT_EOK); + +#if defined(RT_USING_PM) + rt_pm_device_register(&psUHCD->parent, &device_pm_ops); +#endif + + return 0; +} +INIT_APP_EXPORT(nu_usbh_register); + +#endif diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_wdt.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_wdt.c new file mode 100644 index 0000000000..cbacf45e9c --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_wdt.c @@ -0,0 +1,372 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-3-25 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_WDT) + +#include +#include +#include "NuMicro.h" + +#define LOG_TAG "drv.wdt" +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_ERROR +#define DBG_COLOR +#include + +/* Private define ---------------------------------------------------------------*/ +enum +{ + WDT_START = -1, +#if defined(BSP_USING_WDT0) + WDT0_IDX, +#endif +#if defined(BSP_USING_WDT1) + WDT1_IDX, +#endif +#if defined(BSP_USING_WDT2) + WDT2_IDX, +#endif + WDT_CNT +}; + +/* Pick a suitable wdt timeout interval, it is a trade-off between the + consideration of timeout accuracy and the system performance. The MIN_CYCLES + parameter is a numerical value of the toutsel setting, and it must be set to + a correct one which matches to the literal meaning of MIN_TOUTSEL. */ +#define MIN_TOUTSEL (WDT_TIMEOUT_2POW10) +#define MIN_CYCLES (1024) + + +/* Macros to convert the value between the timeout interval and the soft time iterations. */ +#define ROUND_TO_INTEGER(value) ((int)(((value) * 10 + 5) / 10)) +#define CONV_SEC_TO_IT(hz, secs) (ROUND_TO_INTEGER((float)((secs) * (hz)) / (float)(MIN_CYCLES))) +#define CONV_IT_TO_SEC(hz, iterations) (ROUND_TO_INTEGER((float)((iterations) * (MIN_CYCLES)) / (float)(hz))) + + +/* Private typedef --------------------------------------------------------------*/ +struct soft_time_handle +{ + int clock_hz; + int wanted_sec; + int report_sec; + int left_iterations; + int full_iterations; + rt_bool_t expired; + rt_bool_t feed_dog; +}; +typedef volatile struct soft_time_handle soft_time_handle_t; + +struct nu_wdt +{ + struct rt_watchdog_device parent; + char *name; + WDT_T *base; + IRQn_Type irqn; + uint32_t modid; + struct soft_time_handle soft_time; +}; +typedef struct nu_wdt *nu_wdt_t; + +/* Private functions ------------------------------------------------------------*/ +static rt_err_t nu_wdt_init(rt_watchdog_t *dev); +static rt_err_t nu_wdt_control(rt_watchdog_t *dev, int cmd, void *args); +static uint32_t nu_wdt_get_module_clock(nu_wdt_t); +static uint32_t nu_wdt_get_working_hz(nu_wdt_t); +static void soft_time_init(soft_time_handle_t *const soft_time); +static void soft_time_setup(uint32_t wanted_sec, uint32_t hz, soft_time_handle_t *const soft_time); +static void soft_time_feed_dog(soft_time_handle_t *const soft_time); +static void nu_wdt_isr(int vector, void *param); +/* Public functions -------------------------------------------------------------*/ + +/* Private variables ------------------------------------------------------------*/ +static struct nu_wdt nu_wdt_arr [] = +{ +#if defined(BSP_USING_WDT0) + { .name = "wdt0", .base = WDT0, .irqn = WDT0_IRQn, .modid = WDT0_MODULE }, +#endif +#if defined(BSP_USING_WDT1) + { .name = "wdt1", .base = WDT1, .irqn = WDT1_IRQn, .modid = WDT1_MODULE }, +#endif +#if defined(BSP_USING_WDT2) + { .name = "wdt2", .base = WDT2, .irqn = WDT2_IRQn, .modid = WDT2_MODULE }, +#endif +}; + +static struct rt_watchdog_ops ops_wdt = +{ + .init = nu_wdt_init, + .control = nu_wdt_control, +}; + + +/* wdt device driver initialize. */ +int rt_hw_wdt_init(void) +{ + int i; + rt_err_t ret = RT_EOK; + + for (i = (WDT_START + 1); i < WDT_CNT; i++) + { + nu_wdt_t psNuWdt = &nu_wdt_arr[i]; + + if (WDT_GET_RESET_FLAG(psNuWdt->base)) + { + LOG_W("%s: System re-boots from watchdog timer reset.\n", psNuWdt->name); + WDT_CLEAR_RESET_FLAG(psNuWdt->base); + } + + psNuWdt->parent.ops = &ops_wdt; + ret = rt_hw_watchdog_register(&psNuWdt->parent, psNuWdt->name, RT_DEVICE_FLAG_RDWR, psNuWdt); + RT_ASSERT(ret == RT_EOK); + + rt_hw_interrupt_install(psNuWdt->irqn, nu_wdt_isr, psNuWdt, psNuWdt->name); + rt_hw_interrupt_umask(psNuWdt->irqn); + } + + return (int)ret; +} +INIT_BOARD_EXPORT(rt_hw_wdt_init); + + +/* Register rt-thread device.init() entry. */ +static rt_err_t nu_wdt_init(rt_watchdog_t *dev) +{ + nu_wdt_t psNuWdt = (nu_wdt_t)dev; + RT_ASSERT(dev != RT_NULL); + + soft_time_init(&psNuWdt->soft_time); + + return RT_EOK; +} + + +static uint32_t nu_wdt_get_module_clock(nu_wdt_t psNuWdt) +{ + uint32_t ret = 0; + switch (psNuWdt->modid) + { + case WDT0_MODULE: + case WDT1_MODULE: + case WDT2_MODULE: + ret = CLK_GetModuleClockSource(psNuWdt->modid); + break; + + default: + break; + } + + return ret; +} + + +static uint32_t nu_wdt_get_working_hz(nu_wdt_t psNuWdt) +{ + uint32_t src_clk, hz = 0; + + src_clk = nu_wdt_get_module_clock(psNuWdt); + + switch (src_clk) + { + case 1: /* CLK_CLKSEL3_WDT0SEL_LXT */ + hz = __LXT; + break; + + case 2: /* CLK_CLKSEL3_WDT0SEL_PCLK3_DIV4096 */ + hz = CLK_GetPCLK3Freq() / 4096; + break; + + case 3: /* CLK_CLKSEL3_WDT0SEL_LIRC */ + hz = __LIRC; + break; + + default: + break; + } + + LOG_D("[%s] modid=%x src_clk=%d src_hz=%d\n", psNuWdt->name, psNuWdt->modid, src_clk, hz); + + return hz; +} + + +static void soft_time_init(soft_time_handle_t *const soft_time) +{ + rt_memset((void *)soft_time, 0, sizeof(struct soft_time_handle)); + +} + + +static void soft_time_setup(uint32_t wanted_sec, uint32_t hz, soft_time_handle_t *const soft_time) +{ + rt_base_t level; + + level = rt_hw_interrupt_disable(); + + soft_time->expired = RT_FALSE; + soft_time->feed_dog = RT_FALSE; + soft_time->wanted_sec = wanted_sec; + soft_time->full_iterations = CONV_SEC_TO_IT(hz, wanted_sec); + soft_time->left_iterations = soft_time->full_iterations; + soft_time->report_sec = CONV_IT_TO_SEC(hz, soft_time->full_iterations); + soft_time->clock_hz = hz; + + rt_hw_interrupt_enable(level); + + LOG_D("wanted_sec=%d\n", soft_time->wanted_sec); + LOG_D("full_iterations=%d\n", soft_time->full_iterations); + LOG_D("left_iterations=%d\n", soft_time->left_iterations); + LOG_D("report_sec=%d\n", soft_time->report_sec); + LOG_D("clock_hz=%d\n", soft_time->clock_hz); + +} + + +static void soft_time_feed_dog(soft_time_handle_t *const soft_time) +{ + soft_time->feed_dog = RT_TRUE; +} + + +/* Register rt-thread device.control() entry. */ +static rt_err_t nu_wdt_control(rt_watchdog_t *dev, int cmd, void *args) +{ + uint32_t wanted_sec, hz; + rt_err_t ret = RT_EOK; + + nu_wdt_t psNuWdt = (nu_wdt_t)dev; + RT_ASSERT(dev); + + //SYS_UnlockReg(); + + hz = nu_wdt_get_working_hz(psNuWdt); + + switch (cmd) + { + case RT_DEVICE_CTRL_WDT_GET_TIMEOUT: + + if (args == RT_NULL) + { + ret = RT_EINVAL; + break; + } + + *((uint32_t *)args) = psNuWdt->soft_time.report_sec; + LOG_D("[GET]report_sec=%d\n", psNuWdt->soft_time.report_sec); + break; + + case RT_DEVICE_CTRL_WDT_SET_TIMEOUT: + + if (args == RT_NULL) + { + ret = RT_EINVAL; + break; + } + + wanted_sec = *((uint32_t *)args); + + if (wanted_sec == 0) + { + ret = RT_EINVAL; + break; + } + + soft_time_setup(wanted_sec, hz, &psNuWdt->soft_time); + LOG_D("[SET]report_sec=%d\n", psNuWdt->soft_time.report_sec); + break; + + case RT_DEVICE_CTRL_WDT_GET_TIMELEFT: + + if (args == RT_NULL) + { + ret = RT_EINVAL; + break; + } + + *((uint32_t *)args) = CONV_IT_TO_SEC(hz, psNuWdt->soft_time.left_iterations); + break; + + case RT_DEVICE_CTRL_WDT_KEEPALIVE: + + /* Make a mark that the application has fed the watchdog. */ + soft_time_feed_dog(&psNuWdt->soft_time); + break; + + case RT_DEVICE_CTRL_WDT_START: + + WDT_RESET_COUNTER(psNuWdt->base); + WDT_Open(psNuWdt->base, MIN_TOUTSEL, WDT_RESET_DELAY_1026CLK, TRUE, TRUE); + WDT_EnableInt(psNuWdt->base); + break; + + case RT_DEVICE_CTRL_WDT_STOP: + + WDT_Close(psNuWdt->base); + break; + + default: + ret = RT_ERROR; + } + + //SYS_LockReg(); + + return -(ret); +} + + +/* wdt interrupt entry */ +static void nu_wdt_isr(int vector, void *param) +{ + nu_wdt_t psNuWdt = (nu_wdt_t)param; + RT_ASSERT(param != RT_NULL); + + /* Clear wdt interrupt flag */ + if (WDT_GET_TIMEOUT_INT_FLAG(psNuWdt->base)) + { + WDT_CLEAR_TIMEOUT_INT_FLAG(psNuWdt->base); + } + + /* Clear wdt wakeup flag */ + if (WDT_GET_TIMEOUT_WAKEUP_FLAG(psNuWdt->base)) + { + WDT_CLEAR_TIMEOUT_WAKEUP_FLAG(psNuWdt->base); + } + + /* The soft time has not reached the configured timeout yet. Clear the wdt counter + any way to prevent the system from hardware wdt reset. */ + if (psNuWdt->soft_time.left_iterations-- > 0) + { + WDT_RESET_COUNTER(psNuWdt->base); + } + + /* The soft time reaches the configured timeout boundary. Clear the wdt + counter if he application has fed the dog at least once until now. */ + else + { + if ((psNuWdt->soft_time.feed_dog) && (!psNuWdt->soft_time.expired)) + { + WDT_RESET_COUNTER(psNuWdt->base); + psNuWdt->soft_time.feed_dog = RT_FALSE; + psNuWdt->soft_time.left_iterations = psNuWdt->soft_time.full_iterations; + } + else + { + /* Application does not feed the dog in time. */ + psNuWdt->soft_time.expired = RT_TRUE; + } + } +} + +#endif /* BSP_USING_WDT */ + + diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/gmac/SConscript b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/SConscript new file mode 100644 index 0000000000..21d7483ac6 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/SConscript @@ -0,0 +1,13 @@ +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +group = [] + +CPPPATH = [cwd] + +if GetDepend('BSP_USING_GMAC'): + group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/gmac/drv_gmac.c b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/drv_gmac.c new file mode 100644 index 0000000000..9a7ee9ed8a --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/drv_gmac.c @@ -0,0 +1,801 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-07-23 Wayne First version +* +******************************************************************************/ + +#include "rtconfig.h" + +#if defined(BSP_USING_GMAC) + +#include "drv_common.h" +#include "drv_sys.h" +#include +#include +#include +#include +#include +#include +#include "lwipopts.h" + +#include "synopGMAC_Host.h" + +#define DBG_ENABLE +//#undef DBG_ENABLE +#define DBG_LEVEL LOG_LVL_INFO +#define DBG_SECTION_NAME "drv_gmac" +#define DBG_COLOR +#include + +/* Private define ---------------------------------------------------------------*/ + +//#define NU_GMAC_DEBUG +#if defined(NU_GMAC_DEBUG) + //#define NU_GMAC_RX_DUMP + //#define NU_GMAC_TX_DUMP + #define NU_GMAC_TRACE rt_kprintf +#else + #define NU_GMAC_TRACE(...) +#endif + +enum +{ + GMAC_START = -1, +#if defined(BSP_USING_GMAC0) + GMAC0_IDX, +#endif +#if defined(BSP_USING_GMAC1) + GMAC1_IDX, +#endif + GMAC_CNT +}; + +#define invalidate_cpu_cache(addr, len) rt_hw_cpu_dcache_invalidate(addr, len) + +/* Private typedef --------------------------------------------------------------*/ + +struct nu_gmac_lwip_pbuf +{ + struct pbuf_custom p; // lwip pbuf + PKT_FRAME_T *psPktFrameDataBuf; // gmac descriptor + synopGMACdevice *gmacdev; + const struct memp_desc *pool; +}; + +typedef struct nu_gmac_lwip_pbuf *nu_gmac_lwip_pbuf_t; + +struct nu_gmac +{ + struct eth_device eth; + char *name; + GMAC_T *base; + IRQn_Type irqn; + rt_timer_t link_timer; + rt_uint8_t mac_addr[8]; + synopGMACNetworkAdapter *adapter; + const struct memp_desc *memp_rx_pool; +}; +typedef struct nu_gmac *nu_gmac_t; + +/* Private variables ------------------------------------------------------------*/ +#if defined(BSP_USING_GMAC0) + LWIP_MEMPOOL_DECLARE(gmac0_rx, RECEIVE_DESC_SIZE, sizeof(struct nu_gmac_lwip_pbuf), "GMAC0 RX PBUF pool"); +#endif + +#if defined(BSP_USING_GMAC1) + LWIP_MEMPOOL_DECLARE(gmac1_rx, RECEIVE_DESC_SIZE, sizeof(struct nu_gmac_lwip_pbuf), "GMAC1 RX PBUF pool"); +#endif + +static struct nu_gmac nu_gmac_arr[] = +{ +#if defined(BSP_USING_GMAC0) + { + .name = "e0", + .base = GMAC0, + .irqn = GMAC0RX_IRQn, + .memp_rx_pool = &memp_gmac0_rx + }, +#endif +#if defined(BSP_USING_GMAC1) + { + .name = "e1", + .base = GMAC1, + .irqn = GMAC1RX_IRQn, + .memp_rx_pool = &memp_gmac1_rx + }, +#endif +}; + +void nu_gmac_pkt_dump(const char *msg, const struct pbuf *p) +{ + rt_uint32_t i; + rt_uint8_t *ptr = p->payload; + + NU_GMAC_TRACE("%s %d byte\n", msg, p->tot_len); + + for (i = 0; i < p->tot_len; i++) + { + if ((i % 8) == 0) + { + NU_GMAC_TRACE(" "); + } + if ((i % 16) == 0) + { + NU_GMAC_TRACE("\r\n"); + } + NU_GMAC_TRACE("%02x ", *ptr); + ptr++; + } + NU_GMAC_TRACE("\n\n"); +} + +static int nu_gmac_mdio_read(void *adapter, int addr, int reg) +{ + synopGMACdevice *gmacdev = ((synopGMACNetworkAdapter *)adapter)->m_gmacdev; + u16 data; + synopGMAC_read_phy_reg(gmacdev->MacBase, addr, reg, &data); + return data; +} + +static void nu_gmac_mdio_write(void *adapter, int addr, int reg, int data) +{ + synopGMACdevice *gmacdev = ((synopGMACNetworkAdapter *)adapter)->m_gmacdev; + synopGMAC_write_phy_reg(gmacdev->MacBase, addr, reg, data); +} + +s32 synopGMAC_check_phy_init(synopGMACNetworkAdapter *adapter) +{ + struct ethtool_cmd cmd; + synopGMACdevice *gmacdev = adapter->m_gmacdev; + + if (!mii_link_ok(&adapter->m_mii)) + { + gmacdev->DuplexMode = FULLDUPLEX; + gmacdev->Speed = SPEED100; + return 0; + } + else + { + mii_ethtool_gset(&adapter->m_mii, &cmd); + gmacdev->DuplexMode = (cmd.duplex == DUPLEX_FULL) ? FULLDUPLEX : HALFDUPLEX ; + if (cmd.speed == SPEED_1000) + gmacdev->Speed = SPEED1000; + else if (cmd.speed == SPEED_100) + gmacdev->Speed = SPEED100; + else + gmacdev->Speed = SPEED10; + } + + return gmacdev->Speed | (gmacdev->DuplexMode << 4); +} + +static void nu_gmac_isr(int irqno, void *param) +{ + nu_gmac_t psNuGMAC = (nu_gmac_t)param; + + synopGMACNetworkAdapter *adapter = psNuGMAC->adapter; + synopGMACdevice *gmacdev = (synopGMACdevice *)adapter->m_gmacdev; + + u32 interrupt, dma_status_reg; + s32 status; + u32 u32GmacIntSts; + u32 u32GmacDmaIE = DmaIntEnable; + + // Check GMAC interrupt + u32GmacIntSts = synopGMACReadReg(gmacdev->MacBase, GmacInterruptStatus); + if (u32GmacIntSts & GmacTSIntSts) + { + gmacdev->synopGMACNetStats.ts_int = 1; + status = synopGMACReadReg(gmacdev->MacBase, GmacTSStatus); + if (!(status & (1 << 1))) + LOG_I("TS alarm flag not set??"); + else + LOG_I("TS alarm!\n"); + } + + synopGMACWriteReg(gmacdev->MacBase, GmacInterruptStatus, u32GmacIntSts); + + dma_status_reg = synopGMACReadReg(gmacdev->DmaBase, DmaStatus); + if (dma_status_reg == 0) + { + //LOG_I("dma_status ==0 \n"); + return; + } + + if (dma_status_reg & GmacPmtIntr) + { + //LOG_D("%s:: Interrupt due to PMT module\n", psNuGMAC->name); + synopGMAC_powerup_mac(gmacdev); + } + + if (dma_status_reg & GmacLineIntfIntr) + { + LOG_I("%s: GMAC status reg is %08x mask is %08x\n", + psNuGMAC->name, + synopGMACReadReg(gmacdev->MacBase, GmacInterruptStatus), + synopGMACReadReg(gmacdev->MacBase, GmacInterruptMask)); + + if (synopGMACReadReg(gmacdev->MacBase, GmacInterruptStatus) & GmacRgmiiIntSts) + { + LOG_D("%s: GMAC RGMII status is %08x\n", + psNuGMAC->name, + synopGMACReadReg(gmacdev->MacBase, GmacRgmiiCtrlSts)); + synopGMACReadReg(gmacdev->MacBase, GmacRgmiiCtrlSts); + } + } + + /* DMA status */ + interrupt = synopGMAC_get_interrupt_type(gmacdev); + LOG_D("%s: 0x%08x@%08x\n", psNuGMAC->name, interrupt, DmaStatus); + + if (interrupt & synopGMACDmaError) + { + LOG_E("%s::Fatal Bus Error Inetrrupt Seen\n", psNuGMAC->name); + synopGMAC_disable_dma_tx(gmacdev); + synopGMAC_disable_dma_rx(gmacdev); + + synopGMAC_take_desc_ownership_tx(gmacdev); + synopGMAC_take_desc_ownership_rx(gmacdev); + + synopGMAC_init_tx_rx_desc_queue(gmacdev); + + synopGMAC_reset(gmacdev); + + synopGMAC_set_mac_addr(gmacdev, GmacAddr0High, GmacAddr0Low, &psNuGMAC->mac_addr[0]); + synopGMAC_dma_bus_mode_init(gmacdev, DmaBurstLength32 | DmaDescriptorSkip0/*DmaDescriptorSkip2*/ | DmaDescriptor8Words); + synopGMAC_dma_control_init(gmacdev, DmaStoreAndForward | DmaTxSecondFrame | DmaRxThreshCtrl128); + synopGMAC_init_rx_desc_base(gmacdev); + synopGMAC_init_tx_desc_base(gmacdev); + synopGMAC_mac_init(gmacdev); + synopGMAC_enable_dma_rx(gmacdev); + synopGMAC_enable_dma_tx(gmacdev); + + } + + if ((interrupt & synopGMACDmaRxNormal) || + (interrupt & synopGMACDmaRxAbnormal)) + { + if (interrupt & synopGMACDmaRxNormal) + { + LOG_D("%s:: Rx Normal \n", psNuGMAC->name); + u32GmacDmaIE &= ~DmaIntRxNormMask; + + } + if (interrupt & synopGMACDmaRxAbnormal) + { + LOG_E("%s::Abnormal Rx Interrupt Seen %08x\n", psNuGMAC->name, dma_status_reg); + + if (gmacdev->GMAC_Power_down == 0) + { + gmacdev->synopGMACNetStats.rx_over_errors++; + u32GmacDmaIE &= ~DmaIntRxAbnMask; + //synopGMAC_resume_dma_rx(gmacdev); + } + } + eth_device_ready(&psNuGMAC->eth); + } + + if (interrupt & synopGMACDmaRxStopped) + { + LOG_E("%s::Receiver stopped seeing Rx interrupts\n", psNuGMAC->name); //Receiver gone in to stopped state + if (gmacdev->GMAC_Power_down == 0) // If Mac is not in powerdown + { + gmacdev->synopGMACNetStats.rx_over_errors++; + synopGMAC_enable_dma_rx(gmacdev); + } + } + + if (interrupt & synopGMACDmaTxNormal) + { + LOG_D("%s::Finished Normal Transmission \n", psNuGMAC->name); + synop_handle_transmit_over(gmacdev);//Do whatever you want after the transmission is over + } + + if (interrupt & synopGMACDmaTxAbnormal) + { + LOG_E("%s::Abnormal Tx Interrupt Seen\n", psNuGMAC->name); + if (gmacdev->GMAC_Power_down == 0) // If Mac is not in powerdown + { + synop_handle_transmit_over(gmacdev); + } + } + + if (interrupt & synopGMACDmaTxStopped) + { + LOG_E("%s::Transmitter stopped sending the packets\n", psNuGMAC->name); + if (gmacdev->GMAC_Power_down == 0) // If Mac is not in powerdown + { + synopGMAC_disable_dma_tx(gmacdev); + synopGMAC_take_desc_ownership_tx(gmacdev); + synopGMAC_enable_dma_tx(gmacdev); + LOG_I("%s::Transmission Resumed\n", psNuGMAC->name); + } + } + + /* Enable the interrupt before returning from ISR*/ + synopGMAC_enable_interrupt(gmacdev, u32GmacDmaIE); +} + +void nu_gmac_link_monitor(void *pvData) +{ + nu_gmac_t psNuGMAC = (nu_gmac_t)pvData; + + synopGMACNetworkAdapter *adapter = psNuGMAC->adapter; + synopGMACdevice *gmacdev = adapter->m_gmacdev; + if (!mii_link_ok(&adapter->m_mii)) + { + if (gmacdev->LinkState) + { + eth_device_linkchange(&psNuGMAC->eth, RT_FALSE); + LOG_I("%s: No Link", psNuGMAC->name); + } + gmacdev->DuplexMode = 0; + gmacdev->Speed = 0; + gmacdev->LoopBackMode = 0; + gmacdev->LinkState = 0; + } + else + { + s32 data, speed; + data = synopGMAC_check_phy_init(adapter); + if (gmacdev->LinkState != data) + { + speed = data & 0x0f; + gmacdev->LinkState = data; + synopGMAC_mac_init(gmacdev); + synopGMAC_set_mode(gmacdev, speed); + eth_device_linkchange(&psNuGMAC->eth, RT_TRUE); + LOG_I("%s: Link is up in %s %s mode", psNuGMAC->name, \ + (speed == SPEED1000) ? "1000M" : (speed == SPEED100) ? "100M" : (speed == SPEED10) ? "10M" : "", + (gmacdev->DuplexMode == FULLDUPLEX) ? "FULL DUPLEX" : "HALF DUPLEX"); + } + } + NU_GMAC_TRACE("%s: Interrupt enable: %08x, status:%08x\n", psNuGMAC->name, synopGMAC_get_ie(gmacdev), synopGMACReadReg(gmacdev->DmaBase, DmaStatus)); + NU_GMAC_TRACE("%s: op:%08x\n", psNuGMAC->name, synopGMACReadReg(gmacdev->DmaBase, DmaControl)); + NU_GMAC_TRACE("%s: debug:%08x\n", psNuGMAC->name, synopGMACReadReg(gmacdev->MacBase, GmacDebug)); +} + +static void nu_memmgr_init(GMAC_MEMMGR_T *psMemMgr) +{ + psMemMgr->u32TxDescSize = TRANSMIT_DESC_SIZE; + psMemMgr->u32RxDescSize = RECEIVE_DESC_SIZE; + + psMemMgr->psTXDescs = (DmaDesc *) rt_malloc_align(sizeof(DmaDesc) * psMemMgr->u32TxDescSize, nu_cpu_dcache_line_size()); + RT_ASSERT(psMemMgr->psTXDescs); + LOG_D("[%s] First TXDescAddr= %08x", __func__, psMemMgr->psTXDescs); + + psMemMgr->psRXDescs = (DmaDesc *) rt_malloc_align(sizeof(DmaDesc) * psMemMgr->u32RxDescSize, nu_cpu_dcache_line_size()); + RT_ASSERT(psMemMgr->psRXDescs); + LOG_D("[%s] First RXDescAddr= %08x", __func__, psMemMgr->psRXDescs); + + psMemMgr->psTXFrames = (PKT_FRAME_T *) rt_malloc_align(sizeof(PKT_FRAME_T) * psMemMgr->u32TxDescSize, nu_cpu_dcache_line_size()); + RT_ASSERT(psMemMgr->psTXFrames); + LOG_D("[%s] First TXFrameAddr= %08x", __func__, psMemMgr->psTXFrames); + + psMemMgr->psRXFrames = (PKT_FRAME_T *) rt_malloc_align(sizeof(PKT_FRAME_T) * psMemMgr->u32RxDescSize, nu_cpu_dcache_line_size()); + RT_ASSERT(psMemMgr->psRXFrames); + LOG_D("[%s] First RXFrameAddr= %08x", __func__, psMemMgr->psRXFrames); +} + +static void nu_mii_init(synopGMACNetworkAdapter *adapter) +{ + /* MII setup */ + adapter->m_mii.phy_id_mask = 0x1F; + adapter->m_mii.reg_num_mask = 0x1F; + adapter->m_mii.adapter = (void *)adapter; + adapter->m_mii.mdio_read = nu_gmac_mdio_read; + adapter->m_mii.mdio_write = nu_gmac_mdio_write; + adapter->m_mii.phy_id = adapter->m_gmacdev->PhyBase; + adapter->m_mii.supports_gmii = mii_check_gmii_support(&adapter->m_mii); +} + +static rt_err_t nu_gmac_init(rt_device_t device) +{ + rt_err_t ret; + s32 status = 0; + char szTmp[32]; + int count; + + nu_gmac_t psNuGMAC = (nu_gmac_t)device; + RT_ASSERT(psNuGMAC); + + synopGMACNetworkAdapter *adapter = psNuGMAC->adapter; + synopGMACdevice *gmacdev = (synopGMACdevice *)adapter->m_gmacdev; + GMAC_MEMMGR_T *psgmacmemmgr = (GMAC_MEMMGR_T *)adapter->m_gmacmemmgr; + + RT_ASSERT(gmacdev); + RT_ASSERT(psgmacmemmgr); + + LOG_D("[%s] Init %s", __func__, psNuGMAC->name); + + synopGMAC_attach(gmacdev, ((uint32_t)psNuGMAC->base + MACBASE), ((uint32_t)psNuGMAC->base + DMABASE), DEFAULT_PHY_BASE, &psNuGMAC->mac_addr[0]); + nu_mii_init(adapter); + + /* Reset to make RGMII/RMII setting take affect. */ + synopGMAC_reset(gmacdev); + synopGMAC_read_version(gmacdev); + LOG_I("%s: HW version is %08x", psNuGMAC->name, gmacdev->Version); + + /*Check for Phy initialization*/ + synopGMAC_set_mdc_clk_div(gmacdev, GmiiCsrClk2); + gmacdev->ClockDivMdc = synopGMAC_get_mdc_clk_div(gmacdev); + status = synopGMAC_check_phy_init(adapter); + + /*Set up the tx and rx descriptor queue/ring*/ + LOG_D("tx desc_queue"); + synopGMAC_setup_tx_desc_queue(gmacdev, &psgmacmemmgr->psTXDescs[0], TRANSMIT_DESC_SIZE, RINGMODE); + synopGMAC_init_tx_desc_base(gmacdev); + LOG_D("DmaTxBaseAddr = %08x\n", synopGMACReadReg(gmacdev->DmaBase, DmaTxBaseAddr)); + + LOG_D("rx desc_queue"); + synopGMAC_setup_rx_desc_queue(gmacdev, &psgmacmemmgr->psRXDescs[0], RECEIVE_DESC_SIZE, RINGMODE); + synopGMAC_init_rx_desc_base(gmacdev); + LOG_D("DmaRxBaseAddr = %08x", synopGMACReadReg(gmacdev->DmaBase, DmaRxBaseAddr)); + + /*Initialize the dma interface*/ + synopGMAC_dma_bus_mode_init(gmacdev, DmaBurstLength32 | DmaDescriptorSkip0/*DmaDescriptorSkip2*/ | DmaDescriptor8Words); + synopGMAC_dma_control_init(gmacdev, DmaStoreAndForward | DmaTxSecondFrame | DmaRxThreshCtrl128); + + /*Initialize the mac interface*/ + gmacdev->Speed = SPEED1000; + gmacdev->DuplexMode = FULLDUPLEX; + synopGMAC_mac_init(gmacdev); + //synopGMAC_promisc_enable(gmacdev); + + synopGMAC_pause_control(gmacdev); // This enables the pause control in Full duplex mode of operation + +#if defined(RT_LWIP_USING_HW_CHECKSUM) + /*IPC Checksum offloading is enabled for this driver. Should only be used if Full Ip checksumm offload engine is configured in the hardware*/ + synopGMAC_enable_rx_chksum_offload(gmacdev); //Enable the offload engine in the receive path + synopGMAC_rx_tcpip_chksum_drop_enable(gmacdev); // This is default configuration, DMA drops the packets if error in encapsulated ethernet payload +#endif + + /* Set all RX frame buffers. */ + count = 0; + do + { + LOG_D("[%s] Set %d pkt frame buffer address - 0x%08x, size=%d", __func__, count, (u32)(&psgmacmemmgr->psRXFrames[count]), PKT_FRAME_BUF_SIZE); + status = synopGMAC_set_rx_qptr(gmacdev, (u32)(&psgmacmemmgr->psRXFrames[count]), PKT_FRAME_BUF_SIZE, 0); + if (status < 0) + { + LOG_E("status < 0!!"); + break; + } + count++; + } + while (count < RECEIVE_DESC_SIZE); + + synopGMAC_clear_interrupt(gmacdev); + + synopGMAC_disable_interrupt_all(gmacdev); + synopGMAC_enable_interrupt(gmacdev, DmaIntEnable); + LOG_D("%s: Interrupt enable: %08x", psNuGMAC->name, synopGMAC_get_ie(gmacdev)); + + synopGMAC_enable_dma_rx(gmacdev); + synopGMAC_enable_dma_tx(gmacdev); + + synopGMAC_set_mac_addr(gmacdev, GmacAddr0High, GmacAddr0Low, &psNuGMAC->mac_addr[0]); + + LOG_D("Create %s link monitor timer.", psNuGMAC->name); + /* Create timer to monitor link status. */ + psNuGMAC->link_timer = rt_timer_create("link_timer", + nu_gmac_link_monitor, + (void *)psNuGMAC, + RT_TICK_PER_SECOND, + RT_TIMER_FLAG_PERIODIC); + RT_ASSERT(psNuGMAC->link_timer); + + ret = rt_timer_start(psNuGMAC->link_timer); + RT_ASSERT(ret == RT_EOK); + + /* Install ISR */ + LOG_D("[%s] Install %s ISR.", __func__, psNuGMAC->name); + rt_snprintf(szTmp, sizeof(szTmp), "%s_rx", psNuGMAC->name); + rt_hw_interrupt_install(psNuGMAC->irqn, nu_gmac_isr, (void *)psNuGMAC, szTmp); + rt_hw_interrupt_umask(psNuGMAC->irqn); + + LOG_D("[%s] Init %s done", __func__, psNuGMAC->name); + + return RT_EOK; +} + +static rt_err_t nu_gmac_open(rt_device_t dev, rt_uint16_t oflag) +{ + return RT_EOK; +} + +static rt_err_t nu_gmac_close(rt_device_t dev) +{ + return RT_EOK; +} + +static rt_size_t nu_gmac_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + rt_set_errno(-RT_ENOSYS); + return 0; +} + +static rt_size_t nu_gmac_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + rt_set_errno(-RT_ENOSYS); + return 0; +} + +static rt_err_t nu_gmac_control(rt_device_t device, int cmd, void *args) +{ + nu_gmac_t psNuGMAC = (nu_gmac_t)device; + RT_ASSERT(device); + + switch (cmd) + { + case NIOCTL_GADDR: + if (args) rt_memcpy(args, &psNuGMAC->mac_addr[0], 6); + else return -RT_ERROR; + break; + + default : + break; + } + + return RT_EOK; +} + +rt_err_t nu_gmac_tx(rt_device_t device, struct pbuf *p) +{ + rt_err_t ret = -RT_ERROR; + s32 status; + + nu_gmac_t psNuGMAC = (nu_gmac_t)device; + synopGMACNetworkAdapter *adapter; + synopGMACdevice *gmacdev; + GMAC_MEMMGR_T *psgmacmemmgr; + + RT_ASSERT(device); + + adapter = (synopGMACNetworkAdapter *) psNuGMAC->adapter; + RT_ASSERT(adapter); + + gmacdev = (synopGMACdevice *) adapter->m_gmacdev; + RT_ASSERT(gmacdev); + + psgmacmemmgr = (GMAC_MEMMGR_T *)adapter->m_gmacmemmgr; + RT_ASSERT(psgmacmemmgr); + + if (!synopGMAC_is_desc_owned_by_dma(gmacdev->TxNextDesc)) + { + u32 offload_needed; +#if defined(RT_LWIP_USING_HW_CHECKSUM) + offload_needed = 1; +#else + offload_needed = 0; +#endif + u32 index = gmacdev->TxNext; + u8 *pu8PktData = (u8 *)((u32)&psgmacmemmgr->psTXFrames[index] | UNCACHEABLE); + struct pbuf *q; + rt_uint32_t offset = 0; + + LOG_D("%s: Transmitting data(%08x-%d).\n", psNuGMAC->name, (u32)&psgmacmemmgr->psTXFrames[index], p->tot_len); + + /* Copy to TX data buffer. */ + for (q = p; q != NULL; q = q->next) + { + rt_uint8_t *ptr = q->payload; + rt_uint32_t len = q->len; + rt_memcpy(&pu8PktData[offset], ptr, len); + offset += len; + } + + status = synopGMAC_xmit_frames(gmacdev, (u8 *)&psgmacmemmgr->psTXFrames[index], offset, offload_needed, 0); + if (status != 0) + { + LOG_E("%s No More Free Tx skb\n", __func__); + ret = -RT_ERROR; + goto exit_nu_gmac_tx; + } + } + else + { + LOG_E("No avaialbe TX descriptor.\n"); + ret = -RT_ERROR; + goto exit_nu_gmac_tx; + } + + ret = RT_EOK; + +exit_nu_gmac_tx: + + return ret; +} + +void nu_gmac_pbuf_free(struct pbuf *p) +{ + nu_gmac_lwip_pbuf_t my_buf = (nu_gmac_lwip_pbuf_t)p; + s32 status; + + SYS_ARCH_DECL_PROTECT(old_level); + SYS_ARCH_PROTECT(old_level); + status = synopGMAC_set_rx_qptr(my_buf->gmacdev, (u32)my_buf->psPktFrameDataBuf, PKT_FRAME_BUF_SIZE, 0); + if (status < 0) + { + LOG_E("synopGMAC_set_rx_qptr: status < 0!!\n"); + } + memp_free_pool(my_buf->pool, my_buf); + SYS_ARCH_UNPROTECT(old_level); +} + +struct pbuf *nu_gmac_rx(rt_device_t device) +{ + nu_gmac_t psNuGMAC = (nu_gmac_t)device; + synopGMACNetworkAdapter *adapter; + synopGMACdevice *gmacdev; + struct pbuf *pbuf = RT_NULL; + PKT_FRAME_T *psPktFrame; + s32 s32PktLen; + + RT_ASSERT(device); + + adapter = psNuGMAC->adapter; + RT_ASSERT(adapter); + + gmacdev = (synopGMACdevice *) adapter->m_gmacdev; + RT_ASSERT(gmacdev); + + if ((s32PktLen = synop_handle_received_data(gmacdev, &psPktFrame)) > 0) + { + nu_gmac_lwip_pbuf_t my_pbuf = (nu_gmac_lwip_pbuf_t)memp_malloc_pool(psNuGMAC->memp_rx_pool); + if (my_pbuf != RT_NULL) + { + my_pbuf->p.custom_free_function = nu_gmac_pbuf_free; + my_pbuf->psPktFrameDataBuf = psPktFrame; + my_pbuf->gmacdev = gmacdev; + my_pbuf->pool = psNuGMAC->memp_rx_pool; + + invalidate_cpu_cache(psPktFrame, s32PktLen); + pbuf = pbuf_alloced_custom(PBUF_RAW, + s32PktLen, + PBUF_REF, + &my_pbuf->p, + psPktFrame, + PKT_FRAME_BUF_SIZE); + if (pbuf == RT_NULL) + LOG_E("%s: failed to alloted %08x\n", psNuGMAC->name, pbuf); + } + else + { + LOG_E("LWIP_MEMPOOL_ALLOC < 0!!\n"); + } + } + else + { + //rt_kprintf("%s : fail to receive data.\n", psNuGMAC->name); + synopGMAC_enable_interrupt(gmacdev, DmaIntEnable); + goto exit_nu_gmac_rx; + } + +exit_nu_gmac_rx: + + return pbuf; +} + +static void nu_gmac_assign_macaddr(nu_gmac_t psNuGMAC) +{ + static rt_uint32_t value = 0x94539452; + + /* Assign MAC address */ + psNuGMAC->mac_addr[0] = 0x82; + psNuGMAC->mac_addr[1] = 0x06; + psNuGMAC->mac_addr[2] = 0x21; + psNuGMAC->mac_addr[3] = (value >> 16) & 0xff; + psNuGMAC->mac_addr[4] = (value >> 8) & 0xff; + psNuGMAC->mac_addr[5] = (value) & 0xff; + + LOG_I("MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n", \ + psNuGMAC->mac_addr[0], \ + psNuGMAC->mac_addr[1], \ + psNuGMAC->mac_addr[2], \ + psNuGMAC->mac_addr[3], \ + psNuGMAC->mac_addr[4], \ + psNuGMAC->mac_addr[5]); + value++; +} + +int32_t nu_gmac_adapter_init(nu_gmac_t psNuGMAC) +{ + synopGMACNetworkAdapter *adapter; + + RT_ASSERT(psNuGMAC); + + /* Allocate net adapter */ + adapter = (synopGMACNetworkAdapter *)rt_malloc_align(sizeof(synopGMACNetworkAdapter), nu_cpu_dcache_line_size()); + RT_ASSERT(adapter); + rt_memset((void *)adapter, 0, sizeof(synopGMACNetworkAdapter)); + + /* Allocate device */ + adapter->m_gmacdev = (synopGMACdevice *) rt_malloc_align(sizeof(synopGMACdevice), nu_cpu_dcache_line_size()); + RT_ASSERT(adapter->m_gmacdev); + rt_memset((char *)adapter->m_gmacdev, 0, sizeof(synopGMACdevice)); + + /* Allocate memory management */ + adapter->m_gmacmemmgr = (GMAC_MEMMGR_T *) rt_malloc_align(sizeof(GMAC_MEMMGR_T), nu_cpu_dcache_line_size()); + RT_ASSERT(adapter->m_gmacmemmgr); + nu_memmgr_init(adapter->m_gmacmemmgr); + + /* Store adapter to priv */ + psNuGMAC->adapter = adapter; + + return 0; +} + +int rt_hw_gmac_init(void) +{ + int i; + rt_err_t ret = RT_EOK; + + for (i = (GMAC_START + 1); i < GMAC_CNT; i++) + { + nu_gmac_t psNuGMAC = (nu_gmac_t)&nu_gmac_arr[i]; + + /* Register member functions */ + psNuGMAC->eth.parent.type = RT_Device_Class_NetIf; + psNuGMAC->eth.parent.init = nu_gmac_init; + psNuGMAC->eth.parent.open = nu_gmac_open; + psNuGMAC->eth.parent.close = nu_gmac_close; + psNuGMAC->eth.parent.read = nu_gmac_read; + psNuGMAC->eth.parent.write = nu_gmac_write; + psNuGMAC->eth.parent.control = nu_gmac_control; + psNuGMAC->eth.parent.user_data = psNuGMAC; + psNuGMAC->eth.eth_rx = nu_gmac_rx; + psNuGMAC->eth.eth_tx = nu_gmac_tx; + + /* Set MAC address */ + nu_gmac_assign_macaddr(psNuGMAC); + + /* Initial GMAC adapter */ + nu_gmac_adapter_init(psNuGMAC); + + /* Initial zero_copy rx pool */ + memp_init_pool(psNuGMAC->memp_rx_pool); + + /* Register eth device */ + ret = eth_device_init(&psNuGMAC->eth, psNuGMAC->name); + RT_ASSERT(ret == RT_EOK); + } + + + return 0; +} +INIT_APP_EXPORT(rt_hw_gmac_init); + +#if 0 +/* + Remeber src += lwipiperf_SRCS in components\net\lwip-*\SConscript +*/ +#include "lwip/apps/lwiperf.h" + +static void +lwiperf_report(void *arg, enum lwiperf_report_type report_type, + const ip_addr_t *local_addr, u16_t local_port, const ip_addr_t *remote_addr, u16_t remote_port, + u32_t bytes_transferred, u32_t ms_duration, u32_t bandwidth_kbitpsec) +{ + LWIP_UNUSED_ARG(arg); + LWIP_UNUSED_ARG(local_addr); + LWIP_UNUSED_ARG(local_port); + + rt_kprintf("IPERF report: type=%d, remote: %s:%d, total bytes: %"U32_F", duration in ms: %"U32_F", kbits/s: %"U32_F"\n", + (int)report_type, ipaddr_ntoa(remote_addr), (int)remote_port, bytes_transferred, ms_duration, bandwidth_kbitpsec); +} + +void lwiperf_example_init(void) +{ + lwiperf_start_tcp_server_default(lwiperf_report, NULL); +} +MSH_CMD_EXPORT(lwiperf_example_init, start lwip tcp server); +#endif + +#endif /* if defined(BSP_USING_GMAC) */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/gmac/mii.c b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/mii.c new file mode 100644 index 0000000000..904a5250e9 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/mii.c @@ -0,0 +1,144 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-07-23 Wayne First version +* +******************************************************************************/ + +#include "mii.h" + +unsigned int mii_nway_result(unsigned int negotiated) +{ + unsigned int ret; + + if (negotiated & LPA_100FULL) + ret = LPA_100FULL; + else if (negotiated & LPA_100BASE4) + ret = LPA_100BASE4; + else if (negotiated & LPA_100HALF) + ret = LPA_100HALF; + else if (negotiated & LPA_10FULL) + ret = LPA_10FULL; + else + ret = LPA_10HALF; + + return ret; +} + +int mii_check_gmii_support(struct mii_if_info *mii) +{ + int reg; + + reg = mii->mdio_read(mii->adapter, mii->phy_id, MII_BMSR); + if (reg & BMSR_ESTATEN) + { + reg = mii->mdio_read(mii->adapter, mii->phy_id, MII_ESTATUS); + if (reg & (ESTATUS_1000_TFULL | ESTATUS_1000_THALF)) + return 1; + } + + return 0; +} + +int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd) +{ + void *adapter = mii->adapter; + u32 advert, bmcr, lpa, nego; + u32 advert2 = 0, bmcr2 = 0, lpa2 = 0; + + ecmd->supported = + (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | + SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | + SUPPORTED_Autoneg | SUPPORTED_TP | SUPPORTED_MII); + if (mii->supports_gmii) + ecmd->supported |= SUPPORTED_1000baseT_Half | + SUPPORTED_1000baseT_Full; + + /* only supports twisted-pair */ + ecmd->port = PORT_MII; + + /* only supports internal transceiver */ + ecmd->transceiver = XCVR_INTERNAL; + + /* this isn't fully supported at higher layers */ + ecmd->phy_address = mii->phy_id; + + ecmd->advertising = ADVERTISED_TP | ADVERTISED_MII; + advert = mii->mdio_read(adapter, mii->phy_id, MII_ADVERTISE); + if (mii->supports_gmii) + advert2 = mii->mdio_read(adapter, mii->phy_id, MII_CTRL1000); + + if (advert & ADVERTISE_10HALF) + ecmd->advertising |= ADVERTISED_10baseT_Half; + if (advert & ADVERTISE_10FULL) + ecmd->advertising |= ADVERTISED_10baseT_Full; + if (advert & ADVERTISE_100HALF) + ecmd->advertising |= ADVERTISED_100baseT_Half; + if (advert & ADVERTISE_100FULL) + ecmd->advertising |= ADVERTISED_100baseT_Full; + if (advert2 & ADVERTISE_1000HALF) + ecmd->advertising |= ADVERTISED_1000baseT_Half; + if (advert2 & ADVERTISE_1000FULL) + ecmd->advertising |= ADVERTISED_1000baseT_Full; + + bmcr = mii->mdio_read(adapter, mii->phy_id, MII_BMCR); + lpa = mii->mdio_read(adapter, mii->phy_id, MII_LPA); + if (mii->supports_gmii) + { + bmcr2 = mii->mdio_read(adapter, mii->phy_id, MII_CTRL1000); + lpa2 = mii->mdio_read(adapter, mii->phy_id, MII_STAT1000); + } + if (bmcr & BMCR_ANENABLE) + { + ecmd->advertising |= ADVERTISED_Autoneg; + ecmd->autoneg = AUTONEG_ENABLE; + + nego = mii_nway_result(advert & lpa); + if ((bmcr2 & (ADVERTISE_1000HALF | ADVERTISE_1000FULL)) & + (lpa2 >> 2)) + ecmd->speed = SPEED_1000; + else if (nego == LPA_100FULL || nego == LPA_100HALF) + ecmd->speed = SPEED_100; + else + ecmd->speed = SPEED_10; + if ((lpa2 & LPA_1000FULL) || nego == LPA_100FULL || + nego == LPA_10FULL) + { + ecmd->duplex = DUPLEX_FULL; + mii->full_duplex = 1; + } + else + { + ecmd->duplex = DUPLEX_HALF; + mii->full_duplex = 0; + } + } + else + { + ecmd->autoneg = AUTONEG_DISABLE; + + ecmd->speed = ((bmcr & BMCR_SPEED1000 && + (bmcr & BMCR_SPEED100) == 0) ? SPEED_1000 : + (bmcr & BMCR_SPEED100) ? SPEED_100 : SPEED_10); + ecmd->duplex = (bmcr & BMCR_FULLDPLX) ? DUPLEX_FULL : DUPLEX_HALF; + } + + /* ignore maxtxpkt, maxrxpkt for now */ + + return 0; +} + +int mii_link_ok(struct mii_if_info *mii) +{ + /* first, a dummy read, needed to latch some MII phys */ + mii->mdio_read(mii->adapter, mii->phy_id, MII_BMSR); + if (mii->mdio_read(mii->adapter, mii->phy_id, MII_BMSR) & BMSR_LSTATUS) + return 1; + return 0; +} + diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/gmac/mii.h b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/mii.h new file mode 100644 index 0000000000..58b6af21a7 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/mii.h @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017-08-24 chinesebear first version + */ + +#ifndef __MII_H__ +#define __MII_H__ + +#include "synopGMAC_types.h" + +#define MII_BMCR 0x00 /* Basic mode control register */ +#define MII_BMSR 0x01 /* Basic mode status register */ +#define MII_PHYSID1 0x02 /* PHYS ID 1 */ +#define MII_PHYSID2 0x03 /* PHYS ID 2 */ +#define MII_ADVERTISE 0x04 /* Advertisement control reg */ +#define MII_LPA 0x05 /* Link partner ability reg */ +#define MII_EXPANSION 0x06 /* Expansion register */ +#define MII_CTRL1000 0x09 /* 1000BASE-T control */ +#define MII_STAT1000 0x0a /* 1000BASE-T status */ +#define MII_ESTATUS 0x0f /* Extended Status */ +#define MII_DCOUNTER 0x12 /* Disconnect counter */ +#define MII_FCSCOUNTER 0x13 /* False carrier counter */ +#define MII_NWAYTEST 0x14 /* N-way auto-neg test reg */ +#define MII_RERRCOUNTER 0x15 /* Receive error counter */ +#define MII_SREVISION 0x16 /* Silicon revision */ +#define MII_RESV1 0x17 /* Reserved... */ +#define MII_LBRERROR 0x18 /* Lpback, rx, bypass error */ +#define MII_PHYADDR 0x19 /* PHY address */ +#define MII_RESV2 0x1a /* Reserved... */ +#define MII_TPISTATUS 0x1b /* TPI status for 10mbps */ +#define MII_NCONFIG 0x1c /* Network interface config */ + +/* Basic mode control register. */ +#define BMCR_RESV 0x003f /* Unused... */ +#define BMCR_SPEED1000 0x0040 /* MSB of Speed (1000) */ +#define BMCR_CTST 0x0080 /* Collision test */ +#define BMCR_FULLDPLX 0x0100 /* Full duplex */ +#define BMCR_ANRESTART 0x0200 /* Auto negotiation restart */ +#define BMCR_ISOLATE 0x0400 /* Disconnect DP83840 from MII */ +#define BMCR_PDOWN 0x0800 /* Powerdown the DP83840 */ +#define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */ +#define BMCR_SPEED100 0x2000 /* Select 100Mbps */ +#define BMCR_LOOPBACK 0x4000 /* TXD loopback bits */ +#define BMCR_RESET 0x8000 /* Reset the DP83840 */ + +/* Basic mode status register. */ +#define BMSR_ERCAP 0x0001 /* Ext-reg capability */ +#define BMSR_JCD 0x0002 /* Jabber detected */ +#define BMSR_LSTATUS 0x0004 /* Link status */ +#define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */ +#define BMSR_RFAULT 0x0010 /* Remote fault detected */ +#define BMSR_ANEGCOMPLETE 0x0020 /* Auto-negotiation complete */ +#define BMSR_RESV 0x00c0 /* Unused... */ +#define BMSR_ESTATEN 0x0100 /* Extended Status in R15 */ +#define BMSR_100FULL2 0x0200 /* Can do 100BASE-T2 HDX */ +#define BMSR_100HALF2 0x0400 /* Can do 100BASE-T2 FDX */ +#define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */ +#define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */ +#define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */ +#define BMSR_100FULL 0x4000 /* Can do 100mbps, full-duplex */ +#define BMSR_100BASE4 0x8000 /* Can do 100mbps, 4k packets */ + +/* Advertisement control register. */ +#define ADVERTISE_SLCT 0x001f /* Selector bits */ +#define ADVERTISE_CSMA 0x0001 /* Only selector supported */ +#define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */ +#define ADVERTISE_1000XFULL 0x0020 /* Try for 1000BASE-X full-duplex */ +#define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */ +#define ADVERTISE_1000XHALF 0x0040 /* Try for 1000BASE-X half-duplex */ +#define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */ +#define ADVERTISE_1000XPAUSE 0x0080 /* Try for 1000BASE-X pause */ +#define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */ +#define ADVERTISE_1000XPSE_ASYM 0x0100 /* Try for 1000BASE-X asym pause */ +#define ADVERTISE_100BASE4 0x0200 /* Try for 100mbps 4k packets */ +#define ADVERTISE_PAUSE_CAP 0x0400 /* Try for pause */ +#define ADVERTISE_PAUSE_ASYM 0x0800 /* Try for asymetric pause */ +#define ADVERTISE_RESV 0x1000 /* Unused... */ +#define ADVERTISE_RFAULT 0x2000 /* Say we can detect faults */ +#define ADVERTISE_LPACK 0x4000 /* Ack link partners response */ +#define ADVERTISE_NPAGE 0x8000 /* Next page bit */ + +#define ADVERTISE_FULL (ADVERTISE_100FULL | ADVERTISE_10FULL | ADVERTISE_CSMA) +#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | ADVERTISE_100HALF | ADVERTISE_100FULL) + +/* Indicates what features are advertised by the interface. */ +#define ADVERTISED_10baseT_Half (1 << 0) +#define ADVERTISED_10baseT_Full (1 << 1) +#define ADVERTISED_100baseT_Half (1 << 2) +#define ADVERTISED_100baseT_Full (1 << 3) +#define ADVERTISED_1000baseT_Half (1 << 4) +#define ADVERTISED_1000baseT_Full (1 << 5) +#define ADVERTISED_Autoneg (1 << 6) +#define ADVERTISED_TP (1 << 7) +#define ADVERTISED_AUI (1 << 8) +#define ADVERTISED_MII (1 << 9) +#define ADVERTISED_FIBRE (1 << 10) +#define ADVERTISED_BNC (1 << 11) +#define ADVERTISED_10000baseT_Full (1 << 12) +#define ADVERTISED_Pause (1 << 13) +#define ADVERTISED_Asym_Pause (1 << 14) + +/* Link partner ability register. */ +#define LPA_SLCT 0x001f /* Same as advertise selector */ +#define LPA_10HALF 0x0020 /* Can do 10mbps half-duplex */ +#define LPA_1000XFULL 0x0020 /* Can do 1000BASE-X full-duplex */ +#define LPA_10FULL 0x0040 /* Can do 10mbps full-duplex */ +#define LPA_1000XHALF 0x0040 /* Can do 1000BASE-X half-duplex */ +#define LPA_100HALF 0x0080 /* Can do 100mbps half-duplex */ +#define LPA_1000XPAUSE 0x0080 /* Can do 1000BASE-X pause */ +#define LPA_100FULL 0x0100 /* Can do 100mbps full-duplex */ +#define LPA_1000XPAUSE_ASYM 0x0100 /* Can do 1000BASE-X pause asym*/ +#define LPA_100BASE4 0x0200 /* Can do 100mbps 4k packets */ +#define LPA_PAUSE_CAP 0x0400 /* Can pause */ +#define LPA_PAUSE_ASYM 0x0800 /* Can pause asymetrically */ +#define LPA_RESV 0x1000 /* Unused... */ +#define LPA_RFAULT 0x2000 /* Link partner faulted */ +#define LPA_LPACK 0x4000 /* Link partner acked us */ +#define LPA_NPAGE 0x8000 /* Next page bit */ + +#define LPA_DUPLEX (LPA_10FULL | LPA_100FULL) +#define LPA_100 (LPA_100FULL | LPA_100HALF | LPA_100BASE4) + +/* Expansion register for auto-negotiation. */ +#define EXPANSION_NWAY 0x0001 /* Can do N-way auto-nego */ +#define EXPANSION_LCWP 0x0002 /* Got new RX page code word */ +#define EXPANSION_ENABLENPAGE 0x0004 /* This enables npage words */ +#define EXPANSION_NPCAPABLE 0x0008 /* Link partner supports npage */ +#define EXPANSION_MFAULTS 0x0010 /* Multiple faults detected */ +#define EXPANSION_RESV 0xffe0 /* Unused... */ + +#define ESTATUS_1000_TFULL 0x2000 /* Can do 1000BT Full */ +#define ESTATUS_1000_THALF 0x1000 /* Can do 1000BT Half */ + +/* N-way test register. */ +#define NWAYTEST_RESV1 0x00ff /* Unused... */ +#define NWAYTEST_LOOPBACK 0x0100 /* Enable loopback for N-way */ +#define NWAYTEST_RESV2 0xfe00 /* Unused... */ + +/* 1000BASE-T Control register */ +#define ADVERTISE_1000FULL 0x0200 /* Advertise 1000BASE-T full duplex */ +#define ADVERTISE_1000HALF 0x0100 /* Advertise 1000BASE-T half duplex */ + +/* 1000BASE-T Status register */ +#define LPA_1000LOCALRXOK 0x2000 /* Link partner local receiver status */ +#define LPA_1000REMRXOK 0x1000 /* Link partner remote receiver status */ +#define LPA_1000FULL 0x0800 /* Link partner 1000BASE-T full duplex */ + +#define SUPPORTED_10baseT_Half (1 << 0) +#define SUPPORTED_10baseT_Full (1 << 1) +#define SUPPORTED_100baseT_Half (1 << 2) +#define SUPPORTED_100baseT_Full (1 << 3) +#define SUPPORTED_1000baseT_Half (1 << 4) +#define SUPPORTED_1000baseT_Full (1 << 5) +#define SUPPORTED_Autoneg (1 << 6) +#define SUPPORTED_TP (1 << 7) +#define SUPPORTED_AUI (1 << 8) +#define SUPPORTED_MII (1 << 9) +#define SUPPORTED_FIBRE (1 << 10) +#define SUPPORTED_BNC (1 << 11) +#define SUPPORTED_10000baseT_Full (1 << 12) +#define SUPPORTED_Pause (1 << 13) +#define SUPPORTED_Asym_Pause (1 << 14) + + +/* Which connector port. */ +#define PORT_TP 0x00 +#define PORT_AUI 0x01 +#define PORT_MII 0x02 +#define PORT_FIBRE 0x03 +#define PORT_BNC 0x04 + +/* Which transceiver to use. */ +#define XCVR_INTERNAL 0x00 +#define XCVR_EXTERNAL 0x01 +#define XCVR_DUMMY1 0x02 +#define XCVR_DUMMY2 0x03 +#define XCVR_DUMMY3 0x04 + +#define AUTONEG_DISABLE 0x00 +#define AUTONEG_ENABLE 0x01 + + +#define SPEED_10 10 +#define SPEED_100 100 +#define SPEED_1000 1000 +#define SPEED_2500 2500 +#define SPEED_10000 10000 + +#define DUPLEX_HALF 0x00 +#define DUPLEX_FULL 0x01 + +struct ethtool_cmd +{ + u32 cmd; + u32 supported; /* Features this interface supports */ + u32 advertising; /* Features this interface advertises */ + u16 speed; /* The forced speed, 10Mb, 100Mb, gigabit */ + u8 duplex; /* Duplex, half or full */ + u8 port; /* Which connector port */ + u8 phy_address; + u8 transceiver; /* Which transceiver to use */ + u8 autoneg; /* Enable or disable autonegotiation */ + u32 maxtxpkt; /* Tx pkts before generating tx int */ + u32 maxrxpkt; /* Rx pkts before generating rx int */ + u32 reserved[4]; +}; + +struct mii_if_info +{ + int phy_id; + int advertising; + int phy_id_mask; + int reg_num_mask; + + unsigned int full_duplex : 1; /* is full duplex? */ + unsigned int force_media : 1; /* is autoneg. disabled? */ + unsigned int supports_gmii : 1; /* are GMII registers supported? */ + + void *adapter; + int (*mdio_read)(void *adapter, int phy_id, int location); + void (*mdio_write)(void *adapter, int phy_id, int location, int val); +}; + +unsigned int mii_nway_result(unsigned int negotiated); +int mii_check_gmii_support(struct mii_if_info *mii); +int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd); +int mii_link_ok(struct mii_if_info *mii); +#endif diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_Dev.c b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_Dev.c new file mode 100644 index 0000000000..52e6c6ede9 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_Dev.c @@ -0,0 +1,2961 @@ +/* =================================================================================== + * Copyright (c) <2009> Synopsys, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software annotated with this license and associated documentation files + * (the "Software"), to deal in the Software without restriction, including without + * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * =================================================================================== */ + +/** \file + * This file defines the synopsys GMAC device dependent functions. + * Most of the operations on the GMAC device are available in this file. + * Functions for initiliasing and accessing MAC/DMA/PHY registers and the DMA descriptors + * are encapsulated in this file. The functions are platform/host/OS independent. + * These functions in turn use the low level device dependent (HAL) functions to + * access the register space. + * \internal + * ------------------------REVISION HISTORY--------------------------------- + * Synopsys 01/Aug/2007 Created + */ + +#include "synopGMAC_Dev.h" +#include "synopGMAC_network_interface.h" + +/** + * Function to set the MDC clock for mdio transactiona + * + * @param[in] pointer to device structure. + * @param[in] clk divider value. + * \return Reuturns 0 on success else return the error value. + */ +s32 synopGMAC_set_mdc_clk_div(synopGMACdevice *gmacdev, u32 clk_div_val) +{ + u32 orig_data; + orig_data = synopGMACReadReg(gmacdev->MacBase, GmacGmiiAddr); //set the mdc clock to the user defined value + orig_data &= (~ GmiiCsrClkMask); + orig_data |= clk_div_val; + synopGMACWriteReg(gmacdev->MacBase, GmacGmiiAddr, orig_data); + return 0; +} + +/** + * Returns the current MDC divider value programmed in the ip. + * + * @param[in] pointer to device structure. + * @param[in] clk divider value. + * \return Returns the MDC divider value read. + */ +u32 synopGMAC_get_mdc_clk_div(synopGMACdevice *gmacdev) +{ + u32 data; + data = synopGMACReadReg(gmacdev->MacBase, GmacGmiiAddr); + data &= GmiiCsrClkMask; + return data; +} + + +/** + * Function to read the Phy register. The access to phy register + * is a slow process as the data is moved accross MDI/MDO interface + * @param[in] pointer to Register Base (It is the mac base in our case) . + * @param[in] PhyBase register is the index of one of supported 32 PHY devices. + * @param[in] Register offset is the index of one of the 32 phy register. + * @param[out] u16 data read from the respective phy register (only valid iff return value is 0). + * \return Returns 0 on success else return the error status. + */ +s32 synopGMAC_read_phy_reg(u32 RegBase, u32 PhyBase, u32 RegOffset, u16 *data) +{ + u32 addr; + u32 loop_variable; + addr = ((PhyBase << GmiiDevShift) & GmiiDevMask) | ((RegOffset << GmiiRegShift) & GmiiRegMask); + addr = addr | GmiiBusy ; //Gmii busy bit + synopGMACWriteReg(RegBase, GmacGmiiAddr, addr); //write the address from where the data to be read in GmiiGmiiAddr register of synopGMAC ip + + for (loop_variable = 0; loop_variable < DEFAULT_LOOP_VARIABLE; loop_variable++) //Wait till the busy bit gets cleared with in a certain amount of time + { + if (!(synopGMACReadReg(RegBase, GmacGmiiAddr) & GmiiBusy)) + { + break; + } + plat_delay(DEFAULT_DELAY_VARIABLE); + } + if (loop_variable < DEFAULT_LOOP_VARIABLE) + * data = (u16)(synopGMACReadReg(RegBase, GmacGmiiData) & 0xFFFF); + else + { + TR("Error::: PHY not responding Busy bit didnot get cleared !!!!!!\n"); + return -ESYNOPGMACPHYERR; + } + return 0; +} + +/** + * Function to write to the Phy register. The access to phy register + * is a slow process as the data is moved accross MDI/MDO interface + * @param[in] pointer to Register Base (It is the mac base in our case) . + * @param[in] PhyBase register is the index of one of supported 32 PHY devices. + * @param[in] Register offset is the index of one of the 32 phy register. + * @param[in] data to be written to the respective phy register. + * \return Returns 0 on success else return the error status. + */ +s32 synopGMAC_write_phy_reg(u32 RegBase, u32 PhyBase, u32 RegOffset, u16 data) +{ + u32 addr; + u32 loop_variable; + + synopGMACWriteReg(RegBase, GmacGmiiData, data); // write the data in to GmacGmiiData register of synopGMAC ip + + addr = ((PhyBase << GmiiDevShift) & GmiiDevMask) | ((RegOffset << GmiiRegShift) & GmiiRegMask) | GmiiWrite; + + addr = addr | GmiiBusy ; //set Gmii clk to 20-35 Mhz and Gmii busy bit + + synopGMACWriteReg(RegBase, GmacGmiiAddr, addr); + for (loop_variable = 0; loop_variable < DEFAULT_LOOP_VARIABLE; loop_variable++) + { + if (!(synopGMACReadReg(RegBase, GmacGmiiAddr) & GmiiBusy)) + { + break; + } + plat_delay(DEFAULT_DELAY_VARIABLE); + } + + if (loop_variable < DEFAULT_LOOP_VARIABLE) + { + return 0; + } + else + { + TR("Error::: PHY not responding Busy bit didnot get cleared !!!!!!\n"); + return -ESYNOPGMACPHYERR; + } +} + +/** + * Function to configure the phy in loopback mode. + * + * @param[in] pointer to synopGMACdevice. + * @param[in] enable or disable the loopback. + * \return 0 on success else return the error status. + * \note Don't get confused with mac loop-back synopGMAC_loopback_on(synopGMACdevice *) + * and synopGMAC_loopback_off(synopGMACdevice *) functions. + */ +s32 synopGMAC_phy_loopback(synopGMACdevice *gmacdev, bool loopback) +{ + s32 status = 0; +#ifndef EMULATION + if (loopback) + status = synopGMAC_write_phy_reg(gmacdev->MacBase, gmacdev->PhyBase, PHY_CONTROL_REG, Mii_Loopback); + else + status = synopGMAC_write_phy_reg(gmacdev->MacBase, gmacdev->PhyBase, PHY_CONTROL_REG, Mii_NoLoopback); +#endif + return status; +} + + + +/** + * Function to read the GMAC IP Version and populates the same in device data structure. + * @param[in] pointer to synopGMACdevice. + * \return Always return 0. + */ + +s32 synopGMAC_read_version(synopGMACdevice *gmacdev) +{ + u32 data = 0; + data = synopGMACReadReg(gmacdev->MacBase, GmacVersion); + gmacdev->Version = data; + TR("The data read from %08x is %08x\n", (gmacdev->MacBase + GmacVersion), data); + return 0; +} + + +/** + * Function to reset the GMAC core. + * This reests the DMA and GMAC core. After reset all the registers holds their respective reset value + * @param[in] pointer to synopGMACdevice. + * \return 0 on success else return the error status. + */ + +s32 synopGMAC_reset(synopGMACdevice *gmacdev) +{ + u32 data = 0; + synopGMACWriteReg(gmacdev->DmaBase, DmaBusMode, DmaResetOn); + plat_delay(DEFAULT_LOOP_VARIABLE); + + do + { + data = synopGMACReadReg(gmacdev->DmaBase, DmaBusMode); + } + while (data & 1); + + TR("DATA after Reset = %08x\n", data); + + return 0; +} + +s32 synopGMAC_reset_nocheck(synopGMACdevice *gmacdev) +{ + synopGMACWriteReg(gmacdev->DmaBase, DmaBusMode, DmaResetOn); + plat_delay(DEFAULT_LOOP_VARIABLE); + return 0; +} + +/** + * Function to program DMA bus mode register. + * + * The Bus Mode register is programmed with the value given. The bits to be set are + * bit wise or'ed and sent as the second argument to this function. + * @param[in] pointer to synopGMACdevice. + * @param[in] the data to be programmed. + * \return 0 on success else return the error status. + */ +s32 synopGMAC_dma_bus_mode_init(synopGMACdevice *gmacdev, u32 init_value) +{ + synopGMACWriteReg(gmacdev->DmaBase, DmaBusMode, init_value); + return 0; + +} + +/** + * Function to program DMA Control register. + * + * The Dma Control register is programmed with the value given. The bits to be set are + * bit wise or'ed and sent as the second argument to this function. + * @param[in] pointer to synopGMACdevice. + * @param[in] the data to be programmed. + * \return 0 on success else return the error status. + */ +s32 synopGMAC_dma_control_init(synopGMACdevice *gmacdev, u32 init_value) +{ + synopGMACWriteReg(gmacdev->DmaBase, DmaControl, init_value); + return 0; +} + + +/*Gmac configuration functions*/ + +/** + * Enable the watchdog timer on the receiver. + * When enabled, Gmac enables Watchdog timer, and GMAC allows no more than + * 2048 bytes of data (10,240 if Jumbo frame enabled). + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_wd_enable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacWatchdog); + return; +} +/** + * Disable the watchdog timer on the receiver. + * When disabled, Gmac disabled watchdog timer, and can receive frames up to + * 16,384 bytes. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_wd_disable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacWatchdog); + return; +} + +/** + * Enables the Jabber frame support. + * When enabled, GMAC disabled the jabber timer, and can transfer 16,384 byte frames. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_jab_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacJabber); + return; +} +/** + * Disables the Jabber frame support. + * When disabled, GMAC enables jabber timer. It cuts of transmitter if application + * sends more than 2048 bytes of data (10240 if Jumbo frame enabled). + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_jab_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacJabber); + return; +} + +/** + * Enables Frame bursting (Only in Half Duplex Mode). + * When enabled, GMAC allows frame bursting in GMII Half Duplex mode. + * Reserved in 10/100 and Full-Duplex configurations. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_frame_burst_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacFrameBurst); + return; +} +/** + * Disables Frame bursting. + * When Disabled, frame bursting is not supported. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_frame_burst_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacFrameBurst); + return; +} + +/** + * Enable Jumbo frame support. + * When Enabled GMAC supports jumbo frames of 9018/9022(VLAN tagged). + * Giant frame error is not reported in receive frame status. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_jumbo_frame_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacJumboFrame); + return; +} +/** + * Disable Jumbo frame support. + * When Disabled GMAC does not supports jumbo frames. + * Giant frame error is reported in receive frame status. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_jumbo_frame_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacJumboFrame); + return; +} + +/** + * Disable Carrier sense. + * When Disabled GMAC ignores CRS signal during frame transmission + * in half duplex mode. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ + +void synopGMAC_disable_crs(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacDisableCrs); + return; +} + + + +/** + * Selects the GMII port. + * When called GMII (1000Mbps) port is selected (programmable only in 10/100/1000 Mbps configuration). + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_select_gmii(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacMiiGmii); + return; +} +/** + * Selects the MII port. + * When called MII (10/100Mbps) port is selected (programmable only in 10/100/1000 Mbps configuration). + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_select_mii(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacMiiGmii); + return; +} + +/** + * Enables Receive Own bit (Only in Half Duplex Mode). + * When enaled GMAC receives all the packets given by phy while transmitting. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_rx_own_enable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacRxOwn); + return; +} +/** + * Disables Receive Own bit (Only in Half Duplex Mode). + * When enaled GMAC disables the reception of frames when gmii_txen_o is asserted. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_rx_own_disable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacRxOwn); + return; +} + +/** + * Sets the GMAC in loopback mode. + * When on GMAC operates in loop-back mode at GMII/MII. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + * \note (G)MII Receive clock is required for loopback to work properly, as transmit clock is + * not looped back internally. + */ +void synopGMAC_loopback_on(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacLoopback); + return; +} +/** + * Sets the GMAC in Normal mode. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_loopback_off(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacLoopback); + return; +} + +/** + * Sets the GMAC core in Full-Duplex mode. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_set_full_duplex(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacDuplex); + return; +} +/** + * Sets the GMAC core in Half-Duplex mode. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_set_half_duplex(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacDuplex); + return; +} + +/** + * GMAC tries retransmission (Only in Half Duplex mode). + * If collision occurs on the GMII/MII, GMAC attempt retries based on the + * back off limit configured. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + * \note This function is tightly coupled with synopGMAC_back_off_limit(synopGMACdev *, u32). + */ +void synopGMAC_retry_enable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacRetry); + return; +} +/** + * GMAC tries only one transmission (Only in Half Duplex mode). + * If collision occurs on the GMII/MII, GMAC will ignore the current frami + * transmission and report a frame abort with excessive collision in tranmit frame status. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_retry_disable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacRetry); + return; +} + +/** + * GMAC strips the Pad/FCS field of incoming frames. + * This is true only if the length field value is less than or equal to + * 1500 bytes. All received frames with length field greater than or equal to + * 1501 bytes are passed to the application without stripping the Pad/FCS field. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_pad_crc_strip_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacPadCrcStrip); + return; +} +/** + * GMAC doesnot strips the Pad/FCS field of incoming frames. + * GMAC will pass all the incoming frames to Host unmodified. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_pad_crc_strip_disable(synopGMACdevice *gmacdev) +{ + u32 status; + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacPadCrcStrip); + status = synopGMACReadReg(gmacdev->MacBase, GmacConfig); + if ((status & GmacPadCrcStrip)) + { + TR("strips status : %u\n", status & GmacPadCrcStrip); + } + return; +} +/** + * GMAC programmed with the back off limit value. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + * \note This function is tightly coupled with synopGMAC_retry_enable(synopGMACdevice * gmacdev) + */ +void synopGMAC_back_off_limit(synopGMACdevice *gmacdev, u32 value) +{ + u32 data; + data = synopGMACReadReg(gmacdev->MacBase, GmacConfig); + data &= (~GmacBackoffLimit); + data |= value; + synopGMACWriteReg(gmacdev->MacBase, GmacConfig, data); + return; +} + +/** + * Enables the Deferral check in GMAC (Only in Half Duplex mode) + * GMAC issues a Frame Abort Status, along with the excessive deferral error bit set in the + * transmit frame status when transmit state machine is deferred for more than + * - 24,288 bit times in 10/100Mbps mode + * - 155,680 bit times in 1000Mbps mode or Jumbo frame mode in 10/100Mbps operation. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + * \note Deferral begins when transmitter is ready to transmit, but is prevented because of + * an active CRS (carrier sense) + */ +void synopGMAC_deferral_check_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacDeferralCheck); + return; +} +/** + * Disables the Deferral check in GMAC (Only in Half Duplex mode). + * GMAC defers until the CRS signal goes inactive. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_deferral_check_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacDeferralCheck); + return; +} +/** + * Enable the reception of frames on GMII/MII. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_rx_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacRx); + return; +} +/** + * Disable the reception of frames on GMII/MII. + * GMAC receive state machine is disabled after completion of reception of current frame. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_rx_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacRx); + return; +} +/** + * Enable the transmission of frames on GMII/MII. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_tx_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacTx); + return; +} +/** + * Disable the transmission of frames on GMII/MII. + * GMAC transmit state machine is disabled after completion of transmission of current frame. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_tx_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacTx); + return; +} + + +/*Receive frame filter configuration functions*/ + +/** + * Enables reception of all the frames to application. + * GMAC passes all the frames received to application irrespective of whether they + * pass SA/DA address filtering or not. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_frame_filter_enable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacFrameFilter, GmacFilter); + return; +} +/** + * Disables reception of all the frames to application. + * GMAC passes only those received frames to application which + * pass SA/DA address filtering. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_frame_filter_disable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFrameFilter, GmacFilter); + return; +} + +/** + * Populates the Hash High register with the data supplied. + * This function is called when the Hash filtering is to be enabled. + * @param[in] pointer to synopGMACdevice. + * @param[in] data to be written to hash table high register. + * \return void. + */ +void synopGMAC_write_hash_table_high(synopGMACdevice *gmacdev, u32 data) +{ + synopGMACWriteReg(gmacdev->MacBase, GmacHashHigh, data); + return; +} + +/** + * Populates the Hash Low register with the data supplied. + * This function is called when the Hash filtering is to be enabled. + * @param[in] pointer to synopGMACdevice. + * @param[in] data to be written to hash table low register. + * \return void. + */ +void synopGMAC_write_hash_table_low(synopGMACdevice *gmacdev, u32 data) +{ + synopGMACWriteReg(gmacdev->MacBase, GmacHashLow, data); + return; +} + +/** + * Enables Hash or Perfect filter (only if Hash filter is enabled in H/W). + * Only frames matching either perfect filtering or Hash Filtering as per HMC and HUC + * configuration are sent to application. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_hash_perfect_filter_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFrameFilter, GmacHashPerfectFilter); + return; +} + +/** + * Enables only Hash(only if Hash filter is enabled in H/W). + * Only frames matching Hash Filtering as per HMC and HUC + * configuration are sent to application. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_Hash_filter_only_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFrameFilter, GmacHashPerfectFilter); + return; +} + +/** + * Enables Source address filtering. + * When enabled source address filtering is performed. Only frames matching SA filtering are passed to application with + * SAMatch bit of RxStatus is set. GMAC drops failed frames. + * @param[in] pointer to synopGMACdevice. + * \return void. + * \note This function is overriden by synopGMAC_frame_filter_disable(synopGMACdevice *) + */ +void synopGMAC_src_addr_filter_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFrameFilter, GmacSrcAddrFilter); + return; +} +/** + * Disables Source address filtering. + * When disabled GMAC forwards the received frames with updated SAMatch bit in RxStatus. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_src_addr_filter_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacFrameFilter, GmacSrcAddrFilter); + return; +} +/** + * Enables Inverse Destination address filtering. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_dst_addr_filter_inverse(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFrameFilter, GmacDestAddrFilterNor); + return; +} +/** + * Enables the normal Destination address filtering. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_dst_addr_filter_normal(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacFrameFilter, GmacDestAddrFilterNor); + return; +} + +/** + * Enables forwarding of control frames. + * When set forwards all the control frames (incl. unicast and multicast PAUSE frames). + * @param[in] pointer to synopGMACdevice. + * \return void. + * \note Depends on RFE of FlowControlRegister[2] + */ +void synopGMAC_set_pass_control(synopGMACdevice *gmacdev, u32 passcontrol) +{ + u32 data; + data = synopGMACReadReg(gmacdev->MacBase, GmacFrameFilter); + data &= (~GmacPassControl); + data |= passcontrol; + synopGMACWriteReg(gmacdev->MacBase, GmacFrameFilter, data); + return; +} + +/** + * Enables Broadcast frames. + * When enabled Address filtering module passes all incoming broadcast frames. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_broadcast_enable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacFrameFilter, GmacBroadcast); + return; +} + +/** + * Disable Broadcast frames. + * When disabled Address filtering module filters all incoming broadcast frames. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_broadcast_disable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFrameFilter, GmacBroadcast); + return; +} + +/** + * Enables Multicast frames. + * When enabled all multicast frames are passed. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_multicast_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFrameFilter, GmacMulticastFilter); + return; +} +/** + * Disable Multicast frames. + * When disabled multicast frame filtering depends on HMC bit. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_multicast_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacFrameFilter, GmacMulticastFilter); + return; +} + +/** + * Enables multicast hash filtering. + * When enabled GMAC performs teh destination address filtering according to the hash table. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_multicast_hash_filter_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFrameFilter, GmacMcastHashFilter); + return; +} +/** + * Disables multicast hash filtering. + * When disabled GMAC performs perfect destination address filtering for multicast frames, it compares + * DA field with the value programmed in DA register. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_multicast_hash_filter_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacFrameFilter, GmacMcastHashFilter); + return; +} + +/** + * Enables promiscous mode. + * When enabled Address filter modules pass all incoming frames regardless of their Destination + * and source addresses. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_promisc_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFrameFilter, GmacPromiscuousMode); + return; +} +/** + * Clears promiscous mode. + * When called the GMAC falls back to normal operation from promiscous mode. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_promisc_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacFrameFilter, GmacPromiscuousMode); + return; +} + + +/** + * Enables unicast hash filtering. + * When enabled GMAC performs the destination address filtering of unicast frames according to the hash table. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_unicast_hash_filter_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFrameFilter, GmacUcastHashFilter); + return; +} +/** + * Disables multicast hash filtering. + * When disabled GMAC performs perfect destination address filtering for unicast frames, it compares + * DA field with the value programmed in DA register. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_unicast_hash_filter_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacFrameFilter, GmacUcastHashFilter); + return; +} + +/*Flow control configuration functions*/ + +/** + * Enables detection of pause frames with stations unicast address. + * When enabled GMAC detects the pause frames with stations unicast address in addition to the + * detection of pause frames with unique multicast address. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_unicast_pause_frame_detect_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFlowControl, GmacUnicastPauseFrame); + return; +} +/** + * Disables detection of pause frames with stations unicast address. + * When disabled GMAC only detects with the unique multicast address (802.3x). + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_unicast_pause_frame_detect_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacFlowControl, GmacUnicastPauseFrame); + return; +} +/** + * Rx flow control enable. + * When Enabled GMAC will decode the rx pause frame and disable the tx for a specified time. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_rx_flow_control_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFlowControl, GmacRxFlowControl); + return; +} +/** + * Rx flow control disable. + * When disabled GMAC will not decode pause frame. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_rx_flow_control_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacFlowControl, GmacRxFlowControl); + return; +} +/** + * Tx flow control enable. + * When Enabled + * - In full duplex GMAC enables flow control operation to transmit pause frames. + * - In Half duplex GMAC enables the back pressure operation + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_tx_flow_control_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacFlowControl, GmacTxFlowControl); + return; +} + +/** + * Tx flow control disable. + * When Disabled + * - In full duplex GMAC will not transmit any pause frames. + * - In Half duplex GMAC disables the back pressure feature. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_tx_flow_control_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacFlowControl, GmacTxFlowControl); + return; +} + +/** + * Initiate Flowcontrol operation. + * When Set + * - In full duplex GMAC initiates pause control frame. + * - In Half duplex GMAC initiates back pressure function. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_tx_activate_flow_control(synopGMACdevice *gmacdev) +{ + //In case of full duplex check for this bit to b'0. if it is read as b'1 indicates that + //control frame transmission is in progress. + if (gmacdev->Speed == FULLDUPLEX) + { + if (!synopGMACCheckBits(gmacdev->MacBase, GmacFlowControl, GmacFlowControlBackPressure)) + synopGMACSetBits(gmacdev->MacBase, GmacFlowControl, GmacFlowControlBackPressure); + } + else //if half duplex mode + { + + synopGMACSetBits(gmacdev->MacBase, GmacFlowControl, GmacFlowControlBackPressure); + } + + return; +} + +/** + * stops Flowcontrol operation. + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_tx_deactivate_flow_control(synopGMACdevice *gmacdev) +{ + //In full duplex this bit is automatically cleared after transmitting a pause control frame. + if (gmacdev->Speed == HALFDUPLEX) + { + synopGMACSetBits(gmacdev->MacBase, GmacFlowControl, GmacFlowControlBackPressure); + } + return; +} + +/** + * This enables the pause frame generation after programming the appropriate registers. + * presently activation is set at 3k and deactivation set at 4k. These may have to tweaked + * if found any issues + * @param[in] pointer to synopGMACdevice. + * \return void. + */ +void synopGMAC_pause_control(synopGMACdevice *gmacdev) +{ + u32 omr_reg; + u32 mac_flow_control_reg; + omr_reg = synopGMACReadReg(gmacdev->DmaBase, DmaControl); + omr_reg |= DmaRxFlowCtrlAct4K | DmaRxFlowCtrlDeact5K | DmaEnHwFlowCtrl; + synopGMACWriteReg(gmacdev->DmaBase, DmaControl, omr_reg); + + mac_flow_control_reg = synopGMACReadReg(gmacdev->MacBase, GmacFlowControl); + mac_flow_control_reg |= GmacRxFlowControl | GmacTxFlowControl | 0xFFFF0000; + synopGMACWriteReg(gmacdev->MacBase, GmacFlowControl, mac_flow_control_reg); + + return; + +} + +/** + * Example mac initialization sequence. + * This function calls the initialization routines to initialize the GMAC register. + * One can change the functions invoked here to have different configuration as per the requirement + * @param[in] pointer to synopGMACdevice. + * \return Returns 0 on success. + */ +s32 synopGMAC_mac_init(synopGMACdevice *gmacdev) +{ + u32 PHYreg; + + if (gmacdev->DuplexMode == FULLDUPLEX) + { + synopGMAC_wd_enable(gmacdev); + synopGMAC_jab_enable(gmacdev); + synopGMAC_frame_burst_enable(gmacdev); + synopGMAC_jumbo_frame_disable(gmacdev); + synopGMAC_rx_own_enable(gmacdev); + synopGMAC_loopback_off(gmacdev); + synopGMAC_set_full_duplex(gmacdev); + synopGMAC_retry_enable(gmacdev); + synopGMAC_pad_crc_strip_disable(gmacdev); + synopGMAC_back_off_limit(gmacdev, GmacBackoffLimit0); + synopGMAC_deferral_check_disable(gmacdev); + + + if (gmacdev->Speed == SPEED1000) + synopGMAC_select_gmii(gmacdev); + else + synopGMAC_select_mii(gmacdev); + + // Cannot enable tx/rx while changing Speed/mode. + synopGMAC_tx_enable(gmacdev); + synopGMAC_rx_enable(gmacdev); + /*Frame Filter Configuration*/ + synopGMAC_frame_filter_enable(gmacdev); + synopGMAC_set_pass_control(gmacdev, GmacPassControl0); + synopGMAC_broadcast_enable(gmacdev); + synopGMAC_src_addr_filter_disable(gmacdev); + synopGMAC_multicast_disable(gmacdev); + synopGMAC_dst_addr_filter_normal(gmacdev); + synopGMAC_multicast_hash_filter_disable(gmacdev); + synopGMAC_promisc_disable(gmacdev); + synopGMAC_unicast_hash_filter_disable(gmacdev); + + /*Flow Control Configuration*/ + synopGMAC_unicast_pause_frame_detect_disable(gmacdev); + synopGMAC_rx_flow_control_enable(gmacdev); + synopGMAC_tx_flow_control_enable(gmacdev); + } + else //for Half Duplex configuration + { + + synopGMAC_wd_enable(gmacdev); + synopGMAC_jab_enable(gmacdev); + synopGMAC_frame_burst_enable(gmacdev); + synopGMAC_jumbo_frame_disable(gmacdev); + synopGMAC_rx_own_enable(gmacdev); + synopGMAC_loopback_off(gmacdev); + synopGMAC_set_half_duplex(gmacdev); + synopGMAC_retry_enable(gmacdev); + synopGMAC_pad_crc_strip_disable(gmacdev); + synopGMAC_back_off_limit(gmacdev, GmacBackoffLimit0); + synopGMAC_deferral_check_disable(gmacdev); + + + if (gmacdev->Speed == SPEED1000) + synopGMAC_select_gmii(gmacdev); + else + synopGMAC_select_mii(gmacdev); + + synopGMAC_tx_enable(gmacdev); + synopGMAC_rx_enable(gmacdev); + /*Frame Filter Configuration*/ + synopGMAC_frame_filter_enable(gmacdev); + synopGMAC_set_pass_control(gmacdev, GmacPassControl0); + synopGMAC_broadcast_enable(gmacdev); + synopGMAC_src_addr_filter_disable(gmacdev); + synopGMAC_multicast_disable(gmacdev); + synopGMAC_dst_addr_filter_normal(gmacdev); + synopGMAC_multicast_hash_filter_disable(gmacdev); + synopGMAC_promisc_disable(gmacdev); + synopGMAC_unicast_hash_filter_disable(gmacdev); + + /*Flow Control Configuration*/ + synopGMAC_unicast_pause_frame_detect_disable(gmacdev); + synopGMAC_rx_flow_control_disable(gmacdev); + synopGMAC_tx_flow_control_disable(gmacdev); + + /*To set PHY register to enable CRS on Transmit*/ + synopGMACWriteReg(gmacdev->MacBase, GmacGmiiAddr, GmiiBusy | 0x00000408); + PHYreg = synopGMACReadReg(gmacdev->MacBase, GmacGmiiData); + synopGMACWriteReg(gmacdev->MacBase, GmacGmiiData, PHYreg | 0x00000800); + synopGMACWriteReg(gmacdev->MacBase, GmacGmiiAddr, GmiiBusy | 0x0000040a); + } + return 0; +} + +/** + * Sets the Mac address in to GMAC register. + * This function sets the MAC address to the MAC register in question. + * @param[in] pointer to synopGMACdevice to populate mac dma and phy addresses. + * @param[in] Register offset for Mac address high + * @param[in] Register offset for Mac address low + * @param[in] buffer containing mac address to be programmed. + * \return 0 upon success. Error code upon failure. + */ +s32 synopGMAC_set_mac_addr(synopGMACdevice *gmacdev, u32 MacHigh, u32 MacLow, u8 *MacAddr) +{ + u32 data; + + data = (MacAddr[5] << 8) | MacAddr[4]; + synopGMACWriteReg(gmacdev->MacBase, MacHigh, data); + data = (MacAddr[3] << 24) | (MacAddr[2] << 16) | (MacAddr[1] << 8) | MacAddr[0] ; + synopGMACWriteReg(gmacdev->MacBase, MacLow, data); + + return 0; +} + + +/** + * Get the Mac address in to the address specified. + * The mac register contents are read and written to buffer passed. + * @param[in] pointer to synopGMACdevice to populate mac dma and phy addresses. + * @param[in] Register offset for Mac address high + * @param[in] Register offset for Mac address low + * @param[out] buffer containing the device mac address. + * \return 0 upon success. Error code upon failure. + */ +s32 synopGMAC_get_mac_addr(synopGMACdevice *gmacdev, u32 MacHigh, u32 MacLow, u8 *MacAddr) +{ + u32 data; + + data = synopGMACReadReg(gmacdev->MacBase, MacHigh); + MacAddr[5] = (data >> 8) & 0xff; + MacAddr[4] = (data) & 0xff; + + data = synopGMACReadReg(gmacdev->MacBase, MacLow); + MacAddr[3] = (data >> 24) & 0xff; + MacAddr[2] = (data >> 16) & 0xff; + MacAddr[1] = (data >> 8) & 0xff; + MacAddr[0] = (data) & 0xff; + + return 0; +} +/** + * Attaches the synopGMAC device structure to the hardware. + * Device structure is populated with MAC/DMA and PHY base addresses. + * @param[in] pointer to synopGMACdevice to populate mac dma and phy addresses. + * @param[in] GMAC IP mac base address. + * @param[in] GMAC IP dma base address. + * @param[in] GMAC IP phy base address. + * \return 0 upon success. Error code upon failure. + * \note This is important function. No kernel api provided by Synopsys + */ +static s32 synopGMAC_scan_phyid(synopGMACdevice *gmacdev, u32 phyBase) +{ + int i, j; + u16 data; + + for (i = phyBase, j = 0; j < 32; i = (i + 1) & 0x1f, j++) + { + synopGMAC_read_phy_reg(gmacdev->MacBase, i, 2, &data); + if (data != 0 && data != 0xffff) break; + synopGMAC_read_phy_reg(gmacdev->MacBase, i, 3, &data); + if (data != 0 && data != 0xffff) break; + } + if (j == 32) + { + j = -1; + } + return j; +} + +s32 synopGMAC_attach(synopGMACdevice *gmacdev, u32 macBase, u32 dmaBase, u32 phyBase, u8 *mac_addr) +{ + /*Make sure the Device data strucure is cleared before we proceed further*/ + rt_memset((void *) gmacdev, 0, sizeof(synopGMACdevice)); + + /*Populate the mac and dma base addresses*/ + gmacdev->MacBase = macBase; + gmacdev->DmaBase = dmaBase; + gmacdev->PhyBase = phyBase; + + /* Program/flash in the station/IP's Mac address */ + //synopGMAC_set_mac_addr(gmacdev, GmacAddr0High, GmacAddr0Low, mac_addr); + + if (synopGMAC_scan_phyid(gmacdev, phyBase) < 0) + { + return -1; + } + + return 0; +} + + +/** + * Initialize the rx descriptors for ring or chain mode operation. + * - Status field is initialized to 0. + * - EndOfRing set for the last descriptor. + * - buffer1 and buffer2 set to 0 for ring mode of operation. (note) + * - data1 and data2 set to 0. (note) + * @param[in] pointer to DmaDesc structure. + * @param[in] whether end of ring + * \return void. + * \note Initialization of the buffer1, buffer2, data1,data2 and status are not done here. This only initializes whether one wants to use this descriptor + * in chain mode or ring mode. For chain mode of operation the buffer2 and data2 are programmed before calling this function. + */ +void synopGMAC_rx_desc_init_ring(DmaDesc *desc, bool last_ring_desc) +{ + desc->status = 0; + desc->length = last_ring_desc ? RxDescEndOfRing : 0; + desc->buffer1 = 0; + desc->buffer2 = 0; + //desc->data1 = 0; + //desc->data2 = 0; + return; +} +/** + * Initialize the tx descriptors for ring or chain mode operation. + * - Status field is initialized to 0. + * - EndOfRing set for the last descriptor. + * - buffer1 and buffer2 set to 0 for ring mode of operation. (note) + * - data1 and data2 set to 0. (note) + * @param[in] pointer to DmaDesc structure. + * @param[in] whether end of ring + * \return void. + * \note Initialization of the buffer1, buffer2, data1,data2 and status are not done here. This only initializes whether one wants to use this descriptor + * in chain mode or ring mode. For chain mode of operation the buffer2 and data2 are programmed before calling this function. + */ +void synopGMAC_tx_desc_init_ring(DmaDesc *desc, bool last_ring_desc) +{ + + desc->status = last_ring_desc ? TxDescEndOfRing : 0; + desc->length = 0; + + desc->buffer1 = 0; + desc->buffer2 = 0; + //desc->data1 = 0; + //desc->data2 = 0; + + return; +} + +s32 synopGMAC_init_tx_rx_desc_queue(synopGMACdevice *gmacdev) +{ + s32 i; + for (i = 0; i < gmacdev -> TxDescCount; i++) + { + synopGMAC_tx_desc_init_ring(gmacdev->TxDesc + i, i == gmacdev->TxDescCount - 1); + } + TR("At line %d\n", __LINE__); + for (i = 0; i < gmacdev -> RxDescCount; i++) + { + synopGMAC_rx_desc_init_ring(gmacdev->RxDesc + i, i == gmacdev->RxDescCount - 1); + } + + gmacdev->TxNext = 0; + gmacdev->TxBusy = 0; + gmacdev->RxNext = 0; + gmacdev->RxBusy = 0; + + return 0; +} + +/** + * Programs the DmaRxBaseAddress with the Rx descriptor base address. + * Rx Descriptor's base address is available in the gmacdev structure. This function progrms the + * Dma Rx Base address with the starting address of the descriptor ring or chain. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_init_rx_desc_base(synopGMACdevice *gmacdev) +{ + synopGMACWriteReg(gmacdev->DmaBase, DmaRxBaseAddr, (u32)gmacdev->RxDescDma); + return; +} + +/** + * Programs the DmaTxBaseAddress with the Tx descriptor base address. + * Tx Descriptor's base address is available in the gmacdev structure. This function progrms the + * Dma Tx Base address with the starting address of the descriptor ring or chain. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_init_tx_desc_base(synopGMACdevice *gmacdev) +{ + synopGMACWriteReg(gmacdev->DmaBase, DmaTxBaseAddr, (u32)gmacdev->TxDescDma); + return; +} + + +/** + * Checks whether the descriptor is owned by DMA. + * If descriptor is owned by DMA then the OWN bit is set to 1. This API is same for both ring and chain mode. + * @param[in] pointer to DmaDesc structure. + * \return returns true if Dma owns descriptor and false if not. + */ +bool synopGMAC_is_desc_owned_by_dma(DmaDesc *desc) +{ + return ((desc->status & DescOwnByDma) == DescOwnByDma); +} + +/** + * returns the byte length of received frame including CRC. + * This returns the no of bytes received in the received ethernet frame including CRC(FCS). + * @param[in] pointer to DmaDesc structure. + * \return returns the length of received frame lengths in bytes. + */ +u32 synopGMAC_get_rx_desc_frame_length(u32 status) +{ + return ((status & DescFrameLengthMask) >> DescFrameLengthShift); +} + +/** + * Checks whether the descriptor is valid + * if no errors such as CRC/Receive Error/Watchdog Timeout/Late collision/Giant Frame/Overflow/Descriptor + * error the descritpor is said to be a valid descriptor. + * @param[in] pointer to DmaDesc structure. + * \return True if desc valid. false if error. + */ +bool synopGMAC_is_desc_valid(u32 status) +{ + return ((status & DescError) == 0); +} + +/** + * Checks whether the descriptor is empty. + * If the buffer1 and buffer2 lengths are zero in ring mode descriptor is empty. + * In chain mode buffer2 length is 0 but buffer2 itself contains the next descriptor address. + * @param[in] pointer to DmaDesc structure. + * \return returns true if descriptor is empty, false if not empty. + */ +bool synopGMAC_is_desc_empty(DmaDesc *desc) +{ + //if both the buffer1 length and buffer2 length are zero desc is empty + return (((desc->length & DescSize1Mask) == 0) && ((desc->length & DescSize2Mask) == 0)); +} + + +/** + * Checks whether the rx descriptor is valid. + * if rx descripor is not in error and complete frame is available in the same descriptor + * @param[in] pointer to DmaDesc structure. + * \return returns true if no error and first and last desc bits are set, otherwise it returns false. + */ +bool synopGMAC_is_rx_desc_valid(u32 status) +{ + return ((status & DescError) == 0) && ((status & DescRxFirst) == DescRxFirst) && ((status & DescRxLast) == DescRxLast); +} + +/** + * Checks whether the tx is aborted due to collisions. + * @param[in] pointer to DmaDesc structure. + * \return returns true if collisions, else returns false. + */ +bool synopGMAC_is_tx_aborted(u32 status) +{ + return (((status & DescTxLateCollision) == DescTxLateCollision) | ((status & DescTxExcCollisions) == DescTxExcCollisions)); + +} + +/** + * Checks whether the tx carrier error. + * @param[in] pointer to DmaDesc structure. + * \return returns true if carrier error occured, else returns falser. + */ +bool synopGMAC_is_tx_carrier_error(u32 status) +{ + return (((status & DescTxLostCarrier) == DescTxLostCarrier) | ((status & DescTxNoCarrier) == DescTxNoCarrier)); +} + + +/** + * Gives the transmission collision count. + * returns the transmission collision count indicating number of collisions occured before the frame was transmitted. + * Make sure to check excessive collision didnot happen to ensure the count is valid. + * @param[in] pointer to DmaDesc structure. + * \return returns the count value of collision. + */ +u32 synopGMAC_get_tx_collision_count(u32 status) +{ + return ((status & DescTxCollMask) >> DescTxCollShift); +} +u32 synopGMAC_is_exc_tx_collisions(u32 status) +{ + return ((status & DescTxExcCollisions) == DescTxExcCollisions); +} + + +/** + * Check for damaged frame due to overflow or collision. + * Retruns true if rx frame was damaged due to buffer overflow in MTL or late collision in half duplex mode. + * @param[in] pointer to DmaDesc structure. + * \return returns true if error else returns false. + */ +bool synopGMAC_is_rx_frame_damaged(u32 status) +{ +//bool synopGMAC_dma_rx_collisions(u32 status) + return (((status & DescRxDamaged) == DescRxDamaged) | ((status & DescRxCollision) == DescRxCollision)); +} + +/** + * Check for damaged frame due to collision. + * Retruns true if rx frame was damaged due to late collision in half duplex mode. + * @param[in] pointer to DmaDesc structure. + * \return returns true if error else returns false. + */ +bool synopGMAC_is_rx_frame_collision(u32 status) +{ +//bool synopGMAC_dma_rx_collisions(u32 status) + return ((status & DescRxCollision) == DescRxCollision); +} + +/** + * Check for receive CRC error. + * Retruns true if rx frame CRC error occured. + * @param[in] pointer to DmaDesc structure. + * \return returns true if error else returns false. + */ +bool synopGMAC_is_rx_crc(u32 status) +{ +//u32 synopGMAC_dma_rx_crc(u32 status) + return ((status & DescRxCrc) == DescRxCrc); +} + +/** + * Indicates rx frame has non integer multiple of bytes. (odd nibbles). + * Retruns true if dribbling error in rx frame. + * @param[in] pointer to DmaDesc structure. + * \return returns true if error else returns false. + */ +bool synopGMAC_is_frame_dribbling_errors(u32 status) +{ +//u32 synopGMAC_dma_rx_frame_errors(u32 status) + return ((status & DescRxDribbling) == DescRxDribbling); +} + +/** + * Indicates error in rx frame length. + * Retruns true if received frame length doesnot match with the length field + * @param[in] pointer to DmaDesc structure. + * \return returns true if error else returns false. + */ +bool synopGMAC_is_rx_frame_length_errors(u32 status) +{ +//u32 synopGMAC_dma_rx_length_errors(u32 status) + return ((status & DescRxLengthError) == DescRxLengthError); +} + +/** + * Checks whether this rx descriptor is last rx descriptor. + * This returns true if it is last descriptor either in ring mode or in chain mode. + * @param[in] pointer to devic structure. + * @param[in] pointer to DmaDesc structure. + * \return returns true if it is last descriptor, false if not. + * \note This function should not be called before initializing the descriptor using synopGMAC_desc_init(). + */ +bool synopGMAC_is_last_rx_desc(synopGMACdevice *gmacdev, DmaDesc *desc) +{ +//bool synopGMAC_is_last_desc(DmaDesc *desc) + return (((desc->length & RxDescEndOfRing) == RxDescEndOfRing) /*|| ((u32)((u64)gmacdev->RxDesc & 0xFFFFFFFF) == desc->data2)*/); +} + +/** + * Checks whether this tx descriptor is last tx descriptor. + * This returns true if it is last descriptor either in ring mode or in chain mode. + * @param[in] pointer to devic structure. + * @param[in] pointer to DmaDesc structure. + * \return returns true if it is last descriptor, false if not. + * \note This function should not be called before initializing the descriptor using synopGMAC_desc_init(). + */ +bool synopGMAC_is_last_tx_desc(synopGMACdevice *gmacdev, DmaDesc *desc) +{ +//bool synopGMAC_is_last_desc(DmaDesc *desc) + + return (((desc->status & TxDescEndOfRing) == TxDescEndOfRing) /*|| ((u32)((u64)gmacdev->TxDesc & 0xFFFFFFFF) == desc->data2)*/); + +} + + +/** + * This function is defined two times. Once when the code is compiled for ENHANCED DESCRIPTOR SUPPORT and Once for Normal descriptor + * Get the index and address of Tx desc. + * This api is same for both ring mode and chain mode. + * This function tracks the tx descriptor the DMA just closed after the transmission of data from this descriptor is + * over. This returns the descriptor fields to the caller. + * @param[in] pointer to synopGMACdevice. + * @param[out] status field of the descriptor. + * @param[out] Dma-able buffer1 pointer. + * @param[out] length of buffer1 (Max is 2048). + * @param[out] virtual pointer for buffer1. + * @param[out] u32 data indicating whether the descriptor is in ring mode or chain mode. + * \return returns present tx descriptor index on success. Negative value if error. + */ +s32 synopGMAC_get_tx_qptr(synopGMACdevice *gmacdev, u32 *Status, u32 *Buffer1, u32 *Length1, u32 *Data1, u32 *Ext_Status, u32 *Time_Stamp_High, u32 *Time_Stamp_Low) +{ + u32 txover = gmacdev->TxBusy; +#ifdef CACHE_ON + DmaDesc *txdesc = (DmaDesc *)((u32)(gmacdev->TxBusyDesc) | UNCACHEABLE); +#else + DmaDesc *txdesc = gmacdev->TxBusyDesc; +#endif + if (synopGMAC_is_desc_owned_by_dma(txdesc)) + return -1; + if (synopGMAC_is_desc_empty(txdesc)) + return -1; + + (gmacdev->BusyTxDesc)--; //busy tx descriptor is reduced by one as it will be handed over to Processor now + + if (Status != 0) + *Status = txdesc->status; + + if (Ext_Status != 0) + *Ext_Status = txdesc->extstatus; + if (Time_Stamp_High != 0) + *Time_Stamp_High = txdesc->timestamphigh; + if (Time_Stamp_Low != 0) + *Time_Stamp_Low = txdesc->timestamplow; + + if (Buffer1 != 0) + *Buffer1 = txdesc->buffer1; + if (Length1 != 0) + *Length1 = (txdesc->length & DescSize1Mask) >> DescSize1Shift; + //if(Data1 != 0) + // *Data1 = txdesc->data1; + + + gmacdev->TxBusy = synopGMAC_is_last_tx_desc(gmacdev, txdesc) ? 0 : txover + 1; + + if (1 /* ring mode */) + { + gmacdev->TxBusyDesc = synopGMAC_is_last_tx_desc(gmacdev, txdesc) ? gmacdev->TxDesc : (txdesc + 1); + synopGMAC_tx_desc_init_ring(txdesc, synopGMAC_is_last_tx_desc(gmacdev, txdesc)); + } +// TR("%02d %08x %08x %08x %08x %08x %08x %08x\n", txover, (u32)txdesc, txdesc->status, txdesc->length, txdesc->buffer1, txdesc->buffer2, txdesc->data1, txdesc->data2); + TR("%02d %08x %08x %08x %08x %08x\n", txover, (u32)txdesc, txdesc->status, txdesc->length, txdesc->buffer1, txdesc->buffer2); + + return txover; +} + +DmaDesc *prevtx; +void synopGMAC_set_crc_replacement(synopGMACdevice *gmacdev) +{ +#ifdef CACHE_ON + DmaDesc *txdesc = (DmaDesc *)((u32)(gmacdev->TxNextDesc) | UNCACHEABLE); +#else + DmaDesc *txdesc = gmacdev->TxNextDesc; +#endif + txdesc->status |= DescTxDisableCrc | DescTxCrcReplacement; + + prevtx = txdesc; +} + +void synopGMAC_clr_crc_replacement(synopGMACdevice *gmacdev) +{ + prevtx->status &= ~(DescTxDisableCrc | DescTxCrcReplacement); + prevtx = NULL; +} + +/** + * Populate the tx desc structure with the buffer address. + * Once the driver has a packet ready to be transmitted, this function is called with the + * valid dma-able buffer addresses and their lengths. This function populates the descriptor + * and make the DMA the owner for the descriptor. This function also controls whetther Checksum + * offloading to be done in hardware or not. + * This api is same for both ring mode and chain mode. + * @param[in] pointer to synopGMACdevice. + * @param[in] Dma-able buffer1 pointer. + * @param[in] length of buffer1 (Max is 2048). + * @param[in] virtual pointer for buffer1. + + * @param[in] u32 data indicating whether the descriptor is in ring mode or chain mode. + * @param[in] u32 indicating whether the checksum offloading in HW/SW. + * \return returns present tx descriptor index on success. Negative value if error. + */ +s32 synopGMAC_set_tx_qptr(synopGMACdevice *gmacdev, u32 Buffer1, u32 Length1, u32 Data1, u32 offload_needed, u32 ts) +{ + u32 txnext = gmacdev->TxNext; +#ifdef CACHE_ON + DmaDesc *txdesc = (DmaDesc *)((u32)(gmacdev->TxNextDesc) | UNCACHEABLE); +#else + DmaDesc *txdesc = gmacdev->TxNextDesc; +#endif + if (!synopGMAC_is_desc_empty(txdesc)) + return -1; + + (gmacdev->BusyTxDesc)++; //busy tx descriptor is incremented by one as it will be handed over to DMA + + txdesc->length |= ((Length1 << DescSize1Shift) & DescSize1Mask); + + txdesc->status |= (DescTxFirst | DescTxLast | DescTxIntEnable | (ts == 1 ? DescTxTSEnable : 0)); //ENH_DESC // FIXME: Need to set DescTxTSEnable? + + txdesc->buffer1 = Buffer1; + //txdesc->data1 = Data1; + + if (offload_needed) + { + /* + Make sure that the OS you are running supports the IP and TCP checkusm offloaidng, + before calling any of the functions given below. + */ + + //TODO: + synopGMAC_tx_checksum_offload_ipv4hdr(gmacdev, txdesc); + synopGMAC_tx_checksum_offload_tcponly(gmacdev, txdesc); + synopGMAC_tx_checksum_offload_tcp_pseudo(gmacdev, txdesc); + } + else + { + synopGMAC_tx_checksum_offload_bypass(gmacdev, txdesc); + } + + txdesc->status |= DescOwnByDma;//ENH_DESC + + gmacdev->TxNext = synopGMAC_is_last_tx_desc(gmacdev, txdesc) ? 0 : txnext + 1; + gmacdev->TxNextDesc = synopGMAC_is_last_tx_desc(gmacdev, txdesc) ? gmacdev->TxDesc : (txdesc + 1); + + TR("(set)%02d %08x %08x %08x %08x %08x\n", txnext, (u32)txdesc, txdesc->status, txdesc->length, txdesc->buffer1, txdesc->buffer2); + //rt_kprintf("(set)%02d %08x %08x %08x %08x %08x\n", txnext, (u32)txdesc, txdesc->status, txdesc->length, txdesc->buffer1, txdesc->buffer2); + return txnext; +} + +/** + * Prepares the descriptor to receive packets. + * The descriptor is allocated with the valid buffer addresses (sk_buff address) and the length fields + * and handed over to DMA by setting the ownership. After successful return from this function the + * descriptor is added to the receive descriptor pool/queue. + * This api is same for both ring mode and chain mode. + * @param[in] pointer to synopGMACdevice. + * @param[in] Dma-able buffer1 pointer. + * @param[in] length of buffer1 (Max is 2048). + * @param[in] Dma-able buffer2 pointer. + * @param[in] length of buffer2 (Max is 2048). + * @param[in] u32 data indicating whether the descriptor is in ring mode or chain mode. + * \return returns present rx descriptor index on success. Negative value if error. + */ +s32 synopGMAC_set_rx_qptr(synopGMACdevice *gmacdev, u32 Buffer1, u32 Length1, u32 Data1) +{ + u32 rxnext = gmacdev->RxNext; +#ifdef CACHE_ON + DmaDesc *rxdesc = (DmaDesc *)((u32)(gmacdev->RxNextDesc) | UNCACHEABLE); +#else + DmaDesc *rxdesc = gmacdev->RxNextDesc; +#endif + if (!synopGMAC_is_desc_empty(rxdesc)) + { + return -1; + } + + rxdesc->length |= ((Length1 << DescSize1Shift) & DescSize1Mask); + + rxdesc->buffer1 = Buffer1; + //rxdesc->data1 = Data1; + + rxdesc->extstatus = 0; + rxdesc->reserved1 = 0; + rxdesc->timestamplow = 0; + rxdesc->timestamphigh = 0; + + rxdesc->buffer2 = 0; + //rxdesc->data2 = 0; + + if ((rxnext % MODULO_INTERRUPT) != 0) + rxdesc->length |= RxDisIntCompl; + + rxdesc->status = DescOwnByDma; + + gmacdev->RxNext = synopGMAC_is_last_rx_desc(gmacdev, rxdesc) ? 0 : rxnext + 1; + gmacdev->RxNextDesc = synopGMAC_is_last_rx_desc(gmacdev, rxdesc) ? gmacdev->RxDesc : (rxdesc + 1); + +// TR("%02d %08x %08x %08x %08x %08x %08x %08x\n", rxnext, (u32)rxdesc, rxdesc->status, rxdesc->length, rxdesc->buffer1, rxdesc->buffer2, rxdesc->data1, rxdesc->data2); + TR("%02d %08x %08x %08x %08x %08x\n", rxnext, (u32)rxdesc, rxdesc->status, rxdesc->length, rxdesc->buffer1, rxdesc->buffer2); + + (gmacdev->BusyRxDesc)++; //One descriptor will be given to Hardware. So busy count incremented by one + return rxnext; +} + + +/** + * This function is defined two times. Once when the code is compiled for ENHANCED DESCRIPTOR SUPPORT and Once for Normal descriptor + * Get back the descriptor from DMA after data has been received. + * When the DMA indicates that the data is received (interrupt is generated), this function should be + * called to get the descriptor and hence the data buffers received. With successful return from this + * function caller gets the descriptor fields for processing. check the parameters to understand the + * fields returned.` + * @param[in] pointer to synopGMACdevice. + * @param[out] pointer to hold the status of DMA. + * @param[out] Dma-able buffer1 pointer. + * @param[out] pointer to hold length of buffer1 (Max is 2048). + * @param[out] virtual pointer for buffer1. + * \return returns present rx descriptor index on success. Negative value if error. + */ + +s32 synopGMAC_get_rx_qptr(synopGMACdevice *gmacdev, u32 *Status, u32 *Buffer1, u32 *Length1, u32 *Data1, + u32 *Ext_Status, u32 *Time_Stamp_High, u32 *Time_Stamp_Low) +{ + u32 rxnext = gmacdev->RxBusy; // index of descriptor the DMA just completed. May be useful when data + //is spread over multiple buffers/descriptors +#ifdef CACHE_ON + DmaDesc *rxdesc = (DmaDesc *)((u32)(gmacdev->RxBusyDesc) | UNCACHEABLE); +#else + DmaDesc *rxdesc = gmacdev->RxBusyDesc; +#endif + if (synopGMAC_is_desc_owned_by_dma(rxdesc)) + return -1; + + if (synopGMAC_is_desc_empty(rxdesc)) + return -1; + + if (Status != 0) + *Status = rxdesc->status;// send the status of this descriptor + + if (Ext_Status != 0) + *Ext_Status = rxdesc->extstatus; + + if (Time_Stamp_High != 0) + *Time_Stamp_High = rxdesc->timestamphigh; + + if (Time_Stamp_Low != 0) + *Time_Stamp_Low = rxdesc->timestamplow; + + if (Length1 != 0) + *Length1 = (rxdesc->length & DescSize1Mask) >> DescSize1Shift; + + if (Buffer1 != 0) + *Buffer1 = rxdesc->buffer1; + + //if(Data1 != 0) + // *Data1 = rxdesc->data1; + + gmacdev->RxBusy = synopGMAC_is_last_rx_desc(gmacdev, rxdesc) ? 0 : rxnext + 1; + + /* Ring */ + gmacdev->RxBusyDesc = synopGMAC_is_last_rx_desc(gmacdev, rxdesc) ? gmacdev->RxDesc : (rxdesc + 1); + + /* Wayne's modification */ + synopGMAC_rx_desc_init_ring(rxdesc, synopGMAC_is_last_rx_desc(gmacdev, rxdesc)); + // why init here.... should change onwer to DMA --ya + //rxdesc->status = DescOwnByDma; + //rxdesc->extstatus = 0; + //rxdesc->reserved1 = 0; + //rxdesc->timestamplow = 0; + //rxdesc->timestamphigh = 0; + TR("%02d %08x %08x %08x %08x %08x\n", rxnext, (u32)rxdesc, rxdesc->status, rxdesc->length, rxdesc->buffer1, rxdesc->buffer2); + + TR("%02d %08x %08x %08x %08x %08x\n", rxnext, (u32)rxdesc, rxdesc->status, rxdesc->length, rxdesc->buffer1, rxdesc->buffer2); + (gmacdev->BusyRxDesc)--; //busy tx descriptor is reduced by one as it will be handed over to Processor now + return (rxnext); + +} + + +/** + * Clears all the pending interrupts. + * If the Dma status register is read then all the interrupts gets cleared + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_clear_interrupt(synopGMACdevice *gmacdev) +{ + u32 data; + data = synopGMACReadReg(gmacdev->DmaBase, DmaStatus); + synopGMACWriteReg(gmacdev->DmaBase, DmaStatus, data); +} + +/** + * Returns the all unmasked interrupt status after reading the DmaStatus register. + * @param[in] pointer to synopGMACdevice. + * \return 0 upon success. Error code upon failure. + */ +u32 synopGMAC_get_interrupt_type(synopGMACdevice *gmacdev) +{ + u32 data; + u32 interrupts = 0; + data = synopGMACReadReg(gmacdev->DmaBase, DmaStatus); + synopGMACWriteReg(gmacdev->DmaBase, DmaStatus, data); //This is the appropriate location to clear the interrupts + //TR("DMA status reg is %08x\n", data); + if (data & DmaIntErrorMask) interrupts |= synopGMACDmaError; + if (data & DmaIntRxNormMask) interrupts |= synopGMACDmaRxNormal; + if (data & DmaIntRxAbnMask) interrupts |= synopGMACDmaRxAbnormal; + if (data & DmaIntRxStoppedMask) interrupts |= synopGMACDmaRxStopped; + if (data & DmaIntTxNormMask) interrupts |= synopGMACDmaTxNormal; + if (data & DmaIntTxAbnMask) interrupts |= synopGMACDmaTxAbnormal; + if (data & DmaIntTxStoppedMask) interrupts |= synopGMACDmaTxStopped; + + return interrupts; +} + + +/** + * Enable all the interrupts. + * Enables the DMA interrupt as specified by the bit mask. + * @param[in] pointer to synopGMACdevice. + * @param[in] bit mask of interrupts to be enabled. + * \return returns void. + */ +void synopGMAC_enable_interrupt(synopGMACdevice *gmacdev, u32 interrupts) +{ + synopGMACWriteReg(gmacdev->DmaBase, DmaInterrupt, interrupts); + return; +} + +void synopGMAC_get_ie(synopGMACdevice *gmacdev) +{ + synopGMACReadReg(gmacdev->DmaBase, DmaInterrupt); + return; +} + +/** + * Disable all the interrupts. + * Disables all DMA interrupts. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + * \note This function disabled all the interrupts, if you want to disable a particular interrupt then + * use synopGMAC_disable_interrupt(). + */ +void synopGMAC_disable_interrupt_all(synopGMACdevice *gmacdev) +{ + synopGMACWriteReg(gmacdev->DmaBase, DmaInterrupt, DmaIntDisable); + return; +} + +/** + * Disable interrupt according to the bitfield supplied. + * Disables only those interrupts specified in the bit mask in second argument. + * @param[in] pointer to synopGMACdevice. + * @param[in] bit mask for interrupts to be disabled. + * \return returns void. + */ +void synopGMAC_disable_interrupt(synopGMACdevice *gmacdev, u32 interrupts) +{ + synopGMACClearBits(gmacdev->DmaBase, DmaInterrupt, interrupts); + return; +} +/** + * Enable the DMA Reception. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_enable_dma_rx(synopGMACdevice *gmacdev) +{ +// synopGMACSetBits(gmacdev->DmaBase, DmaControl, DmaRxStart); + u32 data; + data = synopGMACReadReg(gmacdev->DmaBase, DmaControl); + data |= DmaRxStart; + synopGMACWriteReg(gmacdev->DmaBase, DmaControl, data); + +} + +/** + * Enable the DMA Transmission. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_enable_dma_tx(synopGMACdevice *gmacdev) +{ +// synopGMACSetBits(gmacdev->DmaBase, DmaControl, DmaTxStart); + u32 data; + data = synopGMACReadReg(gmacdev->DmaBase, DmaControl); + data |= DmaTxStart; + synopGMACWriteReg(gmacdev->DmaBase, DmaControl, data); + +} + +void synopGMAC_enable_under_size_pkt(synopGMACdevice *gmacdev) +{ + u32 data; + data = synopGMACReadReg(gmacdev->DmaBase, DmaControl); + data |= DmaFwdUnderSzFrames; + synopGMACWriteReg(gmacdev->DmaBase, DmaControl, data); + +} + +void synopGMAC_disable_under_size_pkt(synopGMACdevice *gmacdev) +{ + u32 data; + data = synopGMACReadReg(gmacdev->DmaBase, DmaControl); + data &= ~DmaFwdUnderSzFrames; + synopGMACWriteReg(gmacdev->DmaBase, DmaControl, data); + +} + +void synopGMAC_enable_crc_err_pkt(synopGMACdevice *gmacdev) +{ + u32 data; + data = synopGMACReadReg(gmacdev->DmaBase, DmaControl); + data |= DmaFwdErrorFrames; + synopGMACWriteReg(gmacdev->DmaBase, DmaControl, data); + +} + +void synopGMAC_disable_crc_err_pkt(synopGMACdevice *gmacdev) +{ + u32 data; + data = synopGMACReadReg(gmacdev->DmaBase, DmaControl); + data &= ~DmaFwdErrorFrames; + synopGMACWriteReg(gmacdev->DmaBase, DmaControl, data); + +} + + +/** + * Resumes the DMA Transmission. + * the DmaTxPollDemand is written. (the data writeen could be anything). + * This forces the DMA to resume transmission. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_resume_dma_tx(synopGMACdevice *gmacdev) +{ + synopGMACWriteReg(gmacdev->DmaBase, DmaTxPollDemand, 0); + +} +/** + * Resumes the DMA Reception. + * the DmaRxPollDemand is written. (the data writeen could be anything). + * This forces the DMA to resume reception. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_resume_dma_rx(synopGMACdevice *gmacdev) +{ + synopGMACWriteReg(gmacdev->DmaBase, DmaRxPollDemand, 0); + +} +/** + * Take ownership of this Descriptor. + * The function is same for both the ring mode and the chain mode DMA structures. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_take_desc_ownership(DmaDesc *desc) +{ + if (desc) + { + desc->status &= ~DescOwnByDma; //Clear the DMA own bit +// desc->status |= DescError; // Set the error to indicate this descriptor is bad + } +} + +/** + * Take ownership of all the rx Descriptors. + * This function is called when there is fatal error in DMA transmission. + * When called it takes the ownership of all the rx descriptor in rx descriptor pool/queue from DMA. + * The function is same for both the ring mode and the chain mode DMA structures. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + * \note Make sure to disable the transmission before calling this function, otherwise may result in racing situation. + */ +void synopGMAC_take_desc_ownership_rx(synopGMACdevice *gmacdev) +{ + s32 i; + DmaDesc *desc; + desc = gmacdev->RxDesc; + for (i = 0; i < gmacdev->RxDescCount; i++) + { + synopGMAC_take_desc_ownership(desc + i); + } +} + +/** + * Take ownership of all the rx Descriptors. + * This function is called when there is fatal error in DMA transmission. + * When called it takes the ownership of all the tx descriptor in tx descriptor pool/queue from DMA. + * The function is same for both the ring mode and the chain mode DMA structures. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + * \note Make sure to disable the transmission before calling this function, otherwise may result in racing situation. + */ +void synopGMAC_take_desc_ownership_tx(synopGMACdevice *gmacdev) +{ + s32 i; + DmaDesc *desc; + desc = gmacdev->TxDesc; + for (i = 0; i < gmacdev->TxDescCount; i++) + { + synopGMAC_take_desc_ownership(desc + i); + } + +} + +/** + * Disable the DMA for Transmission. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ + +void synopGMAC_disable_dma_tx(synopGMACdevice *gmacdev) +{ +// synopGMACClearBits(gmacdev->DmaBase, DmaControl, DmaTxStart); + u32 data; + data = synopGMACReadReg(gmacdev->DmaBase, DmaControl); + data &= (~DmaTxStart); + synopGMACWriteReg(gmacdev->DmaBase, DmaControl, data); +} +/** + * Disable the DMA for Reception. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_disable_dma_rx(synopGMACdevice *gmacdev) +{ +// synopGMACClearBits(gmacdev->DmaBase, DmaControl, DmaRxStart); + u32 data; + data = synopGMACReadReg(gmacdev->DmaBase, DmaControl); + data &= (~DmaRxStart); + synopGMACWriteReg(gmacdev->DmaBase, DmaControl, data); +} + + + +/*******************PMT APIs***************************************/ + + + + +/** + * Enables the assertion of PMT interrupt. + * This enables the assertion of PMT interrupt due to Magic Pkt or Wakeup frame + * reception. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_pmt_int_enable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacInterruptMask, GmacPmtIntMask); + return; +} +/** + * Disables the assertion of PMT interrupt. + * This disables the assertion of PMT interrupt due to Magic Pkt or Wakeup frame + * reception. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_pmt_int_disable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacInterruptMask, GmacPmtIntMask); + return; +} +/** + * Enables the power down mode of GMAC. + * This function puts the Gmac in power down mode. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_power_down_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacPmtCtrlStatus, GmacPmtPowerDown); + return; +} +/** + * Disables the powerd down setting of GMAC. + * If the driver wants to bring up the GMAC from powerdown mode, even though the magic packet or the + * wake up frames received from the network, this function should be called. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_power_down_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacPmtCtrlStatus, GmacPmtPowerDown); + return; +} +/** + * Enables the pmt interrupt generation in powerdown mode. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_enable_pmt_interrupt(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacInterruptMask, GmacPmtIntMask); +} +/** + * Disables the pmt interrupt generation in powerdown mode. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_disable_pmt_interrupt(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacInterruptMask, GmacPmtIntMask); +} +/** + * Enables GMAC to look for Magic packet. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_magic_packet_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacPmtCtrlStatus, GmacPmtMagicPktEnable); + return; +} + +void synopGMAC_magic_packet_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacPmtCtrlStatus, GmacPmtMagicPktEnable); + return; +} + +/** + * Enables GMAC to look for wake up frame. + * Wake up frame is defined by the user. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_wakeup_frame_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacPmtCtrlStatus, GmacPmtWakeupFrameEnable); + return; +} + +/** + * Enables wake-up frame filter to handle unicast packets. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_pmt_unicast_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacPmtCtrlStatus, GmacPmtGlobalUnicast); + return; +} +/** + * Checks whether the packet received is a magic packet?. + * @param[in] pointer to synopGMACdevice. + * \return returns True if magic packet received else returns false. + */ +bool synopGMAC_is_magic_packet_received(synopGMACdevice *gmacdev) +{ + u32 data; + data = synopGMACReadReg(gmacdev->MacBase, GmacPmtCtrlStatus); + return ((data & GmacPmtMagicPktReceived) == GmacPmtMagicPktReceived); +} +/** + * Checks whether the packet received is a wakeup frame?. + * @param[in] pointer to synopGMACdevice. + * \return returns true if wakeup frame received else returns false. + */ +bool synopGMAC_is_wakeup_frame_received(synopGMACdevice *gmacdev) +{ + u32 data; + data = synopGMACReadReg(gmacdev->MacBase, GmacPmtCtrlStatus); + return ((data & GmacPmtWakeupFrameReceived) == GmacPmtWakeupFrameReceived); +} + +/** + * Populates the remote wakeup frame registers. + * Consecutive 8 writes to GmacWakeupAddr writes the wakeup frame filter registers. + * Before commensing a new write, frame filter pointer is reset to 0x0000. + * A small delay is introduced to allow frame filter pointer reset operation. + * @param[in] pointer to synopGMACdevice. + * @param[in] pointer to frame filter contents array. + * \return returns void. + */ +#if 0 +void synopGMAC_write_wakeup_frame_register(synopGMACdevice *gmacdev, u32 *filter_contents) +{ + s32 i; + synopGMACSetBits(gmacdev->MacBase, GmacPmtCtrlStatus, GmacPmtFrmFilterPtrReset); + plat_delay(10); + for (i = 0; i < WAKEUP_REG_LENGTH; i++) + synopGMACWriteReg(gmacdev->MacBase, GmacWakeupAddr, *(filter_contents + i)); + return; + +} +#endif +/*******************PMT APIs***************************************/ + +/*******************Ip checksum offloading APIs***************************************/ + +/** + * Enables the ip checksum offloading in receive path. + * When set GMAC calculates 16 bit 1's complement of all received ethernet frame payload. + * It also checks IPv4 Header checksum is correct. GMAC core appends the 16 bit checksum calculated + * for payload of IP datagram and appends it to Ethernet frame transferred to the application. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_enable_rx_chksum_offload(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacRxIpcOffload); + return; +} +/** + * Disable the ip checksum offloading in receive path. + * Ip checksum offloading is disabled in the receive path. + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_disable_rx_chksum_offload(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacRxIpcOffload); +} +/** + * Instruct the DMA to drop the packets fails tcp ip checksum. + * This is to instruct the receive DMA engine to drop the recevied packet if they + * fails the tcp/ip checksum in hardware. Valid only when full checksum offloading is enabled(type-2). + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_rx_tcpip_chksum_drop_enable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->DmaBase, DmaControl, DmaDisableDropTcpCs); + return; +} +/** + * Instruct the DMA not to drop the packets even if it fails tcp ip checksum. + * This is to instruct the receive DMA engine to allow the packets even if recevied packet + * fails the tcp/ip checksum in hardware. Valid only when full checksum offloading is enabled(type-2). + * @param[in] pointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_rx_tcpip_chksum_drop_disable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->DmaBase, DmaControl, DmaDisableDropTcpCs); + return; +} + +/** + * When the Enhanced Descriptor is enabled then the bit 0 of RDES0 indicates whether the + * Extended Status is available (RDES4). Time Stamp feature and the Checksum Offload Engine2 + * makes use of this extended status to provide the status of the received packet. + * @param[in] pointer to synopGMACdevice + * \return returns TRUE or FALSE + */ + + +/** + * This function indicates whether extended status is available in the RDES0. + * Any function which accesses the fields of extended status register must ensure a check on this has been made + * This is valid only for Enhanced Descriptor. + * @param[in] pointer to synopGMACdevice. + * @param[in] u32 status field of the corresponding descriptor. + * \return returns TRUE or FALSE. + */ +bool synopGMAC_is_ext_status(synopGMACdevice *gmacdev, u32 status) // extended status present indicates that the RDES4 need to be probed +{ + return ((status & DescRxEXTsts) != 0); // if extstatus set then it returns 1 +} +/** + * This function returns true if the IP header checksum bit is set in the extended status. + * Valid only when enhaced status available is set in RDES0 bit 0. + * This is valid only for Enhanced Descriptor. + * @param[in] pointer to synopGMACdevice. + * @param[in] u32 status field of the corresponding descriptor. + * \return returns TRUE or FALSE. + */ +bool synopGMAC_ES_is_IP_header_error(synopGMACdevice *gmacdev, u32 ext_status) // IP header (IPV4) checksum error +{ + return ((ext_status & DescRxIpHeaderError) != 0); // if IPV4 header error return 1 +} +/** + * This function returns true if the Checksum is bypassed in the hardware. + * Valid only when enhaced status available is set in RDES0 bit 0. + * This is valid only for Enhanced Descriptor. + * @param[in] pointer to synopGMACdevice. + * @param[in] u32 status field of the corresponding descriptor. + * \return returns TRUE or FALSE. + */ +bool synopGMAC_ES_is_rx_checksum_bypassed(synopGMACdevice *gmacdev, u32 ext_status) // Hardware engine bypassed the checksum computation/checking +{ + return ((ext_status & DescRxChkSumBypass) != 0); // if checksum offloading bypassed return 1 +} +/** + * This function returns true if payload checksum error is set in the extended status. + * Valid only when enhaced status available is set in RDES0 bit 0. + * This is valid only for Enhanced Descriptor. + * @param[in] pointer to synopGMACdevice. + * @param[in] u32 status field of the corresponding descriptor. + * \return returns TRUE or FALSE. + */ +bool synopGMAC_ES_is_IP_payload_error(synopGMACdevice *gmacdev, u32 ext_status) // IP payload checksum is in error (UDP/TCP/ICMP checksum error) +{ + return ((ext_status & DescRxIpPayloadError) != 0); // if IP payload error return 1 +} + + + + +/** + * Decodes the Rx Descriptor status to various checksum error conditions. + * @param[in] pointer to synopGMACdevice. + * @param[in] u32 status field of the corresponding descriptor. + * \return returns decoded enum (u32) indicating the status. + */ +u32 synopGMAC_is_rx_checksum_error(synopGMACdevice *gmacdev, u32 status) +{ + if (((status & DescRxChkBit5) == 0) && ((status & DescRxChkBit7) == 0) && ((status & DescRxChkBit0) == 0)) + return RxLenLT600; + else if (((status & DescRxChkBit5) == 0) && ((status & DescRxChkBit7) == 0) && ((status & DescRxChkBit0) != 0)) + return RxIpHdrPayLoadChkBypass; + else if (((status & DescRxChkBit5) == 0) && ((status & DescRxChkBit7) != 0) && ((status & DescRxChkBit0) != 0)) + return RxChkBypass; + else if (((status & DescRxChkBit5) != 0) && ((status & DescRxChkBit7) == 0) && ((status & DescRxChkBit0) == 0)) + return RxNoChkError; + else if (((status & DescRxChkBit5) != 0) && ((status & DescRxChkBit7) == 0) && ((status & DescRxChkBit0) != 0)) + return RxPayLoadChkError; + else if (((status & DescRxChkBit5) != 0) && ((status & DescRxChkBit7) != 0) && ((status & DescRxChkBit0) == 0)) + return RxIpHdrChkError; + else if (((status & DescRxChkBit5) != 0) && ((status & DescRxChkBit7) != 0) && ((status & DescRxChkBit0) != 0)) + return RxIpHdrPayLoadChkError; + else + return RxIpHdrPayLoadRes; +} +/** + * Checks if any Ipv4 header checksum error in the frame just transmitted. + * This serves as indication that error occureed in the IPv4 header checksum insertion. + * The sent out frame doesnot carry any ipv4 header checksum inserted by the hardware. + * @param[in] pointer to synopGMACdevice. + * @param[in] u32 status field of the corresponding descriptor. + * \return returns true if error in ipv4 header checksum, else returns false. + */ +bool synopGMAC_is_tx_ipv4header_checksum_error(synopGMACdevice *gmacdev, u32 status) +{ + return ((status & DescTxIpv4ChkError) == DescTxIpv4ChkError); +} + + +/** + * Checks if any payload checksum error in the frame just transmitted. + * This serves as indication that error occureed in the payload checksum insertion. + * The sent out frame doesnot carry any payload checksum inserted by the hardware. + * @param[in] pointer to synopGMACdevice. + * @param[in] u32 status field of the corresponding descriptor. + * \return returns true if error in ipv4 header checksum, else returns false. + */ +bool synopGMAC_is_tx_payload_checksum_error(synopGMACdevice *gmacdev, u32 status) +{ + return ((status & DescTxPayChkError) == DescTxPayChkError); +} +/** + * The check summ offload engine is bypassed in the tx path. + * Checksum is not computed in the Hardware. + * @param[in] pointer to synopGMACdevice. + * @param[in] Pointer to tx descriptor for which ointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_tx_checksum_offload_bypass(synopGMACdevice *gmacdev, DmaDesc *desc) +{ + desc->status = (desc->status & (~DescTxCisMask));//ENH_DESC + + +} +/** + * The check summ offload engine is enabled to do only IPV4 header checksum. + * IPV4 header Checksum is computed in the Hardware. + * @param[in] pointer to synopGMACdevice. + * @param[in] Pointer to tx descriptor for which ointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_tx_checksum_offload_ipv4hdr(synopGMACdevice *gmacdev, DmaDesc *desc) +{ + + desc->status = ((desc->status & (~DescTxCisMask)) | DescTxCisIpv4HdrCs);//ENH_DESC + + +} + +/** + * The check summ offload engine is enabled to do TCPIP checsum assuming Pseudo header is available. + * Hardware computes the tcp ip checksum assuming pseudo header checksum is computed in software. + * Ipv4 header checksum is also inserted. + * @param[in] pointer to synopGMACdevice. + * @param[in] Pointer to tx descriptor for which ointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_tx_checksum_offload_tcponly(synopGMACdevice *gmacdev, DmaDesc *desc) +{ + + desc->status = ((desc->status & (~DescTxCisMask)) | DescTxCisTcpOnlyCs);//ENH_DESC + + +} +/** + * The check summ offload engine is enabled to do complete checksum computation. + * Hardware computes the tcp ip checksum including the pseudo header checksum. + * Here the tcp payload checksum field should be set to 0000. + * Ipv4 header checksum is also inserted. + * @param[in] pointer to synopGMACdevice. + * @param[in] Pointer to tx descriptor for which ointer to synopGMACdevice. + * \return returns void. + */ +void synopGMAC_tx_checksum_offload_tcp_pseudo(synopGMACdevice *gmacdev, DmaDesc *desc) +{ + + desc->status = ((desc->status & (~DescTxCisMask)) | DescTxCisTcpPseudoCs); + + +} +/*******************Ip checksum offloading APIs***************************************/ + + + + + +/*******************IEEE 1588 Timestamping API***************************************/ + + +/* + * At this time the driver supports the IEEE time stamping feature when the Enhanced Descriptors are enabled. + * For normal descriptor and the IEEE time stamp (version 1), driver support is not proviced + * Please make sure you have enabled the Advanced timestamp feature in the hardware and the driver should + * be compiled with the ADV_TME_STAMP feature. + * Some of the APIs provided here may not be valid for all configurations. Please make sure you call the + * API with due care. + */ + +/** + * This function enables the timestamping. This enables the timestamping for transmit and receive frames. + * When disabled timestamp is not added to tx and receive frames and timestamp generator is suspended. + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSENA); + return; +} +/** + * This function disables the timestamping. + * When disabled timestamp is not added to tx and receive frames and timestamp generator is suspended. + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacTSControl, GmacTSENA); + return; +} + + +/** + * Enable the interrupt to get timestamping interrupt. + * This enables the host to get the interrupt when (1) system time is greater or equal to the + * target time high and low register or (2) there is a overflow in th esecond register. + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_int_enable(synopGMACdevice *gmacdev) +{ + //synopGMACClearBits(gmacdev->MacBase,GmacInterruptMask,GmacTSIntMask); + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSTRIG); + return; +} + +/** + * Disable the interrupt to get timestamping interrupt. + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_int_disable(synopGMACdevice *gmacdev) +{ + //synopGMACSetBits(gmacdev->MacBase,GmacInterruptMask,GmacTSIntMask); + synopGMACClearBits(gmacdev->MacBase, GmacTSControl, GmacTSTRIG); + return; +} + +/** + * Enable MAC address for PTP frame filtering. + * When enabled, uses MAC address (apart from MAC address 0) to filter the PTP frames when + * PTP is sent directly over Ethernet. + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_mac_addr_filt_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSENMACADDR); + return; +} + +/** + * Disables MAC address for PTP frame filtering. + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_mac_addr_filt_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacTSControl, GmacTSENMACADDR); + return; +} + + +/** + * Selet the type of clock mode for PTP. + * Please note to use one of the follwoing as the clk_type argument. + * GmacTSOrdClk = 0x00000000, 00=> Ordinary clock + * GmacTSBouClk = 0x00010000, 01=> Boundary clock + * GmacTSEtoEClk = 0x00020000, 10=> End-to-End transparent clock + * GmacTSPtoPClk = 0x00030000, 11=> P-to-P transparent clock + * @param[in] pointer to synopGMACdevice + * @param[in] u32 value representing one of the above clk value + * \return returns void + */ +void synopGMAC_TS_set_clk_type(synopGMACdevice *gmacdev, u32 clk_type) +{ + u32 clkval; + clkval = synopGMACReadReg(gmacdev->MacBase, GmacTSControl); //set the mdc clock to the user defined value + clkval = (clkval & ~GmacTSCLKTYPE) | clk_type; + synopGMACWriteReg(gmacdev->MacBase, GmacTSControl, clkval); + return; +} + +/** + * Enable Snapshot for messages relevant to Master. + * When enabled, snapshot is taken for messages relevant to master mode only, else snapshot is taken for messages relevant + * to slave node. + * Valid only for Ordinary clock and Boundary clock + * Reserved when "Advanced Time Stamp" is not selected + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_master_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSMSTRENA); + return; +} +/** + * Disable Snapshot for messages relevant to Master. + * When disabled, snapshot is taken for messages relevant + * to slave node. + * Valid only for Ordinary clock and Boundary clock + * Reserved when "Advanced Time Stamp" is not selected + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_master_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacTSControl, GmacTSMSTRENA); + return; +} +/** + * Enable Snapshot for Event messages. + * When enabled, snapshot is taken for event messages only (SYNC, Delay_Req, Pdelay_Req or Pdelay_Resp) + * When disabled, snapshot is taken for all messages except Announce, Management and Signaling. + * Reserved when "Advanced Time Stamp" is not selected + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_event_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSEVNTENA); + return; +} +/** + * Disable Snapshot for Event messages. + * When disabled, snapshot is taken for all messages except Announce, Management and Signaling. + * Reserved when "Advanced Time Stamp" is not selected + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_event_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacTSControl, GmacTSEVNTENA); + return; +} + +/** + * Enable time stamp snapshot for IPV4 frames. + * When enabled, time stamp snapshot is taken for IPV4 frames + * Reserved when "Advanced Time Stamp" is not selected + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_IPV4_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSIPV4ENA); + return; +} +/** + * Disable time stamp snapshot for IPV4 frames. + * When disabled, time stamp snapshot is not taken for IPV4 frames + * Reserved when "Advanced Time Stamp" is not selected + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_IPV4_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacTSControl, GmacTSIPV4ENA); + return; +} // Only for "Advanced Time Stamp" +/** + * Enable time stamp snapshot for IPV6 frames. + * When enabled, time stamp snapshot is taken for IPV6 frames + * Reserved when "Advanced Time Stamp" is not selected + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_IPV6_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSIPV6ENA); + return; +} +/** + * Disable time stamp snapshot for IPV6 frames. + * When disabled, time stamp snapshot is not taken for IPV6 frames + * Reserved when "Advanced Time Stamp" is not selected + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_IPV6_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacTSControl, GmacTSIPV6ENA); + return; +} + +/** + * Enable time stamp snapshot for PTP over Ethernet frames. + * When enabled, time stamp snapshot is taken for PTP over Ethernet frames + * Reserved when "Advanced Time Stamp" is not selected + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_ptp_over_ethernet_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSIPENA); + return; +} +/** + * Disable time stamp snapshot for PTP over Ethernet frames. + * When disabled, time stamp snapshot is not taken for PTP over Ethernet frames + * Reserved when "Advanced Time Stamp" is not selected + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_ptp_over_ethernet_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacTSControl, GmacTSIPENA); + return; +} + + +/** + * Snoop PTP packet for version 2 format + * When set the PTP packets are snooped using the version 2 format. + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_pkt_snoop_ver2(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSVER2ENA); + return; +} +/** + * Snoop PTP packet for version 2 format + * When set the PTP packets are snooped using the version 2 format. + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_pkt_snoop_ver1(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacTSControl, GmacTSVER2ENA); + return; +} + +/** + * Timestamp digital rollover + * When set the timestamp low register rolls over after 0x3B9A_C9FF value. + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_digital_rollover_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSCTRLSSR); + return; +} +/** + * Timestamp binary rollover + * When set the timestamp low register rolls over after 0x7FFF_FFFF value. + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_binary_rollover_enable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacTSControl, GmacTSCTRLSSR); + return; +} +/** + * Enable Time Stamp for All frames + * When set the timestamp snap shot is enabled for all frames received by the core. + * Reserved when "Advanced Time Stamp" is not selected + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_all_frames_enable(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSENALL); + return; +} +/** + * Disable Time Stamp for All frames + * When reset the timestamp snap shot is not enabled for all frames received by the core. + * Reserved when "Advanced Time Stamp" is not selected + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_all_frames_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacTSControl, GmacTSENALL); + return; +} +/** + * Addend Register Update + * This function loads the contents of Time stamp addend register with the supplied 32 value. + * This is reserved function when only coarse correction option is selected + * @param[in] pointer to synopGMACdevice + * @param[in] 32 bit addend value + * \return returns 0 for Success or else Failure + */ +s32 synopGMAC_TS_addend_update(synopGMACdevice *gmacdev, u32 addend_value) +{ + u32 loop_variable; + synopGMACWriteReg(gmacdev->MacBase, GmacTSAddend, addend_value); // Load the addend_value in to Addend register + for (loop_variable = 0; loop_variable < DEFAULT_LOOP_VARIABLE; loop_variable++) //Wait till the busy bit gets cleared with in a certain amount of time + { + if (!((synopGMACReadReg(gmacdev->MacBase, GmacTSControl)) & GmacTSADDREG)) // if it is cleared then break + { + break; + } + plat_delay(DEFAULT_DELAY_VARIABLE); + } + if (loop_variable < DEFAULT_LOOP_VARIABLE) + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSADDREG); + else + { + TR("Error::: The TSADDREG bit is not getting cleared !!!!!!\n"); + return -ESYNOPGMACPHYERR; + } + return 0; + +} +/** + * time stamp Update + * This function updates (adds/subtracts) with the value specified in the Timestamp High Update and + * Timestamp Low Update register. + * @param[in] pointer to synopGMACdevice + * @param[in] Timestamp High Update value + * @param[in] Timestamp Low Update value + * \return returns 0 for Success or else Failure + */ +s32 synopGMAC_TS_timestamp_update(synopGMACdevice *gmacdev, u32 high_value, u32 low_value) +{ + u32 loop_variable; + synopGMACWriteReg(gmacdev->MacBase, GmacTSHighUpdate, high_value); // Load the high value to Timestamp High register + synopGMACWriteReg(gmacdev->MacBase, GmacTSLowUpdate, low_value); // Load the high value to Timestamp High register + for (loop_variable = 0; loop_variable < DEFAULT_LOOP_VARIABLE; loop_variable++) //Wait till the busy bit gets cleared with in a certain amount of time + { + if (!((synopGMACReadReg(gmacdev->MacBase, GmacTSControl)) & GmacTSUPDT)) // if it is cleared then break + { + break; + } + plat_delay(DEFAULT_DELAY_VARIABLE); + } + if (loop_variable < DEFAULT_LOOP_VARIABLE) + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSUPDT); + else + { + TR("Error::: The TSADDREG bit is not getting cleared !!!!!!\n"); + return -ESYNOPGMACPHYERR; + } + return 0; +} + +/** + * time stamp Initialize + * This function Loads/Initializes h the value specified in the Timestamp High Update and + * Timestamp Low Update register. + * @param[in] pointer to synopGMACdevice + * @param[in] Timestamp High Load value + * @param[in] Timestamp Low Load value + * \return returns 0 for Success or else Failure + */ +s32 synopGMAC_TS_timestamp_init(synopGMACdevice *gmacdev, u32 high_value, u32 low_value) +{ + u32 loop_variable; + synopGMACWriteReg(gmacdev->MacBase, GmacTSHighUpdate, high_value); // Load the high value to Timestamp High register + synopGMACWriteReg(gmacdev->MacBase, GmacTSLowUpdate, low_value); // Load the high value to Timestamp High register + for (loop_variable = 0; loop_variable < DEFAULT_LOOP_VARIABLE; loop_variable++) //Wait till the busy bit gets cleared with in a certain amount of time + { + if (!((synopGMACReadReg(gmacdev->MacBase, GmacTSControl)) & GmacTSINT)) // if it is cleared then break + { + break; + } + plat_delay(DEFAULT_DELAY_VARIABLE); + } + if (loop_variable < DEFAULT_LOOP_VARIABLE) + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSINT); + else + { + TR("Error::: The TSADDREG bit is not getting cleared !!!!!!\n"); + return -ESYNOPGMACPHYERR; + } + return 0; +} + +/** + * Time Stamp Update Coarse + * When reset the timestamp update is done using coarse method. + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_coarse_update(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacTSControl, GmacTSCFUPDT); + return; +} +/** + * Time Stamp Update Fine + * When reset the timestamp update is done using Fine method. + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_fine_update(synopGMACdevice *gmacdev) +{ + synopGMACSetBits(gmacdev->MacBase, GmacTSControl, GmacTSCFUPDT); + return; +} + +/** + * Load the Sub Second Increment value in to Sub Second increment register + * @param[in] pointer to synopGMACdevice + * \return returns void + */ +void synopGMAC_TS_subsecond_init(synopGMACdevice *gmacdev, u32 sub_sec_inc_value) +{ + synopGMACWriteReg(gmacdev->MacBase, GmacTSSubSecIncr, (sub_sec_inc_value & GmacSSINCMsk)); + return; +} +/** + * Reads the time stamp contents in to the respective pointers + * These registers are readonly. + * This function returns the 48 bit time stamp assuming Version 2 timestamp with higher word is selected. + * @param[in] pointer to synopGMACdevice + * @param[in] pointer to hold 16 higher bit second register contents + * @param[in] pointer to hold 32 bit second register contents + * @param[in] pointer to hold 32 bit subnanosecond register contents + * \return returns void + * \note Please note that since the atomic access to the timestamp registers is not possible, + * the contents read may be different from the actual time stamp. + */ +void synopGMAC_TS_read_timestamp(synopGMACdevice *gmacdev, u16 *higher_sec_val, u32 *sec_val, u32 *sub_sec_val) +{ + * higher_sec_val = (u16)(synopGMACReadReg(gmacdev->MacBase, GmacTSHighWord) & GmacTSHighWordMask); + * sec_val = synopGMACReadReg(gmacdev->MacBase, GmacTSHigh); + * sub_sec_val = synopGMACReadReg(gmacdev->MacBase, GmacTSLow); + return; +} +/** + * Loads the time stamp higher sec value from the value supplied + * @param[in] pointer to synopGMACdevice + * @param[in] 16 higher bit second register contents passed as 32 bit value + * \return returns void + */ +void synopGMAC_TS_load_timestamp_higher_val(synopGMACdevice *gmacdev, u32 higher_sec_val) +{ + synopGMACWriteReg(gmacdev->MacBase, GmacTSHighWord, (higher_sec_val & GmacTSHighWordMask)); + return; +} +/** + * Reads the time stamp higher sec value to respective pointers + * @param[in] pointer to synopGMACdevice + * @param[in] pointer to hold 16 higher bit second register contents + * \return returns void + */ +void synopGMAC_TS_read_timestamp_higher_val(synopGMACdevice *gmacdev, u16 *higher_sec_val) +{ + * higher_sec_val = (u16)(synopGMACReadReg(gmacdev->MacBase, GmacTSHighWord) & GmacTSHighWordMask); + return; +} +/** + * Load the Target time stamp registers + * This function Loads the target time stamp registers with the values proviced + * @param[in] pointer to synopGMACdevice + * @param[in] target Timestamp High value + * @param[in] target Timestamp Low value + * \return returns 0 for Success or else Failure + */ +void synopGMAC_TS_load_target_timestamp(synopGMACdevice *gmacdev, u32 sec_val, u32 sub_sec_val) +{ + synopGMACWriteReg(gmacdev->MacBase, GmacTSTargetTimeHigh, sec_val); + synopGMACWriteReg(gmacdev->MacBase, GmacTSTargetTimeLow, sub_sec_val); + return; +} +/** + * Reads the Target time stamp registers + * This function Loads the target time stamp registers with the values proviced + * @param[in] pointer to synopGMACdevice + * @param[in] pointer to hold target Timestamp High value + * @param[in] pointer to hold target Timestamp Low value + * \return returns 0 for Success or else Failure + */ +void synopGMAC_TS_read_target_timestamp(synopGMACdevice *gmacdev, u32 *sec_val, u32 *sub_sec_val) +{ + * sec_val = synopGMACReadReg(gmacdev->MacBase, GmacTSTargetTimeHigh); + * sub_sec_val = synopGMACReadReg(gmacdev->MacBase, GmacTSTargetTimeLow); + return; +} + +void synopGMAC_src_addr_insert_enable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacSrcAddrInsRpl); + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacSrcAddrIns); + +} +void synopGMAC_src_addr_insert_disable(synopGMACdevice *gmacdev) +{ + + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacSrcAddrInsRpl); + +} +void synopGMAC_src_addr_replace_enable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacSrcAddrInsRpl); + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacSrcAddrRpl); + + +} +void synopGMAC_src_addr_replace_disable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacSrcAddrInsRpl); + +} + + +void synopGMAC_svlan_insertion_enable(synopGMACdevice *gmacdev, u16 vlantag) +{ + + synopGMACWriteReg(gmacdev->MacBase, GmacVLANIncRep, GmacVLP | GmacSVLAN | GmacVLANIns | vlantag); + + +} + +void synopGMAC_cvlan_insertion_enable(synopGMACdevice *gmacdev, u16 vlantag) +{ + synopGMACWriteReg(gmacdev->MacBase, GmacVLANIncRep, GmacVLP | GmacCVLAN | GmacVLANIns | vlantag); + + +} + +void synopGMAC_svlan_replace_enable(synopGMACdevice *gmacdev, u16 vlantag) +{ + synopGMACWriteReg(gmacdev->MacBase, GmacVLANIncRep, GmacVLP | GmacSVLAN | GmacVLANRep | vlantag); + +} + +void synopGMAC_cvlan_replace_enable(synopGMACdevice *gmacdev, u16 vlantag) +{ + synopGMACWriteReg(gmacdev->MacBase, GmacVLANIncRep, GmacVLP | GmacCVLAN | GmacVLANRep | vlantag); + +} + +void synopGMAC_vlan_deletion_enable(synopGMACdevice *gmacdev) +{ + synopGMACWriteReg(gmacdev->MacBase, GmacVLANIncRep, GmacVLP | GmacVLANDel); + + +} + + +void synopGMAC_vlan_no_act_enable(synopGMACdevice *gmacdev) +{ + synopGMACClearBits(gmacdev->MacBase, GmacVLANIncRep, 0xFFFFFFFF); +} + + diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_Dev.h b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_Dev.h new file mode 100644 index 0000000000..b25b522d08 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_Dev.h @@ -0,0 +1,1715 @@ +/* =================================================================================== + * Copyright (c) <2009> Synopsys, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software annotated with this license and associated documentation files + * (the "Software"), to deal in the Software without restriction, including without + * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * =================================================================================== */ + +/**\file + * This file defines the function prototypes for the Synopsys GMAC device and the + * Marvell 88E1011/88E1011S integrated 10/100/1000 Gigabit Ethernet Transceiver. + * Since the phy register mapping are standardised, the phy register map and the + * bit definitions remain the same for other phy as well. + * This also defines some of the Ethernet related parmeters. + * \internal + * -----------------------------REVISION HISTORY------------------------------------ + * Synopsys 01/Aug/2007 Created + */ + + +#ifndef SYNOP_GMAC_DEV_H +#define SYNOP_GMAC_DEV_H 1 + + +#include "synopGMAC_plat.h" +#include "synopGMAC_types.h" + +/*SynopGMAC can support up to 32 phys*/ + +enum GMACPhyBase +{ + PHY0 = 0, //The device can support 32 phys, but we use first phy only + PHY1 = 1, + PHY31 = 31, +}; + +#define DEFAULT_PHY_BASE PHY0 //We use First Phy +#define MACBASE 0x0000 // The Mac Base address offset is 0x0000 +#define DMABASE 0x1000 // Dma base address starts with an offset 0x1000 + + +#define TRANSMIT_DESC_SIZE 512 //Tx Descriptors needed in the Descriptor pool/queue +#define RECEIVE_DESC_SIZE 1024 //Rx Descriptors needed in the Descriptor pool/queue + +#define ETHERNET_HEADER 14 //6 byte Dest addr, 6 byte Src addr, 2 byte length/type +#define ETHERNET_CRC 4 //Ethernet CRC +#define ETHERNET_EXTRA 2 //Only God knows about this????? +#define ETHERNET_PACKET_COPY 250 // Maximum length when received data is copied on to a new skb +#define ETHERNET_PACKET_EXTRA 18 // Preallocated length for the rx packets is MTU + ETHERNET_PACKET_EXTRA +#define VLAN_TAG 4 //optional 802.1q VLAN Tag +#define MIN_ETHERNET_PAYLOAD 46 //Minimum Ethernet payload size +#define MAX_ETHERNET_PAYLOAD 1500 //Maximum Ethernet payload size +#define JUMBO_FRAME_PAYLOAD 9000 //Jumbo frame payload size + +#define PKT_FRAME_BUF_SIZE 1536 //(ETHERNET_HEADER + ETHERNET_CRC + MAX_ETHERNET_PAYLOAD + VLAN_TAG)+alignment + +// This is the IP's phy address. This is unique address for every MAC in the universe +#define DEFAULT_MAC0_ADDRESS {0x00, 0x55, 0x7B, 0xB5, 0x7D, 0xF7} +#define DEFAULT_MAC1_ADDRESS {0x00, 0x55, 0x7B, 0xB5, 0x7D, 0xF8} +/* +DMA Descriptor Structure +The structure is common for both receive and transmit descriptors +The descriptor is of 4 words, but our structrue contains 6 words where +last two words are to hold the virtual address of the network buffer pointers +for driver's use +From the GMAC core release 3.50a onwards, the Enhanced Descriptor structure got changed. +The descriptor (both transmit and receive) are of 8 words each rather the 4 words of normal +descriptor structure. +Whenever IEEE 1588 Timestamping is enabled TX/RX DESC6 provides the lower 32 bits of Timestamp value and + TX/RX DESC7 provides the upper 32 bits of Timestamp value +In addition to this whenever extended status bit is set (RX DESC0 bit 0), RX DESC4 contains the extended status information +*/ + +#define MODULO_INTERRUPT 1 // if it is set to 1, interrupt is available for all the descriptors or else interrupt is available only for +// descriptor whose index%MODULO_INTERRUPT is zero +typedef struct DmaDescStruct +{ + u32 status; /* Status */ + u32 length; /* Buffer 1 and Buffer 2 length */ + u32 buffer1; /* Network Buffer 1 pointer (Dma-able) */ + u32 buffer2; /* Network Buffer 2 pointer or next descriptor pointer (Dma-able)in chain structure */ + /* This data below is used only by driver */ + u32 extstatus; /* Extended status of a Rx Descriptor */ + u32 reserved1; /* Reserved word */ + u32 timestamplow; /* Lower 32 bits of the 64 bit timestamp value */ + u32 timestamphigh; /* Higher 32 bits of the 64 bit timestamp value */ + //u32 data1; /* This holds virtual address of buffer1, not used by DMA */ + //u32 data2; /* This holds virtual address of buffer2, not used by DMA */ +} DmaDesc; + +enum DescMode +{ + RINGMODE = 0x00000001, + CHAINMODE = 0x00000002, +}; + +enum BufferMode +{ + SINGLEBUF = 0x00000001, + DUALBUF = 0x00000002, +}; + +/* synopGMAC device data */ + +struct net_device_stats +{ + u32 tx_bytes; + u32 tx_packets; + u32 tx_errors; + u32 tx_aborted_errors; + u32 tx_carrier_errors; + u32 tx_ip_header_errors; + u32 tx_ip_payload_errors; + u32 collisions; + u32 rx_bytes; + u32 rx_packets; + u32 rx_errors; + u32 rx_crc_errors; + u32 rx_frame_errors; + u32 rx_length_errors; + u32 rx_dropped; + u32 rx_over_errors; + u32 rx_ip_header_errors; + u32 rx_ip_payload_errors; + volatile u32 ts_int; +}; + +typedef struct synopGMACDeviceStruct +{ + u32 MacBase; /* base address of MAC registers */ + u32 DmaBase; /* base address of DMA registers */ + u32 PhyBase; /* PHY device address on MII interface */ + u32 Version; /* Gmac Revision version */ + + dma_addr_t TxDescDma; /* Dma-able address of first tx descriptor either in ring or chain mode, this is used by the GMAC device*/ + dma_addr_t RxDescDma; /* Dma-albe address of first rx descriptor either in ring or chain mode, this is used by the GMAC device*/ + DmaDesc *TxDesc; /* start address of TX descriptors ring or chain, this is used by the driver */ + DmaDesc *RxDesc; /* start address of RX descriptors ring or chain, this is used by the driver */ + + u32 BusyTxDesc; /* Number of Tx Descriptors owned by DMA at any given time*/ + u32 BusyRxDesc; /* Number of Rx Descriptors owned by DMA at any given time*/ + + u32 RxDescCount; /* number of rx descriptors in the tx descriptor queue/pool */ + u32 TxDescCount; /* number of tx descriptors in the rx descriptor queue/pool */ + + u32 TxBusy; /* index of the tx descriptor owned by DMA, is obtained by synopGMAC_get_tx_qptr() */ + u32 TxNext; /* index of the tx descriptor next available with driver, given to DMA by synopGMAC_set_tx_qptr() */ + u32 RxBusy; /* index of the rx descriptor owned by DMA, obtained by synopGMAC_get_rx_qptr() */ + u32 RxNext; /* index of the rx descriptor next available with driver, given to DMA by synopGMAC_set_rx_qptr() */ + + DmaDesc *TxBusyDesc; /* Tx Descriptor address corresponding to the index TxBusy */ + DmaDesc *TxNextDesc; /* Tx Descriptor address corresponding to the index TxNext */ + DmaDesc *RxBusyDesc; /* Rx Descriptor address corresponding to the index TxBusy */ + DmaDesc *RxNextDesc; /* Rx Descriptor address corresponding to the index RxNext */ + + struct net_device_stats synopGMACNetStats; + + /*Phy related stuff*/ + u32 ClockDivMdc; /* Clock divider value programmed in the hardware */ + /* The status of the link */ + u32 LinkState; /* Link status as reported by the Marvel Phy */ + u32 DuplexMode; /* Duplex mode of the Phy */ + u32 Speed; /* Speed of the Phy */ + u32 LoopBackMode; /* Loopback status of the Phy */ + + u32 tx_sec; + u32 tx_subsec; + u32 rx_sec; + u32 rx_subsec; + + u32 GMAC_Power_down; + +} synopGMACdevice; + + +/* Below is "88E1011/88E1011S Integrated 10/100/1000 Gigabit Ethernet Transceiver" + * Register and their layouts. This Phy has been used in the Dot Aster GMAC Phy daughter. + * Since the Phy register map is standard, this map hardly changes to a different Ppy + */ + +enum MiiRegisters +{ + PHY_CONTROL_REG = 0x0000, /*Control Register*/ + PHY_STATUS_REG = 0x0001, /*Status Register */ + PHY_ID_HI_REG = 0x0002, /*PHY Identifier High Register*/ + PHY_ID_LOW_REG = 0x0003, /*PHY Identifier High Register*/ + PHY_AN_ADV_REG = 0x0004, /*Auto-Negotiation Advertisement Register*/ + PHY_LNK_PART_ABl_REG = 0x0005, /*Link Partner Ability Register (Base Page)*/ + PHY_AN_EXP_REG = 0x0006, /*Auto-Negotiation Expansion Register*/ + PHY_AN_NXT_PAGE_TX_REG = 0x0007, /*Next Page Transmit Register*/ + PHY_LNK_PART_NXT_PAGE_REG = 0x0008, /*Link Partner Next Page Register*/ + PHY_1000BT_CTRL_REG = 0x0009, /*1000BASE-T Control Register*/ + PHY_1000BT_STATUS_REG = 0x000a, /*1000BASE-T Status Register*/ + PHY_SPECIFIC_CTRL_REG = 0x0010, /*Phy specific control register*/ + PHY_SPECIFIC_STATUS_REG = 0x0011, /*Phy specific status register*/ + PHY_INTERRUPT_ENABLE_REG = 0x0012, /*Phy interrupt enable register*/ + PHY_INTERRUPT_STATUS_REG = 0x0013, /*Phy interrupt status register*/ + PHY_EXT_PHY_SPC_CTRL = 0x0014, /*Extended Phy specific control*/ + PHY_RX_ERR_COUNTER = 0x0015, /*Receive Error Counter*/ + PHY_EXT_ADDR_CBL_DIAG = 0x0016, /*Extended address for cable diagnostic register*/ + PHY_LED_CONTROL = 0x0018, /*LED Control*/ + PHY_MAN_LED_OVERIDE = 0x0019, /*Manual LED override register*/ + PHY_EXT_PHY_SPC_CTRL2 = 0x001a, /*Extended Phy specific control 2*/ + PHY_EXT_PHY_SPC_STATUS = 0x001b, /*Extended Phy specific status*/ + PHY_CBL_DIAG_REG = 0x001c, /*Cable diagnostic registers*/ +}; + + +/* This is Control register layout. Control register is of 16 bit wide. +*/ + +enum Mii_GEN_CTRL +{ + /* Description bits R/W default value */ + Mii_reset = 0x8000, + Mii_Speed_10 = 0x0000, /* 10 Mbps 6:13 RW */ + Mii_Speed_100 = 0x2000, /* 100 Mbps 6:13 RW */ + Mii_Speed_1000 = 0x0040, /* 1000 Mbit/s 6:13 RW */ + + Mii_Duplex = 0x0100, /* Full Duplex mode 8 RW */ + + Mii_Manual_Master_Config = 0x0800, /* Manual Master Config 11 RW */ + + Mii_Loopback = 0x4000, /* Enable Loop back 14 RW */ + Mii_NoLoopback = 0x0000, /* Enable Loop back 14 RW */ +}; + +enum Mii_Phy_Status +{ + Mii_phy_status_speed_10 = 0x0000, + Mii_phy_status_speed_100 = 0x4000, + Mii_phy_status_speed_1000 = 0x8000, + + Mii_phy_status_full_duplex = 0x2000, + Mii_phy_status_half_duplex = 0x0000, + + Mii_phy_status_link_up = 0x0400, +}; +/* This is Status register layout. Status register is of 16 bit wide. +*/ +enum Mii_GEN_STATUS +{ + Mii_AutoNegCmplt = 0x0020, /* Autonegotiation completed 5 RW */ + Mii_Link = 0x0004, /* Link status 2 RW */ +}; + +enum Mii_Link_Status +{ + LINKDOWN = 0, + LINKUP = 1, +}; + +enum Mii_Duplex_Mode +{ + HALFDUPLEX = 1, + FULLDUPLEX = 2, +}; +enum Mii_Link_Speed +{ + SPEED10 = 1, + SPEED100 = 2, + SPEED1000 = 3, +}; + +enum Mii_Loop_Back +{ + NOLOOPBACK = 0, + LOOPBACK = 1, +}; + + + +/********************************************************** + * GMAC registers Map + * For Pci based system address is BARx + GmacRegisterBase + * For any other system translation is done accordingly + **********************************************************/ +enum GmacRegisters +{ + GmacConfig = 0x0000, /* Mac config Register */ + GmacFrameFilter = 0x0004, /* Mac frame filtering controls */ + GmacHashHigh = 0x0008, /* Multi-cast hash table high */ + GmacHashLow = 0x000C, /* Multi-cast hash table low */ + GmacGmiiAddr = 0x0010, /* GMII address Register(ext. Phy) */ + GmacGmiiData = 0x0014, /* GMII data Register(ext. Phy) */ + GmacFlowControl = 0x0018, /* Flow control Register */ + GmacVlan = 0x001C, /* VLAN tag Register (IEEE 802.1Q) */ + + GmacVersion = 0x0020, /* GMAC Core Version Register */ + GmacDebug = 0x0024, /* GMAC Debug Register */ + GmacWakeupAddr = 0x0028, /* GMAC wake-up frame filter adrress reg */ + GmacPmtCtrlStatus = 0x002C, /* PMT control and status register */ + + + GmacLPICtrlSts = 0x0030, /* LPI (low power idle) Control and Status Register */ + GmacLPITimerCtrl = 0x0034, /* LPI timer control register */ + + + GmacInterruptStatus = 0x0038, /* Mac Interrupt ststus register */ + GmacInterruptMask = 0x003C, /* Mac Interrupt Mask register */ + + GmacAddr0High = 0x0040, /* Mac address0 high Register */ + GmacAddr0Low = 0x0044, /* Mac address0 low Register */ + GmacAddr1High = 0x0048, /* Mac address1 high Register */ + GmacAddr1Low = 0x004C, /* Mac address1 low Register */ + GmacAddr2High = 0x0050, /* Mac address2 high Register */ + GmacAddr2Low = 0x0054, /* Mac address2 low Register */ + GmacAddr3High = 0x0058, /* Mac address3 high Register */ + GmacAddr3Low = 0x005C, /* Mac address3 low Register */ + GmacAddr4High = 0x0060, /* Mac address4 high Register */ + GmacAddr4Low = 0x0064, /* Mac address4 low Register */ + GmacAddr5High = 0x0068, /* Mac address5 high Register */ + GmacAddr5Low = 0x006C, /* Mac address5 low Register */ + GmacAddr6High = 0x0070, /* Mac address6 high Register */ + GmacAddr6Low = 0x0074, /* Mac address6 low Register */ + GmacAddr7High = 0x0078, /* Mac address7 high Register */ + GmacAddr7Low = 0x007C, /* Mac address7 low Register */ + GmacAddr8High = 0x0080, /* Mac address8 high Register */ + GmacAddr8Low = 0x0084, /* Mac address8 low Register */ + GmacAddr9High = 0x0088, /* Mac address9 high Register */ + GmacAddr9Low = 0x008C, /* Mac address9 low Register */ + GmacAddr10High = 0x0090, /* Mac address10 high Register */ + GmacAddr10Low = 0x0094, /* Mac address10 low Register */ + GmacAddr11High = 0x0098, /* Mac address11 high Register */ + GmacAddr11Low = 0x009C, /* Mac address11 low Register */ + GmacAddr12High = 0x00A0, /* Mac address12 high Register */ + GmacAddr12Low = 0x00A4, /* Mac address12 low Register */ + GmacAddr13High = 0x00A8, /* Mac address13 high Register */ + GmacAddr13Low = 0x00AC, /* Mac address13 low Register */ + GmacAddr14High = 0x00B0, /* Mac address14 high Register */ + GmacAddr14Low = 0x00B4, /* Mac address14 low Register */ + GmacAddr15High = 0x00B8, /* Mac address15 high Register */ + GmacAddr15Low = 0x00BC, /* Mac address15 low Register */ + GmacRgmiiCtrlSts = 0x00D8, /*SGMII_RGMII_SMII_Control_Status Register */ + GmacVLANIncRep = 0x0584, + /*Time Stamp Register Map*/ + GmacTSControl = 0x0700, /* Controls the Timestamp update logic : only when IEEE 1588 time stamping is enabled in corekit */ + + GmacTSSubSecIncr = 0x0704, /* 8 bit value by which sub second register is incremented : only when IEEE 1588 time stamping without external timestamp input */ + + GmacTSHigh = 0x0708, /* 32 bit seconds(MS) : only when IEEE 1588 time stamping without external timestamp input */ + GmacTSLow = 0x070C, /* 32 bit nano seconds(MS) : only when IEEE 1588 time stamping without external timestamp input */ + + GmacTSHighUpdate = 0x0710, /* 32 bit seconds(MS) to be written/added/subtracted : only when IEEE 1588 time stamping without external timestamp input */ + GmacTSLowUpdate = 0x0714, /* 32 bit nano seconds(MS) to be writeen/added/subtracted : only when IEEE 1588 time stamping without external timestamp input */ + + GmacTSAddend = 0x0718, /* Used by Software to readjust the clock frequency linearly : only when IEEE 1588 time stamping without external timestamp input */ + + GmacTSTargetTimeHigh = 0x071C, /* 32 bit seconds(MS) to be compared with system time : only when IEEE 1588 time stamping without external timestamp input */ + GmacTSTargetTimeLow = 0x0720, /* 32 bit nano seconds(MS) to be compared with system time : only when IEEE 1588 time stamping without external timestamp input */ + + GmacTSHighWord = 0x0724, /* Time Stamp Higher Word Register (Version 2 only); only lower 16 bits are valid */ + //GmacTSHighWordUpdate = 0x072C, /* Time Stamp Higher Word Update Register (Version 2 only); only lower 16 bits are valid */ + + GmacTSStatus = 0x0728, /* Time Stamp Status Register */ + GmacPPSCtrl = 0x072C, /* PPS Control Register */ + GmacPPSInt = 0x0760, /* PPS0 Interval Register */ + GmacPPSWidth = 0x0764, /* PPS0 Width Register */ +}; + +/********************************************************** + * GMAC Network interface registers + * This explains the Register's Layout + + * FES is Read only by default and is enabled only when Tx + * Config Parameter is enabled for RGMII/SGMII interface + * during CoreKit Config. + + * DM is Read only with value 1'b1 in Full duplex only Config + **********************************************************/ + +/* GmacConfig = 0x0000, Mac config Register Layout */ +enum GmacConfigReg +{ + /* Bit description Bits R/W Reset value */ + + GmacSrcAddrInsRpl = 0x70000000, + GmacSrcAddrIns = 0x20000000, + GmacSrcAddrRpl = 0x30000000, + GmacWatchdog = 0x00800000, + GmacWatchdogDisable = 0x00800000, /* (WD)Disable watchdog timer on Rx 23 RW */ + GmacWatchdogEnable = 0x00000000, /* Enable watchdog timer 0 */ + + GmacJabber = 0x00400000, + GmacJabberDisable = 0x00400000, /* (JD)Disable jabber timer on Tx 22 RW */ + GmacJabberEnable = 0x00000000, /* Enable jabber timer 0 */ + + GmacFrameBurst = 0x00200000, + GmacFrameBurstEnable = 0x00200000, /* (BE)Enable frame bursting during Tx 21 RW */ + GmacFrameBurstDisable = 0x00000000, /* Disable frame bursting 0 */ + + GmacJumboFrame = 0x00100000, + GmacJumboFrameEnable = 0x00100000, /* (JE)Enable jumbo frame for Tx 20 RW */ + GmacJumboFrameDisable = 0x00000000, /* Disable jumbo frame 0 */ + + GmacInterFrameGap7 = 0x000E0000, /* (IFG) Config7 - 40 bit times 19:17 RW */ + GmacInterFrameGap6 = 0x000C0000, /* (IFG) Config6 - 48 bit times */ + GmacInterFrameGap5 = 0x000A0000, /* (IFG) Config5 - 56 bit times */ + GmacInterFrameGap4 = 0x00080000, /* (IFG) Config4 - 64 bit times */ + GmacInterFrameGap3 = 0x00040000, /* (IFG) Config3 - 72 bit times */ + GmacInterFrameGap2 = 0x00020000, /* (IFG) Config2 - 80 bit times */ + GmacInterFrameGap1 = 0x00010000, /* (IFG) Config1 - 88 bit times */ + GmacInterFrameGap0 = 0x00000000, /* (IFG) Config0 - 96 bit times 000 */ + + GmacDisableCrs = 0x00010000, + GmacMiiGmii = 0x00008000, + GmacSelectMii = 0x00008000, /* (PS)Port Select-MII mode 15 RW */ + GmacSelectGmii = 0x00000000, /* GMII mode 0 */ + + GmacFESpeed100 = 0x00004000, /*(FES)Fast Ethernet speed 100Mbps 14 RW */ + GmacFESpeed10 = 0x00000000, /* 10Mbps 0 */ + + GmacRxOwn = 0x00002000, + GmacDisableRxOwn = 0x00002000, /* (DO)Disable receive own packets 13 RW */ + GmacEnableRxOwn = 0x00000000, /* Enable receive own packets 0 */ + + GmacLoopback = 0x00001000, + GmacLoopbackOn = 0x00001000, /* (LM)Loopback mode for GMII/MII 12 RW */ + GmacLoopbackOff = 0x00000000, /* Normal mode 0 */ + + GmacDuplex = 0x00000800, + GmacFullDuplex = 0x00000800, /* (DM)Full duplex mode 11 RW */ + GmacHalfDuplex = 0x00000000, /* Half duplex mode 0 */ + + GmacRxIpcOffload = 0x00000400, /*IPC checksum offload 10 RW 0 */ + + GmacRetry = 0x00000200, + GmacRetryDisable = 0x00000200, /* (DR)Disable Retry 9 RW */ + GmacRetryEnable = 0x00000000, /* Enable retransmission as per BL 0 */ + + GmacLinkUp = 0x00000100, /* (LUD)Link UP 8 RW */ + GmacLinkDown = 0x00000100, /* Link Down 0 */ + + GmacPadCrcStrip = 0x00000080, + GmacPadCrcStripEnable = 0x00000080, /* (ACS) Automatic Pad/Crc strip enable 7 RW */ + GmacPadCrcStripDisable = 0x00000000, /* Automatic Pad/Crc stripping disable 0 */ + + GmacBackoffLimit = 0x00000060, + GmacBackoffLimit3 = 0x00000060, /* (BL)Back-off limit in HD mode 6:5 RW */ + GmacBackoffLimit2 = 0x00000040, /* */ + GmacBackoffLimit1 = 0x00000020, /* */ + GmacBackoffLimit0 = 0x00000000, /* 00 */ + + GmacDeferralCheck = 0x00000010, + GmacDeferralCheckEnable = 0x00000010, /* (DC)Deferral check enable in HD mode 4 RW */ + GmacDeferralCheckDisable = 0x00000000, /* Deferral check disable 0 */ + + GmacTx = 0x00000008, + GmacTxEnable = 0x00000008, /* (TE)Transmitter enable 3 RW */ + GmacTxDisable = 0x00000000, /* Transmitter disable 0 */ + + GmacRx = 0x00000004, + GmacRxEnable = 0x00000004, /* (RE)Receiver enable 2 RW */ + GmacRxDisable = 0x00000000, /* Receiver disable 0 */ +}; + +/* GmacFrameFilter = 0x0004, Mac frame filtering controls Register Layout*/ +enum GmacFrameFilterReg +{ + GmacFilter = 0x80000000, + GmacFilterOff = 0x80000000, /* (RA)Receive all incoming packets 31 RW */ + GmacFilterOn = 0x00000000, /* Receive filtered packets only 0 */ + GmacVlanTagFilter = 0x00010000, /*VLAN tag filter enable 16 RW 0 */ + GmacHashPerfectFilter = 0x00000400, /*Hash or Perfect Filter enable 10 RW 0 */ + + GmacSrcAddrFilter = 0x00000200, + GmacSrcAddrFilterEnable = 0x00000200, /* (SAF)Source Address Filter enable 9 RW */ + GmacSrcAddrFilterDisable = 0x00000000, /* 0 */ + + GmacSrcInvaAddrFilter = 0x00000100, + GmacSrcInvAddrFilterEn = 0x00000100, /* (SAIF)Inv Src Addr Filter enable 8 RW */ + GmacSrcInvAddrFilterDis = 0x00000000, /* 0 */ + + GmacPassControl = 0x000000C0, + GmacPassControl3 = 0x000000C0, /* (PCS)Forwards ctrl frms that pass AF 7:6 RW */ + GmacPassControl2 = 0x00000080, /* Forwards all control frames */ + GmacPassControl1 = 0x00000040, /* Does not pass control frames */ + GmacPassControl0 = 0x00000000, /* Does not pass control frames 00 */ + + GmacBroadcast = 0x00000020, + GmacBroadcastDisable = 0x00000020, /* (DBF)Disable Rx of broadcast frames 5 RW */ + GmacBroadcastEnable = 0x00000000, /* Enable broadcast frames 0 */ + + GmacMulticastFilter = 0x00000010, + GmacMulticastFilterOff = 0x00000010, /* (PM) Pass all multicast packets 4 RW */ + GmacMulticastFilterOn = 0x00000000, /* Pass filtered multicast packets 0 */ + + GmacDestAddrFilter = 0x00000008, + GmacDestAddrFilterInv = 0x00000008, /* (DAIF)Inverse filtering for DA 3 RW */ + GmacDestAddrFilterNor = 0x00000000, /* Normal filtering for DA 0 */ + + GmacMcastHashFilter = 0x00000004, + GmacMcastHashFilterOn = 0x00000004, /* (HMC)perfom multicast hash filtering 2 RW */ + GmacMcastHashFilterOff = 0x00000000, /* perfect filtering only 0 */ + + GmacUcastHashFilter = 0x00000002, + GmacUcastHashFilterOn = 0x00000002, /* (HUC)Unicast Hash filtering only 1 RW */ + GmacUcastHashFilterOff = 0x00000000, /* perfect filtering only 0 */ + + GmacPromiscuousMode = 0x00000001, + GmacPromiscuousModeOn = 0x00000001, /* Receive all frames 0 RW */ + GmacPromiscuousModeOff = 0x00000000, /* Receive filtered packets only 0 */ +}; + + +/*GmacGmiiAddr = 0x0010, GMII address Register(ext. Phy) Layout */ +enum GmacGmiiAddrReg +{ + GmiiDevMask = 0x0000F800, /* (PA)GMII device address 15:11 RW 0x00 */ + GmiiDevShift = 11, + + GmiiRegMask = 0x000007C0, /* (GR)GMII register in selected Phy 10:6 RW 0x00 */ + GmiiRegShift = 6, + + GmiiCsrClkMask = 0x0000001C, /*CSR Clock bit Mask 4:2 */ + GmiiCsrClk5 = 0x00000014, /* (CR)CSR Clock Range 250-300 MHz 4:2 RW 000 */ + GmiiCsrClk4 = 0x00000010, /* 150-250 MHz */ + GmiiCsrClk3 = 0x0000000C, /* 35-60 MHz */ + GmiiCsrClk2 = 0x00000008, /* 20-35 MHz */ + GmiiCsrClk1 = 0x00000004, /* 100-150 MHz */ + GmiiCsrClk0 = 0x00000000, /* 60-100 MHz */ + + GmiiWrite = 0x00000002, /* (GW)Write to register 1 RW */ + GmiiRead = 0x00000000, /* Read from register 0 */ + + GmiiBusy = 0x00000001, /* (GB)GMII interface is busy 0 RW 0 */ +}; + +enum GmacVlanTagReg +{ + GmacEnableSVlan = 0x00040000, /* (ESVL) Enabe S-Vlan */ + GmacVlanInvMatch = 0x00020000, /* (VTIM) VLAN tag inverse match enable */ + GmacEnable12BitComp = 0x00010000, /* (ETV) Enable 12-bit VLAN tag comparision */ + GmacVlanTagMsk = 0x0000FFFF /* (VL) VLAN tag */ + +}; + + +enum GmacLPICtrlStsReg +{ + GmacLPITxAuto = 0x00080000, + GmacLPIPhyStsEn = 0x00040000, + GmacLPIPhySts = 0x00020000, + GmacLPIEn = 0x00010000, + GmacRxLPISts = 0x00000200, + GmacTxLPISts = 0x00000100, + GmacRxLPIExit = 0x00000008, + GmacRxLPIEnter = 0x00000004, + GmacTxLPIExit = 0x00000002, + GmacTxLPIEnter = 0x00000001, +}; + +enum GmacLPITimerCtrlReg +{ + GmacLPILinkStableTimerMsk = 0x03FF0000, + GmacLPITxWaitTimerMsk = 0x0000FFFF, +}; + + +/* GmacGmiiData = 0x0014, GMII data Register(ext. Phy) Layout */ +enum GmacGmiiDataReg +{ + GmiiDataMask = 0x0000FFFF, /* (GD)GMII Data 15:0 RW 0x0000 */ +}; + + +/*GmacFlowControl = 0x0018, Flow control Register Layout */ +enum GmacFlowControlReg +{ + GmacPauseTimeMask = 0xFFFF0000, /* (PT) PAUSE TIME field in the control frame 31:16 RW 0x0000 */ + GmacPauseTimeShift = 16, + + GmacPauseLowThresh = 0x00000030, + GmacPauseLowThresh3 = 0x00000030, /* (PLT)thresh for pause tmr 256 slot time 5:4 RW */ + GmacPauseLowThresh2 = 0x00000020, /* 144 slot time */ + GmacPauseLowThresh1 = 0x00000010, /* 28 slot time */ + GmacPauseLowThresh0 = 0x00000000, /* 4 slot time 000 */ + + GmacUnicastPauseFrame = 0x00000008, + GmacUnicastPauseFrameOn = 0x00000008, /* (UP)Detect pause frame with unicast addr. 3 RW */ + GmacUnicastPauseFrameOff = 0x00000000, /* Detect only pause frame with multicast addr. 0 */ + + GmacRxFlowControl = 0x00000004, + GmacRxFlowControlEnable = 0x00000004, /* (RFE)Enable Rx flow control 2 RW */ + GmacRxFlowControlDisable = 0x00000000, /* Disable Rx flow control 0 */ + + GmacTxFlowControl = 0x00000002, + GmacTxFlowControlEnable = 0x00000002, /* (TFE)Enable Tx flow control 1 RW */ + GmacTxFlowControlDisable = 0x00000000, /* Disable flow control 0 */ + + GmacFlowControlBackPressure = 0x00000001, + GmacSendPauseFrame = 0x00000001, /* (FCB/PBA)send pause frm/Apply back pressure 0 RW 0 */ +}; + + +enum GmacVLANIncRepReg +{ + GmacSVLAN = 0x00080000, + GmacCVLAN = 0x00000000, + GmacVLP = 0x00040000, + GmacVLANNoACT = 0x00000000, + GmacVLANDel = 0x00010000, + GmacVLANIns = 0x00020000, + GmacVLANRep = 0x00030000, + GmacVLANMsk = 0x0000FFFF + +}; + +/* GmacInterruptStatus = 0x0038, Mac Interrupt ststus register */ +enum GmacInterruptStatusBitDefinition +{ + GmacLPIIntSts = 0x00000400, /* set if int generated due to TS (Read Time Stamp Status Register to know details)*/ + GmacTSIntSts = 0x00000200, /* set if int generated due to TS (Read Time Stamp Status Register to know details)*/ + GmacMmcRxChksumOffload = 0x00000080, /* set if int generated in MMC RX CHECKSUM OFFLOAD int register */ + GmacMmcTxIntSts = 0x00000040, /* set if int generated in MMC TX Int register */ + GmacMmcRxIntSts = 0x00000020, /* set if int generated in MMC RX Int register */ + GmacMmcIntSts = 0x00000010, /* set if any of the above bit [7:5] is set */ + GmacPmtIntSts = 0x00000008, /* set whenver magic pkt/wake-on-lan frame is received */ + GmacPcsAnComplete = 0x00000004, /* set when AN is complete in TBI/RTBI/SGMIII phy interface */ + GmacPcsLnkStsChange = 0x00000002, /* set if any lnk status change in TBI/RTBI/SGMII interface */ + GmacRgmiiIntSts = 0x00000001, /* set if any change in lnk status of RGMII interface */ + +}; + +/* GmacInterruptMask = 0x003C, Mac Interrupt Mask register */ +enum GmacInterruptMaskBitDefinition +{ + GmacTSIntMask = 0x00000200, /* when set disables the time stamp interrupt generation */ + GmacPmtIntMask = 0x00000008, /* when set Disables the assertion of PMT interrupt */ + GmacPcsAnIntMask = 0x00000004, /* When set disables the assertion of PCS AN complete interrupt */ + GmacPcsLnkStsIntMask = 0x00000002, /* when set disables the assertion of PCS lnk status change interrupt */ + GmacRgmiiIntMask = 0x00000001, /* when set disables the assertion of RGMII int */ +}; + +/********************************************************** + * GMAC DMA registers + * For Pci based system address is BARx + GmaDmaBase + * For any other system translation is done accordingly + **********************************************************/ + +enum DmaRegisters +{ + DmaBusMode = 0x0000, /* CSR0 - Bus Mode Register */ + DmaTxPollDemand = 0x0004, /* CSR1 - Transmit Poll Demand Register */ + DmaRxPollDemand = 0x0008, /* CSR2 - Receive Poll Demand Register */ + DmaRxBaseAddr = 0x000C, /* CSR3 - Receive Descriptor list base address */ + DmaTxBaseAddr = 0x0010, /* CSR4 - Transmit Descriptor list base address */ + DmaStatus = 0x0014, /* CSR5 - Dma status Register */ + DmaControl = 0x0018, /* CSR6 - Dma Operation Mode Register */ + DmaInterrupt = 0x001C, /* CSR7 - Interrupt enable */ + DmaMissedFr = 0x0020, /* CSR8 - Missed Frame & Buffer overflow Counter */ + DmaTxCurrDesc = 0x0048, /* - Current host Tx Desc Register */ + DmaRxCurrDesc = 0x004C, /* - Current host Rx Desc Register */ + DmaTxCurrAddr = 0x0050, /* CSR20 - Current host transmit buffer address */ + DmaRxCurrAddr = 0x0054, /* CSR21 - Current host receive buffer address */ + + +}; + +/********************************************************** + * DMA Engine registers Layout + **********************************************************/ + +/*DmaBusMode = 0x0000, CSR0 - Bus Mode */ +enum DmaBusModeReg +{ + /* Bit description Bits R/W Reset value */ + + DmaFixedBurstEnable = 0x00010000, /* (FB)Fixed Burst SINGLE, INCR4, INCR8 or INCR16 16 RW */ + DmaFixedBurstDisable = 0x00000000, /* SINGLE, INCR 0 */ + + DmaTxPriorityRatio11 = 0x00000000, /* (PR)TX:RX DMA priority ratio 1:1 15:14 RW 00 */ + DmaTxPriorityRatio21 = 0x00004000, /* (PR)TX:RX DMA priority ratio 2:1 */ + DmaTxPriorityRatio31 = 0x00008000, /* (PR)TX:RX DMA priority ratio 3:1 */ + DmaTxPriorityRatio41 = 0x0000C000, /* (PR)TX:RX DMA priority ratio 4:1 */ + + DmaBurstLengthx8 = 0x01000000, /* When set mutiplies the PBL by 8 24 RW 0 */ + + DmaBurstLength256 = 0x01002000, /*(DmaBurstLengthx8 | DmaBurstLength32) = 256 [24]:13:8 */ + DmaBurstLength128 = 0x01001000, /*(DmaBurstLengthx8 | DmaBurstLength16) = 128 [24]:13:8 */ + DmaBurstLength64 = 0x01000800, /*(DmaBurstLengthx8 | DmaBurstLength8) = 64 [24]:13:8 */ + DmaBurstLength32 = 0x00002000, /* (PBL) programmable Dma burst length = 32 13:8 RW */ + DmaBurstLength16 = 0x00001000, /* Dma burst length = 16 */ + DmaBurstLength8 = 0x00000800, /* Dma burst length = 8 */ + DmaBurstLength4 = 0x00000400, /* Dma burst length = 4 */ + DmaBurstLength2 = 0x00000200, /* Dma burst length = 2 */ + DmaBurstLength1 = 0x00000100, /* Dma burst length = 1 */ + DmaBurstLength0 = 0x00000000, /* Dma burst length = 0 0x00 */ + + DmaDescriptor8Words = 0x00000080, /* Enh Descriptor works 1=> 8 word descriptor 7 0 */ + DmaDescriptor4Words = 0x00000000, /* Enh Descriptor works 0=> 4 word descriptor 7 0 */ + + DmaDescriptorSkip16 = 0x00000040, /* (DSL)Descriptor skip length (no.of dwords) 6:2 RW */ + DmaDescriptorSkip8 = 0x00000020, /* between two unchained descriptors */ + DmaDescriptorSkip4 = 0x00000010, /* */ + DmaDescriptorSkip2 = 0x00000008, /* */ + DmaDescriptorSkip1 = 0x00000004, /* */ + DmaDescriptorSkip0 = 0x00000000, /* 0x00 */ + + DmaArbitRr = 0x00000000, /* (DA) DMA RR arbitration 1 RW 0 */ + DmaArbitPr = 0x00000002, /* Rx has priority over Tx */ + + DmaResetOn = 0x00000001, /* (SWR)Software Reset DMA engine 0 RW */ + DmaResetOff = 0x00000000, /* 0 */ +}; + + +/*DmaStatus = 0x0014, CSR5 - Dma status Register */ +enum DmaStatusReg +{ + /*Bit 28 27 and 26 indicate whether the interrupt due to PMT GMACMMC or GMAC LINE Remaining bits are DMA interrupts*/ + + + GmacLPIIntr = 0x40000000, /* GMC LPI interrupt 31 RO 0 */ + + + GmacPmtIntr = 0x10000000, /* (GPI)Gmac subsystem interrupt 28 RO 0 */ + GmacMmcIntr = 0x08000000, /* (GMI)Gmac MMC subsystem interrupt 27 RO 0 */ + GmacLineIntfIntr = 0x04000000, /* Line interface interrupt 26 RO 0 */ + + DmaErrorBit2 = 0x02000000, /* (EB)Error bits 0-data buffer, 1-desc. access 25 RO 0 */ + DmaErrorBit1 = 0x01000000, /* (EB)Error bits 0-write trnsf, 1-read transfr 24 RO 0 */ + DmaErrorBit0 = 0x00800000, /* (EB)Error bits 0-Rx DMA, 1-Tx DMA 23 RO 0 */ + + DmaTxState = 0x00700000, /* (TS)Transmit process state 22:20 RO */ + DmaTxStopped = 0x00000000, /* Stopped - Reset or Stop Tx Command issued 000 */ + DmaTxFetching = 0x00100000, /* Running - fetching the Tx descriptor */ + DmaTxWaiting = 0x00200000, /* Running - waiting for status */ + DmaTxReading = 0x00300000, /* Running - reading the data from host memory */ + DmaTxSuspended = 0x00600000, /* Suspended - Tx Descriptor unavailabe */ + DmaTxClosing = 0x00700000, /* Running - closing Rx descriptor */ + + DmaRxState = 0x000E0000, /* (RS)Receive process state 19:17 RO */ + DmaRxStopped = 0x00000000, /* Stopped - Reset or Stop Rx Command issued 000 */ + DmaRxFetching = 0x00020000, /* Running - fetching the Rx descriptor */ + DmaRxWaiting = 0x00060000, /* Running - waiting for packet */ + DmaRxSuspended = 0x00080000, /* Suspended - Rx Descriptor unavailable */ + DmaRxClosing = 0x000A0000, /* Running - closing descriptor */ + DmaRxQueuing = 0x000E0000, /* Running - queuing the recieve frame into host memory */ + + DmaIntNormal = 0x00010000, /* (NIS)Normal interrupt summary 16 RW 0 */ + DmaIntAbnormal = 0x00008000, /* (AIS)Abnormal interrupt summary 15 RW 0 */ + + DmaIntEarlyRx = 0x00004000, /* Early receive interrupt (Normal) RW 0 */ + DmaIntBusError = 0x00002000, /* Fatal bus error (Abnormal) RW 0 */ + DmaIntEarlyTx = 0x00000400, /* Early transmit interrupt (Abnormal) RW 0 */ + DmaIntRxWdogTO = 0x00000200, /* Receive Watchdog Timeout (Abnormal) RW 0 */ + DmaIntRxStopped = 0x00000100, /* Receive process stopped (Abnormal) RW 0 */ + DmaIntRxNoBuffer = 0x00000080, /* Receive buffer unavailable (Abnormal) RW 0 */ + DmaIntRxCompleted = 0x00000040, /* Completion of frame reception (Normal) RW 0 */ + DmaIntTxUnderflow = 0x00000020, /* Transmit underflow (Abnormal) RW 0 */ + DmaIntRcvOverflow = 0x00000010, /* Receive Buffer overflow interrupt RW 0 */ + DmaIntTxJabberTO = 0x00000008, /* Transmit Jabber Timeout (Abnormal) RW 0 */ + DmaIntTxNoBuffer = 0x00000004, /* Transmit buffer unavailable (Normal) RW 0 */ + DmaIntTxStopped = 0x00000002, /* Transmit process stopped (Abnormal) RW 0 */ + DmaIntTxCompleted = 0x00000001, /* Transmit completed (Normal) RW 0 */ +}; + +/*DmaControl = 0x0018, CSR6 - Dma Operation Mode Register */ +enum DmaControlReg +{ + DmaDisableDropTcpCs = 0x04000000, /* (DT) Dis. drop. of tcp/ip CS error frames 26 RW 0 */ + + DmaStoreAndForward = 0x00200000, /* (SF)Store and forward 21 RW 0 */ + DmaFlushTxFifo = 0x00100000, /* (FTF)Tx FIFO controller is reset to default 20 RW 0 */ + + DmaTxThreshCtrl = 0x0001C000, /* (TTC)Controls thre Threh of MTL tx Fifo 16:14 RW */ + DmaTxThreshCtrl16 = 0x0001C000, /* (TTC)Controls thre Threh of MTL tx Fifo 16 16:14 RW */ + DmaTxThreshCtrl24 = 0x00018000, /* (TTC)Controls thre Threh of MTL tx Fifo 24 16:14 RW */ + DmaTxThreshCtrl32 = 0x00014000, /* (TTC)Controls thre Threh of MTL tx Fifo 32 16:14 RW */ + DmaTxThreshCtrl40 = 0x00010000, /* (TTC)Controls thre Threh of MTL tx Fifo 40 16:14 RW */ + DmaTxThreshCtrl256 = 0x0000c000, /* (TTC)Controls thre Threh of MTL tx Fifo 256 16:14 RW */ + DmaTxThreshCtrl192 = 0x00008000, /* (TTC)Controls thre Threh of MTL tx Fifo 192 16:14 RW */ + DmaTxThreshCtrl128 = 0x00004000, /* (TTC)Controls thre Threh of MTL tx Fifo 128 16:14 RW */ + DmaTxThreshCtrl64 = 0x00000000, /* (TTC)Controls thre Threh of MTL tx Fifo 64 16:14 RW 000 */ + + DmaTxStart = 0x00002000, /* (ST)Start/Stop transmission 13 RW 0 */ + + DmaRxFlowCtrlDeact = 0x00401800, /* (RFD)Rx flow control deact. threhold [22]:12:11 RW */ + DmaRxFlowCtrlDeact1K = 0x00000000, /* (RFD)Rx flow control deact. threhold (1kbytes) [22]:12:11 RW 00 */ + DmaRxFlowCtrlDeact2K = 0x00000800, /* (RFD)Rx flow control deact. threhold (2kbytes) [22]:12:11 RW */ + DmaRxFlowCtrlDeact3K = 0x00001000, /* (RFD)Rx flow control deact. threhold (3kbytes) [22]:12:11 RW */ + DmaRxFlowCtrlDeact4K = 0x00001800, /* (RFD)Rx flow control deact. threhold (4kbytes) [22]:12:11 RW */ + DmaRxFlowCtrlDeact5K = 0x00400000, /* (RFD)Rx flow control deact. threhold (4kbytes) [22]:12:11 RW */ + DmaRxFlowCtrlDeact6K = 0x00400800, /* (RFD)Rx flow control deact. threhold (4kbytes) [22]:12:11 RW */ + DmaRxFlowCtrlDeact7K = 0x00401000, /* (RFD)Rx flow control deact. threhold (4kbytes) [22]:12:11 RW */ + + DmaRxFlowCtrlAct = 0x00800600, /* (RFA)Rx flow control Act. threhold [23]:10:09 RW */ + DmaRxFlowCtrlAct1K = 0x00000000, /* (RFA)Rx flow control Act. threhold (1kbytes) [23]:10:09 RW 00 */ + DmaRxFlowCtrlAct2K = 0x00000200, /* (RFA)Rx flow control Act. threhold (2kbytes) [23]:10:09 RW */ + DmaRxFlowCtrlAct3K = 0x00000400, /* (RFA)Rx flow control Act. threhold (3kbytes) [23]:10:09 RW */ + DmaRxFlowCtrlAct4K = 0x00000300, /* (RFA)Rx flow control Act. threhold (4kbytes) [23]:10:09 RW */ + DmaRxFlowCtrlAct5K = 0x00800000, /* (RFA)Rx flow control Act. threhold (5kbytes) [23]:10:09 RW */ + DmaRxFlowCtrlAct6K = 0x00800200, /* (RFA)Rx flow control Act. threhold (6kbytes) [23]:10:09 RW */ + DmaRxFlowCtrlAct7K = 0x00800400, /* (RFA)Rx flow control Act. threhold (7kbytes) [23]:10:09 RW */ + + DmaRxThreshCtrl = 0x00000018, /* (RTC)Controls thre Threh of MTL rx Fifo 4:3 RW */ + DmaRxThreshCtrl64 = 0x00000000, /* (RTC)Controls thre Threh of MTL tx Fifo 64 4:3 RW */ + DmaRxThreshCtrl32 = 0x00000008, /* (RTC)Controls thre Threh of MTL tx Fifo 32 4:3 RW */ + DmaRxThreshCtrl96 = 0x00000010, /* (RTC)Controls thre Threh of MTL tx Fifo 96 4:3 RW */ + DmaRxThreshCtrl128 = 0x00000018, /* (RTC)Controls thre Threh of MTL tx Fifo 128 4:3 RW */ + + DmaEnHwFlowCtrl = 0x00000100, /* (EFC)Enable HW flow control 8 RW */ + DmaDisHwFlowCtrl = 0x00000000, /* Disable HW flow control 0 */ + + DmaFwdErrorFrames = 0x00000080, /* (FEF)Forward error frames 7 RW 0 */ + DmaFwdUnderSzFrames = 0x00000040, /* (FUF)Forward undersize frames 6 RW 0 */ + DmaTxSecondFrame = 0x00000004, /* (OSF)Operate on second frame 4 RW 0 */ + DmaRxStart = 0x00000002, /* (SR)Start/Stop reception 1 RW 0 */ +}; + + +/*DmaInterrupt = 0x001C, CSR7 - Interrupt enable Register Layout */ +enum DmaInterruptReg +{ + DmaIeNormal = DmaIntNormal, /* Normal interrupt enable RW 0 */ + DmaIeAbnormal = DmaIntAbnormal, /* Abnormal interrupt enable RW 0 */ + + DmaIeEarlyRx = DmaIntEarlyRx, /* Early receive interrupt enable RW 0 */ + DmaIeBusError = DmaIntBusError, /* Fatal bus error enable RW 0 */ + DmaIeEarlyTx = DmaIntEarlyTx, /* Early transmit interrupt enable RW 0 */ + DmaIeRxWdogTO = DmaIntRxWdogTO, /* Receive Watchdog Timeout enable RW 0 */ + DmaIeRxStopped = DmaIntRxStopped, /* Receive process stopped enable RW 0 */ + DmaIeRxNoBuffer = DmaIntRxNoBuffer, /* Receive buffer unavailable enable RW 0 */ + DmaIeRxCompleted = DmaIntRxCompleted, /* Completion of frame reception enable RW 0 */ + DmaIeTxUnderflow = DmaIntTxUnderflow, /* Transmit underflow enable RW 0 */ + + DmaIeRxOverflow = DmaIntRcvOverflow, /* Receive Buffer overflow interrupt RW 0 */ + DmaIeTxJabberTO = DmaIntTxJabberTO, /* Transmit Jabber Timeout enable RW 0 */ + DmaIeTxNoBuffer = DmaIntTxNoBuffer, /* Transmit buffer unavailable enable RW 0 */ + DmaIeTxStopped = DmaIntTxStopped, /* Transmit process stopped enable RW 0 */ + DmaIeTxCompleted = DmaIntTxCompleted, /* Transmit completed enable RW 0 */ +}; + + +/********************************************************** + * DMA Engine descriptors + **********************************************************/ + +/* +**********Enhanced Descritpor structure to support 8K buffer per buffer **************************** + +DmaRxBaseAddr = 0x000C, CSR3 - Receive Descriptor list base address +DmaRxBaseAddr is the pointer to the first Rx Descriptors. the Descriptor format in Little endian with a +32 bit Data bus is as shown below + +Similarly +DmaTxBaseAddr = 0x0010, CSR4 - Transmit Descriptor list base address +DmaTxBaseAddr is the pointer to the first Rx Descriptors. the Descriptor format in Little endian with a +32 bit Data bus is as shown below + -------------------------------------------------------------------------- + RDES0 |OWN (31)| Status | + -------------------------------------------------------------------------- + RDES1 | Ctrl | Res | Byte Count Buffer 2 | Ctrl | Res | Byte Count Buffer 1 | + -------------------------------------------------------------------------- + RDES2 | Buffer 1 Address | + -------------------------------------------------------------------------- + RDES3 | Buffer 2 Address / Next Descriptor Address | + -------------------------------------------------------------------------- + + -------------------------------------------------------------------------- + TDES0 |OWN (31)| Ctrl | Res | Ctrl | Res | Status | + -------------------------------------------------------------------------- + TDES1 | Res | Byte Count Buffer 2 | Res | Byte Count Buffer 1 | + -------------------------------------------------------------------------- + TDES2 | Buffer 1 Address | + -------------------------------------------------------------------------- + TDES3 | Buffer 2 Address / Next Descriptor Address | + -------------------------------------------------------------------------- + +*/ + +enum DmaDescriptorStatus /* status word of DMA descriptor */ +{ + + DescOwnByDma = 0x80000000, /* (OWN)Descriptor is owned by DMA engine 31 RW */ + + DescDAFilterFail = 0x40000000, /* (AFM)Rx - DA Filter Fail for the rx frame 30 */ + + DescFrameLengthMask = 0x3FFF0000, /* (FL)Receive descriptor frame length 29:16 */ + DescFrameLengthShift = 16, + + DescError = 0x00008000, /* (ES)Error summary bit - OR of the follo. bits: 15 */ + /* DE || OE || IPC || LC || RWT || RE || CE */ + DescRxTruncated = 0x00004000, /* (DE)Rx - no more descriptors for receive frame 14 */ + DescSAFilterFail = 0x00002000, /* (SAF)Rx - SA Filter Fail for the received frame 13 */ + DescRxLengthError = 0x00001000, /* (LE)Rx - frm size not matching with len field 12 */ + DescRxDamaged = 0x00000800, /* (OE)Rx - frm was damaged due to buffer overflow 11 */ + DescRxVLANTag = 0x00000400, /* (VLAN)Rx - received frame is a VLAN frame 10 */ + DescRxFirst = 0x00000200, /* (FS)Rx - first descriptor of the frame 9 */ + DescRxLast = 0x00000100, /* (LS)Rx - last descriptor of the frame 8 */ + DescRxLongFrame = 0x00000080, /* (Giant Frame)Rx - frame is longer than 1518/1522 7 */ + DescRxTSAvailable = 0x00000080, /* Share bit with (Giant Frame)Rx 7 */ + DescRxCollision = 0x00000040, /* (LC)Rx - late collision occurred during reception 6 */ + DescRxFrameEther = 0x00000020, /* (FT)Rx - Frame type - Ethernet, otherwise 802.3 5 */ + DescRxWatchdog = 0x00000010, /* (RWT)Rx - watchdog timer expired during reception 4 */ + DescRxMiiError = 0x00000008, /* (RE)Rx - error reported by MII interface 3 */ + DescRxDribbling = 0x00000004, /* (DE)Rx - frame contains non int multiple of 8 bits 2 */ + DescRxCrc = 0x00000002, /* (CE)Rx - CRC error 1 */ +// DescRxMacMatch = 0x00000001, /* (RX MAC Address) Rx mac address reg(1 to 15)match 0 */ + + DescRxEXTsts = 0x00000001, /* Extended Status Available (RDES4) 0 */ + + DescTxIntEnable = 0x40000000, /* (IC)Tx - interrupt on completion 30 */ + DescTxLast = 0x20000000, /* (LS)Tx - Last segment of the frame 29 */ + DescTxFirst = 0x10000000, /* (FS)Tx - First segment of the frame 28 */ + DescTxDisableCrc = 0x08000000, /* (DC)Tx - Add CRC disabled (first segment only) 27 */ + DescTxDisablePadd = 0x04000000, /* (DP)disable padding, added by - reyaz 26 */ + DescTxTSEnable = 0x02000000, /* (TTSE) Transmit Timestamp Enable 25 */ + DescTxCrcReplacement = 0x01000000, /* (CRCR) CRC Replacement Control 24 */ + DescTxCisMask = 0x00c00000, /* Tx checksum offloading control mask 23:22 */ + DescTxCisBypass = 0x00000000, /* Checksum bypass */ + DescTxCisIpv4HdrCs = 0x00400000, /* IPv4 header checksum */ + DescTxCisTcpOnlyCs = 0x00800000, /* TCP/UDP/ICMP checksum. Pseudo header checksum is assumed to be present */ + DescTxCisTcpPseudoCs = 0x00c00000, /* TCP/UDP/ICMP checksum fully in hardware including pseudo header */ + + TxDescEndOfRing = 0x00200000, /* (TER)End of descriptors ring 21 */ + TxDescChain = 0x00100000, /* (TCH)Second buffer address is chain address 20 */ + + DescRxChkBit0 = 0x00000001, /*() Rx - Rx Payload Checksum Error 0 */ + DescRxChkBit7 = 0x00000080, /* (IPC CS ERROR)Rx - Ipv4 header checksum error 7 */ + DescRxChkBit5 = 0x00000020, /* (FT)Rx - Frame type - Ethernet, otherwise 802.3 5 */ + + DescRxTSavail = 0x00000080, /* Time stamp available 7 */ + DescRxFrameType = 0x00000020, /* (FT)Rx - Frame type - Ethernet, otherwise 802.3 5 */ + DescTxTSStatus = 0x00020000, /* (TTSS) Transmit Timestamp Status 17 */ + DescTxIpv4ChkError = 0x00010000, /* (IHE) Tx Ip header error 16 */ + DescTxTimeout = 0x00004000, /* (JT)Tx - Transmit jabber timeout 14 */ + DescTxFrameFlushed = 0x00002000, /* (FF)Tx - DMA/MTL flushed the frame due to SW flush 13 */ + DescTxPayChkError = 0x00001000, /* (PCE) Tx Payload checksum Error 12 */ + DescTxLostCarrier = 0x00000800, /* (LC)Tx - carrier lost during tramsmission 11 */ + DescTxNoCarrier = 0x00000400, /* (NC)Tx - no carrier signal from the tranceiver 10 */ + DescTxLateCollision = 0x00000200, /* (LC)Tx - transmission aborted due to collision 9 */ + DescTxExcCollisions = 0x00000100, /* (EC)Tx - transmission aborted after 16 collisions 8 */ + DescTxVLANFrame = 0x00000080, /* (VF)Tx - VLAN-type frame 7 */ + + DescTxCollMask = 0x00000078, /* (CC)Tx - Collision count 6:3 */ + DescTxCollShift = 3, + + DescTxExcDeferral = 0x00000004, /* (ED)Tx - excessive deferral 2 */ + DescTxUnderflow = 0x00000002, /* (UF)Tx - late data arrival from the memory 1 */ + DescTxDeferred = 0x00000001, /* (DB)Tx - frame transmision deferred 0 */ + + /* + This explains the RDES1/TDES1 bits layout + -------------------------------------------------------------------- + RDES1/TDES1 | Control Bits | Byte Count Buffer 2 | Byte Count Buffer 1 | + -------------------------------------------------------------------- + + */ +// DmaDescriptorLength length word of DMA descriptor + + + RxDisIntCompl = 0x80000000, /* (Disable Rx int on completion) 31 */ + RxDescEndOfRing = 0x00008000, /* (TER)End of descriptors ring 15 */ + RxDescChain = 0x00004000, /* (TCH)Second buffer address is chain address 14 */ + + + DescSize2Mask = 0x1FFF0000, /* (TBS2) Buffer 2 size 28:16 */ + DescSize2Shift = 16, + DescSize1Mask = 0x00001FFF, /* (TBS1) Buffer 1 size 12:0 */ + DescSize1Shift = 0, + + + /* + This explains the RDES4 Extended Status bits layout + -------------------------------------------------------------------- + RDES4 | Extended Status | + -------------------------------------------------------------------- + */ + + DescRxPtpAvail = 0x00004000, /* PTP snapshot available 14 */ + DescRxPtpVer = 0x00002000, /* When set indicates IEEE1584 Version 2 (else Ver1) 13 */ + DescRxPtpFrameType = 0x00001000, /* PTP frame type Indicates PTP sent over ethernet 12 */ + DescRxPtpMessageType = 0x00000F00, /* Message Type 11:8 */ + DescRxPtpNo = 0x00000000, /* 0000 => No PTP message received */ + DescRxPtpSync = 0x00000100, /* 0001 => Sync (all clock types) received */ + DescRxPtpFollowUp = 0x00000200, /* 0010 => Follow_Up (all clock types) received */ + DescRxPtpDelayReq = 0x00000300, /* 0011 => Delay_Req (all clock types) received */ + DescRxPtpDelayResp = 0x00000400, /* 0100 => Delay_Resp (all clock types) received */ + DescRxPtpPdelayReq = 0x00000500, /* 0101 => Pdelay_Req (in P to P tras clk) or Announce in Ord and Bound clk */ + DescRxPtpPdelayResp = 0x00000600, /* 0110 => Pdealy_Resp(in P to P trans clk) or Management in Ord and Bound clk */ + DescRxPtpPdelayRespFP = 0x00000700, /* 0111 => Pdealy_Resp_Follow_Up (in P to P trans clk) or Signaling in Ord and Bound clk */ + DescRxPtpIPV6 = 0x00000080, /* Received Packet is in IPV6 Packet 7 */ + DescRxPtpIPV4 = 0x00000040, /* Received Packet is in IPV4 Packet 6 */ + + DescRxChkSumBypass = 0x00000020, /* When set indicates checksum offload engine 5 + is bypassed */ + DescRxIpPayloadError = 0x00000010, /* When set indicates 16bit IP payload CS is in error 4 */ + DescRxIpHeaderError = 0x00000008, /* When set indicates 16bit IPV4 header CS is in 3 + error or IP datagram version is not consistent + with Ethernet type value */ + DescRxIpPayloadType = 0x00000007, /* Indicate the type of payload encapsulated 2:0 + in IPdatagram processed by COE (Rx) */ + DescRxIpPayloadUnknown = 0x00000000, /* Unknown or didnot process IP payload */ + DescRxIpPayloadUDP = 0x00000001, /* UDP */ + DescRxIpPayloadTCP = 0x00000002, /* TCP */ + DescRxIpPayloadICMP = 0x00000003, /* ICMP */ + +}; + + +// Rx Descriptor COE type2 encoding +enum RxDescCOEEncode +{ + RxLenLT600 = 0, /* Bit(5:7:0)=>0 IEEE 802.3 type frame Length field is Lessthan 0x0600 */ + RxIpHdrPayLoadChkBypass = 1, /* Bit(5:7:0)=>1 Payload & Ip header checksum bypassed (unsuppported payload) */ + RxIpHdrPayLoadRes = 2, /* Bit(5:7:0)=>2 Reserved */ + RxChkBypass = 3, /* Bit(5:7:0)=>3 Neither IPv4 nor IPV6. So checksum bypassed */ + RxNoChkError = 4, /* Bit(5:7:0)=>4 No IPv4/IPv6 Checksum error detected */ + RxPayLoadChkError = 5, /* Bit(5:7:0)=>5 Payload checksum error detected for Ipv4/Ipv6 frames */ + RxIpHdrChkError = 6, /* Bit(5:7:0)=>6 Ip header checksum error detected for Ipv4 frames */ + RxIpHdrPayLoadChkError = 7, /* Bit(5:7:0)=>7 Payload & Ip header checksum error detected for Ipv4/Ipv6 frames */ +}; + +/********************************************************** + * DMA engine interrupt handling functions + **********************************************************/ + +enum synopGMACDmaIntEnum /* Intrerrupt types */ +{ + synopGMACDmaRxNormal = 0x01, /* normal receiver interrupt */ + synopGMACDmaRxAbnormal = 0x02, /* abnormal receiver interrupt */ + synopGMACDmaRxStopped = 0x04, /* receiver stopped */ + synopGMACDmaTxNormal = 0x08, /* normal transmitter interrupt */ + synopGMACDmaTxAbnormal = 0x10, /* abnormal transmitter interrupt */ + synopGMACDmaTxStopped = 0x20, /* transmitter stopped */ + synopGMACDmaError = 0x80, /* Dma engine error */ + +}; + + +/********************************************************** + * Initial register values + **********************************************************/ +enum InitialRegisters +{ + /* Full-duplex mode with perfect filter on */ + GmacConfigInitFdx1000 = GmacWatchdogEnable | GmacJabberEnable | GmacFrameBurstEnable | GmacJumboFrameDisable + | GmacSelectGmii | GmacEnableRxOwn | GmacLoopbackOff + | GmacFullDuplex | GmacRetryEnable | GmacPadCrcStripDisable + | GmacBackoffLimit0 | GmacDeferralCheckDisable | GmacTxEnable | GmacRxEnable, + + /* Full-duplex mode with perfect filter on */ + GmacConfigInitFdx110 = GmacWatchdogEnable | GmacJabberEnable | GmacFrameBurstEnable | GmacJumboFrameDisable + | GmacSelectMii | GmacEnableRxOwn | GmacLoopbackOff + | GmacFullDuplex | GmacRetryEnable | GmacPadCrcStripDisable + | GmacBackoffLimit0 | GmacDeferralCheckDisable | GmacTxEnable | GmacRxEnable, + + /* Full-duplex mode */ + // CHANGED: Pass control config, dest addr filter normal, added source address filter, multicast & unicast + // Hash filter. + /* = GmacFilterOff | GmacPassControlOff | GmacBroadcastEnable */ + GmacFrameFilterInitFdx = GmacFilterOn | GmacPassControl0 | GmacBroadcastEnable | GmacSrcAddrFilterDisable + | GmacMulticastFilterOn | GmacDestAddrFilterNor | GmacMcastHashFilterOff + | GmacPromiscuousModeOff | GmacUcastHashFilterOff, + + /* Full-duplex mode */ + GmacFlowControlInitFdx = GmacUnicastPauseFrameOff | GmacRxFlowControlEnable | GmacTxFlowControlEnable, + + /* Full-duplex mode */ + GmacGmiiAddrInitFdx = GmiiCsrClk2, + + + /* Half-duplex mode with perfect filter on */ + // CHANGED: Removed Endian configuration, added single bit config for PAD/CRC strip, + /*| GmacSelectMii | GmacLittleEndian | GmacDisableRxOwn | GmacLoopbackOff*/ + GmacConfigInitHdx1000 = GmacWatchdogEnable | GmacJabberEnable | GmacFrameBurstEnable | GmacJumboFrameDisable + | GmacSelectGmii | GmacDisableRxOwn | GmacLoopbackOff + | GmacHalfDuplex | GmacRetryEnable | GmacPadCrcStripDisable + | GmacBackoffLimit0 | GmacDeferralCheckDisable | GmacTxEnable | GmacRxEnable, + + /* Half-duplex mode with perfect filter on */ + GmacConfigInitHdx110 = GmacWatchdogEnable | GmacJabberEnable | GmacFrameBurstEnable | GmacJumboFrameDisable + | GmacSelectMii | GmacDisableRxOwn | GmacLoopbackOff + | GmacHalfDuplex | GmacRetryEnable | GmacPadCrcStripDisable + | GmacBackoffLimit0 | GmacDeferralCheckDisable | GmacTxEnable | GmacRxEnable, + + /* Half-duplex mode */ + GmacFrameFilterInitHdx = GmacFilterOn | GmacPassControl0 | GmacBroadcastEnable | GmacSrcAddrFilterDisable + | GmacMulticastFilterOn | GmacDestAddrFilterNor | GmacMcastHashFilterOff + | GmacUcastHashFilterOff | GmacPromiscuousModeOff, + + /* Half-duplex mode */ + GmacFlowControlInitHdx = GmacUnicastPauseFrameOff | GmacRxFlowControlDisable | GmacTxFlowControlDisable, + + /* Half-duplex mode */ + GmacGmiiAddrInitHdx = GmiiCsrClk2, + + + + /********************************************** + *DMA configurations + **********************************************/ + + DmaBusModeInit = DmaFixedBurstEnable | DmaBurstLength8 | DmaDescriptorSkip2 | DmaResetOff, +// DmaBusModeInit = DmaFixedBurstEnable | DmaBurstLength8 | DmaDescriptorSkip4 | DmaResetOff, + + /* 1000 Mb/s mode */ + DmaControlInit1000 = DmaStoreAndForward,// | DmaTxSecondFrame , + + /* 100 Mb/s mode */ + DmaControlInit100 = DmaStoreAndForward, + + /* 10 Mb/s mode */ + DmaControlInit10 = DmaStoreAndForward, + + /* Interrupt groups */ + DmaIntErrorMask = DmaIntBusError, /* Error */ + DmaIntRxAbnMask = DmaIntRxNoBuffer, /* receiver abnormal interrupt */ + DmaIntRxNormMask = DmaIntRxCompleted, /* receiver normal interrupt */ + DmaIntRxStoppedMask = DmaIntRxStopped, /* receiver stopped */ + DmaIntTxAbnMask = DmaIntTxUnderflow, /* transmitter abnormal interrupt */ + DmaIntTxNormMask = DmaIntTxCompleted, /* transmitter normal interrupt */ + DmaIntTxStoppedMask = DmaIntTxStopped, /* transmitter stopped */ + + DmaIntEnable = DmaIeNormal | DmaIeAbnormal | DmaIntErrorMask + | DmaIntRxAbnMask | DmaIntRxNormMask | DmaIntRxStoppedMask + | DmaIntTxAbnMask | DmaIntTxNormMask | DmaIntTxStoppedMask, + DmaIntDisable = 0, +}; + + +/********************************************************** + * Mac Management Counters (MMC) + **********************************************************/ + +enum MMC_ENABLE +{ + GmacMmcCntrl = 0x0100, /* mmc control for operating mode of MMC */ + GmacMmcIntrRx = 0x0104, /* maintains interrupts generated by rx counters */ + GmacMmcIntrTx = 0x0108, /* maintains interrupts generated by tx counters */ + GmacMmcIntrMaskRx = 0x010C, /* mask for interrupts generated from rx counters */ + GmacMmcIntrMaskTx = 0x0110, /* mask for interrupts generated from tx counters */ +}; +enum MMC_TX +{ + GmacMmcTxOctetCountGb = 0x0114, /*Bytes Tx excl. of preamble and retried bytes (Good or Bad) */ + GmacMmcTxFrameCountGb = 0x0118, /*Frames Tx excl. of retried frames (Good or Bad) */ + GmacMmcTxBcFramesG = 0x011C, /*Broadcast Frames Tx (Good) */ + GmacMmcTxMcFramesG = 0x0120, /*Multicast Frames Tx (Good) */ + + GmacMmcTx64OctetsGb = 0x0124, /*Tx with len 64 bytes excl. of pre and retried (Good or Bad) */ + GmacMmcTx65To127OctetsGb = 0x0128, /*Tx with len >64 bytes <=127 excl. of pre and retried (Good or Bad) */ + GmacMmcTx128To255OctetsGb = 0x012C, /*Tx with len >128 bytes <=255 excl. of pre and retried (Good or Bad) */ + GmacMmcTx256To511OctetsGb = 0x0130, /*Tx with len >256 bytes <=511 excl. of pre and retried (Good or Bad) */ + GmacMmcTx512To1023OctetsGb = 0x0134, /*Tx with len >512 bytes <=1023 excl. of pre and retried (Good or Bad) */ + GmacMmcTx1024ToMaxOctetsGb = 0x0138, /*Tx with len >1024 bytes <=MaxSize excl. of pre and retried (Good or Bad) */ + + GmacMmcTxUcFramesGb = 0x013C, /*Unicast Frames Tx (Good or Bad) */ + GmacMmcTxMcFramesGb = 0x0140, /*Multicast Frames Tx (Good and Bad) */ + GmacMmcTxBcFramesGb = 0x0144, /*Broadcast Frames Tx (Good and Bad) */ + GmacMmcTxUnderFlowError = 0x0148, /*Frames aborted due to Underflow error */ + GmacMmcTxSingleColG = 0x014C, /*Successfully Tx Frames after singel collision in Half duplex mode */ + GmacMmcTxMultiColG = 0x0150, /*Successfully Tx Frames after more than singel collision in Half duplex mode */ + GmacMmcTxDeferred = 0x0154, /*Successfully Tx Frames after a deferral in Half duplex mode */ + GmacMmcTxLateCol = 0x0158, /*Frames aborted due to late collision error */ + GmacMmcTxExessCol = 0x015C, /*Frames aborted due to excessive (16) collision errors */ + GmacMmcTxCarrierError = 0x0160, /*Frames aborted due to carrier sense error (No carrier or Loss of carrier) */ + GmacMmcTxOctetCountG = 0x0164, /*Bytes Tx excl. of preamble and retried bytes (Good) */ + GmacMmcTxFrameCountG = 0x0168, /*Frames Tx (Good) */ + GmacMmcTxExessDef = 0x016C, /*Frames aborted due to excessive deferral errors (deferred for more than 2 max-sized frame times)*/ + + GmacMmcTxPauseFrames = 0x0170, /*Number of good pause frames Tx. */ + GmacMmcTxVlanFramesG = 0x0174, /*Number of good Vlan frames Tx excl. retried frames */ +}; +enum MMC_RX +{ + GmacMmcRxFrameCountGb = 0x0180, /*Frames Rx (Good or Bad) */ + GmacMmcRxOctetCountGb = 0x0184, /*Bytes Rx excl. of preamble and retried bytes (Good or Bad) */ + GmacMmcRxOctetCountG = 0x0188, /*Bytes Rx excl. of preamble and retried bytes (Good) */ + GmacMmcRxBcFramesG = 0x018C, /*Broadcast Frames Rx (Good) */ + GmacMmcRxMcFramesG = 0x0190, /*Multicast Frames Rx (Good) */ + + GmacMmcRxCrcError = 0x0194, /*Number of frames received with CRC error */ + GmacMmcRxAlignError = 0x0198, /*Number of frames received with alignment (dribble) error. Only in 10/100mode */ + GmacMmcRxRuntError = 0x019C, /*Number of frames received with runt (<64 bytes and CRC error) error */ + GmacMmcRxJabberError = 0x01A0, /*Number of frames rx with jabber (>1518/1522 or >9018/9022 and CRC) */ + GmacMmcRxUnderSizeG = 0x01A4, /*Number of frames received with <64 bytes without any error */ + GmacMmcRxOverSizeG = 0x01A8, /*Number of frames received with >1518/1522 bytes without any error */ + + GmacMmcRx64OctetsGb = 0x01AC, /*Rx with len 64 bytes excl. of pre and retried (Good or Bad) */ + GmacMmcRx65To127OctetsGb = 0x01B0, /*Rx with len >64 bytes <=127 excl. of pre and retried (Good or Bad) */ + GmacMmcRx128To255OctetsGb = 0x01B4, /*Rx with len >128 bytes <=255 excl. of pre and retried (Good or Bad) */ + GmacMmcRx256To511OctetsGb = 0x01B8, /*Rx with len >256 bytes <=511 excl. of pre and retried (Good or Bad) */ + GmacMmcRx512To1023OctetsGb = 0x01BC, /*Rx with len >512 bytes <=1023 excl. of pre and retried (Good or Bad) */ + GmacMmcRx1024ToMaxOctetsGb = 0x01C0, /*Rx with len >1024 bytes <=MaxSize excl. of pre and retried (Good or Bad) */ + + GmacMmcRxUcFramesG = 0x01C4, /*Unicast Frames Rx (Good) */ + GmacMmcRxLengthError = 0x01C8, /*Number of frames received with Length type field != frame size */ + GmacMmcRxOutOfRangeType = 0x01CC, /*Number of frames received with length field != valid frame size */ + + GmacMmcRxPauseFrames = 0x01D0, /*Number of good pause frames Rx. */ + GmacMmcRxFifoOverFlow = 0x01D4, /*Number of missed rx frames due to FIFO overflow */ + GmacMmcRxVlanFramesGb = 0x01D8, /*Number of good Vlan frames Rx */ + + GmacMmcRxWatchdobError = 0x01DC, /*Number of frames rx with error due to watchdog timeout error */ +}; +enum MMC_IP_RELATED +{ + GmacMmcRxIpcIntrMask = 0x0200, /*Maintains the mask for interrupt generated from rx IPC statistic counters */ + GmacMmcRxIpcIntr = 0x0208, /*Maintains the interrupt that rx IPC statistic counters generate */ + + GmacMmcRxIpV4FramesG = 0x0210, /*Good IPV4 datagrams received */ + GmacMmcRxIpV4HdrErrFrames = 0x0214, /*Number of IPV4 datagrams received with header errors */ + GmacMmcRxIpV4NoPayFrames = 0x0218, /*Number of IPV4 datagrams received which didnot have TCP/UDP/ICMP payload */ + GmacMmcRxIpV4FragFrames = 0x021C, /*Number of IPV4 datagrams received with fragmentation */ + GmacMmcRxIpV4UdpChkDsblFrames = 0x0220, /*Number of IPV4 datagrams received that had a UDP payload checksum disabled */ + + GmacMmcRxIpV6FramesG = 0x0224, /*Good IPV6 datagrams received */ + GmacMmcRxIpV6HdrErrFrames = 0x0228, /*Number of IPV6 datagrams received with header errors */ + GmacMmcRxIpV6NoPayFrames = 0x022C, /*Number of IPV6 datagrams received which didnot have TCP/UDP/ICMP payload */ + + GmacMmcRxUdpFramesG = 0x0230, /*Number of good IP datagrams with good UDP payload */ + GmacMmcRxUdpErrorFrames = 0x0234, /*Number of good IP datagrams with UDP payload having checksum error */ + + GmacMmcRxTcpFramesG = 0x0238, /*Number of good IP datagrams with good TDP payload */ + GmacMmcRxTcpErrorFrames = 0x023C, /*Number of good IP datagrams with TCP payload having checksum error */ + + GmacMmcRxIcmpFramesG = 0x0240, /*Number of good IP datagrams with good Icmp payload */ + GmacMmcRxIcmpErrorFrames = 0x0244, /*Number of good IP datagrams with Icmp payload having checksum error */ + + GmacMmcRxIpV4OctetsG = 0x0250, /*Good IPV4 datagrams received excl. Ethernet hdr,FCS,Pad,Ip Pad bytes */ + GmacMmcRxIpV4HdrErrorOctets = 0x0254, /*Number of bytes in IPV4 datagram with header errors */ + GmacMmcRxIpV4NoPayOctets = 0x0258, /*Number of bytes in IPV4 datagram with no TCP/UDP/ICMP payload */ + GmacMmcRxIpV4FragOctets = 0x025C, /*Number of bytes received in fragmented IPV4 datagrams */ + GmacMmcRxIpV4UdpChkDsblOctets = 0x0260, /*Number of bytes received in UDP segment that had UDP checksum disabled */ + + GmacMmcRxIpV6OctetsG = 0x0264, /*Good IPV6 datagrams received excl. Ethernet hdr,FCS,Pad,Ip Pad bytes */ + GmacMmcRxIpV6HdrErrorOctets = 0x0268, /*Number of bytes in IPV6 datagram with header errors */ + GmacMmcRxIpV6NoPayOctets = 0x026C, /*Number of bytes in IPV6 datagram with no TCP/UDP/ICMP payload */ + + GmacMmcRxUdpOctetsG = 0x0270, /*Number of bytes in IP datagrams with good UDP payload */ + GmacMmcRxUdpErrorOctets = 0x0274, /*Number of bytes in IP datagrams with UDP payload having checksum error */ + + GmacMmcRxTcpOctetsG = 0x0278, /*Number of bytes in IP datagrams with good TDP payload */ + GmacMmcRxTcpErrorOctets = 0x027C, /*Number of bytes in IP datagrams with TCP payload having checksum error */ + + GmacMmcRxIcmpOctetsG = 0x0280, /*Number of bytes in IP datagrams with good Icmp payload */ + GmacMmcRxIcmpErrorOctets = 0x0284, /*Number of bytes in IP datagrams with Icmp payload having checksum error */ +}; + + +enum MMC_CNTRL_REG_BIT_DESCRIPTIONS +{ + GmacMmcCounterFreeze = 0x00000008, /* when set MMC counters freeze to current value */ + GmacMmcCounterResetOnRead = 0x00000004, /* when set MMC counters will be reset to 0 after read */ + GmacMmcCounterStopRollover = 0x00000002, /* when set counters will not rollover after max value */ + GmacMmcCounterReset = 0x00000001, /* when set all counters wil be reset (automatically cleared after 1 clk) */ + +}; + +enum MMC_RX_INTR_MASK_AND_STATUS_BIT_DESCRIPTIONS +{ + GmacMmcRxWDInt = 0x00800000, /* set when rxwatchdog error reaches half of max value */ + GmacMmcRxVlanInt = 0x00400000, /* set when GmacMmcRxVlanFramesGb counter reaches half of max value */ + GmacMmcRxFifoOverFlowInt = 0x00200000, /* set when GmacMmcRxFifoOverFlow counter reaches half of max value */ + GmacMmcRxPauseFrameInt = 0x00100000, /* set when GmacMmcRxPauseFrames counter reaches half of max value */ + GmacMmcRxOutOfRangeInt = 0x00080000, /* set when GmacMmcRxOutOfRangeType counter reaches half of max value */ + GmacMmcRxLengthErrorInt = 0x00040000, /* set when GmacMmcRxLengthError counter reaches half of max value */ + GmacMmcRxUcFramesInt = 0x00020000, /* set when GmacMmcRxUcFramesG counter reaches half of max value */ + GmacMmcRx1024OctInt = 0x00010000, /* set when GmacMmcRx1024ToMaxOctetsGb counter reaches half of max value */ + GmacMmcRx512OctInt = 0x00008000, /* set when GmacMmcRx512To1023OctetsGb counter reaches half of max value */ + GmacMmcRx256OctInt = 0x00004000, /* set when GmacMmcRx256To511OctetsGb counter reaches half of max value */ + GmacMmcRx128OctInt = 0x00002000, /* set when GmacMmcRx128To255OctetsGb counter reaches half of max value */ + GmacMmcRx65OctInt = 0x00001000, /* set when GmacMmcRx65To127OctetsG counter reaches half of max value */ + GmacMmcRx64OctInt = 0x00000800, /* set when GmacMmcRx64OctetsGb counter reaches half of max value */ + GmacMmcRxOverSizeInt = 0x00000400, /* set when GmacMmcRxOverSizeG counter reaches half of max value */ + GmacMmcRxUnderSizeInt = 0x00000200, /* set when GmacMmcRxUnderSizeG counter reaches half of max value */ + GmacMmcRxJabberErrorInt = 0x00000100, /* set when GmacMmcRxJabberError counter reaches half of max value */ + GmacMmcRxRuntErrorInt = 0x00000080, /* set when GmacMmcRxRuntError counter reaches half of max value */ + GmacMmcRxAlignErrorInt = 0x00000040, /* set when GmacMmcRxAlignError counter reaches half of max value */ + GmacMmcRxCrcErrorInt = 0x00000020, /* set when GmacMmcRxCrcError counter reaches half of max value */ + GmacMmcRxMcFramesInt = 0x00000010, /* set when GmacMmcRxMcFramesG counter reaches half of max value */ + GmacMmcRxBcFramesInt = 0x00000008, /* set when GmacMmcRxBcFramesG counter reaches half of max value */ + GmacMmcRxOctetGInt = 0x00000004, /* set when GmacMmcRxOctetCountG counter reaches half of max value */ + GmacMmcRxOctetGbInt = 0x00000002, /* set when GmacMmcRxOctetCountGb counter reaches half of max value */ + GmacMmcRxFrameInt = 0x00000001, /* set when GmacMmcRxFrameCountGb counter reaches half of max value */ +}; + +enum MMC_TX_INTR_MASK_AND_STATUS_BIT_DESCRIPTIONS +{ + + GmacMmcTxVlanInt = 0x01000000, /* set when GmacMmcTxVlanFramesG counter reaches half of max value */ + GmacMmcTxPauseFrameInt = 0x00800000, /* set when GmacMmcTxPauseFrames counter reaches half of max value */ + GmacMmcTxExessDefInt = 0x00400000, /* set when GmacMmcTxExessDef counter reaches half of max value */ + GmacMmcTxFrameInt = 0x00200000, /* set when GmacMmcTxFrameCount counter reaches half of max value */ + GmacMmcTxOctetInt = 0x00100000, /* set when GmacMmcTxOctetCountG counter reaches half of max value */ + GmacMmcTxCarrierErrorInt = 0x00080000, /* set when GmacMmcTxCarrierError counter reaches half of max value */ + GmacMmcTxExessColInt = 0x00040000, /* set when GmacMmcTxExessCol counter reaches half of max value */ + GmacMmcTxLateColInt = 0x00020000, /* set when GmacMmcTxLateCol counter reaches half of max value */ + GmacMmcTxDeferredInt = 0x00010000, /* set when GmacMmcTxDeferred counter reaches half of max value */ + GmacMmcTxMultiColInt = 0x00008000, /* set when GmacMmcTxMultiColG counter reaches half of max value */ + GmacMmcTxSingleCol = 0x00004000, /* set when GmacMmcTxSingleColG counter reaches half of max value */ + GmacMmcTxUnderFlowErrorInt = 0x00002000, /* set when GmacMmcTxUnderFlowError counter reaches half of max value */ + GmacMmcTxBcFramesGbInt = 0x00001000, /* set when GmacMmcTxBcFramesGb counter reaches half of max value */ + GmacMmcTxMcFramesGbInt = 0x00000800, /* set when GmacMmcTxMcFramesGb counter reaches half of max value */ + GmacMmcTxUcFramesInt = 0x00000400, /* set when GmacMmcTxUcFramesGb counter reaches half of max value */ + GmacMmcTx1024OctInt = 0x00000200, /* set when GmacMmcTx1024ToMaxOctetsGb counter reaches half of max value */ + GmacMmcTx512OctInt = 0x00000100, /* set when GmacMmcTx512To1023OctetsGb counter reaches half of max value */ + GmacMmcTx256OctInt = 0x00000080, /* set when GmacMmcTx256To511OctetsGb counter reaches half of max value */ + GmacMmcTx128OctInt = 0x00000040, /* set when GmacMmcTx128To255OctetsGb counter reaches half of max value */ + GmacMmcTx65OctInt = 0x00000020, /* set when GmacMmcTx65To127OctetsGb counter reaches half of max value */ + GmacMmcTx64OctInt = 0x00000010, /* set when GmacMmcTx64OctetsGb counter reaches half of max value */ + GmacMmcTxMcFramesInt = 0x00000008, /* set when GmacMmcTxMcFramesG counter reaches half of max value */ + GmacMmcTxBcFramesInt = 0x00000004, /* set when GmacMmcTxBcFramesG counter reaches half of max value */ + GmacMmcTxFrameGbInt = 0x00000002, /* set when GmacMmcTxFrameCountGb counter reaches half of max value */ + GmacMmcTxOctetGbInt = 0x00000001, /* set when GmacMmcTxOctetCountGb counter reaches half of max value */ + +}; + + +/********************************************************** + * Power Management (PMT) Block + **********************************************************/ + +/** + * PMT supports the reception of network (remote) wake-up frames and Magic packet frames. + * It generates interrupts for wake-up frames and Magic packets received by GMAC. + * PMT sits in Rx path and is enabled with remote wake-up frame enable and Magic packet enable. + * These enable are in PMT control and Status register and are programmed by apllication. + * + * When power down mode is enabled in PMT, all rx frames are dropped by the core. Core comes + * out of power down mode only when either Magic packe tor a Remote wake-up frame is received + * and the corresponding detection is enabled. + * + * Driver need not be modified to support this feature. Only Api to put the device in to power + * down mode is sufficient + */ + +#define WAKEUP_REG_LENGTH 8 /*This is the reg length for wake up register configuration*/ + +enum GmacPmtCtrlStatusBitDefinition +{ + GmacPmtFrmFilterPtrReset = 0x80000000, /* when set remote wake-up frame filter register pointer to 3'b000 */ + GmacPmtGlobalUnicast = 0x00000200, /* When set enables any unicast packet to be a wake-up frame */ + GmacPmtWakeupFrameReceived = 0x00000040, /* Wake up frame received */ + GmacPmtMagicPktReceived = 0x00000020, /* Magic Packet received */ + GmacPmtWakeupFrameEnable = 0x00000004, /* Wake-up frame enable */ + GmacPmtMagicPktEnable = 0x00000002, /* Magic packet enable */ + GmacPmtPowerDown = 0x00000001, /* Power Down */ +}; + + + + +/********************************************************** + * IEEE 1588-2008 Precision Time Protocol (PTP) Support + **********************************************************/ +enum PTPMessageType +{ + SYNC = 0x0, + Delay_Req = 0x1, + Pdelay_Req = 0x2, + Pdelay_Resp = 0x3, + Follow_up = 0x8, + Delay_Resp = 0x9, + Pdelay_Resp_Follow_Up = 0xA, + Announce = 0xB, + Signaling = 0xC, + Management = 0xD, +}; + + + +typedef struct TimeStampStruct +{ + u32 TSversion; /* PTP Version 1 or PTP version2 */ + u32 TSmessagetype; /* Message type associated with this time stamp */ + + u16 TShighest16; /* Highest 16 bit time stamp value, Valid onley when ADV_TIME_HIGH_WORD configured in corekit */ + u32 TSupper32; /* Most significant 32 bit time stamp value */ + u32 TSlower32; /* Least Significat 32 bit time stamp value */ + +} TimeStamp; + + +/** + * IEEE 1588-2008 is the optional module to support Ethernet frame time stamping. + * Sixty four (+16) bit time stamps are given in each frames transmit and receive status. + * The driver assumes the following + * 1. "IEEE 1588 Time Stamping" "TIME_STAMPING"is ENABLED in corekit + * 2. "IEEE 1588 External Time Stamp Input Enable" "EXT_TIME_STAMPING" is DISABLED in corekit + * 3. "IEEE 1588 Advanced Time Stamp support" "ADV_TIME_STAMPING" is ENABLED in corekit + * 4. "IEEE 1588 Higher Word Register Enable" "ADV_TIME_HIGH_WORD" is ENABLED in corekit + */ + +/* GmacTSControl = 0x0700, Controls the Timestamp update logic : only when IEEE 1588 time stamping is enabled in corekit */ +enum GmacTSControlReg +{ + GmacTSENMACADDR = 0x00040000, /* Enable Mac Addr for PTP filtering 18 RW 0 */ + + GmacTSCLKTYPE = 0x00030000, /* Select the type of clock node 17:16 RW 00 */ + /* + TSCLKTYPE TSMSTRENA TSEVNTENA Messages for wihich TS snapshot is taken + 00/01 X 0 SYNC, FOLLOW_UP, DELAY_REQ, DELAY_RESP + 00/01 1 0 DELAY_REQ + 00/01 0 1 SYNC + 10 NA 0 SYNC, FOLLOW_UP, DELAY_REQ, DELAY_RESP + 10 NA 1 SYNC, FOLLOW_UP + 11 NA 0 SYNC, FOLLOW_UP, DELAY_REQ, DELAY_RESP, PDELAY_REQ, PDELAY_RESP + 11 NA 1 SYNC, PDELAY_REQ, PDELAY_RESP + */ + GmacTSOrdClk = 0x00000000, /* 00=> Ordinary clock*/ + GmacTSBouClk = 0x00010000, /* 01=> Boundary clock*/ + GmacTSEtoEClk = 0x00020000, /* 10=> End-to-End transparent clock*/ + GmacTSPtoPClk = 0x00030000, /* 11=> P-to-P transparent clock*/ + + GmacTSMSTRENA = 0x00008000, /* Ena TS Snapshot for Master Messages 15 RW 0 */ + GmacTSEVNTENA = 0x00004000, /* Ena TS Snapshot for Event Messages 14 RW 0 */ + GmacTSIPV4ENA = 0x00002000, /* Ena TS snapshot for IPv4 13 RW 1 */ + GmacTSIPV6ENA = 0x00001000, /* Ena TS snapshot for IPv6 12 RW 0 */ + GmacTSIPENA = 0x00000800, /* Ena TS snapshot for PTP over E'net 11 RW 0 */ + GmacTSVER2ENA = 0x00000400, /* Ena PTP snooping for version 2 10 RW 0 */ + + GmacTSCTRLSSR = 0x00000200, /* Digital or Binary Rollover 9 RW 0 */ + + GmacTSENALL = 0x00000100, /* Enable TS fro all frames (Ver2 only) 8 RW 0 */ + + GmacTSADDREG = 0x00000020, /* Addend Register Update 5 RW_SC 0 */ + GmacTSUPDT = 0x00000008, /* Time Stamp Update 3 RW_SC 0 */ + GmacTSINT = 0x00000004, /* Time Atamp Initialize 2 RW_SC 0 */ + + GmacTSTRIG = 0x00000010, /* Time stamp interrupt Trigger Enable 4 RW_SC 0 */ + + GmacTSCFUPDT = 0x00000002, /* Time Stamp Fine/Coarse 1 RW 0 */ + GmacTSCUPDTCoarse = 0x00000000, /* 0=> Time Stamp update method is coarse */ + GmacTSCUPDTFine = 0x00000002, /* 1=> Time Stamp update method is fine */ + + GmacTSENA = 0x00000001, /* Time Stamp Enable 0 RW 0 */ +}; + + +/* GmacTSSubSecIncr = 0x0704, 8 bit value by which sub second register is incremented : only when IEEE 1588 time stamping without external timestamp input */ +enum GmacTSSubSecIncrReg +{ + GmacSSINCMsk = 0x000000FF, /* Only Lower 8 bits are valid bits 7:0 RW 00 */ +}; + +/* GmacTSLow = 0x070C, Indicates whether the timestamp low count is positive or negative; for Adv timestamp it is always zero */ +enum GmacTSSign +{ + GmacTSSign = 0x80000000, /* PSNT 31 RW 0 */ + GmacTSPositive = 0x00000000, + GmacTSNegative = 0x80000000, +}; + +/*GmacTargetTimeLow = 0x0718, 32 bit nano seconds(MS) to be compared with system time : only when IEEE 1588 time stamping without external timestamp input */ +enum GmacTSLowReg +{ + GmacTSDecThr = 0x3B9AC9FF, /*when TSCTRLSSR is set the max value for GmacTargetTimeLowReg and GmacTimeStampLow register is 0x3B9AC9FF at 1ns precision */ +}; + +/* GmacTSHighWord = 0x0724, Time Stamp Higher Word Register (Version 2 only); only lower 16 bits are valid */ +enum GmacTSHighWordReg +{ + GmacTSHighWordMask = 0x0000FFFF, /* Time Stamp Higher work register has only lower 16 bits valid */ +}; +/*GmacTSStatus = 0x0728, Time Stamp Status Register */ +enum GmacTSStatusReg +{ + GmacTSTargTimeReached = 0x00000002, /* Time Stamp Target Time Reached 1 RO 0 */ + GmacTSSecondsOverflow = 0x00000001, /* Time Stamp Seconds Overflow 0 RO 0 */ +}; + + +/********************************************************** + * Time stamp related functions + **********************************************************/ +void synopGMAC_TS_enable(synopGMACdevice *gmacdev); +void synopGMAC_TS_disable(synopGMACdevice *gmacdev); + +void synopGMAC_TS_int_enable(synopGMACdevice *gmacdev); +void synopGMAC_TS_int_disable(synopGMACdevice *gmacdev); + +void synopGMAC_TS_mac_addr_filt_enable(synopGMACdevice *gmacdev); +void synopGMAC_TS_mac_addr_filt_disable(synopGMACdevice *gmacdev); +void synopGMAC_TS_set_clk_type(synopGMACdevice *gmacdev, u32 clk_type); +void synopGMAC_TS_master_enable(synopGMACdevice *gmacdev); // Only for Ordinary clock and Boundary clock and "Advanced Time Stamp" +void synopGMAC_TS_master_disable(synopGMACdevice *gmacdev); // Only for Ordinary clock and Boundary clock and "Advanced Time Stamp" +void synopGMAC_TS_event_enable(synopGMACdevice *gmacdev); // Only for "Advanced Time Stamp" +void synopGMAC_TS_event_disable(synopGMACdevice *gmacdev); // Only for "Advanced Time Stamp" +void synopGMAC_TS_IPV4_enable(synopGMACdevice *gmacdev); // Only for "Advanced Time Stamp" +void synopGMAC_TS_IPV4_disable(synopGMACdevice *gmacdev); // Only for "Advanced Time Stamp" +void synopGMAC_TS_IPV6_enable(synopGMACdevice *gmacdev); // Only for "Advanced Time Stamp" +void synopGMAC_TS_IPV6_disable(synopGMACdevice *gmacdev); // Only for "Advanced Time Stamp" +void synopGMAC_TS_ptp_over_ethernet_enable(synopGMACdevice *gmacdev); // Only for "Advanced Time Stamp" +void synopGMAC_TS_ptp_over_ethernet_disable(synopGMACdevice *gmacdev); // Only for "Advanced Time Stamp" +void synopGMAC_TS_pkt_snoop_ver2(synopGMACdevice *gmacdev); // Only for "Advanced Time Stamp" +void synopGMAC_TS_pkt_snoop_ver1(synopGMACdevice *gmacdev); // Only for "Advanced Time Stamp" + +void synopGMAC_TS_digital_rollover_enable(synopGMACdevice *gmacdev); +void synopGMAC_TS_binary_rollover_enable(synopGMACdevice *gmacdev); +void synopGMAC_TS_all_frames_enable(synopGMACdevice *gmacdev); // Only for "Advanced Time Stamp" +void synopGMAC_TS_all_frames_disable(synopGMACdevice *gmacdev); // Only for "Advanced Time Stamp" + +s32 synopGMAC_TS_addend_update(synopGMACdevice *gmacdev, u32 addend_value); +s32 synopGMAC_TS_timestamp_update(synopGMACdevice *gmacdev, u32 high_value, u32 low_value); +s32 synopGMAC_TS_timestamp_init(synopGMACdevice *gmacdev, u32 high_value, u32 low_value); + +void synopGMAC_TS_coarse_update(synopGMACdevice *gmacdev); // Only if "fine correction" enabled +void synopGMAC_TS_fine_update(synopGMACdevice *gmacdev); // Only if "fine correction" enabled + +void synopGMAC_TS_subsecond_init(synopGMACdevice *gmacdev, u32 sub_sec_inc_val); // Update should happen making use of subsecond mask +void synopGMAC_TS_read_timestamp(synopGMACdevice *gmacdev, u16 *higher_sec_val, + u32 *sec_val, u32 *sub_sec_val); // Reads the timestamp low,high and higher(Ver2) registers in the the struct pointer; readonly contents +void synopGMAC_TS_load_target_timestamp(synopGMACdevice *gmacdev, u32 sec_val, u32 sub_sec_val); //Loads the timestamp target register with the values provided + +void synopGMAC_TS_load_timestamp_higher_val(synopGMACdevice *gmacdev, u32 higher_sec_val); +void synopGMAC_TS_read_timestamp_higher_val(synopGMACdevice *gmacdev, u16 *higher_sec_val); +void synopGMAC_TS_read_target_timestamp(synopGMACdevice *gmacdev, u32 *sec_val, u32 *sub_sec_val); //Read the target time stamp register contents + + +/********************************************************** + * Common functions + **********************************************************/ +s32 synopGMAC_set_mdc_clk_div(synopGMACdevice *gmacdev, u32 clk_div_val); +u32 synopGMAC_get_mdc_clk_div(synopGMACdevice *gmacdev); +s32 synopGMAC_read_phy_reg(u32 RegBase, u32 PhyBase, u32 RegOffset, u16 *data); +s32 synopGMAC_write_phy_reg(u32 RegBase, u32 PhyBase, u32 RegOffset, u16 data); +s32 synopGMAC_phy_loopback(synopGMACdevice *gmacdev, bool loopback); +s32 synopGMAC_read_version(synopGMACdevice *gmacdev) ; +s32 synopGMAC_reset(synopGMACdevice *gmacdev); +s32 synopGMAC_reset_nocheck(synopGMACdevice *gmacdev); +s32 synopGMAC_dma_bus_mode_init(synopGMACdevice *gmacdev, u32 init_value); +s32 synopGMAC_dma_control_init(synopGMACdevice *gmacdev, u32 init_value); +void synopGMAC_wd_enable(synopGMACdevice *gmacdev); +void synopGMAC_wd_disable(synopGMACdevice *gmacdev); +void synopGMAC_jab_enable(synopGMACdevice *gmacdev); +void synopGMAC_jab_disable(synopGMACdevice *gmacdev); +void synopGMAC_frame_burst_enable(synopGMACdevice *gmacdev); +void synopGMAC_frame_burst_disable(synopGMACdevice *gmacdev); +void synopGMAC_jumbo_frame_enable(synopGMACdevice *gmacdev); +void synopGMAC_jumbo_frame_disable(synopGMACdevice *gmacdev); +void synopGMAC_select_gmii(synopGMACdevice *gmacdev); +void synopGMAC_select_mii(synopGMACdevice *gmacdev); +void synopGMAC_rx_own_enable(synopGMACdevice *gmacdev); +void synopGMAC_rx_own_disable(synopGMACdevice *gmacdev); +void synopGMAC_loopback_on(synopGMACdevice *gmacdev); +void synopGMAC_loopback_off(synopGMACdevice *gmacdev); +void synopGMAC_set_full_duplex(synopGMACdevice *gmacdev); +void synopGMAC_set_half_duplex(synopGMACdevice *gmacdev); +void synopGMAC_retry_enable(synopGMACdevice *gmacdev); +void synopGMAC_retry_disable(synopGMACdevice *gmacdev); +void synopGMAC_pad_crc_strip_enable(synopGMACdevice *gmacdev); +void synopGMAC_pad_crc_strip_disable(synopGMACdevice *gmacdev); +void synopGMAC_back_off_limit(synopGMACdevice *gmacdev, u32 value); +void synopGMAC_deferral_check_enable(synopGMACdevice *gmacdev); +void synopGMAC_deferral_check_disable(synopGMACdevice *gmacdev); +void synopGMAC_rx_enable(synopGMACdevice *gmacdev); +void synopGMAC_rx_disable(synopGMACdevice *gmacdev); +void synopGMAC_tx_enable(synopGMACdevice *gmacdev); +void synopGMAC_tx_disable(synopGMACdevice *gmacdev); +void synopGMAC_frame_filter_enable(synopGMACdevice *gmacdev); +void synopGMAC_frame_filter_disable(synopGMACdevice *gmacdev); +void synopGMAC_write_hash_table_high(synopGMACdevice *gmacdev, u32 data); +void synopGMAC_write_hash_table_low(synopGMACdevice *gmacdev, u32 data); +void synopGMAC_hash_perfect_filter_enable(synopGMACdevice *gmacdev); +void synopGMAC_Hash_filter_only_enable(synopGMACdevice *gmacdev); +void synopGMAC_src_addr_filter_enable(synopGMACdevice *gmacdev); +void synopGMAC_src_addr_filter_disable(synopGMACdevice *gmacdev); +void synopGMAC_dst_addr_filter_inverse(synopGMACdevice *gmacdev); +void synopGMAC_dst_addr_filter_normal(synopGMACdevice *gmacdev); +void synopGMAC_set_pass_control(synopGMACdevice *gmacdev, u32 passcontrol); +void synopGMAC_broadcast_enable(synopGMACdevice *gmacdev); +void synopGMAC_broadcast_disable(synopGMACdevice *gmacdev); +void synopGMAC_multicast_enable(synopGMACdevice *gmacdev); +void synopGMAC_multicast_disable(synopGMACdevice *gmacdev); +void synopGMAC_multicast_hash_filter_enable(synopGMACdevice *gmacdev); +void synopGMAC_multicast_hash_filter_disable(synopGMACdevice *gmacdev); +void synopGMAC_promisc_enable(synopGMACdevice *gmacdev); +void synopGMAC_promisc_disable(synopGMACdevice *gmacdev); +void synopGMAC_unicast_hash_filter_enable(synopGMACdevice *gmacdev); +void synopGMAC_unicast_hash_filter_disable(synopGMACdevice *gmacdev); +void synopGMAC_unicast_pause_frame_detect_enable(synopGMACdevice *gmacdev); +void synopGMAC_unicast_pause_frame_detect_disable(synopGMACdevice *gmacdev); +void synopGMAC_rx_flow_control_enable(synopGMACdevice *gmacdev); +void synopGMAC_rx_flow_control_disable(synopGMACdevice *gmacdev); +void synopGMAC_tx_flow_control_enable(synopGMACdevice *gmacdev); +void synopGMAC_tx_flow_control_disable(synopGMACdevice *gmacdev); +void synopGMAC_tx_activate_flow_control(synopGMACdevice *gmacdev); +void synopGMAC_tx_deactivate_flow_control(synopGMACdevice *gmacdev); +void synopGMAC_pause_control(synopGMACdevice *gmacdev); +s32 synopGMAC_mac_init(synopGMACdevice *gmacdev); +//s32 synopGMAC_check_phy_init (synopGMACdevice * gmacdev); +s32 synopGMAC_set_mac_addr(synopGMACdevice *gmacdev, u32 MacHigh, u32 MacLow, u8 *MacAddr); +s32 synopGMAC_get_mac_addr(synopGMACdevice *gmacdev, u32 MacHigh, u32 MacLow, u8 *MacAddr); +s32 synopGMAC_attach(synopGMACdevice *gmacdev, u32 macBase, u32 dmaBase, u32 phyBase, u8 *mac_addr); +void synopGMAC_rx_desc_init_ring(DmaDesc *desc, bool last_ring_desc); +void synopGMAC_tx_desc_init_ring(DmaDesc *desc, bool last_ring_desc); +void synopGMAC_rx_desc_init_chain(DmaDesc *desc); +void synopGMAC_tx_desc_init_chain(DmaDesc *desc); +s32 synopGMAC_init_tx_rx_desc_queue(synopGMACdevice *gmacdev); +void synopGMAC_init_rx_desc_base(synopGMACdevice *gmacdev); +void synopGMAC_init_tx_desc_base(synopGMACdevice *gmacdev); +void synopGMAC_set_owner_dma(DmaDesc *desc); +void synopGMAC_set_desc_sof(DmaDesc *desc); +void synopGMAC_set_desc_eof(DmaDesc *desc); +bool synopGMAC_is_sof_in_rx_desc(DmaDesc *desc); +bool synopGMAC_is_eof_in_rx_desc(DmaDesc *desc); +bool synopGMAC_is_da_filter_failed(DmaDesc *desc); +bool synopGMAC_is_sa_filter_failed(DmaDesc *desc); +bool synopGMAC_is_desc_owned_by_dma(DmaDesc *desc); +u32 synopGMAC_get_rx_desc_frame_length(u32 status); +bool synopGMAC_is_desc_valid(u32 status); +bool synopGMAC_is_desc_empty(DmaDesc *desc); +bool synopGMAC_is_rx_desc_valid(u32 status); +bool synopGMAC_is_tx_aborted(u32 status); +bool synopGMAC_is_tx_carrier_error(u32 status); +u32 synopGMAC_get_tx_collision_count(u32 status); +u32 synopGMAC_is_exc_tx_collisions(u32 status); +bool synopGMAC_is_rx_frame_damaged(u32 status); +bool synopGMAC_is_rx_frame_collision(u32 status); +bool synopGMAC_is_rx_crc(u32 status); +bool synopGMAC_is_frame_dribbling_errors(u32 status); +bool synopGMAC_is_rx_frame_length_errors(u32 status); +bool synopGMAC_is_last_rx_desc(synopGMACdevice *gmacdev, DmaDesc *desc); +bool synopGMAC_is_last_tx_desc(synopGMACdevice *gmacdev, DmaDesc *desc); +bool synopGMAC_is_rx_desc_chained(DmaDesc *desc); +bool synopGMAC_is_tx_desc_chained(DmaDesc *desc); +void synopGMAC_get_desc_data(DmaDesc *desc, u32 *Status, u32 *Buffer1, u32 *Length1, u32 *Data1); + +s32 synopGMAC_get_tx_qptr(synopGMACdevice *gmacdev, u32 *Status, u32 *Buffer1, u32 *Length1, u32 *Data1, u32 *Ext_Status, u32 *Time_Stamp_High, u32 *Time_Stamp_low); + +s32 synopGMAC_set_tx_qptr(synopGMACdevice *gmacdev, u32 Buffer1, u32 Length1, u32 Data1, u32 offload_needed, u32 ts); +s32 synopGMAC_set_rx_qptr(synopGMACdevice *gmacdev, u32 Buffer1, u32 Length1, u32 Data1); + +s32 synopGMAC_get_rx_qptr(synopGMACdevice *gmacdev, u32 *Status, u32 *Buffer1, u32 *Length1, u32 *Data1, u32 *Ext_Status, u32 *Time_Stamp_High, u32 *Time_Stamp_low); + +void synopGMAC_clear_interrupt(synopGMACdevice *gmacdev); +u32 synopGMAC_get_interrupt_type(synopGMACdevice *gmacdev); +u32 synopGMAC_get_interrupt_mask(synopGMACdevice *gmacdev); +void synopGMAC_enable_interrupt(synopGMACdevice *gmacdev, u32 interrupts); +void synopGMAC_disable_interrupt_all(synopGMACdevice *gmacdev); +void synopGMAC_disable_interrupt(synopGMACdevice *gmacdev, u32 interrupts); +void synopGMAC_enable_dma_rx(synopGMACdevice *gmacdev); +void synopGMAC_enable_dma_tx(synopGMACdevice *gmacdev); +void synopGMAC_resume_dma_tx(synopGMACdevice *gmacdev); +void synopGMAC_resume_dma_rx(synopGMACdevice *gmacdev); +void synopGMAC_take_desc_ownership(DmaDesc *desc); +void synopGMAC_take_desc_ownership_rx(synopGMACdevice *gmacdev); +void synopGMAC_take_desc_ownership_tx(synopGMACdevice *gmacdev); +void synopGMAC_disable_dma_tx(synopGMACdevice *gmacdev); +void synopGMAC_disable_dma_rx(synopGMACdevice *gmacdev); +/******Following APIs are valid only for Enhanced Descriptor from 3.50a release onwards*******/ +bool synopGMAC_is_ext_status(synopGMACdevice *gmacdev, u32 status); +bool synopGMAC_ES_is_IP_header_error(synopGMACdevice *gmacdev, u32 ext_status); +bool synopGMAC_ES_is_rx_checksum_bypassed(synopGMACdevice *gmacdev, u32 ext_status); +bool synopGMAC_ES_is_IP_payload_error(synopGMACdevice *gmacdev, u32 ext_status); +/*******************PMT APIs***************************************/ +void synopGMAC_pmt_int_enable(synopGMACdevice *gmacdev); +void synopGMAC_pmt_int_disable(synopGMACdevice *gmacdev); +void synopGMAC_power_down_enable(synopGMACdevice *gmacdev); +void synopGMAC_power_down_disable(synopGMACdevice *gmacdev); +void synopGMAC_enable_pmt_interrupt(synopGMACdevice *gmacdev); +void synopGMAC_disable_pmt_interrupt(synopGMACdevice *gmacdev); +void synopGMAC_magic_packet_enable(synopGMACdevice *gmacdev); +void synopGMAC_magic_packet_disable(synopGMACdevice *gmacdev); +void synopGMAC_wakeup_frame_enable(synopGMACdevice *gmacdev); +void synopGMAC_pmt_unicast_enable(synopGMACdevice *gmacdev); +bool synopGMAC_is_magic_packet_received(synopGMACdevice *gmacdev); +bool synopGMAC_is_wakeup_frame_received(synopGMACdevice *gmacdev); +void synopGMAC_write_wakeup_frame_register(synopGMACdevice *gmacdev, u32 *filter_contents); + +/*******************Ip checksum offloading APIs***************************************/ +void synopGMAC_enable_rx_chksum_offload(synopGMACdevice *gmacdev); +void synopGMAC_disable_rx_chksum_offload(synopGMACdevice *gmacdev); +void synopGMAC_rx_tcpip_chksum_drop_enable(synopGMACdevice *gmacdev); +void synopGMAC_rx_tcpip_chksum_drop_disable(synopGMACdevice *gmacdev); +u32 synopGMAC_is_rx_checksum_error(synopGMACdevice *gmacdev, u32 status); +bool synopGMAC_is_tx_ipv4header_checksum_error(synopGMACdevice *gmacdev, u32 status); +bool synopGMAC_is_tx_payload_checksum_error(synopGMACdevice *gmacdev, u32 status); +void synopGMAC_tx_checksum_offload_bypass(synopGMACdevice *gmacdev, DmaDesc *desc); +void synopGMAC_tx_checksum_offload_ipv4hdr(synopGMACdevice *gmacdev, DmaDesc *desc); +void synopGMAC_tx_checksum_offload_tcponly(synopGMACdevice *gmacdev, DmaDesc *desc); +void synopGMAC_tx_checksum_offload_tcp_pseudo(synopGMACdevice *gmacdev, DmaDesc *desc); + + +// For testing --ya +void synopGMAC_src_addr_insert_enable(synopGMACdevice *gmacdev); +void synopGMAC_src_addr_insert_disable(synopGMACdevice *gmacdev); +void synopGMAC_src_addr_replace_enable(synopGMACdevice *gmacdev); +void synopGMAC_src_addr_replace_disable(synopGMACdevice *gmacdev); + +void synopGMAC_svlan_insertion_enable(synopGMACdevice *gmacdev, u16 vlantag); +void synopGMAC_cvlan_insertion_enable(synopGMACdevice *gmacdev, u16 vlantag); +void synopGMAC_svlan_replace_enable(synopGMACdevice *gmacdev, u16 vlantag); +void synopGMAC_cvlan_replace_enable(synopGMACdevice *gmacdev, u16 vlantag); +void synopGMAC_vlan_deletion_enable(synopGMACdevice *gmacdev); +void synopGMAC_vlan_no_act_enable(synopGMACdevice *gmacdev); + +void synopGMAC_set_crc_replacement(synopGMACdevice *gmacdev); +void synopGMAC_clr_crc_replacement(synopGMACdevice *gmacdev); + +void synopGMAC_enable_under_size_pkt(synopGMACdevice *gmacdev); +void synopGMAC_disable_under_size_pkt(synopGMACdevice *gmacdev); + +void synopGMAC_enable_crc_err_pkt(synopGMACdevice *gmacdev); +void synopGMAC_disable_crc_err_pkt(synopGMACdevice *gmacdev); + +#endif /* End of file */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_Host.h b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_Host.h new file mode 100644 index 0000000000..2290a3b317 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_Host.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017-08-24 chinesebear first version + */ + +#ifndef SYNOP_GMAC_HOST_H +#define SYNOP_GMAC_HOST_H 1 + +#include "synopGMAC_plat.h" +#include "synopGMAC_Dev.h" +#include "mii.h" +#include "synopGMAC_network_interface.h" + +typedef struct +{ + uint32_t u32TxDescSize; + uint32_t u32RxDescSize; + + DmaDesc *psRXDescs; + PKT_FRAME_T *psRXFrames; + DmaDesc *psTXDescs; + PKT_FRAME_T *psTXFrames; +} GMAC_MEMMGR_T; + +typedef struct +{ + /*Device Dependent Data structur*/ + synopGMACdevice *m_gmacdev; + GMAC_MEMMGR_T *m_gmacmemmgr; + struct mii_if_info m_mii; +} synopGMACNetworkAdapter; + +#endif diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_network_interface.c b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_network_interface.c new file mode 100644 index 0000000000..48dc0070e8 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_network_interface.c @@ -0,0 +1,628 @@ +/* =================================================================================== + * Copyright (c) <2009> Synopsys, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software annotated with this license and associated documentation files + * (the "Software"), to deal in the Software without restriction, including without + * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * =================================================================================== */ + + +/** \file + * This is the network dependent layer to handle network related functionality. + * This file is tightly coupled to neworking frame work of linux 2.6.xx kernel. + * The functionality carried out in this file should be treated as an example only + * if the underlying operating system is not Linux. + * + * \note Many of the functions other than the device specific functions + * changes for operating system other than Linux 2.6.xx + * \internal + *-----------------------------REVISION HISTORY----------------------------------- + * Synopsys 01/Aug/2007 Created + */ + +#include "NuMicro.h" +#include "synopGMAC_network_interface.h" + + +void synopGMAC_powerup_mac(synopGMACdevice *gmacdev) +{ + gmacdev->GMAC_Power_down = 0; // Let ISR know that MAC is out of power down now + if (synopGMAC_is_magic_packet_received(gmacdev)) + TR("GMAC wokeup due to Magic Pkt Received\n"); + if (synopGMAC_is_wakeup_frame_received(gmacdev)) + TR("GMAC wokeup due to Wakeup Frame Received\n"); + //Disable the assertion of PMT interrupt + synopGMAC_pmt_int_disable(gmacdev); + //Enable the mac and Dma rx and tx paths + synopGMAC_rx_enable(gmacdev); + synopGMAC_enable_dma_rx(gmacdev); + + synopGMAC_tx_enable(gmacdev); + synopGMAC_enable_dma_tx(gmacdev); + + return; +} + +void synopGMAC_powerdown_mac(synopGMACdevice *gmacdev) +{ + TR("Put the GMAC to power down mode..\n"); + + // Disable the Dma engines in tx path + gmacdev->GMAC_Power_down = 1; // Let ISR know that Mac is going to be in the power down mode + synopGMAC_disable_dma_tx(gmacdev); + plat_delay(DEFAULT_LOOP_VARIABLE); //allow any pending transmission to complete + // Disable the Mac for both tx and rx + synopGMAC_tx_disable(gmacdev); + synopGMAC_rx_disable(gmacdev); + plat_delay(DEFAULT_LOOP_VARIABLE); //Allow any pending buffer to be read by host + //Disable the Dma in rx path + synopGMAC_disable_dma_rx(gmacdev); + + //enable the power down mode + //synopGMAC_pmt_unicast_enable(gmacdev); + + //prepare the gmac for magic packet reception and wake up frame reception + synopGMAC_magic_packet_enable(gmacdev); + + //gate the application and transmit clock inputs to the code. This is not done in this driver :). + + //enable the Mac for reception + synopGMAC_rx_enable(gmacdev); + + //Enable the assertion of PMT interrupt + synopGMAC_pmt_int_enable(gmacdev); + + //enter the power down mode + synopGMAC_power_down_enable(gmacdev); + + return; +} + +#if 0 +void synopGMAC_powerdown_mac(synopGMACdevice *gmacdev) +{ + TR0("Put the GMAC to power down mode..\n"); + // Disable the Dma engines in tx path + GMAC_Power_down = 1; // Let ISR know that Mac is going to be in the power down mode + synopGMAC_disable_dma_tx(gmacdev); + plat_delay(DEFAULT_LOOP_VARIABLE); //allow any pending transmission to complete + // Disable the Mac for both tx and rx + synopGMAC_tx_disable(gmacdev); + synopGMAC_rx_disable(gmacdev); + plat_delay(DEFAULT_LOOP_VARIABLE); //Allow any pending buffer to be read by host + //Disable the Dma in rx path + synopGMAC_disable_dma_rx(gmacdev); + + //enable the power down mode + //synopGMAC_pmt_unicast_enable(gmacdev); + + //prepare the gmac for magic packet reception and wake up frame reception + synopGMAC_magic_packet_enable(gmacdev); + + //gate the application and transmit clock inputs to the code. This is not done in this driver :). + + //enable the Mac for reception + synopGMAC_rx_enable(gmacdev); + + //Enable the assertion of PMT interrupt + synopGMAC_pmt_int_enable(gmacdev); + //enter the power down mode + synopGMAC_power_down_enable(gmacdev); + return; +} + +void synopGMAC_powerup_mac(synopGMACdevice *gmacdev) +{ + GMAC_Power_down = 0; // Let ISR know that MAC is out of power down now + if (synopGMAC_is_magic_packet_received(gmacdev)) + TR("GMAC wokeup due to Magic Pkt Received\n"); + if (synopGMAC_is_wakeup_frame_received(gmacdev)) + TR("GMAC wokeup due to Wakeup Frame Received\n"); + //Disable the assertion of PMT interrupt + synopGMAC_pmt_int_disable(gmacdev); + //Enable the mac and Dma rx and tx paths + synopGMAC_rx_enable(gmacdev); + synopGMAC_enable_dma_rx(gmacdev); + + synopGMAC_tx_enable(gmacdev); + synopGMAC_enable_dma_tx(gmacdev); + return; +} +#endif + +/** + * This sets up the transmit Descriptor queue in ring or chain mode. + * This function is tightly coupled to the platform and operating system + * Device is interested only after the descriptors are setup. Therefore this function + * is not included in the device driver API. This function should be treated as an + * example code to design the descriptor structures for ring mode or chain mode. + * This function depends on the pcidev structure for allocation consistent dma-able memory in case of linux. + * This limitation is due to the fact that linux uses pci structure to allocate a dmable memory + * - Allocates the memory for the descriptors. + * - Initialize the Busy and Next descriptors indices to 0(Indicating first descriptor). + * - Initialize the Busy and Next descriptors to first descriptor address. + * - Initialize the last descriptor with the endof ring in case of ring mode. + * - Initialize the descriptors in chain mode. + * @param[in] pointer to synopGMACdevice. + * @param[in] pointer to pci_device structure. + * @param[in] number of descriptor expected in tx descriptor queue. + * @param[in] whether descriptors to be created in RING mode or CHAIN mode. + * \return 0 upon success. Error code upon failure. + * \note This function fails if allocation fails for required number of descriptors in Ring mode, but in chain mode + * function returns -ESYNOPGMACNOMEM in the process of descriptor chain creation. once returned from this function + * user should for gmacdev->TxDescCount to see how many descriptors are there in the chain. Should continue further + * only if the number of descriptors in the chain meets the requirements + */ + +s32 synopGMAC_setup_tx_desc_queue(synopGMACdevice *gmacdev, DmaDesc *first_desc, u32 no_of_desc, u32 desc_mode) +{ + s32 i; + + TR("Total size of memory required for Tx Descriptors in Ring Mode = 0x%08x\n", ((sizeof(DmaDesc) * no_of_desc))); + + gmacdev->TxDescCount = no_of_desc; + +#ifdef CACHE_ON + gmacdev->TxDesc = (DmaDesc *)((u32)first_desc | UNCACHEABLE) ; +#else + gmacdev->TxDesc = first_desc; +#endif + + gmacdev->TxDescDma = (dma_addr_t)first_desc; + + for (i = 0; i < gmacdev -> TxDescCount; i++) + { + synopGMAC_tx_desc_init_ring((DmaDesc *)gmacdev->TxDesc + i, i == gmacdev->TxDescCount - 1); + + TR("%02d %08x \n", i, (unsigned int)(gmacdev->TxDesc + i)); + TR("status: %08x\n", (unsigned int)((gmacdev->TxDesc + i))->status); + TR("length: %08x\n", (unsigned int)((gmacdev->TxDesc + i)->length)); + TR("buffer1: %08x\n", (unsigned int)((gmacdev->TxDesc + i)->buffer1)); + TR("buffer2: %08x\n", (unsigned int)((gmacdev->TxDesc + i)->buffer2)); + TR("extstatus: %08x\n", (unsigned int)((gmacdev->TxDesc + i)->extstatus)); + TR("reserved1: %08x\n", (unsigned int)((gmacdev->TxDesc + i)->reserved1)); + TR("timestamplow: %08x\n", (unsigned int)((gmacdev->TxDesc + i)->timestamplow)); + TR("timestamphigh: %08x\n", (unsigned int)((gmacdev->TxDesc + i)->timestamphigh)); +// TR("data1: %08x\n", (unsigned int)((gmacdev->TxDesc + i)->data1)); +// TR("data2: %08x\n", (unsigned int)((gmacdev->TxDesc + i)->data2)); + } + + gmacdev->TxNext = 0; + gmacdev->TxBusy = 0; + gmacdev->TxNextDesc = gmacdev->TxDesc; + gmacdev->TxBusyDesc = gmacdev->TxDesc; + gmacdev->BusyTxDesc = 0; + + return 0; +} + + +/** + * This sets up the receive Descriptor queue in ring or chain mode. + * This function is tightly coupled to the platform and operating system + * Device is interested only after the descriptors are setup. Therefore this function + * is not included in the device driver API. This function should be treated as an + * example code to design the descriptor structures in ring mode or chain mode. + * This function depends on the pcidev structure for allocation of consistent dma-able memory in case of linux. + * This limitation is due to the fact that linux uses pci structure to allocate a dmable memory + * - Allocates the memory for the descriptors. + * - Initialize the Busy and Next descriptors indices to 0(Indicating first descriptor). + * - Initialize the Busy and Next descriptors to first descriptor address. + * - Initialize the last descriptor with the endof ring in case of ring mode. + * - Initialize the descriptors in chain mode. + * @param[in] pointer to synopGMACdevice. + * @param[in] pointer to pci_device structure. + * @param[in] number of descriptor expected in rx descriptor queue. + * @param[in] whether descriptors to be created in RING mode or CHAIN mode. + * \return 0 upon success. Error code upon failure. + * \note This function fails if allocation fails for required number of descriptors in Ring mode, but in chain mode + * function returns -ESYNOPGMACNOMEM in the process of descriptor chain creation. once returned from this function + * user should for gmacdev->RxDescCount to see how many descriptors are there in the chain. Should continue further + * only if the number of descriptors in the chain meets the requirements + */ +s32 synopGMAC_setup_rx_desc_queue(synopGMACdevice *gmacdev, DmaDesc *first_desc, u32 no_of_desc, u32 desc_mode) +{ + s32 i; + + TR("total size of memory required for Rx Descriptors in Ring Mode = 0x%08x\n", ((sizeof(DmaDesc) * no_of_desc))); + + gmacdev->RxDescCount = no_of_desc; +#ifdef CACHE_ON + gmacdev->RxDesc = (DmaDesc *)((u32)first_desc | UNCACHEABLE) ; +#else + gmacdev->RxDesc = first_desc; +#endif + gmacdev->RxDescDma = (dma_addr_t)((u32)first_desc); + + for (i = 0; i < gmacdev -> RxDescCount; i++) + { + synopGMAC_rx_desc_init_ring((DmaDesc *)gmacdev->RxDesc + i, i == gmacdev->RxDescCount - 1); + TR("%02d %08x \n", i, (unsigned int)(gmacdev->RxDesc + i)); + } + + + gmacdev->RxNext = 0; + gmacdev->RxBusy = 0; + gmacdev->RxNextDesc = gmacdev->RxDesc; + gmacdev->RxBusyDesc = gmacdev->RxDesc; + + gmacdev->BusyRxDesc = 0; + + return 0; +} + +/** + * This gives up the receive Descriptor queue in ring or chain mode. + * This function is tightly coupled to the platform and operating system + * Once device's Dma is stopped the memory descriptor memory and the buffer memory deallocation, + * is completely handled by the operating system, this call is kept outside the device driver Api. + * This function should be treated as an example code to de-allocate the descriptor structures in ring mode or chain mode + * and network buffer deallocation. + * This function depends on the pcidev structure for dma-able memory deallocation for both descriptor memory and the + * network buffer memory under linux. + * The responsibility of this function is to + * - Free the network buffer memory if any. + * - Fee the memory allocated for the descriptors. + * @param[in] pointer to synopGMACdevice. + * @param[in] pointer to pci_device structure. + * @param[in] number of descriptor expected in rx descriptor queue. + * @param[in] whether descriptors to be created in RING mode or CHAIN mode. + * \return 0 upon success. Error code upon failure. + * \note No referece should be made to descriptors once this function is called. This function is invoked when the device is closed. + */ +void synopGMAC_giveup_rx_desc_queue(synopGMACdevice *gmacdev, u32 desc_mode) +{ + gmacdev->RxDesc = NULL; + gmacdev->RxDescDma = 0; + return; +} + +/** + * This gives up the transmit Descriptor queue in ring or chain mode. + * This function is tightly coupled to the platform and operating system + * Once device's Dma is stopped the memory descriptor memory and the buffer memory deallocation, + * is completely handled by the operating system, this call is kept outside the device driver Api. + * This function should be treated as an example code to de-allocate the descriptor structures in ring mode or chain mode + * and network buffer deallocation. + * This function depends on the pcidev structure for dma-able memory deallocation for both descriptor memory and the + * network buffer memory under linux. + * The responsibility of this function is to + * - Free the network buffer memory if any. + * - Fee the memory allocated for the descriptors. + * @param[in] pointer to synopGMACdevice. + * @param[in] pointer to pci_device structure. + * @param[in] number of descriptor expected in tx descriptor queue. + * @param[in] whether descriptors to be created in RING mode or CHAIN mode. + * \return 0 upon success. Error code upon failure. + * \note No reference should be made to descriptors once this function is called. This function is invoked when the device is closed. + */ +void synopGMAC_giveup_tx_desc_queue(synopGMACdevice *gmacdev, u32 desc_mode) +{ + + + gmacdev->TxDesc = NULL; + gmacdev->TxDescDma = 0; + return; +} + +void synopGMAC_set_speed(synopGMACdevice *gmacdev) +{ + switch (gmacdev->Speed) + { + case SPEED1000: + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacMiiGmii); + break; + case SPEED100: + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacMiiGmii); + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacFESpeed100); + break; + case SPEED10: + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacMiiGmii); + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacFESpeed100); + default: + break; + } +} + +/** + * Function to transmit a given packet on the wire. + * Whenever Linux Kernel has a packet ready to be transmitted, this function is called. + * The function prepares a packet and prepares the descriptor and + * enables/resumes the transmission. + * @param[in] pointer to sk_buff structure. + * @param[in] pointer to net_device structure. + * \return Returns 0 on success and Error code on failure. + * \note structure sk_buff is used to hold packet in Linux networking stacks. + */ +s32 synopGMAC_xmit_frames(synopGMACdevice *gmacdev, u8 *pkt_data, u32 pkt_len, u32 offload_needed, u32 ts) +{ + s32 status = 0; + u32 dma_addr = (u32)pkt_data; + + /*Now we have skb ready and OS invoked this function. Lets make our DMA know about this*/ + status = synopGMAC_set_tx_qptr(gmacdev, dma_addr, pkt_len, dma_addr, offload_needed, ts); + if (status < 0) + { + TR0("%s No More Free Tx Descriptors\n", __FUNCTION__); + return -1; + } + + /*Now force the DMA to start transmission*/ + synopGMAC_resume_dma_tx(gmacdev); + + return 0; +} + + +/** + * Function to handle housekeeping after a packet is transmitted over the wire. + * After the transmission of a packet DMA generates corresponding interrupt + * (if it is enabled). It takes care of returning the sk_buff to the linux + * kernel, updating the networking statistics and tracking the descriptors. + * @param[in] pointer to net_device structure. + * \return void. + * \note This function runs in interrupt context + */ +void synop_handle_transmit_over(synopGMACdevice *gmacdev) +{ + s32 desc_index; + u32 data1; + u32 status; + u32 length1; + u32 dma_addr1; + + u32 ext_status; + //u16 time_stamp_higher; + u32 time_stamp_high; + u32 time_stamp_low; + + /*Handle the transmit Descriptors*/ + do + { + desc_index = synopGMAC_get_tx_qptr(gmacdev, &status, &dma_addr1, &length1, &data1, &ext_status, &time_stamp_high, &time_stamp_low); + //synopGMAC_TS_read_timestamp_higher_val(gmacdev, &time_stamp_higher); + + if (desc_index >= 0 /*&& data1 != 0*/) + { + TR("Finished Transmit at Tx Descriptor %d for buffer = %08x whose status is %08x \n", desc_index, dma_addr1, status); + + if (synopGMAC_is_tx_ipv4header_checksum_error(gmacdev, status)) + { + TR("Harware Failed to Insert IPV4 Header Checksum\n"); + gmacdev->synopGMACNetStats.tx_ip_header_errors++; + } + if (synopGMAC_is_tx_payload_checksum_error(gmacdev, status)) + { + TR("Harware Failed to Insert Payload Checksum\n"); + gmacdev->synopGMACNetStats.tx_ip_payload_errors++; + } + + if (synopGMAC_is_desc_valid(status)) + { + gmacdev->synopGMACNetStats.tx_bytes += length1; + gmacdev->synopGMACNetStats.tx_packets++; + if (status & DescTxTSStatus) + { + gmacdev->tx_sec = time_stamp_high; + gmacdev->tx_subsec = time_stamp_low; + } + else + { + gmacdev->tx_sec = 0; + gmacdev->tx_subsec = 0; + } + } + else + { + TR("Error in Status %08x\n", status); + gmacdev->synopGMACNetStats.tx_errors++; + gmacdev->synopGMACNetStats.tx_aborted_errors += synopGMAC_is_tx_aborted(status); + gmacdev->synopGMACNetStats.tx_carrier_errors += synopGMAC_is_tx_carrier_error(status); + } + } + gmacdev->synopGMACNetStats.collisions += synopGMAC_get_tx_collision_count(status); + } + while (desc_index >= 0); +} + +/** + * Function to Receive a packet from the interface. + * After Receiving a packet, DMA transfers the received packet to the system memory + * and generates corresponding interrupt (if it is enabled). This function prepares + * the sk_buff for received packet after removing the ethernet CRC, and hands it over + * to linux networking stack. + * - Updataes the networking interface statistics + * - Keeps track of the rx descriptors + * @param[in] pointer to net_device structure. + * \return void. + * \note This function runs in interrupt context. + */ +extern DmaDesc *prevtx; // for CRC test +s32 synop_handle_received_data(synopGMACdevice *gmacdev, PKT_FRAME_T **ppsPktFrame) +{ + u32 data1; + u32 len; + u32 status; + u32 dma_addr1; + + u32 ext_status; + //u16 time_stamp_higher; + u32 time_stamp_high; + u32 time_stamp_low; + + /* Handle the Receive Descriptors */ + if (synopGMAC_get_rx_qptr(gmacdev, &status, + &dma_addr1, NULL, &data1, + &ext_status, &time_stamp_high, &time_stamp_low) >= 0) + { + //synopGMAC_TS_read_timestamp_higher_val(gmacdev, &time_stamp_higher); + //TR("S:%08x ES:%08x DA1:%08x d1:%08x TSH:%08x TSL:%08x TSHW:%08x \n",status,ext_status,dma_addr1, data1,time_stamp_high,time_stamp_low,time_stamp_higher); + TR("S:%08x ES:%08x DA1:%08x d1:%08x TSH:%08x TSL:%08x\n", status, ext_status, dma_addr1, data1, time_stamp_high, time_stamp_low); + + TR("Received Data at Rx Descriptor for skb 0x%08x whose status is %08x\n", data1, status); + + if (synopGMAC_is_rx_desc_valid(status)) + { + // Always enter this loop. synopGMAC_is_rx_desc_valid() also report invalid descriptor + // if there's packet error generated by test code and drop it. But we need to execute ext_status + // check code to tell what's going on. --ya + + len = synopGMAC_get_rx_desc_frame_length(status) - 4; //Not interested in Ethernet CRC bytes + + + // Now lets check for the IPC offloading + /* Since we have enabled the checksum offloading in hardware, lets inform the kernel + not to perform the checksum computation on the incoming packet. Note that ip header + checksum will be computed by the kernel immaterial of what we inform. Similary TCP/UDP/ICMP + pseudo header checksum will be computed by the stack. What we can inform is not to perform + payload checksum. + When CHECKSUM_UNNECESSARY is set kernel bypasses the checksum computation. + */ + + TR("Checksum Offloading will be done now\n"); + + if (synopGMAC_is_ext_status(gmacdev, status)) // extended status present indicates that the RDES4 need to be probed + { + TR("Extended Status present\n"); + if (synopGMAC_ES_is_IP_header_error(gmacdev, ext_status)) // IP header (IPV4) checksum error + { + //Linux Kernel doesnot care for ipv4 header checksum. So we will simply proceed by printing a warning .... + TR("(EXTSTS)Error in IP header error\n"); + gmacdev->synopGMACNetStats.rx_ip_header_errors++; + } + if (synopGMAC_ES_is_rx_checksum_bypassed(gmacdev, ext_status)) // Hardware engine bypassed the checksum computation/checking + { + TR("(EXTSTS)Hardware bypassed checksum computation\n"); + } + if (synopGMAC_ES_is_IP_payload_error(gmacdev, ext_status)) // IP payload checksum is in error (UDP/TCP/ICMP checksum error) + { + TR("(EXTSTS) Error in EP payload\n"); + gmacdev->synopGMACNetStats.rx_ip_payload_errors++; + } + } + else // No extended status. So relevant information is available in the status itself + { + if (synopGMAC_is_rx_checksum_error(gmacdev, status) == RxNoChkError) + { + TR("Ip header and TCP/UDP payload checksum Bypassed \n"); + } + if (synopGMAC_is_rx_checksum_error(gmacdev, status) == RxIpHdrChkError) + { + //Linux Kernel doesnot care for ipv4 header checksum. So we will simply proceed by printing a warning .... + TR(" Error in 16bit IPV4 Header Checksum \n"); + gmacdev->synopGMACNetStats.rx_ip_header_errors++; + } + if (synopGMAC_is_rx_checksum_error(gmacdev, status) == RxLenLT600) + { + TR("IEEE 802.3 type frame with Length field Lesss than 0x0600 \n"); + } + if (synopGMAC_is_rx_checksum_error(gmacdev, status) == RxIpHdrPayLoadChkBypass) + { + TR("Ip header and TCP/UDP payload checksum Bypassed \n"); + } + if (synopGMAC_is_rx_checksum_error(gmacdev, status) == RxChkBypass) + { + TR("Ip header and TCP/UDP payload checksum Bypassed \n"); + } + if (synopGMAC_is_rx_checksum_error(gmacdev, status) == RxPayLoadChkError) + { + TR(" TCP/UDP payload checksum Error \n"); + gmacdev->synopGMACNetStats.rx_ip_payload_errors++; + } + if (synopGMAC_is_rx_checksum_error(gmacdev, status) == RxIpHdrPayLoadChkError) + { + //Linux Kernel doesnot care for ipv4 header checksum. So we will simply proceed by printing a warning .... + TR(" Both IP header and Payload Checksum Error \n"); + gmacdev->synopGMACNetStats.rx_ip_header_errors++; + gmacdev->synopGMACNetStats.rx_ip_payload_errors++; + } + } + *ppsPktFrame = (PKT_FRAME_T *)dma_addr1; +#if 0 +#ifdef CACHE_ON + memcpy((void *)pu8rb, (void *)((u32)dma_addr1 | UNCACHEABLE), len); +#else + memcpy((void *)pu8rb, (void *)((u32)dma_addr1), len); +#endif + if (prevtx != NULL) + { +#ifdef CACHE_ON + memcpy((void *)pu8rb + len, (void *)((u32)(dma_addr1 | UNCACHEABLE) + len), 4); +#else + memcpy((void *)pu8rb + len, (void *)((u32)dma_addr1 + len), 4); +#endif + } +// rb->rdy = 1; +// rb->len = len; +#endif + gmacdev->synopGMACNetStats.rx_packets++; + gmacdev->synopGMACNetStats.rx_bytes += len; + if (status & DescRxTSAvailable) + { + gmacdev->rx_sec = time_stamp_high; + gmacdev->rx_subsec = time_stamp_low; + } + else + { + gmacdev->rx_sec = 0; + gmacdev->rx_subsec = 0; + } + return len; + } // if ( synopGMAC_is_rx_desc_valid(status) ) + else + { + /*Now the present skb should be set free*/ + TR("s: %08x\n", status); + gmacdev->synopGMACNetStats.rx_errors++; + gmacdev->synopGMACNetStats.collisions += synopGMAC_is_rx_frame_collision(status); + gmacdev->synopGMACNetStats.rx_crc_errors += synopGMAC_is_rx_crc(status); + gmacdev->synopGMACNetStats.rx_frame_errors += synopGMAC_is_frame_dribbling_errors(status); + gmacdev->synopGMACNetStats.rx_length_errors += synopGMAC_is_rx_frame_length_errors(status); + } + + } // /*Handle the Receive Descriptors*/ + + return 0; +} + +// mode 0: 1000Mbps, 1: 100Mbps, 2: 10Mbps +void synopGMAC_set_mode(synopGMACdevice *gmacdev, int mode) +{ + // Must stop Tx/Rx before change speed/mode + synopGMAC_tx_disable(gmacdev); + synopGMAC_rx_disable(gmacdev); + switch (mode) + { + case SPEED1000: + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacMiiGmii); + gmacdev->Speed = SPEED1000; + break; + case SPEED100: + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacMiiGmii); + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacFESpeed100); + gmacdev->Speed = SPEED100; + break; + case SPEED10: + synopGMACSetBits(gmacdev->MacBase, GmacConfig, GmacMiiGmii); + synopGMACClearBits(gmacdev->MacBase, GmacConfig, GmacFESpeed100); + gmacdev->Speed = SPEED10; + default: + break; + } + synopGMAC_tx_enable(gmacdev); + synopGMAC_rx_enable(gmacdev); +} diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_network_interface.h b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_network_interface.h new file mode 100644 index 0000000000..dad081209e --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_network_interface.h @@ -0,0 +1,54 @@ +/* =================================================================================== + * Copyright (c) <2009> Synopsys, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software annotated with this license and associated documentation files + * (the "Software"), to deal in the Software without restriction, including without + * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * =================================================================================== */ + +/** \file + * Header file for the nework dependent functionality. + * The function prototype listed here are linux dependent. + * + * \internal + * ---------------------------REVISION HISTORY------------------- + * Synopsys 01/Aug/2007 Created + */ +#ifndef SYNOP_GMAC_NETWORK_INTERFACE_H +#define SYNOP_GMAC_NETWORK_INTERFACE_H 1 + +#include "synopGMAC_Dev.h" +#define TEST_RGMII +//#define TEST_RMII +#define CACHE_ON + +/** Tx/Rx buffer structure */ +typedef struct +{ + uint8_t au8Buf[PKT_FRAME_BUF_SIZE]; +} PKT_FRAME_T; + +s32 synopGMAC_setup_tx_desc_queue(synopGMACdevice *gmacdev, DmaDesc *first_desc, u32 no_of_desc, u32 desc_mode); +s32 synopGMAC_setup_rx_desc_queue(synopGMACdevice *gmacdev, DmaDesc *first_desc, u32 no_of_desc, u32 desc_mode); +s32 synopGMAC_xmit_frames(synopGMACdevice *gmacdev, u8 *pkt_data, u32 pkt_len, u32 offload_needed, u32 ts); +s32 synop_handle_received_data(synopGMACdevice *gmacdev, PKT_FRAME_T **ppsPktFrame); +void synop_handle_transmit_over(synopGMACdevice *gmacdev); +void synopGMAC_set_mode(synopGMACdevice *gmacdev, int mode); +void synopGMAC_powerup_mac(synopGMACdevice *gmacdev); +void synopGMAC_powerdown_mac(synopGMACdevice *gmacdev); + +#endif /* End of file */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_plat.c b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_plat.c new file mode 100644 index 0000000000..b483979c91 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_plat.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-24 Wayne first version + */ + +#include "synopGMAC_plat.h" + +void plat_delay(u32 delay) +{ + volatile u32 loop = delay; + while (loop--); +} + +u32 synopGMACReadReg(u32 RegBase, u32 RegOffset) +{ + u32 addr = RegBase + RegOffset; + u32 data = *((volatile u32 *)addr); + +#if SYNOP_REG_DEBUG + TR("%s RegBase = 0x%08x RegOffset = 0x%08x RegData = 0x%08x\n", __FUNCTION__, (u32)RegBase, RegOffset, data); +#endif + + return data; +} + +void synopGMACWriteReg(u32 RegBase, u32 RegOffset, u32 RegData) +{ + u32 addr = RegBase + (u32)RegOffset; + +#if SYNOP_REG_DEBUG + TR("%s RegBase = 0x%08x RegOffset = 0x%08x RegData = 0x%08x\n", __FUNCTION__, (u32) RegBase, RegOffset, RegData); +#endif + + *((volatile u32 *)addr) = RegData; + + return; +} + +void synopGMACSetBits(u32 RegBase, u32 RegOffset, u32 BitPos) +{ + u32 data = synopGMACReadReg(RegBase, RegOffset) | BitPos; + + synopGMACWriteReg(RegBase, RegOffset, data); + +#if SYNOP_REG_DEBUG + TR("%s !!!!!!!!!!!!! RegOffset = 0x%08x RegData = 0x%08x\n", __FUNCTION__, RegOffset, data); +#endif + + return; +} + +void synopGMACClearBits(u32 RegBase, u32 RegOffset, u32 BitPos) +{ + u32 data = synopGMACReadReg(RegBase, RegOffset) & (~BitPos); + + synopGMACWriteReg(RegBase, RegOffset, data); + +#if SYNOP_REG_DEBUG + TR("%s !!!!!!!!!!!!! RegOffset = 0x%08x RegData = 0x%08x\n", __FUNCTION__, RegOffset, data); +#endif + + return; +} + +bool synopGMACCheckBits(u32 RegBase, u32 RegOffset, u32 BitPos) +{ + u32 data = synopGMACReadReg(RegBase, RegOffset) & BitPos; + + if (data) + return true; + else + return false; +} diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_plat.h b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_plat.h new file mode 100644 index 0000000000..cf0b85c5bb --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_plat.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-24 Wayne first version + */ + +#ifndef SYNOP_GMAC_PLAT_H +#define SYNOP_GMAC_PLAT_H 1 + +#include +#include "synopGMAC_types.h" +#include "drv_common.h" + +#define DEFAULT_DELAY_VARIABLE 10 +#define DEFAULT_LOOP_VARIABLE 1000 + +/* Error Codes */ +#define ESYNOPGMACNOERR 0 +#define ESYNOPGMACNOMEM 1 +#define ESYNOPGMACPHYERR 2 +#define ESYNOPGMACBUSY 3 + +#define TR0(fmt, args...) rt_kprintf("SynopGMAC: " fmt, ##args) + +//#define DEBUG +#ifdef DEBUG + #undef TR + #define TR(fmt, args...) rt_kprintf("SynopGMAC: " fmt, ##args) +#else + #define TR(fmt, args...) /* not debugging: nothing */ +#endif + +u32 synopGMACReadReg(u32 RegBase, u32 RegOffset); +void synopGMACWriteReg(u32 RegBase, u32 RegOffset, u32 RegData); +void synopGMACSetBits(u32 RegBase, u32 RegOffset, u32 BitPos); +void synopGMACClearBits(u32 RegBase, u32 RegOffset, u32 BitPos); +bool synopGMACCheckBits(u32 RegBase, u32 RegOffset, u32 BitPos); +void plat_delay(u32); + +#endif diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_types.h b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_types.h new file mode 100644 index 0000000000..9f8f081aa9 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/gmac/synopGMAC_types.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017-08-24 chinesebear first version + */ + +#ifndef __TYPES__H +#define __TYPES__H + +typedef unsigned char uint8_t; +typedef unsigned long long u64; +typedef unsigned int u32; +typedef unsigned short u16; +typedef unsigned char u8; +typedef signed int s32; + +typedef int bool; +enum synopGMAC_boolean +{ + false = 0, + true = 1 +}; + +//typedef u32 dma_addr_t; +typedef u32 *dma_addr_t; + +#endif /*__TYPES__H*/ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/nu_clock_init.c b/bsp/nuvoton/libraries/ma35/rtt_port/nu_clock_init.c new file mode 100644 index 0000000000..228a704f7b --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/nu_clock_init.c @@ -0,0 +1,398 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-6-1 Wayne First version +* +******************************************************************************/ + +#include "board.h" + +static void nu_clock_uart_init(void) +{ +#if defined(BSP_USING_UART0) + CLK_EnableModuleClock(UART0_MODULE); + CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL2_UART0SEL_HXT, CLK_CLKDIV1_UART0(1)); +#endif +#if defined(BSP_USING_UART1) + CLK_EnableModuleClock(UART1_MODULE); + CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL2_UART1SEL_HXT, CLK_CLKDIV1_UART1(1)); +#endif +#if defined(BSP_USING_UART2) + CLK_EnableModuleClock(UART2_MODULE); + CLK_SetModuleClock(UART2_MODULE, CLK_CLKSEL2_UART2SEL_HXT, CLK_CLKDIV1_UART2(1)); +#endif +#if defined(BSP_USING_UART3) + CLK_EnableModuleClock(UART3_MODULE); + CLK_SetModuleClock(UART3_MODULE, CLK_CLKSEL2_UART3SEL_HXT, CLK_CLKDIV1_UART3(1)); +#endif +#if defined(BSP_USING_UART4) + CLK_EnableModuleClock(UART4_MODULE); + CLK_SetModuleClock(UART4_MODULE, CLK_CLKSEL2_UART4SEL_HXT, CLK_CLKDIV1_UART4(1)); +#endif +#if defined(BSP_USING_UART5) + CLK_EnableModuleClock(UART5_MODULE); + CLK_SetModuleClock(UART5_MODULE, CLK_CLKSEL2_UART5SEL_HXT, CLK_CLKDIV1_UART5(1)); +#endif +#if defined(BSP_USING_UART6) + CLK_EnableModuleClock(UART6_MODULE); + CLK_SetModuleClock(UART6_MODULE, CLK_CLKSEL2_UART6SEL_HXT, CLK_CLKDIV1_UART6(1)); +#endif +#if defined(BSP_USING_UART7) + CLK_EnableModuleClock(UART7_MODULE); + CLK_SetModuleClock(UART7_MODULE, CLK_CLKSEL2_UART7SEL_HXT, CLK_CLKDIV1_UART7(1)); +#endif +#if defined(BSP_USING_UART8) + CLK_EnableModuleClock(UART8_MODULE); + CLK_SetModuleClock(UART8_MODULE, CLK_CLKSEL3_UART8SEL_HXT, CLK_CLKDIV1_UART8(1)); +#endif +#if defined(BSP_USING_UART9) + CLK_EnableModuleClock(UART9_MODULE); + CLK_SetModuleClock(UART9_MODULE, CLK_CLKSEL3_UART9SEL_HXT, CLK_CLKDIV2_UART9(1)); +#endif +#if defined(BSP_USING_UART10) + CLK_EnableModuleClock(UART10_MODULE); + CLK_SetModuleClock(UART10_MODULE, CLK_CLKSEL3_UART10SEL_HXT, CLK_CLKDIV2_UART10(1)); +#endif +#if defined(BSP_USING_UART11) + CLK_EnableModuleClock(UART11_MODULE); + CLK_SetModuleClock(UART11_MODULE, CLK_CLKSEL3_UART11SEL_HXT, CLK_CLKDIV2_UART11(1)); +#endif +#if defined(BSP_USING_UART12) + CLK_EnableModuleClock(UART12_MODULE); + CLK_SetModuleClock(UART12_MODULE, CLK_CLKSEL3_UART12SEL_HXT, CLK_CLKDIV3_UART12(1)); +#endif +#if defined(BSP_USING_UART13) + CLK_EnableModuleClock(UART13_MODULE); + CLK_SetModuleClock(UART13_MODULE, CLK_CLKSEL3_UART13SEL_HXT, CLK_CLKDIV3_UART13(1)); +#endif +#if defined(BSP_USING_UART14) + CLK_EnableModuleClock(UART14_MODULE); + CLK_SetModuleClock(UART14_MODULE, CLK_CLKSEL3_UART14SEL_HXT, CLK_CLKDIV3_UART14(1)); +#endif +#if defined(BSP_USING_UART15) + CLK_EnableModuleClock(UART15_MODULE); + CLK_SetModuleClock(UART15_MODULE, CLK_CLKSEL3_UART15SEL_HXT, CLK_CLKDIV3_UART15(1)); +#endif +#if defined(BSP_USING_UART16) + CLK_EnableModuleClock(UART16_MODULE); + CLK_SetModuleClock(UART16_MODULE, CLK_CLKSEL3_UART16SEL_HXT, CLK_CLKDIV3_UART16(1)); +#endif +} + +static void nu_clock_pdma_init(void) +{ +#if defined(BSP_USING_PDMA0) + CLK_EnableModuleClock(PDMA0_MODULE); +#endif +#if defined(BSP_USING_PDMA1) + CLK_EnableModuleClock(PDMA1_MODULE); +#endif +#if defined(BSP_USING_PDMA2) + CLK_EnableModuleClock(PDMA2_MODULE); +#endif +#if defined(BSP_USING_PDMA3) + CLK_EnableModuleClock(PDMA3_MODULE); +#endif +} + +static void nu_clock_gpio_init(void) +{ +#if defined(BSP_USING_GPIO) + CLK_EnableModuleClock(GPA_MODULE); + CLK_EnableModuleClock(GPB_MODULE); + CLK_EnableModuleClock(GPC_MODULE); + CLK_EnableModuleClock(GPD_MODULE); + CLK_EnableModuleClock(GPE_MODULE); + CLK_EnableModuleClock(GPF_MODULE); + CLK_EnableModuleClock(GPG_MODULE); + CLK_EnableModuleClock(GPH_MODULE); + CLK_EnableModuleClock(GPI_MODULE); + CLK_EnableModuleClock(GPJ_MODULE); + CLK_EnableModuleClock(GPK_MODULE); + CLK_EnableModuleClock(GPL_MODULE); + CLK_EnableModuleClock(GPM_MODULE); + CLK_EnableModuleClock(GPN_MODULE); +#endif +} + +static void nu_clock_qspi_init(void) +{ +#if defined(BSP_USING_QSPI0) + CLK_EnableModuleClock(QSPI0_MODULE); + CLK_SetModuleClock(QSPI0_MODULE, CLK_CLKSEL4_QSPI0SEL_PCLK0, MODULE_NoMsk); +#endif +#if defined(BSP_USING_QSPI1) + CLK_EnableModuleClock(QSPI1_MODULE); + CLK_SetModuleClock(QSPI1_MODULE, CLK_CLKSEL4_QSPI1SEL_PCLK0, MODULE_NoMsk); +#endif +} + +static void nu_clock_spi_init(void) +{ +#if defined(BSP_USING_SPI0) + CLK_EnableModuleClock(SPI0_MODULE); + CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL4_SPI0SEL_PCLK1, MODULE_NoMsk); +#endif +#if defined(BSP_USING_SPI1) + CLK_EnableModuleClock(SPI1_MODULE); + CLK_SetModuleClock(SPI1_MODULE, CLK_CLKSEL4_SPI1SEL_PCLK2, MODULE_NoMsk); +#endif +#if defined(BSP_USING_SPI2) + CLK_EnableModuleClock(SPI2_MODULE); + CLK_SetModuleClock(SPI2_MODULE, CLK_CLKSEL4_SPI2SEL_PCLK1, MODULE_NoMsk); +#endif +#if defined(BSP_USING_SPI3) + CLK_EnableModuleClock(SPI3_MODULE); + CLK_SetModuleClock(SPI3_MODULE, CLK_CLKSEL4_SPI3SEL_PCLK2, MODULE_NoMsk); +#endif +} + +static void nu_clock_i2c_init(void) +{ +#if defined(BSP_USING_I2C0) + CLK_EnableModuleClock(I2C0_MODULE); +#endif +#if defined(BSP_USING_I2C1) + CLK_EnableModuleClock(I2C1_MODULE); +#endif +#if defined(BSP_USING_I2C2) + CLK_EnableModuleClock(I2C2_MODULE); +#endif +#if defined(BSP_USING_I2C3) + CLK_EnableModuleClock(I2C3_MODULE); +#endif +#if defined(BSP_USING_I2C4) + CLK_EnableModuleClock(I2C4_MODULE); +#endif +#if defined(BSP_USING_I2C5) + CLK_EnableModuleClock(I2C5_MODULE); +#endif +} + +static void nu_clock_epwm_init(void) +{ +#if defined(BSP_USING_EPWM0) + CLK_EnableModuleClock(EPWM0_MODULE); +#endif +#if defined(BSP_USING_EPWM1) + CLK_EnableModuleClock(EPWM1_MODULE); +#endif +#if defined(BSP_USING_EPWM2) + CLK_EnableModuleClock(EPWM2_MODULE); +#endif +} + +static void nu_clock_i2s_init(void) +{ +#if defined(BSP_USING_I2S0) + CLK_EnableModuleClock(I2S0_MODULE); + CLK_SetModuleClock(I2S0_MODULE, CLK_CLKSEL4_I2S0SEL_SYSCLK1_DIV2, MODULE_NoMsk); +#endif +#if defined(BSP_USING_I2S1) + CLK_EnableModuleClock(I2S1_MODULE); + CLK_SetModuleClock(I2S1_MODULE, CLK_CLKSEL4_I2S1SEL_SYSCLK1_DIV2, MODULE_NoMsk); +#endif +} + +void nu_clock_timer_init(void) +{ +#if defined(BSP_USING_TMR0) + CLK_EnableModuleClock(TMR0_MODULE); + CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT, MODULE_NoMsk); +#endif +#if defined(BSP_USING_TMR1) + CLK_EnableModuleClock(TMR1_MODULE); + CLK_SetModuleClock(TMR1_MODULE, CLK_CLKSEL1_TMR1SEL_HXT, MODULE_NoMsk); +#endif +#if defined(BSP_USING_TMR2) + CLK_EnableModuleClock(TMR2_MODULE); + CLK_SetModuleClock(TMR2_MODULE, CLK_CLKSEL1_TMR2SEL_HXT, MODULE_NoMsk); +#endif +#if defined(BSP_USING_TMR3) + CLK_EnableModuleClock(TMR3_MODULE); + CLK_SetModuleClock(TMR3_MODULE, CLK_CLKSEL1_TMR3SEL_HXT, MODULE_NoMsk); +#endif +#if defined(BSP_USING_TMR4) + CLK_EnableModuleClock(TMR4_MODULE); + CLK_SetModuleClock(TMR4_MODULE, CLK_CLKSEL1_TMR4SEL_HXT, MODULE_NoMsk); +#endif +#if defined(BSP_USING_TMR5) + CLK_EnableModuleClock(TMR5_MODULE); + CLK_SetModuleClock(TMR5_MODULE, CLK_CLKSEL1_TMR5SEL_HXT, MODULE_NoMsk); +#endif +#if defined(BSP_USING_TMR6) + CLK_EnableModuleClock(TMR6_MODULE); + CLK_SetModuleClock(TMR6_MODULE, CLK_CLKSEL1_TMR6SEL_HXT, MODULE_NoMsk); +#endif +#if defined(BSP_USING_TMR7) + CLK_EnableModuleClock(TMR7_MODULE); + CLK_SetModuleClock(TMR7_MODULE, CLK_CLKSEL1_TMR7SEL_HXT, MODULE_NoMsk); +#endif +#if defined(BSP_USING_TMR8) + CLK_EnableModuleClock(TMR8_MODULE); + CLK_SetModuleClock(TMR8_MODULE, CLK_CLKSEL2_TMR8SEL_HXT, MODULE_NoMsk); +#endif +#if defined(BSP_USING_TMR9) + CLK_EnableModuleClock(TMR9_MODULE); + CLK_SetModuleClock(TMR9_MODULE, CLK_CLKSEL2_TMR9SEL_HXT, MODULE_NoMsk); +#endif +#if defined(BSP_USING_TMR10) + CLK_EnableModuleClock(TMR10_MODULE); + CLK_SetModuleClock(TMR10_MODULE, CLK_CLKSEL2_TMR10SEL_HXT, MODULE_NoMsk); +#endif +#if defined(BSP_USING_TMR11) + CLK_EnableModuleClock(TMR11_MODULE); + CLK_SetModuleClock(TMR11_MODULE, CLK_CLKSEL2_TMR11SEL_HXT, MODULE_NoMsk); +#endif +} + +void nu_clock_wdt_init(void) +{ +#if defined(BSP_USING_WDT0) + CLK_EnableModuleClock(WDT0_MODULE); + CLK_SetModuleClock(WDT0_MODULE, CLK_CLKSEL3_WDT0SEL_PCLK3_DIV4096, MODULE_NoMsk); +#endif +#if defined(BSP_USING_WDT1) + CLK_EnableModuleClock(WDT1_MODULE); + CLK_SetModuleClock(WDT1_MODULE, CLK_CLKSEL3_WDT1SEL_PCLK3_DIV4096, MODULE_NoMsk); +#endif +#if defined(BSP_USING_WDT2) + CLK_EnableModuleClock(WDT2_MODULE); + CLK_SetModuleClock(WDT2_MODULE, CLK_CLKSEL3_WDT2SEL_PCLK3_DIV4096, MODULE_NoMsk); +#endif +} + +void nu_clock_canfd_init(void) +{ +#if defined(BSP_USING_CANFD0) + CLK_EnableModuleClock(CANFD0_MODULE); + CLK_SetModuleClock(CANFD0_MODULE, CLK_CLKSEL4_CANFD0SEL_APLL, CLK_CLKDIV0_CANFD0(1)); +#endif +#if defined(BSP_USING_CANFD1) + CLK_EnableModuleClock(CANFD1_MODULE); + CLK_SetModuleClock(CANFD1_MODULE, CLK_CLKSEL4_CANFD1SEL_APLL, CLK_CLKDIV0_CANFD1(1)); +#endif +#if defined(BSP_USING_CANFD2) + CLK_EnableModuleClock(CANFD2_MODULE); + CLK_SetModuleClock(CANFD2_MODULE, CLK_CLKSEL4_CANFD2SEL_APLL, CLK_CLKDIV0_CANFD2(1)); +#endif +#if defined(BSP_USING_CANFD3) + CLK_EnableModuleClock(CANFD3_MODULE); + CLK_SetModuleClock(CANFD3_MODULE, CLK_CLKSEL4_CANFD3SEL_APLL, CLK_CLKDIV0_CANFD3(1)); +#endif +} + +void nu_clock_sc_init(void) +{ +#if defined(BSP_USING_SCUART0) + CLK_EnableModuleClock(SC0_MODULE); + CLK_SetModuleClock(SC0_MODULE, CLK_CLKSEL4_SC0SEL_HXT, MODULE_NoMsk); +#endif +#if defined(BSP_USING_SCUART1) + CLK_EnableModuleClock(SC1_MODULE); + CLK_SetModuleClock(SC1_MODULE, CLK_CLKSEL4_SC1SEL_HXT, MODULE_NoMsk); +#endif +} + +void nu_clock_rtc_init(void) +{ +#if defined(BSP_USING_RTC) + CLK_EnableModuleClock(RTC_MODULE); +#endif +} + +#if !defined(USE_MA35D1_SUBM) + +static void nu_clock_usbd_init(void) +{ +} + +static void nu_clock_usbh_init(void) +{ +} + +static void nu_clock_gmac_init(void) +{ +#if defined(BSP_USING_GMAC0) + CLK_EnableModuleClock(GMAC0_MODULE); +#endif +#if defined(BSP_USING_GMAC1) + CLK_EnableModuleClock(GMAC1_MODULE); +#endif +} + +static void nu_clock_sdh_init(void) +{ +#if defined(BSP_USING_SDH0) + CLK_EnableModuleClock(SDH0_MODULE); +#endif +#if defined(BSP_USING_SDH1) + CLK_EnableModuleClock(SDH1_MODULE); +#endif +} + +static void nu_clock_disp_init(void) +{ +#if defined(BSP_USING_DISP) + CLK_EnableModuleClock(DCU_MODULE); + CLK_SetModuleClock(DCU_MODULE, CLK_CLKSEL0_DCUSEL_EPLL_DIV2, MODULE_NoMsk); + +// CLK_SetModuleClock(DCUP_MODULE, CLK_CLKSEL0_DCUPSEL_VPLL, MODULE_NoMsk); +#endif +} + +void nu_clock_base_init(void) +{ + /* Enable HXT, LXT */ + CLK->PWRCTL |= (CLK_PWRCTL_HXTEN_Msk | CLK_PWRCTL_HIRCEN_Msk | CLK_PWRCTL_LXTEN_Msk | CLK_PWRCTL_LIRCEN_Msk); + + /* Waiting clock ready */ + CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk); + + /* Waiting clock ready */ + CLK_WaitClockReady(CLK_STATUS_LXTSTB_Msk); + + /* Waiting clock ready */ + CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk); + + /* Waiting clock ready */ + CLK_WaitClockReady(CLK_STATUS_LIRCSTB_Msk); +} +#endif + +void nu_clock_init(void) +{ +#if !defined(USE_MA35D1_SUBM) + nu_clock_base_init(); + + nu_clock_gmac_init(); + nu_clock_sdh_init(); + nu_clock_usbd_init(); + nu_clock_usbh_init(); + nu_clock_disp_init(); +#endif + + nu_clock_pdma_init(); + nu_clock_gpio_init(); + nu_clock_uart_init(); + nu_clock_qspi_init(); + nu_clock_spi_init(); + nu_clock_i2c_init(); + nu_clock_epwm_init(); + nu_clock_i2s_init(); + nu_clock_canfd_init(); + nu_clock_sc_init(); + nu_clock_timer_init(); + nu_clock_wdt_init(); + nu_clock_rtc_init(); +} + +void nu_clock_deinit(void) +{ + +} diff --git a/bsp/nuvoton/libraries/n9h30/rtt_port/drv_adc.c b/bsp/nuvoton/libraries/n9h30/rtt_port/drv_adc.c index 9d87e28f22..eea201ea69 100644 --- a/bsp/nuvoton/libraries/n9h30/rtt_port/drv_adc.c +++ b/bsp/nuvoton/libraries/n9h30/rtt_port/drv_adc.c @@ -84,7 +84,7 @@ static void nu_adc_isr(int vector, void *param) volatile rt_int32_t isr, wkisr; nu_adc_t psNuAdc = (nu_adc_t)param; rt_int32_t irqidx; - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; //rt_kprintf("[%s %d] CTL: %08x CONF:%08x IER:%08x ISR:%08x\n", __func__, __LINE__, adc->CTL, adc->CONF, adc->IER, adc->ISR); @@ -142,7 +142,7 @@ static int32_t AdcMenuStartCallback(uint32_t status, uint32_t userData) nu_adc_t psNuAdc = (nu_adc_t)userData; #if defined(BSP_USING_ADC_TOUCH) - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; static struct nu_adc_touch_data point; static rt_bool_t bDrop = RT_FALSE; static uint32_t u32LastZ0 = 0xffffu; @@ -194,21 +194,23 @@ static int32_t AdcMenuStartCallback(uint32_t status, uint32_t userData) #if defined(BSP_USING_ADC_TOUCH) -static void nu_adc_touch_antiglitch(ADC_T* adc) +static void nu_adc_touch_antiglitch(ADC_T *adc) { int count = 10; - do { + do + { rt_hw_us_delay(1000); // 1ms - ADC_CLR_INT_FLAG(adc, adc->ISR); - if ( adc->ISR == 0 ) + ADC_CLR_INT_FLAG(adc, adc->ISR); + if (adc->ISR == 0) break; - } while(count-- > 0); + } + while (count-- > 0); } void nu_adc_touch_detect(rt_bool_t bStartDetect) { nu_adc_t psNuAdc = (nu_adc_t)&g_sNuADC; - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; /* Disable interrupt */ rt_hw_interrupt_mask(psNuAdc->irqn); @@ -217,13 +219,13 @@ void nu_adc_touch_detect(rt_bool_t bStartDetect) /* Disable interrupt */ ADC_DISABLE_INT(adc, ADC_IER_PEDEIEN_Msk | ADC_IER_MIEN_Msk); - nu_adc_touch_antiglitch(adc); + nu_adc_touch_antiglitch(adc); if (bStartDetect == RT_TRUE) { /* Switch to PenDown detection mode */ ADC_DETECT_PD_MODE(adc); - nu_adc_touch_antiglitch(adc); + nu_adc_touch_antiglitch(adc); /* Enable interrupt */ ADC_ENABLE_INT(adc, ADC_IER_PEDEIEN_Msk); @@ -232,7 +234,7 @@ void nu_adc_touch_detect(rt_bool_t bStartDetect) { /* Switch to XY coordination converting mode */ ADC_CONVERT_XY_MODE(adc); - nu_adc_touch_antiglitch(adc); + nu_adc_touch_antiglitch(adc); /* Enable interrupt */ ADC_ENABLE_INT(adc, ADC_IER_MIEN_Msk); @@ -272,7 +274,7 @@ rt_err_t nu_adc_touch_enable(rt_touch_t psRtTouch) { nu_adc_t psNuAdc = (nu_adc_t)&g_sNuADC; nu_adc_cb sNuAdcCb; - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; adc->CONF = 0x0; @@ -315,7 +317,7 @@ rt_err_t nu_adc_touch_disable(void) static void nu_adc_touch_smpl(void *p) { nu_adc_t psNuAdc = (nu_adc_t)p; - if ( psNuAdc->bReset ) + if (psNuAdc->bReset) { psNuAdc->bReset = 0; nu_adc_touch_detect(RT_FALSE); @@ -330,7 +332,7 @@ static rt_err_t _nu_adc_control(rt_device_t dev, int cmd, void *args) { rt_err_t ret = RT_EINVAL ; nu_adc_t psNuAdc = (nu_adc_t)dev; - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; nu_adc_cb_t psAdcCb = (nu_adc_cb_t)args; @@ -473,7 +475,7 @@ static rt_err_t _nu_adc_control(rt_device_t dev, int cmd, void *args) static rt_err_t _nu_adc_open(rt_device_t dev, rt_uint16_t oflag) { nu_adc_t psNuAdc = (nu_adc_t)dev; - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; /* Enable ADC engine clock */ nu_sys_ipclk_enable(psNuAdc->clkidx); @@ -499,7 +501,7 @@ static rt_err_t _nu_adc_open(rt_device_t dev, rt_uint16_t oflag) static rt_err_t _nu_adc_close(rt_device_t dev) { nu_adc_t psNuAdc = (nu_adc_t)dev; - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; /* Disable Normal AD Conversion */ _nu_adc_control(dev, NAC_OFF, RT_NULL); diff --git a/bsp/nuvoton/libraries/n9h30/rtt_port/drv_usbhost.c b/bsp/nuvoton/libraries/n9h30/rtt_port/drv_usbhost.c index 64e9dbf3ae..bb29de3ea0 100644 --- a/bsp/nuvoton/libraries/n9h30/rtt_port/drv_usbhost.c +++ b/bsp/nuvoton/libraries/n9h30/rtt_port/drv_usbhost.c @@ -20,6 +20,13 @@ #include "usb.h" #include "usbh_lib.h" +#define LOG_TAG "drv.usbhost" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_DBG +#define DBG_COLOR +#include + #if !defined(NU_USBHOST_HUB_POLLING_INTERVAL) #define NU_USBHOST_HUB_POLLING_INTERVAL (100) #endif @@ -30,6 +37,8 @@ #define NU_MAX_USBH_HUB_PORT_DEV USB_HUB_PORT_NUM +#define NU_USBHOST_HUB_POLLING_LOCK +#if defined(NU_USBHOST_HUB_POLLING_LOCK) #define NU_USBHOST_MUTEX_INIT() { \ s_sUSBHDev.lock = rt_mutex_create("usbhost_lock", RT_IPC_FLAG_PRIO); \ RT_ASSERT(s_sUSBHDev.lock != RT_NULL); \ @@ -44,6 +53,11 @@ rt_err_t result = rt_mutex_release(s_sUSBHDev.lock); \ RT_ASSERT(result == RT_EOK); \ } +#else +#define NU_USBHOST_MUTEX_INIT() +#define NU_USBHOST_LOCK() +#define NU_USBHOST_UNLOCK() +#endif /* Private typedef --------------------------------------------------------------*/ typedef struct nu_port_dev @@ -52,6 +66,7 @@ typedef struct nu_port_dev UDEV_T *pUDev; EP_INFO_T *apsEPInfo[NU_MAX_USBH_PIPE]; struct urequest asSetupReq[NU_MAX_USBH_PIPE]; + uint32_t u32SentLength[NU_MAX_USBH_PIPE]; struct rt_completion utr_completion; int port_num; rt_bool_t bEnumDone; @@ -91,6 +106,12 @@ GetRHPortControlFromPipe( { uinst_t inst; int port; + + if (!pipe || + !pipe->inst || + !pipe->inst->parent_hub) + return RT_NULL; + if (pipe->inst->parent_hub->is_roothub) { //case: device ---> root hub @@ -470,22 +491,30 @@ static int nu_int_xfer( int timeouts) { int ret; - int retry = 3; - while (retry > 0) + while (1) { ret = usbh_int_xfer(psUTR); - if (ret == 0) + if (ret < 0) + return ret; + + if (rt_completion_wait(&(psPortDev->utr_completion), timeouts) != 0) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("Request %08x Timeout in %d ms!!\n", psUTR, timeouts)); + usbh_quit_utr(psUTR); + + rt_completion_init(&(psPortDev->utr_completion)); + rt_thread_mdelay(1); + } + else + { + + RT_DEBUG_LOG(RT_DEBUG_USB, ("Transferring done %08x\n", psUTR)); + usbh_quit_utr(psUTR); break; - - RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_int_xfer ERROR: failed to submit interrupt request\n")); - rt_thread_delay((pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) > 0 ? (pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) : 1); - retry --; + } } - if (ret < 0) - return ret; - return 0; } @@ -497,30 +526,6 @@ static void xfer_done_cb(UTR_T *psUTR) rt_completion_done(&(psPortDev->utr_completion)); } -static void int_xfer_done_cb(UTR_T *psUTR) -{ - upipe_t pipe = (upipe_t)psUTR->context; - - if (psUTR->status != 0) - { - RT_DEBUG_LOG(RT_DEBUG_USB, ("Interrupt xfer failed %d\n", psUTR->status)); - goto exit_int_xfer_done_cb; - } - - if (pipe->callback != RT_NULL) - { - struct uhost_msg msg; - msg.type = USB_MSG_CALLBACK; - msg.content.cb.function = pipe->callback; - msg.content.cb.context = pipe; - rt_usbh_event_signal(&s_sUSBHDev.uhcd, &msg); - } - -exit_int_xfer_done_cb: - - free_utr(psUTR); -} - static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts) { S_NU_RH_PORT_CTRL *psPortCtrl; @@ -565,6 +570,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes { struct urequest *psSetup = (struct urequest *)buffer_nonch; RT_ASSERT(buffer_nonch != RT_NULL); + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] = 0; /* Read data from USB device. */ if (psSetup->request_type & USB_REQ_TYPE_DIR_IN) @@ -586,10 +592,35 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes //token == USBH_PID_DATA if (buffer_nonch && ((pipe->ep.bEndpointAddress & USB_DIR_MASK) == USB_DIR_IN)) { + struct urequest *psSetup = &psPortCtrl->asHubPortDev->asSetupReq[pipe->pipe_index]; + /* Read data from USB device. */ //Trigger USBHostLib Ctril_Xfer - ret = nu_ctrl_xfer(psPortDev, &psPortCtrl->asHubPortDev->asSetupReq[pipe->pipe_index], buffer_nonch, timeouts); - if (ret != nbytes) + /* + * Workaround: HCD driver can readback all bytes of setup.wLength, but not support single packet transferring. + */ + if (psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] == 0) + { + ret = nu_ctrl_xfer(psPortDev, psSetup, buffer_nonch, timeouts); + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] = ret; + if (ret > 0) + { + rt_memcpy(buffer, buffer_nonch, ret); + } + } + else + { + if (psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] < nbytes) + { + ret = 0; + } + else + { + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] -= nbytes; + ret = nbytes; + } + } + if (ret <= 0) goto exit_nu_pipe_xfer; } else @@ -599,7 +630,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes } //else i32XferLen = nbytes; - goto exit_nu_pipe_xfer; + goto exit_nu_pipe_xfer2; } // if ( pipe->ep.bmAttributes == USB_EP_ATTR_CONTROL ) else { @@ -634,9 +665,6 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes } else if (pipe->ep.bmAttributes == USB_EP_ATTR_INT) { - psUTR->func = int_xfer_done_cb; - psUTR->context = pipe; - if (nu_int_xfer(pipe, psPortDev, psUTR, timeouts) < 0) { RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_pipe_xfer ERROR: int transfer failed\n")); @@ -646,7 +674,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes { i32XferLen = nbytes; } - goto exit2_nu_pipe_xfer; + goto exit_nu_pipe_xfer; } else if (pipe->ep.bmAttributes == USB_EP_ATTR_ISOC) { @@ -685,19 +713,17 @@ failreport_nu_pipe_xfer: i32XferLen = psUTR->xfer_len; +exit_nu_pipe_xfer: + //Call callback if (pipe->callback != RT_NULL) { pipe->callback(pipe); } -exit_nu_pipe_xfer: - if (psUTR) free_utr(psUTR); -exit2_nu_pipe_xfer: - #if defined(BSP_USING_MMU) if ((nbytes) && (buffer_nonch != buffer)) @@ -709,6 +735,8 @@ exit2_nu_pipe_xfer: } #endif +exit_nu_pipe_xfer2: + NU_USBHOST_UNLOCK(); return i32XferLen; @@ -951,6 +979,6 @@ int nu_usbh_register(void) return 0; } -INIT_DEVICE_EXPORT(nu_usbh_register); +INIT_APP_EXPORT(nu_usbh_register); #endif diff --git a/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_demo.c b/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_demo.c index b0e5823f54..41426d2f8f 100644 --- a/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_demo.c +++ b/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_demo.c @@ -124,7 +124,7 @@ static rt_device_t ccap_sensor_init(ccap_grabber_context_t psGrabberContext, cca psCcapConfig->sPipeInfo_Planar.u32Width = psLcdInfo->width / 2; psCcapConfig->sPipeInfo_Planar.u32Height = psLcdInfo->height / 2; psCcapConfig->sPipeInfo_Planar.pu8FarmAddr = rt_malloc_align(psCcapConfig->sPipeInfo_Planar.u32Height * psCcapConfig->sPipeInfo_Planar.u32Width * 2, 32); - psCcapConfig->sPipeInfo_Planar.u32PixFmt = CCAP_PAR_PLNFMT_YUV422; + psCcapConfig->sPipeInfo_Planar.u32PixFmt = CCAP_PAR_PLNFMT_YUV420; //CCAP_PAR_PLNFMT_YUV422; psCcapConfig->u32Stride_Planar = psCcapConfig->sPipeInfo_Planar.u32Width; if (psCcapConfig->sPipeInfo_Planar.pu8FarmAddr == RT_NULL) @@ -354,6 +354,7 @@ static void ccap_grabber(void *parameter) goto exit_ccap_grabber; } + /* Get LCD Info */ ret = rt_device_control(psDevLcd, RTGRAPHIC_CTRL_GET_INFO, &sGrabberContext.sLcdInfo); if (ret != RT_EOK) { @@ -361,10 +362,13 @@ static void ccap_grabber(void *parameter) goto exit_ccap_grabber; } + /* Check panel type */ if (rt_device_control(psDevLcd, RTGRAPHIC_CTRL_PAN_DISPLAY, (void *)sGrabberContext.sLcdInfo.framebuffer) == RT_EOK) { /* Sync-type LCD panel, will draw to VRAM directly. */ + int pixfmt = RTGRAPHIC_PIXEL_FORMAT_RGB565; bDrawDirect = RT_TRUE; + rt_device_control(psDevLcd, RTGRAPHIC_CTRL_SET_MODE, (void *)&pixfmt); } else { @@ -372,6 +376,13 @@ static void ccap_grabber(void *parameter) bDrawDirect = RT_FALSE; } + ret = rt_device_control(psDevLcd, RTGRAPHIC_CTRL_GET_INFO, &sGrabberContext.sLcdInfo); + if (ret != RT_EOK) + { + LOG_E("Can't get LCD info %s", psGrabberParam->devname_lcd); + goto exit_ccap_grabber; + } + LOG_I("LCD Type: %s-type", bDrawDirect ? "Sync" : "MPU"); LOG_I("LCD Width: %d", sGrabberContext.sLcdInfo.width); LOG_I("LCD Height: %d", sGrabberContext.sLcdInfo.height); @@ -431,19 +442,17 @@ static void ccap_grabber(void *parameter) rt_device_control(psDevLcd, RTGRAPHIC_CTRL_RECT_UPDATE, &sRectInfo); } - else + else if (!DEF_GRID_VIEW) { - int i32FBSize = sGrabberContext.sLcdInfo.width * sGrabberContext.sLcdInfo.height * (sGrabberContext.sLcdInfo.bits_per_pixel / 8); + int i32FBSize = sGrabberContext.sLcdInfo.width * sGrabberContext.sLcdInfo.height * (sGrabberContext.sLcdInfo.bits_per_pixel >> 3); int i32VRAMPiece = sGrabberContext.sLcdInfo.smem_len / i32FBSize; ccap_config sCcapConfig = {0}; - // Pan to next view by grab0 - if (!DEF_GRID_VIEW || !rt_strcmp(psGrabberParam->thread_name, "grab0")) - { - uint32_t u32BufPtr = (uint32_t)sGrabberContext.sCcapConfig.sPipeInfo_Packet.pu8FarmAddr - + (sGrabberContext.u32FrameEnd % i32VRAMPiece) * i32FBSize; - rt_device_control(psDevLcd, RTGRAPHIC_CTRL_PAN_DISPLAY, (void *)u32BufPtr); - } + uint32_t u32BufPtr = (uint32_t)sGrabberContext.sCcapConfig.sPipeInfo_Packet.pu8FarmAddr + + (sGrabberContext.u32FrameEnd % i32VRAMPiece) * i32FBSize; + + /* Pan to valid frame address. */ + rt_device_control(psDevLcd, RTGRAPHIC_CTRL_PAN_DISPLAY, (void *)u32BufPtr); sCcapConfig.sPipeInfo_Packet.pu8FarmAddr = sGrabberContext.sCcapConfig.sPipeInfo_Packet.pu8FarmAddr + ((sGrabberContext.u32FrameEnd + 1) % i32VRAMPiece) * i32FBSize ; @@ -473,7 +482,18 @@ static void ccap_grabber(void *parameter) if ((now - last) >= (DEF_DURATION * 1000)) { #if DEF_ENABLE_PLANAR_PIPE - ccap_save_planar_frame(psGrabberParam->thread_name, now, (const void *)sGrabberContext.sCcapConfig.sPipeInfo_Planar.pu8FarmAddr, sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32Width * sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32Height * 2); + { + uint32_t u32Factor = 0; + if (sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32PixFmt == CCAP_PAR_PLNFMT_YUV420) + u32Factor = 3; + else if (sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32PixFmt == CCAP_PAR_PLNFMT_YUV422) + u32Factor = 4; + + if (u32Factor > 0) + { + ccap_save_planar_frame(psGrabberParam->thread_name, now, (const void *)sGrabberContext.sCcapConfig.sPipeInfo_Planar.pu8FarmAddr, sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32Width * sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32Height * u32Factor / 2); + } + } #endif LOG_I("%s: %d FPS", psGrabberParam->devname_ccap, sGrabberContext.u32FrameEnd / DEF_DURATION); sGrabberContext.u32FrameEnd = 0; @@ -519,4 +539,4 @@ int ccap_demo(void) return 0; } MSH_CMD_EXPORT(ccap_demo, camera capture demo); -INIT_APP_EXPORT(ccap_demo); +//INIT_APP_EXPORT(ccap_demo); diff --git a/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_sensor.c b/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_sensor.c index 50d5d2f654..8b78514a09 100644 --- a/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_sensor.c +++ b/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_sensor.c @@ -333,26 +333,23 @@ rt_err_t ccap_sensor_register(struct rt_device *device, const char *name, void * return rt_device_register(device, name, RT_DEVICE_FLAG_RDONLY | RT_DEVICE_FLAG_STANDALONE); } -rt_err_t nu_ccap_sensor_create(ccap_sensor_io *psIo, ccap_sensor_id evSensorId) +rt_err_t nu_ccap_sensor_create(ccap_sensor_io *psIo, ccap_sensor_id evSensorId, const char *szName) { static int i32AllocatedSensorId = 0; - char szSensor[16]; rt_err_t ret = -RT_ERROR; ccap_sensor_dev_t pdev = RT_NULL; RT_ASSERT(psIo); RT_ASSERT((evSensorId >= 0) && (evSensorId < evCCAPSNR_CNT)); - rt_snprintf(szSensor, sizeof(szSensor), "sensor%d", i32AllocatedSensorId); - switch (evSensorId) { case evCCAPSNR_HM1055: - pdev = nu_create_hm1055(psIo, szSensor); + pdev = nu_create_hm1055(psIo, szName); break; case evCCAPSNR_ADV728X: - pdev = nu_create_adv728x(psIo, szSensor); + pdev = nu_create_adv728x(psIo, szName); break; default: diff --git a/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_sensor.h b/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_sensor.h index f7756ca7df..6fe5af24a3 100644 --- a/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_sensor.h +++ b/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_sensor.h @@ -94,8 +94,8 @@ typedef ccap_sensor_dev *ccap_sensor_dev_t; rt_err_t ccap_sensor_i2c_write(struct rt_i2c_bus_device *i2cdev, rt_uint16_t addr, rt_uint8_t *puBuf, int i32BufLen); rt_err_t ccap_sensor_i2c_read(struct rt_i2c_bus_device *i2cdev, rt_uint16_t addr, rt_uint8_t *puWBuf, int i32WBufLen, rt_uint8_t *puRBuf, int i32RBufLen); -rt_err_t nu_ccap_sensor_create(ccap_sensor_io *psIo, ccap_sensor_id evSensorId); rt_err_t ccap_sensor_register(struct rt_device *device, const char *name, void *user_data); +rt_err_t nu_ccap_sensor_create(ccap_sensor_io *psIo, ccap_sensor_id evSensorId, const char *szName); ccap_sensor_dev_t nu_create_hm1055(ccap_sensor_io *psIo, const char *szName); ccap_sensor_dev_t nu_create_adv728x(ccap_sensor_io *psIo, const char *szName); diff --git a/bsp/nuvoton/libraries/nuc980/rtt_port/drv_adc.c b/bsp/nuvoton/libraries/nuc980/rtt_port/drv_adc.c index 9d87e28f22..eea201ea69 100644 --- a/bsp/nuvoton/libraries/nuc980/rtt_port/drv_adc.c +++ b/bsp/nuvoton/libraries/nuc980/rtt_port/drv_adc.c @@ -84,7 +84,7 @@ static void nu_adc_isr(int vector, void *param) volatile rt_int32_t isr, wkisr; nu_adc_t psNuAdc = (nu_adc_t)param; rt_int32_t irqidx; - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; //rt_kprintf("[%s %d] CTL: %08x CONF:%08x IER:%08x ISR:%08x\n", __func__, __LINE__, adc->CTL, adc->CONF, adc->IER, adc->ISR); @@ -142,7 +142,7 @@ static int32_t AdcMenuStartCallback(uint32_t status, uint32_t userData) nu_adc_t psNuAdc = (nu_adc_t)userData; #if defined(BSP_USING_ADC_TOUCH) - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; static struct nu_adc_touch_data point; static rt_bool_t bDrop = RT_FALSE; static uint32_t u32LastZ0 = 0xffffu; @@ -194,21 +194,23 @@ static int32_t AdcMenuStartCallback(uint32_t status, uint32_t userData) #if defined(BSP_USING_ADC_TOUCH) -static void nu_adc_touch_antiglitch(ADC_T* adc) +static void nu_adc_touch_antiglitch(ADC_T *adc) { int count = 10; - do { + do + { rt_hw_us_delay(1000); // 1ms - ADC_CLR_INT_FLAG(adc, adc->ISR); - if ( adc->ISR == 0 ) + ADC_CLR_INT_FLAG(adc, adc->ISR); + if (adc->ISR == 0) break; - } while(count-- > 0); + } + while (count-- > 0); } void nu_adc_touch_detect(rt_bool_t bStartDetect) { nu_adc_t psNuAdc = (nu_adc_t)&g_sNuADC; - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; /* Disable interrupt */ rt_hw_interrupt_mask(psNuAdc->irqn); @@ -217,13 +219,13 @@ void nu_adc_touch_detect(rt_bool_t bStartDetect) /* Disable interrupt */ ADC_DISABLE_INT(adc, ADC_IER_PEDEIEN_Msk | ADC_IER_MIEN_Msk); - nu_adc_touch_antiglitch(adc); + nu_adc_touch_antiglitch(adc); if (bStartDetect == RT_TRUE) { /* Switch to PenDown detection mode */ ADC_DETECT_PD_MODE(adc); - nu_adc_touch_antiglitch(adc); + nu_adc_touch_antiglitch(adc); /* Enable interrupt */ ADC_ENABLE_INT(adc, ADC_IER_PEDEIEN_Msk); @@ -232,7 +234,7 @@ void nu_adc_touch_detect(rt_bool_t bStartDetect) { /* Switch to XY coordination converting mode */ ADC_CONVERT_XY_MODE(adc); - nu_adc_touch_antiglitch(adc); + nu_adc_touch_antiglitch(adc); /* Enable interrupt */ ADC_ENABLE_INT(adc, ADC_IER_MIEN_Msk); @@ -272,7 +274,7 @@ rt_err_t nu_adc_touch_enable(rt_touch_t psRtTouch) { nu_adc_t psNuAdc = (nu_adc_t)&g_sNuADC; nu_adc_cb sNuAdcCb; - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; adc->CONF = 0x0; @@ -315,7 +317,7 @@ rt_err_t nu_adc_touch_disable(void) static void nu_adc_touch_smpl(void *p) { nu_adc_t psNuAdc = (nu_adc_t)p; - if ( psNuAdc->bReset ) + if (psNuAdc->bReset) { psNuAdc->bReset = 0; nu_adc_touch_detect(RT_FALSE); @@ -330,7 +332,7 @@ static rt_err_t _nu_adc_control(rt_device_t dev, int cmd, void *args) { rt_err_t ret = RT_EINVAL ; nu_adc_t psNuAdc = (nu_adc_t)dev; - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; nu_adc_cb_t psAdcCb = (nu_adc_cb_t)args; @@ -473,7 +475,7 @@ static rt_err_t _nu_adc_control(rt_device_t dev, int cmd, void *args) static rt_err_t _nu_adc_open(rt_device_t dev, rt_uint16_t oflag) { nu_adc_t psNuAdc = (nu_adc_t)dev; - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; /* Enable ADC engine clock */ nu_sys_ipclk_enable(psNuAdc->clkidx); @@ -499,7 +501,7 @@ static rt_err_t _nu_adc_open(rt_device_t dev, rt_uint16_t oflag) static rt_err_t _nu_adc_close(rt_device_t dev) { nu_adc_t psNuAdc = (nu_adc_t)dev; - ADC_T* adc = psNuAdc->base; + ADC_T *adc = psNuAdc->base; /* Disable Normal AD Conversion */ _nu_adc_control(dev, NAC_OFF, RT_NULL); diff --git a/bsp/nuvoton/libraries/nuc980/rtt_port/drv_usbhost.c b/bsp/nuvoton/libraries/nuc980/rtt_port/drv_usbhost.c index 64e9dbf3ae..bb29de3ea0 100644 --- a/bsp/nuvoton/libraries/nuc980/rtt_port/drv_usbhost.c +++ b/bsp/nuvoton/libraries/nuc980/rtt_port/drv_usbhost.c @@ -20,6 +20,13 @@ #include "usb.h" #include "usbh_lib.h" +#define LOG_TAG "drv.usbhost" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_DBG +#define DBG_COLOR +#include + #if !defined(NU_USBHOST_HUB_POLLING_INTERVAL) #define NU_USBHOST_HUB_POLLING_INTERVAL (100) #endif @@ -30,6 +37,8 @@ #define NU_MAX_USBH_HUB_PORT_DEV USB_HUB_PORT_NUM +#define NU_USBHOST_HUB_POLLING_LOCK +#if defined(NU_USBHOST_HUB_POLLING_LOCK) #define NU_USBHOST_MUTEX_INIT() { \ s_sUSBHDev.lock = rt_mutex_create("usbhost_lock", RT_IPC_FLAG_PRIO); \ RT_ASSERT(s_sUSBHDev.lock != RT_NULL); \ @@ -44,6 +53,11 @@ rt_err_t result = rt_mutex_release(s_sUSBHDev.lock); \ RT_ASSERT(result == RT_EOK); \ } +#else +#define NU_USBHOST_MUTEX_INIT() +#define NU_USBHOST_LOCK() +#define NU_USBHOST_UNLOCK() +#endif /* Private typedef --------------------------------------------------------------*/ typedef struct nu_port_dev @@ -52,6 +66,7 @@ typedef struct nu_port_dev UDEV_T *pUDev; EP_INFO_T *apsEPInfo[NU_MAX_USBH_PIPE]; struct urequest asSetupReq[NU_MAX_USBH_PIPE]; + uint32_t u32SentLength[NU_MAX_USBH_PIPE]; struct rt_completion utr_completion; int port_num; rt_bool_t bEnumDone; @@ -91,6 +106,12 @@ GetRHPortControlFromPipe( { uinst_t inst; int port; + + if (!pipe || + !pipe->inst || + !pipe->inst->parent_hub) + return RT_NULL; + if (pipe->inst->parent_hub->is_roothub) { //case: device ---> root hub @@ -470,22 +491,30 @@ static int nu_int_xfer( int timeouts) { int ret; - int retry = 3; - while (retry > 0) + while (1) { ret = usbh_int_xfer(psUTR); - if (ret == 0) + if (ret < 0) + return ret; + + if (rt_completion_wait(&(psPortDev->utr_completion), timeouts) != 0) + { + RT_DEBUG_LOG(RT_DEBUG_USB, ("Request %08x Timeout in %d ms!!\n", psUTR, timeouts)); + usbh_quit_utr(psUTR); + + rt_completion_init(&(psPortDev->utr_completion)); + rt_thread_mdelay(1); + } + else + { + + RT_DEBUG_LOG(RT_DEBUG_USB, ("Transferring done %08x\n", psUTR)); + usbh_quit_utr(psUTR); break; - - RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_int_xfer ERROR: failed to submit interrupt request\n")); - rt_thread_delay((pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) > 0 ? (pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) : 1); - retry --; + } } - if (ret < 0) - return ret; - return 0; } @@ -497,30 +526,6 @@ static void xfer_done_cb(UTR_T *psUTR) rt_completion_done(&(psPortDev->utr_completion)); } -static void int_xfer_done_cb(UTR_T *psUTR) -{ - upipe_t pipe = (upipe_t)psUTR->context; - - if (psUTR->status != 0) - { - RT_DEBUG_LOG(RT_DEBUG_USB, ("Interrupt xfer failed %d\n", psUTR->status)); - goto exit_int_xfer_done_cb; - } - - if (pipe->callback != RT_NULL) - { - struct uhost_msg msg; - msg.type = USB_MSG_CALLBACK; - msg.content.cb.function = pipe->callback; - msg.content.cb.context = pipe; - rt_usbh_event_signal(&s_sUSBHDev.uhcd, &msg); - } - -exit_int_xfer_done_cb: - - free_utr(psUTR); -} - static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts) { S_NU_RH_PORT_CTRL *psPortCtrl; @@ -565,6 +570,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes { struct urequest *psSetup = (struct urequest *)buffer_nonch; RT_ASSERT(buffer_nonch != RT_NULL); + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] = 0; /* Read data from USB device. */ if (psSetup->request_type & USB_REQ_TYPE_DIR_IN) @@ -586,10 +592,35 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes //token == USBH_PID_DATA if (buffer_nonch && ((pipe->ep.bEndpointAddress & USB_DIR_MASK) == USB_DIR_IN)) { + struct urequest *psSetup = &psPortCtrl->asHubPortDev->asSetupReq[pipe->pipe_index]; + /* Read data from USB device. */ //Trigger USBHostLib Ctril_Xfer - ret = nu_ctrl_xfer(psPortDev, &psPortCtrl->asHubPortDev->asSetupReq[pipe->pipe_index], buffer_nonch, timeouts); - if (ret != nbytes) + /* + * Workaround: HCD driver can readback all bytes of setup.wLength, but not support single packet transferring. + */ + if (psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] == 0) + { + ret = nu_ctrl_xfer(psPortDev, psSetup, buffer_nonch, timeouts); + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] = ret; + if (ret > 0) + { + rt_memcpy(buffer, buffer_nonch, ret); + } + } + else + { + if (psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] < nbytes) + { + ret = 0; + } + else + { + psPortCtrl->asHubPortDev->u32SentLength[pipe->pipe_index] -= nbytes; + ret = nbytes; + } + } + if (ret <= 0) goto exit_nu_pipe_xfer; } else @@ -599,7 +630,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes } //else i32XferLen = nbytes; - goto exit_nu_pipe_xfer; + goto exit_nu_pipe_xfer2; } // if ( pipe->ep.bmAttributes == USB_EP_ATTR_CONTROL ) else { @@ -634,9 +665,6 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes } else if (pipe->ep.bmAttributes == USB_EP_ATTR_INT) { - psUTR->func = int_xfer_done_cb; - psUTR->context = pipe; - if (nu_int_xfer(pipe, psPortDev, psUTR, timeouts) < 0) { RT_DEBUG_LOG(RT_DEBUG_USB, ("nu_pipe_xfer ERROR: int transfer failed\n")); @@ -646,7 +674,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes { i32XferLen = nbytes; } - goto exit2_nu_pipe_xfer; + goto exit_nu_pipe_xfer; } else if (pipe->ep.bmAttributes == USB_EP_ATTR_ISOC) { @@ -685,19 +713,17 @@ failreport_nu_pipe_xfer: i32XferLen = psUTR->xfer_len; +exit_nu_pipe_xfer: + //Call callback if (pipe->callback != RT_NULL) { pipe->callback(pipe); } -exit_nu_pipe_xfer: - if (psUTR) free_utr(psUTR); -exit2_nu_pipe_xfer: - #if defined(BSP_USING_MMU) if ((nbytes) && (buffer_nonch != buffer)) @@ -709,6 +735,8 @@ exit2_nu_pipe_xfer: } #endif +exit_nu_pipe_xfer2: + NU_USBHOST_UNLOCK(); return i32XferLen; @@ -951,6 +979,6 @@ int nu_usbh_register(void) return 0; } -INIT_DEVICE_EXPORT(nu_usbh_register); +INIT_APP_EXPORT(nu_usbh_register); #endif diff --git a/bsp/nuvoton/ma35-rtp/.config b/bsp/nuvoton/ma35-rtp/.config new file mode 100644 index 0000000000..24c4519665 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/.config @@ -0,0 +1,801 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# +CONFIG_USE_MA35D1_SUBM=y + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# 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_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=2048 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=2048 + +# +# kservice optimization +# +# CONFIG_RT_KSERVICE_USING_STDLIB is not set +# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set +# CONFIG_RT_USING_TINY_FFS is not set +# CONFIG_RT_KPRINTF_USING_LONGLONG is not set +CONFIG_RT_DEBUG=y +# CONFIG_RT_DEBUG_COLOR is not set +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG 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_SIGNALS is not set + +# +# 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 + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=256 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart16" +CONFIG_RT_VER_NUM=0x50000 +CONFIG_ARCH_ARM=y +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M4=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# 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_RT_USING_DFS is not set +# CONFIG_RT_USING_FAL is not set +# CONFIG_RT_USING_LWP is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +# 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 is not set +CONFIG_RT_SERIAL_RB_BUFSZ=256 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER 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_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_PWM 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_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB is not set +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# C/C++ and POSIX layer +# +CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 + +# +# 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 +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# 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 + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +CONFIG_RT_USING_ULOG=y +# CONFIG_ULOG_OUTPUT_LVL_A is not set +# CONFIG_ULOG_OUTPUT_LVL_E is not set +# CONFIG_ULOG_OUTPUT_LVL_W is not set +# CONFIG_ULOG_OUTPUT_LVL_I is not set +CONFIG_ULOG_OUTPUT_LVL_D=y +CONFIG_ULOG_OUTPUT_LVL=7 +CONFIG_ULOG_USING_ISR_LOG=y +CONFIG_ULOG_ASSERT_ENABLE=y +CONFIG_ULOG_LINE_BUF_SIZE=128 +# CONFIG_ULOG_USING_ASYNC_OUTPUT is not set + +# +# log format +# +# CONFIG_ULOG_OUTPUT_FLOAT is not set +CONFIG_ULOG_USING_COLOR=y +CONFIG_ULOG_OUTPUT_TIME=y +# CONFIG_ULOG_TIME_USING_TIMESTAMP is not set +CONFIG_ULOG_OUTPUT_LEVEL=y +CONFIG_ULOG_OUTPUT_TAG=y +# CONFIG_ULOG_OUTPUT_THREAD_NAME is not set +CONFIG_ULOG_BACKEND_USING_CONSOLE=y +# CONFIG_ULOG_BACKEND_USING_FILE is not set +# CONFIG_ULOG_USING_FILTER is not set +# CONFIG_ULOG_USING_SYSLOG is not set +CONFIG_RT_USING_UTEST=y +CONFIG_UTEST_THR_STACK_SIZE=4096 +CONFIG_UTEST_THR_PRIORITY=20 +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RT_LINK is not set +# CONFIG_RT_USING_VBUS is not set + +# +# RT-Thread Utestcases +# +CONFIG_RT_USING_UTESTCASES=y + +# +# Utest Self Testcase +# +CONFIG_UTEST_SELF_PASS_TC=y + +# +# Kernel Testcase +# +CONFIG_UTEST_SMALL_MEM_TC=y +# CONFIG_UTEST_IRQ_TC is not set +# CONFIG_UTEST_SEMAPHORE_TC is not set +# CONFIG_UTEST_EVENT_TC is not set +# CONFIG_UTEST_TIMER_TC is not set +# CONFIG_UTEST_MESSAGEQUEUE_TC is not set +# CONFIG_UTEST_SIGNAL_TC is not set +# CONFIG_UTEST_MUTEX_TC is not set +# CONFIG_UTEST_MAILBOX_TC is not set +# CONFIG_UTEST_THREAD_TC is not set + +# +# CPP11 Testcase +# +# CONFIG_UTEST_CPP11_THREAD_TC is not set + +# +# Utest Serial Testcase +# +# CONFIG_UTEST_SERIAL_TC is not set + +# +# RTT Posix Testcase +# +# CONFIG_RTT_POSIX_TESTCASE is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LWIP is not set +# 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_LIBMODBUS is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# 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_EZ_IOT_OS is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# 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_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_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 + +# +# 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 + +# +# 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 + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# 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 + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# 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 + +# +# PainterEngine: A cross-platform graphics application framework written in C language +# +# CONFIG_PKG_USING_PAINTERENGINE is not set +# CONFIG_PKG_USING_PAINTERENGINE_AUX 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_PERSIMMON is not set + +# +# 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_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ULOG_FILE 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_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set + +# +# 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 + +# +# 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 + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set + +# +# 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 +# CONFIG_PKG_USING_RTDUINO is not set +# CONFIG_PKG_USING_FREERTOS_WRAPPER 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_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_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 + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ESP_IDF is not set +# CONFIG_PKG_USING_ICM20608 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_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK 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_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_TOUCH_DRIVERS is not set +# CONFIG_PKG_USING_MAX17048 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_EMBARC_BSP 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_PAJ7620 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_STM32WB55_SDK 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_BLUETRUM_SDK 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_BL_MCU_SDK is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set + +# +# 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 + +# +# miscellaneous packages +# + +# +# 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 + +# +# 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_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_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_DIGITALCTRL 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_UKAL 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 + +# +# Hardware Drivers Config +# + +# +# On-chip Peripheral Drivers +# +CONFIG_SOC_SERIES_MA35D1=y +# CONFIG_BSP_USE_STDDRIVER_SOURCE is not set +CONFIG_BSP_USING_PDMA=y +CONFIG_BSP_USING_PDMA2=y +CONFIG_BSP_USING_PDMA3=y +CONFIG_NU_PDMA_MEMFUN_ACTOR_MAX=2 +CONFIG_BSP_USING_GPIO=y +# CONFIG_BSP_USING_RTC is not set +# CONFIG_BSP_USING_EADC is not set +# CONFIG_BSP_USING_TMR is not set +CONFIG_BSP_USING_UART=y +# 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_UART8 is not set +# CONFIG_BSP_USING_UART9 is not set +# CONFIG_BSP_USING_UART10 is not set +# CONFIG_BSP_USING_UART11 is not set +# CONFIG_BSP_USING_UART12 is not set +# CONFIG_BSP_USING_UART13 is not set +# CONFIG_BSP_USING_UART14 is not set +# CONFIG_BSP_USING_UART15 is not set +CONFIG_BSP_USING_UART16=y +# CONFIG_BSP_USING_I2C is not set +# CONFIG_BSP_USING_CANFD is not set +# CONFIG_BSP_USING_EPWM is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_I2S is not set +# CONFIG_BSP_USING_QSPI is not set +# CONFIG_BSP_USING_SCUART is not set +# CONFIG_BSP_USING_ECAP is not set +# CONFIG_BSP_USING_QEI is not set +# CONFIG_BSP_USING_SOFT_I2C is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_EBI is not set + +# +# On-board Peripheral Drivers +# +CONFIG_BSP_USING_NULINKME=y + +# +# Board extended module drivers +# + +# +# Nuvoton Packages Config +# +CONFIG_NU_PKG_USING_UTILS=y +# CONFIG_NU_PKG_USING_DEMO is not set +# CONFIG_NU_PKG_USING_LVGL is not set +# CONFIG_NU_PKG_USING_BMX055 is not set +# CONFIG_NU_PKG_USING_MAX31875 is not set +# CONFIG_NU_PKG_USING_NCT7717U is not set +# CONFIG_NU_PKG_USING_NAU88L25 is not set +# CONFIG_NU_PKG_USING_NAU8822 is not set +# CONFIG_NU_PKG_USING_DA9062 is not set +# CONFIG_NU_PKG_USING_ILI9341 is not set +# CONFIG_NU_PKG_USING_SSD1963 is not set +# CONFIG_NU_PKG_USING_FSA506 is not set +# CONFIG_NU_PKG_USING_TPC is not set +# CONFIG_NU_PKG_USING_ADC_TOUCH is not set +# CONFIG_NU_PKG_USING_SPINAND is not set +CONFIG_UTEST_CMD_PREFIX="bsp.nuvoton.utest." +CONFIG_BOARD_USE_UTEST=y diff --git a/bsp/nuvoton/ma35-rtp/Kconfig b/bsp/nuvoton/ma35-rtp/Kconfig new file mode 100644 index 0000000000..03dd8ae611 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/Kconfig @@ -0,0 +1,27 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +# you can change the RTT_ROOT default "../../.." to your rtthread_root, +# example : default "F:/git_repositories/rt-thread" + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +config USE_MA35D1_SUBM + bool + default y + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "$BSP_DIR/board/Kconfig" diff --git a/bsp/nuvoton/ma35-rtp/Nu_Link_Driver.ini b/bsp/nuvoton/ma35-rtp/Nu_Link_Driver.ini new file mode 100644 index 0000000000..d089a0fa2a --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/Nu_Link_Driver.ini @@ -0,0 +1,1144 @@ +[Version] +Nu_LinkVersion=V5.20 +[Process] +ProcessID=0x00005940 +ProcessCreationTime_L=0x2e4bfd5d +ProcessCreationTime_H=0x01d8d183 +NuLinkID=0x7788538f +DisableFirmwareUpdate=0 +NuLinkIDs_Count=0x00000001 +NuLinkID0=0x7788538f +[ChipSelect] +;ChipName= +ChipName=M481 +[NUC505] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=NUC505_SPIFLASH.FLM +[NUC4xx] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=NUC400_AP_512.FLM +TraceConf0=0x00000002 +TraceConf1=0x014fb180 +TraceConf2=0x00000800 +TraceConf3=0x00000000 +TraceConf4=0x00000001 +TraceConf5=0x00000000 +[NUC2xx] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=NUC200_AP_128.FLM +[NUC1311] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=NUC1311_AP_64.FLM +[NUC126] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x2000 +ProgramAlgorithm=NUC126_AP_256.FLM +[NUC121] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=NUC121_AP_32.FLM +[NUC1xx] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=NUC100_AP_128.FLM +[NUC029] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x800 +ProgramAlgorithm=NUC029_AP_16.FLM +[NM1820] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x800 +ProgramAlgorithm=NM1820_AP_17_5.FLM +[NM1810] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x800 +ProgramAlgorithm=NM1810_AP_29_5.FLM +[NM1500] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=NM1500_AP_128.FLM +[NM1330] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=NM1330_AP_64.FLM +[NM1320] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=NM1320_AP_32.FLM +[NM1240] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=NM1240_AP_64.FLM +[NM1230] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=NM1230_AP_64.FLM +[NM1200] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x800 +ProgramAlgorithm=NM1200_AP_8.FLM +[NM1120] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x800 +ProgramAlgorithm=NM1120_AP_29_5.FLM +[N32F030] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=N32F030_AP_64.FLM +[TF5100] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=TF5100_AP_64.FLM +[NDA102] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x800 +ProgramAlgorithm=NDA102_AP_29_5.FLM +[Nano103] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=Nano103_AP_64.FLM +[Nano100] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=Nano100_AP_64.FLM +[N576] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=N576_AP_145.FLM +[N575] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=N575_AP_145.FLM +[N574] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=N574_AP_512.FLM +[N572] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x2000 +ProgramAlgorithm=N572Fxxx.FLM +[N571] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x2000 +ProgramAlgorithm=N571E000.FLM +[N570] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=N570_AP_64.FLM +[N569] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=N569_AP_64.FLM +[N512] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=N512_AP_64.FLM +[Mini57] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x800 +ProgramAlgorithm=Mini57_AP_29_5.FLM +[Mini51] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x800 +ProgramAlgorithm=Mini51_AP_16.FLM +[M481] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=M481_AP_512.FLM +TraceConf0=0x00000002 +TraceConf1=0x00b71b00 +TraceConf2=0x00000800 +TraceConf3=0x00000000 +TraceConf4=0x00000001 +TraceConf5=0x00000000 +CheckDPM=0 +DisableTimeoutDetect=0 +[M480LD] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=M480LD_AP_256.FLM +[M479] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=M479_AP_256.FLM +[M471] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Bank=0 +Erase=1 +Program=1 +Verify=1 +ResetAndRun=1 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=M471_AP_512.FLM +TraceConf0=0x00000002 +TraceConf1=0x00b71b00 +TraceConf2=0x00000800 +TraceConf3=0x00000000 +TraceConf4=0x00000001 +TraceConf5=0x00000000 +[M460] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Bank=0 +SPIM=0 +SPIMOption=0xAD000000 +Erase=1 +Program=1 +Verify=1 +ResetAndRun=1 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x8000 +ProgramAlgorithm=M460_AP_1M.FLM +ProgramAlgorithm1=M460_SPIM_AP_1M.FLM +TraceConf0=0x00000002 +TraceConf1=0x00b71b00 +TraceConf2=0x00000800 +TraceConf3=0x00000000 +TraceConf4=0x00000001 +TraceConf5=0x00000000 +[M451] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=M451_AP_256.FLM +[M2354] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Bank=0 +Erase=1 +Program=1 +Verify=1 +ResetAndRun=1 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +CheckDPM=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=M2354_AP_1M.FLM +TraceConf0=0x00000002 +TraceConf1=0x00b71b00 +TraceConf2=0x00000800 +TraceConf3=0x00000000 +TraceConf4=0x00000001 +TraceConf5=0x00000000 +[M2351] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=1 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=M2351_AP_512.FLM +TraceConf0=0x00000002 +TraceConf1=0x00b71b00 +TraceConf2=0x00000800 +TraceConf3=0x00000000 +TraceConf4=0x00000001 +TraceConf5=0x00000000 +[M261] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=1 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=M261_AP_512.FLM +TraceConf0=0x00000002 +TraceConf1=0x00b71b00 +TraceConf2=0x00000800 +TraceConf3=0x00000000 +TraceConf4=0x00000001 +TraceConf5=0x00000000 +[M251] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x2000 +ProgramAlgorithm=M251_AP_192.FLM +[MR63] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=1 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=MR63_AP_512.FLM +TraceConf0=0x00000002 +TraceConf1=0x00b71b00 +TraceConf2=0x00000800 +TraceConf3=0x00000000 +TraceConf4=0x00000001 +TraceConf5=0x00000000 +[M071] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x2000 +ProgramAlgorithm=M071_AP_128.FLM +[M0564] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x2000 +ProgramAlgorithm=M0564_AP_256.FLM +[M0519] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=M0519_AP_128.FLM +[M0518] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=M0518_AP_64.FLM +[M05x] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x800 +ProgramAlgorithm=M0516_AP_64.FLM +[M0A21] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=1 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x800 +ProgramAlgorithm=M0A21_AP_32.FLM +[M030G] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=1 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +DisableTimeoutDetect=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x800 +ProgramAlgorithm=M030G_AP_64.FLM +[M031] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Bank=0 +Erase=1 +Program=1 +Verify=1 +ResetAndRun=1 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x800 +ProgramAlgorithm=M031_AP_128.FLM +[NPCX] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=NPCX_AP_512.FLM +[I96000] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +Erase=2 +Program=0 +Verify=0 +ResetAndRun=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x8000 +ProgramAlgorithm= +[I94000] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm=I94000_AP_512.FLM +[I91500] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=I91500_AP_64.FLM +[ISD9300] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=ISD9300_AP_145.FLM +[I9200] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=I9200_AP_128.FLM +[ISD9xxx] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=ISD9100_AP_145.FLM +[ISD9000] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=ISD9000_AP_64.FLM +[AU9xxx] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +FlashSelect=APROM +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableFlashBreakpoint=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x1000 +ProgramAlgorithm=AU9100_AP_145.FLM +[KM1M7] +Connect=0 +Reset=Autodetect +MaxClock=4MHz +MemoryVerify=0 +IOVoltage=5000 +Erase=1 +Program=1 +Verify=1 +ResetAndRun=1 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x00004000 +ProgramAlgorithm=KM1M7AFxxx_I.FLM +ProgramAlgorithm1=KM1M7AFxxx_D.FLM +TraceConf0=0x00000002 +TraceConf1=0x00b71b00 +TraceConf2=0x00000800 +TraceConf3=0x00000000 +TraceConf4=0x00000001 +TraceConf5=0x00000000 +EnableKeyfile=0 +Keycode0=0xFFFFFFFF +Keycode1=0xFFFFFFFF +Keycode2=0xFFFFFFFF +Keycode3=0xFFFFFFFF +[Autodetect] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm= +[General] +Connect=0 +Reset=Autodetect +MaxClock=1MHz +MemoryVerify=0 +IOVoltage=3300 +Erase=1 +Program=1 +Verify=1 +ResetAndRun=0 +EnableLog=0 +MemAccessWhileRun=0 +RAMForAlgorithmStart=0x20000000 +RAMForAlgorithmSize=0x4000 +ProgramAlgorithm= diff --git a/bsp/nuvoton/ma35-rtp/README.md b/bsp/nuvoton/ma35-rtp/README.md new file mode 100644 index 0000000000..4d22c3c329 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/README.md @@ -0,0 +1,22 @@ +# MA35-RTP + +## **Introduction** + +The MA35-RTP is a rt-thread porting for remote processor(RTP) of MA35 series. The firmware is copied to 0x0 by MA35 CPU. +### **RTP specification** + +| | Features | +| -- | -- | +| MCU | MA35 RTP(CM4) | +| Operation frequency | 180 MHz | +| SRAM size | 128 kB | +| DDR size | 3968 kB | +## **Supported compiler** +Support GCC compiler. More information of these compiler version as following: + +| IDE/Compiler | Tested version | +| ---------- | ---------------------------- | +| MDK5 | 5.26.2 | +| GCC | GCC 5.4.1 20160919 (release) | + +Notice: Please install Nu-Link_Keil_Driver for development. diff --git a/bsp/nuvoton/ma35-rtp/SConscript b/bsp/nuvoton/ma35-rtp/SConscript new file mode 100644 index 0000000000..fe0ae941ae --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/SConscript @@ -0,0 +1,14 @@ +# for module compiling +import os +Import('RTT_ROOT') + +cwd = str(Dir('#')) +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/nuvoton/ma35-rtp/SConstruct b/bsp/nuvoton/ma35-rtp/SConstruct new file mode 100644 index 0000000000..cd14e5b0a7 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/SConstruct @@ -0,0 +1,59 @@ +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', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.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) + +nuvoton_library = 'ma35' +rtconfig.BSP_LIBRARY_TYPE = nuvoton_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, nuvoton_library, 'SConscript'))) + +# include nu_pkgs +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'nu_packages', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/nuvoton/ma35-rtp/applications/SConscript b/bsp/nuvoton/ma35-rtp/applications/SConscript new file mode 100644 index 0000000000..9ffdbcd0f9 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/applications/SConscript @@ -0,0 +1,11 @@ +# RT-Thread building script for component + +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') +CPPPATH = [cwd, str(Dir('#'))] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/nuvoton/ma35-rtp/applications/main.c b/bsp/nuvoton/ma35-rtp/applications/main.c new file mode 100644 index 0000000000..524596cee0 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/applications/main.c @@ -0,0 +1,47 @@ +/**************************************************************************//** +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-7-20 Wayne First version +* +******************************************************************************/ + +#include +#include +#include "drv_common.h" + +#if defined(RT_USING_PIN) + + #include "drv_gpio.h" + /* defined the LED_1 pin: PJ15 */ + #define LED_1 NU_GET_PININDEX(NU_PJ, 15) + +#endif + +int main(int argc, char **argv) +{ + int counter = 10000; + +#if defined(RT_USING_PIN) + /* set LED_1 pin mode to output */ + rt_pin_mode(LED_1, PIN_MODE_OUTPUT); +#endif + + while (counter--) + { + rt_kprintf("Hello! MA35-RTP.\n"); + +#if defined(RT_USING_PIN) + rt_pin_write(LED_1, PIN_HIGH); + rt_thread_mdelay(1000); + rt_pin_write(LED_1, PIN_LOW); + rt_thread_mdelay(1000); +#else + rt_thread_mdelay(1000); +#endif + } + return 0; +} diff --git a/bsp/nuvoton/ma35-rtp/applications/mnt.c b/bsp/nuvoton/ma35-rtp/applications/mnt.c new file mode 100644 index 0000000000..9325b11090 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/applications/mnt.c @@ -0,0 +1,14 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2020-1-16 Wayne First version +* +******************************************************************************/ + +#include + diff --git a/bsp/nuvoton/ma35-rtp/board/Kconfig b/bsp/nuvoton/ma35-rtp/board/Kconfig new file mode 100644 index 0000000000..9fde36235a --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/board/Kconfig @@ -0,0 +1,23 @@ +menu "Hardware Drivers Config" + + menu "On-chip Peripheral Drivers" + source "$BSP_DIR/../libraries/ma35/rtt_port/Kconfig" + endmenu + + menu "On-board Peripheral Drivers" + + config BSP_USING_NULINKME + bool "Enable UART16 for RTT Console(uart16)" + select BSP_USING_UART + select BSP_USING_UART16 + default y + + endmenu + + menu "Board extended module drivers" + + endmenu + + source "$BSP_DIR/../libraries/nu_packages/Kconfig" + +endmenu diff --git a/bsp/nuvoton/ma35-rtp/board/SConscript b/bsp/nuvoton/ma35-rtp/board/SConscript new file mode 100644 index 0000000000..38791565a2 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/board/SConscript @@ -0,0 +1,18 @@ +# RT-Thread building script for component + +from building import * + + +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +src = Split(""" +nutool_pincfg/nutool_pincfg.c +""") +src += Glob('*.c') + Glob('*.cpp') + Glob('*.S') +CPPPATH = [cwd, cwd + '/nutool_pincfg'] + +group = DefineGroup('board', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/nuvoton/ma35-rtp/board/board.h b/bsp/nuvoton/ma35-rtp/board/board.h new file mode 100644 index 0000000000..c08d84b5fc --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/board/board.h @@ -0,0 +1,42 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-7-19 Wayne First version +* +******************************************************************************/ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include "NuMicro.h" + +// Internal SRAM memory size[Kbytes] <8-64> +#define BOARD_SDRAM_START 0x00000000 +#define BOARD_SDRAM_SIZE (4*1024*1024) + +#if defined(__CC_ARM) || defined(__CLANG_ARM) + // extern int Image$$ER_IROM1$$ZI$$Limit; + // #define BOARD_HEAP_START ((void *)&Image$$ER_IROM1$$ZI$$Limit) + extern uint32_t __initial_sp; + #define BOARD_HEAP_START ((void *)&__initial_sp) +#elif __ICCARM__ + #pragma section="CSTACK" + #define BOARD_HEAP_START (__segment_end("CSTACK")) +#else + extern int __bss_end; + #define BOARD_HEAP_START ((void *)&__bss_end) +#endif + +#define BOARD_HEAP_END ((void*)(BOARD_SDRAM_START+BOARD_SDRAM_SIZE)) + +void rt_hw_board_init(void); +void rt_hw_cpu_reset(void); +void nu_pin_init(void); + +#endif /* BOARD_H_ */ diff --git a/bsp/nuvoton/ma35-rtp/board/board_dev.c b/bsp/nuvoton/ma35-rtp/board/board_dev.c new file mode 100644 index 0000000000..1e1c8ba564 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/board/board_dev.c @@ -0,0 +1,14 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-7-19 Wayne First version +* +******************************************************************************/ + +#include + diff --git a/bsp/nuvoton/ma35-rtp/board/nutool_pincfg/nutool_pincfg.c b/bsp/nuvoton/ma35-rtp/board/nutool_pincfg/nutool_pincfg.c new file mode 100644 index 0000000000..1d64bf258b --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/board/nutool_pincfg/nutool_pincfg.c @@ -0,0 +1,52 @@ +/**************************************************************************** + * @file nutool_pincfg.c + * @version V1.24 + * @Date 2021/08/03-14:56:47 + * @brief NuMicro generated code file + * + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2013-2021 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +/******************** +MCU:MA35D16A887C(BGA312) +Pin Configuration: + +PinG16:UART16_nRTS +PinH16:UART16_nCTS +PinJ16:UART16_TXD +PinK16:UART16_RXD +********************/ + +#include "ma35d1.h" +void nutool_pincfg_init_uart16(void) +{ + SYS->GPK_MFPL &= ~(SYS_GPK_MFPL_PK3MFP_Msk | SYS_GPK_MFPL_PK2MFP_Msk | SYS_GPK_MFPL_PK1MFP_Msk | SYS_GPK_MFPL_PK0MFP_Msk); + SYS->GPK_MFPL |= (SYS_GPK_MFPL_PK3MFP_UART16_TXD | SYS_GPK_MFPL_PK2MFP_UART16_RXD | SYS_GPK_MFPL_PK1MFP_UART16_nRTS | SYS_GPK_MFPL_PK0MFP_UART16_nCTS); + + return; +} + +void nutool_pincfg_deinit_uart16(void) +{ + SYS->GPK_MFPL &= ~(SYS_GPK_MFPL_PK3MFP_Msk | SYS_GPK_MFPL_PK2MFP_Msk | SYS_GPK_MFPL_PK1MFP_Msk | SYS_GPK_MFPL_PK0MFP_Msk); + + return; +} +void nutool_pincfg_init(void) +{ + nutool_pincfg_init_uart16(); + + return; +} + +void nutool_pincfg_deinit(void) +{ + + nutool_pincfg_deinit_uart16(); + + return; +} + +/*** (C) COPYRIGHT 2013-2021 Nuvoton Technology Corp. ***/ diff --git a/bsp/nuvoton/ma35-rtp/board/nutool_pincfg/nutool_pincfg.h b/bsp/nuvoton/ma35-rtp/board/nutool_pincfg/nutool_pincfg.h new file mode 100644 index 0000000000..16dd290d0c --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/board/nutool_pincfg/nutool_pincfg.h @@ -0,0 +1,80 @@ +/**************************************************************************** + * @file nutool_pincfg.h + * @version V1.24 + * @Date 2021/08/03-14:56:47 + * @brief NuMicro generated code file + * + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2013-2021 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#ifndef __NUTOOL_PINCFG_H__ +#define __NUTOOL_PINCFG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif +void nutool_pincfg_init_adc0(void); +void nutool_pincfg_deinit_adc0(void); +void nutool_pincfg_init_can1(void); +void nutool_pincfg_deinit_can1(void); +void nutool_pincfg_init_can3(void); +void nutool_pincfg_deinit_can3(void); +void nutool_pincfg_init_eadc0(void); +void nutool_pincfg_deinit_eadc0(void); +void nutool_pincfg_init_epwm1(void); +void nutool_pincfg_deinit_epwm1(void); +void nutool_pincfg_init_hsusb0(void); +void nutool_pincfg_deinit_hsusb0(void); +void nutool_pincfg_init_hsusbh(void); +void nutool_pincfg_deinit_hsusbh(void); +void nutool_pincfg_init_i2c1(void); +void nutool_pincfg_deinit_i2c1(void); +void nutool_pincfg_init_i2c2(void); +void nutool_pincfg_deinit_i2c2(void); +void nutool_pincfg_init_i2c3(void); +void nutool_pincfg_deinit_i2c3(void); +void nutool_pincfg_init_i2c4(void); +void nutool_pincfg_deinit_i2c4(void); +void nutool_pincfg_init_i2c5(void); +void nutool_pincfg_deinit_i2c5(void); +void nutool_pincfg_init_i2s0(void); +void nutool_pincfg_deinit_i2s0(void); +void nutool_pincfg_init_lcm(void); +void nutool_pincfg_deinit_lcm(void); +void nutool_pincfg_init_nand(void); +void nutool_pincfg_deinit_nand(void); +void nutool_pincfg_init_qspi0(void); +void nutool_pincfg_deinit_qspi0(void); +void nutool_pincfg_init_rgmii0(void); +void nutool_pincfg_deinit_rgmii0(void); +void nutool_pincfg_init_rgmii1(void); +void nutool_pincfg_deinit_rgmii1(void); +void nutool_pincfg_init_sd0(void); +void nutool_pincfg_deinit_sd0(void); +void nutool_pincfg_init_sd1(void); +void nutool_pincfg_deinit_sd1(void); +void nutool_pincfg_init_uart0(void); +void nutool_pincfg_deinit_uart0(void); +void nutool_pincfg_init_uart11(void); +void nutool_pincfg_deinit_uart11(void); +void nutool_pincfg_init_uart12(void); +void nutool_pincfg_deinit_uart12(void); +void nutool_pincfg_init_uart14(void); +void nutool_pincfg_deinit_uart14(void); +void nutool_pincfg_init_uart16(void); +void nutool_pincfg_deinit_uart16(void); +void nutool_pincfg_init_vcap0(void); +void nutool_pincfg_deinit_vcap0(void); +void nutool_pincfg_init_vcap1(void); +void nutool_pincfg_deinit_vcap1(void); +void nutool_pincfg_init(void); +void nutool_pincfg_deinit(void); +#ifdef __cplusplus +} +#endif +#endif /*__NUTOOL_PINCFG_H__*/ + +/*** (C) COPYRIGHT 2013-2021 Nuvoton Technology Corp. ***/ diff --git a/bsp/nuvoton/ma35-rtp/linking_scripts/subm.ld b/bsp/nuvoton/ma35-rtp/linking_scripts/subm.ld new file mode 100644 index 0000000000..dbf7698510 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/linking_scripts/subm.ld @@ -0,0 +1,160 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-07-19 Wayne First version +* +******************************************************************************/ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + SRAM0_DDR (rxw) : ORIGIN = 0x00000000, LENGTH = 4096k /* 128K SRAM0 + 3.8MB DDR */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x1000; + +SECTIONS +{ + .vector : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + } > SRAM0_DDR = 0 + + .text : + { + . = 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); + + /* section information for utest */ + . = ALIGN(4); + __rt_utest_tc_tab_start = .; + KEEP(*(UtestTcTab)) + __rt_utest_tc_tab_end = .; + + . = ALIGN(4); + _etext = .; + } > SRAM0_DDR + + /* .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 section */ + _sidata = .; + } > SRAM0_DDR + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .stack : + { + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } > SRAM0_DDR + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data section */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data section */ + _edata = . ; + } > SRAM0_DDR + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss section */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss section */ + _ebss = . ; + + *(.bss.init) + } > SRAM0_DDR + __bss_end = .; + _end = .; + + __ram_top = ORIGIN(SRAM0_DDR) + LENGTH(SRAM0_DDR); + + /* 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/nuvoton/ma35-rtp/ma35-rtp.uvprojx b/bsp/nuvoton/ma35-rtp/ma35-rtp.uvprojx new file mode 100644 index 0000000000..8abb92a0b6 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/ma35-rtp.uvprojx @@ -0,0 +1,1012 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rtthread-subm + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + ARMCM4_FP + ARM + ARM.CMSIS.5.7.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil5\ + rtthread + 1 + 0 + 1 + 1 + 0 + .\build\keil5\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 1 + fromelf.exe --bin --output "$L@L.bin" "$L@L.axf" + fromelf --text -c "$L@L.axf" --output "$L@L.txt" + 0 + 0 + 0 + 0 + + 1 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4099 + + 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 + 1 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 8 + 0 + 1 + 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 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + RT_USING_LIBC, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND + + ..\..\..\components\libc\compilers\common\extension;..\..\..\components\libc\posix\io\stdio;..\..\..\libcpu\arm\common;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\ma35\CMSIS\Include;..\..\..\examples\utest\testcases\utest;board\nutool_pincfg;..\libraries\ma35\Device\Nuvoton\MA35D1\Include;..\..\..\components\finsh;..\..\..\components\utilities\utest;..\libraries\ma35\StdDriver\inc;..\..\..\examples\utest\testcases\kernel;..\..\..\components\drivers\include;..\libraries\ma35\rtt_port;..\..\..\components\libc\posix\ipc;..\libraries\nu_packages\TPC;board;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\poll;.;test\template;..\..\..\include;..\..\..\libcpu\arm\cortex-m4;applications;..\libraries\ma35\libcpu\arm\cortex-m4;..\..\..\components\libc\compilers\common\include;..\..\..\components\utilities\ulog;..\libraries\nu_packages\NuUtils\inc + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + + + + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + mnt.c + 1 + applications\mnt.c + + + + + board + + + board_dev.c + 1 + board\board_dev.c + + + nutool_pincfg.c + 1 + board\nutool_pincfg\nutool_pincfg.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 + + + cstdio.c + 1 + ..\..\..\components\libc\compilers\common\cstdio.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 + + + cwchar.c + 1 + ..\..\..\components\libc\compilers\common\cwchar.c + + + + + CPU + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + 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 + + + interrupt.c + 1 + ..\libraries\ma35\libcpu\arm\cortex-m4\interrupt.c + + + + + DeviceDrivers + + + completion.c + 1 + ..\..\..\components\drivers\ipc\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\ipc\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\ipc\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\ipc\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\ipc\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\ipc\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\ipc\workqueue.c + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + + + Drivers + + + startup_ma35d1_subm.s + 2 + ..\libraries\ma35\Device\Nuvoton\MA35D1\Source\ARM\startup_ma35d1_subm.s + + + system_ma35d1_subm.c + 1 + ..\libraries\ma35\Device\Nuvoton\MA35D1\Source\system_ma35d1_subm.c + + + drv_adc.c + 1 + ..\libraries\ma35\rtt_port\drv_adc.c + + + drv_canfd.c + 1 + ..\libraries\ma35\rtt_port\drv_canfd.c + + + drv_ccap.c + 1 + ..\libraries\ma35\rtt_port\drv_ccap.c + + + drv_common.c + 1 + ..\libraries\ma35\rtt_port\drv_common.c + + + drv_disp.c + 1 + ..\libraries\ma35\rtt_port\drv_disp.c + + + drv_eadc.c + 1 + ..\libraries\ma35\rtt_port\drv_eadc.c + + + drv_ecap.c + 1 + ..\libraries\ma35\rtt_port\drv_ecap.c + + + drv_epwm.c + 1 + ..\libraries\ma35\rtt_port\drv_epwm.c + + + drv_epwm_capture.c + 1 + ..\libraries\ma35\rtt_port\drv_epwm_capture.c + + + drv_gpio.c + 1 + ..\libraries\ma35\rtt_port\drv_gpio.c + + + drv_i2c.c + 1 + ..\libraries\ma35\rtt_port\drv_i2c.c + + + drv_i2s.c + 1 + ..\libraries\ma35\rtt_port\drv_i2s.c + + + drv_pdma.c + 1 + ..\libraries\ma35\rtt_port\drv_pdma.c + + + drv_qei.c + 1 + ..\libraries\ma35\rtt_port\drv_qei.c + + + drv_qspi.c + 1 + ..\libraries\ma35\rtt_port\drv_qspi.c + + + drv_rtc.c + 1 + ..\libraries\ma35\rtt_port\drv_rtc.c + + + drv_rtp.c + 1 + ..\libraries\ma35\rtt_port\drv_rtp.c + + + drv_scuart.c + 1 + ..\libraries\ma35\rtt_port\drv_scuart.c + + + drv_sdio.c + 1 + ..\libraries\ma35\rtt_port\drv_sdio.c + + + drv_softi2c.c + 1 + ..\libraries\ma35\rtt_port\drv_softi2c.c + + + drv_spi.c + 1 + ..\libraries\ma35\rtt_port\drv_spi.c + + + drv_spii2s.c + 1 + ..\libraries\ma35\rtt_port\drv_spii2s.c + + + drv_sys.c + 1 + ..\libraries\ma35\rtt_port\drv_sys.c + + + drv_sys_i2c0.c + 1 + ..\libraries\ma35\rtt_port\drv_sys_i2c0.c + + + drv_timer.c + 1 + ..\libraries\ma35\rtt_port\drv_timer.c + + + drv_tpwm.c + 1 + ..\libraries\ma35\rtt_port\drv_tpwm.c + + + drv_uart.c + 1 + ..\libraries\ma35\rtt_port\drv_uart.c + + + drv_usbhost.c + 1 + ..\libraries\ma35\rtt_port\drv_usbhost.c + + + drv_wdt.c + 1 + ..\libraries\ma35\rtt_port\drv_wdt.c + + + nu_clock_init.c + 1 + ..\libraries\ma35\rtt_port\nu_clock_init.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 + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Libraries + + + nu_sc.c + 1 + ..\libraries\ma35\StdDriver\src\nu_sc.c + + + nu_wdt.c + 1 + ..\libraries\ma35\StdDriver\src\nu_wdt.c + + + nu_ccap.c + 1 + ..\libraries\ma35\StdDriver\src\nu_ccap.c + + + nu_clk.c + 1 + ..\libraries\ma35\StdDriver\src\nu_clk.c + + + nu_i2s.c + 1 + ..\libraries\ma35\StdDriver\src\nu_i2s.c + + + nu_eadc.c + 1 + ..\libraries\ma35\StdDriver\src\nu_eadc.c + + + nu_ebi.c + 1 + ..\libraries\ma35\StdDriver\src\nu_ebi.c + + + nu_scuart.c + 1 + ..\libraries\ma35\StdDriver\src\nu_scuart.c + + + nu_rtc.c + 1 + ..\libraries\ma35\StdDriver\src\nu_rtc.c + + + nu_pdma.c + 1 + ..\libraries\ma35\StdDriver\src\nu_pdma.c + + + nu_i2c.c + 1 + ..\libraries\ma35\StdDriver\src\nu_i2c.c + + + nu_epwm.c + 1 + ..\libraries\ma35\StdDriver\src\nu_epwm.c + + + nu_spi.c + 1 + ..\libraries\ma35\StdDriver\src\nu_spi.c + + + nu_sys.c + 1 + ..\libraries\ma35\StdDriver\src\nu_sys.c + + + nu_wwdt.c + 1 + ..\libraries\ma35\StdDriver\src\nu_wwdt.c + + + nu_sdh.c + 1 + ..\libraries\ma35\StdDriver\src\nu_sdh.c + + + nu_adc.c + 1 + ..\libraries\ma35\StdDriver\src\nu_adc.c + + + nu_uart.c + 1 + ..\libraries\ma35\StdDriver\src\nu_uart.c + + + nu_timer.c + 1 + ..\libraries\ma35\StdDriver\src\nu_timer.c + + + nu_kpi.c + 1 + ..\libraries\ma35\StdDriver\src\nu_kpi.c + + + nu_ssmcc.c + 1 + ..\libraries\ma35\StdDriver\src\nu_ssmcc.c + + + nu_qei.c + 1 + ..\libraries\ma35\StdDriver\src\nu_qei.c + + + nu_qspi.c + 1 + ..\libraries\ma35\StdDriver\src\nu_qspi.c + + + nu_canfd.c + 1 + ..\libraries\ma35\StdDriver\src\nu_canfd.c + + + nu_gpio.c + 1 + ..\libraries\ma35\StdDriver\src\nu_gpio.c + + + nu_sspcc.c + 1 + ..\libraries\ma35\StdDriver\src\nu_sspcc.c + + + nu_timer_pwm.c + 1 + ..\libraries\ma35\StdDriver\src\nu_timer_pwm.c + + + nu_ecap.c + 1 + ..\libraries\ma35\StdDriver\src\nu_ecap.c + + + nu_disp.c + 1 + ..\libraries\ma35\StdDriver\src\nu_disp.c + + + nu_whc.c + 1 + ..\libraries\ma35\StdDriver\src\nu_whc.c + + + + + UTest + + + utest.c + 1 + ..\..\..\components\utilities\utest\utest.c + + + + + utestcases + + + utest_template.c + 1 + test\template\utest_template.c + + + mem_tc.c + 1 + ..\..\..\examples\utest\testcases\kernel\mem_tc.c + + + pass_tc.c + 1 + ..\..\..\examples\utest\testcases\utest\pass_tc.c + + + + + Utilities + + + ulog.c + 1 + ..\..\..\components\utilities\ulog\ulog.c + + + console_be.c + 1 + ..\..\..\components\utilities\ulog\backend\console_be.c + + + + + + + + + + + + + +
diff --git a/bsp/nuvoton/ma35-rtp/rtconfig.py b/bsp/nuvoton/ma35-rtp/rtconfig.py new file mode 100644 index 0000000000..24f0a64fc5 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/rtconfig.py @@ -0,0 +1,99 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +CROSS_TOOL='gcc' + +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:\Program Files (x86)\GNU Tools ARM Embedded\6 2017-q1-update\bin' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:\Keil_v5' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = '' +# 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-m4 -mthumb -ffunction-sections -fdata-sections -Wuninitialized' + + if BUILD == 'debug': + DEVICE = DEVICE + ' -DDEBUG' + + CFLAGS = DEVICE + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp' + LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map -T ./linking_scripts/subm.ld ' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + AFLAGS += ' -gdwarf-2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu=cortex-m4.fp' + CFLAGS = DEVICE + ' --apcs=interwork' + AFLAGS = DEVICE + LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers --list rtthread.map' + + CFLAGS += ' --c99' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/RV31/INC' + LFLAGS += ' --libpath ' + EXEC_PATH + '/ARM/RV31/LIB' + + EXEC_PATH += '/arm/bin40/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +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/nuvoton/ma35-rtp/rtthread.bin b/bsp/nuvoton/ma35-rtp/rtthread.bin new file mode 100644 index 0000000000000000000000000000000000000000..4c25ef079b90d6f05927fe8f32c57d83a0b675d6 GIT binary patch literal 89340 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 literal 0 HcmV?d00001 diff --git a/bsp/nuvoton/ma35-rtp/template.uvprojx b/bsp/nuvoton/ma35-rtp/template.uvprojx new file mode 100644 index 0000000000..870e6b8fc9 --- /dev/null +++ b/bsp/nuvoton/ma35-rtp/template.uvprojx @@ -0,0 +1,390 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rtthread-rtp + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + ARMCM4_FP + ARM + ARM.CMSIS.5.7.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000) + 0 + $$Device:ARMCM4_FP$Device\ARM\ARMCM4\Include\ARMCM4_FP.h + + + + + + + + + + + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil5\ + rtthread + 1 + 0 + 1 + 1 + 0 + .\build\keil5\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 1 + fromelf.exe --bin --output "$L@L.bin" "$L@L.axf" + fromelf --text -c "$L@L.axf" --output "$L@L.txt" + 0 + 0 + 0 + 0 + + 1 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4099 + + 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 + 1 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 8 + 0 + 1 + 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 + 0x20000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + + + + + + + + + + + + + + + + + + + + +
diff --git a/bsp/nuvoton/nk-n9h30/.config b/bsp/nuvoton/nk-n9h30/.config index 12bf2e1afd..a8fdd9106b 100644 --- a/bsp/nuvoton/nk-n9h30/.config +++ b/bsp/nuvoton/nk-n9h30/.config @@ -971,3 +971,5 @@ CONFIG_NU_PKG_USING_NAU8822=y CONFIG_NU_PKG_USING_ADC_TOUCH=y # CONFIG_NU_PKG_USING_ADC_TOUCH_SW is not set # CONFIG_NU_PKG_USING_SPINAND is not set +CONFIG_UTEST_CMD_PREFIX="bsp.nuvoton.utest." +CONFIG_BOARD_USE_UTEST=y diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/.config b/bsp/nuvoton/numaker-hmi-ma35d1/.config new file mode 100644 index 0000000000..5cf42f36ff --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/.config @@ -0,0 +1,1071 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# +CONFIG_USE_MA35D1_AARCH32=y + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +CONFIG_RT_USING_SMP=y +CONFIG_RT_CPUS_NR=2 +CONFIG_RT_ALIGN_SIZE=32 +# 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_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=4096 +CONFIG_SYSTEM_THREAD_STACK_SIZE=4096 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=4096 + +# +# kservice optimization +# +CONFIG_RT_KSERVICE_USING_STDLIB=y +# CONFIG_RT_KSERVICE_USING_STDLIB_MEMORY is not set +# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set +# CONFIG_RT_USING_TINY_FFS is not set +# CONFIG_RT_KPRINTF_USING_LONGLONG is not set +CONFIG_RT_DEBUG=y +CONFIG_RT_DEBUG_COLOR=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG 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_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +CONFIG_RT_USING_MEMHEAP=y +CONFIG_RT_MEMHEAP_FAST_MODE=y +# CONFIG_RT_MEMHEAP_BSET_MODE 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 + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +CONFIG_RT_USING_INTERRUPT_INFO=y +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=4096 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" +CONFIG_RT_VER_NUM=0x50000 +CONFIG_ARCH_ARM=y +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM_CORTEX_A=y +CONFIG_RT_SMP_AUTO_BOOT=y +CONFIG_RT_USING_GIC_V2=y +# CONFIG_RT_USING_GIC_V3 is not set +CONFIG_ARCH_ARMV8=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=4096 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +CONFIG_RT_USING_LEGACY=y +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=128 +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_RT_USING_DFS=y +CONFIG_DFS_USING_POSIX=y +CONFIG_DFS_USING_WORKDIR=y +CONFIG_DFS_FILESYSTEMS_MAX=32 +CONFIG_DFS_FILESYSTEM_TYPES_MAX=32 +CONFIG_DFS_FD_MAX=128 +CONFIG_RT_USING_DFS_MNTTABLE=y +CONFIG_RT_USING_DFS_ELMFAT=y + +# +# elm-chan's FatFs, Generic FAT Filesystem Module +# +CONFIG_RT_DFS_ELM_CODE_PAGE=437 +CONFIG_RT_DFS_ELM_WORD_ACCESS=y +# CONFIG_RT_DFS_ELM_USE_LFN_0 is not set +# CONFIG_RT_DFS_ELM_USE_LFN_1 is not set +# CONFIG_RT_DFS_ELM_USE_LFN_2 is not set +CONFIG_RT_DFS_ELM_USE_LFN_3=y +CONFIG_RT_DFS_ELM_USE_LFN=3 +CONFIG_RT_DFS_ELM_LFN_UNICODE_0=y +# CONFIG_RT_DFS_ELM_LFN_UNICODE_1 is not set +# CONFIG_RT_DFS_ELM_LFN_UNICODE_2 is not set +# CONFIG_RT_DFS_ELM_LFN_UNICODE_3 is not set +CONFIG_RT_DFS_ELM_LFN_UNICODE=0 +CONFIG_RT_DFS_ELM_MAX_LFN=255 +CONFIG_RT_DFS_ELM_DRIVES=8 +CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=512 +# CONFIG_RT_DFS_ELM_USE_ERASE is not set +CONFIG_RT_DFS_ELM_REENTRANT=y +CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000 +CONFIG_RT_USING_DFS_DEVFS=y +# CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_NFS is not set +# CONFIG_RT_USING_FAL is not set +# CONFIG_RT_USING_LWP is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_USING_SYSTEM_WORKQUEUE=y +CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048 +CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 +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=256 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +CONFIG_RT_USING_I2C=y +# CONFIG_RT_I2C_DEBUG is not set +CONFIG_RT_USING_I2C_BITOPS=y +# CONFIG_RT_I2C_BITOPS_DEBUG is not set +# CONFIG_RT_USING_PHY is not set +CONFIG_RT_USING_PIN=y +CONFIG_RT_USING_ADC=y +# CONFIG_RT_USING_DAC is not set +CONFIG_RT_USING_PWM=y +# CONFIG_RT_USING_MTD_NOR is not set +CONFIG_RT_USING_MTD_NAND=y +CONFIG_RT_MTD_NAND_DEBUG=y +# CONFIG_RT_USING_PM is not set +CONFIG_RT_USING_RTC=y +# CONFIG_RT_USING_ALARM is not set +# CONFIG_RT_USING_SOFT_RTC is not set +CONFIG_RT_USING_SDIO=y +CONFIG_RT_SDIO_STACK_SIZE=4096 +CONFIG_RT_SDIO_THREAD_PRIORITY=15 +CONFIG_RT_MMCSD_STACK_SIZE=4096 +CONFIG_RT_MMCSD_THREAD_PREORITY=22 +CONFIG_RT_MMCSD_MAX_PARTITION=8 +# CONFIG_RT_SDIO_DEBUG is not set +CONFIG_RT_USING_SPI=y +# CONFIG_RT_USING_SPI_BITOPS is not set +CONFIG_RT_USING_QSPI=y +# CONFIG_RT_USING_SPI_MSD is not set +# CONFIG_RT_USING_SFUD is not set +# CONFIG_RT_USING_ENC28J60 is not set +# CONFIG_RT_USING_SPI_WIFI is not set +# CONFIG_RT_USING_WDT is not set +CONFIG_RT_USING_AUDIO=y +CONFIG_RT_AUDIO_REPLAY_MP_BLOCK_SIZE=4096 +CONFIG_RT_AUDIO_REPLAY_MP_BLOCK_COUNT=2 +CONFIG_RT_AUDIO_RECORD_PIPE_SIZE=2048 +# CONFIG_RT_USING_SENSOR is not set +CONFIG_RT_USING_TOUCH=y +# CONFIG_RT_TOUCH_PIN_IRQ is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +CONFIG_RT_USING_USB=y +CONFIG_RT_USING_USB_HOST=y +CONFIG_RT_USBH_MSTORAGE=y +CONFIG_UDISK_MOUNTPOINT="/mnt/udisk" +# CONFIG_RT_USBH_HID is not set +# CONFIG_RT_USING_USB_DEVICE is not set +CONFIG_RT_USBD_THREAD_STACK_SZ=4096 + +# +# C/C++ and POSIX layer +# +CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 + +# +# POSIX (Portable Operating System Interface) layer +# +CONFIG_RT_USING_POSIX_FS=y +# CONFIG_RT_USING_POSIX_DEVIO is not set +# CONFIG_RT_USING_POSIX_STDIO is not set +CONFIG_RT_USING_POSIX_POLL=y +CONFIG_RT_USING_POSIX_SELECT=y +CONFIG_RT_USING_POSIX_SOCKET=y +# CONFIG_RT_USING_POSIX_TERMIOS is not set +# CONFIG_RT_USING_POSIX_AIO is not set +# CONFIG_RT_USING_POSIX_MMAN is not set +CONFIG_RT_USING_POSIX_DELAY=y +CONFIG_RT_USING_POSIX_CLOCK=y +# CONFIG_RT_USING_POSIX_TIMER is not set +CONFIG_RT_USING_PTHREADS=y +CONFIG_PTHREAD_NUM_MAX=8 +CONFIG_RT_USING_MODULE=y +CONFIG_RT_USING_CUSTOM_DLMODULE=y + +# +# 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 +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Network +# +CONFIG_RT_USING_SAL=y +# CONFIG_SAL_INTERNET_CHECK is not set + +# +# Docking with protocol stacks +# +CONFIG_SAL_USING_LWIP=y +# CONFIG_SAL_USING_AT is not set +# CONFIG_SAL_USING_TLS is not set +CONFIG_SAL_USING_POSIX=y +CONFIG_RT_USING_NETDEV=y +CONFIG_NETDEV_USING_IFCONFIG=y +CONFIG_NETDEV_USING_PING=y +CONFIG_NETDEV_USING_NETSTAT=y +CONFIG_NETDEV_USING_AUTO_DEFAULT=y +# CONFIG_NETDEV_USING_IPV6 is not set +CONFIG_NETDEV_IPV4=1 +CONFIG_NETDEV_IPV6=0 +# CONFIG_NETDEV_IPV6_SCOPES is not set +CONFIG_RT_USING_LWIP=y +# CONFIG_RT_USING_LWIP_LOCAL_VERSION is not set +# CONFIG_RT_USING_LWIP141 is not set +# CONFIG_RT_USING_LWIP203 is not set +CONFIG_RT_USING_LWIP212=y +# CONFIG_RT_USING_LWIP_LATEST is not set +CONFIG_RT_USING_LWIP_VER_NUM=0x20102 +# CONFIG_RT_USING_LWIP_IPV6 is not set +CONFIG_RT_LWIP_MEM_ALIGNMENT=32 +CONFIG_RT_LWIP_IGMP=y +CONFIG_RT_LWIP_ICMP=y +# CONFIG_RT_LWIP_SNMP is not set +CONFIG_RT_LWIP_DNS=y +CONFIG_RT_LWIP_DHCP=y +CONFIG_IP_SOF_BROADCAST=1 +CONFIG_IP_SOF_BROADCAST_RECV=1 + +# +# Static IPv4 Address +# +CONFIG_RT_LWIP_IPADDR="192.168.31.55" +CONFIG_RT_LWIP_GWADDR="192.168.31.1" +CONFIG_RT_LWIP_MSKADDR="255.255.255.0" +CONFIG_RT_LWIP_UDP=y +CONFIG_RT_LWIP_TCP=y +CONFIG_RT_LWIP_RAW=y +# CONFIG_RT_LWIP_PPP is not set +CONFIG_RT_MEMP_NUM_NETCONN=32 +CONFIG_RT_LWIP_PBUF_NUM=8192 +CONFIG_RT_LWIP_RAW_PCB_NUM=32 +CONFIG_RT_LWIP_UDP_PCB_NUM=32 +CONFIG_RT_LWIP_TCP_PCB_NUM=32 +CONFIG_RT_LWIP_TCP_SEG_NUM=1024 +CONFIG_RT_LWIP_TCP_SND_BUF=8192 +CONFIG_RT_LWIP_TCP_WND=10240 +CONFIG_RT_LWIP_TCPTHREAD_PRIORITY=10 +CONFIG_RT_LWIP_TCPTHREAD_MBOX_SIZE=8192 +CONFIG_RT_LWIP_TCPTHREAD_STACKSIZE=4096 +# CONFIG_LWIP_NO_RX_THREAD is not set +# CONFIG_LWIP_NO_TX_THREAD is not set +CONFIG_RT_LWIP_ETHTHREAD_PRIORITY=12 +CONFIG_RT_LWIP_ETHTHREAD_STACKSIZE=4096 +CONFIG_RT_LWIP_ETHTHREAD_MBOX_SIZE=8192 +CONFIG_RT_LWIP_REASSEMBLY_FRAG=y +CONFIG_LWIP_NETIF_STATUS_CALLBACK=1 +CONFIG_LWIP_NETIF_LINK_CALLBACK=1 +CONFIG_SO_REUSE=1 +CONFIG_LWIP_SO_RCVTIMEO=1 +CONFIG_LWIP_SO_SNDTIMEO=1 +CONFIG_LWIP_SO_RCVBUF=1 +CONFIG_LWIP_SO_LINGER=0 +CONFIG_RT_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_NETIF_LOOPBACK=1 +CONFIG_RT_LWIP_STATS=y +CONFIG_RT_LWIP_USING_HW_CHECKSUM=y +CONFIG_RT_LWIP_USING_PING=y +# CONFIG_LWIP_USING_DHCPD is not set +# CONFIG_RT_LWIP_DEBUG is not set +# CONFIG_RT_USING_AT is not set + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +CONFIG_RT_USING_ULOG=y +# CONFIG_ULOG_OUTPUT_LVL_A is not set +# CONFIG_ULOG_OUTPUT_LVL_E is not set +# CONFIG_ULOG_OUTPUT_LVL_W is not set +# CONFIG_ULOG_OUTPUT_LVL_I is not set +CONFIG_ULOG_OUTPUT_LVL_D=y +CONFIG_ULOG_OUTPUT_LVL=7 +CONFIG_ULOG_USING_ISR_LOG=y +CONFIG_ULOG_ASSERT_ENABLE=y +CONFIG_ULOG_LINE_BUF_SIZE=128 +# CONFIG_ULOG_USING_ASYNC_OUTPUT is not set + +# +# log format +# +# CONFIG_ULOG_OUTPUT_FLOAT is not set +CONFIG_ULOG_USING_COLOR=y +CONFIG_ULOG_OUTPUT_TIME=y +# CONFIG_ULOG_TIME_USING_TIMESTAMP is not set +CONFIG_ULOG_OUTPUT_LEVEL=y +CONFIG_ULOG_OUTPUT_TAG=y +# CONFIG_ULOG_OUTPUT_THREAD_NAME is not set +CONFIG_ULOG_BACKEND_USING_CONSOLE=y +# CONFIG_ULOG_BACKEND_USING_FILE is not set +# CONFIG_ULOG_USING_FILTER is not set +# CONFIG_ULOG_USING_SYSLOG is not set +CONFIG_RT_USING_UTEST=y +CONFIG_UTEST_THR_STACK_SIZE=4096 +CONFIG_UTEST_THR_PRIORITY=20 +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RT_LINK is not set +# CONFIG_RT_USING_VBUS is not set + +# +# RT-Thread Utestcases +# +CONFIG_RT_USING_UTESTCASES=y + +# +# Utest Self Testcase +# +CONFIG_UTEST_SELF_PASS_TC=y + +# +# Kernel Testcase +# +CONFIG_UTEST_MEMHEAP_TC=y +CONFIG_UTEST_SMALL_MEM_TC=y +# CONFIG_UTEST_IRQ_TC is not set +# CONFIG_UTEST_SEMAPHORE_TC is not set +# CONFIG_UTEST_EVENT_TC is not set +# CONFIG_UTEST_TIMER_TC is not set +# CONFIG_UTEST_MESSAGEQUEUE_TC is not set +# CONFIG_UTEST_SIGNAL_TC is not set +# CONFIG_UTEST_MUTEX_TC is not set +# CONFIG_UTEST_MAILBOX_TC is not set +# CONFIG_UTEST_THREAD_TC is not set + +# +# CPP11 Testcase +# +# CONFIG_UTEST_CPP11_THREAD_TC is not set + +# +# Utest Serial Testcase +# +# CONFIG_UTEST_SERIAL_TC is not set + +# +# RTT Posix Testcase +# +# CONFIG_RTT_POSIX_TESTCASE is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LWIP is not set +# 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_LIBMODBUS is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# 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_EZ_IOT_OS is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# 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_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_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 + +# +# 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 + +# +# 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 + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# 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 + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +CONFIG_PKG_USING_LVGL=y +CONFIG_PKG_LVGL_PATH="/packages/multimedia/LVGL/LVGL" +CONFIG_PKG_LVGL_THREAD_PRIO=20 +CONFIG_PKG_LVGL_THREAD_STACK_SIZE=4096 +CONFIG_PKG_LVGL_DISP_REFR_PERIOD=5 +# CONFIG_PKG_LVGL_USING_EXAMPLES is not set +CONFIG_PKG_LVGL_USING_DEMOS=y +# CONFIG_PKG_LVGL_USING_V08020 is not set +# CONFIG_PKG_LVGL_USING_V08030 is not set +CONFIG_PKG_LVGL_USING_LATEST_VERSION=y +CONFIG_PKG_LVGL_VER_NUM=0x99999 +CONFIG_PKG_LVGL_VER="latest" +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# 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=y +CONFIG_PKG_WAVPLAYER_PATH="/packages/multimedia/wavplayer" +CONFIG_PKG_WP_USING_PLAY=y +CONFIG_PKG_WP_PLAY_DEVICE="sound0" +CONFIG_PKG_WP_USING_RECORD=y +CONFIG_PKG_WP_RECORD_DEVICE="sound0" +# CONFIG_PKG_USING_WAVPLAYER_V020 is not set +CONFIG_PKG_USING_WAVPLAYER_LATEST_VERSION=y +CONFIG_PKG_WAVPLAYER_VER="latest" +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_HELIX_V100 is not set +# CONFIG_PKG_USING_HELIX_LATEST_VERSION 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_MP3PLAYER_V100 is not set +# CONFIG_PKG_USING_MP3PLAYER_LATEST_VERSION is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set + +# +# PainterEngine: A cross-platform graphics application framework written in C language +# +# CONFIG_PKG_USING_PAINTERENGINE is not set +# CONFIG_PKG_USING_PAINTERENGINE_AUX 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_PERSIMMON is not set + +# +# 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_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ULOG_FILE 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_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set + +# +# 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 + +# +# 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 + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set + +# +# 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 +# CONFIG_PKG_USING_RTDUINO is not set +# CONFIG_PKG_USING_FREERTOS_WRAPPER 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_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=y +CONFIG_PKG_RAMDISK_PATH="/packages/system/ramdisk" +# CONFIG_PKG_USING_RAMDISK_V010 is not set +CONFIG_PKG_USING_RAMDISK_LATEST_VERSION=y +CONFIG_PKG_RAMDISK_VER="latest" +# 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_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 + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ESP_IDF is not set +# CONFIG_PKG_USING_ICM20608 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_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK 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_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_TOUCH_DRIVERS is not set +# CONFIG_PKG_USING_MAX17048 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_EMBARC_BSP 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_PAJ7620 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_STM32WB55_SDK 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_BLUETRUM_SDK 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_BL_MCU_SDK is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set + +# +# 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 + +# +# miscellaneous packages +# + +# +# 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 + +# +# 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_LIBCSV is not set +CONFIG_PKG_USING_OPTPARSE=y +CONFIG_PKG_OPTPARSE_PATH="/packages/misc/optparse" +CONFIG_PKG_USING_OPTPARSE_LATEST_VERSION=y +CONFIG_PKG_OPTPARSE_VER="latest" +# CONFIG_OPTPARSE_USING_DEMO 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_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_DIGITALCTRL 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_UKAL 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_UTEST_CMD_PREFIX="bsp.nuvoton.utest." +CONFIG_BOARD_USE_UTEST=y + +# +# Hardware Drivers Config +# + +# +# On-chip Peripheral Drivers +# +CONFIG_SOC_SERIES_MA35D1=y +CONFIG_RT_USING_FPU=y +# CONFIG_BSP_USE_STDDRIVER_SOURCE is not set +CONFIG_BSP_USING_PDMA=y +CONFIG_BSP_USING_PDMA0=y +CONFIG_BSP_USING_PDMA1=y +# CONFIG_BSP_USING_PDMA2 is not set +# CONFIG_BSP_USING_PDMA3 is not set +CONFIG_NU_PDMA_MEMFUN_ACTOR_MAX=4 +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_GMAC=y +CONFIG_BSP_USING_GMAC0=y +CONFIG_BSP_USING_GMAC1=y +CONFIG_BSP_USING_RTC=y +# CONFIG_NU_RTC_SUPPORT_IO_RW is not set +# CONFIG_NU_RTC_SUPPORT_MSH_CMD is not set +CONFIG_BSP_USING_ADC=y +CONFIG_BSP_USING_ADC_TOUCH=y +CONFIG_BSP_USING_CCAP=y +CONFIG_BSP_USING_CCAP0=y +# CONFIG_BSP_USING_CCAP1 is not set +# CONFIG_BSP_USING_EADC is not set +# CONFIG_BSP_USING_TMR is not set +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART0=y +# CONFIG_BSP_USING_UART0_TX_DMA is not set +# CONFIG_BSP_USING_UART0_RX_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_UART8 is not set +# CONFIG_BSP_USING_UART9 is not set +# CONFIG_BSP_USING_UART10 is not set +CONFIG_BSP_USING_UART11=y +CONFIG_BSP_USING_UART11_TX_DMA=y +CONFIG_BSP_USING_UART11_RX_DMA=y +CONFIG_BSP_USING_UART12=y +# CONFIG_BSP_USING_UART12_TX_DMA is not set +# CONFIG_BSP_USING_UART12_RX_DMA is not set +# CONFIG_BSP_USING_UART13 is not set +CONFIG_BSP_USING_UART14=y +# CONFIG_BSP_USING_UART14_TX_DMA is not set +# CONFIG_BSP_USING_UART14_RX_DMA is not set +# CONFIG_BSP_USING_UART15 is not set +CONFIG_BSP_USING_UART16=y +CONFIG_BSP_USING_UART16_TX_DMA=y +CONFIG_BSP_USING_UART16_RX_DMA=y +CONFIG_BSP_USING_I2C=y +CONFIG_BSP_USING_I2C0=y +CONFIG_BSP_USING_I2C1=y +CONFIG_BSP_USING_I2C2=y +CONFIG_BSP_USING_I2C3=y +CONFIG_BSP_USING_I2C4=y +CONFIG_BSP_USING_I2C5=y +CONFIG_BSP_USING_SDH=y +CONFIG_BSP_USING_SDH0=y +CONFIG_BSP_USING_SDH1=y +# CONFIG_BSP_USING_CANFD is not set +# CONFIG_BSP_USING_EPWM is not set +CONFIG_BSP_USING_SPI=y +# CONFIG_BSP_USING_SPI_PDMA is not set +CONFIG_BSP_USING_SPI0_NONE=y +# CONFIG_BSP_USING_SPI0 is not set +# CONFIG_BSP_USING_SPII2S0 is not set +CONFIG_BSP_USING_SPI1_NONE=y +# CONFIG_BSP_USING_SPI1 is not set +# CONFIG_BSP_USING_SPII2S1 is not set +CONFIG_BSP_USING_SPI2_NONE=y +# CONFIG_BSP_USING_SPI2 is not set +# CONFIG_BSP_USING_SPII2S2 is not set +CONFIG_BSP_USING_SPI3_NONE=y +# CONFIG_BSP_USING_SPI3 is not set +# CONFIG_BSP_USING_SPII2S3 is not set +CONFIG_BSP_USING_I2S=y +CONFIG_BSP_USING_I2S0=y +# CONFIG_BSP_USING_I2S1 is not set +CONFIG_NU_I2S_DMA_FIFO_SIZE=2048 +CONFIG_BSP_USING_QSPI=y +# CONFIG_BSP_USING_QSPI_PDMA is not set +CONFIG_BSP_USING_QSPI0=y +# CONFIG_BSP_USING_QSPI0_PDMA is not set +# CONFIG_BSP_USING_QSPI1 is not set +# CONFIG_BSP_USING_SCUART is not set +# CONFIG_BSP_USING_ECAP is not set +# CONFIG_BSP_USING_QEI is not set +# CONFIG_BSP_USING_CRYPTO is not set +# CONFIG_BSP_USING_TRNG is not set +# CONFIG_BSP_USING_CRC is not set +# CONFIG_BSP_USING_SOFT_I2C is not set +CONFIG_BSP_USING_DISP=y +CONFIG_LCM_USING_FW070TFT_WSVGA=y +# CONFIG_LCM_USING_FW070TFT_WVGA is not set +# CONFIG_LCM_USING_FHD is not set +CONFIG_DISP_USING_LCD_IDX=0 +CONFIG_BSP_LCD_BPP=32 +CONFIG_BSP_LCD_WIDTH=1024 +CONFIG_BSP_LCD_HEIGHT=600 +CONFIG_DISP_USING_OVERLAY=y +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_EBI is not set +# CONFIG_BSP_USING_USBD is not set +CONFIG_BSP_USING_USBH=y +CONFIG_BSP_USING_HSUSBH0=y +CONFIG_BSP_USING_HSUSBH1=y + +# +# On-board Peripheral Drivers +# +CONFIG_BSP_USING_CONSOLE=y +CONFIG_BOARD_USING_NAU8822=y +CONFIG_BOARD_USING_STORAGE_SDCARD=y +CONFIG_BOARD_USING_STORAGE_EMMC=y +# CONFIG_BOARD_USING_STORAGE_SPIFLASH is not set +CONFIG_BOARD_USING_STORAGE_SPINAND=y +# CONFIG_BOARD_USING_BUZZER is not set +CONFIG_BOARD_USING_USBHOST=y + +# +# Board extended module drivers +# +CONFIG_BOARD_USING_LCM=y +# CONFIG_BOARD_USING_LCM_FW070TFT_WVGA is not set +CONFIG_BOARD_USING_LCM_FW070TFT_WSVGA=y +# CONFIG_BOARD_USING_GT911 is not set +CONFIG_BOARD_USING_ADCTOUCH=y +CONFIG_BOARD_USING_SENSOR0=y +CONFIG_BOARD_USING_SENSON0_ID=0 +# CONFIG_BOARD_USING_SENSOR1 is not set + +# +# Nuvoton Packages Config +# +CONFIG_NU_PKG_USING_UTILS=y +# CONFIG_NU_PKG_USING_DEMO is not set +CONFIG_NU_PKG_USING_LVGL=y +# CONFIG_NU_PKG_USING_BMX055 is not set +# CONFIG_NU_PKG_USING_MAX31875 is not set +# CONFIG_NU_PKG_USING_NCT7717U is not set +# CONFIG_NU_PKG_USING_NAU88L25 is not set +CONFIG_NU_PKG_USING_NAU8822=y +# CONFIG_NU_PKG_USING_DA9062 is not set +# CONFIG_NU_PKG_USING_ILI9341 is not set +# CONFIG_NU_PKG_USING_SSD1963 is not set +# CONFIG_NU_PKG_USING_FSA506 is not set +# CONFIG_NU_PKG_USING_TPC is not set +CONFIG_NU_PKG_USING_ADC_TOUCH=y +# CONFIG_NU_PKG_USING_ADC_TOUCH_SW is not set +CONFIG_NU_PKG_USING_SPINAND=y diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/Kconfig b/bsp/nuvoton/numaker-hmi-ma35d1/Kconfig new file mode 100644 index 0000000000..a78782d615 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/Kconfig @@ -0,0 +1,27 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +# you can change the RTT_ROOT default "../../.." to your rtthread_root, +# example : default "F:/git_repositories/rt-thread" + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +config USE_MA35D1_AARCH32 + bool + default y + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "$BSP_DIR/board/Kconfig" diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/README.md b/bsp/nuvoton/numaker-hmi-ma35d1/README.md new file mode 100644 index 0000000000..9343a68fd0 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/README.md @@ -0,0 +1,216 @@ +# **NuMaker-HMI-MA35D1** + +## **Introduction** + +The NuMaker-HMI-MA35D1 is an evaluation board for Nuvoton NuMicro MA35D1 series microprocessors, and consists of three parts: a NuMaker-SOM-MA35D16A81 SOM board, a NuMaker-BASE-MA35D1B1 base board and a 7 inch TFT-LCD daughter board. The SOM board integrates core components to simplify the system design, based on MA35D16A887C (BGA312 package, and stacking a 256 MB DDR), PMIC power solution, a 16 GB eMMC Flash, and two Gigabit Ethernet PHY. The NuMaker-HMI-MA35D1-S1 has rich peripherals such as 2 sets of Gigabit Ethernet, USB2.0 high-speed host and device, 2 sets of CAN FD, and SPI, I2C, UART, RS-485 serial communication ports for users to facilitate the evaluation in HMI and industrial control, home appliances, 2-wheel cluster, medical device, new energy applications, ML (Machine Learning) or your creative applications. + +The NuMicro MA35D1 series is a heterogeneous multi-core microprocessor targeted to high-end edge IIoT gateway. It is based on dual 64-bit Arm Cortex-A35 cores, and one 180 MHz Arm Cortex-M4 core. Based on the high-performance cores, the MA35D1 series facilities the tiny AI/ML for edge computing. The MA35D1 supports 16-bit DDR2 and DDR3/DDR3L SDRAM. For an easy system design and manufacture, the MA35D1 series also offers LQFP and BGA packages stacked with the DDR2/DDR3L SDRAM and density up to 512 MB, which significantly reduces PCB layer, size and electromagnetic interference (EMI). + +

+fishy +

+ +|NuMaker-BASE-MA35D1B1|NuMaker-SOM-MA35D16A81|7-inch LCD Panel| +|--|--|--| +|

fishy

|

fishy

|

fishy

| + +## **NuMaker-SOM-MA35D16A81 Features** + +
    +
  • Target Chip
  • +
      +
    • MA35D16A887C (BGA 312-Ball) MCP package with DDR3L (256 MB), which can run up to 800 MHz
    • +
    +
  • Power
  • +
      +
    • DC 5V input through the high speed connector**
    • +
    • PMIC DA9062-3A
    • +
        +
      • Four DC/DC
      • + To supply 1.2V Core power, 1.2V CPU power, 1.35V DDR3L Memory power and 3.3V I/O power +
      • Four LDO
      • + To supply 3.0V RTC power, 1.8V I/O power, 2.5V PLL power and 3.3V/1.8V eMMC NAND Flash power +
      +
    • Battery input header
    • +
    +
  • Memory Devices
  • +
      +
    • An on-board eMMC NAND Flash memory device (16 GB)
    • +
    +
  • Two Gigabit Ethernet (RGMII) PHY devices
  • +
  • Two 120-pin high speed connectors to connect with BASE board
  • +
  • One PMIC reset key button
  • +
+ +## **NuMaker-BASE-MA35D1B1 Features** + +
    +
  • Power
  • +
      +
    • 5V/2A Power Jack and Slide Switch
    • +
    +
  • Debug/Trace
  • +
      +
    • UART0 debug port: USB Virtual COM (VCOM) port
    • +
    • Debug/Trace ports: SWJ (JTAG+SWD), ETM and SWD connectors
    • +
    +
  • Memory Devices
  • +
      +
    • An on-board Quad SPI NAND Flash device (512 MB)
    • +
    • An on-board NAND Flash device (1 GB)
    • +
    • Standard-SD (SD2.0) memory card slot
    • +
    + +
  • One power-on setting DIP-Switch for evaluation booting source selection
  • + +
  • Two 120-pin high speed connectors to connect with SOM board
  • +
  • Two sets of Gigabit Ethernet ports: Two Gigabit Ethernet transformer devices and two RJ45 port connectors
  • +
  • Two sets of high speed USB ports: One Host/Device port and one Host port
  • +
  • Two camera capture (CMOS sensor) header connectors
  • +
  • One LCM connector to connect with 7-inch 1024x600 LCD daughter board
  • +
  • One audio codec with microphone input and speaker output
  • +
  • One SIM card slot
  • +
  • One External Bus Interface (EBI) header connector
  • +
  • Two sets of UART transceivers and DB9 connectors
  • +
  • Two sets of RS485 transceivers and header connectors
  • +
  • Two sets of CAN FD transceivers and header connectors
  • +
  • One 8-channel ADC header connector
  • +
  • MEMS Microphone
  • +
  • MEMS G-Sensor
  • +
  • Three user key buttons
  • +
  • Two user LEDs
  • +
  • One set of buzzer pads
  • +
+ +## **Supported compiler** + +Support GCC compiler. More information of these compiler version as following: + +| Compiler | Tested version | +| -- | -- | +| GCC | 6-2017-q1-update| + +## **Build RT-Thread** +You can build rt-thread.bin for NuMaker-HMI-MA35D1 board. Steps as following. Notice, the building will include **ma35-rtp/rtthread.bin** file into **NuMaker-HMI-MA35D1/rtthread.bin** for heterogeneous multi-core demonstration. + +```bash +# cd rt-thread/bsp/nuvoton/numaker-hmi-ma35d1 +# menuconfig --generate +# scons -c +# pkgs --update +Cloning into '\bsp\bsp\nuvoton\numaker-hmi-ma35d1\packages\LVGL-latest'... +remote: Enumerating objects: 67821, done. +remote: Counting objects: 100% (1085/1085), done. +remote: Compressing objects: 100% (608/608), done. +remote: Total 67821 (delta 512), reused 964 (delta 476), pack-reused 66736 +Receiving objects: 100% (67821/67821), 109.32 MiB | 572.00 KiB/s, done. +Resolving deltas: 100% (52349/52349), done. +Updating files: 100% (1248/1248), done. +==============================> LVGL latest is downloaded successfully. +... +==============================> OPTPARSE latest is downloaded successfully. +==============================> wavplayer update done +==============================> ramdisk update done +==============================> optparse update done +Operation completed successfully. + +# scons -j 16 +… +… +LINK rtthread.elf +arm-none-eabi-objcopy -O binary rtthread.elf rtthread.bin +arm-none-eabi-size rtthread.elf + text data bss dec hex filename +1208928 14828 15507944 16731700 ff4e34 rtthread.elf +scons: done building targets. + +\bsp\nuvoton\numaker-hmi-ma35d1\rtthread.bin +``` + +## **Program firmware using NuWriter** + +To switch SW4 dip-switch on NuMaker-BASE-MA35D1B1 to do corresponding actions as below. + +**Power-on Setting** +L: OFF dip-switch +H: ON dip-switch + +| Memory Storage | **Burn to** settings | **Boot from** settings | +|--|--|--| +| **DDR** |
  • Switch 1(PG0) to ON.
  • Switch 3(PG2) to ON.
  • Switch 4(PG3) to ON.
  • Switch Others to OFF.
| | +| **EMMC**
(Select eMMC1 device and 8-bit mode) |
  • Switch 1(PG0) to ON.
  • Switch 3(PG2) to ON.
  • Switch 4(PG3) to ON.
  • Switch 7(PG6) to ON.
  • Switch 8(PG7) to ON.
  • Switch Others to OFF.
|
  • Switch 1(PG0) to ON.
  • Switch 3(PG2) to ON.
  • Switch 7(PG6) to ON.
  • Switch 8(PG7) to ON.
  • Switch Others to OFF.
| +| **Raw NAND**
(Select Ignore BCH and Page setting) |
  • Switch 1(PG0) to ON.
  • Switch 3(PG2) to ON.
  • Switch 4(PG3) to ON.
  • Switch Others to OFF.
|
  • Switch 1(PG0) to ON.
  • Switch 4(PG3) to ON.
  • Switch Others to OFF.
| +| **Serial NAND**
(Select 4-bit mode) |
  • Switch 1(PG0) to ON.
  • Switch 3(PG2) to ON.
  • Switch 4(PG3) to ON.
  • Switch 7(PG6) to ON.
  • Switch Others to OFF.
|
  • Switch 1(PG0) to ON.
  • Switch 7(PG6) to ON.
  • Switch Others to OFF.
+ +### **Download to DDR and Run** + +You can run windows batch script to download rtthread.bin into memory, then run it. The path of batch script as below,. + +```bash +\bsp\nuvoton\numaker-hmi-ma35d1\nuwriter_scripts\nuwriter_ddr_download_and_run.bat +``` + +

+ +

+ +### **Burn to EMMC** + +You can run windows batch script to download rtthread.bin into emmc flash, then run it. The path of batch script as below,. + +```bash +\bsp\nuvoton\numaker-hmi-ma35d1\nuwriter_scripts\nuwriter_sd_programming.bat +``` + +

+ +

+ +### **Burn to Serial NAND** + +You can run windows batch script to download rtthread.bin into SPI-NAND flash, then run it. The path of batch script as below,. + +```bash +\bsp\nuvoton\numaker-hmi-ma35d1\nuwriter_scripts\nuwriter_spinand_programming.bat +``` + +

+ +

+ +### **Burn to Raw NAND** + +You can run windows batch script to download rtthread.bin into Raw NAND flash, then run it. The path of batch script as below. + +```bash +\bsp\nuvoton\numaker-hmi-ma35d1\nuwriter_scripts\nuwriter_nand_programming.bat +``` + +

+ +

+ +## **Test** + +|Connector on board|Wiring|Usage| +|-|-|-| +|VCOM(CON21)|Use an USB line| rt-thread@RTP Console | +|RS232_16(CON14)|Using an USB to RS232 convert| rt-thread@CA35 Console | + +You can use Tera Term terminate emulator (or other software) to type commands of RTT. All parameters of serial communication are shown in below image. Here, you can find out the corresponding port number of Nuvoton Virtual Com Port in window device manager. + +

+fishy +

+
+ +## **Purchase** + +* [Nuvoton Direct](https://ComingSoon) + +## **Resources** + +* [Download Board Schematics](https://ComingSoon) +* [Download Quick Start Guide](https://ComingSoon) +* [Download TRM](https://ComingSoon) +* [Download NuWriter](https://github.com/OpenNuvoton/MA35D1_NuWriter) diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/SConscript b/bsp/nuvoton/numaker-hmi-ma35d1/SConscript new file mode 100644 index 0000000000..fe0ae941ae --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/SConscript @@ -0,0 +1,14 @@ +# for module compiling +import os +Import('RTT_ROOT') + +cwd = str(Dir('#')) +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/nuvoton/numaker-hmi-ma35d1/SConstruct b/bsp/nuvoton/numaker-hmi-ma35d1/SConstruct new file mode 100644 index 0000000000..5143e3012d --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/SConstruct @@ -0,0 +1,58 @@ +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, + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS, + CXXCOM = '$CXX -o $TARGET -c $CXXFLAGS $_CCCOMCOM $SOURCES') + +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) +env['ASCOM'] = env['ASPPCOM'] + +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) + +nuvoton_library = 'ma35' +rtconfig.BSP_LIBRARY_TYPE = nuvoton_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, nuvoton_library, 'SConscript'))) + +# include nu_pkgs +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'nu_packages', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/SConscript b/bsp/nuvoton/numaker-hmi-ma35d1/applications/SConscript new file mode 100644 index 0000000000..3769d125df --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/SConscript @@ -0,0 +1,21 @@ +# RT-Thread building script for component + +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')) + +src = Glob('*.c') + Glob('*.cpp') +CPPPATH = [cwd, str(Dir('#'))] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +objs = objs + group + +Return('objs') + diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/SConscript b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/SConscript new file mode 100644 index 0000000000..18f793dbe0 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/SConscript @@ -0,0 +1,10 @@ +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('LVGL-port', src, depend = ['PKG_USING_LVGL'], CPPPATH = CPPPATH) + +Return('group') + diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_conf.h b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_conf.h new file mode 100644 index 0000000000..c902bc904c --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_conf.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-2-17 Wayne First version + */ + +#ifndef LV_CONF_H +#define LV_CONF_H + +#include "rtconfig.h" + +#define LV_COLOR_DEPTH BSP_LCD_BPP +#define LV_HOR_RES_MAX BSP_LCD_WIDTH +#define LV_VER_RES_MAX BSP_LCD_HEIGHT + +#define LV_FONT_MONTSERRAT_12 1 +#define LV_FONT_MONTSERRAT_16 1 +#define LV_USE_PERF_MONITOR 1 +//#define CONFIG_LV_LOG_LEVEL LV_LOG_LEVEL_TRACE + +//#define LV_USE_DEMO_RTT_MUSIC 1 +#if LV_USE_DEMO_RTT_MUSIC + #define LV_COLOR_SCREEN_TRANSP 1 + #define LV_DEMO_RTT_MUSIC_AUTO_PLAY 1 + + #define LV_USE_DEMO_MUSIC 1 + #define LV_DEMO_MUSIC_AUTO_PLAY 1 +#endif + +/* Please comment LV_USE_DEMO_RTT_MUSIC declaration before un-comment below */ +#define LV_USE_DEMO_WIDGETS 1 +//#define LV_USE_DEMO_BENCHMARK 1 + +#endif diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_demo.c b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_demo.c new file mode 100644 index 0000000000..7a04e1804a --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_demo.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-6-1 Wayne First version + */ + +#include + +void lv_user_gui_init(void) +{ + /* display demo; you may replace with your LVGL application at here and disable related definitions. */ + +#if LV_USE_DEMO_BENCHMARK + extern void lv_demo_benchmark(void); + lv_demo_benchmark(); +#endif + +#if LV_USE_DEMO_WIDGETS + extern void lv_demo_widgets(void); + lv_demo_widgets(); +#endif + +#if LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC + extern void lv_demo_music(void); + lv_demo_music(); +#endif + +} diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.c b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.c new file mode 100644 index 0000000000..8c1de86b8d --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.c @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-12-17 Wayne The first version + */ +#include +#include "drv_common.h" + +#define LOG_TAG "lvgl.disp" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL DBG_ERROR +#define DBG_COLOR +#include + +/*A static or global variable to store the buffers*/ +static lv_disp_draw_buf_t disp_buf; +static rt_device_t lcd_device = 0; +static struct rt_device_graphic_info info; +static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ + +static void *buf3_next = RT_NULL; + +static uint32_t u32FirstFlush = 0; + +static void nu_antitearing(lv_disp_draw_buf_t *draw_buf, lv_color_t *color_p) +{ + if (buf3_next) + { + /* vsync-none: Use triple screen-sized buffers. */ + if (draw_buf->buf1 == color_p) + draw_buf->buf1 = buf3_next; + else + draw_buf->buf2 = buf3_next; + + draw_buf->buf_act = buf3_next; + buf3_next = color_p; + } + else + { + /* vsync-after: Use ping-pong screen-sized buffers only.*/ + rt_device_control(lcd_device, RTGRAPHIC_CTRL_WAIT_VSYNC, RT_NULL); + } +} + +static void nu_flush_direct(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) +{ + /* Use PANDISPLAY */ + rt_device_control(lcd_device, RTGRAPHIC_CTRL_PAN_DISPLAY, color_p); + + //TODO + nu_antitearing(disp_drv->draw_buf, color_p); + + if (!u32FirstFlush) + { + /* Enable backlight at first flushing. */ + rt_device_control(lcd_device, RTGRAPHIC_CTRL_POWERON, RT_NULL); + u32FirstFlush = 1; + } + + lv_disp_flush_ready(disp_drv); +} + +static void nu_flush_full_refresh(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) +{ + rt_hw_cpu_dcache_clean(color_p, disp_drv->draw_buf->size * sizeof(lv_color_t)); + + /* Use PANDISPLAY without H/W copying */ + rt_device_control(lcd_device, RTGRAPHIC_CTRL_PAN_DISPLAY, color_p); + + nu_antitearing(disp_drv->draw_buf, color_p); + + if (!u32FirstFlush) + { + /* Enable backlight at first flushing. */ + rt_device_control(lcd_device, RTGRAPHIC_CTRL_POWERON, RT_NULL); + u32FirstFlush = 1; + } + + lv_disp_flush_ready(disp_drv); +} + +static void nu_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) +{ + int32_t flush_area_w = lv_area_get_width(area); + int32_t flush_area_h = lv_area_get_height(area); + + rt_kprintf("[%s %08x] %dx%d %d %d %d %d\n", __func__, color_p, flush_area_w, flush_area_h, area->x1, area->y1, area->x2, area->y2); + + /* Update dirty region. */ + //TODO + + if (!u32FirstFlush) + { + /* Enable backlight at first flushing. */ + rt_device_control(lcd_device, RTGRAPHIC_CTRL_POWERON, RT_NULL); + u32FirstFlush = 1; + } + lv_disp_flush_ready(disp_drv); +} + +void nu_perf_monitor(struct _lv_disp_drv_t *disp_drv, uint32_t time, uint32_t px) +{ + rt_kprintf("Elapsed: %dms, Pixel: %d, Bytes:%d, %d%\n", time, px, px * sizeof(lv_color_t), px * 100 / disp_drv->draw_buf->size); +} + +void lv_port_disp_init(void) +{ + rt_err_t result; + void *buf1 = RT_NULL; + void *buf2 = RT_NULL; + uint32_t u32FBSize; + + lcd_device = rt_device_find("lcd"); + if (lcd_device == 0) + { + LOG_E("error!"); + return; + } + + /* get framebuffer address */ + result = rt_device_control(lcd_device, RTGRAPHIC_CTRL_GET_INFO, &info); + if (result != RT_EOK) + { + LOG_E("error!"); + /* get device information failed */ + return; + } + + /* Disable backlight at startup. */ + rt_device_control(lcd_device, RTGRAPHIC_CTRL_POWEROFF, RT_NULL); + + RT_ASSERT(info.bits_per_pixel == 8 || info.bits_per_pixel == 16 || + info.bits_per_pixel == 24 || info.bits_per_pixel == 32); + + lv_disp_drv_init(&disp_drv); /*Basic initialization*/ + + /*Set the resolution of the display*/ + disp_drv.hor_res = info.width; + disp_drv.ver_res = info.height; + disp_drv.full_refresh = 1; + //disp_drv.direct_mode = 1; + u32FBSize = info.height * info.width * (info.bits_per_pixel / 8); + + if (disp_drv.full_refresh || disp_drv.direct_mode) + { + buf1 = (void *)((uint32_t)info.framebuffer & (~UNCACHEABLE)); + buf2 = (void *)((uint32_t)buf1 + u32FBSize); + buf3_next = (void *)((uint32_t)buf2 + u32FBSize); + rt_kprintf("LVGL: Triple screen-sized buffers(%s) - buf1@%08x, buf2@%08x, buf3_next@%08x\n", (disp_drv.full_refresh == 1) ? "full_refresh" : "direct_mode", buf1, buf2, buf3_next); + + if (disp_drv.direct_mode) + disp_drv.flush_cb = nu_flush_direct; + else + disp_drv.flush_cb = nu_flush_full_refresh; + } + else + { + buf1 = (void *)(((uint32_t)info.framebuffer) + u32FBSize); + buf2 = (void *)((uint32_t)buf1 + u32FBSize); + rt_kprintf("LVGL: Two screen-sized buffers - buf1@%08x, buf2@%08x\n", buf1, buf2); + rt_device_control(lcd_device, RTGRAPHIC_CTRL_PAN_DISPLAY, info.framebuffer); + + disp_drv.flush_cb = nu_flush; + } + + /*Initialize `disp_buf` with the buffer(s).*/ + lv_disp_draw_buf_init(&disp_buf, buf1, buf2, info.width * info.height); + + result = rt_device_open(lcd_device, 0); + if (result != RT_EOK) + { + LOG_E("error!"); + return; + } + + /*Set a display buffer*/ + disp_drv.draw_buf = &disp_buf; + + /*Called after every refresh cycle to tell the rendering and flushing time + the number of flushed pixels*/ + //disp_drv.monitor_cb = nu_perf_monitor; + + /*Finally register the driver*/ + lv_disp_drv_register(&disp_drv); +} diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.h b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.h new file mode 100644 index 0000000000..b11ce3c5b6 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-18 Meco Man The first version + */ +#ifndef LV_PORT_DISP_H +#define LV_PORT_DISP_H + +#ifdef __cplusplus +extern "C" { +#endif + +void lv_port_disp_init(void); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_indev.c b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_indev.c new file mode 100644 index 0000000000..b1f2e4c4b4 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_indev.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-18 Meco Man The first version + * 2021-12-17 Wayne Add input event + */ +#include +#include +#include +#include "touch.h" + +static lv_indev_state_t last_state = LV_INDEV_STATE_REL; +static rt_int16_t last_x = 0; +static rt_int16_t last_y = 0; + +static void input_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) +{ + data->point.x = last_x; + data->point.y = last_y; + data->state = last_state; +} + +void nu_touch_inputevent_cb(rt_int16_t x, rt_int16_t y, rt_uint8_t state) +{ + switch (state) + { + case RT_TOUCH_EVENT_UP: + last_state = LV_INDEV_STATE_RELEASED; + break; + case RT_TOUCH_EVENT_MOVE: + case RT_TOUCH_EVENT_DOWN: + last_x = x; + last_y = y; + last_state = LV_INDEV_STATE_PRESSED; + break; + } +} + +void lv_port_indev_init(void) +{ + static lv_indev_drv_t indev_drv; + + /* Basic initialization */ + lv_indev_drv_init(&indev_drv); + indev_drv.type = LV_INDEV_TYPE_POINTER; + indev_drv.read_cb = input_read; + + /* Register the driver in LVGL and save the created input device object */ + lv_indev_drv_register(&indev_drv); +} diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_indev.h b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_indev.h new file mode 100644 index 0000000000..bde7176807 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_indev.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-18 Meco Man The first version + */ +#ifndef LV_PORT_INDEV_H +#define LV_PORT_INDEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +extern lv_indev_t *button_indev; + +void lv_port_indev_init(void); +void lv_port_indev_input(rt_int16_t x, rt_int16_t y, lv_indev_state_t state); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/main.c b/bsp/nuvoton/numaker-hmi-ma35d1/applications/main.c new file mode 100644 index 0000000000..4c781acff3 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/main.c @@ -0,0 +1,71 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-6-1 Wayne First version +* +******************************************************************************/ + +#include +#include +#include "drv_common.h" + +#if defined(RT_USING_PIN) +#include "drv_gpio.h" + +/* defined the LED_0 pin: PJ14 */ +#define LED_0 NU_GET_PININDEX(NU_PJ, 14) + +int main(int argc, char **argv) +{ + int counter = 10000; + + /* set LED_0 pin mode to output */ + rt_pin_mode(LED_0, PIN_MODE_OUTPUT); + + while (counter--) + { + rt_pin_write(LED_0, PIN_HIGH); + rt_thread_mdelay(100); + rt_pin_write(LED_0, PIN_LOW); + rt_thread_mdelay(100); + } + + return 0; +} + +#else + +int main(int argc, char **argv) +{ + rt_kprintf("cpu-%d %d\r\n", rt_hw_cpu_id(), nu_cpu_dcache_line_size()); + return 0; +} + +#endif + +void happy_counter(void *pdata) +{ + uint32_t counter = 0; + while (1) + { + rt_kprintf("cpu-%d %d\r\n", rt_hw_cpu_id(), counter++); + rt_thread_mdelay(1000); + } +} + +void go_happy_counter(void) +{ + rt_thread_t tid = rt_thread_create("cpu-1", happy_counter, RT_NULL, 2048, 10, 20); + RT_ASSERT(tid != RT_NULL); + + rt_thread_control(tid, RT_THREAD_CTRL_BIND_CPU, (void *)1); + + rt_thread_startup(tid); +} +MSH_CMD_EXPORT(go_happy_counter, go happy counter); + diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/mnt.c b/bsp/nuvoton/numaker-hmi-ma35d1/applications/mnt.c new file mode 100644 index 0000000000..2ddb18f2ba --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/mnt.c @@ -0,0 +1,266 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-6-26 Wayne First version +* +******************************************************************************/ + +#include + +#define LOG_TAG "mnt" +#define DBG_ENABLE +#define DBG_SECTION_NAME "mnt" +#define DBG_LEVEL DBG_ERROR +#define DBG_COLOR +#include + +#include +#include +#include +#include +#include +#include + +#if defined(RT_USING_FAL) + #include +#endif + +#if defined(PKG_USING_RAMDISK) + #define RAMDISK_NAME "ramdisk0" + #define RAMDISK_UDC "ramdisk1" + #define MOUNT_POINT_RAMDISK0 "/" +#endif + +#if defined(BOARD_USING_STORAGE_SPIFLASH) + #define PARTITION_NAME_FILESYSTEM "filesystem" + #define MOUNT_POINT_SPIFLASH0 "/mnt/"PARTITION_NAME_FILESYSTEM +#endif + +#ifdef RT_USING_DFS_MNTTABLE + +/* +const char *device_name; +const char *path; +const char *filesystemtype; +unsigned long rwflag; +const void *data; +*/ + +const struct dfs_mount_tbl mount_table[] = +{ +#if defined(PKG_USING_RAMDISK) + { RAMDISK_UDC, "/mnt/ram_usbd", "elm", 0, RT_NULL }, +#endif +#if defined(PKG_USING_DFS_YAFFS) + { "nand1", "/mnt/filesystem", "yaffs", 0, RT_NULL }, +#elif defined(RT_USING_DFS_UFFS) + { "nand1", "/mnt/filesystem", "uffs", 0, RT_NULL }, +#endif + { "sd0", "/mnt/sd0", "elm", 0, RT_NULL }, + { "sd0p0", "/mnt/sd0p0", "elm", 0, RT_NULL }, + { "sd0p1", "/mnt/sd0p1", "elm", 0, RT_NULL }, + { "sd1", "/mnt/sd1", "elm", 0, RT_NULL }, + { "sd1p0", "/mnt/sd1p0", "elm", 0, RT_NULL }, + { "sd1p1", "/mnt/sd1p1", "elm", 0, RT_NULL }, + {0}, +}; +#endif + + +#if defined(PKG_USING_RAMDISK) + +extern rt_err_t ramdisk_init(const char *dev_name, rt_uint8_t *disk_addr, rt_size_t block_size, rt_size_t num_block); +int ramdisk_device_init(void) +{ + rt_err_t result = RT_EOK; + + /* Create a 16MB RAMDISK */ + result = ramdisk_init(RAMDISK_NAME, NULL, 512, 16 * 4096); + RT_ASSERT(result == RT_EOK); + + /* Create a 16MB RAMDISK */ + result = ramdisk_init(RAMDISK_UDC, NULL, 512, 16 * 4096); + RT_ASSERT(result == RT_EOK); + + return 0; +} +INIT_DEVICE_EXPORT(ramdisk_device_init); + +/* Recursive mkdir */ +static int mkdir_p(const char *dir, const mode_t mode) +{ + int ret = -1; + char *tmp = NULL; + char *p = NULL; + struct stat sb; + rt_size_t len; + + if (!dir) + goto exit_mkdir_p; + + /* Copy path */ + /* Get the string length */ + len = strlen(dir); + tmp = rt_strdup(dir); + + /* Remove trailing slash */ + if (tmp[len - 1] == '/') + { + tmp[len - 1] = '\0'; + len--; + } + + /* check if path exists and is a directory */ + if (stat(tmp, &sb) == 0) + { + if (S_ISDIR(sb.st_mode)) + { + ret = 0; + goto exit_mkdir_p; + } + } + + /* Recursive mkdir */ + for (p = tmp + 1; p - tmp <= len; p++) + { + if ((*p == '/') || (p - tmp == len)) + { + *p = 0; + + /* Test path */ + if (stat(tmp, &sb) != 0) + { + /* Path does not exist - create directory */ + if (mkdir(tmp, mode) < 0) + { + goto exit_mkdir_p; + } + } + else if (!S_ISDIR(sb.st_mode)) + { + /* Not a directory */ + goto exit_mkdir_p; + } + if (p - tmp != len) + *p = '/'; + } + } + + ret = 0; + +exit_mkdir_p: + + if (tmp) + rt_free(tmp); + + return ret; +} + +#if defined(PKG_USING_DFS_YAFFS) && defined(RT_USING_DFS_MNTTABLE) +#include "yaffs_guts.h" +void yaffs_dev_init(void) +{ + int i; + for (i = 0; i < sizeof(mount_table) / sizeof(struct dfs_mount_tbl); i++) + { + if (mount_table[i].filesystemtype && !rt_strcmp(mount_table[i].filesystemtype, "yaffs")) + { + struct rt_mtd_nand_device *psMtdNandDev = RT_MTD_NAND_DEVICE(rt_device_find(mount_table[i].device_name)); + if (psMtdNandDev) + { + yaffs_start_up(psMtdNandDev, (const char *)mount_table[i].path); + } + } + } +} +#endif + +/* Initialize the filesystem */ +int filesystem_init(void) +{ + rt_err_t result = RT_EOK; + +#if defined(RT_USING_FAL) + extern int fal_init_check(void); + if (!fal_init_check()) + fal_init(); +#endif + + // ramdisk as root + if (!rt_device_find(RAMDISK_NAME)) + { + LOG_E("cannot find %s device", RAMDISK_NAME); + result = -RT_ERROR; + goto exit_filesystem_init; + } + else + { + /* Format these ramdisk */ + result = (rt_err_t)dfs_mkfs("elm", RAMDISK_NAME); + RT_ASSERT(result == RT_EOK); + + /* mount ramdisk0 as root directory */ + if (dfs_mount(RAMDISK_NAME, "/", "elm", 0, RT_NULL) == 0) + { + LOG_I("ramdisk mounted on \"/\"."); + + /* now you can create dir dynamically. */ + mkdir_p("/mnt", 0x777); + mkdir_p("/cache", 0x777); + mkdir_p("/download", 0x777); + mkdir_p("/mnt/ram_usbd", 0x777); + mkdir_p("/mnt/filesystem", 0x777); + mkdir_p("/mnt/sd0", 0x777); + mkdir_p("/mnt/sd0p0", 0x777); + mkdir_p("/mnt/sd0p1", 0x777); + mkdir_p("/mnt/sd1", 0x777); + mkdir_p("/mnt/sd1p0", 0x777); + mkdir_p("/mnt/sd1p1", 0x777); +#if defined(RT_USBH_MSTORAGE) && defined(UDISK_MOUNTPOINT) + mkdir_p(UDISK_MOUNTPOINT, 0x777); +#endif + } + else + { + LOG_E("root folder creation failed!\n"); + goto exit_filesystem_init; + } + } + + if (!rt_device_find(RAMDISK_UDC)) + { + LOG_E("cannot find %s device", RAMDISK_UDC); + goto exit_filesystem_init; + } + else + { + /* Format these ramdisk */ + result = (rt_err_t)dfs_mkfs("elm", RAMDISK_UDC); + RT_ASSERT(result == RT_EOK); + } + +#if defined(BOARD_USING_STORAGE_SPIFLASH) + { + struct rt_device *psNorFlash = fal_blk_device_create(PARTITION_NAME_FILESYSTEM); + if (!psNorFlash) + { + rt_kprintf("Failed to create block device for %s.\n", PARTITION_NAME_FILESYSTEM); + } + } +#endif + +#if defined(PKG_USING_DFS_YAFFS) && defined(RT_USING_DFS_MNTTABLE) + yaffs_dev_init(); +#endif + +exit_filesystem_init: + + return -result; +} +INIT_ENV_EXPORT(filesystem_init); +#endif diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/board/Kconfig b/bsp/nuvoton/numaker-hmi-ma35d1/board/Kconfig new file mode 100644 index 0000000000..2fbf0bf116 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/board/Kconfig @@ -0,0 +1,154 @@ +menu "Hardware Drivers Config" + + menu "On-chip Peripheral Drivers" + source "$BSP_DIR/../libraries/ma35/rtt_port/Kconfig" + endmenu + + menu "On-board Peripheral Drivers" + + config BSP_USING_CONSOLE + bool "Enable UART0 for RTT Console(uart0)" + select BSP_USING_UART + select BSP_USING_UART0 + default y + + config BOARD_USING_NAU8822 + bool "NAU8822 Audio Codec supporting(over i2s0, i2c2)" + select NU_PKG_USING_NAU8822 + select BSP_USING_I2C2 + select BSP_USING_I2S + select BSP_USING_I2S0 + default n + + config BOARD_USING_STORAGE_SDCARD + bool "SDCARD supporting(over sdh0)" + select BSP_USING_SDH + select BSP_USING_SDH0 + default y + + config BOARD_USING_STORAGE_EMMC + bool "EMMC supporting(over sdh1)" + select BSP_USING_SDH + select BSP_USING_SDH1 + default y + + config BOARD_USING_STORAGE_SPIFLASH + bool "SPI NOR FLASH supporting(over qspi0)" + select BSP_USING_QSPI + select BSP_USING_QSPI0 + default n + + config BOARD_USING_STORAGE_SPINAND + bool "SPI NAND FLASH supporting(over qspi0)" + select BSP_USING_QSPI + select BSP_USING_QSPI0 + select NU_PKG_USING_SPINAND + default y + + config BOARD_USING_BUZZER + bool "BUZZER function(over epwm1_ch5)" + select BSP_USING_EPWM + select BSP_USING_EPWM1 + select BSP_USING_EPWM1_PWM + default y + + config BOARD_USING_USBHOST + bool "USB HOST function" + select BSP_USING_USBH + default y + + endmenu + + menu "Board extended module drivers" + + config BOARD_USING_LCM + bool "Use LCD panel." + default y + + if BOARD_USING_LCM + + choice + prompt "Select LCD panel devices.(Over DISP)" + default BOARD_USING_LCM_FW070TFT_WSVGA + + config BOARD_USING_LCM_FW070TFT_WVGA + bool "NuDesign TFT-LCD7-WVGA" + select BSP_USING_DISP + select LCM_USING_FW070TFT + help + Choose this option if you use 7" 800x480x32b LCD panel. + + config BOARD_USING_LCM_FW070TFT_WSVGA + bool "NuDesign TFT-LCD7-WSVGA" + select BSP_USING_DISP + select LCM_USING_FW070TFT_WSVGA + help + Choose this option if you use 7" 1024x600x32b LCD panel. + endchoice + + choice + prompt "Select Touch devices." + default BOARD_USING_GT911 + + config BOARD_USING_GT911 + bool "GT911 TPC" + select BSP_USING_I2C + select BSP_USING_I2C0 + select NU_PKG_USING_TPC_GT911 + help + Choose this option if you use GT911 external TSC touching function. + + config BOARD_USING_ADCTOUCH + bool "ADC touching" + select BSP_USING_ADC_TOUCH + select NU_PKG_USING_ADC_TOUCH + help + Choose this option if you use internal ADC touching function. + + endchoice + endif + + + + config BOARD_USING_SENSOR0 + bool "CCAP-SENSOR PORT0(over i2c3/PM1/PK8)" + select BSP_USING_I2C + select BSP_USING_I2C3 + select BSP_USING_CCAP + select BSP_USING_CCAP0 + default n + + if BOARD_USING_SENSOR0 + config BOARD_USING_SENSON0_ID + int "Specify Sensor0 ID" + default 0 if BOARD_USING_SENSOR0 + range 0 2 + help + HM1055=0 + ADV728X=1 + endif + + config BOARD_USING_SENSOR1 + bool "CCAP-SENSOR PORT1(over i2c4/PN14/PD15)" + select BSP_USING_I2C + select BSP_USING_I2C4 + select BSP_USING_CCAP + select BSP_USING_CCAP1 + default n + + if BOARD_USING_SENSOR1 + config BOARD_USING_SENSON1_ID + int "Specify Sensor1 ID" + default 0 + range 0 2 + help + HM1055=0 + ADV728X=1 + endif + + + endmenu + + source "$BSP_DIR/../libraries/nu_packages/Kconfig" + +endmenu diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/board/SConscript b/bsp/nuvoton/numaker-hmi-ma35d1/board/SConscript new file mode 100644 index 0000000000..38791565a2 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/board/SConscript @@ -0,0 +1,18 @@ +# RT-Thread building script for component + +from building import * + + +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +src = Split(""" +nutool_pincfg/nutool_pincfg.c +""") +src += Glob('*.c') + Glob('*.cpp') + Glob('*.S') +CPPPATH = [cwd, cwd + '/nutool_pincfg'] + +group = DefineGroup('board', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/board/board.h b/bsp/nuvoton/numaker-hmi-ma35d1/board/board.h new file mode 100644 index 0000000000..5d422bcf19 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/board/board.h @@ -0,0 +1,39 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-6-1 Wayne First version +* +******************************************************************************/ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include "NuMicro.h" +#include "drv_sys.h" +#include "nutool_pincfg.h" + +#define BOARD_SDRAM_START 0x80400000 +#define BOARD_SDRAM_SIZE 0x0FC00000 + +#define BOARD_HEAP_END ((void*)(BOARD_SDRAM_START+BOARD_SDRAM_SIZE)) +#define BOARD_HEAP_START ((void *)&__bss_end) + +extern int __bss_end; + +#if defined(RT_USING_MTD_NAND) + #include + #define MTD_SPINAND_PARTITION_NUM 3 + extern struct rt_mtd_nand_device mtd_partitions[MTD_SPINAND_PARTITION_NUM]; +#endif +extern void rt_hw_board_init(void); +extern void nu_clock_init(void); +extern void nu_clock_deinit(void); +extern void nu_pin_init(void); +extern void nu_pin_deinit(void); + +#endif /* BOARD_H_ */ diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/board/board_dev.c b/bsp/nuvoton/numaker-hmi-ma35d1/board/board_dev.c new file mode 100644 index 0000000000..97959fc4a4 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/board/board_dev.c @@ -0,0 +1,611 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-6-1 Wayne First version +* +******************************************************************************/ + +#include +#include +#include "drv_gpio.h" +#include "drv_sys.h" +#include "board.h" + + +#if defined(BOARD_USING_STORAGE_SPIFLASH) +#if defined(RT_USING_SFUD) + #include "spi_flash.h" + #include "spi_flash_sfud.h" +#endif + +#include "drv_qspi.h" + +#define W25X_REG_READSTATUS (0x05) +#define W25X_REG_READSTATUS2 (0x35) +#define W25X_REG_WRITEENABLE (0x06) +#define W25X_REG_WRITESTATUS (0x01) +#define W25X_REG_QUADENABLE (0x02) + +static rt_uint8_t SpiFlash_ReadStatusReg(struct rt_qspi_device *qspi_device) +{ + rt_uint8_t u8Val; + rt_err_t result = RT_EOK; + rt_uint8_t w25x_txCMD1 = W25X_REG_READSTATUS; + + result = rt_qspi_send_then_recv(qspi_device, &w25x_txCMD1, 1, &u8Val, 1); + RT_ASSERT(result > 0); + + return u8Val; +} + +static rt_uint8_t SpiFlash_ReadStatusReg2(struct rt_qspi_device *qspi_device) +{ + rt_uint8_t u8Val; + rt_err_t result = RT_EOK; + rt_uint8_t w25x_txCMD1 = W25X_REG_READSTATUS2; + + result = rt_qspi_send_then_recv(qspi_device, &w25x_txCMD1, 1, &u8Val, 1); + RT_ASSERT(result > 0); + + return u8Val; +} + +static rt_err_t SpiFlash_WriteStatusReg(struct rt_qspi_device *qspi_device, uint8_t u8Value1, uint8_t u8Value2) +{ + rt_uint8_t w25x_txCMD1; + rt_uint8_t au8Val[2]; + rt_err_t result; + struct rt_qspi_message qspi_message = {0}; + + /* Enable WE */ + w25x_txCMD1 = W25X_REG_WRITEENABLE; + result = rt_qspi_send(qspi_device, &w25x_txCMD1, sizeof(w25x_txCMD1)); + if (result != sizeof(w25x_txCMD1)) + goto exit_SpiFlash_WriteStatusReg; + + /* Prepare status-1, 2 data */ + au8Val[0] = u8Value1; + au8Val[1] = u8Value2; + + /* 1-bit mode: Instruction+payload */ + qspi_message.instruction.content = W25X_REG_WRITESTATUS; + qspi_message.instruction.qspi_lines = 1; + + qspi_message.qspi_data_lines = 1; + qspi_message.parent.cs_take = 1; + qspi_message.parent.cs_release = 1; + qspi_message.parent.send_buf = &au8Val[0]; + qspi_message.parent.length = sizeof(au8Val); + qspi_message.parent.next = RT_NULL; + + if (rt_qspi_transfer_message(qspi_device, &qspi_message) != sizeof(au8Val)) + { + result = -RT_ERROR; + } + + result = RT_EOK; + +exit_SpiFlash_WriteStatusReg: + + return result; +} + +static void SpiFlash_WaitReady(struct rt_qspi_device *qspi_device) +{ + volatile uint8_t u8ReturnValue; + + do + { + u8ReturnValue = SpiFlash_ReadStatusReg(qspi_device); + u8ReturnValue = u8ReturnValue & 1; + } + while (u8ReturnValue != 0); // check the BUSY bit +} + +static void SpiFlash_EnterQspiMode(struct rt_qspi_device *qspi_device) +{ + rt_err_t result = RT_EOK; + + uint8_t u8Status1 = SpiFlash_ReadStatusReg(qspi_device); + uint8_t u8Status2 = SpiFlash_ReadStatusReg2(qspi_device); + + u8Status2 |= W25X_REG_QUADENABLE; + + result = SpiFlash_WriteStatusReg(qspi_device, u8Status1, u8Status2); + RT_ASSERT(result == RT_EOK); + + SpiFlash_WaitReady(qspi_device); +} + +static void SpiFlash_ExitQspiMode(struct rt_qspi_device *qspi_device) +{ + rt_err_t result = RT_EOK; + uint8_t u8Status1 = SpiFlash_ReadStatusReg(qspi_device); + uint8_t u8Status2 = SpiFlash_ReadStatusReg2(qspi_device); + + u8Status2 &= ~W25X_REG_QUADENABLE; + + result = SpiFlash_WriteStatusReg(qspi_device, u8Status1, u8Status2); + RT_ASSERT(result == RT_EOK); + + SpiFlash_WaitReady(qspi_device); +} + +static int rt_hw_spiflash_init(void) +{ + if (nu_qspi_bus_attach_device("qspi0", "qspi01", 4, SpiFlash_EnterQspiMode, SpiFlash_ExitQspiMode) != RT_EOK) + return -1; + +#if defined(RT_USING_SFUD) + if (rt_sfud_flash_probe(FAL_USING_NOR_FLASH_DEV_NAME, "qspi01") == RT_NULL) + { + return -(RT_ERROR); + } +#endif + return 0; +} +INIT_COMPONENT_EXPORT(rt_hw_spiflash_init); +#endif /* BOARD_USING_STORAGE_SPIFLASH */ + +#if defined(BOARD_USING_STORAGE_SPINAND) && defined(NU_PKG_USING_SPINAND) + +#include "drv_qspi.h" +#include "spinand.h" + +struct rt_mtd_nand_device mtd_partitions[MTD_SPINAND_PARTITION_NUM] = +{ + [0] = + { + /*nand0: U-boot, env, rtthread*/ + .block_start = 0, + .block_end = 63, + .block_total = 64, + }, + [1] = + { + /*nand1: for filesystem mounting*/ + .block_start = 64, + .block_end = 4095, + .block_total = 4032, + }, + [2] = + { + /*nand2: Whole blocks size, overlay*/ + .block_start = 0, + .block_end = 4095, + .block_total = 4096, + } +}; + +static int rt_hw_spinand_init(void) +{ + if (nu_qspi_bus_attach_device("qspi0", "qspi01", 4, RT_NULL, RT_NULL) != RT_EOK) + return -1; + + if (rt_hw_mtd_spinand_register("qspi01") != RT_EOK) + return -1; + + return 0; +} + +INIT_COMPONENT_EXPORT(rt_hw_spinand_init); +#endif + +#if defined(BOARD_USING_NAU8822) && defined(NU_PKG_USING_NAU8822) +#include +S_NU_NAU8822_CONFIG sCodecConfig = +{ + .i2c_bus_name = "i2c2", + + .i2s_bus_name = "sound0", + + .pin_phonejack_en = NU_GET_PININDEX(NU_PD, 13), + + .pin_phonejack_det = NU_GET_PININDEX(NU_PI, 0), +}; + +int rt_hw_nau8822_port(void) +{ + if (nu_hw_nau8822_init(&sCodecConfig) != RT_EOK) + return -1; + + return 0; +} +INIT_COMPONENT_EXPORT(rt_hw_nau8822_port); +#endif /* BOARD_USING_NAU8822 */ + +#if defined(NU_PKG_USING_ADC_TOUCH) +#include "adc_touch.h" +S_CALIBRATION_MATRIX g_sCalMat = { -17558, 1, 69298832, -10, 11142, -2549195, 65536 }; +#endif + +#if defined(NU_PKG_USING_TPC_GT911) && defined(BOARD_USING_GT911) +#include "drv_gpio.h" +#include "gt911.h" + +#define TPC_RST_PIN NU_GET_PININDEX(NU_PM, 12) +#define TPC_IRQ_PIN NU_GET_PININDEX(NU_PD, 12) + +extern int tpc_sample(const char *name); +int rt_hw_gt911_port(void) +{ + struct rt_touch_config cfg; + rt_uint8_t rst_pin; + + rst_pin = TPC_RST_PIN; + cfg.dev_name = "i2c5"; + cfg.irq_pin.pin = TPC_IRQ_PIN; + cfg.irq_pin.mode = PIN_MODE_INPUT_PULLDOWN; + cfg.user_data = &rst_pin; + + rt_hw_gt911_init("gt911", &cfg); + + return tpc_sample("gt911"); +} +INIT_ENV_EXPORT(rt_hw_gt911_port); +#endif /* if defined(BOARD_USING_GT911) && defined(PKG_USING_GT911) */ + +#if defined(BOARD_USING_BUZZER) + +#define EPWM_DEV_NAME "epwm1" +#define EPWM_DEV_CHANNEL (5) + +static void PlayRingTone(void) +{ + struct rt_device_pwm *epwm_dev; + rt_uint32_t period; + int i, j; + + period = 1000; + + if ((epwm_dev = (struct rt_device_pwm *)rt_device_find(EPWM_DEV_NAME)) != RT_NULL) + { + rt_pwm_set(epwm_dev, EPWM_DEV_CHANNEL, period, period); + rt_pwm_enable(epwm_dev, EPWM_DEV_CHANNEL); + + for (j = 0; j < 5; j++) + { + for (i = 0; i < 10; i++) + { + rt_pwm_set(epwm_dev, EPWM_DEV_CHANNEL, period, period); + rt_thread_mdelay(50); + + rt_pwm_set(epwm_dev, EPWM_DEV_CHANNEL, period, period / 2); + rt_thread_mdelay(50); + } + + /* Mute 2 seconds */ + rt_pwm_set(epwm_dev, EPWM_DEV_CHANNEL, period, period); + rt_thread_mdelay(2000); + } + rt_pwm_disable(epwm_dev, EPWM_DEV_CHANNEL); + } + else + { + rt_kprintf("Can't find %s\n", EPWM_DEV_NAME); + } +} + +#if defined(BOARD_USING_LCM) + +#if defined(PKG_USING_GUIENGINE) + #include +#endif + +#if defined(RT_USING_PIN) + #include + + /* defined the LCM_BLEN pin: PK7 */ + #define LCM_BACKLIGHT_CTRL NU_GET_PININDEX(NU_PK, 7) +#endif + +#define EPWM_DEV_NAME "epwm1" +#define LCM_PWM_CHANNEL (1) + +void nu_lcd_backlight_on(void) +{ + struct rt_device_pwm *pwm_dev; + + if ((pwm_dev = (struct rt_device_pwm *)rt_device_find(EPWM_DEV_NAME)) != RT_NULL) + { + rt_pwm_enable(pwm_dev, LCM_PWM_CHANNEL); + rt_pwm_set(pwm_dev, LCM_PWM_CHANNEL, 100000, 100); + } + else + { + rt_kprintf("Can't find %s\n", EPWM_DEV_NAME); + } + + rt_pin_mode(LCM_BACKLIGHT_CTRL, PIN_MODE_OUTPUT); + rt_pin_write(LCM_BACKLIGHT_CTRL, PIN_HIGH); +} + +void nu_lcd_backlight_off(void) +{ + struct rt_device_pwm *pwm_dev; + + if ((pwm_dev = (struct rt_device_pwm *)rt_device_find(EPWM_DEV_NAME)) != RT_NULL) + { + rt_pwm_disable(pwm_dev, LCM_PWM_CHANNEL); + } + else + { + rt_kprintf("Can't find %s\n", EPWM_DEV_NAME); + } + + rt_pin_mode(LCM_BACKLIGHT_CTRL, PIN_MODE_OUTPUT); + rt_pin_write(LCM_BACKLIGHT_CTRL, PIN_LOW); +} + +int rt_hw_lcm_port(void) +{ +#if defined(PKG_USING_GUIENGINE) + rt_device_t lcm_vpost; + lcm_vpost = rt_device_find("lcd"); + if (lcm_vpost) + { + rtgui_graphic_set_device(lcm_vpost); + } +#endif + + return 0; +} +INIT_COMPONENT_EXPORT(rt_hw_lcm_port); +#endif /* BOARD_USING_LCM */ + +int buzzer_test(void) +{ + PlayRingTone(); + return 0; +} +#ifdef FINSH_USING_MSH + MSH_CMD_EXPORT(buzzer_test, Buzzer - Play ring tone); +#endif +#endif /* BOARD_USING_BUZZER */ + +#if defined(BOARD_USING_SENSOR0) +#include "ccap_sensor.h" + +#define SENSOR0_RST_PIN NU_GET_PININDEX(NU_PM, 1) +#define SENSOR0_PD_PIN NU_GET_PININDEX(NU_PK, 8) + +ccap_sensor_io sIo_sensor0 = +{ + .RstPin = SENSOR0_RST_PIN, + .PwrDwnPin = SENSOR0_PD_PIN, + .I2cName = "i2c3" +}; +#endif /* BOARD_USING_SENSOR0 */ + +#if defined(BOARD_USING_SENSOR1) +#include "ccap_sensor.h" + +#define SENSOR1_RST_PIN NU_GET_PININDEX(NU_PN, 14) +#define SENSOR1_PD_PIN NU_GET_PININDEX(NU_PD, 15) + +ccap_sensor_io sIo_sensor1 = +{ + .RstPin = SENSOR1_RST_PIN, + .PwrDwnPin = SENSOR1_PD_PIN, + .I2cName = "i2c4" +}; +#endif /* BOARD_USING_SENSOR1 */ + +int rt_hw_sensors_port(void) +{ +#if defined(BOARD_USING_SENSOR0) + nu_ccap_sensor_create(&sIo_sensor0, (ccap_sensor_id)BOARD_USING_SENSON0_ID, "sensor0"); +#endif +#if defined(BOARD_USING_SENSOR1) + nu_ccap_sensor_create(&sIo_sensor1, (ccap_sensor_id)BOARD_USING_SENSON1_ID, "sensor1"); +#endif + return 0; +} +INIT_COMPONENT_EXPORT(rt_hw_sensors_port); + + +void nu_rtp_sspcc_setup(void) +{ + SSPCC_SET_REALM(SSPCC_UART16, SSPCC_SSET_SUBM); + SSPCC_SET_REALM(SSPCC_TMR23, SSPCC_SSET_SUBM); + + /* PDMA2/3 */ + SSPCC_SET_REALM(SSPCC_PDMA2, SSPCC_SSET_SUBM); + SSPCC_SET_REALM(SSPCC_PDMA3, SSPCC_SSET_SUBM); + + /* UART16 Pins */ + SSPCC_SET_GPIO_REALM(PK, 0, SSPCC_SSET_SUBM); + SSPCC_SET_GPIO_REALM(PK, 1, SSPCC_SSET_SUBM); + SSPCC_SET_GPIO_REALM(PK, 2, SSPCC_SSET_SUBM); + SSPCC_SET_GPIO_REALM(PK, 3, SSPCC_SSET_SUBM); + + /* LED_1 Pin */ + SSPCC_SET_GPIO_REALM(PJ, 15, SSPCC_SSET_SUBM); +} + +#define CLK_CLKDIV0_DCUPDIV_2 CLK_CLKDIV0_DCUP(1) +#define DISP_FRAMEBUFFERCONFIG0 (DISP_BASE + 0x1518U) +#define DISP_OVERLAYCONFIG0 (DISP_BASE + 0x1540U) + +static S_NU_REG s_NuReg_arr[] = +{ + /* DISP PIN */ + NUREG_EXPORT(SYS_GPH_MFPH, SYS_GPH_MFPH_PH15MFP_Msk, SYS_GPH_MFPH_PH15MFP_LCM_DATA23), + NUREG_EXPORT(SYS_GPH_MFPH, SYS_GPH_MFPH_PH14MFP_Msk, SYS_GPH_MFPH_PH14MFP_LCM_DATA22), + NUREG_EXPORT(SYS_GPH_MFPH, SYS_GPH_MFPH_PH13MFP_Msk, SYS_GPH_MFPH_PH13MFP_LCM_DATA21), + NUREG_EXPORT(SYS_GPH_MFPH, SYS_GPH_MFPH_PH12MFP_Msk, SYS_GPH_MFPH_PH12MFP_LCM_DATA20), + + NUREG_EXPORT(SYS_GPC_MFPH, SYS_GPC_MFPH_PC15MFP_Msk, SYS_GPC_MFPH_PC15MFP_LCM_DATA19), + NUREG_EXPORT(SYS_GPC_MFPH, SYS_GPC_MFPH_PC14MFP_Msk, SYS_GPC_MFPH_PC14MFP_LCM_DATA18), + NUREG_EXPORT(SYS_GPC_MFPH, SYS_GPC_MFPH_PC13MFP_Msk, SYS_GPC_MFPH_PC13MFP_LCM_DATA17), + NUREG_EXPORT(SYS_GPC_MFPH, SYS_GPC_MFPH_PC12MFP_Msk, SYS_GPC_MFPH_PC12MFP_LCM_DATA16), + + NUREG_EXPORT(SYS_GPH_MFPL, SYS_GPH_MFPL_PH7MFP_Msk, SYS_GPH_MFPL_PH7MFP_LCM_DATA15), + NUREG_EXPORT(SYS_GPH_MFPL, SYS_GPH_MFPL_PH6MFP_Msk, SYS_GPH_MFPL_PH6MFP_LCM_DATA14), + NUREG_EXPORT(SYS_GPH_MFPL, SYS_GPH_MFPL_PH5MFP_Msk, SYS_GPH_MFPL_PH5MFP_LCM_DATA13), + NUREG_EXPORT(SYS_GPH_MFPL, SYS_GPH_MFPL_PH4MFP_Msk, SYS_GPH_MFPL_PH4MFP_LCM_DATA12), + NUREG_EXPORT(SYS_GPH_MFPL, SYS_GPH_MFPL_PH3MFP_Msk, SYS_GPH_MFPL_PH3MFP_LCM_DATA11), + NUREG_EXPORT(SYS_GPH_MFPL, SYS_GPH_MFPL_PH2MFP_Msk, SYS_GPH_MFPL_PH2MFP_LCM_DATA10), + NUREG_EXPORT(SYS_GPH_MFPL, SYS_GPH_MFPL_PH1MFP_Msk, SYS_GPH_MFPL_PH1MFP_LCM_DATA9), + NUREG_EXPORT(SYS_GPH_MFPL, SYS_GPH_MFPL_PH0MFP_Msk, SYS_GPH_MFPL_PH0MFP_LCM_DATA8), + + NUREG_EXPORT(SYS_GPI_MFPH, SYS_GPI_MFPH_PI15MFP_Msk, SYS_GPI_MFPH_PI15MFP_LCM_DATA7), + NUREG_EXPORT(SYS_GPI_MFPH, SYS_GPI_MFPH_PI14MFP_Msk, SYS_GPI_MFPH_PI14MFP_LCM_DATA6), + NUREG_EXPORT(SYS_GPI_MFPH, SYS_GPI_MFPH_PI13MFP_Msk, SYS_GPI_MFPH_PI13MFP_LCM_DATA5), + NUREG_EXPORT(SYS_GPI_MFPH, SYS_GPI_MFPH_PI12MFP_Msk, SYS_GPI_MFPH_PI12MFP_LCM_DATA4), + NUREG_EXPORT(SYS_GPI_MFPH, SYS_GPI_MFPH_PI11MFP_Msk, SYS_GPI_MFPH_PI11MFP_LCM_DATA3), + NUREG_EXPORT(SYS_GPI_MFPH, SYS_GPI_MFPH_PI10MFP_Msk, SYS_GPI_MFPH_PI10MFP_LCM_DATA2), + NUREG_EXPORT(SYS_GPI_MFPH, SYS_GPI_MFPH_PI9MFP_Msk, SYS_GPI_MFPH_PI9MFP_LCM_DATA1), + NUREG_EXPORT(SYS_GPI_MFPH, SYS_GPI_MFPH_PI8MFP_Msk, SYS_GPI_MFPH_PI8MFP_LCM_DATA0), + + NUREG_EXPORT(SYS_GPK_MFPL, SYS_GPK_MFPL_PK4MFP_Msk, SYS_GPK_MFPL_PK4MFP_LCM_DEN), + + NUREG_EXPORT(SYS_GPG_MFPH, SYS_GPG_MFPH_PG10MFP_Msk, SYS_GPG_MFPH_PG10MFP_LCM_CLK), + NUREG_EXPORT(SYS_GPG_MFPH, SYS_GPG_MFPH_PG9MFP_Msk, SYS_GPG_MFPH_PG9MFP_LCM_HSYNC), + NUREG_EXPORT(SYS_GPG_MFPH, SYS_GPG_MFPH_PG8MFP_Msk, SYS_GPG_MFPH_PG8MFP_LCM_VSYNC), + + /* DISP CLK */ + NUREG_EXPORT(CLK_SYSCLK0, CLK_SYSCLK0_DCUEN_Msk, CLK_SYSCLK0_DCUEN_Msk), + + /* DISP Engine */ + NUREG_EXPORT(DISP_FRAMEBUFFERCONFIG0, DISP_FrameBufferConfig0_UNDERFLOW_Msk, DISP_FrameBufferConfig0_UNDERFLOW_Msk), + NUREG_EXPORT(DISP_OVERLAYCONFIG0, DISP_OverlayConfig0_UNDERFLOW_Msk, DISP_OverlayConfig0_UNDERFLOW_Msk), + + /* I2C5 */ + NUREG_EXPORT(SYS_GPJ_MFPH, SYS_GPJ_MFPH_PJ12MFP_Msk, SYS_GPJ_MFPH_PJ12MFP_I2C5_SDA), + NUREG_EXPORT(SYS_GPJ_MFPH, SYS_GPJ_MFPH_PJ13MFP_Msk, SYS_GPJ_MFPH_PJ13MFP_I2C5_SCL), + + /* GPD12, PM12 */ + NUREG_EXPORT(SYS_GPD_MFPH, SYS_GPD_MFPH_PD12MFP_Msk, (0 << SYS_GPD_MFPH_PD12MFP_Pos)), + NUREG_EXPORT(SYS_GPM_MFPH, SYS_GPM_MFPH_PM12MFP_Msk, (0 << SYS_GPM_MFPH_PM12MFP_Pos)), + + /* QSPI0 */ + NUREG_EXPORT(CLK_CLKSEL4, CLK_CLKSEL4_QSPI0SEL_Msk, CLK_CLKSEL4_QSPI0SEL_PCLK0), + NUREG_EXPORT(CLK_APBCLK1, CLK_APBCLK1_QSPI0CKEN_Msk, CLK_APBCLK1_QSPI0CKEN_Msk), + NUREG_EXPORT(SYS_GPD_MFPL, SYS_GPD_MFPL_PD5MFP_Msk, SYS_GPD_MFPL_PD5MFP_QSPI0_MISO1), + NUREG_EXPORT(SYS_GPD_MFPL, SYS_GPD_MFPL_PD4MFP_Msk, SYS_GPD_MFPL_PD4MFP_QSPI0_MOSI1), + NUREG_EXPORT(SYS_GPD_MFPL, SYS_GPD_MFPL_PD3MFP_Msk, SYS_GPD_MFPL_PD3MFP_QSPI0_MISO0), + NUREG_EXPORT(SYS_GPD_MFPL, SYS_GPD_MFPL_PD2MFP_Msk, SYS_GPD_MFPL_PD2MFP_QSPI0_MOSI0), + NUREG_EXPORT(SYS_GPD_MFPL, SYS_GPD_MFPL_PD1MFP_Msk, SYS_GPD_MFPL_PD1MFP_QSPI0_CLK), + NUREG_EXPORT(SYS_GPD_MFPL, SYS_GPD_MFPL_PD0MFP_Msk, SYS_GPD_MFPL_PD0MFP_QSPI0_SS0), + + /* TIMERn */ + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR0CKEN_Msk, CLK_APBCLK0_TMR0CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR1CKEN_Msk, CLK_APBCLK0_TMR1CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR2CKEN_Msk, CLK_APBCLK0_TMR2CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR3CKEN_Msk, CLK_APBCLK0_TMR3CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR4CKEN_Msk, CLK_APBCLK0_TMR4CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR5CKEN_Msk, CLK_APBCLK0_TMR5CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR6CKEN_Msk, CLK_APBCLK0_TMR6CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR7CKEN_Msk, CLK_APBCLK0_TMR7CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR8CKEN_Msk, CLK_APBCLK0_TMR8CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR9CKEN_Msk, CLK_APBCLK0_TMR9CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR10CKEN_Msk, CLK_APBCLK0_TMR10CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR11CKEN_Msk, CLK_APBCLK0_TMR11CKEN_Msk), + + /* USB Host */ + NUREG_EXPORT(CLK_SYSCLK0, CLK_SYSCLK0_USBHEN_Msk, CLK_SYSCLK0_USBHEN_Msk), + NUREG_EXPORT(CLK_SYSCLK0, CLK_SYSCLK0_HUSBH0EN_Msk, CLK_SYSCLK0_HUSBH0EN_Msk), + NUREG_EXPORT(CLK_SYSCLK0, CLK_SYSCLK0_HUSBH1EN_Msk, CLK_SYSCLK0_HUSBH1EN_Msk), + NUREG_EXPORT(SYS_USBPMISCR, SYS_USBPMISCR_PHY0SUSPEND_Msk, SYS_USBPMISCR_PHY0SUSPEND_Msk), + NUREG_EXPORT(SYS_USBPMISCR, SYS_USBPMISCR_PHY1SUSPEND_Msk, SYS_USBPMISCR_PHY1SUSPEND_Msk), + NUREG_EXPORT(SYS_GPL_MFPH, SYS_GPL_MFPH_PL12MFP_Msk, SYS_GPL_MFPH_PL12MFP_HSUSBH_PWREN), + NUREG_EXPORT(SYS_GPL_MFPH, SYS_GPL_MFPH_PL13MFP_Msk, SYS_GPL_MFPH_PL13MFP_HSUSBH_OVC), + + /* SDH0 */ + NUREG_EXPORT(CLK_SYSCLK0, CLK_SYSCLK0_SDH0EN_Msk, CLK_SYSCLK0_SDH0EN_Msk), + NUREG_EXPORT(CLK_CLKSEL0, CLK_CLKSEL0_SD0SEL_Msk, CLK_CLKSEL0_SD0SEL_APLL), + NUREG_EXPORT(CLK_CLKSEL0, CLK_CLKSEL0_SD0SEL_Msk, CLK_CLKSEL0_SD0SEL_SYSPLL), + + NUREG_EXPORT(SYS_GPC_MFPL, SYS_GPC_MFPL_PC7MFP_Msk, SYS_GPC_MFPL_PC7MFP_SD0_WP), + NUREG_EXPORT(SYS_GPC_MFPL, SYS_GPC_MFPL_PC6MFP_Msk, SYS_GPC_MFPL_PC6MFP_SD0_nCD), + NUREG_EXPORT(SYS_GPC_MFPL, SYS_GPC_MFPL_PC5MFP_Msk, SYS_GPC_MFPL_PC5MFP_SD0_DAT3), + NUREG_EXPORT(SYS_GPC_MFPL, SYS_GPC_MFPL_PC4MFP_Msk, SYS_GPC_MFPL_PC4MFP_SD0_DAT2), + NUREG_EXPORT(SYS_GPC_MFPL, SYS_GPC_MFPL_PC3MFP_Msk, SYS_GPC_MFPL_PC3MFP_SD0_DAT1), + NUREG_EXPORT(SYS_GPC_MFPL, SYS_GPC_MFPL_PC2MFP_Msk, SYS_GPC_MFPL_PC2MFP_SD0_DAT0), + NUREG_EXPORT(SYS_GPC_MFPL, SYS_GPC_MFPL_PC1MFP_Msk, SYS_GPC_MFPL_PC1MFP_SD0_CLK), + NUREG_EXPORT(SYS_GPC_MFPL, SYS_GPC_MFPL_PC0MFP_Msk, SYS_GPC_MFPL_PC0MFP_SD0_CMD), + + /* SDH1 */ + NUREG_EXPORT(CLK_SYSCLK0, CLK_SYSCLK0_SDH1EN_Msk, CLK_SYSCLK0_SDH1EN_Msk), + NUREG_EXPORT(CLK_CLKSEL0, CLK_CLKSEL0_SD1SEL_Msk, CLK_CLKSEL0_SD1SEL_APLL), + NUREG_EXPORT(CLK_CLKSEL0, CLK_CLKSEL0_SD1SEL_Msk, CLK_CLKSEL0_SD1SEL_SYSPLL), + + NUREG_EXPORT(SYS_GPJ_MFPH, SYS_GPJ_MFPH_PJ11MFP_Msk, SYS_GPJ_MFPH_PJ11MFP_SD1_DAT3), + NUREG_EXPORT(SYS_GPJ_MFPH, SYS_GPJ_MFPH_PJ10MFP_Msk, SYS_GPJ_MFPH_PJ10MFP_SD1_DAT2), + NUREG_EXPORT(SYS_GPJ_MFPH, SYS_GPJ_MFPH_PJ9MFP_Msk, SYS_GPJ_MFPH_PJ9MFP_SD1_DAT1), + NUREG_EXPORT(SYS_GPJ_MFPH, SYS_GPJ_MFPH_PJ8MFP_Msk, SYS_GPJ_MFPH_PJ8MFP_SD1_DAT0), + NUREG_EXPORT(SYS_GPJ_MFPL, SYS_GPJ_MFPL_PJ7MFP_Msk, SYS_GPJ_MFPL_PJ7MFP_SD1_CLK), + NUREG_EXPORT(SYS_GPJ_MFPL, SYS_GPJ_MFPL_PJ6MFP_Msk, SYS_GPJ_MFPL_PJ6MFP_SD1_CMD), + NUREG_EXPORT(SYS_GPJ_MFPL, SYS_GPJ_MFPL_PJ5MFP_Msk, SYS_GPJ_MFPL_PJ5MFP_SD1_nCD), + NUREG_EXPORT(SYS_GPJ_MFPL, SYS_GPJ_MFPL_PJ4MFP_Msk, SYS_GPJ_MFPL_PJ4MFP_SD1_WP), + + /* UART11 */ + NUREG_EXPORT(SYS_GPL_MFPL, SYS_GPL_MFPL_PL0MFP_Msk, SYS_GPL_MFPL_PL0MFP_UART11_nCTS), + NUREG_EXPORT(SYS_GPL_MFPL, SYS_GPL_MFPL_PL1MFP_Msk, SYS_GPL_MFPL_PL1MFP_UART11_nRTS), + NUREG_EXPORT(SYS_GPL_MFPL, SYS_GPL_MFPL_PL2MFP_Msk, SYS_GPL_MFPL_PL2MFP_UART11_RXD), + NUREG_EXPORT(SYS_GPL_MFPL, SYS_GPL_MFPL_PL3MFP_Msk, SYS_GPL_MFPL_PL3MFP_UART11_TXD), + + NUREG_EXPORT(CLK_CLKSEL3, CLK_CLKSEL3_UART11SEL_Msk, CLK_CLKSEL3_UART11SEL_HXT), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_UART11CKEN_Msk, CLK_APBCLK0_UART11CKEN_Msk), + + /* WDT */ + NUREG_EXPORT(CLK_CLKSEL3, CLK_CLKSEL3_WDT0SEL_Msk, CLK_CLKSEL3_WDT0SEL_PCLK3_DIV4096), + + /* GMAC0 */ + NUREG_EXPORT(SYS_GPE_MFPL, SYS_GPE_MFPL_PE0MFP_Msk, SYS_GPE_MFPL_PE0MFP_RGMII0_MDC), + NUREG_EXPORT(SYS_GPE_MFPL, SYS_GPE_MFPL_PE1MFP_Msk, SYS_GPE_MFPL_PE1MFP_RGMII0_MDIO), + NUREG_EXPORT(SYS_GPE_MFPL, SYS_GPE_MFPL_PE2MFP_Msk, SYS_GPE_MFPL_PE2MFP_RGMII0_TXCTL), + NUREG_EXPORT(SYS_GPE_MFPL, SYS_GPE_MFPL_PE3MFP_Msk, SYS_GPE_MFPL_PE3MFP_RGMII0_TXD0), + NUREG_EXPORT(SYS_GPE_MFPL, SYS_GPE_MFPL_PE4MFP_Msk, SYS_GPE_MFPL_PE4MFP_RGMII0_TXD1), + NUREG_EXPORT(SYS_GPE_MFPL, SYS_GPE_MFPL_PE5MFP_Msk, SYS_GPE_MFPL_PE5MFP_RGMII0_RXCLK), + NUREG_EXPORT(SYS_GPE_MFPL, SYS_GPE_MFPL_PE6MFP_Msk, SYS_GPE_MFPL_PE6MFP_RGMII0_RXCTL), + NUREG_EXPORT(SYS_GPE_MFPL, SYS_GPE_MFPL_PE7MFP_Msk, SYS_GPE_MFPL_PE7MFP_RGMII0_RXD0), + NUREG_EXPORT(SYS_GPE_MFPH, SYS_GPE_MFPH_PE8MFP_Msk, SYS_GPE_MFPH_PE8MFP_RGMII0_RXD1), + NUREG_EXPORT(SYS_GPE_MFPH, SYS_GPE_MFPH_PE9MFP_Msk, SYS_GPE_MFPH_PE9MFP_RGMII0_RXD2), + NUREG_EXPORT(SYS_GPE_MFPH, SYS_GPE_MFPH_PE10MFP_Msk, SYS_GPE_MFPH_PE10MFP_RGMII0_RXD3), + NUREG_EXPORT(SYS_GPE_MFPH, SYS_GPE_MFPH_PE11MFP_Msk, SYS_GPE_MFPH_PE11MFP_RGMII0_TXCLK), + NUREG_EXPORT(SYS_GPE_MFPH, SYS_GPE_MFPH_PE12MFP_Msk, SYS_GPE_MFPH_PE12MFP_RGMII0_TXD2), + NUREG_EXPORT(SYS_GPE_MFPH, SYS_GPE_MFPH_PE13MFP_Msk, SYS_GPE_MFPH_PE13MFP_RGMII0_TXD3), + NUREG_EXPORT(SYS_GPE_MFPH, SYS_GPE_MFPH_PE13MFP_Msk, SYS_GPE_MFPH_PE13MFP_RGMII0_TXD3), + NUREG_EXPORT(CLK_SYSCLK0, CLK_SYSCLK0_GMAC0EN_Msk, CLK_SYSCLK0_GMAC0EN_Msk), + NUREG_EXPORT(CLK_SYSCLK1, CLK_SYSCLK1_GPECKEN_Msk, CLK_SYSCLK1_GPECKEN_Msk), + NUREG_EXPORT(CLK_CLKDIV0, CLK_CLKDIV0_EMAC0DIV_Msk, 0 << CLK_CLKDIV0_EMAC0DIV_Pos), //RGMII + + /* GMAC1 */ + NUREG_EXPORT(SYS_GPF_MFPL, SYS_GPF_MFPL_PF0MFP_Msk, SYS_GPF_MFPL_PF0MFP_RGMII1_MDC), + NUREG_EXPORT(SYS_GPF_MFPL, SYS_GPF_MFPL_PF1MFP_Msk, SYS_GPF_MFPL_PF1MFP_RGMII1_MDIO), + NUREG_EXPORT(SYS_GPF_MFPL, SYS_GPF_MFPL_PF2MFP_Msk, SYS_GPF_MFPL_PF2MFP_RGMII1_TXCTL), + NUREG_EXPORT(SYS_GPF_MFPL, SYS_GPF_MFPL_PF3MFP_Msk, SYS_GPF_MFPL_PF3MFP_RGMII1_TXD0), + NUREG_EXPORT(SYS_GPF_MFPL, SYS_GPF_MFPL_PF4MFP_Msk, SYS_GPF_MFPL_PF4MFP_RGMII1_TXD1), + NUREG_EXPORT(SYS_GPF_MFPL, SYS_GPF_MFPL_PF5MFP_Msk, SYS_GPF_MFPL_PF5MFP_RGMII1_RXCLK), + NUREG_EXPORT(SYS_GPF_MFPL, SYS_GPF_MFPL_PF6MFP_Msk, SYS_GPF_MFPL_PF6MFP_RGMII1_RXCTL), + NUREG_EXPORT(SYS_GPF_MFPL, SYS_GPF_MFPL_PF7MFP_Msk, SYS_GPF_MFPL_PF7MFP_RGMII1_RXD0), + NUREG_EXPORT(SYS_GPF_MFPH, SYS_GPF_MFPH_PF8MFP_Msk, SYS_GPF_MFPH_PF8MFP_RGMII1_RXD1), + NUREG_EXPORT(SYS_GPF_MFPH, SYS_GPF_MFPH_PF9MFP_Msk, SYS_GPF_MFPH_PF9MFP_RGMII1_RXD2), + NUREG_EXPORT(SYS_GPF_MFPH, SYS_GPF_MFPH_PF10MFP_Msk, SYS_GPF_MFPH_PF10MFP_RGMII1_RXD3), + NUREG_EXPORT(SYS_GPF_MFPH, SYS_GPF_MFPH_PF11MFP_Msk, SYS_GPF_MFPH_PF11MFP_RGMII1_TXCLK), + NUREG_EXPORT(SYS_GPF_MFPH, SYS_GPF_MFPH_PF12MFP_Msk, SYS_GPF_MFPH_PF12MFP_RGMII1_TXD2), + NUREG_EXPORT(SYS_GPF_MFPH, SYS_GPF_MFPH_PF13MFP_Msk, SYS_GPF_MFPH_PF13MFP_RGMII1_TXD3), + NUREG_EXPORT(CLK_SYSCLK0, CLK_SYSCLK0_GMAC1EN_Msk, CLK_SYSCLK0_GMAC1EN_Msk), + NUREG_EXPORT(CLK_SYSCLK1, CLK_SYSCLK1_GPFCKEN_Msk, CLK_SYSCLK1_GPFCKEN_Msk), + NUREG_EXPORT(CLK_CLKDIV0, CLK_CLKDIV0_EMAC1DIV_Msk, 0 << CLK_CLKDIV0_EMAC1DIV_Pos), //RGMII + + /* CANFD0 CLK */ + NUREG_EXPORT(CLK_SYSCLK0, CLK_SYSCLK0_CANFD0CKEN_Msk, CLK_SYSCLK0_CANFD0CKEN_Msk), + NUREG_EXPORT(CLK_CLKSEL4, CLK_CLKSEL4_CANFD0SEL_Msk, CLK_CLKSEL4_CANFD0SEL_APLL), + NUREG_EXPORT(CLK_CLKDIV0, CLK_CLKDIV0_CANFD0DIV_Msk, CLK_CLKDIV0_CANFD0(1)), + + {0} +}; + +void nu_check_register(void) +{ + nu_sys_check_register(&s_NuReg_arr[0]); +} +MSH_CMD_EXPORT(nu_check_register, Check registers); diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.c b/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.c new file mode 100644 index 0000000000..e31c79cd08 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.c @@ -0,0 +1,774 @@ +/**************************************************************************** + * @file nutool_pincfg.c + * @version V1.24 + * @Date 2021/08/03-14:56:47 + * @brief NuMicro generated code file + * + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2013-2021 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +/******************** +MCU:MA35D16A887C(BGA312) +Pin Configuration: +PinA2:I2C2_SCL +PinA3:EADC0_CH7 +PinA4:EADC0_CH3 +PinA5:RGMII1_TXCLK +PinA6:RGMII1_RXCLK +PinA7:RGMII1_RXCTL +PinA8:RGMII1_MDIO +PinA9:RGMII0_TXCLK +PinA10:RGMII0_RXD1 +PinA11:RGMII0_RXCLK +PinA12:RGMII0_TXCTL +PinA13:I2S0_DI +PinA14:VCAP1_SFIELD +PinA15:VCAP1_HSYNC +PinA16:VCAP1_PIXCLK +PinA17:VCAP1_DATA5 +PinB1:ADC0_CH4 +PinB2:I2C1_SCL +PinB3:EADC0_CH5 +PinB4:EADC0_CH4 +PinB5:EADC0_CH1 +PinB6:RGMII1_TXD3 +PinB7:RGMII1_RXD0 +PinB8:RGMII1_TXCTL +PinB9:RGMII0_TXD2 +PinB10:RGMII0_RXD2 +PinB11:RGMII0_RXCTL +PinB12:RGMII0_MDIO +PinB13:I2S0_BCLK +PinB14:VCAP1_VSYNC +PinB15:VCAP1_SCLK +PinB16:VCAP1_DATA7 +PinB17:VCAP1_DATA0 +PinB18:VCAP1_DATA2 +PinC1:ADC0_CH7 +PinC2:ADC0_CH5 +PinC3:I2C2_SDA +PinC4:EADC0_CH2 +PinC5:EADC0_CH0 +PinC6:RGMII1_TXD2 +PinC7:RGMII1_RXD2 +PinC8:RGMII1_TXD0 +PinC9:RGMII0_TXD3 +PinC10:RGMII0_RXD0 +PinC11:RGMII0_TXD1 +PinC12:RGMII0_MDC +PinC13:I2S0_LRCK +PinC14:VCAP1_DATA8 +PinC15:VCAP1_DATA6 +PinC16:VCAP1_DATA4 +PinC17:VCAP1_DATA1 +PinC18:VCAP1_DATA3 +PinD1:ADC0_CH6 +PinD2:I2C1_SDA +PinD3:EADC0_CH6 +PinD6:RGMII1_RXD3 +PinD7:RGMII1_RXD1 +PinD8:RGMII1_TXD1 +PinD9:RGMII1_MDC +PinD10:RGMII0_RXD3 +PinD11:RGMII0_TXD0 +PinD12:I2S0_DO +PinD13:I2S0_MCLK +PinD14:VCAP1_DATA9 +PinD16:UART10_nCTS +PinD17:UART10_TXD +PinD18:SD0_CLK +PinE1:HSUSBH_PWREN +PinE2:CAN1_RXD +PinE3:HSUSBH_OVC +PinE4:HSUSB0_VBUSVLD +PinE15:UART10_nRTS +PinE16:UART10_RXD +PinE17:SD0_WP +PinE18:SD0_DAT0 +PinF3:CAN1_TXD +PinF4:NAND_DATA3 +PinF16:UART14_RXD +PinF17:SD0_nCD +PinF18:SD0_CMD +PinG3:NAND_DATA0 +PinG4:NAND_DATA5 +PinG16:UART16_nRTS +PinG17:SD0_DAT3 +PinG18:SD0_DAT1 +PinH3:NAND_DATA1 +PinH4:NAND_DATA7 +PinH15:UART12_nRTS +PinH16:UART16_nCTS +PinH18:SD0_DAT2 +PinJ3:NAND_DATA6 +PinJ4:NAND_RDY +PinJ15:UART12_RXD +PinJ16:UART16_TXD +PinJ18:I2C4_SCL +PinK1:NAND_DATA2 +PinK2:NAND_DATA4 +PinK3:NAND_nRE +PinK4:NAND_ALE +PinK5:NAND_nWE +PinK16:UART16_RXD +PinK18:I2C4_SDA +PinL1:NAND_nCS +PinL2:NAND_CLE +PinL15:UART12_TXD +PinL16:I2C5_SDA +PinM5:NAND_nWP +PinM15:UART14_nRTS +PinM16:I2C5_SCL +PinM17:CAN3_RXD +PinN1:EPWM1_CH5 +PinN2:I2C3_SDA +PinN17:CAN3_TXD +PinP1:I2C3_SCL +PinP7:VCAP0_SFIELD +PinP8:SD1_nCD +PinP9:SD1_WP +PinP15:UART14_TXD +PinR5:VCAP0_DATA9 +PinR6:VCAP0_DATA7 +PinR9:SD1_DAT1 +PinR10:LCM_DEN +PinR11:LCM_DATA1 +PinR12:LCM_DATA6 +PinR13:LCM_DATA11 +PinR14:LCM_DATA15 +PinR16:LCM_DATA18 +PinR17:LCM_DATA20 +PinR18:LCM_DATA22 +PinT1:UART0_TXD +PinT2:UART0_RXD +PinT4:VCAP0_HSYNC +PinT5:VCAP0_DATA1 +PinT6:VCAP0_DATA5 +PinT7:VCAP0_DATA6 +PinT9:SD1_CMD +PinT10:LCM_VSYNC +PinT11:LCM_DATA0 +PinT12:LCM_DATA5 +PinT13:LCM_DATA10 +PinT14:LCM_DATA14 +PinT15:QSPI0_MISO1 +PinT16:LCM_DATA16 +PinT17:LCM_DATA17 +PinT18:LCM_DATA23 +PinU4:VCAP0_VSYNC +PinU5:VCAP0_DATA2 +PinU6:VCAP0_DATA3 +PinU7:VCAP0_DATA8 +PinU8:SD1_DAT3 +PinU9:SD1_DAT0 +PinU10:LCM_HSYNC +PinU11:LCM_DATA7 +PinU12:LCM_DATA4 +PinU13:LCM_DATA9 +PinU14:LCM_DATA13 +PinU15:QSPI0_MISO0 +PinU16:QSPI0_SS0 +PinU17:LCM_DATA19 +PinU18:LCM_DATA21 +PinV3:VCAP0_SCLK +PinV4:VCAP0_PIXCLK +PinV5:VCAP0_DATA0 +PinV6:VCAP0_DATA4 +PinV8:SD1_CLK +PinV9:SD1_DAT2 +PinV10:LCM_CLK +PinV11:LCM_DATA2 +PinV12:LCM_DATA3 +PinV13:LCM_DATA8 +PinV14:LCM_DATA12 +PinV15:QSPI0_MOSI1 +PinV16:QSPI0_MOSI0 +PinV17:QSPI0_CLK +********************/ + +#include "ma35d1.h" + +void nutool_pincfg_init_adc0(void) +{ + SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB15MFP_Msk | SYS_GPB_MFPH_PB14MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk | SYS_GPB_MFPH_PB12MFP_Msk); + SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB15MFP_ADC0_CH7 | SYS_GPB_MFPH_PB14MFP_ADC0_CH6 | SYS_GPB_MFPH_PB13MFP_ADC0_CH5 | SYS_GPB_MFPH_PB12MFP_ADC0_CH4); + + PB->MODE &= ~(GPIO_MODE_MODE12_Msk | GPIO_MODE_MODE13_Msk | GPIO_MODE_MODE14_Msk | GPIO_MODE_MODE15_Msk); + GPIO_DISABLE_DIGITAL_PATH(PB, BIT12 | BIT13 | BIT14 | BIT15); + + return; +} + +void nutool_pincfg_deinit_adc0(void) +{ + SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB15MFP_Msk | SYS_GPB_MFPH_PB14MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk | SYS_GPB_MFPH_PB12MFP_Msk); + + return; +} + +void nutool_pincfg_init_can1(void) +{ + SYS->GPL_MFPH &= ~(SYS_GPL_MFPH_PL15MFP_Msk | SYS_GPL_MFPH_PL14MFP_Msk); + SYS->GPL_MFPH |= (SYS_GPL_MFPH_PL15MFP_CAN1_TXD | SYS_GPL_MFPH_PL14MFP_CAN1_RXD); + + return; +} + +void nutool_pincfg_deinit_can1(void) +{ + SYS->GPL_MFPH &= ~(SYS_GPL_MFPH_PL15MFP_Msk | SYS_GPL_MFPH_PL14MFP_Msk); + + return; +} + +void nutool_pincfg_init_can3(void) +{ + SYS->GPL_MFPH &= ~(SYS_GPL_MFPH_PL11MFP_Msk | SYS_GPL_MFPH_PL10MFP_Msk); + SYS->GPL_MFPH |= (SYS_GPL_MFPH_PL11MFP_CAN3_TXD | SYS_GPL_MFPH_PL10MFP_CAN3_RXD); + + return; +} + +void nutool_pincfg_deinit_can3(void) +{ + SYS->GPL_MFPH &= ~(SYS_GPL_MFPH_PL11MFP_Msk | SYS_GPL_MFPH_PL10MFP_Msk); + + return; +} + +void nutool_pincfg_init_eadc0(void) +{ + SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB7MFP_Msk | SYS_GPB_MFPL_PB6MFP_Msk | SYS_GPB_MFPL_PB5MFP_Msk | SYS_GPB_MFPL_PB4MFP_Msk | SYS_GPB_MFPL_PB3MFP_Msk | SYS_GPB_MFPL_PB2MFP_Msk | SYS_GPB_MFPL_PB1MFP_Msk | SYS_GPB_MFPL_PB0MFP_Msk); + SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB7MFP_EADC0_CH7 | SYS_GPB_MFPL_PB6MFP_EADC0_CH6 | SYS_GPB_MFPL_PB5MFP_EADC0_CH5 | SYS_GPB_MFPL_PB4MFP_EADC0_CH4 | SYS_GPB_MFPL_PB3MFP_EADC0_CH3 | SYS_GPB_MFPL_PB2MFP_EADC0_CH2 | SYS_GPB_MFPL_PB1MFP_EADC0_CH1 | SYS_GPB_MFPL_PB0MFP_EADC0_CH0); + + GPIO_DISABLE_DIGITAL_PATH(PB, BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7); + + return; +} + +void nutool_pincfg_deinit_eadc0(void) +{ + SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB7MFP_Msk | SYS_GPB_MFPL_PB6MFP_Msk | SYS_GPB_MFPL_PB5MFP_Msk | SYS_GPB_MFPL_PB4MFP_Msk | SYS_GPB_MFPL_PB3MFP_Msk | SYS_GPB_MFPL_PB2MFP_Msk | SYS_GPB_MFPL_PB1MFP_Msk | SYS_GPB_MFPL_PB0MFP_Msk); + + return; +} + +void nutool_pincfg_init_epwm1(void) +{ + SYS->GPM_MFPH &= ~(SYS_GPM_MFPH_PM13MFP_Msk); + SYS->GPM_MFPH |= (SYS_GPM_MFPH_PM13MFP_EPWM1_CH5); + + SYS->GPK_MFPL &= ~(SYS_GPK_MFPL_PK5MFP_Msk); + SYS->GPK_MFPL |= (SYS_GPK_MFPL_PK5MFP_EPWM1_CH1); + + return; +} + +void nutool_pincfg_deinit_epwm1(void) +{ + SYS->GPM_MFPH &= ~(SYS_GPM_MFPH_PM13MFP_Msk); + + SYS->GPK_MFPL &= ~(SYS_GPK_MFPL_PK5MFP_Msk); + return; +} + +void nutool_pincfg_init_hsusb0(void) +{ + SYS->GPF_MFPH &= ~(SYS_GPF_MFPH_PF15MFP_Msk); + SYS->GPF_MFPH |= (SYS_GPF_MFPH_PF15MFP_HSUSB0_VBUSVLD); + + return; +} + +void nutool_pincfg_deinit_hsusb0(void) +{ + SYS->GPF_MFPH &= ~(SYS_GPF_MFPH_PF15MFP_Msk); + + return; +} + +void nutool_pincfg_init_hsusbh(void) +{ + SYS->GPL_MFPH &= ~(SYS_GPL_MFPH_PL13MFP_Msk | SYS_GPL_MFPH_PL12MFP_Msk); + SYS->GPL_MFPH |= (SYS_GPL_MFPH_PL13MFP_HSUSBH_OVC | SYS_GPL_MFPH_PL12MFP_HSUSBH_PWREN); + + return; +} + +void nutool_pincfg_deinit_hsusbh(void) +{ + SYS->GPL_MFPH &= ~(SYS_GPL_MFPH_PL13MFP_Msk | SYS_GPL_MFPH_PL12MFP_Msk); + + return; +} + +void nutool_pincfg_init_i2c1(void) +{ + SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB11MFP_Msk | SYS_GPB_MFPH_PB10MFP_Msk); + SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB11MFP_I2C1_SCL | SYS_GPB_MFPH_PB10MFP_I2C1_SDA); + + return; +} + +void nutool_pincfg_deinit_i2c1(void) +{ + SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB11MFP_Msk | SYS_GPB_MFPH_PB10MFP_Msk); + + return; +} + +void nutool_pincfg_init_i2c2(void) +{ + SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB9MFP_Msk | SYS_GPB_MFPH_PB8MFP_Msk); + SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB9MFP_I2C2_SCL | SYS_GPB_MFPH_PB8MFP_I2C2_SDA); + + return; +} + +void nutool_pincfg_deinit_i2c2(void) +{ + SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB9MFP_Msk | SYS_GPB_MFPH_PB8MFP_Msk); + + return; +} + +void nutool_pincfg_init_i2c3(void) +{ + SYS->GPM_MFPH &= ~(SYS_GPM_MFPH_PM15MFP_Msk | SYS_GPM_MFPH_PM14MFP_Msk); + SYS->GPM_MFPH |= (SYS_GPM_MFPH_PM15MFP_I2C3_SCL | SYS_GPM_MFPH_PM14MFP_I2C3_SDA); + + return; +} + +void nutool_pincfg_deinit_i2c3(void) +{ + SYS->GPM_MFPH &= ~(SYS_GPM_MFPH_PM15MFP_Msk | SYS_GPM_MFPH_PM14MFP_Msk); + + return; +} + +void nutool_pincfg_init_i2c4(void) +{ + SYS->GPL_MFPL &= ~(SYS_GPL_MFPL_PL5MFP_Msk | SYS_GPL_MFPL_PL4MFP_Msk); + SYS->GPL_MFPL |= (SYS_GPL_MFPL_PL5MFP_I2C4_SCL | SYS_GPL_MFPL_PL4MFP_I2C4_SDA); + + return; +} + +void nutool_pincfg_deinit_i2c4(void) +{ + SYS->GPL_MFPL &= ~(SYS_GPL_MFPL_PL5MFP_Msk | SYS_GPL_MFPL_PL4MFP_Msk); + + return; +} + +void nutool_pincfg_init_i2c5(void) +{ + SYS->GPJ_MFPH &= ~(SYS_GPJ_MFPH_PJ13MFP_Msk | SYS_GPJ_MFPH_PJ12MFP_Msk); + SYS->GPJ_MFPH |= (SYS_GPJ_MFPH_PJ13MFP_I2C5_SCL | SYS_GPJ_MFPH_PJ12MFP_I2C5_SDA); + + return; +} + +void nutool_pincfg_deinit_i2c5(void) +{ + SYS->GPJ_MFPH &= ~(SYS_GPJ_MFPH_PJ13MFP_Msk | SYS_GPJ_MFPH_PJ12MFP_Msk); + + return; +} + +void nutool_pincfg_init_i2s0(void) +{ + SYS->GPK_MFPH &= ~(SYS_GPK_MFPH_PK15MFP_Msk | SYS_GPK_MFPH_PK14MFP_Msk | SYS_GPK_MFPH_PK13MFP_Msk | SYS_GPK_MFPH_PK12MFP_Msk); + SYS->GPK_MFPH |= (SYS_GPK_MFPH_PK15MFP_I2S0_DO | SYS_GPK_MFPH_PK14MFP_I2S0_DI | SYS_GPK_MFPH_PK13MFP_I2S0_BCLK | SYS_GPK_MFPH_PK12MFP_I2S0_LRCK); + SYS->GPN_MFPH &= ~(SYS_GPN_MFPH_PN15MFP_Msk); + SYS->GPN_MFPH |= (SYS_GPN_MFPH_PN15MFP_I2S0_MCLK); + + return; +} + +void nutool_pincfg_deinit_i2s0(void) +{ + SYS->GPK_MFPH &= ~(SYS_GPK_MFPH_PK15MFP_Msk | SYS_GPK_MFPH_PK14MFP_Msk | SYS_GPK_MFPH_PK13MFP_Msk | SYS_GPK_MFPH_PK12MFP_Msk); + SYS->GPN_MFPH &= ~(SYS_GPN_MFPH_PN15MFP_Msk); + + return; +} + +void nutool_pincfg_init_lcm(void) +{ + SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC15MFP_Msk | SYS_GPC_MFPH_PC14MFP_Msk | SYS_GPC_MFPH_PC13MFP_Msk | SYS_GPC_MFPH_PC12MFP_Msk); + SYS->GPC_MFPH |= (SYS_GPC_MFPH_PC15MFP_LCM_DATA19 | SYS_GPC_MFPH_PC14MFP_LCM_DATA18 | SYS_GPC_MFPH_PC13MFP_LCM_DATA17 | SYS_GPC_MFPH_PC12MFP_LCM_DATA16); + SYS->GPG_MFPH &= ~(SYS_GPG_MFPH_PG10MFP_Msk | SYS_GPG_MFPH_PG9MFP_Msk | SYS_GPG_MFPH_PG8MFP_Msk); + SYS->GPG_MFPH |= (SYS_GPG_MFPH_PG10MFP_LCM_CLK | SYS_GPG_MFPH_PG9MFP_LCM_HSYNC | SYS_GPG_MFPH_PG8MFP_LCM_VSYNC); + SYS->GPH_MFPH &= ~(SYS_GPH_MFPH_PH15MFP_Msk | SYS_GPH_MFPH_PH14MFP_Msk | SYS_GPH_MFPH_PH13MFP_Msk | SYS_GPH_MFPH_PH12MFP_Msk); + SYS->GPH_MFPH |= (SYS_GPH_MFPH_PH15MFP_LCM_DATA23 | SYS_GPH_MFPH_PH14MFP_LCM_DATA22 | SYS_GPH_MFPH_PH13MFP_LCM_DATA21 | SYS_GPH_MFPH_PH12MFP_LCM_DATA20); + SYS->GPH_MFPL &= ~(SYS_GPH_MFPL_PH7MFP_Msk | SYS_GPH_MFPL_PH6MFP_Msk | SYS_GPH_MFPL_PH5MFP_Msk | SYS_GPH_MFPL_PH4MFP_Msk | SYS_GPH_MFPL_PH3MFP_Msk | SYS_GPH_MFPL_PH2MFP_Msk | SYS_GPH_MFPL_PH1MFP_Msk | SYS_GPH_MFPL_PH0MFP_Msk); + SYS->GPH_MFPL |= (SYS_GPH_MFPL_PH7MFP_LCM_DATA15 | SYS_GPH_MFPL_PH6MFP_LCM_DATA14 | SYS_GPH_MFPL_PH5MFP_LCM_DATA13 | SYS_GPH_MFPL_PH4MFP_LCM_DATA12 | SYS_GPH_MFPL_PH3MFP_LCM_DATA11 | SYS_GPH_MFPL_PH2MFP_LCM_DATA10 | SYS_GPH_MFPL_PH1MFP_LCM_DATA9 | SYS_GPH_MFPL_PH0MFP_LCM_DATA8); + SYS->GPI_MFPH &= ~(SYS_GPI_MFPH_PI15MFP_Msk | SYS_GPI_MFPH_PI14MFP_Msk | SYS_GPI_MFPH_PI13MFP_Msk | SYS_GPI_MFPH_PI12MFP_Msk | SYS_GPI_MFPH_PI11MFP_Msk | SYS_GPI_MFPH_PI10MFP_Msk | SYS_GPI_MFPH_PI9MFP_Msk | SYS_GPI_MFPH_PI8MFP_Msk); + SYS->GPI_MFPH |= (SYS_GPI_MFPH_PI15MFP_LCM_DATA7 | SYS_GPI_MFPH_PI14MFP_LCM_DATA6 | SYS_GPI_MFPH_PI13MFP_LCM_DATA5 | SYS_GPI_MFPH_PI12MFP_LCM_DATA4 | SYS_GPI_MFPH_PI11MFP_LCM_DATA3 | SYS_GPI_MFPH_PI10MFP_LCM_DATA2 | SYS_GPI_MFPH_PI9MFP_LCM_DATA1 | SYS_GPI_MFPH_PI8MFP_LCM_DATA0); + SYS->GPK_MFPL &= ~(SYS_GPK_MFPL_PK4MFP_Msk); + SYS->GPK_MFPL |= (SYS_GPK_MFPL_PK4MFP_LCM_DEN); + + return; +} + +void nutool_pincfg_deinit_lcm(void) +{ + SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC15MFP_Msk | SYS_GPC_MFPH_PC14MFP_Msk | SYS_GPC_MFPH_PC13MFP_Msk | SYS_GPC_MFPH_PC12MFP_Msk); + SYS->GPG_MFPH &= ~(SYS_GPG_MFPH_PG10MFP_Msk | SYS_GPG_MFPH_PG9MFP_Msk | SYS_GPG_MFPH_PG8MFP_Msk); + SYS->GPH_MFPH &= ~(SYS_GPH_MFPH_PH15MFP_Msk | SYS_GPH_MFPH_PH14MFP_Msk | SYS_GPH_MFPH_PH13MFP_Msk | SYS_GPH_MFPH_PH12MFP_Msk); + SYS->GPH_MFPL &= ~(SYS_GPH_MFPL_PH7MFP_Msk | SYS_GPH_MFPL_PH6MFP_Msk | SYS_GPH_MFPL_PH5MFP_Msk | SYS_GPH_MFPL_PH4MFP_Msk | SYS_GPH_MFPL_PH3MFP_Msk | SYS_GPH_MFPL_PH2MFP_Msk | SYS_GPH_MFPL_PH1MFP_Msk | SYS_GPH_MFPL_PH0MFP_Msk); + SYS->GPI_MFPH &= ~(SYS_GPI_MFPH_PI15MFP_Msk | SYS_GPI_MFPH_PI14MFP_Msk | SYS_GPI_MFPH_PI13MFP_Msk | SYS_GPI_MFPH_PI12MFP_Msk | SYS_GPI_MFPH_PI11MFP_Msk | SYS_GPI_MFPH_PI10MFP_Msk | SYS_GPI_MFPH_PI9MFP_Msk | SYS_GPI_MFPH_PI8MFP_Msk); + SYS->GPK_MFPL &= ~(SYS_GPK_MFPL_PK4MFP_Msk); + + return; +} + +void nutool_pincfg_init_nand(void) +{ + SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_PA14MFP_Msk | SYS_GPA_MFPH_PA13MFP_Msk | SYS_GPA_MFPH_PA12MFP_Msk | SYS_GPA_MFPH_PA11MFP_Msk | SYS_GPA_MFPH_PA10MFP_Msk | SYS_GPA_MFPH_PA9MFP_Msk | SYS_GPA_MFPH_PA8MFP_Msk); + SYS->GPA_MFPH |= (SYS_GPA_MFPH_PA14MFP_NAND_nWP | SYS_GPA_MFPH_PA13MFP_NAND_nCS | SYS_GPA_MFPH_PA12MFP_NAND_ALE | SYS_GPA_MFPH_PA11MFP_NAND_CLE | SYS_GPA_MFPH_PA10MFP_NAND_nWE | SYS_GPA_MFPH_PA9MFP_NAND_nRE | SYS_GPA_MFPH_PA8MFP_NAND_RDY); + SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA7MFP_Msk | SYS_GPA_MFPL_PA6MFP_Msk | SYS_GPA_MFPL_PA5MFP_Msk | SYS_GPA_MFPL_PA4MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk | SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA1MFP_Msk | SYS_GPA_MFPL_PA0MFP_Msk); + SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA7MFP_NAND_DATA7 | SYS_GPA_MFPL_PA6MFP_NAND_DATA6 | SYS_GPA_MFPL_PA5MFP_NAND_DATA5 | SYS_GPA_MFPL_PA4MFP_NAND_DATA4 | SYS_GPA_MFPL_PA3MFP_NAND_DATA3 | SYS_GPA_MFPL_PA2MFP_NAND_DATA2 | SYS_GPA_MFPL_PA1MFP_NAND_DATA1 | SYS_GPA_MFPL_PA0MFP_NAND_DATA0); + + return; +} + +void nutool_pincfg_deinit_nand(void) +{ + SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_PA14MFP_Msk | SYS_GPA_MFPH_PA13MFP_Msk | SYS_GPA_MFPH_PA12MFP_Msk | SYS_GPA_MFPH_PA11MFP_Msk | SYS_GPA_MFPH_PA10MFP_Msk | SYS_GPA_MFPH_PA9MFP_Msk | SYS_GPA_MFPH_PA8MFP_Msk); + SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA7MFP_Msk | SYS_GPA_MFPL_PA6MFP_Msk | SYS_GPA_MFPL_PA5MFP_Msk | SYS_GPA_MFPL_PA4MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk | SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA1MFP_Msk | SYS_GPA_MFPL_PA0MFP_Msk); + + return; +} + +void nutool_pincfg_init_qspi0(void) +{ + SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD5MFP_Msk | SYS_GPD_MFPL_PD4MFP_Msk | SYS_GPD_MFPL_PD3MFP_Msk | SYS_GPD_MFPL_PD2MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk | SYS_GPD_MFPL_PD0MFP_Msk); + SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD5MFP_QSPI0_MISO1 | SYS_GPD_MFPL_PD4MFP_QSPI0_MOSI1 | SYS_GPD_MFPL_PD3MFP_QSPI0_MISO0 | SYS_GPD_MFPL_PD2MFP_QSPI0_MOSI0 | SYS_GPD_MFPL_PD1MFP_QSPI0_CLK | SYS_GPD_MFPL_PD0MFP_QSPI0_SS0); + + GPIO_SetDrivingCtl(PD, (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5), 4); + + return; +} + +void nutool_pincfg_deinit_qspi0(void) +{ + SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD5MFP_Msk | SYS_GPD_MFPL_PD4MFP_Msk | SYS_GPD_MFPL_PD3MFP_Msk | SYS_GPD_MFPL_PD2MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk | SYS_GPD_MFPL_PD0MFP_Msk); + + return; +} + +void nutool_pincfg_init_rgmii0(void) +{ + SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE13MFP_Msk | SYS_GPE_MFPH_PE12MFP_Msk | SYS_GPE_MFPH_PE11MFP_Msk | SYS_GPE_MFPH_PE10MFP_Msk | SYS_GPE_MFPH_PE9MFP_Msk | SYS_GPE_MFPH_PE8MFP_Msk); + SYS->GPE_MFPH |= (SYS_GPE_MFPH_PE13MFP_RGMII0_TXD3 | SYS_GPE_MFPH_PE12MFP_RGMII0_TXD2 | SYS_GPE_MFPH_PE11MFP_RGMII0_TXCLK | SYS_GPE_MFPH_PE10MFP_RGMII0_RXD3 | SYS_GPE_MFPH_PE9MFP_RGMII0_RXD2 | SYS_GPE_MFPH_PE8MFP_RGMII0_RXD1); + SYS->GPE_MFPL &= ~(SYS_GPE_MFPL_PE7MFP_Msk | SYS_GPE_MFPL_PE6MFP_Msk | SYS_GPE_MFPL_PE5MFP_Msk | SYS_GPE_MFPL_PE4MFP_Msk | SYS_GPE_MFPL_PE3MFP_Msk | SYS_GPE_MFPL_PE2MFP_Msk | SYS_GPE_MFPL_PE1MFP_Msk | SYS_GPE_MFPL_PE0MFP_Msk); + SYS->GPE_MFPL |= (SYS_GPE_MFPL_PE7MFP_RGMII0_RXD0 | SYS_GPE_MFPL_PE6MFP_RGMII0_RXCTL | SYS_GPE_MFPL_PE5MFP_RGMII0_RXCLK | SYS_GPE_MFPL_PE4MFP_RGMII0_TXD1 | SYS_GPE_MFPL_PE3MFP_RGMII0_TXD0 | SYS_GPE_MFPL_PE2MFP_RGMII0_TXCTL | SYS_GPE_MFPL_PE1MFP_RGMII0_MDIO | SYS_GPE_MFPL_PE0MFP_RGMII0_MDC); + + /* RGMII Mode */ + SYS->GMAC0MISCR &= ~1; + + /* Set 1.8v */ + GPIO_SetPowerMode(PE, 0x3FFF, 0); + + GPIO_SetPullCtl(PE, 0x3FFF, GPIO_PUSEL_DISABLE); + + GPIO_SetSchmittTriggere(PE, 0x3FDF, 1); //except clk + + GPIO_SetSlewCtl(PE, 0x3FFF, GPIO_SLEWCTL_NORMAL); + + GPIO_SetDrivingCtl(PE, 0x3FFF, 1); + + return; +} + +void nutool_pincfg_deinit_rgmii0(void) +{ + SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE13MFP_Msk | SYS_GPE_MFPH_PE12MFP_Msk | SYS_GPE_MFPH_PE11MFP_Msk | SYS_GPE_MFPH_PE10MFP_Msk | SYS_GPE_MFPH_PE9MFP_Msk | SYS_GPE_MFPH_PE8MFP_Msk); + SYS->GPE_MFPL &= ~(SYS_GPE_MFPL_PE7MFP_Msk | SYS_GPE_MFPL_PE6MFP_Msk | SYS_GPE_MFPL_PE5MFP_Msk | SYS_GPE_MFPL_PE4MFP_Msk | SYS_GPE_MFPL_PE3MFP_Msk | SYS_GPE_MFPL_PE2MFP_Msk | SYS_GPE_MFPL_PE1MFP_Msk | SYS_GPE_MFPL_PE0MFP_Msk); + + return; +} + +void nutool_pincfg_init_rgmii1(void) +{ + SYS->GPF_MFPH &= ~(SYS_GPF_MFPH_PF13MFP_Msk | SYS_GPF_MFPH_PF12MFP_Msk | SYS_GPF_MFPH_PF11MFP_Msk | SYS_GPF_MFPH_PF10MFP_Msk | SYS_GPF_MFPH_PF9MFP_Msk | SYS_GPF_MFPH_PF8MFP_Msk); + SYS->GPF_MFPH |= (SYS_GPF_MFPH_PF13MFP_RGMII1_TXD3 | SYS_GPF_MFPH_PF12MFP_RGMII1_TXD2 | SYS_GPF_MFPH_PF11MFP_RGMII1_TXCLK | SYS_GPF_MFPH_PF10MFP_RGMII1_RXD3 | SYS_GPF_MFPH_PF9MFP_RGMII1_RXD2 | SYS_GPF_MFPH_PF8MFP_RGMII1_RXD1); + SYS->GPF_MFPL &= ~(SYS_GPF_MFPL_PF7MFP_Msk | SYS_GPF_MFPL_PF6MFP_Msk | SYS_GPF_MFPL_PF5MFP_Msk | SYS_GPF_MFPL_PF4MFP_Msk | SYS_GPF_MFPL_PF3MFP_Msk | SYS_GPF_MFPL_PF2MFP_Msk | SYS_GPF_MFPL_PF1MFP_Msk | SYS_GPF_MFPL_PF0MFP_Msk); + SYS->GPF_MFPL |= (SYS_GPF_MFPL_PF7MFP_RGMII1_RXD0 | SYS_GPF_MFPL_PF6MFP_RGMII1_RXCTL | SYS_GPF_MFPL_PF5MFP_RGMII1_RXCLK | SYS_GPF_MFPL_PF4MFP_RGMII1_TXD1 | SYS_GPF_MFPL_PF3MFP_RGMII1_TXD0 | SYS_GPF_MFPL_PF2MFP_RGMII1_TXCTL | SYS_GPF_MFPL_PF1MFP_RGMII1_MDIO | SYS_GPF_MFPL_PF0MFP_RGMII1_MDC); + + /* RGMII Mode */ + SYS->GMAC1MISCR &= ~1; + + /* Set 1.8v */ + GPIO_SetPowerMode(PF, 0x3FFF, 0); + + GPIO_SetPullCtl(PF, 0x3FFF, GPIO_PUSEL_DISABLE); + + GPIO_SetSchmittTriggere(PF, 0x3FDF, 1); //except clk + + GPIO_SetSlewCtl(PF, 0x3FFF, GPIO_SLEWCTL_NORMAL); + + GPIO_SetDrivingCtl(PF, 0x3FFF, 1); + + return; +} + +void nutool_pincfg_deinit_rgmii1(void) +{ + SYS->GPF_MFPH &= ~(SYS_GPF_MFPH_PF13MFP_Msk | SYS_GPF_MFPH_PF12MFP_Msk | SYS_GPF_MFPH_PF11MFP_Msk | SYS_GPF_MFPH_PF10MFP_Msk | SYS_GPF_MFPH_PF9MFP_Msk | SYS_GPF_MFPH_PF8MFP_Msk); + SYS->GPF_MFPL &= ~(SYS_GPF_MFPL_PF7MFP_Msk | SYS_GPF_MFPL_PF6MFP_Msk | SYS_GPF_MFPL_PF5MFP_Msk | SYS_GPF_MFPL_PF4MFP_Msk | SYS_GPF_MFPL_PF3MFP_Msk | SYS_GPF_MFPL_PF2MFP_Msk | SYS_GPF_MFPL_PF1MFP_Msk | SYS_GPF_MFPL_PF0MFP_Msk); + + return; +} + +void nutool_pincfg_init_sd0(void) +{ + SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC7MFP_Msk | SYS_GPC_MFPL_PC6MFP_Msk | SYS_GPC_MFPL_PC5MFP_Msk | SYS_GPC_MFPL_PC4MFP_Msk | SYS_GPC_MFPL_PC3MFP_Msk | SYS_GPC_MFPL_PC2MFP_Msk | SYS_GPC_MFPL_PC1MFP_Msk | SYS_GPC_MFPL_PC0MFP_Msk); + SYS->GPC_MFPL |= (SYS_GPC_MFPL_PC7MFP_SD0_WP | SYS_GPC_MFPL_PC6MFP_SD0_nCD | SYS_GPC_MFPL_PC5MFP_SD0_DAT3 | SYS_GPC_MFPL_PC4MFP_SD0_DAT2 | SYS_GPC_MFPL_PC3MFP_SD0_DAT1 | SYS_GPC_MFPL_PC2MFP_SD0_DAT0 | SYS_GPC_MFPL_PC1MFP_SD0_CLK | SYS_GPC_MFPL_PC0MFP_SD0_CMD); + + return; +} + +void nutool_pincfg_deinit_sd0(void) +{ + SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC7MFP_Msk | SYS_GPC_MFPL_PC6MFP_Msk | SYS_GPC_MFPL_PC5MFP_Msk | SYS_GPC_MFPL_PC4MFP_Msk | SYS_GPC_MFPL_PC3MFP_Msk | SYS_GPC_MFPL_PC2MFP_Msk | SYS_GPC_MFPL_PC1MFP_Msk | SYS_GPC_MFPL_PC0MFP_Msk); + + return; +} + +void nutool_pincfg_init_sd1(void) +{ + SYS->GPJ_MFPH &= ~(SYS_GPJ_MFPH_PJ11MFP_Msk | SYS_GPJ_MFPH_PJ10MFP_Msk | SYS_GPJ_MFPH_PJ9MFP_Msk | SYS_GPJ_MFPH_PJ8MFP_Msk); + SYS->GPJ_MFPH |= (SYS_GPJ_MFPH_PJ11MFP_SD1_DAT3 | SYS_GPJ_MFPH_PJ10MFP_SD1_DAT2 | SYS_GPJ_MFPH_PJ9MFP_SD1_DAT1 | SYS_GPJ_MFPH_PJ8MFP_SD1_DAT0); + SYS->GPJ_MFPL &= ~(SYS_GPJ_MFPL_PJ7MFP_Msk | SYS_GPJ_MFPL_PJ6MFP_Msk | SYS_GPJ_MFPL_PJ5MFP_Msk | SYS_GPJ_MFPL_PJ4MFP_Msk); + SYS->GPJ_MFPL |= (SYS_GPJ_MFPL_PJ7MFP_SD1_CLK | SYS_GPJ_MFPL_PJ6MFP_SD1_CMD | SYS_GPJ_MFPL_PJ5MFP_SD1_nCD | SYS_GPJ_MFPL_PJ4MFP_SD1_WP); + SYS->GPJ_MFPL &= ~(SYS_GPJ_MFPL_PJ0MFP_Msk | SYS_GPJ_MFPL_PJ1MFP_Msk | SYS_GPJ_MFPL_PJ2MFP_Msk | SYS_GPJ_MFPL_PJ3MFP_Msk); + SYS->GPJ_MFPL |= (SYS_GPJ_MFPL_PJ0MFP_eMMC1_DAT4 | SYS_GPJ_MFPL_PJ1MFP_eMMC1_DAT5 | SYS_GPJ_MFPL_PJ2MFP_eMMC1_DAT6 | SYS_GPJ_MFPL_PJ3MFP_eMMC1_DAT7); + + return; +} + +void nutool_pincfg_deinit_sd1(void) +{ + SYS->GPJ_MFPH &= ~(SYS_GPJ_MFPH_PJ11MFP_Msk | SYS_GPJ_MFPH_PJ10MFP_Msk | SYS_GPJ_MFPH_PJ9MFP_Msk | SYS_GPJ_MFPH_PJ8MFP_Msk); + SYS->GPJ_MFPL &= ~(SYS_GPJ_MFPL_PJ7MFP_Msk | SYS_GPJ_MFPL_PJ6MFP_Msk | SYS_GPJ_MFPL_PJ5MFP_Msk | SYS_GPJ_MFPL_PJ4MFP_Msk); + SYS->GPJ_MFPL &= ~(SYS_GPJ_MFPL_PJ0MFP_Msk | SYS_GPJ_MFPL_PJ1MFP_Msk | SYS_GPJ_MFPL_PJ2MFP_Msk | SYS_GPJ_MFPL_PJ3MFP_Msk); + + return; +} + +void nutool_pincfg_init_uart0(void) +{ + SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE15MFP_Msk | SYS_GPE_MFPH_PE14MFP_Msk); + SYS->GPE_MFPH |= (SYS_GPE_MFPH_PE15MFP_UART0_RXD | SYS_GPE_MFPH_PE14MFP_UART0_TXD); + + return; +} + +void nutool_pincfg_deinit_uart0(void) +{ + SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE15MFP_Msk | SYS_GPE_MFPH_PE14MFP_Msk); + + return; +} + +void nutool_pincfg_init_uart11(void) +{ + SYS->GPL_MFPL &= ~(SYS_GPL_MFPL_PL0MFP_Msk | SYS_GPL_MFPL_PL1MFP_Msk | SYS_GPL_MFPL_PL2MFP_Msk | SYS_GPL_MFPL_PL3MFP_Msk); + SYS->GPL_MFPL |= (SYS_GPL_MFPL_PL3MFP_UART11_TXD | SYS_GPL_MFPL_PL2MFP_UART11_RXD | SYS_GPL_MFPL_PL1MFP_UART11_nRTS | SYS_GPL_MFPL_PL0MFP_UART11_nCTS); + + return; +} + +void nutool_pincfg_deinit_uart11(void) +{ + SYS->GPL_MFPL &= ~(SYS_GPL_MFPL_PL0MFP_Msk | SYS_GPL_MFPL_PL1MFP_Msk | SYS_GPL_MFPL_PL2MFP_Msk | SYS_GPL_MFPL_PL3MFP_Msk); + + return; +} + +void nutool_pincfg_init_uart12(void) +{ + SYS->GPI_MFPL &= ~(SYS_GPI_MFPL_PI3MFP_Msk | SYS_GPI_MFPL_PI2MFP_Msk | SYS_GPI_MFPL_PI1MFP_Msk); + SYS->GPI_MFPL |= (SYS_GPI_MFPL_PI3MFP_UART12_TXD | SYS_GPI_MFPL_PI2MFP_UART12_RXD | SYS_GPI_MFPL_PI1MFP_UART12_nRTS); + + return; +} + +void nutool_pincfg_deinit_uart12(void) +{ + SYS->GPI_MFPL &= ~(SYS_GPI_MFPL_PI3MFP_Msk | SYS_GPI_MFPL_PI2MFP_Msk | SYS_GPI_MFPL_PI1MFP_Msk); + + return; +} + +void nutool_pincfg_init_uart14(void) +{ + SYS->GPI_MFPL &= ~(SYS_GPI_MFPL_PI7MFP_Msk | SYS_GPI_MFPL_PI6MFP_Msk | SYS_GPI_MFPL_PI5MFP_Msk); + SYS->GPI_MFPL |= (SYS_GPI_MFPL_PI7MFP_UART14_TXD | SYS_GPI_MFPL_PI6MFP_UART14_RXD | SYS_GPI_MFPL_PI5MFP_UART14_nRTS); + + return; +} + +void nutool_pincfg_deinit_uart14(void) +{ + SYS->GPI_MFPL &= ~(SYS_GPI_MFPL_PI7MFP_Msk | SYS_GPI_MFPL_PI6MFP_Msk | SYS_GPI_MFPL_PI5MFP_Msk); + + return; +} + +void nutool_pincfg_init_uart16(void) +{ + SYS->GPK_MFPL &= ~(SYS_GPK_MFPL_PK3MFP_Msk | SYS_GPK_MFPL_PK2MFP_Msk | SYS_GPK_MFPL_PK1MFP_Msk | SYS_GPK_MFPL_PK0MFP_Msk); + SYS->GPK_MFPL |= (SYS_GPK_MFPL_PK3MFP_UART16_TXD | SYS_GPK_MFPL_PK2MFP_UART16_RXD | SYS_GPK_MFPL_PK1MFP_UART16_nRTS | SYS_GPK_MFPL_PK0MFP_UART16_nCTS); + + return; +} + +void nutool_pincfg_deinit_uart16(void) +{ + SYS->GPK_MFPL &= ~(SYS_GPK_MFPL_PK3MFP_Msk | SYS_GPK_MFPL_PK2MFP_Msk | SYS_GPK_MFPL_PK1MFP_Msk | SYS_GPK_MFPL_PK0MFP_Msk); + + return; +} + +void nutool_pincfg_init_vcap0(void) +{ + SYS->GPK_MFPH &= ~(SYS_GPK_MFPH_PK11MFP_Msk | SYS_GPK_MFPH_PK10MFP_Msk | SYS_GPK_MFPH_PK9MFP_Msk); + SYS->GPK_MFPH |= (SYS_GPK_MFPH_PK11MFP_VCAP0_HSYNC | SYS_GPK_MFPH_PK10MFP_VCAP0_PIXCLK | SYS_GPK_MFPH_PK9MFP_VCAP0_SCLK); + SYS->GPM_MFPH &= ~(SYS_GPM_MFPH_PM11MFP_Msk | SYS_GPM_MFPH_PM10MFP_Msk | SYS_GPM_MFPH_PM9MFP_Msk | SYS_GPM_MFPH_PM8MFP_Msk); + SYS->GPM_MFPH |= (SYS_GPM_MFPH_PM11MFP_VCAP0_DATA9 | SYS_GPM_MFPH_PM10MFP_VCAP0_DATA8 | SYS_GPM_MFPH_PM9MFP_VCAP0_DATA7 | SYS_GPM_MFPH_PM8MFP_VCAP0_DATA6); + SYS->GPM_MFPL &= ~(SYS_GPM_MFPL_PM7MFP_Msk | SYS_GPM_MFPL_PM6MFP_Msk | SYS_GPM_MFPL_PM5MFP_Msk | SYS_GPM_MFPL_PM4MFP_Msk | SYS_GPM_MFPL_PM3MFP_Msk | SYS_GPM_MFPL_PM2MFP_Msk | SYS_GPM_MFPL_PM1MFP_Msk | SYS_GPM_MFPL_PM0MFP_Msk); + SYS->GPM_MFPL |= (SYS_GPM_MFPL_PM7MFP_VCAP0_DATA5 | SYS_GPM_MFPL_PM6MFP_VCAP0_DATA4 | SYS_GPM_MFPL_PM5MFP_VCAP0_DATA3 | SYS_GPM_MFPL_PM4MFP_VCAP0_DATA2 | SYS_GPM_MFPL_PM3MFP_VCAP0_DATA1 | SYS_GPM_MFPL_PM2MFP_VCAP0_DATA0 | SYS_GPM_MFPL_PM1MFP_VCAP0_SFIELD | SYS_GPM_MFPL_PM0MFP_VCAP0_VSYNC); + + return; +} + +void nutool_pincfg_deinit_vcap0(void) +{ + SYS->GPK_MFPH &= ~(SYS_GPK_MFPH_PK11MFP_Msk | SYS_GPK_MFPH_PK10MFP_Msk | SYS_GPK_MFPH_PK9MFP_Msk); + SYS->GPM_MFPH &= ~(SYS_GPM_MFPH_PM11MFP_Msk | SYS_GPM_MFPH_PM10MFP_Msk | SYS_GPM_MFPH_PM9MFP_Msk | SYS_GPM_MFPH_PM8MFP_Msk); + SYS->GPM_MFPL &= ~(SYS_GPM_MFPL_PM7MFP_Msk | SYS_GPM_MFPL_PM6MFP_Msk | SYS_GPM_MFPL_PM5MFP_Msk | SYS_GPM_MFPL_PM4MFP_Msk | SYS_GPM_MFPL_PM3MFP_Msk | SYS_GPM_MFPL_PM2MFP_Msk | SYS_GPM_MFPL_PM1MFP_Msk | SYS_GPM_MFPL_PM0MFP_Msk); + + return; +} + +void nutool_pincfg_init_vcap1(void) +{ + SYS->GPN_MFPH &= ~(SYS_GPN_MFPH_PN14MFP_Msk | SYS_GPN_MFPH_PN13MFP_Msk | SYS_GPN_MFPH_PN12MFP_Msk | SYS_GPN_MFPH_PN11MFP_Msk | SYS_GPN_MFPH_PN10MFP_Msk | SYS_GPN_MFPH_PN9MFP_Msk | SYS_GPN_MFPH_PN8MFP_Msk); + SYS->GPN_MFPH |= (SYS_GPN_MFPH_PN14MFP_VCAP1_SFIELD | SYS_GPN_MFPH_PN13MFP_VCAP1_VSYNC | SYS_GPN_MFPH_PN12MFP_VCAP1_HSYNC | SYS_GPN_MFPH_PN11MFP_VCAP1_PIXCLK | SYS_GPN_MFPH_PN10MFP_VCAP1_SCLK | SYS_GPN_MFPH_PN9MFP_VCAP1_DATA9 | SYS_GPN_MFPH_PN8MFP_VCAP1_DATA8); + SYS->GPN_MFPL &= ~(SYS_GPN_MFPL_PN7MFP_Msk | SYS_GPN_MFPL_PN6MFP_Msk | SYS_GPN_MFPL_PN5MFP_Msk | SYS_GPN_MFPL_PN4MFP_Msk | SYS_GPN_MFPL_PN3MFP_Msk | SYS_GPN_MFPL_PN2MFP_Msk | SYS_GPN_MFPL_PN1MFP_Msk | SYS_GPN_MFPL_PN0MFP_Msk); + SYS->GPN_MFPL |= (SYS_GPN_MFPL_PN7MFP_VCAP1_DATA7 | SYS_GPN_MFPL_PN6MFP_VCAP1_DATA6 | SYS_GPN_MFPL_PN5MFP_VCAP1_DATA5 | SYS_GPN_MFPL_PN4MFP_VCAP1_DATA4 | SYS_GPN_MFPL_PN3MFP_VCAP1_DATA3 | SYS_GPN_MFPL_PN2MFP_VCAP1_DATA2 | SYS_GPN_MFPL_PN1MFP_VCAP1_DATA1 | SYS_GPN_MFPL_PN0MFP_VCAP1_DATA0); + + return; +} + +void nutool_pincfg_deinit_vcap1(void) +{ + SYS->GPN_MFPH &= ~(SYS_GPN_MFPH_PN14MFP_Msk | SYS_GPN_MFPH_PN13MFP_Msk | SYS_GPN_MFPH_PN12MFP_Msk | SYS_GPN_MFPH_PN11MFP_Msk | SYS_GPN_MFPH_PN10MFP_Msk | SYS_GPN_MFPH_PN9MFP_Msk | SYS_GPN_MFPH_PN8MFP_Msk); + SYS->GPN_MFPL &= ~(SYS_GPN_MFPL_PN7MFP_Msk | SYS_GPN_MFPL_PN6MFP_Msk | SYS_GPN_MFPL_PN5MFP_Msk | SYS_GPN_MFPL_PN4MFP_Msk | SYS_GPN_MFPL_PN3MFP_Msk | SYS_GPN_MFPL_PN2MFP_Msk | SYS_GPN_MFPL_PN1MFP_Msk | SYS_GPN_MFPL_PN0MFP_Msk); + + return; +} + +void nutool_pincfg_init(void) +{ + //SYS->GPA_MFPH = 0x06666666UL; + //SYS->GPA_MFPL = 0x66666666UL; + //SYS->GPB_MFPH = 0x8888CC44UL; + //SYS->GPB_MFPL = 0x88888888UL; + //SYS->GPC_MFPH = 0x66662222UL; + //SYS->GPC_MFPL = 0x66666666UL; + //SYS->GPD_MFPH = 0x00000000UL; + //SYS->GPD_MFPL = 0x00555555UL; + //SYS->GPE_MFPH = 0x11888888UL; + //SYS->GPE_MFPL = 0x88888888UL; + //SYS->GPF_MFPH = 0x10888888UL; + //SYS->GPF_MFPL = 0x88888888UL; + //SYS->GPG_MFPH = 0x00000666UL; + //SYS->GPG_MFPL = 0x00000000UL; + //SYS->GPH_MFPH = 0x66660000UL; + //SYS->GPH_MFPL = 0x66666666UL; + //SYS->GPI_MFPH = 0x66666666UL; + //SYS->GPI_MFPL = 0x22202220UL; + //SYS->GPJ_MFPH = 0x00446666UL; + //SYS->GPJ_MFPL = 0x66660000UL; + //SYS->GPK_MFPH = 0x55556660UL; + //SYS->GPK_MFPL = 0x00062222UL; + //SYS->GPL_MFPH = 0x44993300UL; + //SYS->GPL_MFPL = 0x00440000UL; + //SYS->GPM_MFPH = 0x66106666UL; + //SYS->GPM_MFPL = 0x66666666UL; + //SYS->GPN_MFPH = 0x56666666UL; + //SYS->GPN_MFPL = 0x66666666UL; + + nutool_pincfg_init_adc0(); + nutool_pincfg_init_can1(); + nutool_pincfg_init_can3(); + nutool_pincfg_init_eadc0(); + nutool_pincfg_init_epwm1(); + nutool_pincfg_init_hsusb0(); + nutool_pincfg_init_hsusbh(); + nutool_pincfg_init_i2c1(); + nutool_pincfg_init_i2c2(); + nutool_pincfg_init_i2c3(); + nutool_pincfg_init_i2c4(); + nutool_pincfg_init_i2c5(); + nutool_pincfg_init_i2s0(); + nutool_pincfg_init_lcm(); + nutool_pincfg_init_nand(); + nutool_pincfg_init_qspi0(); + nutool_pincfg_init_rgmii0(); + nutool_pincfg_init_rgmii1(); + nutool_pincfg_init_sd0(); + nutool_pincfg_init_sd1(); + nutool_pincfg_init_uart0(); + nutool_pincfg_init_uart11(); + nutool_pincfg_init_uart12(); + nutool_pincfg_init_uart14(); + nutool_pincfg_init_uart16(); + nutool_pincfg_init_vcap0(); + nutool_pincfg_init_vcap1(); + + return; +} + +void nutool_pincfg_deinit(void) +{ + nutool_pincfg_deinit_adc0(); + nutool_pincfg_deinit_can1(); + nutool_pincfg_deinit_can3(); + nutool_pincfg_deinit_eadc0(); + nutool_pincfg_deinit_epwm1(); + nutool_pincfg_deinit_hsusb0(); + nutool_pincfg_deinit_hsusbh(); + nutool_pincfg_deinit_i2c1(); + nutool_pincfg_deinit_i2c2(); + nutool_pincfg_deinit_i2c3(); + nutool_pincfg_deinit_i2c4(); + nutool_pincfg_deinit_i2c5(); + nutool_pincfg_deinit_i2s0(); + nutool_pincfg_deinit_lcm(); + nutool_pincfg_deinit_nand(); + nutool_pincfg_deinit_qspi0(); + nutool_pincfg_deinit_rgmii0(); + nutool_pincfg_deinit_rgmii1(); + nutool_pincfg_deinit_sd0(); + nutool_pincfg_deinit_sd1(); + nutool_pincfg_deinit_uart0(); + nutool_pincfg_deinit_uart11(); + nutool_pincfg_deinit_uart12(); + nutool_pincfg_deinit_uart14(); + nutool_pincfg_deinit_uart16(); + nutool_pincfg_deinit_vcap0(); + nutool_pincfg_deinit_vcap1(); + + return; +} + +/*** (C) COPYRIGHT 2013-2021 Nuvoton Technology Corp. ***/ diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.cfg b/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.cfg new file mode 100644 index 0000000000..c51eaf23fe --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.cfg @@ -0,0 +1,367 @@ +/**************************************************************************** + * @file nutool_pincfg.cfg + * @version V1.24 + * @Date 2021/08/03-14:56:48 + * @brief NuMicro config file + * + * @note Please do not modify this file. + * Otherwise, it may not be loaded successfully. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2013-2021 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ +MCU:MA35D16A887C(BGA312) +PinA1:VSS +PinA2:I2C2_SCL +PinA3:EADC0_CH7 +PinA4:EADC0_CH3 +PinA5:RGMII1_TXCLK +PinA6:RGMII1_RXCLK +PinA7:RGMII1_RXCTL +PinA8:RGMII1_MDIO +PinA9:RGMII0_TXCLK +PinA10:RGMII0_RXD1 +PinA11:RGMII0_RXCLK +PinA12:RGMII0_TXCTL +PinA13:I2S0_DI +PinA14:VCAP1_SFIELD +PinA15:VCAP1_HSYNC +PinA16:VCAP1_PIXCLK +PinA17:VCAP1_DATA5 +PinA18:VSS +PinB1:ADC0_CH4 +PinB2:I2C1_SCL +PinB3:EADC0_CH5 +PinB4:EADC0_CH4 +PinB5:EADC0_CH1 +PinB6:RGMII1_TXD3 +PinB7:RGMII1_RXD0 +PinB8:RGMII1_TXCTL +PinB9:RGMII0_TXD2 +PinB10:RGMII0_RXD2 +PinB11:RGMII0_RXCTL +PinB12:RGMII0_MDIO +PinB13:I2S0_BCLK +PinB14:VCAP1_VSYNC +PinB15:VCAP1_SCLK +PinB16:VCAP1_DATA7 +PinB17:VCAP1_DATA0 +PinB18:VCAP1_DATA2 +PinC1:ADC0_CH7 +PinC2:ADC0_CH5 +PinC3:I2C2_SDA +PinC4:EADC0_CH2 +PinC5:EADC0_CH0 +PinC6:RGMII1_TXD2 +PinC7:RGMII1_RXD2 +PinC8:RGMII1_TXD0 +PinC9:RGMII0_TXD3 +PinC10:RGMII0_RXD0 +PinC11:RGMII0_TXD1 +PinC12:RGMII0_MDC +PinC13:I2S0_LRCK +PinC14:VCAP1_DATA8 +PinC15:VCAP1_DATA6 +PinC16:VCAP1_DATA4 +PinC17:VCAP1_DATA1 +PinC18:VCAP1_DATA3 +PinD1:ADC0_CH6 +PinD2:I2C1_SDA +PinD3:EADC0_CH6 +PinD4:VSS +PinD5:PF.14 +PinD6:RGMII1_RXD3 +PinD7:RGMII1_RXD1 +PinD8:RGMII1_TXD1 +PinD9:RGMII1_MDC +PinD10:RGMII0_RXD3 +PinD11:RGMII0_TXD0 +PinD12:I2S0_DO +PinD13:I2S0_MCLK +PinD14:VCAP1_DATA9 +PinD15:VSS +PinD16:UART10_nCTS +PinD17:UART10_TXD +PinD18:SD0_CLK +PinE1:HSUSBH_PWREN +PinE2:CAN1_RXD +PinE3:HSUSBH_OVC +PinE4:HSUSB0_VBUSVLD +PinE5:NC_ToolNotShow +PinE6:NC_ToolNotShow +PinE7:RTC_RPWR +PinE8:PH.9 +PinE9:PH.8 +PinE10:VDDIO9 +PinE11:VDDIO8 +PinE12:AVDDL_PLL2 +PinE13:NC_ToolNotShow +PinE14:NC_ToolNotShow +PinE15:UART10_nRTS +PinE16:UART10_RXD +PinE17:SD0_WP +PinE18:SD0_DAT0 +PinF1:XT1_IN +PinF2:XT1_OUT +PinF3:CAN1_TXD +PinF4:NAND_DATA3 +PinF5:NC_ToolNotShow +PinF6:VDD_HSUSB1 +PinF7:VBAT +PinF8:AVDD +PinF9:VREF_EADC0 +PinF10:AVDDH_PLL1 +PinF11:AVDDL_PLL1 +PinF12:VDD_PLL1 +PinF13:VDDIO7 +PinF14:NC_ToolNotShow +PinF15:PD.15 +PinF16:UART14_RXD +PinF17:SD0_nCD +PinF18:SD0_CMD +PinG1:X32_IN +PinG2:X32_OUT +PinG3:NAND_DATA0 +PinG4:NAND_DATA5 +PinG5:RTC_nRWAKE +PinG6:VDD_OTP +PinG7:VDD_HSUSB0 +PinG8:AVDD_ADC0 +PinG9:AVDD_EADC0 +PinG10:AVDDH_PLL0 +PinG11:AVDDL_PLL0 +PinG12:VDD_PLL0 +PinG13:VDDIO6 +PinG14:PD.13 +PinG15:PA.15 +PinG16:UART16_nRTS +PinG17:SD0_DAT3 +PinG18:SD0_DAT1 +PinH1:HSUSB1_D- +PinH2:HSUSB1_D+ +PinH3:NAND_DATA1 +PinH4:NAND_DATA7 +PinH5:nRESET +PinH6:HSUSB1_REXT +PinH7:AVDDL_PLL3 +PinH8:VDD_CORE +PinH9:AVSS +PinH10:AVSS_PLL +PinH11:VSS +PinH12:VDD_CORE +PinH13:MVDD +PinH14:MVREF +PinH15:UART12_nRTS +PinH16:UART16_nCTS +PinH17:PL.6 +PinH18:SD0_DAT2 +PinJ1:HSUSB0_D+ +PinJ2:HSUSB0_D- +PinJ3:NAND_DATA6 +PinJ4:NAND_RDY +PinJ5:HSUSB0_ID +PinJ6:HSUSB0_REXT +PinJ7:VDD_CORE +PinJ8:VSS +PinJ9:VSS +PinJ10:VSS +PinJ11:VSS +PinJ12:VDD_CORE +PinJ13:MVDD +PinJ14:MZQ_DDRPHY +PinJ15:UART12_RXD +PinJ16:UART16_TXD +PinJ17:PL.7 +PinJ18:I2C4_SCL +PinK1:NAND_DATA2 +PinK2:NAND_DATA4 +PinK3:NAND_nRE +PinK4:NAND_ALE +PinK5:NAND_nWE +PinK6:VDD_CORE +PinK7:VDD_CORE +PinK8:VSS +PinK9:VSS +PinK10:VSS +PinK11:VSS +PinK12:VDD_CORE +PinK13:MVDD +PinK14:MZQ_SDRAM +PinK15:PI.0 +PinK16:UART16_RXD +PinK17:PL.8 +PinK18:I2C4_SDA +PinL1:NAND_nCS +PinL2:NAND_CLE +PinL3:PG.2 +PinL4:PG.4 +PinL5:PG.6 +PinL6:VDDIO0 +PinL7:VDD_CPU +PinL8:VSS +PinL9:VSS +PinL10:VSS +PinL11:VSS +PinL12:VDD_CORE +PinL13:MVDD +PinL14:PD.14 +PinL15:UART12_TXD +PinL16:I2C5_SDA +PinL17:PL.9 +PinL18:PL.3 +PinM1:PG.1 +PinM2:PG.0 +PinM3:PG.5 +PinM4:PG.3 +PinM5:NAND_nWP +PinM6:VDDIO1 +PinM7:VDD_CPU +PinM8:VSS +PinM9:VSS +PinM10:VSS +PinM11:VSS +PinM12:MVDD_DPHYPLL +PinM13:VDDIO5 +PinM14:PD.12 +PinM15:UART14_nRTS +PinM16:I2C5_SCL +PinM17:CAN3_RXD +PinM18:PL.0 +PinN1:EPWM1_CH5 +PinN2:I2C3_SDA +PinN3:PM.12 +PinN4:PG.7 +PinN5:NC_ToolNotShow +PinN6:VDDIO2 +PinN7:VDD_CPU +PinN8:VDD_CPU +PinN9:VDD_CORE +PinN10:VDD_CORE +PinN11:VDD_CORE +PinN12:VDDIO3 +PinN13:VDDIO4 +PinN14:NC_ToolNotShow +PinN15:PI.4 +PinN16:PJ.15 +PinN17:CAN3_TXD +PinN18:PL.1 +PinP1:I2C3_SCL +PinP2:PG.12 +PinP3:PG.15 +PinP4:PG.11 +PinP5:NC_ToolNotShow +PinP6:NC_ToolNotShow +PinP7:VCAP0_SFIELD +PinP8:SD1_nCD +PinP9:SD1_WP +PinP10:PK.5 +PinP11:PK.6 +PinP12:PK.7 +PinP13:NC_ToolNotShow +PinP14:NC_ToolNotShow +PinP15:UART14_TXD +PinP16:PJ.14 +PinP17:PK.8 +PinP18:PL.2 +PinR1:PG.14 +PinR2:PG.13 +PinR3:PD.7 +PinR4:VSS +PinR5:VCAP0_DATA9 +PinR6:VCAP0_DATA7 +PinR7:PJ.1 +PinR8:PJ.3 +PinR9:SD1_DAT1 +PinR10:LCM_DEN +PinR11:LCM_DATA1 +PinR12:LCM_DATA6 +PinR13:LCM_DATA11 +PinR14:LCM_DATA15 +PinR15:VSS +PinR16:LCM_DATA18 +PinR17:LCM_DATA20 +PinR18:LCM_DATA22 +PinT1:UART0_TXD +PinT2:UART0_RXD +PinT3:PD.11 +PinT4:VCAP0_HSYNC +PinT5:VCAP0_DATA1 +PinT6:VCAP0_DATA5 +PinT7:VCAP0_DATA6 +PinT8:PJ.2 +PinT9:SD1_CMD +PinT10:LCM_VSYNC +PinT11:LCM_DATA0 +PinT12:LCM_DATA5 +PinT13:LCM_DATA10 +PinT14:LCM_DATA14 +PinT15:QSPI0_MISO1 +PinT16:LCM_DATA16 +PinT17:LCM_DATA17 +PinT18:LCM_DATA23 +PinU1:PD.6 +PinU2:PD.8 +PinU3:PD.10 +PinU4:VCAP0_VSYNC +PinU5:VCAP0_DATA2 +PinU6:VCAP0_DATA3 +PinU7:VCAP0_DATA8 +PinU8:SD1_DAT3 +PinU9:SD1_DAT0 +PinU10:LCM_HSYNC +PinU11:LCM_DATA7 +PinU12:LCM_DATA4 +PinU13:LCM_DATA9 +PinU14:LCM_DATA13 +PinU15:QSPI0_MISO0 +PinU16:QSPI0_SS0 +PinU17:LCM_DATA19 +PinU18:LCM_DATA21 +PinV1:VSS +PinV2:PD.9 +PinV3:VCAP0_SCLK +PinV4:VCAP0_PIXCLK +PinV5:VCAP0_DATA0 +PinV6:VCAP0_DATA4 +PinV7:PJ.0 +PinV8:SD1_CLK +PinV9:SD1_DAT2 +PinV10:LCM_CLK +PinV11:LCM_DATA2 +PinV12:LCM_DATA3 +PinV13:LCM_DATA8 +PinV14:LCM_DATA12 +PinV15:QSPI0_MOSI1 +PinV16:QSPI0_MOSI0 +PinV17:QSPI0_CLK +PinV18:VSS +SYS->GPA_MFPH = 0x06666666 +SYS->GPA_MFPL = 0x66666666 +SYS->GPB_MFPH = 0x8888CC44 +SYS->GPB_MFPL = 0x88888888 +SYS->GPC_MFPH = 0x66662222 +SYS->GPC_MFPL = 0x66666666 +SYS->GPD_MFPH = 0x00000000 +SYS->GPD_MFPL = 0x00555555 +SYS->GPE_MFPH = 0x11888888 +SYS->GPE_MFPL = 0x88888888 +SYS->GPF_MFPH = 0x10888888 +SYS->GPF_MFPL = 0x88888888 +SYS->GPG_MFPH = 0x00000666 +SYS->GPG_MFPL = 0x00000000 +SYS->GPH_MFPH = 0x66660000 +SYS->GPH_MFPL = 0x66666666 +SYS->GPI_MFPH = 0x66666666 +SYS->GPI_MFPL = 0x22202220 +SYS->GPJ_MFPH = 0x00446666 +SYS->GPJ_MFPL = 0x66660000 +SYS->GPK_MFPH = 0x55556660 +SYS->GPK_MFPL = 0x00062222 +SYS->GPL_MFPH = 0x44993300 +SYS->GPL_MFPL = 0x00440000 +SYS->GPM_MFPH = 0x66106666 +SYS->GPM_MFPL = 0x66666666 +SYS->GPN_MFPH = 0x56666666 +SYS->GPN_MFPL = 0x66666666 +/*** (C) COPYRIGHT 2013-2021 Nuvoton Technology Corp. ***/ diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.h b/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.h new file mode 100644 index 0000000000..91a44d9411 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.h @@ -0,0 +1,26 @@ +/**************************************************************************** + * @file nutool_pincfg.h + * @version V1.24 + * @Date 2021/08/03-14:56:47 + * @brief NuMicro generated code file + * + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2013-2021 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#ifndef __NUTOOL_PINCFG_H__ +#define __NUTOOL_PINCFG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif +void nutool_pincfg_init_uart16(void); +void nutool_pincfg_deinit_uart16(void); +#ifdef __cplusplus +} +#endif +#endif /*__NUTOOL_PINCFG_H__*/ + +/*** (C) COPYRIGHT 2013-2021 Nuvoton Technology Corp. ***/ diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/figures/LCD-Panel.png b/bsp/nuvoton/numaker-hmi-ma35d1/figures/LCD-Panel.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa4bcfed1ccac036fd8475acc3d595899e4e9a0 GIT binary patch literal 585100 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 -7yk=~tB4C)utgl*}3ntks%pd~z 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

@3=1myW(R-8QKD%|O;26yny6rnb<;w}b)Fr0e@* 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 literal 0 HcmV?d00001 diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/figures/NuMaker-BASE-MA35D1B1.png b/bsp/nuvoton/numaker-hmi-ma35d1/figures/NuMaker-BASE-MA35D1B1.png new file mode 100644 index 0000000000000000000000000000000000000000..9c1376c886caa8bace4331e0287094685dbdf856 GIT binary patch literal 1092795 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

{=(mgNUkRV==@x-1hm5!k?8fsC-@S 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 d{Hu6ao@H!C%wH8{-)H+GF@?obJLzCy!!%b~rA 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%0A5M`3`Zy>Q-tG(|4vg9hy{rYsidGgFo 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 literal 0 HcmV?d00001 diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/figures/NuMaker-HMI-MA35D1.png b/bsp/nuvoton/numaker-hmi-ma35d1/figures/NuMaker-HMI-MA35D1.png new file mode 100644 index 0000000000000000000000000000000000000000..cb7eb2210c8d48623a511485840a03b312b20466 GIT binary patch literal 131518 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%0AXw<+dX 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 literal 0 HcmV?d00001 diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/figures/NuMaker-SOM-MA35D16A81.png b/bsp/nuvoton/numaker-hmi-ma35d1/figures/NuMaker-SOM-MA35D16A81.png new file mode 100644 index 0000000000000000000000000000000000000000..52e791791815c46f90f4235feacd5f816286ba95 GIT binary patch literal 336751 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 z 3zTgs8-f}nNZ@!-8yVvpO_ZKj{?+~mOC+$H$fmnp6-(EoLhK+nSe*vdYn#{W| zy~5Z*L#Zk6!-@@Snez1SVb@;vY}iUimyej$NRicntFD{s=`)~z8H*pdhl(MGvAeO6 zhRzO-Jo<1}uUy3S*WNS<1fWx#MI4LHj3Xv{ZY2u2yv zke~`1A%o6|_uNkX%H_0X5`?^VTA~r&fA0gPopcHp-*_9r4V&4yZ9AEyPAm}M*key( z<5PcS%!MM+IE)pqzCf`fhkheR^7J3)Fkrv{29;D&di?Ps-0389&Z2s^AzI^!4gj-v{^lU_u# zsCYBkfPARk{8Qll_vZ-4j6pVmg4V3?zB``I>h<;}HsX1yW-}q($UdvesJ}kJi=TYN zr@MA>&V{o`wRK`o8;OO&`m)cudM1poyrv7{u zW}AX0JitYjD+((iHEXkEZSAB8g`Rc85mm1#Yto+3KhZ!>i7 zeo9<<1V@afWZE>Yd+Hfl%_(;K57OleaCra2nK)@Ow?B424?px<-gx3KxU3c;#stY| z1V=c@`RAR(4G-PVyC1&C!bOXysH#LY8>O0DQCMTv_{jv8Z@|~lL-lC4dGghLm9JV7K!&E+OAkwLM~G3Yh=)(Q99Z>+4aqCHm=>s z_HVY++3h2)$FVr z?=7I@Dzm-sU!6Ktr@X6O(vglE2?R?ZXmEEJ90I{TxCI7>0Ks9HK?WP#B{+l-Bu3o5 zy{o&r{G2-HylX#|%y7T=-aBhuS>L*My}cF-k`CSJs`EU1@BjWwD5Mz2$xND1Buw5i z$!2pxglcwd`#W6sE03=I=EK*l*|wsidUV}iG))m-^)rIO?E_xlA&F#iLe?xARefp{ zoYU3Qg|4}3+VN%!)PzD*2gB%{ouuaf%-EvFew0(|)!E|qDv3$0BXNNywsgR%;+6`p znouO}4rmGKL=HZH%CpYl^UH5!|7)-0)rH^k^~%K@JLyQ}Gu)L*@z+;h=A-YwgH(zs z$DN2LmuJMFq3k$p7(J`k(9+exl-Hi;qZeP~+nL`oZ1hMb9K1it)f?%2|62|}>ulI} zSH6Gv9yVo@R1N4y#&%Ucrq$BQC0E|emnU7y?z`+x;Et)#x(Q61j`lWMiy0+>@D*&l z@gO}l2HB2o#v6U0{~%bo2!;;gZ@1lvQB_Xa_QTlJ)yaZcb7<(>kEu^gXYtQJar@M% z>^Nc+yY8?9V`p;Ci%0#>#0^$pjv&yANsZx3r{&12y8H-Oor zBu^{XsoQQGELsFRj%CR?=fIX0 z`b5ImW=6T@1jIBUlTpuv+6juS>fgh`mZlh|2x0p?+dT|gz>zKVV4?X)iBHc zw{EL}}=PdAeeKa`eqFRNNM z(e38wN+$^D9>Tdi{Y{NPZ<>Gy65b-swGrAKn*r5*$)q7#H-tdMPkk+HzuS&{arupO ze*6_XrA;EyGG6cL;0GL90x|YG<5au>O+n3G!;dMx)w&mdK**a#LSlPpJGf%2rCtlA zT2_)HX($~bof!dQmc#C4aXMaqo4#{?rEjc?{LbSUcH$`qLLVi#&_VrfmBpfC}OUHon4!*&Q>~_ zTNP}+ZuL6Wt=d3KODm?ZmLnlD#TF}9r!k;%0A04lqFfhS8lnt5{1Cp|(#497 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

XZmdmcIRCE$_MyI_2<(Ln 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

n6mZ_sY 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 |@k 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 literal 0 HcmV?d00001 diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/figures/SerialSetting.png b/bsp/nuvoton/numaker-hmi-ma35d1/figures/SerialSetting.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab04331be0ebb2af5c8a16772e6c293a9f934a5 GIT binary patch literal 7691 zcmbtZXIN9+vZgCY`2<8dQUfAQiV_GNks=921O!xybOGt1iqfPPks1P_B$OaZM?vXD zDUwJLL^=fNZjmN;tLL2Oocn#}KKI=FBhOk{d#%|sd(S)X%!#mVuWIVOHTI!|& zHfwpW?tQwNq4wm0AK#s6%rN8OIl6dS);$ikw9Dq`C(s+SR?AnzcNkAdLs>*NMGk0` z;6pdVDw+WC$MfCiQU@z_DoPu344O<8x26Fb^^gf z=0o-`6JsFw=+MZ!RHkxpda9@Sd*d+ldT8h|wDQN^D*SB4_ReZ|^8{`1u@w(RIGfAy z(f6%(U#j!iD63M91)O8~Q2-{y{km-eM(Ar@5T~2p<9@cbU{9-b+aGJw$AZ;xnM`j3 z0PCQN-%hyw!o;d>C;|V+YZalwtQDS4dLXzyKaW+RsJo@CoAK2_Sd;ouV`qER|D{u$d{y% zv&ZvYf$qG*1n9$>w%4ZL(;VGEj$L@XBBpViXEk=ld-SyXaC%O4{8rLH)~iszwu|qW zwI>xjEJk9rhlBa&=zJwLELLX3y z!O&#yyz}DzqHA#5-doYx0d-pa++H7Bqq{B1Z$d=%(D%{`pk5hK*ZCX^*S}7Wa!;GMw2$UWyfcL|&TdIXnSJ$t>7by9-3Rcm^d4$U1tpy6R&dVASY`&>TWQ3k5_(4)|? z03{#~2uVucA4*YPw-o5M6QmnGyO+>)8I1yRufS@ZxCkc2SX3dk=`*(71fe%qSn*QN z-q>R^$4?VppjdEAgWXK;1);tC_pg6#pR;4XzZ`G>gV;;N;L}_kSfhgxw`L54*+$Qf z-M(o0_RC3<#b7K!5YwfUcE!HCrrm0)Q$gDnI4t-vI(FR2&sUT1a#fIxqc_@W_1nvr zFB>w>(H8#F|Jc*4BCv(2a}~S$DPnYV^x)v2 zv=lOW35%yI;~&+5-SjjE?5PUo^K&(XyckHh`_}+b=7af9Mxc4zX0R2LB=n{xR~0)! z_Nh6HEBNy^!!i8h)y>}m89nj~{aLY&uu%jP9JT>5OTvi6St@(5eq`n{h*M6i*=OL21H$qoq7t#%osT8dtyA6oDa}NCSMb0Uz7Ic`la^UlvGyW z?;m*Nudj#h74mrrL$izVi|M3lj!$CGO%U*);(lY3B#pDPk4|w|^?cS4SZ=C2m|aJZk0Umbcq=0w(6KkEtpBhfaqb&a-ST5GTJnW?b=>SmyQX* zYFfh)ZOZh8jO6U81vn+7qil*&vUw-i36u^9_(RIFQb}eR=Il$~5-9*R4#Eg{1F_?t zuEUOQM#Y(BDLMirObx~`P{9ky`=T>+^C1#V4@yD+>3nt_F-A#)7hmP{p7?z-oFpS4 z7Fe`zcUQZj&|MvdxUwec^jUJmy&)1ge?nZ{KF1Vx@BOv;he)!hIT4Z<@9A&7p{TU- z(&U=c*b}!e-z(xxknh#9O;1H0rYEfZ+7?CPpdnC7b7LLJ!7UR1c32WRW_L*Y&2Xe41<5%aS+_seG9#e|gOCGq4YkPIVSaGL-?6Vh}FHa}+py2WLV-o*Inuy$)>kdP)S+g(MR?tfV@=RoigA(?EW? zvFkj8xO~(%3V{A99ALE(cll#WNP?8D1L=?M?rxJYXyGw#2#lnRjXdNm&a|DpfvQ6x zFJ#$rTUb%6gqr$!_MFI|g2{guHvHPJ@LLQYu*_p6^LTtxMd^OR7tV(Uf+Z$KaMp}| zc}7--&cOEPdB}M9BXQGKH@+hs=xs8d!R3?PYN(E;&3`!6Y1?mqY)(C%diQ2Dc;c3_goLTR97 zYEFMr(cTb642Judz{kGFUUj)LWH2REA<8S*n-hrMHpaZjLf)5&p^`PX(oVX{C!BU( zGw044h~J-2e6*C8EB@$qQ_AT!Q>i#D0m;n_Ts7sCG2LW;80jyoM`DjNY`Yn%~v zXA%n55bwp1IuDREMQOLwp54 z+CSiF2uHT9x>0QeVBYSuCs*Zj#1-u)TrV+J@U<3wo`DqFzz+|z>%$iMd8ewa8)A^D z{`TXeR_`wA?Mq6CGT#WZoLV@q3FF$51eVKfOyAafY;)$cN^y_p(Lda7$vjZxr?I!< z-kYiiSV>0d7)7ijTR(9}nDuUfq_{)Sg)7Ezr0e6J0|$}s`X0q|P4`9NFY-irefzYB zKVKmAewxRPh*+7oQ2JOFB$sgPzCs@)n}(U$6${Af%96IHY}yV?-$;}`Ihe$_+Sz0L%dPTwHr=<1mKb2^;PH%bvlO*I#u7$;d_PHRi9 z{*=O1RaLdSy9%5}Zv;BMvNrQdORvUq@qGBrg{YRGv0uESTVc2zH*Y(Y>EwAQI zR$_A|<8V0!TgzLsZ&){4DnTXUxfm>XQRQ%0LQOf#^)MUHPUg3(@7OVjARj3*#}Wu5dd*NH;Avj!lPs)X9AiUE z?&dn@T12WLc(|H?8MIKGzf?A|EfjE8sJi!;uj)x82ig?BUG@^f-OBw`&## zYTn}wjgLy&N}BY_2JL3Ot{*5qm-KCxKDrFLSVH3@>id3^5@wiEgm|~-pfIM%)-0X1 zvt8{u;bX1_Z1I6`$MbIPNJ6S>Jt)WK=y^^5thBJ$@hg<&wdP{R@_c@xw{jv56+iFX zY2I1rU|Vvz{AxF0L_oqiInMO>B4SX48xDI$`M-n-8g&iCgW3~nInSpn3RqxjU0MF4 z%@qRWGd98tvVR(CAyN^)@%vW=85jvXkC~`UJ)hD>k%MVyZS!Pn2sy{UixD7Kg8UTm zHwyiW#5Ea4FbU=uC_Fp5{G{#WQuL|TLlNp$n2pFG5E^v{2SOk@j8=LU7$NG?Q?uau&``xZbQHBM?rsw%5Y$ecm> z2-;|nx;nXG%V}DNlk=pl4C&d-_&ZlbDtiol_2ghA`ZxXkajvwf=SUpM{3xUd#wlJp zxQ_Rv7*$4i6S0^{%e29vvNxjHIn{ncko# zCa+>p{42%0bLqDkWw>D#LMFv_=iOm2*w~pKqTp9)--ieh+fLS!<*JlGx;P)wW8g48L%qWA{n}OS?XSJbof2WkHQq;*Ev|V7p01CN??cODf z>SsH4m!kNqzx}2Tdon-^FBbfnPSfZTpKyCjGwHEL;mRT%5 zU(BlHjZBHw7A=zR9P1W*&PW03PEL@uXh-kFhkkh!g>=g{A6MRuY1h(If>k5WfkfED zOB$yw&Mx^p!0E#hQZ_jLcOXc1rC(A0X;~f`K=)r14Szv7Xn;WtN>8YT6L z`V}GN?s4!8JheLci_6}m5KKB~MFPp_+H?tm-ahBDU*tY4>wcwbD-deZvD5DGiQ7xO zj98^#wLOXw8|gC_b$M40e^O)TDFoP`g?<;2P0BotgIEgY*QQgJbvxE1E>4(*Puo^zxBD z(@Y~`pL2rn{?7LHtYw5y02@$bJFJOUn!?PZvg0e)r^tzzWcVeVOcCsaR7@L9z}=Fy_Oi1e>D*Ql~b%cuZjAQv6j61-!EC zS-m>j{2s#Q1t_Nr>5aJ`%nMaxL+)>gG8UpFL|0w867jsz-(M3P%&6&T&$syLR!5>&)BdUft=!1t3R=jW!dtxQ7|6q5DB?~G7{`x;DsmuluDFdwlM zD%0P?|5nhVf_HC>g%_Dv!W;REOHSdIGPn(4X3UKW!RP#9II<0dpjTj9MG-@i{k8zr z-tybRdp zPJCb@jX!!=<|w~h+^by{21efho)Ce;8p@Dp+JExe+a~}ks$B*TaiO1=-d^& zk@N#4;zkf?u5&l$zIZQXjXW?g&`Uy{SqnyaF%fw&>ASOSi;If#@)FaOcuuKb&HjEb z>m0AQ9#nEcpro~W;v~uF>XWg$q=3|h4ZSZz;V)ZSK21-n!eEUp>b}!zj#M!4 z^Viqhi)K(YLWH{n2LzjKUB1veTK(2?T7YS3&TBx)>|^XZqFwV`+8AW_XJOGJ4Tn)X zJc3nNBFUd%S{rQGGnRezPPkU)SD40kD{h#(LnO<2BkRFb=vSOC*U_qg&(9?;cd{1U zcB;(pY4dkb9tiAqQIau%)wy#$R(9g*%uV?Rg|Gveuecm~osrUe{DaZkBiF!I0C1#e z9(0<=K0JmTHJ%}{Vl~9y#6RoH*qF`_z1WM$MXi+w%n1y z@C!8SPS%#>YCZ%#f(dxd*g<-5@*f?pzw|7yD*20yqqZ6SpxHp0{{PT@`^)y;e4o7{_&!jtYF(xA^5W}pjsvhQHXRxgH1f^1?gD~IjfP}F z4^~nGU?%!)sjBs;M8Wy{W^w(OM`KNXkmxtkMWgf$4YYm1A*Lyc*XsMb;?gSwy4Gl; zi~0!84%1mN5iNG3r>(>7yegcmpHO{AbmUX?VxjQ!tA#~U-Em!2h@(JlG% zSXYJpox9Hhbfwok6~~#kOf)%XVUc@l`$K;Do2^?d|9>QjI(AoTGfsVmEQv;gCG z^uhSK_^4Qw#mUu}8}N7RBQ@W$mgQtWb*NH6d_h0C=Yii#)v5Nn3 zp6%;Y$5|rYO2I<>_WOm{M>~(BCedq#;yTfZ5U#fYtmNjjq~4(egZ1amVTNNNPD9R- zd0+mpuFsPgnH`Su@WD7t=?ODvLClVKk*S?-kZi6H6B?KmROq!ag6XXq?!?aP5;SiB z*IUXQuqzdNBoq~J+x5>MNB-T)+l7rh&*zmR{1lhCKZ-%WgQokZwC-AGm zybI7t6#k??(5Oblkj?`o-;;pUnG*pp=aYV_HVhXQPJnyH5!yM@+bXXi%q zCF^Kezfv@qM3Vt;i!FzmvP+>EYZ7Sm*}t8767gdXurqCIDpC#e&m+d04~40Oe%~}d zE{+_Qs@|aR@0(dqZxuZ9NT31*SPeCyFcbq6*Vz$e^bC}*D%3>n~9XA{|Y^~ z^zGX5MV@EqY3acsQsZKt2J8U~4sx8L&TFAwjwa64NQzmTvmJT5M`R$}1+dB2MRii) zM#Du;mC5FPGLb*bp$tk2{Ill|XSRkDd%s3{meQYhV|m9jd}n%d%~MY{sg@tK)Q+vD zDgkF@MVp0pj?Q?)nzNRjf~zSsd_UsdcBfA^II(gu8LU}vLz9Bi@ceH_x~ruc8I)GD=#JqUeUg z&<1VKQaNyO@kM)$kF8IROE=h8m3@j-*8y^<&9?5UM;BuKeAigZAm!E4!WMdHk;VXd zh#1j$VM3N}%XomU!GuoU`SC%&c-0Fx@e=$GOT`Z#z&DtF3VP7*Gt#PeNo*M>I}_2= zL$_>{$2*#@$zZVMVpv>)Nec*2$P<&udd{|<&avqg7P#PRh~Fc)bGy2N@BKVA&vB1h zUHxrL1Y_p=i`uxGon@5+38cmhlk$}hE5arp+Vb9SNw?p!3Cv4#Rq^HOp5O%ac2RHE z@$b(dR*bzwi$`W6#MI6(vbbnxUr_Qrb!Qsh_4Cw>bU}mR^Sd%jb)cSdbo+j8h@qwo zEw9ITU0O|Kk@EZpW7_AUaf%jehSsVo)a`HHi@DAi;;6h}M+-ngQRT_0uIf5!;OzpI zx>9;U_VkmK-t8D;gQ%}DbVb6M3!)S9?!&7w*@h(*kxFN##eN$W_|q^=(6A_RC+vUs z=(BYDqMoIUg>Dk38ID}kQ0Jrm4G^PRBDH@&WbT0hFm1s?LQ{#CR6T#Ju`8zFZNeokNzWi`MLQsp`Gu?X0)o(apS=$vfGY7 d_E(R|Z6WBprD|nq@?-}^?zvoL;D}P|Iq&*=olF27#JCunAzCa*#BP~ z92`6x9K2jy+&tV|d_0_j0(?S(fR4h^zpwCL_Bo0kiiP&X6yBA%x-p zMj0=Dc@rsx9}4o{6~2F0RQmBl_5Y`)uBNV~qpM?Nq;FwjYHn^}WnpDyW&J;F?Cfpr z9UL8hy12Ug_<4tV1pjr3$TR<4ul#pJG<}mRZI?D~k=U;r%efWTuAJC5kJ2fd*d>kB zF`Y~|nM66BP%ef<@)wn0Fe|4ID~l@)l^qF*EfJ9u5s}+hESJw1W_WmNEM&a0w6r=j z6jqd^Zj6*+!ua75gi#WB337zV-$@gdX%jUVGxg{Tt;nmLXgh-i2BIX#W99lIRT@JK z@?6}qegf%FW8o&dJRx$jhzFE33+HY%T2T zDH#~A=$fl7+Gt7KZVf)DciF2nJ8IFs996zsvU}JJzTfz}w*p?A>6@GwpP8ANUs;)3 zUte3_Se@No?m6Dggx>Z)-4C8Wj~u_P zY`vVXJl@RRJq}*JwB16R&!F`OZ{?d$#fw+PD@Vl}yR{cP?QdJH(2eHTmAc!R#*@M3 zotDOp8t{5e(RzFST1WEuKt%hPf76mn^)50Lrtu@8Y*lu5DDqc&{h_Ly-f#>G`3%|W z-2NzB4%@Y%>b$|*T~F4AYl|kcL_<-C z%z+d861o%QW~t{Zje8@B6dKBxYprKX4MrQltBpT* zp_CSO`&DKWrmCktY89KELGYi5zc*EF_eOkWFdWlnTrca5-p_1kwA>s>;jr5nYpy+< z%$A5ER$QSi(T$7Zi=qbCEY4J!je-DFC zVCm?1e}}2LTlb`N7mpU}3&NSUaW7d!^_@qRH4cQ;wB82nuRnYU2y|;A3qH_OI>1af`UJ1 zF5BnjvL&jb^zlpRv=Fj>*t7e`op@s)-GLk?IbVD*vhc4zz)Jfi>Hs5bEF~H~$FH%` zJAKw>^zcO+&o&4f1)Q09$(9;T^&g=yKzK?s(p$lFm3E0J0w_kpyG3@}`% zjHRjX*M3@<+49k=kz>l(CgQZp^c*NHitvYiq>Ez1ezndy%>7g%d8sN{BAQf@0%;@k zd{t|wjEQuTerO*i>w@E;FB*aSl@goP6vsf$e4Ms=^s7PMp2m~YM`8Cj-)G9>j8M?7 zD__wzuR_&wVf=3Ys`}a0oH|Z~axJkG9+OnTwL)emO(lNrEI6J?xpe~*k2#%4gK z9^;y5bKdjl1W!!~5-7^ki~P05xRD~sy~=w&aVDTyz}na^cy0JzT`E_mXSI=k_X;vzm(Q1v5UZTr}8whc9a(znEA;Ey5IWd`yB|F1eT<>Pgi6yHVS=hRI-2zi94KyhWAQ>rP{IC~+lTJM z9Bz!d`IueD)y0)>hn*oeJVDctK*!>BKAN??L&F@FIQr{e4fN7B`x$yw?(Tc0MDj^i zmTBia=p)t&T<_3ONz9+m_-e7YW+ufRWfVAdGtY~ej$@j4nZfT+{8&k0`x3o zko4T96$>dTIOR0p*a1#@LtpQ^$ZD1Ea!dhcUqctT{c^JrKh3rg1Sn=BJPPIYELo2 zeRe{TD%G9bRsNG*Li%xLh|N)Kv1O&cqF=kr@S&8j;K1~&7+N_kP*=SJ|Gp|hvD_4A z^lJfTFLqq}slm<2(unSTP0Dz=MdAwaqxF4lHX7JkCS77eGrX=?5p1h9xp}HkN6*pKjpuuorZ@1hwDI{YwNsAN?Ep9zgIIF`CGgnvQ9=ApjtqB9KVjBd#?T0m6C zpI>61mS>bFY7=nA54R1UFwd7%6?vJeL_R%}@h-6ae)s$0{K~5-#>`b1JZKwA$fqf1 z=<>H$|1>f~SE(Ix>x>v9YkDH{qn^aW|gAT^zlPBQ?;Ewi7)XK^aJn<>Xz>r z&O9G?M0FtQmin32*vfz;EwP~Ew?An!r`dHvtik9oi>=EktezF%aeLTCUjk=l?tN4y zD>IRl)s)No4uJpq+Q(4BZ0tKOS+JOzozFr8^KHRrgI|&~1iLOBS9#FJFUN9P&%4A= zTwt+@pF5GuUC8ejzbsT701;1HNy^jo1Ee<~3G;CXs9B`J-_%hrx5wQuB5yU?X!Z%G zb0(?3J4(qxU|&%4$7gOaPC|4gbF*)!yfxE#v96gnZO7W5edk8A&8dI1c0CKVPQ}E! zy*FeuWuf00!o2Q(B@i5ME4;3`db59%UmezQ%Z#%B@rHUnX%UOnCp9bH1jIP4Vb4hp| z&OWT#NWRn=Q4158plAQIOn;xZS(8+^uo7wxtPj`09iE#)kk=T5F34V4o+TL(2ZkQZSS|+3FT21dHbr9JNVGqaChg zXw6R#jc`A-X=9-pvyUle0z=lBUQVLc6p3A~n&I}I*1_L!BPkn$%P>$PXzi#igX6s- zs&hlato3x7JkPa!n`i?#7eXF^z%O4yQ)EMXWh04k$Td?!p zy5E9R2y)US7NWFx0#qqJnBu4JP> zXJg>!VDjgD;YTUTX3^@#>{CV^_=!3)g?faSOU|E5shdmflS`YHOW%^qxRT5KoJ)p} z!p@(^shh{`lgFEu$KR4CxRNLQoF|H(FV3GYshcnDlP{Z=FW-{?eI;M%IbRvSK$X8h zUAI8fr$B=q1;_Ri9zSYtRSw}v4i0c{{Ys(ZbKy_?A}kanH{Bu+ zpCYfcBA=Ebzm=kZ=b|9|;t>8~Xqav>(5E;etvIr!IC`Zx_PIC?za*Z&Btf?%$)_YG ztt43&DWmjbTGhvN7)jCFkNJ@Wg+8UlX{DttrR6K770;zr_+>TxWp%ctC~PoIX=N=f zWo;{E9nWQ5_~kwP<$b#413u+LY2_m=2>n0b>GXXIij+-R?B!+>(uq?HGS)~)9ZBwV1DRjNkx?zwbq*oG??o(So$`= zt=8Y;)wl82Tfa2?BxrOIXml=XxWQ{MQE2pOZS-4h3@EGdP{^`xEpvQn1o}2bq&G#L zf`bXNyjq*$2%6&sniE#bY|9Ws>}nHRn=@9MK~W7cpR#_xH0SHJ6#BLZt=8{HHed5K zwdgh#6SUR{wAK++Co^Q_>9w}BwzjRdEp1Z3a8qb6w`)H=1uaLFtwwcR z3v}L&)}2H(FP5P;>vg`ac0$W)=LoXS%TO-_V6I*|ku$nb&gw3Q+s2BkZM`4;dcTbIiW2s1`u0Lvd&K?vWMA8a8GGf{`jpyQCBJt`zxJu?_ZPJG?b-F~ zw)LmCqAA|>A5-?Lj`o}D4{R~ieKZ-c{rBRh{l;tRrfUuMf`e{;4UVq^C+dSfZG+iS zgJ+UmQ1nACKf$4}j5^P=K|sb(WO-fq+29Bad=%kud|PeI>%d>X;gq$S#Mgn}8N;C0 zVWQSyBh-<6{gH;#!PB|n!nToe`>NbEbui&*%^0{6budnFv?*hBT6gp`f3)LubYx_- z#Ba1qe{2A?syIVwux)G%wPBcWpl@w#rhK%gd~DWlyjg#IDtdg4aCBvDe5-9_MgLPN z;lx44@TT9yiQn+9{>16)1R!JLQgAYKZDRWSph7DL8|9E6sD{&n8|OOZsi{_RV#;Njr6 zrTFuj7@_5)^Xgyz%W30XPtD69w3^hnXt@ zV4>9p18|A|Y6}{;zJ0Z0yuA5swa34_U1)7UsJz>MZ3L|f(7ra|P(J*&HVHLYn-N;C zHdtS3FPqC;A0%2|6Ixq+Tkknv-#K61HrQxY+&J=IJ#61-0B=B;R?mqxE73M@+gEP< zH%lEhpB+}7);IIUH({X5??PK3rY)q3Wkk?ca?BR0@bV|W0;dYebHg3QY zPRBM7yiLr!L`1w3h_*x7u}BfH^P(X9|jQ5_!A!y zp&f;Rrb7dca2<{!m8O4f9DNx-irbj_Eqsj1bet4Bl?XaUj5*FAo=S%v!<--IPE6() zo;-a&DOQ>+>NvS6KdFFDfQe5}QBUgvCTast5A07{&?lNVPS?jyyJE*Xh0hil&jy&s z`$1>p(Pv{FW24Zs!Lzd&!?9_@^RDmbOOVmUj`KOc^$pPBI1z*ee7?s#x*h=8K!uzz zAMI{H0w*Asu}2re7Xapqd&top=prii;#KMR1$yxZasgL)3~O|mtaOR|`Q$_AWoE@C zy3+|7$yFZu71rd**TAb1$18l6Q@qWq%84t|-=`!Z(Cd2UYwC+rs;ukQ*lWfgXAJMx z-H>bc$}={jn?a=;-p}Veoj2nZH^NTmLL|4d=(m!S=MsUp%Z|75zekTZZuRUT%9Z^; zMD8>g?=+pJbw^$zjtJr)+2eyLVa-i z(d!WSz+wO3bJ63y`G9?X7gRYEDDp@>_5d{M0c1TAM?Xeyc1OKG61Qj3F+CL!J|&6F zgk(LrML%U!cE!FweL8!}{XCms^lU8hP%JW-)A)Ah@@3$?51jSdXS6Z~%^Dhge_dmEovG~WH+plqcwOooobG%Z zR(RVmYFj6P4t#>{{hnJ4ga%i>om@;FZ$iU=zh1ug?25eC+d=P1TJN&nYogv?omyb3 z6_-Ur5YgyE*+jR+foMd+VYn(gl9At-4Es`4cBNy9gaQ!oRQF`#sT4tysjB<(NlXSE zYqXbJ-&438Hu_T44wXPc{!j#b^&{mJcB_f+vg*gGg^HQN0DO%T^-{$cVk&KoQ_Tv4 z_5efzO~$1%?T^$%>6+)d4G!xafYCa}g(mm&jsA44i;XJR@!Wj^?Mvex02&GKD4E)H zAcjZ;NT^e?lNUr~G?1ZlV>y9JM*uw|)V;NyDOe2u+&R{Y{;uwSWn*c@O| z@erGD_J2nrCcJjE=!qeb0lhL`1-B=PgcBP)o7W;184ZFAe5X&4GMzq<7`}Ri_YG&s zWEl#$hMlZ;hQF`+`90sA|FwL7g9bp~;3pqgL}5RaGl;-_mSh#Hgi)^&`#?fCB8p6t zUnLG{VVDp{EmglcJmb>Ay#BG0v0 zY2rYH>t@1G${N{CKTdWzDgy!+Ihw39R5{wBd>39+j&gPdCW5~%3M`#8lxkq+ zQAv(*aG!duB2Om&jUwOSEA*El|3%+yA@9vz?T>`BTMlJ0krh{EiO*nUWl0>1xmt#F zJ5E(Oxi%M71tz9jRmBT+H?<#|W4CH5(`Rn#YTc-J>Ke6-?iyM--|sYZ{@S~1>V-z% zX&ShfyK5O)jNNIOXq~xho5`TwYg_O!dgxd&e81PRA+q<-wfho%uj>F`?xE-OFnX`& zynE`Q?>hhKLEn9l!PCIg*RQVK^ANF7)#n1tV&L~6RACVCj;Lf5^r2(iDC9Fx(Krmp zaNHP3Lab;KL9;Pt63No>-87oVW6U&GMEJW|oDBAuS^SR$1@ibNuv_AKA5wkJ zL^=XqV(K4=cOkt+xPI3(#P6@+<62qUx2rNK{*Rvn{;k{nMv|@Pn?syH=)?NvJ7ix3 zc7`Dc(GLd}`sJtso>|!d#cit@AGh0CEG}dxZ40s8LJZB3A(W^M`-7M@_;akXE;;9R zt$a$4MNS-GM0fjB%)U4tIs=gF^&6V=Q5gY5S&RR68|;JIrvv*Zq6UBGi-CnCRR#So zMZs@hbF52glvLDJ>voDtQ~DK6{^fovJ2-3r9=2G}Sh1^6w-_qc|;7u{ZC1n5g*%wo! zQ~;3MWuqlxNsyuBhAGuaVAdZ2>C>jM@DlQT{f=bN04jf!tn;V<7;-A|;JAu}IAZq_ zay@*tRMUvUS3j&pM}E~5h+910-Eo0BzPjUhLa_t>iHeoEdO>_?ks{TsT#hbFx{|w! zYQ1d-C~cm}B(dyL?nKMEPrZ7krqlwBQfHdKpsFHK(9r!!wvxU=sf zC(y+XPO57@KC^K))16`c1Yw8{B4Ab@2ZIc=s!RJl_BU;-t^iBN* z7><7!($<-in>*Z@>tYGkk?4|J(rh5^)t?N`Yi`Te_rG~|r)QtV@~|&(U6_reZ^Zse zZimyo@cj~M_yn|XxoiLIf2EM}2=QcnzPkv75ExgrBzN5&Uj(aJ8Y6bnbfX!fhmvK0 zKK$TihH1D2e8@1lGEV7rEV&F{-ZA-7N!3SHks7Ab212WR_j`phiQ8RX zKJ%oOE^QvDb5|x7Vyp9)a-klA40b-x`Ek)=UU7eC=tyKAeU!FDh<9K8717=zykv1a zwyHSCAerI{Mw}f7XQS5XeRQGimu&}6;!Q{sn)ZKfp8 z$=3Cq3ZAx$w{yQr-_11$Ps@Aec~Gm~#trqShA$o2p)73-h=ZQJM8xJcKlIx%8z28L zfSd2I{6#gv6RcxF8!=@)>+$eTVm9( zZ&GyB&Rgg|LV`E>6DQcRs(}{}y>U%zAyU zeTG6OMV?nhc27IiUqs+hMWF;;+YF*=0-_(ji^A!PZrF9H_=0|q_gtBne5)AAm>B+= z*z9Sy?28x$syH!W&oqO$jDR@JcX4uk@hQ6=DPO2KL$o+`M$bf zkNAr?2dV@!Vecq|gqVN?&vyxSeTfmfUJ+jjfoKWtjNYL#3E@@=kueGWHHpE~Ucna$ z2~3el3%8GSuvlDw^wKgJ~G*Ce}7`?y~u)fkbP zSdlgMVj#0k>#kDq1jtOrQWn`#7ZFk=O_918{mVoBNecaX`BH`n$wv9@I_3R(gve$H z1IB~{bH)Q^by6nk(u}{P)Aagn?fdQeq(g9}9rgwo_4-GU2X}9z9qI;L+|rcy`cg>; z+|&p8O=MIF``a0$xCEs9GGu(qW!hQ?IiM8i6c|InltUq$L!pvGVd_Hw^C6(yP3`wViBZ~{cjTp@7#rR4J`vo}|1130^aYR;hBwt-VpL3+pZKNn{q&Q)uB!8r| zZltVlq0urW~!|9Icfcty3SZ*B`BL8*L05ZAutz&L3^58*S|y zZJQfy-&3gA3+hDpj@|`>egsQ$8B78bLW%)L)+I+?JUkdSHk2?noIf^FH#XWgHa0gl zzBe{;`+Z0dHXAE=ns6j1AxuMb96G12C`UWK;5NRHc_uWahyMKQa5qhH*q#MalSVJxt+K` zn7qXLk!!Dru?2JUs(_07z3XiB-fi+BZ1OQ-@+p7vxo+~MZ}N3+@@;PtYCn?mJ$MR1 z9+OlVE)!v1a!MmE49-Fsa|#Y)Dg?4rJ2j_2g-$h% z?mvahG>xS({mo(;+kF}bpn@p`z$=)>ub(F9pC+82Cfc7SzMCd_o5uY%Lq;`2&NV|J zHAAT}LuD~T?LI>Tn4yhz~)3pEuZ_H@wsM;V=dJEjT-WW;$WUOlrYgW5L2=!P0%f3b0_E zxL{MTU|YWc_bt?Ze!)RVlZh1WBNZH$zY2Dc8m~~WtB{sf9KhW|OD6*0>5k}@xcGG| z1aB+EJ9AMH7s&*=wHR=Yu+pdHt+D7~q2-0P6e_gj)2^Eq3I{AjBrg3DS~93w zit1mAo?nXDUy8k3`i;08_f6+d!BV``BE?h~1*=Yklun|-ax!2!C2={mU^%URIlX^5 zV_qkn3)Z_p4HI_??rlDYY9*IzB~NN4Ut^`fVx`c1r3kQ6oT$rB6e$6hpBSMSSQi~uVt;O}_rNs5+g7ua9_0|6MwfXh+{q>Ez^-aW$c&gA) zBEw~&5VoJoyY4y>Oj@`v;|RsMi>CT*>Vjia{^yvLB!_6^0KKr>e0B^S_?7D-nb zNpWlADAVx7KewsC;lxJlc1h1>WI+XVOe?3a2(n%fklp%j-U69)R&KR3v^O>wo2Y5|KB%sZ?p z&|p?$Qwm6!^-myu#g3&iKqduIF=B^Y$&|_izzl@7A>Cz90@8Yz(qiv&S?+Rs?D7D2 zd6RaTAprh{U4emJ!G&F+id_TIAjYO$c2*d*tzB{MJqhVO$qF-``(Q=nP!(JNOHizE>p1qrJuJ}tcLg1JuN z{txth1xIrx<$adRU{zuOd)2>nX&<`I?#5RrGrAatr4=VxIhO0OKVHbz3_!y17#S*B>?{cfE3p}V&NzTXe|xZ z!tH|7EZkEZ2vHk=Q-p!Xg@I>%+)pUn`$KHQXnd?BdrZN6OkN0^z`T>Rv1hb^fFBp4 z6c>^rybt6)$&)_G*E}h(JSh}DIC4KJPC6+mJSlBBDH}K`UpN6D*p^g`S2CXf&`&9d zPk{q_?8ST5=+>Sw04*;>IazC85KvPY;2(gX@e|4B@sQcjuE7J~Eq%ZVIq9}EGh#jK zl|Jj!JnOf#@7+K|YYJg!wO7K0M`HyzF@vM z5I(t;wy5K_q_%SL64tAe(qs7@%$gm{O6q#QfnXbfq@f)qReb6PLQ<5yxdS?R5#4ag zz}RiMBFMUO$lUPb+=|iMiu2q`$lOZ)xWTfz?F+D1!*y2M3Xyq0R8o!*D|C}@yoK$$ z{TO&Vt%VoyiUCQ&`D*WC$`QE1J-nQ}HZt&iI@!rAeg8t#&>BGZM zoCjwbPsZOn41tzRo`&u?W|HqatT?V(q^@kxY*;poTg76awe?LvEYPnI$d2L0`ujp~ z@y71*hO@}i_wXKI#)uTTUIlhsR!#~q@YUI;6c}p%9~J`M<36Z zK^j-%xYyyL*OA88(LulAz%w;kXDAblHySTMbqLOw77?BoF#Z8Jj^jVW^A^Pnzi{|U z>h(5O^tMvzKji6=JNUMK__p!zw)p|Ng#+EDf$s1?cV(b^S^-i&Ouc@4vM0l_W&5%Z zda@J0cC)+&Ica%qzF7Z;9vcNzHojev1kNo^&3$;A77n@n;D0OPKWF%^1_M-M4T6n$ zf2s_Oq<()ZdaK{OOZ|YX3JU0>wZ0_n2@&CzlRLU3>x;moQ7yN=A|Hsx=W#hZx}q40 zBbSM1w7I4nNubxNu|K}18vB=z&Xn8SP*31idR+VMpU_Ojq?dkSvaS2xr&W_QV0$vB z!KlSobbw%aN54?6+vsu*J-M@6U>EZWX0p>{nE&&MpwQv;o@uSgs|7ilOO|08MG7kOS2CluWwVgR0P6InQsk2Z*qERvV}7gd@Uc_iJ430@Ra%OiO- z+Xyd34A+VmMJ$x>q=_Pm?DCN!P7FmS@3#cLH)XsWeKX}>MgAws1QmHcszeQ4Z>l66 z+h(d{1D_|V6q86k>Quo}FX}X#ByH++2i<|-bcY^1noRco;nLaC)xjDdRo1D*aDETEtr7iSj z;Ff3l^6C+O2Cy121~RGV8muhohb~(BD%%AgtJ2;U?egkj`c}r;asC&^y6FX5QBu#T zZKMXrDQ6i{q$XU(CVF`S>Y9-x0p^zD(pKiy^OhIp*145GOzn!75?}?$zxtRVPjHhm4HQg2@}(fXBQ({SQ3!nka!f?K z%FY@>Z;+#$hTvp{0i4HI|IT1$n$7C_3YpDY{sk+|sR}5X%?nZ+v#-0a`txjfpMoi1 z=;GKz8+bjC%-YO=c+WAHhDR&O^=BB!7)u9T z4GhfCvqGuE{lgSbP+(n!ZT_svgni%Vijse8(G_Wd5Vszgo++rH*68VxrxOPFBV^xI zWsMV8_^w&ePr)p7Zc8f<;kg39>_>)bM%yb03xiaE0YZ1fXjAR#`pF!k)4sHY?v@{H z=$S&CTXV>vsz2%SPTEhf_J>cBEXKj%6AA2x?E1G72~1DXL5j7*`q{f(2U&5lg*mMj zo@n?0n6q4qA?pE(Oh}N%UkZW+>!<|_HW|i@X(D+~ekiy)CTuR3jDfcyunPLy#z0|} zT(7ZTqDBSaJi3GZfmZG<5p0K?K}IVlOPHgboJc?WqZ6UTtwecWF`mbL!@Fg zSF0b9*7T9eF%&DWMg{p>b6w5HT6@hf(!Y;`!_|1KwrZcY5R%=x#56BcO#C)QMygQ6 z60ZJomzo`u%5hm@tEK3;9`J_SD4CYdM(=Ru@Rl9KO0OLKE^MO_zA2gXUjcjNV*qG@ z;oREK@Gi@d#F(Eo+V!y&leCMxlwW##i6RD@gJKuf|0`bQ$H5HO#@ss&8q5`ndNIY zxoo{t7_U>VVw0FAff4&?r4O^3lrerpghn5oOT`WjJpSPMIk?%_YJ+={Y}UC7VVuMC zN8%gX4un{I&ikrTa(11UOP8$KfEswQJY|sb_573cjkoK@PAK%P^3PtqVB|JK$MyaO z>fNWt6^#TH6eQL#3dZe^dC9s9KJd2<8piM>yeiqZ$5o==x4-;t>Z2Yw1iRFi8NQYF zrU|e`n=$U<%{C2)x?Dv$l|jr-E#GHyZ5}m*vZwSi9d| zlphM+G*1RVIkMrIj>NvUOaX;CbH9R*q&QlpV*@zzDVUDs)LLeeIyehCz{iTNEwdmf zXR!p+iOS!Wxk6#CQZ?|2Ms3S{MF3a18PloGY|BCew1ca{75wiMaLZx`l&dO~>CEJ7 z>(YQQcg>b?rcyr)3rl zaj$J%hXnAn?J`|>&$e#dckp!FfG_-SS~sCko-TOi%iynVTSy|jJzpy>0UT}H=z+X_ z7wh{GYHd5HBHY+*;Hwzdwq4?P-l0%`7#^#PQL4|)**}!*6Z6{knFIO8{%t{|E_&~6 zf_TRt##~G;1P_JZ`KCgdZ*yc;59}e$iGP%Cxfs?L6^;1k@|f>R)Y?xHx%p?E9o@M^ zG8YXt`ImZ`@2mf|pXm+oFV;KWvj!S0(*J;>u2EIrH_x_1JURs$r$Gl5jqMQs!MoLD z^2hGcoo`+uf;(R;ANzN8FRTv)cK^m+(K7%pLwWr6I4YmUT{~`KJYG}DI-fdyy^$=u zMAJz`0T@T#NUX}f@bpek1;!gU4V^*|*GgZ`(2cQN99Pl-Qa@%?)6@LJYgEVT81}kU zlr&QK(~As0y}qu!gsk>0JEH^L$MTnAQXo$08Ne)zWK{eoa57f~iqu7lBRtxFI?0G| zIhqAk6ApY(VB5c{e23n5y3oyu)463$&cP*q%+4G)dQVJ+%hiFmU4;kgAb8-tXX?B> zMN@xYhH(t#Ko(0B%BFTB&C$rtfd1KnWRjv#>s~0PnqUEw--uJT#c-9EQSHT25dYHagc1y-Z`G=>Ql!L8IGg9Zbhiraq%2MB@8zpfs*6 z1Q#9nB)C_uARI{vq)4)x`AxV;9R!yg4qW3T_igBU$Tx0LWS^~s?k=W$GJI|r9B5W* zcMksZb{^~wDN1hg7t@T7uy_$+(B5{ zu((a6X9hVbciD-Ea9Dmi7)m;%SY)Ypq>Lk}j3+uw_sd^QbugK?)A`7-LQ=8f#1T0~ z5#vIz5WIRutEJRv$<*E!Tkxm?^`0*-jR0n0)QI>H{y!aF)5(mR4PsTk^}@N*%= z!p35{-ETWZK~Cx6J|elMGh%PqWH;5}nAqUZO#PMsi{rJ+V@kp1C(gN- zFX+>a=m<}#Nx{dym-KC4Whaj$mJDel=S6N`40}sWbs4@Pi`tw5iGJ&;o`U$^2u3ND zIxGigC@0B;O4Sg${JIPWy8-v?Ai*?7qQ-Aw=s~I#N&4`#59Qi_n9nn?wJ<(0QU~p; zau+CB>X=dQBb^wL#0PWtP`x@AsPB-NhFBs^7+D$?sB9F7f-Je6aqDyS|^lR%m;6H<_3j@no!F}x-E*>0-RSW zwxtjbb6Bv6BZ6R2Tp<{}FCKdx~ z>U>rb3x_V`GM>POE|`)U!vcW8q>skvkzxaU#Q;Y!0FV;MYz?n(4JGY3}jBsCQ_evs3T#A0|6u>RaI$Pr?AYgS2MW9)?B&p|tZNn+Tn z6u~Y!4BWIK)U?2)Vhp5^xQ*h^^wz&@y9elx=#hHuF|oRQxTAb{!hSHad&t9n0MjP*ivxULkRdT$eB^RGJsloG`QM#|(cOl_)p%3Vy75xc*XERy9QM3pqQVj77#A<(5%5>?3r9Z9M!N%30;^s3@@%K zDjb*@I%6-+(at(Uf}Y^YlfYZJaj>ewF#o=FpKeylu^5H&GGM1%hPgOY-g@-F828e8 zK$CH>v>YR?9Am~F?j@U^8wQ&Y7Arpp8@UQr?eZO3EDx=WQ(}aJYF#qL7ynwZ2H~Ag zpI9(YiDvu}#ShEM2LummrFwi6xb)ZA>6EtlcL%5ab>&umGxYv{Z^ z3X|VhEBP;Sl6Kem*(gwgH?Pm3Ts!dSTjeOdY0RbRX`9!EshHs>I}?tAJ&ssB)mVon z*XZWBQK#BzR9`|_2wzw+(({fcASyX|CxsPX^O$#Mt}yLRZ}^$<${Z-3!5r4k-;B!0 zd@3JMTy}lLG>9Rvj=Kjl1=qR-iS<{f_cmucCU{G57)#=KLpcu~7lNj2^q*ZGVNc#o z*q#Plo-pmvK`a5bc-J=84fg4Ei? zKbtLEfX*p+VEFN!6E*Dcd|=UymW5`|OEyl(4#h2~ZNaKng}N2OwKR`pq=`fj1nN@U znF0$WcFJTnvKz9tneBF4`bPXpQM=oc6OxUJvVt84xu`2#5h_BvkRl&3=CzOy+-@2x zwpfE^(yg3dt;~={ZZWj-#CPo^?G9vmb0|D-rF(5<|8^_BlT^6SUj>v2rPqCd=OXg4 zrOPi9rpTtCxf3PU*tWcD$gTVKvMoHyuIB`LT7h0OS?TmJGbTO-^r&%yklL1k)ueR{XvD)sGUU5{W7os)+GzF!3KHW|B1sx^o;6y;(DhS3{*Z3zY9_M+ivAsmn8)dQ%N&h}vJr}sx zx#%@|?Vy!EyDX!m5#zyh!wbS-#KEE+x-TYea1ZYMZXri9qs94t$wY4*OWa_hb%|)! z4TD4SMb(2z`Y6iu^7p5w&<*P-TWix%>u_$E#NH$1Mm*Fb3(=xwthyT;C-^geCcDN4 z1~0vRTRf^+UC|aVGI>hSh4)@gWwJl{mpWq;3|K)N{%ZriT8qo9;CmuabDE;qr&T=L zbW_0#Ryzr)4Bu5f+y9TfyNYczTHD4PW`~)XGZSWJW@ct)W@er+a~x)l!{9K}gc&9o z4tbjW?Y8<4s;Y-o)pcO|=#^!?(qk{*>%I)wuAG1e0;Nm&_MVhUdVY1Kf()T2E4C8o zwi3UH1gpLBE0%~eVIT7r1V3HuR{in6107ht!8Hg`LZlIdDkB8jD1=Vx`}2IPdyWN5 zIbIqhgxb}Fy7UIRmh#&>OeUC1I%^Gk%!GR5271$ka&3h2I9^XeUhC_H`g#TiMuO@J zU%!+K^{9~#9tsU#3iZvuqPhm1v<1~e4-R7pg9zR(o(4vom@bju>No~LV!{)0!8=sK z?_+|e0>O0_gA;DT(|*Cr8iSLUk7HIvlR1O4rNVQygL5sy^F4#}Bf{X1Ao!B-!q(uz z;oGnZ>Ebux$$-J7f5OX%L(3Q+!bG;?hPKm0cA^YnibQs6hjvRL@6hJrXy#D+(?k19A_rST2ZthGKLX6( zL=OK99WI5S*^ll06FL5fB2$Q-oQe?8ik|WfpNfede-=Gc6Ft`(KGPGu`0;*jCwlpj z4h|E&iW|QAhyZ^XzAhEL`N;XUh~Ab$c1J>YTgdK~LiaF2Zx2H+r$07xA{e(tAO1lO z-9#TT#LiH~o^VD!HbV~?M!tW9XvM^S%8mT|NXqJs{4x_eToS#TAO77Ea&Hy(>lSiC zBJnNi-#4z2XECvt+L6nakzWI1uhS!MOJeU^BkzY|kixJ(Eh2xuiS34oiJN2cr<+Se zA!5;M_oiD&#bHoc#!Dp5i_=tCO0V}qGOXm%kXS--1v0H?!=C~v@D&;cpU0Smpv})DLWpe~`9CaG?+H5!ayBsxJVz=nm$2SWPPf z!T^OC?l$wzPo|571|7UkqMvoiCTl<WyUe z|EgL&p8j&k@8I*Q&?a{V+p+->7k$MvP!rGG-~IdrmTu=-O!}dhL7d;ypc({)W9a_5 z2O^+84!4wrI%aIkWIZ-KL$W-9qoJ%Jb9U3Q#9MWdq%lQQEqOEiIywfZ_~#oSO^K?9 z##s&nJz+iqL4(nxqxilOAnija!xf5Nk(q36> z;dzdGPNeeto<}LCF44pc^)zm#JWA6D@&w0_J*pTFZz7 zbA#3H*N;UVqYxefbQ_4s@~kx%^rP74BZ=iPYX=+OWkw8mb-f7u11nYC3_y1e%<=J~ zs&w*uj-f@2XXmEhaf;s8J5e7TS=FZnKaS1EwWo4;XmVV0|C?xb34X~=OmweHo_k$1 z&jZdQC_G-jk;t@3sAI_j@G2;EtqeXRVX2AGI^#1KAB#Wz?J^??F~9Z117ogh!z&CN zcS=n_KYtJ#fo^zJ4tx5?G$ccHm$_16L;lz_KvdltwH|?e2R4JYza!2oMExcsY4Bx> zA_-UkVuAO3MweyaHM-N??8aH?s`A#g6O|=`lkYN^EU=BX4k1$e60yO4>)WMj{4`0l zl;psjlWOc)3nBl^ycm`Q-oS2bx!b+-dUXySpnbaQP+J<8eO+od5ZhDh+VR!(O%x#D zbuIeUAT-KNdrWp2FGcaGgS#vgbN1*O-{ko`-_5jo4kynzaJGD8pNi53FJL84%ysC@ zvzXv+GqvYSpYx+$t;u`pt1!{spOGFyatf&$cdnccRb^UYHcSC za@q07mL37{ruyX84(1ZzUC9%i|o8kdVI_1uoq`vj+)kQPZX zJ+V*`GK$-pC&T8-0lk@ISrLm*Ja+s^K;`Gce}bkwfewi}-ZUxAy)pu}ZAo~>G@f9> zs-^wZWPh|pGH4=s3E$cjH}0z76Mi{?O%ClSR#kGn?0jQTYua=KEe=_}f{N=ZcZ~2E zLwT0GjAKSd5w0oWub*;S&6zn(-p1!8Qqby)n%R{TmP{t~1xhvcU!X`;K6?=~lX1#!r4lFLMa9bVJl+!jpl{eB!yLQ|H3&bSp-&f1J{y;E9I zO$CCDTtwGX9H^Jaz3p2MgNyMpc|dD4B8?g9((Sj@TcB}umzcZK-vK?xOE zk)X-AdXzft^DTO(^7zE#co(eMpPeGB{dG`}Gh7#B|5K#E!@!>$h#~bCn!=Fo8*ho> zMms)UgQg902*+bu-6BE#Z}>Bly*a8}31Ay6bn6uO7qemZiTMT0WB6fW`Uo=|;7&2q zLLdmUn>i2kIe&BdVXEVVX)_cjXfKabxto(e-Wi%0%fW)wO0~e3CEPrUc)b;Y?6w!+ zn;x#U{%41RFysZ18FMLBFIz*&8T{g?zd*Hlj`43 z1Uu^w?J^3;7ct316snXR`AcX3o-b5`Chs42#GH=slH?F!?~UG$v2M%B^MYpA&EUDP zy&pkfO7`Mv4*r>2*x_*$aU%{0E2I}*MtLmv6H*OJ^l?8Yvo7le{-oab;Pn)Fv)^Oi3figpTSG%X8t3rE8hu%r87Dq{mX%* zgNMRpYn>pE9ap!|Mh+9ASIl>~y@A2n;||I(>_bG&KX7!7NAbS=5|p8g2{gaYB7S8= zNZw+bl{>E!y#1{gy6VYj33O}RmNIAR^IS;_4PaYJB=a6LEKoY9Fc5jzHghxP3zxb~ ztoxpEsIXVlOVxPO86uSa{&MsO)Tl<)-V$XtS!4HljTRtD2#i2;|9p)6JlemhK!H2B z;}93%RbYcyn6!*a`?SON?|DVcNuTrLyxSI*42J3lWJ9UCXwEc|1e}m)PLlt3Ajeb4 z_}j07#_CjMvdqSRiAsH7^nV47n1t!&dFXpr@_V?J2z5)y4X(%qqc{!aupNtZ&5FCL z%|ReE?Ss#lYUz&YUR4Y6sA$xQlfD_K696&g<~RVxFaRB zBBi(^=`1rt9Z%;;A{e(KKu4Y7Pzhw zI1*2I7999C9&FMcxTW=;KiR3ILBtIa#B~#R&FL{+&rg#c@5Zb6r5-dhN64NH zFYcTSJ+2Iwce5}!_ncIX+vo?qY4_p{PS^{ehSgDOE~S_8rhSy-j}92FnhtRF8#=ba ze&VQbW(Ox11NggPd~C<^D9uugzacR5ij%jgmF^p7z zoO}F;?i1Iq@i}ajeZk+!5l}C>fEiM|GCC{4qQPKa-9k;JpF-nv4cqk2PwV-xZ(0@Ddbw&Jq1v7e0v3jolt&!pVwiN148sl!1K6#ut*(iPD5PenQ5rImW z>yb5kl(k7}t@Du0aHMd)-f*HZo5I`F}|j#DuCr%^3ogfr1cWGZ?TWAQg9fLnDQcRyz#$r&50!S z`rzZ?)P%W`AKfD@);gSy&mGB^p5pD@g)x5WYgt|MZt{0SV{Taap;;68^!m@wv;wyZ z?q+Gbpi<`l#JBv}bjY{Xtdo`6YPsC0rL@iA!PdiOM}^%(K%~#?Kpm zPThpY?Uyg$@8+CzceSqX?jrQg{`I#0m*QB}k#y~mA_Wvu0?$HR<0ULA)<=*wR8LImy4CD`fL;Ys>`7L`8=_Zs z2r*UuaO@uuUxcG)C!o9Y$Mr;@cS{78OBvZA<0|?ySwb<>|B1=qPsq`CD)AFLCn+38J5IZa;4(^~JP z>Mu*Z?@i@fN%`fU_MC@r#h;4U7R*zDx(ZCMw7{LCOndduAnMC-fJuc8P`SvXLV^(C zu@d2-3lPthA>QOlBi^10Ze_>>WCy`y(g>)~2T&pHq+=LhS0B+$F>j)MkL9<{wF}T= z;5=q*r)tBdg78pzKIdZHQ}?yW$T6;|d&#jT(G1wRW>r4eS8wcd>Zxi zXWP-{;8mcO9cOAl6MsZ+YmRg5B2C3mnE71WKWapXQp}0&+2}Y~M0VU!=8H$#S6(Do z&896RT>QFm>=r$#RM+ymq*h+?e{n zp|tfRi>2l`OmsM(^VOKO1T*M#B%dkK5LyMfZ0wz@FLTUc_SRcNkP@hp z;_DpMU1z2P%bDJlz|Tv6D=5JsY13b)S8O&nly(1GYmRLjD*Y28&mBu^;_YioFGQMh z=FIK1q1Ac4CoKOeuuBQ}DFg`a?KC^>M1)c7N*X8{?Yb1lH@Emm${+4JM`3uOe4K%) zp0hu`Rk~LiiT54aP0AYMR-Nt~?WF@vw2VXMbZcMbWI-xk+R74dH8gjV1o(0oPOpYD zKEn52rX7P7NF;(d;K}=M+=nSAhf%cp4r6PuV6(Yt>$~QucY-l0X(`|yOfkJoGPR>E%|Tu zyE!K^rRNjSKr<)3Z3fxzs0n;*X_f-TAb`J-COy zQDQWkVI6;ZffwH=u94H0jgXg8ER5Zona8! zPpDkAsRZO116~F$s{porCrPzq2Ml%!T6t!={G$<@xA=7a%Bg{Z>qFSzTaL_b-TOW1K+%GV4Ul7Pq3^9`nspNKIQ*| zZdR|3HMQSuGnrn?JqwCDBP@`FP`RcV?0cBx1!cIJ#%IwP`9UjJxoZ+EseD%re5?=U&!A+>wnV4y#S8!Yp-gvRn7^(k4P5|E1rVoo-(Jk(bGJ*W2v% zCaAd!$J=*kOzLzeIV_J(veu!RjYpkJm$h}+^lrgSjt=v1`tmn9$pNo? zE4#*ni~u*7@A^9A+H2%>C@jFwjN?umlBmb>tAZc>t}Ik<&Zksm z5@*#+2CY(oZ~|xbTn?*Ie=ssv4LG0MX?HMzt9G$iScg6jhP!UL9GRFO|a8GNi41a-B7#L zv0AlSwaF2W#ndO{b=eh4Po){609emEDc)k!-3uA&*Kn#WqCOb{*=)=Qb^W{!s}83| zyK&c?+=u5JCZrzx`*b#6D3&HV^z!R&Zy*dqZ20Z@=k4A|n%D^B{q6PjABK7ONs6p_ z1Oj=yc_hlG8A_?@Vp~JU^`^}NCv6U!J>ETjzihHg=fB3D1_|+BoX1lBQpH7dcBJq> zTA#Kun$)>R~OGZc&O5Y=h= z33pAE)DNRL0sW}^^D3mt>lK>&ALbhA^C2kCtz+m)&TUiVEY~%apXQxA7DZ8A?5YbA z8-M`dO+(kN>wJ?&CqB2ej12LPQ%kMA=co3Y=6TnFhhbE=K~-iFm!aQZliY@1T)Ekb zHw=RiOApYM-OCQKaX-nN-jpHppo^h#ObpK{c}(J4)gub`IfFT-JGnip$SdF6J!a{p z6u%8Kw}3t8KMm}Bj{b+Q?6tuA&*xDbS*_E39HTTyaROb9l%DLIzukuXJ7q}Ks;I^HK{{klN2%8lI2XMhxiyR z#{1Fx*{cwiPkEKkp0~{-=s|ax=d8;M-G`|`u$?5nti0#w~D8(fJu7*jiV<@tK)70 zOp#&T3BGQ}zUJ)zLmf`y#Cw^M^O`s3qR1$yTRen#}fj!Kw`@;E)D76jex5o+Er{%=38n_bc&N_TZ1;TdTLEtK8#K#K-}Bm?37nInqM zxSWOpc~-t17{d;%qJyRz|H_1>S2AjWUb+ltpIwey<36>VUe&2-Uxz0cU$FLum7uGd zg5IdU`)NW0A;4IYjMy*+{mMKQpJ*)iguN;wye~x?%$Yam4abr4tYrI1OR6opnl(dq z9-`g+y>tk*21?vR>G4j>lJO}vy9LS!PaeY zFu7gDf1R(C&}a< zkRvLTbr3Gv80J(xX;)LSe&%3XeUfi=RfnLDkj(Lh5_)|p$F=;9*)fP?y6+D!b_3j} z)(DJ2qIz8)5E_E!qAg)Yj7WK-K(ef8$s?R!RV8li{vFTG4U!-@5)*PX!P*XmVfXb{ z``R7d4{7Cir?J1|3Po*eSK{bAW7t!4q8^D7!Kb8QT)8gG>gFy*6Vz@HnpR3#P63Sp zOT1~VK%I`7%zRQA`Gu|SA3P>vi&KYx&m-|`t_<^r-uRLPuU!*J;InA^X%ht>`xKZP z_GiG$pZnM%zI&O69w!a|i%<)(h??;Fmw~Kf4hlg7cEC~9cBiE1MMjI#mLVeBKQ?(= zz0f$i`=MMbQGAI;`qWjgmU2_X*b4%hKI#zI(4ufz5RaRWVdqim8hiJaXytzA;qpZe zwuWY-LHN!Z19qYl*qQxI-jU1VjV~udCJp;Msj8aU&2@20A|w<*S>w?n z0*v#u7MecFz0d!tFY|ou@zqdSQ-7>ZE}A!CK`oMtXs0*f>;eW-G0^4rK4vY)O{j-w z_{Q}YZm1XQYavB0;bg@Elw2RQ{%{b>5w48>wbDQCsAn>Zfj88vucn4>c_i))X6Qfi z=1FN9UAq?8o^OmM1Bv;nx|-ZfP>k~0fpy8A{Rwvl2NS<=eNx(4)C!&bGIKkkC%-er+XGs2w6Jvs$`M1k{nhJe9ilNB*7n-hD(0(PI`$ff5lzJ z=UVmGh(N~WD@aP!%f!_BOt#r<>2gP(acf^HjB-r*_wHEj$L*GNdn}}<62FvM` zrAg_fnX6~Yi{#*BW%kD^fFlRRu#;!sN9?bTV5^-3b*DpwA8VJM=)W?QqNu2<-$6R| zF?#amAOglpbAX9GV0k&FQd}5(8EoT^yWFE-h=%~#3`Y~|fm25TZroFsm|A&mT&?miOL-mDq%~cgePZ}kVhd7I+m&aGd{UQv(t>AvSZ4hCGP?6J zx+6QFGM%Nc6_==jYDFTU#|pu+m8=ui0<(=>P#jKeIYBiYt}Q-gr!Hl0Cgp}RsRt?b zm@(BUGbt1sW%CG4{TOYX53s5Z$RZ?hDMtsI3k4hp3#t=>{bLvF6uxYy{6k8IW=e;3 zpg;Wh>7S5}d`)z|%}|O7a7ssaPDghXhh#WDrcN@F^n&pCtkU>uVN28rx7yM$Hq*GJ z(-{&nnd&o{9nw**Ge09|iGb4mPLMZ8Q`Z>)0s$FM_P8vXq!eQWBD2)NSft||82OJ> z>8%8Nm}KOZGgUBV zk+_Pdq2j|*5oMM<(wIH7SzKenjO79f14$3a@{*ki-FZ%7OacfZ*o3aCj#p$RkHP zhHU59+}t2@Yqs?Ly7V7%8GC;5dK>bFc;V_O#(O&Ym3Yam19eZ^7vq&La>rSKBZS4L zFW>9YL$6E7c1UI&6gDHsb|Y|e?Xk`yD+(~nSmr9&ZYnFO9y#CFv zW^ro&C`)}0NAe5DU`FkjN2&XV3B-&5-tE?sasg2y+IfXKKC?8>GmHOh=->o3qIe+o znm0PMc3@+*khe8+E483$bQz*{0NT1F_qx7BbTZ9%39vNk8Fl$n`KlPAd^#VA0u{C;8J$f-RdShSP68CyZB05x(pfv|D z`HlKGZ##z+`?8!G{gxXe73;7i8nxzYL5TY(%d;KD7dt5VMj2_dQwR>87@3A|#3 zw4zj8J>gNk#%%W2*M=%${FC{5pH`HTK&3!-jNDN*U^ukTBh_Tp@ZdU>MZUrtDXj1ex+VR2;So|n3yz#xjT(P$xzTcKe%WzaPLD1tMH0*n&+IILUPUdYndT-Y@w)HmDTCsG7-Pe&o< z8W4U(a$ujp^ytU57?%+0ba$VaLYs=gmka={NC$@nftFbr9bQ&kanWxqb2d#}->>ek62aYc)&BTy0 zFS86K2-ngY)DpDmwExzz;L(-x8u<|q-RRR$wTtjbVt@}s$f6v_S8m9EYjA;@BSGn9 z2G`dl_m=k0_Msrx&dtFJH$)(h781{eE0GYEAsngCW3V=~?9UDc&lM?;zzxn|<_JCGA(gThtoB-bLxR4@Xi7YJXgA{4rN6{8oz`0+~AA{rHej z+L^negqI#-`U6NiKy$SnLM;&m#%bx(w+nMAa;ua-T; z92U5?7KAkxq`JDD&coZrh>j8V?dj2h7jyq6Q!3YV^diW0Uk2zAPIlc;D zth1=WLZeMgrB1onsujE;@sYthSSvL|Gy{OX0I7z-8wC59YATz`P57=uU;^PeS(7aX zz*f>c<_!?@^ll3UYkQa&=%ApH}**J*HbVyi}9n<4{TF5EshUP4mNQL52f$d?%sR1jW<`{ z+iGvJ-c>f!llsP9wlc#9fI)p@jZM9c+x=`!Z!g=zLO{*eBh&fCT$f`Ossa0Spr1HO z-rmlE;_i4-SKkYgt}sgdJ-i$%AEQglyx=ZRQipxv_;16#lfb=>gK2_;CbFSse${=2 z=CcZm{b{zLSu(7SO|LCPZ^=LVhssAu%OfsF;Qr%T$cV+(QPI49$z0dl*cTxFoH1et z<;G_4#Z~eASCcl*x6yUw%Zr8i0nog;=^^;;;2%qapX!2J@kOumdgKFGc<5X`8~K+;t{6lTCi|a@Pk+I-5>B#>kk!(72Xq-g{x~Y}sone!!kjYzm&6WRz!K@JZ0%?a>OvP8_!fAUH8dqgJ_xU}nhDywb)1M=zMU92TSC9@kP=c= zy=YcEP{X}BmPz9@RZpxj?qG+7`hdeFJ1F6yU#6dEH*-e7Rf z*&o7G)E#>+ygDs8hfM{Mzq5=33@qLgU8u?y= zg`cs$K&%KUeGU-(qyx5m|UaxMcWCAM}(ZL zi7?3x)r^0!p#RqUf93P|`%;LNWcJq!<2mE=GrQg&U$K*ZF<#2W zh;!VY7vr8Q(q8IYUK-tqst%#X5ntONpI^uIUV6P=fFJGGEw2Ora@WXNDk&2`&fgPr zqWC{o(o~RkePfv4PEH2DE@8Z{e14}nei{8-vX%CcAO%c@6}Fcn_(f0=)xU*Dq){hS zOH@>^wLor{AOmLadr&10N9a2(@B3yYD#VZ_4oK)z2337pKP)CP96GH&I|v$$gPqlS zd-+%@9*a)3N`K`n6!(=yG)l-P+x_h)tC69k9=D7AogbG;aZ%stRJ@spxGMgZTOAbq+5j4n)MfC@G;S+MZ_JrCe&W;T%i3>c zHrfCCRK%ptvtx3NHSbEgAn(insN6LLq9ocq{sGUf3kLH?0kZ8b4iRT4ejzf`Edq_fe zsw)%YKP7QJq_LH_pQLfMv^`|-jetl}<+Rd{Otg;C7{hEAx6}CV-dPKBGH|q*qp$&c zD6CW|npPwO*4~=390-uL6GlSBRdpJbx)o2QPkrD;8TOG=*b?J8?lomYOpEw54Fu#L zD*UI}UaEq(oj=-{;R9FesxKb3Qn?lxt4j^NSE_T#QQtH)WZYpnfxdU1uthEYKkgZM z$oIWIuAPkiLHE$kBt^>8UCkx8@2`$)^{;hZiSr{ZYTcS;^em&s?AHpT5_ocudx#?0!QjI=p;)x>WhfCH%qFVYM8uWBMo z_g~B86&9aULWqC~GkW?8W*IJdlaj7>YIiHg5B>lt&-;o z^+W_lZ`JjPL3SSKN-kylem0ShMgt>W4?NxM*shtI%+^i$+mz0Wg7OxDfz!Q^=b75{ zkm)H(mv$20UJB`lQAC%Xah)Hf_5;QKDx6E)TzfI#8li{o9{|3bjxP(Zbj}3*umpB% z`o?BGV%Yi*F(i`Pa4Yg^esrH|$d@+3V-N(5P z@cWtu3x8E^DbDPxnIdXPsm(EmO~H_7K9&&dT3@ZypoT(HaVs`gQgP4n{be(ue+&FD z#gSe_1sPb0+k0|Y;yc_Csl$~0m%^Tvo;9OIkBC2|$akMss#5NWfKKE8F0=?-AVkzZKg zcbb=>dtk*;)of2vOJ*d+`r{i;oJgZ}mh&2AqY{nxHU?Nze^Pj>AR&+>pm*T-)Bt5h zc;1^ro0}owM~a%|e~#$W3ghfiblScgIl~$#=l;NQxGQfr8&iF3^l*CCbCiz4Nu=%u zalo{Z{z-tP2&3xm&S(QAMx^-CH{p8xeQXC#uREkj!hq1<_!H+!tEu9hLCmQQ%a{&* zI5IF89I1bZyNzKz*NE2Jx(P?)&u*@%WkN7$4Y#yB7pvnLeM)O5u#mt(yqPY-X>BKT zz(iF>_*syDU7oPuNI3W-4{9qvEo3MIXrR)}aJf3ccH4-JxS&qRm!u_gvr#wfvcLv} z%usrYDUa?);N&v2xekS8IC&b+w&F2Q_h!8lH3dgyI#cHC&9irV z#!CVE6ZE=m^og|qjlZfhvbyaG$a7DsGE2$A(4~t>|Jja=e$9@ICkmk^b(m}vT)&{m zPoKm+ve;dPB&MX@os!rI&G4q%REPG)5j;h#^-62jhB#Mjb`#F5_ai%j94(1`2I2+N z$5XpeWGNM1Ss5;TNd}tkeeZ780*BZP536-MS6iDjNpD-k0H37?@p?7#Ji`Fx%mF-c z>&~DYx^2gzv&HExC;Vj<2c-jc_~cklpd_Yy(EfXP!e_^vYv3p=sQlWneUuraEj!-`YGfkw|7f&4x(X|IMNnpE;z zHzGWa?vW!VB(Izo^CPI-;$+0|nYKTclCz03hlx$LuL1-9kZ7cvR-U$}bL_^ms>b-7 zDN2Q`PyLL9%+~f=H=s7hz&waf&rY~yiR#hN{P|}Ra7f}T`(a_T_}9n(;_ZLv;H9Os z6xu|gYE`n~ObJV0k7G1gw^6Hw-8f0`o8`k2hF`;iR@-{mGER*37V%%M4Eq?8pR=VrF*+G^= zcIg!U;v9Ut6(c%Zk|2zQ-`V3+>ONK3JG?3<**#4x`4E4sf9bq32k)x_TCzoXPCjve z4lJyR*h9-;yS_4WUd25InVwkFy~FgjM2^!M?-Q@_(ujQStT_fg+B@E?F6;hC`Pg6{ zC^CdkZPAmPU*9}qfw2Cth{*87q{A?2atZY+x(uf2+4NZoA*V83`b({vH^p5SaY{$~ zj=V1QTV|FTozYjQ7L%=#+HOAa+se(2H`cV%;l8a1ir!Z(U{V)Jg$cXkmo(OplTUMt zJ}pwK=~Aw7tUx5Wo=dEU&Pbwd2`^KwdV>55p)6VmlpCwcjZa~Mo&0C$&?a#)xZ^A0 zx8uT%$I*<%C$5a=cHa1>Sf&o;5pAu{2j|+gy7R4Yr<)u)ptJ!Gf0vM;i8+p7$K@|2 z1?^wZzz4t6bneRC9##XMQo`O&e!N}I+d)htoAUx=LBundzp;y!;qS~@51R_jr29)V z{%Bf%pJ51lUI+{QdCH`=U>EjUpIvKeWR0NYABmG$;!VdY`{05*3jxgxL5{={9!Cb0 z#9)QR;grSUjm3-OImrCQk&?xci^NfY;;4h-Xkc-`zBu}wIL4beCYl5msRTBw1dgx- zuCfH4u>`)e1VOL_VX_2KkpwYNf@DyF6bz9d+m|4}lc0E$phT0TB9){DgE;vmX_Y1E zjK??`B^iPx8IvWMiX@qVk}QLgtYAsDeaTOElAqrs+0mppNTt|Vqlg8ixP`~*X{C6b zrTBuS_>-jsilhXAQbL1L!eA+peJRmk2`*(RabP*mos=Z2w3M*4w6e5}v9zqSv|O;X zeDVbO+qgK|ghaNqGFVz=Ut0A}TJ23*9Zg1qROWNlgrf4e60MAmv5c;>j9##eezJ@~ zk&GcwLeaTg>u02rH!C@eHztKU%`mS~l!WE*wohf>b_|RNjs@s__wqQ(vBwojBH6-r)@~p-4V)FcE7#ieWiI za1>FhS9U@`4takX|85%j=S(n^LWuJ;KJF~4^(>0_EF!mp+rGS1xLkp?LLQnz4z5Hd zt9&c%kz#iAXpuCiq)5E6Y81!~ zYEho`|2bEDrr4ky6|@fBDLs#9J>S5p)K02o!K&B~R2mpm8U!m1DT9ox%k7g#tG5yT z-BG;jP~PMblUPCg=I{_;l_GE*QR#|g3JB}cpb#)Hx);276+=#PR^-YAvbA_d1?xZd^Y4(0hS+{MoIi1jLZ z#ono$G84y<~gJz1$NUkwL#*^XqVgjIJ>*@~aT6#hKr ztehP^9kM^oUj`=khAUlrd)gCInM zFlB|$TeeOcBLC4!OOhi?D-T1;6vYJv@2?&^K`U{gJ>47(mffD-;a0)vQZQyzT?UWR zgv`_CEF4&M(6cGcDbLeQuKM0->Xs?cZm6sQqh6GkQF&CSg+G6^l?GXB@sVj^$G|nN zM``?prW;yi4_QSs)*yP<5(j8YkZDW$fF6|R6tkytsnJ~2 z5OP#fNwsiv=C_hH(TX&=byiiXHMvDLkc3;l;JRry8nt!s*t9L#bge{mt?4$0jmt-(N7E8uGbExi>*2{ImN2qm-Eb8&eAIG^ z)Q}+ey6!%5Jw>WaWD6Siy8eH4J?_@EbC$eiG~HrG0q5&}O^PTwN`~@U8Yxj+)zhIo zi+*@(g7Wa8`g-0mtKHK2$UoPtUG(EZ^y5?XZG_itL&W#;r|d{UbUBMIINXH$+BOV7C1QfXSMO$-0WkhK)46 zvkAR0DExn9Z)ilQfB%uaIiUujl%f8^eE;7s=>J(T|Fd9WVd3E5KIm@*1O!AxL?k36 zWMpJiR8%xHG<0-yOiWB{Y;0Uy+z%D}0|F-{C8hX}`c3&?===Zly+3U457_%d_5L8e zKRj<1mJh|7m5q(<)2C0LKYwOtXa6tg{Xuwhb93{25Z=7Je0+TT{QLp}0)m2qLPA2q z|3i6;ii&<<-XD_phvO|NDJdl-B`qy2BO@a#D=Q}_CoeCrprD|rsHmj$fp{ycsHmu_ zen{SG>gwtm8X6y-x0aTcwzjs8j*hObuAZKrzP`SJfq|i+p^=f1v9Ymy`*VVXLW;$-!#M}+kZns^-muc*7 zQtNg-{Tj{E^GUhi_eTZo%vQtK|H|I_$HUQaSX}$lgdC^SNECdgd3n?yrHf={CA~ym zHcLq)p$IPi?H5s%a{si3h<&VAS`_rO-}`*;;&ZeHhKqMQoxdgmZtzv#e!HGFC266j z8dJMmj8n*#F2401-;Q<+@ZJyjc%K7vAW0P8NME16wRT0dsD6F%f+VlFd6f;F0{;w&QBm{kD(;)P0xUYtUQTovedc_ z=wlPk4azbNny+f&l{WJ$k|Q^tYy9!%^o+}-9(L*y&0g&H)1t<9O7eIRZYVPXFM6!} z#zOL}s*w{7scTA7h#lQB$(U^uAWiLt+rZ9E$J?gfi-z0gzV3$n1_aqT7Crjk(^sty zWXO!|u1tHh9kv2W44sw=B$rXB&BVsFbrFhmb=9kg&4!aN^)!_QpXM%lF{lGs`$h{I z5Bmo^UW;2(H4Qfhd>5Ur19d8d?md6bO|~?ioyNazNZke>^o-*n+BS6V=i5DW~GJh=X8yz5H@GfW-=ed)oJc^EJYoo{#=&! z!*v>z*~+nB4P#sIHdPgC>MYXCQu5hYF-`I5GIU$;*fPaI_1)H&QTaV=RmzsL;~1vm zzGplF=-CroBE#GBHH+~>{^~@r@aa$q9uA7?84jA^zoWqkDjZ7S|G{YZUkAs3$Hd3u z$DsIM$Hd2sKtVzI7!Vj37$4IC4-fDE9}WMX9}UC9!y_XjqoboB5NK>{YCoX=!PBd3j}JWp#CR?SEtMD}b_Iw|5Dp zyPJ=0K}A525S9EuLRt`!_~`EL?(S}+yQNzcq)WO>rTMr&!0p~=pZ!1Q+JG;ER{2#bu zZm$N+zqlHL?A+dV`V&1gnCZb@gmp!Js&TPaqTLfgkDUP~HmB7;@8`1?lJF`3OED|t4RXX`>#MgNak$f8Q7BobxK{isuCm}w6Ylsb*~XE`)kx`PK(phiTc>z|M$YwqqSKl(aW^sHU6Kh|b*sL*gp z#M%D%L#cpiM$Y-kkJYa&?xfsykt;oo&Sme&Sr6FX#xQ??`r3xXn{RKdkFayPzHV~- zac8N*^<_)*<@w3CEz=F0{F9w!XTk*+Jr#mvD;;c6O>^A)qBC#Nsr}~NEQuim-l6w- z-hwf7iDq7+()UEWlf*Dmi7&cmsY|oKohSy(1s`Vw&}J}d+2V64P1;}{t*1lya>mlF zh#ssbDu^P8Px^`p#4haF`rQPL zl4fZ{qtXU+$!$m%MWAx_6%(Jj&`s*Rsj5K;dvJ&_2r#*K?_&Q62ng5+2sj9cIEaY2 zNJx0dD0nES_^4JfjCAx&^bE}O3@i+czk`v9ds1`2GTw*F65{XbJx|2L-2@$vDAiHXU{Ng#(#PfyRx%*@Wt&dtru z&(8xX_3PKKi;Ig(OG`izzp}Ejy1Kfywzj^$4y4-6&CRW?t?ljY-QC^&{e2+we*gX* zNWMU!e|~-r)cXH81z)F5QW(V66Vb2*7*u#vjD263bU`0vLIER2bLt?sn|MLEDK!w5 z;22iJzePk`*`_dxLn5z5Gg>I00FYIvvV6AKYsi;IyyQzIr$YJ z|1?JaSixM!OAHKZ+KFgs+D#XFp(NDa>WxK1!MgA9m`5j$+=OM|O069v*^*?`E549n3r*xf0my zdXr%NeziH?ZG{Vmc?6RS2Z!sFsdURI0bCM5Bmp-aKp_GA5x^V)w9$VEqyI+2=>L7F{`qSAW2o-!?HwE( z+}>q>3|Js$fu`d2Ub_w3e{j3qb_KX*ze4qOPicC)FBXjiIIi_W>upz1w$yS5%IZKS zUY^zK1A3w1W13{< z5of?d@>luFdUBmAy9Q$=^filUYcNHVrH{v9ty`vJh(RmWEbZTi@^? z*u(3AOONN_-$E&7@CQ!P;b90*&nggV%U1j_i%tuj>K?XZqS0FIgX=3dM)KqfH3sXe zw#G}}^`}TRRPRjJT5in^Hq`9Rw|X`Vg+DuyTkH(ReUb9o{^jam^0XK5t}%G?%ln#+ z6!ix2-PtCV&^weGPecz_2KAn&YBW7R+U?E^-NSz39C5TaE(*o0hlX7I=$>(%zf1Io z^pSoi18x=O{&o7m1ON~JJ8m!jo68<3k#8?`93&(hWMo_vl-nEq`Z@=)20lIsKr54y z0?aZwIXMLY3JQQ?{`&*m^nZN-D*E*RU6+{#6kKB*m zkFB9(5|w#V0_BpR=SgC3McLDEji1E6$uYLuVDqXt&st z;H%7*qz5*J=EV{1=KE&*xv9XmFp#G^lC>q`t@wDA3Np22Z#%9ikiH!Y$YCaw zsoVt(gYE~0oVO;l3}?y*4u*j|?tb~J^npq#-B^3D)Dy|_W+Y?s(a!9W59J#dW8hu%{;rZM{!3_m86wCO4uc3} zePyPnX@W%WH|w$W2r1q5BR1Y2Qi=zB1{@14-VIOr_q-$GZ{sNxl-~zbm{{1@*Z>QO zi;D}4sQ@mLfRK=gn3#lwg!DG6T<4X)ODum%C4WjFKr;cP4q%G)pApvocO$I--jo6~ z+dwt}+6ADm20CgWX#kBh&?Eq5$FKewC^i0Rk@3gg;2(eg8ev@_lZpLo9)49M*D0kl z5cP$h3{NXuS19ONz)eLGNy1G{7S_7d8+$#%60gvfh(F;ux8VF`H#H2O!T4JF_6 z22x6;zEsAGyA&@rD+|69DpLsu11`8@C7SIIW>qTzGhE0>L6x{o+GK^{QeX0PSdmCR z^l+2BJF<=-NC-@;iAYIE$;rrm))aqTRs4OOaq|-(J>34upYp^% z{_Sst2-P1e5nwL$*YD3cO}R2C(0p%_oVu(^+&7Ce7hQnYj&l>p1+%#?U!etZ{fUzqX5^I zer@-|WziU@EnDgiqmfJj*OjmI$2~Nh8>p*T`{G?bP!dkMCZ0o%%g?PbAEvS4Rf zDOXu3cR499c`087DSt(&U{$Gb4XLQNQZZUmvD#Acx>5;{pGee~O4gT3HIT|Ml*%!Z z$~BhCGnUFXmMXY~iBzGPRH3<4k(JbYYpG&esbV{+Qb(zB7pV$2sVaBr8c*puZ|Me~ zm(6}JTLWa;gJe5HJC@zj!^E3RPBmV?}~Zb9jDWi0O?IM=uI^2Niu3n zwWvvT$c*<1jtI96N;34zc;}s?;hC@ER;cJwB=7iM*5SRZQ?aZ|iL6_xtVg+=SH&xz zDy4uL)sVWkQFV~Sdb5lMhr$lGl5U@hj)3a6kh;$B#vZ^tIp)Jq+=s#Vwt5uti zpNob^ihIA5b&OXwP1V#)*H_InRLnG%1DI_pn{6qZZ7rK^FPrTwo9!x}?W&pWuAS|v zo$afd8>pNcs+#*;J@=)0Zn}DIwt8;9YVK>*{7U7*dd0$4`Pc2Tue+s-`z1>UWh;l} ztA~{v-)gqM)$e_4Iy`7S+G{`E={(=*y4dTw-0QyF?Y`XZhHi92*Lt9w~WM zL)QnO8y_#%K3}ek0cJTDOJC0x*3Or9&zBF*SALvt9$)O9T^wFq9Gzc$|F09wZ6WeA z!E^`T*K)coM6R_oK!WLy<#^{5@lgM!xA~MQ7RhW){0ev_R3=j* zS)$6IHwUnL0{#^W$4j`&bni~fcuZCRg@}58_50}>GoTQWtSO#tu=}<-+h0>Mf2*bW zCke)l%7a4cCpDtT;_w?aq9(jGRcmQ0fW?;nfK3lG??FaG?LkWo?6Z2k)nYfB!RUvs z6y)sI&Eq4wfFK3 zNJaGH0#1XeTFLvit@m5282VultE)6U9S*p#TrH()2~3Zyh>*NgA#n+AcM!VM?ws{% zr3(?2ABDZ0?!>3jd^o0%ss3orE+(V|z18~;E(K@+7xxT_)>9-PFO>j(TNn`3B*499 z*qj{KGHW8IO;r&V=v@w_7P0RSTUN+dcG5-18njP{W1@<}Pnpp6hj^z6FwFVwVns1__j8-N$Y>Kc+Nmus)am@UGgn zN-uwGfY7$O=q#h1m>D^3ShyD0Qfi$oF^R z7CbuYwyROqYxfkVhiVQ|6iS39Qw#&MpcFWzD&L^;#di>|JQ1zo;vSY&@9uNSap1kt~oVjLr}g8YMUC#73?sJ#c?8V)Rf;^4??Z z*rybhJ$5*GriG-{fYDj~vZCAC#r6 zr4}YS3vzU{fM;(^^r2HWU{FmX*5=#}?@8=$F@EFpV{#8pBhkt-UT50TV4W}KQKVnC z&{1Rh(af-EPSNR=W-axZ;R}}h?ZI>m+V777o-Js>j&jUgk&P!=hO@}&nt^&bsIWfs zi>fzFj5qXTlOxC#i}Z(ogaO=^Fhmg5P6{;d?8tJ2zz%suNmAA0Df3PheYC*{h;T5O zp!fmt5P;^xe54(+%s)(C5qSN;OGPUUu5#aqt#9dVvKs>>4GFyf#6Ui0lps$HJ6BAa z`Xg!M1oHDzEpY>h=%mf1l-*vYATxOBsf8@AeA#|uH|E5Hu^t9U6Qe~O9~m5GS>RnV zcJgf<_56DBW!(O4nFzK?Bo40Avu%@>p$g@8Y0|b)5o2k2H z_eaDFqH@8YZ0V6gGM|E&+U-}WIHQHs4)>lYMF@!{h@~i!A1Juz>8R?iNOsMj7{Wtd zXf|qGGU-trdcrng^57eI1HmN9P)*=<^#F!vDeUCJ`a(ftq|rM5*0fqC720O?_EJ zmM5?rD{~~C+<2WU7x`0gRtjnYwn!C&xvDtZ{dGj#z}}dM2kTjbG{au6>xnK$eYuS@ z={*~B{dZr$3wnR{I^oC;VEzyw(;~~{w~$YvmmeAOjC?ae+Op;C$^eqgPNvF*(#sCy zWrB#sq&hiU9{cbC_gNe!{&5L*<1`lcq#2^uQtND9{y1!SUa@F|il5w1e`ubz8g^j; zTDz~pHlsX6>bTQM_EmCRf@FSJbup8BR%1`t9N$a}I}+qy;>2<6_<|EpI;v{Bb?zWT zy(E+rsYiHM3zzj36<6%2k7bOFn;v8NHIGxc@0-5(F*(I1b3Z#2w%0)Mks=u~ezlE6 z4Q{niv2r)>%iUJ7;<-U^{=@@~deD8g`wDEhYNT^V^@MB~%I;6C(&9T6OTB|g;x);$ z=UvJ=o7WRo9L*y&e&ATPB5`4;5DaJ*<0&_BK}x+Cz+X|+l$kJn_Px0WzG66@w3GFg z`aA_M;sAeBQUY_q6KqeU%#%)zkg}lIj7683%+7~HWg)f$?_x%4DUXOGLw&)^)TAm@ z)Fyr5u>;HW$F;5ZWxT;}7M7XSPW$MjO#|PNXtO$=0^8(fU~@801@Pkmh;#*Qf_~7F z>jWt0Bi3QU8hDM@cZK*tRYl72z*=-Eh?Z@=A`%|%_qlf+>;#-83_eWmE#D20-AG8d z0N;JB3b_V8pbfc}hg<_ti2MW^8o?i>BDdc+f)PM7at#bjA}nm;8>t8xJ^?u)5d{e; z(3{fI&;sLbWsEn77 zpYMsl6Mn(pAoPU)8vFnRZt+w=@EU?b!a_pN0PVR+OG@>O z`4ySO4I2(j)u_>6mNU9TL3FyK5Dqur5Gwfsw8s&&A7G%;#Yy7w+Wiqwt&F1HinZ1l zEL6Cj4NQ3CR58OY59!Z?>5~)6^S`*uWKv}JeaZMzcvWt&BcZrBUZ`bRAE{bx z+*YADvihWZ?ES2}Sz_Oyc=4`!jeY#?ATdV!e1m-%jzTQ1=eus-9eM&J1#%eG7oyLh z)88p4(qqK2_6b8;bvvZ_Z81pC<`LdPxgY}M_Ky%?)Wp&D^#(b2+6&Q5N>}$<_m&Xk z(bh}xPgnmSd+~%FffI%yfyqTgBt%3cLP8=!LMBEAfI^G{0F@XO0NORs0HFT_Iyx~r z#w|$DF-R~l{{onpB!E~96N?lZn-mY1lmL&6n1GCwkc^y&jFN<$nv8;$f|4EtVx*#C zrlw+{rDmn2W}~CI$3V-@NYBBXz}c%S1TFbR7A0MNo* z%V9Wg_A>sYg}IrcUyH?n5jsFk{b%{&|91JJs-m){vZ}VKx~{sWzNWUmwyyqfmM{J% z!~dVk#BLcWKnrs-UqAfz?fV~ish`vJU&66pywr90e}jRaIr~la^18?Dts9LJ2@w9~ zS}?Bk0k39y!WUn-ibhzIiGN-Ybp;{ByskUQYN0e!?u%Og{3g)vp(S;ZzGci%h*Sc{ zh1hVapyTuB&?2H&dBQLvnIz7L!b_k1rIM+=m>)6M7bwx`elZ9$RLcBH?PXk>`F{Gn z>>6>fQ0%U%kI6TRWnRoyR#$B0ndmqr)2DgPZ*F2-v)X$e=T6wk8^pIzUL=u?&J-p$1@efd&hD-Y+25aAeZfWP6b#=6KSz*yZ2CmgJP7 zy*l`~Jfygh4cNlER@&b%(-7ExK>kMh2Tje*T>N(_%`Z*O?Z=%v7&pMYdl!({0F(0D zvf;XBKt;nx#~{GKB*etJt^sgxN%8Q>2#BubqNHTh6qK}7)bs!&1js^xMXO(HR==s- z{#sD;NBP^|)&@U+_j`!|>}cI=Y2B=7-R@@rx>2E9H4TsrZq+ovjem3LU+-aEFJZk> zmQ&P_Q_+@JGmuv|m49O`|JFfX%SB$xQ%=iIPAgFEU5Ko9xU6oJEF@OeFhSNZNyaEe z#wbn3DC4DZ=1b%3m&Q5L*T|JN&ie_Id}))sUwCPf3qZysN7f`;&NNHjH1m~NhN4-z zl6jhnd5W4vvbtr`8>_^(*74dlae8*K2KLd$j#1{$5!SBZ_U>WMo}unO!9IRL|BfZB zUprX;XbJ1zmY@?a~Kkm0XeC z{Y+6$(#I}j#B$3$L3C0nL2+^`65edHDrA${sUr3~mVNTvBku-ZpsFoC8OL3E$$-MQ zaFH9S$%7$q{(g~xJzXwo%gkaT;EvZz*X5+zGW-2aUX;pZ|2XTzJY4ONzCJZ>w-`kG zubh=TH9h|L79lf4+d{GZEtqY~&OO2-^UP(J9T6;kUcwJNL|A(&L_Bl_weOIh(kXo@ zcw|p3!mBb^|47bDoYjpdW2$N=7TJ7#ZcvTe#H-13>BL#4)^xEonC9hf!?A^D12V5` zaTxcH%}-ZI0*@9Nl95rNd+)i1q@aLgEhcl z&EEig13v+Nt^@{4|6_*xC0I%Z43?Dw%iRL_27~2+|B)bG@AH&GWE?=+S{2-o#`C?**w#Q_ckkKPRo^^E7iU$l|hSTAye-| zM)HGtbAs#Q0`o$GBV9x6OvCl`B30i;E4_(&^*T~UAxv5(1S}NEzsp}F-DTXzxM}K%5*RGw|sh84in9*yV zH(*)t(f0i(`{EJDl2ND9FRta|ZdJ3MHS@l8^8xiUK@C%3jpLEcgVC*>aUYtK+pE$# ziqd;3vifUshwF1k8*?XGa;84y&a~&vcI3@|ESl{pp6xB2?JJ+{t)A0k&@bdYb(kiF`B7j?2pGy;;b-C6RBY*}s#>*VAkiazG$+ zLm~sy?EH}%61o0cDlpBifM(v1$eQf|Y`L`QE@2BF?Ua=#3VTazmb*x#hP>Wa>$|+g|bZtbPf;;$IX$ zQ*9P;p$3iX$I06hX4pmq2yPN-+t8u(#+b65oh-a*4C|utVd;$h;sn$7TvJ*pCrZaf zL3NT&O3h&-HRjFd=jp@`=*=_5^~!tS;`rXl$O$g&^iR|LFnE;7S-g`$Yh3+aMJ`dW zo@hc7-1&Hd)uTszT~cW7l}47Nhn{x$b48L^|7Sy5(^;`Gv~-FL{9Hi_cC_v)I<2kg z%n)e)_k#)UW30nL(6aIuQJnm^Zy)(J22hOhOV4;&IqISNL51Rta3ArTpqqCkqWQV} zO7cs6mRv6Y_+41S(?Ccus3g)-5uvg6w8yLR( z;$q3%+@T@K(NzB+qOgJQ9wQ_Hsa`pwqhg9D#FvoSqR9|; zfz_`TY654~1rhQ*?~>N|*`=h0PE{=^#whMvteviA1r{ymoOhckDrNXVto0u3mYFw| z@ALSqcBMC@A**?OZnc@yAUN-IJ{arfLf7YZaBfskB2`b>qq1?*@SBlUr(pTy8~x*S z);qRYLerQ0yw*apv%>8@k{zR@4a|jNTl1@U$VP#R;@g>b9@glP{J^)KOPCAIw5=aF zhbg8F6ac^URy`1hrlHtfq^s2erRN;pAB71eUY}qhd*ry^&kCKvLE?bX7kLfkto*vI z)g~}4uJ@vtNz3T%ZGu2VPfiS+hKI{u-dW;-cncXrX! z*Gq`Qj2#tnh=uqVe(qtiR9l?(LVaJ;jT_5p?lAiX6Ngw){_h-?) zKx%`}h!9BPd<$bakxiZ<^y;6XA3s-OeUcX$~|boyG*(QkLMC_R;gP<3z?EFTvFykmWl%5^GaB!q^IG2$v&aycC4G?N&nWQV)v4yaU(pTE0_MA zotTWzbNTMBXENjKBalrRmee`wow6XPP zX+^G}>ic~TgpC|T4Jz)aaokmX%^84Yn{h})#Cs~;)VC^4{?(GvP0(!&{aW@H!lhLV zK{|8I2a^*XIb~e>iwbGVoL@t_Y70(RPm6PAh&O@~E5n&33Z_OEwRA9;5{Vp~5N0zk z@E@g8Z`rQu;io7_>Gcz1o@jYCI|VRuKlkjmeQwE*EoIv1G+-+D@m$o6SzNer|CwD( zyI>m$Jrj}G2X|DqXSzhKi0cNgK1hter#fc=#Tgn{l_!c05jls4523FrP#WA+Y&iQ;8d6onN4}~uP4YQtw>w|nc}wH`Y`hhty3{v# zLlswTq7I5EDC4}X%XdCG98z7$V7#s0&pUY~gNRTxxFe0}Rt3@TCOCTn^Uf`8dR^MK zqVWC3%d92TZ~`Ijh1p%({=~V6n3|}|Pob2lCmp`c+-Y}V2LjR(ZCM3}uF#+!#RwXRd3Hwm^4cQ_NA}7zRU_7rltB zXrYEPxD)#)Y5K+A#9hys>0WYvguk@(T5>{tR&&&+CcT^RP;=Rq@l4PI17c&Du;ABq zmQ#hH?|ghd+Oc1gQ8xrrem=RqdDKyBFZ~U3|Md=<-T729^!r<*54dAye6#49$9^wg z4}%zZYpcr51!~lH&2!I3oDUFnIg$xn8LGNYxBX3oX7I!3>lU4Ntr{QBeiXm5Tz}eP z-ySVnA3avD}YK9pH|UNqS(KH1Qo|U_Q3Gp~;}IB6_sIxg67*dM&V63OV7_ zI?zM#(Rw^wOC1}!V2C)-FE!z~A9_-Yc{tg4UJWC#i(wG;=y5Q5I&pbir6IzZxp#?L zg>XCf>A6UCTNPtjj1c-ziK4i+syc-^Gjk&poB4PiIeX-Idym^>wfejk^U?M5$?$P< zioF|RYxhXh(yP_1bR7K(gp@4m2bCu@r{cC6S+bnQd z$V-pgv=J$&bixajC&;zhiv?oZf&?jJbXsn8D@(&9Z8bs*gB7U8AX+dvu`#6=3&OYa zD69>dWen=H^>$fxFk829U30MRv7m`HyA(y?SPRida(t|3=V?puv?c^S*32@_`I~ZR zJfgt^U+0Q2r}1Ook226_!Oq0~M_gF!a$%MB;yw#-}CGa-U(#l>cgTez#l zrRSJO`q~fJMik|`tR30dkDI;IjIY?2X4bTg?siU&4JBj}I5eO(U;yJ#mU0jhXjG&+(4;xH_MTk_CpBFN~mS=)LhlUNAGI>wjMXyJsQr@Wp$@s8EX-k%|vg*{n%`5u(5!Sg*SO{JMa zlR-WD*)u#&vpL}@-IgTcIU&ShV{75;XXaPL5ZE(49aT#`g8+m+OJfNG8br%^f&k3E zFl>LTkF9CY_ze`oI;XCE+of*5$GJI=*D{(p%wZuJQGGTaOC#F35}(!hfLim;x!vkd zGaDiJ-(?(U*4_5T+~Bx9h=`(JFvX&;7jTPV&J3q)Z4^jIM1OGeoZrwho%CRW;PWxY zV)MkHK|C&n3Xy9$CQt9uBVpp@6*lq~R;hYz*?T+L_+BSiF3K0tugcL3`ZzwgRNM|5L2b0F07TRKYM5DkZMG$$vvT|lr5Sx4*` zcDOQgUf@EA+zhAa_4BhUZq3QJ5=C`_fw_C0pGJ~-uwkHeR)%kA;^E^GKw#%xT}<6j z&Z;E>_sQQQI# zkK!8mls5q369AwhAfP5Bq#+`rB_^gLA*LrKVI(7EAtz&@AZMneV4|d?qokw)*cj?t zPKFB5I6R`H6{cd~reo%2WaVb%;O2P1{oo-tCnxtKPHwJ80Jyjxaq&EQ^qA`rA2%02 z50}7W9)ZV?1$lV|dHDqS_yvFo$`iq#;1?9+7ZlA4_2pCz06taWwZ4)%L`6gIwWjWyw>tku z^QwU0F#phK|Im2fh-9CrbnobF@0dKV*h0^^_a5=39tq{{i52dNRUXL|Ua95YX{Ejy z#eSLZ{j&-KvkO9VvLkXcVscaC^O6$t;#2Zs)AD07@}siyBXja2^7FzA^TOWeg_h=p zR^)}$iM5HW$S=zfWo|No^|4YAVlftbE^CUDjAz-B@4W z)YQ`4+}hFtc$Boawf!gOb}FdtkqQ{Ojz(-1O~c{moka?M^+gPQQ7x zM}Gk9(F1z`fMoak_oE*_j)8sQUkmkrFY*U?(|>xdxsnesn6#(B{N$+zA{W{dyL~r7 zZ!~mXr&Ad zStX8oP1N@t%LpdIEcZBqU_OGBF+=F|Z|wPe1~E6A_V8l8`ZzQSeYuJ_CWoK_Gb$NEJk- z0iu3GMWaqdr$WUbPs=L8@<{MLFFzOG6JEY2e1C!4{a`?Y|Ca~Y3)E z{;OjPn85uN0CPAS8+#jD7aLo58(VK1yI>o;XdAmY8`}gM+aw#?WE4zhL(wy_Vfu@AGc4YRfhv$6~| zHwiV;4$)N!egh6x;t!I25C~=r6sHXkqY4tE3K0W^iGv~}K+%$*SnxICq(E`fp!k=d z1Q}4W0(F`SUFI96TpiYYBiY&d}zulswxi2sdG+lvyX4Hi~V35 z-Fgd$xHhMhF4w$|z9oIZb=|QYT`7ZonWF9%>pLY9H(G zp6DBx?irlz9-QwT_}bUAI{0B{wE4$G)7ebp;D=9it8>CdA-l`lL3{eDgbBEUFicd+AYDt8wRwx2$0dHYFRH< z?Tl6alF_n_*INf(%V>E@w5PXrB70fdj$i z5?)iJl`2HlIGQu2o_5o^H{Cf z4@x!kC~S3_?KQ66OxuTN(jU|!q5a=eaGW-GQhTN!5nP&awRgM5Uok)-=#gPGxR3Zp zIIp6wyb)Ag;pgzuq!44GK=N;iY-aI4sE?=N;_#kmh<7{Vhx+-XbnV`87<3UMBpFg8r<=8} z*hFYnKK0a-(BD*!c-VgD+v|WfWRhGNOJ)(qB$Kx1v{G|F#Fn!~9>j0Fw%t8VdB~{9 zoE0VSQnjLawH!eQNfdw9UjU7!8tK>B->;bDQ{7p-^8k9${*tm18h}%B^&O6+tSbU% zJC%;g(WvCAag({IVF(4Ypuj=IsFF@R(y*e5J~5)^YTbdjdV!!{r!>XbrdYASyDEIA-Y{A)z=nPO7LopHi_W4?svWO=?h%WD#sQ(StP4gBLwACQlu-uhq{ zFivoc7$3jnAPfMf8g*V04VbI?uc;@L^!gSUvyL2>aXT0otT_rUHfpOP5J@&*&$jgXSIJx2hMk4AtWs_VDJ81e{OaFN|pmuV^Ph zHB2H_lgr1u&0j)`>U@pLpC{q2>!ZZmVY@;gonVo*$LlW?d?zS|owSxbCnr|xG~o#m zo@{zgLI$`BHtZ@luPz4ooW_T{7AaB^Cl0@{>wy)A7wUpGKW0hyau!ChhY&xQ|4uc? zv5}j}db-z*VqABX&OW1i)UN7!R!aR0Go`qE{%nd+@G^PNb=E=QVWn2}#igG66$j}! zS?#?O;$f#G?7>P9w08(g{n4)h@^N=!#jrg}e%QPMYJ^LbyS zCo{H$)Gri23TPdMb$?ndeV3m>$pu@x7w)ZGId-B<# ztb-)sit}YCNB_B+!zcT_{1n>|8j6R)2*IUo+Ov0#gBtkXkp^UHkM%|2v^MRS-F@!Q zM>oNJCuYQ89hw!>a6(XX^$6a=A~81}O8mI513TsLPB2g6rw^QmQVK4#5F!5BsLbAV zUeOB1WUHkl!Z8H8ygO0M>m*uC*2ASIr!$u+QAlI-YIOUei%?zC|St_UU2pvuj5TG ze04ggs5nuseNVA0|5LWVSs!n)S8)~!sXo(vKoy_y-I_UgL(_!|&!>+5l}csUr%K@m z?S9~(d`T#|NkJa|Zs|55p>VMAz&jLuiVZRT5eY(fAE|AjXS!7{a6V@gRCe(k*MaM1 zC9)E670WxKhX;#o^vh!yThmxb7GPEOtMK3UdNr!vXP0FJX~d7%iXy zGFngys?W2=NOa4%4o2y+fb0hm1Pwei^hbzy!TXCO(*EAR~>RX>gFeM-jI&8hgmj|;^t>r@#|>P?G$_h=q`^zZ>DD(`KdH*TOFRI*2jiRQbo zGVn8F7;cT>My6)(h)2~P+eV(NYr6@m&HI5)vZpV1<>vWdS5mw`Tv3@(*YFPXN?UZ* zHJZO2sUL4T^zDJ_fZZby&wI#4PrFN!4w-5iSK8>UTXxVrTo8p;kDKk`@H9-G-w`5u zR6EyL)0Un>G#Dc`J~mZD`(*4RBCe%mp_cs=Jc4U4p$=m6J9v7DlmvaYJsx!i!U0|S{G%@ZlFXu;St4o%;F7V~7q-N?SGh4i~A z^l`!9KJs9VMz4O&gAc%qa#a;g3(b4Z({xhbY7^6^8!!dJ*aZx=Aa@Cn7p#jn$S*@1 zz7kXnAqYA^WkLj#p0U)nauuJzdTd8h9*j|5HBk8l!ig=-7)-oCoJn(O8gUp?YQ_IP z80v6vwFHo}7I;F)SO`XqHqL{`PG1NOzvtqwb-4`su)yRQ?jyK-S#!FAafWicALTmF z5E|CSxDorgoN{~29bwjD!OZ)5Xd%KCGT1jM*>rN-FI78m@tByvpv`%pri*GX>LNU` z)6Uh?W}mR)Ttj$D*BwMp0tN*?Ta2%{2+Iu4 zl{pAdPch74J+#s^k8@jB%5Fo0VZXIB_jO-GN^bwBF@}CT#<3v(m^|xaTZ}_n!w@lT zW*(ESR?J!(*arkK-_l^GK<`Y_{E%Dyn0frXc>;Kl3=?|-YkC3#xC82yUDnb9+KBu@ zkvux$V7!!Vn3V&X83W?P+!buBUm%%^+FDEWn5}Txnyn!mb_EOYm>{iLNv`3;#RiXb z8Ho`&bTWikjO%_!aOiYHQsK7zY-WsxXz+-~07~SX8Dnh%LK|4McJT{o^LDTlGniL4 z_}uD=h8PYz9_D;vZHr`!$7F`EW+K|<6prLSu#RN1fJ#1$rnG=c2SWc+>xLM|&KL(Z zuN!kC$V1rhHe8l*Y2$F^Aa;r6G5Q{3PB#gQx{mO;Rew;(4O)th5Ej8Q89^mxSfXpa zq#M~R96?{__FOl*2;!$K9@V=VeUCVz9wAD>J~EU+8?(-ShRbTYI%cBUSa_Tsu@G1eNQ_UKGb<=t^YYyRa*Xf_};Iw31HQHOU7 zrjrO^?~dc_iL6_W|p$CRBWtL7)oFr^IiYS-jCB$zoK`rAJfF@5hFo6~E8KOSo{5tC@^ z2q6sdici%!vV5l*lILb0sBhWkW`HIUEz5%z{TLA)MccAB98<|870HTU)Ha3533L{3 zbetCHlW@ruekV8G2GOsDF>!A#s11Tv4MA%w4O+7g81)Otg!mtDyEZe1nE7V%1{g*| zl2*Et@`-|;PX&UoU=GX;E@M;?!hry16I2ndhu+s&*B5i^jELy%%KK9(Byu9;dWdj|xB=jMk~qj-_ECbSc3gC0i= z#j%VXXErm&pyIi3#(Rh*xGb!>3`U}tt-1(oxU!x^uDCI;PNXRIx}(Ph)#xS_sb)hN zg6gNx8>b4c#uGpF6>8ZRH9a;`tV5+HPMlQo87DEUP}Q-l!{1f*Svxb@Dlpb<4WC;K z-wUu)6-#r-*LK|W-0Z_o*blLvFjG@XFx4#>@o`E+Nto>N&LSv1w+UH`Gp5K7o9D8+ zfNx}hSBClsqN7ghrdXt7?Yl36a7j(Dv0=~OwF zV}-6R4Cw+s2^NG|S>sY%M=(+2DXE{(mfo{1mKT8*EP0hY=an*~RosR!e44OVny`Gs z6><$#ucxat&Z{&@tF`#5wbiP19jhUU)dmgKM$^?M=hbGUH5Pm|R%$gijx}Ij5pkK}SaiUJ3xbpn=B%{_Mp<0JyOb5)lE0EZ2@K zWMqJ6Bk+O%IS52SMMX(XO-VxoqNN2uMMpRLEHaACDi>A>UMeIa(U)>d18Ng zY<7m9e!+PAQNYMdL$x$eF!Q3N3|2NJ zID3dIXXUmvL5--l{c#rsy$Eubvo;PIdzc%}xj`+<0R8IcsHdB5$eMeEr*$^|Z2@ zWZKq~C0zUIA!kh#nok&)r-u*xpN12Vg$$( zzyXp1kPaxwDL|A|)KoOUHX9u+{ZG)*1NLozh1>tu0UVqDl>?Zu{QUteDgStY_e+4s zO8|pPKr0WV7$CC%bTA;Jy>*hj*?7BF%>w&wfbji~W|F|uBftUH-fj=@2FdkNP*PG* zzJ{W*veM0aBq}Ous;cU*U%%1N0A3;i#yAH01|~+PHdeMS4sM>VKK|Z8VZo8n5pjvJ zDd|aBS!ucXnMLoj%PaEhYTq|ERkpX)b#*rP_OuQ3bq)@64-Iw?4|k7^bWM+UEKats z&bDtYv>z;Xd|&B2S?xMq>puJUqw8$#U&do=7!d0hgN2W zmuEgL&3s;%9i5sV{kSmNu{c_>I+C#Q*<ZJ=<8U_bdA<~Qz8re75_!Iwc(R&vv|75q+P=9uwz{&owz|BwdhP85c)$V&5WxfI z)-V}Zg8|g=fH%t@J(F)OS%9S%U@7ibn)p}Lt=I06k$C5mYS$htj*Ne&Ze>(xHbVXz zb*q#&202RAwO3QcwMD{~V!phJ1G(f4w>wgxFjbOrZILjh_M1h*%9LX9>o`Yv)LRc0 z)XPt5fCtMv2ften7M;uhN^Td&pB^mIJufTt9bSmsxJMdRWWVHgxpj{;-A(Mic8~lf zw?=Ve|AuS}f7L`(cWn>jJ4RSi|6^-n2|0GCso{9fFdwQ{a<8PZ(SBj1@Xg2O{ASzz zrT)|_6Gvce;M*3%X-c!x*7;q=1-Cl_QJ8#4^mz*&+eoqto>(Gr^X_QX@6w%cbo0LY z49oT`_@Y}dF8a|{uYUC9~ zpo1B#I~qqD`~+`fIZ}qedO4I!M1Lh(xsMZ*^R@89E+Tc8NxE1mUH#Q~h*qUe-2bBN zt%KVB`gLsx34{BO_Y}aCwcHDZsRdU>Rf3<)7 zeKUKXhZy+n(S8Sb-LbtBDtf@zg{{K%!Ux~5<)oY3(f4x?H5KBt4?a0l)kXi&wc3f% z(D!VBOEXoVoB12V`H;}8>-n(QcIo+uFq zA!mGl`%TX+0%@;B7VK;rSKqRhU$1#r9A2*{ZVz2=q!_y2Y^FJu-)wzGjmNhU5j?j$ zxgXtccMD~P;>0&=kKXQY*qy(kshyPTqi!4}hyXI;NWWf<7|gsqQBZNeKYd12aep=> zdVGIAro#JhF=hDt;d1Wz$nbu}d!lbWdWy12eXlNT{bi83mRLgHd|D)amj~c`U#~kR zh@M?v zmqLiNYd@cGb&~7C3N6MD{&*IVp%79c1_IVXe7_UMDC!04`?usGlF8#}y6U+|V%E^t zt_08Hd^hM>AOBD@IZI9(VuFlc^F19Ij>EyQUsw}UJ&wzXUwN0^v&E;#a7929a6r!f zk>J0g0LJih>S92{J->OMO&V7y*EgmrE;NNFuj(X& z3>^2rCi=vtQKV)#Fp(NQ{vJ1Em-X&i+0lJ0WgQkFL>Kr}-{2sO9|T zh+Q1FJuqM51G-e%GSe(OOul~z_9Sv!a{8(|acc}0|5pLyuM_=O8O8moN5` z1JBh?0Z;pIPPjrYP8u?uptL!s%~~?)dUEk>7rHLN>k%f}UyA42hzz8y#55;^jl+dzq!lG9gT{&vx7@l{&7{9fyWDJ*v1X^A+>q9eL}k5DxX0vYY@UNVie@V z0~V>a0_u5s_>ZR_nRUR*wYq3(IRxdYgJA8i9BGi&(-6x!5-SgG$xZBV3334BjM&=n z^vgJ&%Ic1STYwSZE7We**Csuz-BE(enu zdNcB>?WJVYqr~<2(lP~+K&p!%rAKMgXx=AXCLy2ATK0@uNEDu#2gNGYuaWdUQoeYT zG4%IztMtnIeUVM}n6d#-o2N+ieHTb3b}$q4GEL!G6$k6(z=U00&sgb}Fr6pM$<#nJ z=iw94G<-_5)@=0Jv{{Eg*13c3JF0@Me727+zR?e}<$QIU2$TBub?d!TVV}m4XU5%P z!IJ~%u0a>oR;4TM>17xBMAd7b(%CawMtw(4m_p;5uJXCcFLk%a0YJ&ja9DrGjoS(P z(}ek*_{MJ5r>D_>(wFdS&`7wnj>Ehb*DWW-`dZkVjzj)o_2cyPAU{5C&3a#jD${EcJ6qsgVGznf9>=GUW-<~Bxr zGIt-21Myo{uw*XVs4_!CHCxumMz4DtexD>dW~{Sn-VB%`&!F+X8~md;Bkz#si0!Xi zqI9kC>QXAI>Hn`aA9a4?Z~oWw8>oFcD*vBM=fB%_ z)Ezh!XziapJL;zDf7$|3o!e}6T9|I^uz|Ks~_y}kXs zy#u|ygT1{&y}cv7y<@$-t!sO=V|VrY z-fHXqYRkcD%i-#`!?l)wp7qv)jkf)*_Pw2+-Ti^R!{NQ7(cRo=QQcRTy{`$zXjXAj4h568ce$2Z86JLKs-^86lo@qoPi&j

K{+Ck~MX~=I6i4=-FflN& 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%0A6EUMA34bKQdndxuB~i#F zt!twUJN<(6{)Ik*#+(Ioe@>{BGij;MV zOjL?oMT){$iZoud%1e|q7<7JJvZi&az*zJ~Z}d|FTyz3VR06Vb6!LNqKp+b7&In1> zDQ!4`ZUhYaFbH7n{RP7zt2&`vs;1jkq*+y@TmDG5olW{Et*a+Qg0@NP}|O$H!?6@Y%ia83U`?7c_~- zTFBjUIg8dg@$j)jQCaO#Sp(K6gS^?lD{_|Qau2O@kE3!=D{=)_lktmur71<1fsyXT zlCp=et*U@wqrA5lmFJ4Qcldm8`g}7Z{JR#5SEwhjmR0E7Yn0@AB!fnEii zrxUCZU)r)0@)a;2^a4j}gMxX6^6~;VYK25Y&rW7jNScN6nvYB)U%-k`2#U(P5-k|n z$v;IcLOUxGK`0iZFP4xm{=bMfG#ix1o#IC$lN-KsMNQ; z%mSfw2(=L1yF6UJEIO+^#HZ9MtL#6-8$vOx6ʺA^LuU^}wGSuwD;JcYipNWQYf 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 z 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 N$@MON|NR9>y%5Wf-~ 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�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%0Dw2}wl9C#elA4i{n!hbMsRb#iB`KLDDUBT|pAV@> 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 wvH6=F>-Zhu4`O$FWdsVJ14?BxPPffL`33$ zTh@OI-2V(K{-5mshJlIs5eEnN6CNJ^|BHYCpWy#T_+Lc-8!<5vDHS0(A0DORM`{yv zTIUaRo*&qPKX6B&bA+I>`hH+@Lu0YRWYYY|sDMkuMn*|VK}qqyg5rPsx0jiMf`@`a zl7d2of zO{*A1FBi@#63E5t#m(c&$!Wzv&qqT;OHEBf{ePhOm--L7|DgXbhW}#x52pWO{x6pQ zU}a_H;^N}|zwmK$3-a&?@bU`s^NR=zi;0Pei;GK0Nd6-$E2pHStfH!-s-dj@O-1vo z=D+x#m4>E)vVyZTXOIjvP?ju03jenpL6Q<#k}6H&SC(`=mJ$oC%A~T*BX+DJ z^5|rWoDxmhP)T1g%boEk>W#@MPfX58OUcYl&dkZo$;r;n`H!N!g4)8$+ENgxe4wpz ztfz5$xNmA=bb7jXd8u;`(tWkt4?P%sIvjr9ox0lC*jQO#T!O4`?(Q8PpPZhZUHo(T z|GB!ly1u@?xw*N6LNA}6k6^IN*Vm`#=hxR)*#GtdyL^N}US1boZwH}g&5t|z4-nwZ zw9#po(N=@wbSJQVGNWRxrWo8^zSCcSJKy%Y)e60BJAJAE-(*f-{TV)c4}+WfK>E2R zrzhk+F0SQ}HjPro=i0o1XhNRv>%+DAL%%3xqDU3%3Puv>A{EQ6&WM|xAcL_q z3X>T^e+6BS*GKA$r?MqOP|1`UN@nsuComh0Hk8g4f5}(M6#l#1khs|79W7M9uUcl( z7e%JrRIyTTGgoFb)>OIH?7TC2XN$+uRLO0-nlaW~4e1I*KqFTH)ok@e;IhywtE})Q zdA1zCwu0*R#!`6fz~e3T2U9sRBn~eiOMw*c`zXLfYvajMjrmxXYFm@tENgXUQpIZ1 z1*AI!t@*Pz=xS#;0fD|lQ{cF2AW=D6t>bAOuv~9<;U1T9cd^+Ai!MF^Jt~jz;mK1> zb#^@8llTs#t7nUQUR>UsKp-B^9)CLY%;Wji<@ycz*u@m$0^YWUAR*ZDgjs%S;|Kj= zc;N7O;ad~W7(w`!giHze%AGL@q>ec>2`VVgq!6ju(6%($cLi!$zBrqYVggw^lM+H^ z3|sNCm^wL93P9PMKm<0XnV=6!^u|B$Z1r{%^{l*cLRQ`l(@G)!kTn&>`y-T{h}5_< z7IRj^NF7c32ZYJhKkgM5$?`)_g^Q!=>x9tR<;rx1hmtI#yacA~R808yqr-eFI>q<` zN+IvKLgb|IO>gg5MS9>>j{cXJ4!>n;4}r7@YANPAJ@a2M>dwzQ9%90uEI1mK`gbHH zz^F&n-AZz$l6@YbM}_aAY^_o)@yASaIoXB3*wVlRQ8=o$EtmDl$!^S zoPm0Z%BwU6@K0v`3`rx>74yW7oThG&70{4 zXNl3zT0iNIe{G}FC+3j1%f<8uPS0%8hjt0fzQ4k)pVD&xRLlW;RG{)6cjl5f)NV z)A@tBS>+*)kIl|6$kA9h^&di(a$29truCegp~86T86yD?WARekznNBNPhhKritBC0 zt`hDs_-s25X&&6yn+YNFWKe(LlOxZhH15Q&nMV3o&Z}Gn4l&uHU%c+eR~q`3!?gh- zBDsFi^)_1{x`ZmPkb*9JIo^1g^J0#cj(DEK7pu=eep8b-{d4yh61DGLl561`xWe^R zm8#~x4a4Z;FEMuYgUvr~4K|fKbf~x_xMpxr-t$LV*8HIFU7z6>i1&0;Ga-A)M(yDd zerHwSL)`*aFgRqb{t#+sTu&sS#UG3H`yv>2P(yXGdtaG)r5J$t&iLcSkSu;|ba=q? zI%@GUFQLDzxo5)C@nIw7*-E&tQg@2f9fNQP_dwn4iW>5)S9FtQ0>G)`&>Wgt22p4?DB&o zD1MfZk*!<&I`tgVEIPEwe933d#Qz*eS{{fdWKwJZqN3W4HwX>R6Z}Cmx8U>g2$ME zwA0j!Q^HDs1)4zzE`U2hsIFP@D)j-zio=$>ILv8z%$)8s$%k3`S&kcrY9B$X>#2Wa zM59h^>LiI{jz~}qe=cDgj!sn7N@IJXK7@IjQuszulUnX8O*O5BT-i*tDd@J4lT4nY zKw~y-^{-eRX*gfw$X82e9*fRrE05j}#V$(YHYIf?tMg1#JRXOcR|%WK65mIC@Q*+yq5=xtG|ZMrdKolwfRmP#9WUreg0ysk}030If@5`(v?`urlcbtG8SWH{d3QJ8Zf``!-|8LPi%>-Ef&M#Yp_ z8r1WlXgG|^z8Hh%_7lgCp?*>OkDlEEvZ(m)BPlYrfbBE{RGI^2hg_ne6?%Pa`!!OI zhFi zJc>iE@RSe1`=q`^9aQ)Y*;HoRB#~Z|A?y)}#-uw$OAnOMj-PWpGi;^T_^09cuM)V7 z7`0ERdv+#J{+O~JYo4ksluZv+ylV$vt@gEJ1vN-HtL9xT_O+jD%droVplgSQEC*Oc z2tSEB=!cuPF9F?|;@EZw%eNOCeK;a(GLFTTTKk9w-J2G^MHzdp&5JL7ivO6IoE9oP z_CnGqv#he`%R)Pe#?BZ0YHuxik~-xNZI-^BunFoTX&M1KRX0xLdHSWz-;+5VX!V@O z$;gflOx6s*yfe2V?~}*Sm_S9!xh=PG1cOi`0iZ^K3q{NN7UD-v5x`nLSJOc#gx zj^jGHyFZ!Y9*Ap-dj?qUg)Wu$jjk!(dX5n_9WW@%v&>l*MaQHIpx4kjZBS)NIGn3% zcNPt_d0R7-`8<9c^|w5-A8yBjw?JCa_DzXV{{~C@7tFN0F-=vdzvbGx-??(_K$&4 zq09S{c{<&im=qS9mn56QEn%Y#vov}7EGGM4J=nC>uy_pm)-f2bG8kj&Ifx#hF)z74 zKm+QQ0-vo7fbvc|IqqFczEpKV!$UquwcdXZyz3bJ@;n2nxPw00{N!g~DHpKifci*E zyG|7car6dB9%6xteYd)OsRe!c9{dEof=d?yHt#K?n_UnXL&V`3@+E(AA(+5f8=nHH z--fWEmbRyhKOml=3kN^|y(Q~5K=FOJ!?3?Mqx~&hz%4fV^^)_U2M__p-_|A!mYW!? zuiz41;+2dNVkBsbs1Zne7(yqA`lE>|MKDBEFWl=P1pZ@ak4{ipJsM#|IDCl@Y%^#J zE_jt7Oi3>S6%-i}VeqQ!W!CJsv2U@7Y;u!hKc-*@LN@OrbStYtTV1qgkhi^9umbHz zPJ3BqE}2acI$%g)Ie1t$Bn43q8OP`bh#b;Cp+rLjV^51>QuU%U3nRFHdpCJleJcqU zVDvFz{CBQ2={7)MNr+uj47HUTWm4eG`*`jHY_|y0NvOBja2O(ytpEE6IFMIpgwyk9 z%VV$K?-(LGbDaro^-e*-Qvxxq5!CGueglLtVB{EvBa30LI7R%ApnX`3dUzm_P7I<> ztQjy?5)_-Q_vhP?%a)C60{{0uL6^hj--U7kWjP;}Mn0;Rh7qS?E4BQk=SoyNz|~Pq z%-Ik7yrPGTj895LV!D!OB$QNbnq=Xvi?WScY2sIwqlbU>S4A=4k}&Z-S0cmj#J#XY zog*uc)TBV7lwf^)V?{ih728&m4?JMb>kLle+ z8NEUo{rVY$-WkKG8KW&3<0~1Hj~UZMnX^Kf^ZJ>K-kHm(nX9mt%=MMbH6ipRTAhV% z9JU~gv->|6b8sCV{5X;x27_RC5(>@gdTI0s%h2hku0 z*(c|HS`KP!4*F^i=2H$faW0Ne4kvxv|QrWT+-EC@~2$N@uz%A;sR;m0$GCsd7pyMX$4BH z1uClrYEK1Uhzm7^3$+Xib$kl-(h3b)3k_Eb0Z)a1G}Mwn)Z%V5t0=OrOSJBqBC6FQ z$EPA^;^H5|#cl@09zMlhX~jOR#SUfI2$#iy#3jMPC9qI~5};2>L|REyYe~#%N!(LO zJaOqC;nKebrAa=eDQTr?t)&^OrCCp zR4$g478_*LxmB*OR)U`@H;JpZg{yWAs`iB|SC}(~giB6*s?MLPE{UtJg{yB3s-eVH zN5UEXUrKhIt6@*oa3nSGA~lHLY7Uh$&WKAs*wvt~)nGo?V3XA1pjACGXFMyFyb9M6 zx7Cua)sjEgQi{OgJ*T5R7t@i{F{alsx7D$(!Rm&E>$<&bL(*#5zt!{m)(fWB3!v3^ z{F{%;>m^AVq(vHJ(W*sH(z#hmc)vBMtTm`TH+=b4rqGryPSU93+o+e`XrNre`HcE` ztoj>ClbJ}9#Yx@Q@^tNQP2by^?AMwQMCvMz8{1PGf?69KeVe_~n|*vMjmFY#+nNJO zK*1uQEQ4B?u`*Y*rqDJ}%o-@puEaSSWMfzH>sw2bZ;MZQwM!dDdU?7VT8T$=OP)w; z0a_!_7nCs8SlHHDvDPYF-tuFtr8YV}`?)yxq!pCj*2+>_bJCdEh7r)#)+^H9k5-e` zmR{e6(I^7f{H=ZRxqVu>ww0-+EmM$)mI-m&^zVcnKKw${Ez(zz|tnd;L%XV>vp zx%0TK^AxRg>(;LBeR}6zde;+4=S6xtq^%2%w0ml;Yl)>B*{{2Bt*e2g z>-~B+reOqf&juiNfzGodRX&;5RAFX&9y(=HB5gofe8ExIp()=D-r1qbbU5+YQ|{ePGw_Rb!w?&gXgOAB3 zkN%~{!Iu*g7h;fQRtVH+;w}?169aj{n0S7LjGsc_v&P>6HV0HT->Z$IbZ&N4Y+_E1 zVUTZu(6>JMkKy`n)!T0oV~!Dlw<^ZBC_6_f#J7uCx9QbJ>9V$SVzyafBP_7(^wVwb zxDhVE&R>-sLGclR&YfQsJK~eWV&uCK=)1E1!!rK6A@;jUn8S+TUBB_&FP%f`;(H#f zdpdw2?W{eQm_0+xp>MFgpMHyGfJsxpzV+#zP1e47$NstMzM~q%f&AbHY~HOC?CO8; zgmD1#0YkjO2XK=If#RD1;)lrWhrq1Ou&hJ$xWgFOW;E;&=lt*wVCy&Fh*0e)rE@E} z^N76aD2seMll+(#^SHo&JKz79+3~mxyj==D=A1mP5#Om6KjCLTY0BDZ%sLT`J86gQ zw82iK&rf;*yFGx@&uXW`ox4Mwr)pKFljM67AhbN*)rj%Tajy%q48$>iCl z_`bL3d4uD@e$~ld*7-4e#;N~^HS8R#V*gtF0s^=&Rk?V`8olqlFs!(Mfk$7-FLlu` z5xcss{4d{goTEw%e1Kfmj$dM5^kYd}HL_meXZPb}U!B-pl0vQ!-mYX$uc)(OV^qf1 z;wsmSkTHg?Yr%?Z_Fo+&6gS+zu6Wh^cmi&EV$OvrhS?xDtmrqA6750~x4kU4^3`o} z*|#mxw<;H{%5S%m_BWbXy&A@MA5`x2s(W<1?q)0Q01`b$6wpOt zM*;#x8HYMUK(-S1AuRVE>LB;*`@raXKc^n2xBJJF`{3-BAmfJ{<%fuXX5X%deS2u! zRA(&3l5)OD*MNx>c;HsC*A0$3dmFH+mpz} zd0kgex$!fU^$Dcj-rV&pckKEM54o)kcmbikjK1}b{Hv5!jJ-@}*Y`=h z^0T}y2E0yXzZy?Hu4g~2y}epqyl!(mZW+VuoL&wupoLwqeRbG5N9O{?8%6Z%t?}DI zz*`{J+mrFl8RQL)OL9{(7zu-1Hs#BfG!TPKJd{v_y5Dt;70@5yvMnD+CgzVwq`CX~ z51ne3Y^vs-QWBd{XDHEE`r#-d2eWpbuLo*bVn1Ps#9D`6^5kO4RrPPI%+`C8Nlzaynb&^EDl8rBW z!?CE5LJ48Ml={F>z{#{4Q_d-aA+XLUjVXc1)&CCvQ>`p6!|kOko-TU4EWUB*Oy?)_ zf?D}2!v-z|vifuv1&RPtOa;ntTJC1@Xj$%&xlpY-MFt^}YelAFl^8|l>i+9$#`@hl z<$d;c8*z>y+Jp+WFg*^Rms%2|ZE zG?pB1t|YEy!%PsmJFlh`L1M$K1XUyNS0Sc_hB*PQJKlLNA-qN{4k`&v^9(EA!s&6m;^F=*=`Utr#Wl?YW~YKuF=u_w}3SF<#7L>(0t40je}KJ0%A|F6ZrK$^Ctmde>1u{)oWK*-2X8-(G$G8 zpRY^gb1absd-`3uB))UncAw&VNeA=yiyjc@+Pa?mMfekn0eJfvwvjBc`EbIK;{S5j z5fBh?cW>PBM9}T`E&r%Yph$RTao&bT0u?j_P+7PF~q?tLT$JsPKWN~#9 zrEyQ{qdZF}T?PIJjgku7s%d>@H`7`J!aj?hcwlGR7Dkw*4B0+&xY#KkRuE%31?G&7 zG_P5CR7$@d)$hn6gKb>xJy|9obCfnK9$sxpDU0LGSA$!#!dAjTm7w1-al|`Bbe8gb z^vtmi_Mb?$K9>kge$@EUuv2)Rq;Ops`|EgZhvHp}fE0AbF3dig;v-XyFgv%pm)mYJ zJkiJ-)1N;`8M|~`il0?iITA7rbLgZZyVc{kgY$R`5tLI$(enNzelpx+5jj-S|IV4z zNJ_=#@}c+JId@p=ZQ%!B7|}QZd_oE<={}d8jf&+cXX?Z{6;EztpS2oK#B4(mR(a|K zjafpv?E1by`k|@|Ggro52DQ-4hXL0rp6Fw@V!Sn?see;(mSM($*qDv_&nT|!S3??! zcTs}@n7ncDd?h4kY11Oqe{6(<+z@5M%*}3$2$I+%gkFM=fJ4(8+9h1 z-93-e{dXKlD}QG!t&eB@xb2a z^>oHT(cjc5*_E5@1$t|#gyqpNKwS36Gkz`(A2TnH1`BvHTY22H*`d_iLhn2qRo%1c zOc+M7RAsa9FN69d{zgac%@A^}%^Np~pG?$KQ`HM7*cxWR)hs-`9 zB5j$P2wM9N$=2vzpk2PrX*tUa<2<^%qvOv>} zYKAkcTEyIwt`bh%Xc-5&de+K{uV7-iw^FO4aW;quxuWdeB zJw#xWUjaEXwnG;02KF3WVzCCc5W)rfBrq@I8T@u%*&q8Dz*l(%q`NHEEki=&H%itS z`{6D^Bc}d0X>F+oQ9>=9u5s6yZ+>$;0#7Qz{ujAu9fyj#!n3)U359cQM=AkN^QG+W zmCXgmSDmd3^o&emRPiI~XgP$Q2 zgHAm+te0W;pTSE%?+2dAuI8#U1680$)67fIv!`tVdS@; z9$$_qsGpn?I`4{ff65q6IV{eJ-_=$NoVuuItzGy-`0rn}t+LNnal7t&1U_F?ioNWe zkUt`s!Wt4eUUwwkG$xxnCG)V(j$FH*RxbSOn>qYXL*AYjvAXJps$tjpZ!c5oZ?#Jt zZ_vKC*Wq6hwFlL2Pdjh0o~bUAHHmkp5^!2T1levxt?syy&Jh+#hzJVO-)=;UZsd%p z_ZgBO8YH*Ix<6EOV}zojpGqPk_KcA9Ao`C>o*#c z{jx5re%inMENeIyr91pyyFXshP-N3}ptCJP*JQvUXJ9o#4lQ*+`!?2aUM@OEP8(g` z@K#PKW5A$YE}BvP@8@U}l|dcDK}!*NQ@=qQUilb8`Sb{BJHrlbH~Ga)`R@8i1KL67 zm-lVMg8*KIG)B1v67(NhgYFhX!wEyXBywNvhvq~E4AA7X+7&!u;|kMuadMQy!MwvE zvcsWT!(kS~K)2!W(BX)`!;uBUQ4PaUw_!2!!?C-=aks<25J%!ajr^t^`NKLAEj#j8 zYb4QPB*|?gIdmlD??`IFNLs^4s8(o(R;a8EqFBjLKLRfQ7X)5T1RlbWe9_S_Uq%Zp zlnP}>i$h0C{*IOwjFvTwmiLcV%#T*?j#k}{R`UXDK8@AVj@9vw)ys}GXpJ>mj5XPh zRfmp&{*JX2jI}n5we^p+&yRKNj&Gh(JzXnN@Q z@Za%~g7MLY@v;8#@%izI-SNrW@u`?`0c<5+%85MI(JwjSuz9VC1$3l2w~3`t)j3fl zt(=L~f(b3`&}FxYqTPwb`3VT(-!C}Y8aRz#(2ZsY!e$5)XNU@Ch#NKVOM5}vazV#^K{rfW4{t%gaKWH);oHE1;lhH^-U8rm!5C@L1W!k!@C%Y$ zNbbDmZ2zpK<)W4QqIKA!P2!?$;o|qkMZ1AT`vo0j?J&o?MJJ<0-7lf&+K2>|8p1VS zMSh038|iunhI@uBdEp^>6fOxkhlx3d`BdrxU^T$+mrDU>VXO1HKJH6ie9PWs%b{e; zz7x7(|Gq%OmLn3EBMXBu#&N`lDVg!VTs_g@Rje&7i6-STkXqHHIySwKFkNrPwK|6|F`KYPqi+BZ zvR%$vYvnhsz;E?(YhK!G?RRVK4r|S?Ydv)9y?pC^a_jxthFxqcgYN4?Ve7+mD+7gw zAhyuN%JuOML;2zL$-DI_q>X93jTyQP*eu`1oZQB!(Ndk|Qnr!q(%H&#;>Jqh#%kln z+Q7#8!p6ql2Ka6Rf&@-b4GSd$tXPI>1+MIb=|`$Ai8zC6!@#v-YaNNj^P6>J9r+AagXE`tvf!#$VRJS)LB?vR@Sz}Zj8V{qIftc7yx&i~A1y`;O3kY&E2N3~O7*P_55l^6{Iz`)0>vhzvSN;$Ome zfo4uQ);>*UKClNME3!HJ`E~=6ITGAqpbnfT@W6`yFht%;R>wxv3K`i1&MIZcN-$Is za2VBe7^brez_wK6+(U6hRQwmqhhJ^Bwe`Xb9nF40ZQ?r-6a|j}k~>uRw*Pu0{@|Pa zMLseVM-sRBceSC3S+=40$GP;!dHl!u^2Y_3`-j@cMIOh+z~hpn)!Uy+?a)=tCL?*8Fz=hjdMYg2#g zrpeqkf4398q$ylaF9H(&jSb~ha14R7>AnoRN2Vw zhrxd798Du1$x9-Me-6`?M3RvV%ceh@fgQ@f2g-x@66wuW}wZT|Be`SV?!^F6EceUI}4;Q3*aW0^b>Th)0k`+@xMxyfS4IrRM813*&*@Os#$ zJwM^~IPrW4Z38&@zOZ|Z`=*1iIB^<%!y9+0)&mm?x zp;lhVx{N?xLF6|pAV;?za!#oAWmq`S`9lD5pFgsszq8V1n3YK=3d1Fiz|}hxhZ#%< z2&RJ$zx^V=y|{_XQry`_r|m4ix$&X{*y;#UWvf_oCZdOA48EWixTfhkzJS3TX|1p6 zJ+B$UuNjlC4}nh9RX;+&=OV*D1a*GUsYCAEb-fRNh#j7A-8(kJknaE&T;wQPoHytA zP7N400=j|EI&eH3Hv&sHVh1&&~hU|kb!=#sPaV}hcEh7AaxroJwnjVg5Q`(B@g=y)9sbe|l6kn-_+g?E3cm$5p z0C(q5x5T(Rvh2Haep@LNs0jholmTic05w;DTIfP8t)W&I*G%D1n`EeMG4y*gR0Q;c zY7%P6fA$N1+tJuuG8@1_f5A27%A;_@8-T*?=qmPheTDBTED$aN8*=sXfcg&In}q{^ z9^Cui-v^*P1VZj*B!D`SNXCM0#)6?%g10i^z)<4{pyy?H^KB%-L-deW%*CzF{jCNC zvX;$V*16(u&$~ZPmI6+QtAH~d-5W+Y%Gn>&l5boWrpuF4<57bAG1-O zatNMs8J_Y4p7Ir*3Ur?et)GfKpNhkMteYoFJzf2D!?Lul<-dekPgy8JmZ(ud(ZIuuwExGWI{Okk_Yn~FQtQ@5EPg>XCOG+Ylk8* zyys6VDSDlQ*bS zz#@g~5`)t+#ap2#?0M)dP$4XAD&Qsi=LyPtF?bXlR+~%8-cVEmZu`Sas{RNZ2F(ha zE9$`*Vu2s0hgUSi@ze@`SZ%LqNB=VG*4ZCj(~YNKdS{mD$8)4j?M016kK-u2Trpv4+0*?(`B3O;Xe#ttLz`S_s7!&T+dHi zwsxlT6gXb(pLmbw%XI4<&z|^BmnjtIs$TW@&(~W$Z_dx21ui!`9B?_LX50PWPR##~WLr+(mT`$gGMZ6Lghkju>!9<^KkC*CEh)%>_9k=V24e_6P=+FK6HPFrH(Oxt7@_DF2rPsu1mOIbv_xKZ?vPvtjfAz@^gOezKtk9*HMhVfUTBdo^r`eXZ(5H(49{1B7)FOj2FlY4{ zvb>L57_xspJu>73p%QPuQ`B=Q!BZsNq{xWf7PR^8DLtB9kYM1$RFwL?m8m$>N0<># z$&d?;t#Mv@j8&KM9b7oa@%)u;$Z zhY7qhT=~;RdUXKGdl7qych)<BHW>h@y^JR z{N$Z|4^N50<-3d4P2NA;!x5l3F3rl`v^=ZMH$b18-TVB771ED~`*1VG+Pm($$}~&; z%b(7d&@HG58#ij4E4$J&#Nl~dAQ+WaOmHiV#9webgIIE$v;Xqn9|(S&YBBHL^fj1k z8<#azCHjcbp^27V0xm0P**lmS_$NQ>C#kTUueiXWf1(APyQ=EX2n@E=CaMqW$A-MH zHq|dXDG;#WR5r7yCVA@tuxGfIO|k2>_w**4qjxnvT$kXK@z)`U`HSd!|5%mZWJ;D-c zT7Se1g9iDiA0I6MI|Ls_n4ZX5RG-G=IRjW4K$3|8@?48<5my@>$dLxW_%OiocEDf;6-ez%bUxU6LR zNl?qZ{xwajIMK_R-gZZ{r&gj%sUT94?l2As&DO?!2qxZ%F^w4%!jMECUzd3LDD^?J zMky~^4%yeV#}yk!qvjh8d1xn8{H==fb89aCdXaG?#yiG(s*M&{#?YJ^JMGIcKEQN% zg+$a^D=8hiHbH+RqBP6xkcqC(YAZBmcpjdtH@?gf-Yf^-F%vf^O3$58I-a-XLg=SO z8NiM*9AI(o`T;EyS%INRR#?eBetwUm?*jXay?c0V(Dspm#OIqbv>cOr$^RFV(gK|B57` zO3QOp<2Ea#`p992s95}$90dUi{lS<_mzN!M-cWSHZwN5HCz}AzEp~=V6Yo%(?Vm!@ioj-q(;KjU4s61F4A;d7Z}FvL{nI4JPKr+CPmI zR(!Z{*nw~{=R?M+XoR)sgZ(u@@##(PhlCb?qbeM`x&uNXBJLy7{$@5c(_?f`;E&Ti z-1E|QJ51*K`&NW|#IThhYm=K>kB$Ti3aW}W%!7t)*66l&!mB)9x zz?G-(v5KJsWJ)EZai+adZvKq$1}d3ZSI72ILV@gmB`}Z z7QoI`nfwu0H{aocx{)2H1B~4_k$6BonEo|CaAS<#e+Bj8cX9$B8BF1kKIhmN5W~JEf2H-~DMBw-V<`o2%I8t8bZb z^ykUgVLcFMFTb?MCeGBX(DV^ka=Nh8xIBNN$s@sd9z17o zMzQ5pAr2klqPG9#x0e9AujfFHbftLN=b;!F_#)3`1>v;(OZcpy2D^1YhmrmYSlCOx zdNgAFNs85FT1@EzotnXrO#!_WrvxM}Nm#tfbiTos>UMwYscrU0YXD;OgP5n`BFTbS zmL+5K!Fx#W;)r@!Uf_PyNg)ADkj;n=DpL+J`*=@-ex*t=!{W1!@K#WQH?K8LA!sUrXxIoehZ_eIWVEyT7*wY5P>?=C`+0@4m-a}cSxJ^MJDyg*x}U*q_LvjMH6jCf7p(Eq@rv} z!I2DxKVGKc-bSWhkz`+wQ_XvioJyBO9`mtJh!TOA5P_y;nHE1A_1ZL&jC?VZnz?A1 zHYb>6otk|xj}NX-AOqocB<~p`U$IG=BaJ3HZ1;1W-qW6mGAhMYX5aG&SjgEJn;UYO z39o!j`)~*565hHsqKM4w#c1kfEF)C?LmNextNd71XF6} z&{i;fZ13HBghS#E_Dv&1;+OX4&!hGT!cvi>p_iiTE@sB=Wx)>i!8G%c&k0g8iJY+h zsTLSo7W}hQ+K>7WYrWVvsn}P?CJ;ugPn)KP`aL^xHbu3-CQ7&8k;kmXYmFBot^1i=Z;w$&-TUfCp*w8W`PiN`tOz%&{CbOyt#f044% zexjNr7aSz2vDDPy2yhJk!*48re#`^U%#N9hW3aD`|D6bj2J<)z+l;A@`xpmy6yIvA zZB~{~Z0kbKoatj(q?v7DfRGA4a#=khiu#^O%~b0Dy}XzCHu1Z?6@)9TtN?m+Udfd1 z_&tZ1`JV15AJdLc(wGwphFPVEs3pvB1$$DA z-I&|mPu57s`8e&pls-Xpm*t&~Hpts2eQ69)d*xk8g#FBB-te@@N)<@^c7I}RB9EjP z(@LPZB~fKI%zk#!os8V$Hqp88@1somRN&&WWC-*0m^wogdSyh1Wf&_`(5KC5K9y#8 zFsbbI&eoeJc6l~s5l%iR; zJg>th5X`(zU%7M*+lMllE=k+k<5bQh?VcxYEvGR@P85MP*&y;oW>r+wjC~1a4h77R zMSjP1%&IkRrgi3hWw7m1lEe3+UFg3C@TYxc_8pB?@Ih47b*A)EQc<>tG1n%WP+sLO z{`p}q+h2MFPL)0?(cC>Sxv?W10j!d+ZtEPGT|=0C?mNph)EMM(LdaU(ti}*sD$N{E zi(C-Q9KTK8sYmcqP64!uDJ;g~wegqEVGcY+{FFDSW-mou@yKk316M%H2~Rt2{d{hR z998X2P8(Tx;GM@2S$jbPe;8;`@#nYwh<_IEWl(&n)Q6^un3is)Vf$!PIA+$}iEVqV zYu1w%@DyycPXU>!hWhOCnn``XG!la@hN)};nd8dQ;SyMxd=5}aGKPM%6ws2XQleTF zX1eHMk1D-f8?9XTVPEXL#BDw2h3DEk-o;$Je8{bdV!AT@R{%pc=d5#H#Non~b_Bzi z6Ope@iO=_<&Io~L7|E6&NwzNIYCg1?sZ=@K&*VYkwogWB-v?abgmV$AAuu!cQ86Mg zQ*K?h*5EI4QiWGtW9&UHIA8N~?+8_c#5r!OQf@V?@60ZaM+gx#gPB3WEP6JvLKSaW z7c7YHUNLQ$imQ<@Y2nH*u*Mmv#yM#FxiK2*kmBlKNht(+jO=YcXeJNB*tgkztA7(Y z!y<*YglIYAxj2tn?0*|wilwE9Iy<8T)I?4c8VouR_GLGiQ5~O~uvlP4~ zEe+9jgb0(+MB74fB=*(eo4I2+jhWf6YN2QDQ2nYDCyFBVPKbTTx$C_Lw-wKRunDzt zAJ_Ko@hI51s34nt$0qvn$gFU7^z3_c6YDwM0j2;!RjqO~uMdT%9m2lILBWseBCLEp z*RlJ?G=Yn}qbIg}&$&w9HxoC={Wr}kH#E;+WxmihBajmJWbHDzu$KyE0*6crFXmB< zY<(U5^A3^y5XN2-+8X>yofmGv_&n&2ES*EUUL8|i$D%Ij%Y7KU&;6*h8HM87Pt3@; z2J$}lGGl=rMApZ}g3V>1LZ7lwbfIVfX!+JzRF6w;t$C=^7LS!svNDKA{W^-NS9F$! znNeCd`?1X`t7MP+FVRip#=AckDKvg9zvY_b|12lSwEXQN{#up7y?dEs>Ya>B^uve$ z$$ck>L3n3j3-M6OuPm6hgggx*6#Yo0$FLfuuo+YPn9$;#vC`tHbfX?4Y{eoR`=Pbe zn5e8+xZH^>e=4P|j<{H6d!@0p5+Yo6Ae{35u=iF$b*|r@F77aKcXxMpcP4HjA$V}N z0158y?(XjH?g4^3Aq3aSnQN^+z4yP*KD&3FI(^gCZ@m{xF1Vm-JoOvjH|BV{y=OoF zUiIq8h3o{?0EFuCI_nMHx}Q2$5ruL&Uh2h!n&f;cZoH$0y;lV~bIdxM9E4gugj_U* zqV$DUt%Y*pJ6m&wI!Ze?1AQPFUz%4tIz~IYW;=x%Iy+O-+I5Y3R@ZwLJA2=S`gF6p zzqOgC8u!kwx6^bDun7eo;mKC`7J#A&^7xmJO|%B2N0RZ>z*eQ zSr}c1W)@lG>t19NfyxUY&4XCh?Orw&S+VS1aS&Mrk57LUSqtr6GwmkL8d!=I`2ik; zt_6u~xO6i$iENH`Z_bMR=oQ)87WsMHy>%?I{q61NgUAkeI2jv_|0MVR-01&uBXYOz|Jp0| zw%Yr)Ee1O71xfWh>Vl^4#KeWs!ytl5vEeajfo*YSQlS6}*(Cn>kHg=*sTqu#Kw}@} zV#y>z>`oNT6%y$*+^N$OJ}ad%8INQkXj!Oa@;MzXwI^Dt<%$Ku;Rq&KY2-o0(`rY! zN@|s=<;x}uCfjIN>egEG9`i zxii(lwD&7X2+l>aquF362A$3Yw_Ro3CrG&zJDtmej%1dNp$iWei`iU>P+XA=*VCrx zK~|ma3^&_VjsBJdRNMyZjaD-EkzZO5_L1FpP!A$mo=*Ft@pOCyKKBc&v-xtVqHg7O z=SsG^Ned37k_->*40vR>zuc{lrJi165RpBx8;j-__kQkrcRILaujcyuf+X9oioHTZ z?*}@S+Cb>a>iw_;c31SpRkp03qQ1++vj5# zestCcGhwcL#ln2H3kl2oVd}gOGY~~{j3Qi_Rce&i{A_?G-7cY{h&stJ4~^yd z65HEeJb#3;9e6SX<+P-c&!XlW-xD?_9XY~<<7_68ytF2@l+}zi`GW31%+t1qppxjeuGH`JMbROEP$q|0rbs1HB zv0zBsE3wZNF`(N7s(X;Ic#Ym#%(a0QtB zUg$R4df5C$CkfUtfMN)wM>6z6+aH&C)*5I=Jw1$X1 zv%OgVcX#7}k2+v$BPl7*MfmwFxUhwY+j|gY(b3Sw=#O<3h)T}vtO7?gt9!y@NO-Ts zn};9U5FIsZamZt1DkYmp2gA)8C)W6W-8yvAf#zw(_@UH3H(@U8v=Doj&tZ*UIB#C0 z{l15jCCzic8K`r;kH^YC73w#Wwf-w*8069-If@~3TATW_we9n@D_~+B6@%!eVS+qxE3OG)0D}a}>R{Yyl0&}tT8QC8vHUGTNEzr1gIx&*?bu)!b zmEp=(Taa-zms}hzv0lJjam*rXd4djH9kta?qTKA^AVrLMf}_YQJ~kKNKx!DN4%L)X1g}>l={W; zo5Gml&8Nxo%veWgyA~$aq{%Sb|M9RL0&ej(mLtb#2v|f#l0Xv3OT?5$J8%~T@6nHv zEjY!E{`r(js-Go4P!pfrbU-7fHMSD48<%~MO?k{OtxSm=8}~XzEtjsSUDH6Dp&W&h z#V^CXGt==*%O?M$wSCY?y-b}49kbz_3H~4<+@JXPEOQz*0qV!@ z2>)dAB|ZB5cDfQpuKvhr1O7#lRU8)VTf!BB7pY+*kx-#B2^Dr9w`nsHTm4y%Se8sT zc$X5o_$^y=+TZE3e)n9V*`O>OgE>h=mEGFpTFDh_`=to{85-YrVrvDpj0I#=Zk?(+ z{Zjn=xhVI2d#UkZ#n_CcVqP~YwqMrTTBGyc{s>CoKdzUXvC`afSACjvru{pEqdMfa z@-xY~dEUphHs1UC_-wm_lZ@3)I5+gKztDkE-+nB&v@~nvUt|O*if#QYOxY>=;uM>? zNn+;SsQq^FHNt>$vBsTKH9pE#OK5|oe?X9b7lZMHYMY^*kM4fUq4&Cz8j_5;KeUh@ z1Q8~Nl$ucya3~ShJNj|qu|?A62fB~U_gz5h$oLPLidUmeS_NW_VFZ}?n!_j^I_gwq zLy*(SFPa0y`q>gu9FR+9O6IYM?pXW$^a-e5i1LzDj;%}s)#mEs&%2oLeg>$!6nW!q z1OVbPAjmD)N`zDRhsjzHE@f4CwrEJF$$Gqnz#$FwK2wBO>o#vgLa=f8-7`GLX6bzn z5GDAPVoO>F&GVrvCU!BAArmP!Rb}^0FPzcX6XCbZcp}k>#PRXmIe)zM1~g1Iyo5+u zew3}y7LAcd*eSC8T?H~RwSk-nk_iBR@Q<-80!P-b#hyZqrJM)7wKrw5YqrcmKq+ee z+crW)K?WqY$3paIv79@9O8L^@cv6&?0pmU?+A5eI|}JI2Sh1z+^|5MfiDy`6SxJA z6cMo$A&x=vA)W`9A~{#Vt^Jd=X{>A}S5`l?o0H zC9atR85}y^)t7Te4Ln%Z9d32F_ge7i=6l4SZIgLy{aG%w;D@j}LJTM(XpV!GV}$Mf zpgIjC_z=-H)JvloLO>Z|`y7!aB=IUMEh}6}T*&XKU?GSSbC{72zO-bB-+x`T5O-@Ws`aIeG?0}5A$29dSI2Mb%-_h`&%U^mrzI4>z*Q2vhZf{I!6lN+MkHqT{D=wS!YKGf zI>5@IDl_LIa;GWxbMfgU|4SL|FE}nMq()~}3zXA94EKDT0T#{6VOP<9r#Lug`C!i3 zU}qR6uIM;@o694A8g7xMCD}yoa)cXI7veJt9^IQF@jUz_$anTX^oZz!LXP-O6xdGv z_=0IHu~D9asH z!Iok`YRBo62ht2O3-Vl%7$oQpR+v2RPQ|#vx$tmh$!J1IBX)jqZQ(&gT+r-F<|ly_ z-FG?04-)0L{9bdnzv4t`9BlMOQnNVZI|2fy#F+Ly{h=nBI6fwjRX%_;EZE?Zg6T&2 zl|AGLN^?Afv@7pW{!)`7WtJ0XG_K+!%l*ehMJ3 zb;^|{RyOXB#`mASY(6?6H(I4waN+jfBaM|v7IO14s!QPH1!;j;plS{xYA%p!2bk-T zSgmQUZqr&mf5oU%#I-1Iv8i6+GjCyduC%bdx5$L5s5xWwbZ=pgpn^2RbBDAd`1VQY zBfy`jEhN&Q&=m(_dswcqvxtxhDm zJ=g9IPc3DyDd2S@(VFMf&yy=XrwL#Quf?vGw8HsGd1M`o(=`nZE2)zy$XZC-tSuq_sw_TBp`9mH0inE-3-2%r26>t3f8oSGj)yZyI4f)`0x>!!UL3cg7X6R*TVL@@Jxg+SoedhlILMNOVK$cw=?u zQ&&QBa|z4n*K2dmo9Yi&bt$J;`WJJTdc_*N9Uo|1fYh8)ESczcuqG~oEpCE=UKy(p zKQJ`7c;l&O%&jboj3u?ZFKS!A^R)PI!&n zwQyJ4O&bc3_U-MQwa!kHuWB8`FCe%vqPG0bc8a);+*>>sr}+3xwhE2x1&fjJ@KfM;4 zy48SN!e*ja9mWRoe4Q4JE+zMlmbZfzGD>P82Ws#eO08=dU1wfnOxn*0v>r=*yUexU zZm>%+ncbQM^D%c}=E~ExaHEOoLc2!YT(zBuCo;QgI-MbU89163< zu*@eUOlzqeCa})lN&ZQg)HP?@#%wX(W9y`1Cj)p5jY$?CN#GfA5F`>3FLEW)a?&)V z%*rI!kJ#;@v07wsA%EA@0tqktG9T6_j`0pxk!nC__{LC;Cfs<#_(dc?yg)dX4SUH&cOp?_ zi)-eMh*J2+)bB>k*7$X|Ae+}jQivv#^-to%MdCCs;#jT{hwA1Ru#z;1F7!(uxah9& zvzt+I)JT8}hsLV(-3#eM!z7eEYQRP9B$?cCh<@hJ?3$UX95}9V4J%1n=g-FmBfumq39Gl6YD~zLXB$`;r`xSw+Xe^#uDML7%^RN$| z*|5WR+&O3}o!jIk3{8JA$Wj zrP`>|`wfY=YOUUUGD9RXg?X`AA^!5>iHk1D@Axdj#t$pcw_WWHMH0bVzZ}};75G6J`wef!^i_xJn8s|;lAAPGuB!gTY?b0V zn9LN5743e$yV&Ub3J~jgeY!p0=#3TY1--q#yu1TG1VEw5fAAV53HuO)#5(rj^GHB!;!|NzlteBkInh}#oUTh_5^w^+{{8Tz{7A% zwT`PKjN2mgCQ=p%lIHQUq~YcXimc=2iK?QApOZ9I6+S2Hn1p{$F|Z&1oND5aXp#0Y zMxlhLU}2?!o8d;7n;g;Jbp?4@7qUawbpe!Z_x;aEho0xlNr&F@i3r<1D1fqKzfC^_ z9q#lU%xc{bD44lr!bDF|Bx-di&4y~vc+2}aQK{_=zZ;x8cG|1Zr}n2*Jht2x&s~0c|3>|c_a+bRxf7_i zs1R?wB!#dY!S<7J4!j`N>mUIy%5_0$W3Nud#mVqKrYoI`BB%Ro^h0W6)qZ%Y(MjU#^e7+M;q@GsXfbO* ztYi`MDwcIO_ZsrT+r#=SRoMMcA_nBA9VMx@goc2EB0MrdYtX|k6~m-Z3bwW1OYs?$ zn1t&tX)x2aa6>>W6svUrQdhz@6kZ=a2fG5Gixf(Tqd(`+;cEz09{B+uC>BYPD##)u z3sEg>0GsgyGR7(&*%V2O-p7yn>Ejoklh#jycaG%8t$A2!%`+u zJ20S`a-CEL{LDm#G_Tqp?tu`v&Ooj)3HWeJR7M}d(IL@gc1DHIhAE9z{1B_2mgE(b z1}l=%8s(lRNmiUUDX=rIiPk)b$-Y${-!&K8QRa$Ej0C47bB2r-Ut5|&UZEa-04($l zDrfCDRZR4bQ9mdsnjEaqX`kpijK3v5i#*e)tpHMLmBI+;jcjDtQ!mWS>CE15p;#I}jfAB21c6ggsYz z0bdauh?VS^RKL_OCUVZ=Zdb!SIdjCe zu<}$fe<@&D=mZGhhIh%>R4TdzcF|w%lYIBg@mA@G&8M903F`X|+-F*VzFEaJ$AR(m z>M)gLPxA$&Kw%CP9?|({zB6V?zbMCh8|a@zFwKSAOqS2@kr!j{z-wEQJETKg0oHGa{-|_RLXdE z#Vv;=Xw0}Pc(DkK1$4UEfnT40GC#fmOuGs(-_mRfS+a#oSAwf8SuiywC$^Jg9>W>F z>@oW?h9!v#Iz`!&eiI9|)`&Fdip1rp)@3(5BM)`DND}WneqPcL+8) zULcAmNGl$32n374ChG5@c9UdoF~atKBoQQo@LDPkd+Z572*gOEjSDqO(DlL#3rv0B zOqb(Zfq)`~2#TvyDn2%;AJim=`zU@)$zN=p#rv__9ZmGkMiWQoxei6`PFi)?jEmk? z9Ov88j!UhF^)S4vaF{jw9Z+-)O+3v;2Ub@Ti+{%5K;2UWcp}nPXYuu$p`I0WE|0s6 z2!DQ*ruu>9HD{JDo>(0qLU?$nL7AUZ8p9WAwHi>15$-J z+B!NE`J-1gJDYc-t8#)*^>svF2;-r&L>L#1*%5yC8bVY*eN;kzIPzim zsGe8envhHa0%d?k*$E_d9NQOdJP!VlL31q*el4~~>UVUTs=esg<;Z>cn8UHiUjC@l zvY2xO++lgetgxs*2pSW58nOupadVJQ2v8yFGS!~cqE^urP;tzbF|gKg@acRfV=>6% zaj5B-muW`V^zkz?pjh~MR)p|)g7SEx@pzqrI5flr3WfxH$oLX-hQWY@0SJ`7E9CAu z{d^c#`l$f$~Hlg%~n{1Tn-U2`_XSFH1TFG&u#d9mk|Wc2stOL`?le zSf@l`g=B5(WL+;VQHCVL@nmv^Bo>(1JPwotcE0yHfD0GO%3P8fL#&1ZIxJMG6GN(t zLaLi}sz-RLS9z+>cj$(iKk>#ONIgQls8A@w*cgQc9c>_q%L)ebx&TqcE#`c zLM;*+f#vC$FE4vW(@d!;%GnnunPImw%O6*$^}%hOaX2rIrv0B|4=zVOXr4X zwwGsij%PA}urpGiP<9-VU)i(TK4e9DA*n!fEX*s`hX-!VlQc;rV!36aV{om8BXyT& zZ;WSeoo2`W$#lL(HrMCd{*bdDmsS0Q=ZQ&0>p};bqtGkFE9s-iQ|CNpXU$2Zr~ZhS zDW$`+mxGZ?C6vG*N{MCfg}#Q!#>K_8eVPYA%Ew^Lr`8a_SU^6wVj{3XJ}J-Q45U+E zq{DOOy>2%Zn-la1q>l)qY*weQO)n_XU`P&SNN+$s(ah}B$_8*q4-OWt3*=i;!1AYj zS`0vhrhvV5gchqPQkp0#0Oqed<-2~$(VECVJI!C*Sa(8WeXq5=s&Ws2xMNEJ5_RSSKU zDrZ%*5#(wSBzOiW%g?ACSAdQ@R6 zl^8w^qZ4(o9F6>um9iO)pEVj_CmZQA>v)*z=OUUEn1~lTh!wbtx7Dkc`v9BE`D%?k z3~w+hIwAhV%F=5!bWN1wjw2uZ?!%ZwXT!3?&r0h znK(F|4fGI=&>HmtFLlg9Nd7Mk(Gjr0K1B)@=wTTR5=iA8j*YPMtzVhY1AVF_JKGoo zVdc+SOVr!aCeekIFnSa_WHuT_Gdsv$8ml@x%pn_uUrcHuI}~j@TQiB2K`(>~!0O>E z)K~~aA<5>9Pg;3cRC)Wk1Pg-4J7@m*<5`R$N%Y}!RG${Tld7k1jSo)KHvhu|sN z5i|x#ksDZt+v<^rz7Dt1Xw;)^Ai*LxK>GmFw96lv40$TUa?UD1&6#a^Nc>%Am42ON z6B7og=LS7um5uFpFX2hX-GzM=wOX@)PWq711b1ZlV`W2W@1eBimB z7+J2XW9V48T5#q)EHzmtIyl+ zelZe9SR`*#h2uBko;C8miQ{K9Z}lqcZ8XMEy%3e(S<~Oyjl4LxF_s;c2M1}@LT&Zk z!YXXU_^5MY*RC`$0=Ds$`S%7?NlP-VqHW#zoH^ken%%v9+w+ZBcGRt6gMr_GrF+tpB{@|Hf) z;SXhvb7g)?^U(SAh)PHZ@k8)|t3K6@l1giw%9yDg4eT$i_SOkK!!T^hWnqOsFrF!cgH5 z*J6&|BCOMR_NWtR$4LZrM)7S?VF!S-i0}}H)Ht=G5Djbkwh3Qf^Yq+nTs*(cA(*v$VKW~h;_mpu84BPX`JK#mz zV0SChh}H=b_ZwjqXgpf|se*N+@yeQ=|>$xTv=mG6~R z>XeJ;U3gsRXxz7}GU3U{Q)0(sBl7dC69AgNSb}kyFpcRot={%I;~4_4Ft3{0wCgb! z-9E3Ja{75>`K8p_WYTKuaNY074m8pQyJuY60FoNpV3xvzK1r0 z9{B}5>~fCtVn`sXqLuKJ4zi+(u!#O`ckl-QN#*Rux2Xkv-d_j>-?rWSVlIYsgXMCq z=F5Jq$axX#f@%JKkIfKY-bOXi!Jz5|Hqxd-%tfBlCXADl%YGpF2_z+b>uh%IY4nK>3Rh}s`M1C|KiK#$!2w=rq$FTjaTrGxF&V`a1_M|9!pr zUb`@;_Nrk2Istf_XM0nec%2qooMl7r3V`}C`?ewWwhaL7zNap$VbfcKz$2~n)^Am} zuN~}&%R2~f=Ulv%wC`zusaG;QYpnf7Tzi_CO#&LJjVKHsM&kY=|rPQA({2_kEK(sGL2%@VuR%~?JE6d`@K?-EPOHMYK$pyCW@;PinSEE9ds7k z7js#^if_lz8vnS}WOys8wwU%Nq)pX4+2S|exc{=*?)Lj=YvaLTr#~2As;F=ODH_V{ z?Yw;Q$>rFOi8M!?q|ohPz1cwxAq?+eEHS#U>6Lq#)#lXg`nLQ$=cE*P>$Jd_>#xLo zeu;H#%CmZ=Zjb@nmjX(p6~{)AR`2st$G_@JwXkNFur|T6Nm2W*xR;9(>5VP{`zhm) zgw*JHcA&1P4Za0l0XvQdMk^B?7RSt%fd{`{uYLqHM_50!rXy`O=;dfsJxH1ebXK6v zbiG!f4+RkcXf7Es!^oH$4;1M9U*j)p`zny51Zld2Lz6;g(nC82A*4#ONoo*|iTNjq z5t0~hfGBagCQoR>z@f~BqU)@n3tDC&+Zn>gtcKd2r-Gy;dS=cl4J04WvU>1H#X-_2 zg6In?HMa02LbOl#V9x zYe`nuA^Wxh)eZJqmO|T@SMNjavb&*u=iR-bqZ5%UtH>`wcpM=4AZM0iL)Ic&a2e4> z=->o4%}@4qVwYT>@=BQ`gChoyo!CnVfUpTfzLk-rt~U}6Iwc$=&OOK}X19awaq)xiIhS@-qblPNvQ_8y0 z4|D}h6_H}A&&j9>>oK{{?fS}g>2Y$Ug)82+HJ$g*w)6zF)*k}N0}qmc>Ke4AZrj(DRTb<0VHFZh)6!|UV|-1&k(uJR8nkcMqj z%c&t74kofqkrRezepIP@>WSAU|Fg*NQ--rmc5Ut`h0kfjhka6GL=hDb{j6`ukup z-2V!VHs4mAk0u)(mT9S(0Z(F zg+xO9k(`V)t!8|r`9TYUmAIZXChm?v2q*KCxF-v>vPYvX%;fh{1L5x~pw|WjR*2Pp zG|bCyod~#J@oOod*2hvGg3_(eE@+*QQTHW4(dw zv-xBeGw{gl=36Mm1ZZnGTrPQGNB)H4IBb_u5^a?0Vz}Iqu1PLeM-5e+*J;Wy1i=Fd!;FDMmqYQtB{d2>5``agH%*5WCn% ziV01UDFE~{1*>pu!}TA9tDjZkh`-A?)S(F(mo zX}(egq8MxCZ`xaDY@Oj6R(BWKR6^db5;@}fT%qSGW1eyAQfF)xfbL|#cEPwVph zBkMA#6tR6!MiE&lAB~3w?GqBhhz4Mrbs3rjLc*uQ2@UV#Oht1*K8ld#;M42Aha$?k zZyJ%5l}>Awsx&0#q##*L`a)Pg}@#FZ3XcH^T&5FygWYH80Qy>oxq1OxIDxBieeiMleBb902 zHaUFn*vwGBc!)%}uh4roqoA5Tk#H-*ZM4h(a8H5Fdu3P#L19Gh?HL%0G~!%H@@6If zAUDiZf*HZ$XRSO+)9NH}ra}JC(QpS2JaJ!?m)cNPElijp7Rlm>8;N5Q2I?s+FA3a!EUDZMEMQJ4?fjjU!(D z2)`_|P{U0xLW+h&)Nr&SBFu7r8L(d|LQy{1-67l-k0Oh z-KiJV-|;)0(Jr#(BY0}aF-*>g3dX^6n8n{I%F<{*#=mVy1mqOqV01u5=QXb4f9>G* zy3d5?Ii>+}P8&5k;wpX8N1#W@IyO2MI`*3N1G(hE8=pwgdCy1tyB5(IpDI~;FJ^;W z%jAsDv`W2~tNq=oERD|%kG)sBL2h-S#uuOHeAcJ^-J42{f7x34Yz)V+wv8HJy2zz& z{POqcIyV08bL_MI2J+~GH@W&o=er9+{pvYHXYwZ!Pnc2X)pJaY6ep_G_mJhQ*OaBn zP3E!hvB<;IrQf;nyZ73t$$ev~->)xUeKwCl7o}=`XS%gM zJMgBDgLM9XqQCkc(3w6>iV6SrA$!{9GJRew^}nnB>UUvj`m%8hTJ=)fJ8q?Xrl#!; z!+MXtBqMn{wfy?B_3r;TY6`lkeSJXWjJk@=ZH6O&TkO7yU4{tGN(}a>gUOzR@;!m6 zHWbUF5{I4=fB}kEod@~EiI*0NBQFUU>qTqy3Fz zN#NN@yhsK2SOo*i`hn<-L|q_>w~ff|6XcR}DCj9DpSthwi^=et?U+p+SO@Kt!~;1> zk`>E|9pJ zfsgRnSBOHlh-6*jblBfnge9{JCCizla?S@Cr^L&lha`xla;2oRUV2sIg1!0#jPQe5 z%ityDrKMm7mAM5a?4;CQrPWbnG>Bz1jXHi4)$>mY1h$3xk74Q_gbLdU%1;SM77hE* z!-_@>F^A3snM+_&g5Vyoy0$!|2Py z1uqOc!;Jdgwtr%l31XK2CM^G5dF;Yxkib{;?L6`3175gqY6;eee9^G^!5|WIKV}lF z;sw0dYag0xpFVa+AaEpVNs{SeEEZ+lW@!|PxG!=^9`;r~xoTYFQOx#0o~db^7!$?_ zzd!dzGVfJVJ_$CTTJbZCf@D}I)L=G9ZK|5N?DbY zeO2OvS@0CX1E5}W)Zrw#j0=J6BhBYxRnn4HQ+gCr6&H&0#3~ES;4P-p zt&=RvHe){*#S|(euG&IBh7Ff|Q%t%Y%ybOO!0F4IlCD^qwxXWYOk`83)st%fC{fvuu}BO(hL}crk`|r)G|vU8ocyyNWeI4oc`A+Y4kXzu?Dw_7LTzOuZZZ&&G$NLB|_@SKTKlR zLSjdaDrJomyuY->-n7I~frGXh_t;C!0m>38KpA78?3bk>tyy%YC9yZLd{>}SH&A&R zsB+hHCDnbh0aQoT)*#W=Yz7{mFKs?AX&P(me9_kR)1DXB2C^vWRcjk|Ya2~#<0WYW zwY81kv_GKgn33r06bgMR7AiwV_)9(w2@mlO!5j*k2!#TH1yKqO4fvM}1Au`+hlNFl zg~Nb@$AE{&gh%+7i-3TMfQa?aMMT0vLdHf$!A3#FK?C5TW8hgdNl8hAEzL4Ava+&ra&q$W@(KzHiePE8l9IBrvWkj|s;a7*nwq-0 zx`u{^CfMApr3D0n|4Z6BIy$<#x_Wwg`uh3?1_p+PhDJt4#>U1bCMKq)rXN0hFf%jz z`0?YXPoK=q%|CwzZ^g8*w6p{Zo2{*_ZES38ZEe8{=PzHr*xTDXI5;>uIyyNyIXgSM zxVX5wy1Kc!xx2f2czAevdU|^qprEj@u&Ai0xVX5aq@=X8 zw5+VGyu7@kqN1|0vZ|`8y1Kfirlz*Gwyv(OzP`Spp|P>Csi~Ed z=V!2>`v0M*{#Rl3zx%{F&57U)0bBMcSC=ONi3vw2e8RRn5Crwg18ie2kPgM6F)5Ot zE0B#M;qfmz(byM?qTy+9Nz_9LpfiYu{`LnL*k{TQgB}Vh zB%dOK&3mVYP%qmH5VMshV{JZSJ0B!~XYC`$NB_4nB!)SJ^nmP#CtbUl;K}>_`jeG|Efc90UjP6f~)TTF1kywDE_}0;_twY`1^;4hsVdqrzda;f;I6k zuYaGvi}8O_knivBf0ZE!;tlbYZf?8xKXbqnpa%WpfT!20FdEk^97|#UG?AsySTdc) z=J4Mf@Ki2P|2W{8gDL-Uz$@k|W-B(^OqS_1+H6hmP_EQ~9q_?|e>vb~dJFz?z$-M{ z?@we4VX$s>dY=B620P%_yZxb&OAO+6`uf2Rc$2BN`u)*3Dy1Cd_J4K2N0O>^G@UM% zX;uD<1OC@Wo6Gsn>CV=_9q?qTU4J{^nM`N8+Ha2M3jcDzcif$W9q`*T-JK7AJK)LG zdb*x&P8KUo|8~G%?N8>a_4d5IJc1qYv%S6V?+|eGI{`4bRy%{V47gtNm#Hqq6-N z;ro;QSaCRp1F-7I`XFAOw)`MLnfLS{QC*hdFbSw*eF%2Immj7Wxt|`Ueh6VWN;6Nf zK1#PLDL=}vYdJm2bR1zg&T?I`KF;<$DnHKgy+1w94S-`j$@`9LbCMrMTX9nGkp2Ox z5L4ipz6hWo$WV-;58lm*Xbs-Y`R@75P*MN;Mu&OHRFsLlc z3o)>%NjYO=DC>Pbv#LS5Q)HGLfrI&*nQ(ta7a8bW$e$28|H@1l7#J`%;o#ul;o-sX zL_|ac^Ai~v83hFeOi?s6G%!ff(b4~5DHawM7^gTmIJmgDV5s8b|3M-H12~QRMMY+2W-u68Sy}&KBL_I0aB_kP$<56Th9o$sfH}#}&o3Y# z0H&pokdUyju!xAr|A{XDE2GQ*4$S;_A>}{#@xR1OUhcB`!qHfAsR-hyc&hQlznJN@ zKs}iXW+w2|xnw$%--WZPys>mPmn9I1L=l^6wm?1+SEQn;Tq{fYFJ>lIELSoVe%zXH zEBK33fj^S(1*z>)_-t2EDv9Hmf zH{E!*Wfi=C7rCaOTp$A=-2cW0ICcFKyujHDe8BPRp9J;~P5uGOf2YYmDETLl{U3b% z@7MV>G&F!S7P!3ucQxP?1@2_PJS1Obi+_X zcXxN!(A^yZQX(SVIn?lbU_2gA-FwcxpZmM<^}Y6*^Q>oP`Nvu8_m0{|x3xTD1tjopP|+<85XdBHrdyXZ4Ch{G@WqcP)fx9OX7|QBC|LVc z=ZyO|Qm*@6G;xZNXDL^nbnlgu!@bo{jW7JH`E3sNy1(?+ezHG3IISmFx840}G3B^V zsvUm^Yv9Eg_>ft9`Y|%{c|L-5mX9c+$Rk@L-T2``L0l_;^AmCJAj&=yvP;GzL; z86Zgka+4oRy`TBW|ISv*|C)T{cLm(vsooIR%eM=q`p;`PrhZVf*V%<4)=zhyk4P>U zCjDMsPadkW!ka_xlL@v8+OinV+P|vNQNl zm4NDvTJo^AJEPBToiCNw;W-cbUgQH;xmuFfg*`~8;R;KJo+qC_-(H6yW#^;c_7LT zpymLYH$bTY`0~#RPjvXxgszx7 z>Q~>~k?R+CbigE_mQ3G>uXV$`EaVO2 zplkLZzM(m!5I`>irn##`VkJi}=81|;^(fr`s}mx!;h(t@E$S#T;Wt-81Tln<{Op|p zU>*Rl0dN-pUjen=->KSu{^n2r4*MG!p>+1jnxB-Md1R$}qvjYUcKgA>v-g<^NTt>>krWVVOum1zyAnf$5 zx;yVSUq=xK5c7W&d=L={5rTkz5)gubx(?_?14SJWe|`p^pTXzv0Oddj2*AOC4iJEL z1ApnjA2{%L{XMG#;I)6$^7+pMq;J884iS84z|I(iaOJlAghqEFdLS1pNNfgUaj@Kj zfIze{FRah~}T<+gvV>qht+T`)Fgi@>S>Iye+hHvoE*5Femn8{Uf5ZyLVRFAt8w( zRUxUKUlu=0yPu5CKQKD~H4zu6#{fDQP=Eoo7SIIw|EK-&_p?{TWpVmrX=fB)>rRL( z^O|BQ3Da$c$NrR;muz`Wv}8gA zoino+gESu|idfNoWiHHk;vwvS6C)l%Ka?z&!#^4MoZ)G)#Vaa zrL-sGp)q%Z7Zt)^ek~1Q<;<1Ow_C*F=QY0m($5feSvcC#@Jqe_)57R`1qN#V4xdHL zyt%Yyd%f*4uVt6Be;Q1wUh=V|C|)jdqO|<)^BwTg5=LVIde^BwJg0g=D zZ~7a3UNQ@^;F|&N$)OZV9#N3z-~*DdCtMbn187>H$&q)bVDdgDC?BszBe}IH`^s3i zq`quZ+zWEO4`&Lr>AcL6sB4c>LYF{eANn>qcz{zUC0sLeF*VwJX)(=-Of1j}?aFhO z^c_l!7}b{*ltU@-^hoB}?6*qu+Sz$eK3>$<5#c4xhPsVW=an2*yvjGv)lH6Kuc)At zN{;o+Hut%Cs2!ffmdP4B=&5zRNVLG3F?o`WJSKmZSoC`QSGP+Oaf^o)234yaS<7)x zef6%F?e^%g2f}fb^{b25SaPG+5-V@y5ArW-loB;wy-{pKyTnmXp_RSaLT$0K*$SFp zOiA}lb=6M6Yvdl+x5Urh%G0p!%&Xf^S$W@`VHR$f$4=t~itt!liR->S(pnf$s53HC zLco1_wMhEm$7$U~Y#&vdzWU0Iml_xDPrjOGh%Rb49I(ApWA!A<nJN412cSz>7Uw+lJ9#^S5!St?s0|pwnolpcI_PC=wjBfrPbLOr;&gY1J6mn{L|*rv*o-^mRqxN(5ZEkz4I)LbZqC~% zj6gkz`w!~D@78v5x08m-=h52Q(~`d^Fr zGG6w5RQ@Dh*ctQ3!te^v{oO%{1J2TEy-0HGVur_Zd_a3eQRA-v)C8odJ^hP(p3esqbNB`5mpN(J~QB-nv1$Qd!pue1~uX z^+fY7)oYOG1!T)5i%a}C^0A6+h|GYb^-H`1V%AUC`scLj57Vmu3%n7CbO?yyJ3kAN zWCB3LcdX&B{1A~$o_S*i!W#kD8Wol4IE@3T!JUYZ&s(fu1|VczQ0r>D`Kr|qg&W+& z^!{pdAOmfpWJbWX$6;izVuLA-uXX!#<8!@%asVSA=iXSH-k&5E#DW-;lTA7slLJOR z6#kN884RC+do9aot0r2w&y^^f8p_rRBA=411Q|&;a$gvHc0K5(WGlmBPss9Z1Qtkj z)|s3|ZUM4Y#$UYm-%U>uwI3oe{hgox2xB0)TtBhEpIG3(V%GdyECn)DAX*}VKrT5QQd+jcgv z6}{LO*X_V{qBFD@z$hAb_W?>XPqBuahbRq04s)@NOqz({T=0*R<+I3>|CBWOSC0AJ z69F_4!K6gAU;x+qi5>p06?pic9x{RA5MXx!!4lxSeDB5lv8(cLzd3U{E+lfSV@9L; zS_k;?Wq>p}4gU8@lPR?bWbM2b973K#ra+?mA$}nu)OV^1qAmp3Du`J@0B8r;#sJ&v z=fLs*8(JyJij26N>J#*d&{z`)>MczQZhQxp7f0*A42yMvN$bg|>qo87=qGF?=;h>}A zU|`?^OiL^*JZv0%fHejBCEW+Lw;<&ll3AR<+V&Vy&k*!^DfWbSM%&SL$rz=&37rbuv!M(4E z)-IR)DDavT*Q1ChDI%e?s&p`i2n2>c_=N3ta63FZEZ;%0mSVq6I^s{~9bZEphuN(jZY zU**yeK_B=$bALF}eSq%@OecX)38;=+&p;O(dJ#z`x#>nP5?0+Ee>u7q_eSG2*>f`R<;#@v7*6NL;#%_o& zY?ywMN*)8&;OTVsar3b>I2kcxc))Vn^6Z)=Y1YHEQ~l({k4*HvP!m6t%WWExVWP%&j6Oom3^GZP)9`@sjeZ$LO!LHSpJR?Qtx>98HV7jH~kb#p-NINN?4R2{QwK zry|Ww{gd_GI$v$6II>78Ruwm&F6% zNFje;4UGh21IY^yeVWc28Fu@NC+8R}(UW(nElEJ|5TfBHIHgS&AiSnP7YLtzJqwXM zeApXAE3(+j_sm{9MPLL?P{VJJggMFkC5ny=QpqS*od;*^fuPTbtyyx^DH_N-QgjNI zD$r-?L4Sv<5DNAd=liiG*M)Qog$P+4DUJ9dIly5eB}I&a{c^{h{g(>3hk%|MAixNu z9>86KxHEujPvSO~+JG-~Oqghn%smtVy7ZX{fYW zgp_%-ltrwhWxS+Sf}~ZVq;-;{b+VLAvb0T#v~7xvZL+Lw@)NtHXLd>Q_KAx2@hT2+ zuN-6aoFYuYA$HDzuC9JwZa)6*-oX&h2+uQ%^!ASQ@rm^Hjr8}A2nvb_3He8ws|dl> z-)XKE ze~#o$jpj{_TmhlEGXzK#@V4{GL&PJfCjWb4h0kqBdHE;am2rm9$$_cB(0vO!qZw7wSY@+pg& z{wyBJet#^4?)U-UXC5(>x zyliTcZ)3deI_3a|+DAHFr*OS(wVsbRQTp)T!=sLEt&JDmId6UH88tR&4>EzjOw;D! zHD6m;=1Pe%W^diuSj=^wlruO!Ql1YR)~2a-$Z-B3I^=*RO$u^AB}|E@Tt6lh;*yACS>vf;( zhBu+=Zi-)nHO|Bys@uqH@vo)~)3V=0i_$e}p18GQoKm*O3jCxsD(4pEZDpg3c%kFX zP9Hbwf^1>Xt$d>1L-1w`)xPJ308Zoe;>?HS?@WVl(d6t5@G^Ao3_iSzzdLkALTdNJ zl#eSgmOw#e4Br2&6>S z%pjpK6ICoRVodk0WHcHit`sG~D^}@dVr^EdEEbN|D=}$4ZxjupR&5f|3E150y!|qM zyQuPF^$uL_r5(~J`$FZt;vi}3eViFK8KmO)9=?OABNKj@qHo%iF;1+Ti0o};`$QAA1u*nz)2tRT>J5QrXldF2WX zLZKLV2I^{h`m2DB@OAbZ?3^5T?%v@Q;=L<;mtX9@ptyjLq~IetArZMpVltwDV)q{p zpyB=fAQELDlKk;V0V3ajZcP?)K zUW$}qy43qDDf3(@n*u3^Vi_0cQ}@aj9+fX#OBEe*RLm39jl$mO`RKg1*L!LDPUW3} zl9qwuYoizH#`3Br&lSy|KC_gQvy_psl9sZOlCVEBaR;f#4pJhHk`J9F@3~5Fd&+S7 z$@2v&^M||?3eyk?e`ZDS7q%#a8GYzCN4W+V- zrLs+>axJ9tET!_Tr3!4NiX5bhouo^hWy;-Tt3039c+1!MDl`Nrw}igxjC|V@qdgF> z_aW)sXo|sjn$cv2@nojSWR}@vj@5X+?Rb&HLNZ&knX2}huJxH|@cYsfIMW>b zxg~U}C2XoSe5x(tQ+wp6_NY&t(SS{LL{GNGjJL#&HN}nA$A73v=qpd|EJ3-9O*Y3=cA z==H4Wb15HjDx0t`owhHXaVVR0ET40&S@3FF_HA7W=v)iwU5^-CkNdcu`e{A;>qhbF zM)lri+sW1te0}J6e&}d=;BcnrV5V(+s<*S(;cR0_WdqVA%rtaZC-qT)(n0gg5~<#&eH` zK2ScR9>u9rTIJrW5$X~JAVA~ zXq~fH=(|clv{=X3LPB0lef?8Ik_5RVbvYnf{Emguxubl2ak>%ysav|H$||g5Jv_-} znis|7ip4&|#nqPyY*#+gt3Rm?g`FZ@c{XW_~c=ujT5nrkL>3 zk;0QZ-ig{=Oxc>y`bmOlKL;$vrgw9{-+;1|XVUFT3lqH-h$>#1wq|o=iiZL2rs3NU zWx8s~(W5;ZVCMvVdFPtaXOP4FQj0{xa#fz$kUUb4*-(|xl&dJJ!P;L0Dz0Aq>Q|cq zBlJ=zrHl+!1w@OV7!2z$J~HY7M2p!c0nuWVE#`%IPGnuCcq?K+wAh_XS1Zv=q$4dU zSOYsFIlM)2F_ld%axqQxJ&UemELbt+EhDXTX(w-T|BJ2oCBT9T+Xf9 z1L9a62J1?G6PeyhK^sHXN?{k*@(Qq5l6AFsNM3KXWK=V2wRFOKd9`fXjdcw=8>+Wf zzL1)=R{HNF3wF%0?s2 zWwgyEZ2Cu=&BqKbn=RWcO`EN2Y-n3;x4x=xwKJtyPIb| zd%Ne}{>pZ*Am)vozDMNmcG_7k1941}dv#|}R`ka1(6bls%(@@H%-J1Qu~^+5QFp(w zH!7Cqa!cY(TF%~>e%b2YxKUJe$pmZjyZuSa`J8?Dlyz?m>Xrz|r0= zw+!)sIL3d3Z`t=^B1mjV7G`2K7GlV6G8c=f<|`T*UWLBM;0Kpk_!mEqm*b#)*)?i$I8 zzP~txJ5W8|%9sb`^f*=P*gw^m;TG2#QN6PuJ$MQ|x&EcroV5C(UlXUX?r<$dO2U6OHPnC#K%N_-D%Dp4H z^NK*;@)nl7oD-w>Wzw{^3YI1VV;_@`i((4Uk&xGrlFCUk8i+8JCy}>ome6&odGuFJ zJ)SqSXnS(gL{aAY{H_$g0@-14?Zeh$<01TptgE}kH_JBZ!FTp_x~pnTB58oWgwp_0NO&fNa2r9SjZ z`Bmmqr_M*PTcM{EU+E>RJWL+F5A8BdWxc5*DbH^b-hA)ltu$;2IU(BM_Ul)X%9w;v zJUN`_cZAkU+j^$n)swqL(W6&`WI|&C-p<0C;xWo(Wggbtj(w#anQs2{V8_-YC~;|63+ga&lbYy8GzA%7{pRJN1YF_RF+3~&S3BE| zUu{1<26i7A`WE7*B`42S7!BHrZBfU=G}$@R20P7Y(|0XXE-o8Cea;t{F4>JNEvM)w z5!?8l`AGA|R3C4GbYW&>@dS4c%W!h;K=|$`i~UvJ=Q%a6a-MWEKZ_E7UTEEu6Enyl zXL7)W{r-Y^M^yaF?ue?b69Nd`1b7WYuWHJb(4FC<8b2y)r9Fdr!Sy?l+jR;A55hO% z3s_%%9`=CtKOr$@m;m1qFKY-F+M{7&|)0?1nOPt`irMOqJDRNK|cZO}!;@ zX0Dv?U|?0}CfhT|mEGJ%e=?rlHANfN+Z!@|fzq`XLUW`*yH{;%~r6JgoZx-kne@i}khJ%a;ig~Q+;fhrc z+LH~qQd|IIlKN7zOJQ9Wb7MnWNhRXSe#XXb;j;p3g1EV9>H!K}+gd$&m8|S^)luCS z8TW=?zBbDUEWUNEp58fRzw+>(8q279wcJhUEFiQy;j+OFSg>5#y#VaDAk9|6|!^p$y%;ZuI-y@ z^($Ye2VdEJZLn$or6rFlg->mf7yDxcFa?qHp~&p92;2KM%5hEkRHcRce)n4n@O zY;^WX9}ZW>Zqq;bNWcIh#_pF|LOGwSqs!A}`BxPBYmKkj71ul6{n z6n^kU5_!+E_GG{J6fVkkjh@I6g~t(1!4bpK5i8sg2kMA7>PXP$2n%z#xZy~m;6!HW zL=o;p1$Ckxb-Ds`0#ShJc)(Y+ojQn}4)&3*7J-+*VCFV3hXNZL4180;`O_`uJKD~C z;Wv1~o$tb&2M3(_v0NUFUKg??#EAzBLtQ%QT=x74dsRjLOT)&WxH0|hcfQ0;Z)U6im@EB&>u1?5jglS;uUZH`6qwaocgbA$D zm4mp0(^+vG2@kj-cn}CH(X_pIIE4P<49Lg z#Ke>rh$%@(0G#78@bX-; zcv_qITABJ;nFd&y1zDPfSeQpxm`9phAS~M4BG%k8!Q46t_%ySKGck`dG>dy}6#G;+ zR`g8_uX+rJN;IoNB*U|?t4~AepM}#a$I!h>pnsjjpqav=lYY}E@2*v;m~*Y1XQRAt zv!Y*%NF-`Uft!`;uKDm7XMFak&9|I~T18YBrG=B-}n2qY2 zi~jI6eq<_XWF&cHFmo2-)t^SIK2KJE z{an2?SG_q`y*FQdFkgGL(0Dx8bu!lv|1x{BvVF3QCnw&J>#dWqVKj8P97(Sv1l1%U*)B z_FfQE3RaiAzn5UhsRBbb6eHzqFTt-PBc?h9noe-jqZd4{bSL}@Wsn`HQHF9C$Do0vo;f9BJF!Cr#@WxHIIAoc%&T`u0|?L85e zv-Y0u;c8*BG zmtGqL7o#%SYio$TovIF>9m_Oj@ZVV|_DH;*-Jw%>UH5ABt$RlJc#Yl=-qFSbQJG+8LVH>jPT>?ADuQhKm|(tW?%AbWSEpqDx< zq98&m>N3}$o-@n(&|87YtPk&B3z|o^z!%@c6Kp!iEFv7-S#}5%Ur%#JIMeeNPwrDp z?Un`Hf$Qb#>Drj(&VY%zE0(VCYtHCy-#thSK+=Pf_&85#j+se!Sx;)!5LAxg`|;gg zjZ9y*9)C^Mnazaq)fu^CFjJ^$qgw;yA<%U=(?!*&{=i!h&g9o6&@WEj6?Y_MV`|%!EJbT~f@M#j9aKrCZX1A;Kl<-0{)|IVeOhIJnWeb$- zPbY0d0{cFX9lD~X;L@D8dr8-H-d4tZp8i@+(9lUd-S?cADU6*~Tf;?nKqc}zv^YW$ z#g*dv3#?P*hY#_kwN>Ml2C=yEh4ecO;5D$;i!EeL0ZzDT7rmmZ(1;5>NOP5GC8)|n zc?z8-X(7UQqq-n4KRZ`(XMI*QyclS4ATOFxQ~DK#LeVPCS3*8DL{}KMkdZX1@)X}a zBV$<5ZoU0M&S&D%Ao3u@iBs2)qV>z8!meknM&3wDX0|kRAz|5k426MqZ$MW(K8r~@ z=K1T-&SKqTzW0!T*x$YCO)=F$n=lTs-|}tJNrln8#Qqy@mx9Pk4YWMWCktK7B`5|1 z-TWc_fy$%Sv|lY3JM-{a)PqpbKet^gdf~74x_kzdS4i2V6S_<_x;2I#z(B-qj`#Y? z;I#n}=*{=HjJ+0CLas%7Fmp^vzL0`TM)LO0R?c1q==y;!^iMy#8{L^Eg`sK-gEr#?yh z(n88<++M6QGk{hp9?)e-Y7o6ZOmT4_S?EsxR%*g+3aJYrx!G2$MjOG(i{R%)amEr@ zPtlt%cin{Ms2b=u+!^6&)qGz1Rq~b6ENy)$m;Wt;j#zmT%}F*l?jW7Q(LIO`$ z{X2DJ=$D-y2bIZPn)u*H(mnOyDV40KeQ-d#o+B$HUe1^JRf^T~Sd9zT16>561p;*| zEcACjHn4FSMLkjdT$Nfe%$6&Oj0&HWnG{d8D9K1aSW+Q==FXMLyj$kZGRZhiifxH^ zBa`#C>hmlHH0t*yB+4n#(ox|(Rsrvf9$(j+9PpGc*^{h%xwFbU&U@49vXA7+P}UpO z3Nh)X3#id`Ethx2t0ei!3ay)6=xH-#B^pLT@K#>GTDGY|mU$8Y`e4ZV;HbZcZ73O& zLFX!`9xD2Fm{I~2<3|cEX?*S;$qw%c-fq3(aRXn;OAHF`tqaO-0Tgmux-W98ASzdC zgrX=a3nsHOv5lyF)81}Ps9YqQaS3@rIy0tf5vC$#JtJPF$vJ@)#Ps4eSF(+@&w@bR zgHd6jp4N{K*?{}i`KbqP%dm34wH7blxJ&7a(Z6NR2aJzf_naB^?#3;S# zseC*`(F<+i?lFE=Km7$nSl$K~mEH=BI-X^cDerjEvlUu-{FTG6yh}@ZJ97MZj;FW0 z$D(ID_UL$?meIM-U3w?+(#e9DOvON0&ra&ylSNs-ilH>=-Av_^C57IK;j*6HT$__+ zb;8Qg_KnSgsFM|KnaZ(|p1sn_lT{p4-_U(}rh}sxUNhrWH6i)ji4tYofq)et6>R@dPTcHWHnF5_p3`2m&^liG^RhZ*vM>l?`jq8S6%)XU4<~<%ut9lC@IR#U#a5tec zH!%fgvo>?rX)CyP8@?eEL^90fDY=910^~W9gA|ji?+93o$v)N5)}P5mv5n|anROM2 zXjTvdgUKeBgD|ztHL(vrYah2u5Ix%h52YW!DGZPPIeK0j-g7}y8zelG1kXfAufb_o zbxXVvN3Rs9*K-c<`f!`3HtVhhoDwmN%d)ubFv4vP{*HX_ws5?Te4ma!pR5J6L^034 zHntY1^+yHIH-bK=)1Ji?elK|-3P=zwCMV7|@R2r71||e4!a5O&;K3}uxuu=7Iu1sJ zsV&451_j?>!okh(8{_szxANC~;r3R+=?0Her8-Vone&4t{Nq+v@#v$wWjNFUN5_3L%O*p?EN!opIy*0SE?Lh^L4vG#pSdKMP3J$j*%Eyf0g4hs04(3dcc#7qsv2SN)iKEG5dvO7`G0Y)s z-!IZ4DwZ;;=>mi5J1aLv$mOsw+~3iDiRk5LN` zJCzN+9FKQ3A7k=k%%NiJ*YG%8h+~Er#xZ4Bi zp4YUy6>Ml}if?7=uah7g7SXn!pkZOl2XoeG3wmw|iL-F}5by9wG${=UJ$BydUby?U zgNRQ-Q4gqGV<7f-neE9TR;(130})QL8xbtbDWVax}M=Gqp7=!=x~*> z@Pt-~!zh6_H2s~J=_f|Wm9gZOeS6^-i6ic|0&NiH$VgU}jMo+rILvWE5PZwp38J0E zvxN3`!3rvvB!n3_)b7wXj|Nh3dt{l!7LhELnM?)A^4w2eDvNHRw0pSkfqTKzW-Jv? zDfCS|&eMu@? zP75mm#Z2)fT&Ru%*>c2~7EXz9piur&pzf3F7vc+ z$s}sa%*|+x>#pY?y^-4?gk9@nfL+PZ<;3vuj8&k?E2&Di%k?ZcbZ z$?ZTwRpiLAv5w{HjBms)$%A=6ktoU7FWSWlM12)`!=tpUwX}vjv*94fh&6C8$dtCi z6n)uUPl9MQK0o-t@xg3{CU-Dbn@3fJl`u2W)sI0P-1fU=QBB;@B1(@sTLTB{97-9Z zglEy1^gLLU18-voA1#z;Oyh5l*p29D8I#Df{WafNZ%#WG%|X z!^%pJD(gB;oiQ;uWQneFpxTyMqdrK*oTxm9V6kA_eJuzNA z6;<&N6GJZ^8RaHwQIunjp6Qb)FA1&c5oNRG&Z1u1Gz2tI?dLi@Q96S4vuP( zsOzvHwJ7>#Ygu@0eYNOSb$AnXj-qu0cxIT{cwHdm3%2zX(e>JxrqmPl>{_|g>3Ekp z8t7N*8EhMvq8nJM8m>hARA&-I@W-l?wZN=R_Mm}xFyX@G=Th(}Mj?abH zBy+2Q21Il(8?Sn!QRLpW%YC?X$4yTIk;NpNdoLhbS+r*p+wuSr_W_azQrZP#3SuDL zyhs7)mIHjXa~3_oTKm&O39QjPw?F;%Y{ll^KfmMWBl=zEJOX-vf{S400~B0f8!^!R z0v2ulyDK(<_239b+JAUEI6y%I_JRXD!PV7)b>L^a!2dAZrmwGWXkhT((9q1-*vi=0 z=KXuS_wOA{Oq@(ioJ~z#O-&)Drk-YI-ezWgW@drr<{{?hp@3Ofgdxn*G7K;)E5Jgn ztpN+Mu?e=d4YsojvbPU(a0qa8^aq3eoSpq#U47l%eLOt8|C_dh{~aFw_wC^S4iWcX zr7r|13jwl1fXu=lx%a>>fIm*ze5c<7oZCO0BK@(I^#BYaW>IO&r)_i~xO4?rfTPjm zb>W5vnp^>WgAeGUZqq`+n>K%X_Rt+m;x`@MtgNLIuz^>S5x1WwR`K3UlMcH_$g;9Y z=q(d)*O`o3X@{vbSse2gr?qLamjlaHkrOO1Qv)ShwYVzJdv*Cj0Eux$dD)Ww`+;ly#8y}5^K0v1}D8lQigq@vqy&J<6hP7Tj(XyjCX3aLxyep;VBnu zzw}2b&ll$PAHsC>e{A3+;=6tSv47xGdF-!(3Qw@(LeT05-`c7Z2ls@phdh?$Rj@C= z77T}7>=C#J<&}*_I!3LFePi(0O8|+)D8%+HKP3SY8{XkpK2&57UObo>M-T@kMg3YL z3|SpN-gCIMAvU<<$1S1a$k8YiNEGKYzu)KIf9gL0m!Pt;GH?&7s;a61ci~ImHdKH0 z3b+t8Ucdf!C+g~Izk8=^WTf~0{X0`r12Z!Nb8|xr3nNQQBP%N-Yinb`Y;3-nt*tS_ z?Cgx~?B3bi>o_>Paddp?toW=62oPozdN$-rb$X z-Tkt=`y~j33Id^oKq!7|z?(}R9+$nm=zV=zfBKV`CAH~LsB_v2BCrhTMNoHk8 z(*)LXF zDo|SXtNrp`u&nGsS=pm9s7P74L|KJ&S*2WA_4BeC1!$czv|bI`@T$D&ZF#d+MT=f# zt6^2US#_sPO}BGxk9%FOSAAbVLw{Ife`M1@Ov^w*>tIUvNczB7=I~_p)R%%U^Cb(* z(AD+wt*z4Cy~2H1*1=)Q;ZfY-aoEv`|IvxZ5gc*^cRzx=0d@#?1q=pv*@rvt!ok~c zr%kxiI^1y;?zjSXT!uR?o!cVZapBAyelYt5xc&DV5SAw#B!YF3OYuSe=Q?r?D&a^m zV-5P7?9>DkPZk3Kj?;blvBUts+%t~TP;=Vn*bt8AYm^YiXI)VhLZ2@{u^D@$PPbq? z5v{X*QMNpntJ@a`2g2i~4ju}3y{t7$i;cPKF8$*9oAsUq-O^oECavZ48Jn;|U3wW< zUxAXj@9M4WxKw#zv%s}-Gan|}FO?%%wa=n=q(7kVk>uO^^r*7D4bQJtA08l6V<6X` zH3_&!nrp2erBPG2VeDE(TAbGWJnZC>#nRk-PJ)~+@q$nA>M->F*9m4LnVj%4W%t;} z{=J(a?aK81>6j#@)AMb1gG@%!sq>767o(0!V~*-*RdFaYhs3CPwy3@dF`iQ)k&xz* z)iJt}(ym@(q^Dz`qq_#s9~l`KnV8P@ga4fa@ceAeb3i65yFBBCOfZO2gIsonh#6X_x12#?dWj(=oof<0_=SO5|`tnr5FAv|Zi9g+^gxLN0 zTg;CnDnj{;3aQToNZULv`cWp1>3Icp1@Ui$slxc^#Yr`Xeif!tNqb_3{e79R`C^g& z*)DRulAKAzF7mMDqJlR^INx@WlZy;s0^f+98r00eu3|J z+7XT41>g2*Qy9p0hjd}unJCjD-u76L{Ie^CCWR{3CsUXY$rDSgMEA?Y@t-}IQWvP) z=>lQh;K_8RFWz_LQ>A!#+%7iz@@<8`=3y9Sn)QD)X7<|mE;wlx^2ze)Y>=!-J1O^< zXNoBo6*P2GLLP`OehpKHKS~La4Q3`Fc?{l`3fC`POqKlPPd^_mHN-m~gH#1jA#F8D z=A*w1eRK((fm|fOfG_}5$UnvW&P2C=#r)D!GnW9&FEisBK!wCvCMoRjbk6!C6;eN| zq=yeZr|`-@q(WBh3{rXnhsG9yc74lZg)gP&lCdI7hRLI-502Pw(Namah*^kmm+&Pec2fve5 zHV#}|eE-F}-47RJzEdGH)dY1tZinC9?wSkrzX+N1^PRN(s3Tgl zI2+-c}@Fj&!dYzcLqre+qq_skr!8?%ZYc> zs*VWWFAu#SG+rIm$~)PcFv)A(pLWm7B!9p`<+2moFks8J5>=BcZcIV1^B1w}8RGiK0OBg?DQIa0e@Vlt%@`wAE}67JSP zs7Zvdy&XSX=GZ`0xQT*MbexhX(ub)~9vI$&mwLltqmeb97^A$n>9W5L_KT^_$kDD; zF2hpMM`nZ1s3z1i)Z|1i;S{=DtGk*^=F~PLmqg{YgMNpa_n~0qwx>4y(a?jT@|NL} zhoDv2(Yv}t9dcXxPx>aVk=U1ugM=O=*o$2whaz=9BPd9~bwLrP4CoNPe@CuqC7p%$ zP+ap?A|btYJhebYcWA{<3ddJ@nC4-(tX)xRGR{1v@UACI?6ywwbXpS0Cf+mHjO%7G z#+^eX=J$us{PV;Z32v7cNMWdBTgy^ht06)%#d`))d?$)DiX?AiyGx^3(kgIT|6DHj zL(uR;CTe!R7a+JJA-z!}DQp^rpQ9+(K~U3|O6{y2F`B*OWLbRUbT)?Ea- zY<3NOX9-^ta%leiq^ zfxE{CC0P>p_stAyS%OTj?z4;0=GWs+&)~t$a_inmH-YNdg%WJZL zck`8=$``8sX;deCyys|!3VgI8n0$TW*ca*dFW+QKPdIg2AZH!xAHEUqlW~toVKadU zRq;_Ov(Fdt7gX{w{1A3b;%-@b%2sQnlC;yCx@?t)AM$-U^|Yz@1O0nJ^FbxK7TwEg zM~5SI1f}`zQY#vljz-(0OAEugS2XV)eeClsEl!hK)m1(k8|^7AE$ap_zoYSKf--2U z)Y|)~qlpFSvWk)JHS@}&$qnDKs`)d_?`R6vQ&zLzy>5SW^a+U&T8AmU0lsuRjrDI} zew)5F$NvoT6C|woN0?u$^j_f~F~51~{fhCE-(Y@(RnwRdQT!Pd66Q!m;Y7^i^p{jf1u%mp zm?<300tH_m1p_2V4hrX6JkEC%oVhHW0TLu1)cM}1Ge68(kitcX$K{cNi-@I*Sh$Ng z)J1aCMH=QJOX2#2$MuZU*H zW&m?DqHurD<8G?pZf*&{Snk$PciT~SdziZ;1q93kaZ!M{Swi5DaEK=q;ynuSg+cr& zJOX(6&Iq~L>w z?lZ~+GRXIt81_@LOK+L&3g;l;MkN<)0luFb=}ecf8j&jj<>AxON%?Uk5wb6lYcNaVE$Q z>tjG-KS4*Ge|LVs#Hc^2EPA&ro`HJ6B^_+S#Q=_j3`+cVf825(vX6KjvfiN}91_K# z+mu0qI+VA0gA6t>3EMFyIFP#iQD5~1-8%?+Kp6r-4!qMI6dE7s5RWhZ5f4Ka{SkJ^ z6UtEM1pnuc119?L+WdnpHB-w$ebKPc_|`iR&Z2MF2$YIcBp79gYXy$KH}h?(PNwDQQp|>F#bMrAs=bySuv=-QBV1 zSiWEMx8r&C^X{|HIDefn&Nc3#u$CBOxPW=xbABd0{d;ES_iSu5TwJugymSHr^g==m zqN0ov63mj4EK*XeGBRwkvK+FqT(Yvfva$lQvcht5qH=QLa&nS#a?)~gALQizp>O|1 z;wr2B9-u<%�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 z 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 z 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 {XT=kW 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 XWgvHHbZ8(`V{&C>Zd7kaX=VUBRRt={ literal 0 HcmV?d00001 diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/figures/nand.gif b/bsp/nuvoton/numaker-hmi-ma35d1/figures/nand.gif new file mode 100644 index 0000000000000000000000000000000000000000..11367837f7e09506406fc85064496108906b6396 GIT binary patch literal 1251518 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

    nIDOx9VRun1xEU?YNNe4cqF=LuB= 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[=adZEUFp{DUJk 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

    Zhvu>TJE!< zB93}(wC{2~#POHnN)uDa8h+;)2WsZRn1;V?uX{g3EJ1O8e7ds4C(T*~e+m+kP=@!o zH$qz}=@;6Ch4Hg?#)QJ@7ye?b=zV-c^crNzaj`X-QO%nE@CwZa;*N|k2+COy%OSAD zk+)iQLNSCfm0Fqp7F3r&8Lu?R35`0F3J%IZP(Bd(35Zc_BFoPnDv=1ro%;2Np8L)u zE_pzs=xCadL;R&gh=d2p2ZWX@&R-^!@Eq>-m$d{j5k`s(1Z(M9k0ksCE!=AzTT`jV zp)M6BT|DgHxV~5TwfjWQ8i3qk99#^$MZ+7c6Qd|MSMuUlOruBg_lsJ7j@+IEEh=!{ zJNm9XkYGq#PbKVRKxS>qvPDG=t)?8RE z@2g)`-gEV?8)^xvy3Pfj{6lX#jPaJxOB7eO)IAz{2+p{IXt>gprk`uu_WMhGu7Kac zxEP&H)s^N~UPuC3kifjmDow|9Y+0%JhWdWU;Ju!e&291`mNmF_gXL*dw8rWL`4US> zW&<;wA&_oG3TJXZxM3qLO2wiWO6PwS?iFwM(!eCDTH{tZQ1MI;(4gv_;y_ zMcOqd;<-a4EcaepS0hyj9P*gR>TjJma1E>O{T*}WBr!RA3^V<|Q%G6mm3m5UTL zi`%OOlo6=rc(Gb50i={^_*@DZ*{VsWdk#PC(($eFY&^=Kmps_5 zyN;_QulF^QVCJ{FvKS-9rw|9IJBaj*XsfT@pf%})}@!DC-R zA_$`?8kv6!c$(gE;gqV!JJv+&%lc$~Sg)^t>|2!ts!O`9@B;iWhL&jPR%jwb=t$x{ zNG0>V1BMISbDDuYh$-x83^6>z;J;ur^H=o8ffs4a{S@3+knXJ1^Pl&8vh>;(=$|+! z@gvm866=p84yk%Rp7yC+N@YWuMH8bw1^5PJLCIfR*6^8Y@e<@18Z?^)8!WM^W^VZj zyZ87Y%9nffZ?Qj}2|n^%{Xsb=^81aojHGfx73n&S#NNM>%dDON^xC_$3r&H}Q;I?r zI}a}M;=A$Hn!DHk8<0%xbJVQ-w4XMspy^c6-6mfESjc&*=ZvpSHN;=Q#VY&SR2DcUVX>YD(c<&ye#(Vu3N+B ziZ^MfOF1U-@8BEMoI!q#s!{|&}s{0{mw z&`1?$_;W0KV%qTYRJHp}@Y8Jynmq^>EeSfQ z4bbNjmMICf7z+OJi06WAYsVD~R$~ea3<%Z|3!yU&4QBNh(F$=H3QdIZPe}2H(# zj#AX3R`h-fK3tCcag2Q5V)OwvVIT6Jt4HLU668BebjlQiQk|8Y$7N4aAQl-z#4m?IpQ$kdXS(uvtpN~ zJccp49VJ{|$9&!mWamz0EKPcji;>}ub=!`!(vDZdN%=|o;lZc58YL`OR^CR|yDzg{PNgAKaT z3P6QQ%U?>ZflXEi<7D(MW!5>x0ZTt`S;d7sWjuyaw0f`vJ9BW+Fyhc;#)flO4`(K% z#?q6;cP_=P9%a7L05*rywqbK{m9h@3k`IT47P+%;q*E8I(zBXVo}W@umvX+Oh^BI* zcrRt+M$l|(XGlFUn|kCZcqGH(hVPf=+(_p#Hj~@ZgjH)NSC{6w!e+q3C0;b=asgpT4_Zad4)sa0@lw(Tq8w95dwfO#jZSYPBK|;Eydm=C>}a- zT#iXk(m7!MyYm(!qe4FOTFrLzw-JIV#7=AFNvCDojQl(ke#7W3y zc|2tW$7z{x=*bZwC}r8QPr=#GWnVExQb42#jV(PSK3R=^j z!&0AHnQ~FjP%)l-)O6&^<0{N_!cV$oaI7_Rsi~3DRff*xk|Q<3I+>}vLVcnO$k%lL7HN3F6^b*qWf zbC4pF(MD>_MbnX6v(?~hUUlm9;PE8!%8HhO=xPNjK;YGIh6Qa}Xm|rW?;ly4OdT&^ z$V`IgV!i7q{&yQ#xLy&VNM8Z>UoOXme()lg!x7c)MQ-U$)3J?${?$K~Ya;NP54)R2 zyJh3Nnm2@-Q(BuxN}7k8f!~di2tT)E=(ZGYHM6ECa2G_JX-ZsS6(o6~a9X$2c@dZ5 z@>>23;BF08}~$^;g*|#b=xaj z{(QX6h@>Tdk!m0VG&tG(nSgKKPbbvi?O+>89xd%)c`PS<$v`>Gfp4u=lWoEA?0Ci_ zl&O=5Q%%KrF1Y~sx2HA;E!Sd=oRlkQru>bgy5Re?i! zdg&teCV;}r_@;KH)6 zBa-A_@|pNXD&~=I%{?P2uNO;2x_nLZ(n3Q&BD#(_R{zFMhtl<3kKoOM)A*n zdtU5mX$>3iNj&rIhF(b3Urx4a|GC%`P7|9gzr=vM)GxbS^fqUVSIE=8Obyc!C?8U} zwvvj_obDc!!oNbx?^p5Si%GX^>9bJjxVR$IHv}#X(Ze)cCPqv3CJlBcp`Z@DXp|)VcwNc8Ee|9fDy2YQmR!q#Iuj6n8XFlu-4aF$DuzSI;9IjWGR-QoXSek1hY;-yE^mQF}h{H9S%-w zR7j-bniAlLKM7mh8+7B4If_Jz^Rt#6&zRbw$ zdYSeLfGNS@Tyvs4s2hto2bSVd8Vp-p;5@E z%vzk;cpx>PYEA8H$Y$RsWc&i`MTs0E$!b&52ZMaT%=mkX-?RHSu0LHVZVDPh!jcLx zRU3)~e0?YR5PFCM0x-Uy%1XtO^oF7mU`8!E5=;JfWuNvG6w~QQ`Aiml8I>)S7}#Wk zzQY7^$ucy01D}+7GUgg8VF`BX|BLK%ApwV$v*Pg66367TVrIpihZxkPR8}AtRwef)tA;QK>ez|Or3v|eX{hP zoc6~v1w#q-pMM_DReT@J(tmM1Uu*vbO=R#tWglN}(}1vXLbnT+4$tSivyH)QK{kmX zvyBr3`{K`8IxX8)RPv3vxZZP9RU#VcB@5^1fix{MgYrYrkkiNB9ZIUf{*copzO3BUz&Uh>-|hU-jeuOZK_78tNl_ zkuNAFT%neYD}yNS9K%GVqc0_IMFG*S$Vy97FPPTKb7t!yQ1t4&fPoFMA|UI6VD#lf z0FQG#sw5G=%8k4zk~o|4tCZLj6Ro3d1V4a?0=}02EiFMwh$K-?fED8lyPC4(_=FTU z?F+T~hMp??^oVQi-#+;{{JMTt>3()ieK(5nJPl{rxiNL|?czn$f1F-WAox^!TgwLFGcJqaX4b)rlGS!&j(@3xUx+8H?3R@W&LD~C}* zL*|mG+Wi_Yuky3^Rk>H^Adu527|Z;jLBlSeUYz+Mn7%>M#RReGJI;QS$sfV5+@`UT zl+C8`iW1yriJIokX35TGRr8t1`{Db^4g=g4SNIJ}RAHuI*UPa_E|e{n`SG;ybGlw5 zXw>W`{5;mB#T@iUhJn^Rg}-NB>%_`Bzw(|=Aiz77Imhxv)r@oT(=8FPo~DV{92B*l z=fOuv{6dJizcnKht|(cdN6vw(v;Bbv(5D2 zeaJq4n*&~_Jl-0d`smk2okc(^qI@%^CY<^|R~){-E@8w=%@4C+2EKT31<8Gvs`$gJ;m!`!wn~Y zNJea9_7MI8o;g794CUGe(m?lYlT!#HAj-Y|3Q-Jf&szA!{6cMUBqfEeC@vS{ZvYnG z^1*J9@Hf}Lff(L7(BfPos7Zf=sG@NH_$9?>Ar=Nx2N@xV&X(s6Mf$fIC4M5QW5c=s z8;Y1`glKY5aqWNUx$|s*7A*dwLg<4J2fvj%}-xag)G(uZwk`z!FH2T(>3jzDkc)LZd;X*!t zK6IA{$pMP3d)oQ@!X+(3TKqe6XB+QmuS2KbRWErLtm0_XF zD%U6R;F1AkO(!*?%hxUzOLKi2@b?TTRLKLo*AvX6CJ%}g>3@=L6GByq=>@HVdWum1 zHC43z&bwq7De{PvGwB-{+DmMKl~r{Wc539?*k~5@_vH-w$2ufjd)$+gVle3|yV_U8 z(u%(K@w|*|vV3pcN&%R&A1BXJ1fxYMome7rqi19Zn@2ffATkvtL5Y+1OVMw*x{nM_ z8kD`SXuqR@9vx6tGU_ee-(ArH#6(oZ&iAGg=M!>=UdUyA>+@420JLoNR!WFz9E<&O z!6+D7$)ri>h5Twog7h(Pg*@tIgz6=l@;l-c$y~dItfYcF3x+un>Yy^Uf{cXpb853W zhG|+Gv)~gk$7O-aq+NCtYoOc)E?BdJkj?Jbn~m}mx%wiqYEfiH@>p4m)&N9Z)gOXQ zJ;#=2URXxSfv9+9lGY`YEOpnPLB zV;HR)^6S!!rV{Gc==KJ&f2F!x*Z798o0p%~Uk=wk5mzhcdRE@B=?)r$d+szWegXX3KqK9tt3oP*ys|s3tX3j3IIOTx}R*i^@Qp zlzK=Ml*bfifV@DMvQ<+DDvig>8@7e%HJSfQ_K|Q-GkaWVhH-1N4yo-4pw6+dt~bVW zLI_hYr;uu4oA_lPN9bt$ee&8J*uVV4k`cjD0y=G&82aN|{IL(PzO7nw+zsdr?Y@Zi@dYQX z7^hc&XJftQJZxKkpbZOlY5SEe>FUlv>}+(y;St&1f_3p6xfpAufE?}f4x=PG@pqe4 zIOE!_M{@ThqYme+ht&f?XwSdFgu5vi^^(*8yG9a#H7C;A(eRYVc#=Z@o${M3YACyN zcE{Z`_NsXIF&m%9V@uJ8Ru#GLxqPziqL>JDw$kDJDH|z zp6s`;Kk%PaaGz+*qK-AVC7DZS_lg^}DVoGO=A2uzY+Zj~_kKM#O5D4h6Y!h!rtPXF zWLU2SKTHn7Zi`MVb_*!V$ z%?_Ix-6n5KTx==19$Q}Y+6n_=p> zmWVrGUs>99yAW5u5$|*%?IQC+cB7DYqncv9i~fH41VGakMk5zQLF?`|N#xV5P>c|& zu+Hg$U_G)H#!?fSH148b5gbTo@@j2LJ>n%&>q!JwTE>?z;fd&a;?Qq+Na%!c!w zd&)nt5zr_jD79c^_tfN@;2lL&(yH~0SJO#EP_~w3J-$>erxV8m*pE^LKMbECQ7pcr zjLG=il z9hI=svIS7rr;?D!<=OeyM6AhQY$-g0hDTIYPl)R$r-Uc(1w<2s7`qZeAMa{|PC`Et zU;5K0VmZ{f8(umpw0=hPE*>#}1%9RBu8>ceus?6&Ry@;uN^eq2mmrOp71ZE9cIOZB zK_|9BXR$%FpCyjuVztsOj%;L8x`PGAgFpL3zloBaiO>kJVONuhe+SnI)lZ9hd3W35 z^cj~GLN5){jSQOMh(O8E2DAxc%rv@2Rq{R$M)mRhHQ_@_80yI%YJ3sreI*UuZ4IL1 zX55y#imm(e+8$HRD7sysp)6|sVXGN7*?Q2v9yfjxrLCG0N``7-Vi^ul?Tnok3~a+c zd~VDW8<~WY$$f1Ob(W#5D~CeQCv)NrKPd}M7&*x2S|)CfnBr!S>R%1xLD0rqj%}xY zm6^zI3bhh)GeNv%mTolRT=$UDydG-wZgD58;rPj`7B2{n)LAV21AO;^1?^kL5(AxjxHpO zw}!VY)s3(8$#4H{%P;Bkix{lH?_a&;x`-S(@+?h5<{P;xTt`>1p`E}87Xa7P_1*UG z?>0M#!tL*N!|%vMn-vh^gF)0m{6y9RwrRX!}fNA-5{{X?5%W7%OA+D#oRdTh+Ik#1qj zQsa|_Zs+tF9#Pk;L{a5_MC}tKmqq4Dc`cPfT5Gn{iTbQM;%q}|SEEeASM}=6CG0#E zXd+W$Nhl*-$7v!aol$3KB*7chOMEv-c-Jgd&JI@!=ITes_EH8pt3-{x61kO4GX>F5 zwJSjX6lzD|NSo=L$>^TNmuf|oV(RBj6BFiinORPl;i;eD{S64Wj{JJ27}ckmbt90r zEPO}a69SNcgX<9Rnh>O@9Loq7*Kbe%A?DY^0yI@)HYs)&?%4?v-zrTUb{dsM1QGd= zu|QS&(kWhhOQ^{!YG0}N3eWcU$tdqJn%Bk9hfgLi7iR31Jfma2ZgX1Bup{lDosJD4 z*vaXfF^aXywt9+_=b;hQlIe-%C*2@I(#|Uei{PuzqxGs6mp2U=vC0Z(aBEX3)8W-$ zXF|LV^otGHi!(z7Dn4^_aMpoPW5+!A<~_l9T={tDN@x7;6s-Cgzb*D=t*@U=2xa`|M}#}pMEgIzrhoBiOoq@3FJyl5m~&N;Xuyew!>EQql*POw zr9zvZrP0npXbMBniq)?M6^u-o=Gd^!gy#xDognrcf!Ous=c2SS+Uea?bg&3!i-MO+ z5(l{U;01yQLY5gw_c(xwI^{eJ@)Qw7`O*Z1@q4!umFle+_$#6O()XuIb^Y{|6-n)p z;q?{TZQg8^!7Dk&)8cf)8fM*}*ya*$$4&7kHP%w9S>z16*D@+u2+fXM_=>x?BLm||F@e(NHj@OFC3 zWDb^a{;$v5)``B-*Yim=b#S`<%uK=1J1W?yF){HWNQEg%qCe9|Nk{s&~Ck9;S`ipx8xmy!*gejWF zB0_Q+idppIcWe9~H(J&8f z?V|qp;5JWNQ$r5m7OYelojhkbU#CAPcU-tEf&O>8xi#g16UTwG#KF&RaLTG!k3%{x zmGs-T7N2kqCi*ul!9fS^S##K!2ELWLxWWD2`{j6_v5&oVp>7W-`DAv`EoVtB!A9!& z!0)6!#)0A6=3uxYb;CgW!|`hoo`AIa?k2h&R7|pYgSp<{B61UEd(r2>F%e5+eR7;k zKG8hFqT6-v;q~JTi{ucxtBNHX6xz3?F)C3^F+SsVID?S;qiitaZ)dH*D8yC_EUjiH zn!=4h`^};O!1r9izU9qnUKR0WYa04^>07hPdmZ__O`OEN8Jy8iMU^04QQQ%72nCyZ zOn}D~QdLM*9DUqHdy9~C#~Xo^kgrWLfi$L^QTus0T!Z0|gbCw-5X{fHrwA9Wl?7;Vc+ezhYi(j@U=NpO(fD>-G*bl6fzOoIp)>bmHGEfO#W@ zc}k|Do0|5w&~j_Jb)J)@=CR4Zeh}^gHnfFf2b>K4@{GTHyHvqbqT*r;t=jhj(`1tmNS>Gn1V{vWGcWY zQm4L>{05NLTFp~#aE!A_2^bf}eij%lIc2}Tzu~;d1x2og-z=ti>3z=M1KLpFi7jU$ z4xuy4w3OKk5#@eu{lOfezdw^^x&jihnz0Hd{bcHto_Jdq!6Ji2B3xW~cPFyC!~b%m zs{H)Z`FD@1$=0{4>^xx&BukBy(o8pU-}~vb#9?F28ptoAPlY z#z#WbN?75usN$OU`^OlpCyu4@75?i(6Dy0{o`i#*P6Cf}?Q7Q$5O*o18X-5x*S*ZE zUhdb^(6$F#=mc87$7cv!MB|~rQx5|R>vCok#>R!*#>$SQiE@Q!c+@JOxNRBx`FB0B zXrh5$0xI#>ac%zRQJ$wVEWC&1oe_0|;g6?ar;Z99LS?D|SaYEzWGIz04uxO;&3tJLt z>Vw~c!J_=GSJCUeaYL&f{WzltGTF23>%2+QJfv!i1deI)T)vB}&x3GeKarB=owu~> ziB8_w%1WQ{oY?9Cz&peH=C4w+ca)6_ z$v6EMX^fWQ>dU!EWJA_mw@4?XV_*$dU#7$3g3b+AX5_m$+n2Ck5YVWvp__)n#?UCp zdRmuTLP1{$I83>e^Mr%2Sw(`HYK#VBNG0RwtggvN5&-{&>?5m#u7$p*?BAF4&F=V? zX0}A7Sf#@H4lrM?)97>t)^RaXiAQgbqqn)ITduQS0NI`VN7+Ze^|nf<2>A<;{1o*^ zPe%k6tNrOC^X`xa2BDhe-HzdykuqxFQuB^QTuQ8chxYQ0RUVTnUgGI9`{^RcV$_s= zmh@zzK{dpD>1FF8x=H)n1~<>H{VroXRq@$BWuGZh7zOs`^R)Ryv{i6bty>I3`XISt zN72*K@j|V`g|Fq^IV8%Y#qtW%;YIh=uK^@JZ;=v zbCLxAL-vtwXa1RB4{eR9VI~=Dspg1pSAge-7gsXtjiDWauXR_$_1z4`5nVY7j1iu+ z6M^?+i5ydgau@pt*XY(rMJ%t#I0&2Pi9A7BX8yaIQM>z|IRzkPFF+VHq~y*x@}T5x z{593onBKS4$YwjdQ8&rb6P7%ltb55kopkw-GD|#>%OaathMPJ!825PILi(9AU*#9Y zbCFB5>o7@-kQa3L{PUSl1RB>))Sq0FuA%q^>G1pU;(f9;t zyZl{{_Yc`88EBZER4;p#KMV-gZS_)-ag?Htej@n6@$5!3{MvDJnQ@K#deMc@YRv@f zr5xKEWtya8p5%XtG8&k0ZA{4iRl}13!ogYFc9@b#1Eqal4<&A0^5A1DqMgLA_`#hG zi~5lea9q?0BGdyl4{fOEtGTOXo9P7(-Tnb!g+CsLUSUs*8 z72rLqU-9KVZ&ozlIH!1mepV&m^h~+T%7pR`8Tg~tc0SJg4(7`rf(|~t4m6_RyK7@k zi@zl+enGwe8z~5W>|~xqyHR}j*&%&ee5CrU(61=)cDHa2R=nx#j0evVeN}shyXo9n zs`C3Pr(aN_L3DE!>c6RNID(IX`*J$yiCi#g=uVaY#nnOR83*^PU=!aYVwKRfN6y9a zf)MhtMF52HCYV7B1UX$DV)wFkPl?S=ATl02wW65@;OZrqr?p0j%6$*oZ^v<=^B3kL znT<$kqc;B&Dsh^N+W62*vRoZ$;GOc6XVLwp&KxSsM~a#s)*pj174~^73)i2zAA97= zUp`|Sx4%T3+jBC)es>!Sl4eNf^VA-cS|YBGG?K7VN!hEB^mVj(ZDAXVzOkeVdi6%_?&`W z`Wr145|9(`x;8pksdUUtgfc3Tj*{_Rs-JbhDK^=5mzn#f&wvm$egd70{yqS&1HDztCW^-m!i4G;PF^)rJXblV! zRY)?3-&^6Dr-SGC&3f@Y?^{?qzHRS@|PL3rX`XA}exC0t)AE9OJs7=v*blo-Q<&nH}I_xaf*8}pB5Yf6@uM(R! z%uQX0(KtJQ>l!<2?4=DM6GyAfG?9xdI&jTbf8$@z!&g~qqYWsBBH?qRW5L?uFrdcY z%a)DDX{bA?q+5E}nvDE@Y?&>q5mTcxgqKa}{l>r$&FF?oA^PO724J>C)Z^x%3GdPM zT@Bca;9^u31H5612}IJ2f*6#h(X z+qRwDv2Al=+n8h~_QbYr+qP{R6DN1RJny^D-n-7O^PO|ms;*wB^=GeD-F^M8Hf{w> zWaZ|9#KY>!RyG&lbw*Tq(`-u1%v$(;nbrC6uiloys}FQrmBf6)YWEI{rBwCNS4#eX zmgX=FI;-;uz2x52mO%Lj6XOr7%cht5dLV{Q&>`;jDwjoV5k^CnZRWYwvi1}`Xyeo` zTk|If-2Nv1#d2P~O2Ib{VQ#nN-0V&c`KMOL^+bAaL)^<5vviw;D!O`+bejS3h=qZm z>u6KHrCL|qwS3&iS|v4``Jl^%;h*d=tMnID>|S%9z?=N}%I(L%r}zDPVtXik(>-oo+oF%k2*o5mL(!<-LL8%smq|buQYV(rnFB3 zB8Min_3ulrdzEHyvep{y87qqnz}jJjhlkG9bnEpcx8+oR7yrb!joP4C?KcG1QXRea zdE4tj0R7b(h2H$|Ztd{8zRStk^Vzc1=Ajn8yK?NPkUc2`o8Z)>dt9f z)qkXSx)l%W9j_LDUR2_`KW|li&n`^OK9$Q_i&}f^)T-^3s+7`MMaC&m+o~ER{2P|- zvzpnDO{m|y2Esw)29MVSl*_3~Bz*Lg{brQ~la_u8Z2&u_-JY5QU6kb9gI;C}lfS7O zhaVl;ixsD|m1wGY`Zp&aHn}Ay4f!f%7cV!gU?qqe`|wvrQDcffUrHvMJnAD+G%*5l zoenCrO z-QCLFSK^5u^s6Wkx%(el37c|@iMe4uyN3%a*=kcLeL8AN=q?)?st$YUmW0)Xx;h>t zZ?@pnYcm8^dv?1y9xv#w8F^#`I}}}-x&?V!nR!N~c??%1j0kaLLUD56)Y>lMn9fi& zpwP{UNWZp4$_2&%!CK?Uzbk4{3qJs0D9BbF*pz^XQ50|pztR*@ANLy=3*k;;jiD)EO9ZGh0Fsz67f{j}KUFp7e%Rg|Sh6T?SF$edXy zS*Q<1gQ^6^h<%R(u}nZ{MDr^!7JR6aEw^0iOtfHT^*EF-JvyvxtdiF1loYp5g0$x0PPN{7K9n+2Pzv%0bA`p z>q899%K_WZV_r{6fuIBTD;aY$a|UcP>eOOY^=Z#5WFAvw&mu~kSX35pRlLRs#Hgd6 zbLQS_h5EiIyh|uXT=O(Sg&Il7(nkAeQN_d$lX93!B??9Wd%`5=DfGa4tB@r)KuQe zh~Cok{&U9^om5oNmf}mtF4E*t2&z6#@qCNMbho6!QkK5r`Ev57SYb!1Bo+Xt68X52 z$fDy|?Na?ZGJ@R`A%q0*-I6#AOOI#@v|fvhs)BSkOEx!ht&|g|*HbkXQhv39WG5us zxl_Ng;-Aqa7QQEct}N2dsODuCbhirW*{RSh&3%c?QnoBzS!lQ#DI=vRB$HHy#i{+$ z&VG?lC+|_Zg{xQ&p*jK&($g#rkI=NFQObQw-ZDyqaVX=XOPMmsEe4GF84}8-W`U7o zr8Vk7*+nIaH45=K*3o&TDORT@bEUsuDd}&i{M|}oVHPr!i{-kIf?utCy%d}GtSU)N z3;0V*#7~rprhnI!SL~IF8d4{w<;O=`mI}wWn30w>oxA0o_Y9p^0b_kpth4;f3Vcub zJFULz6}I4@Dh*mE23v*+TQ^W#ewyu@rtDm>j9gKDzvnA3ffuAZ) zec449G`Tb}OQ-CIWg5zb=0>zhSH(%nb5anrdH$B-{1&osCgWwO(^eHDQx}HvC&62m zp*ZweBsPP2)Pja|^}dz$ae;8}0f<1BhZk91Knv+AtNAbE zROw_n2|1x?##@+boX57Mt72!)wjAT!-2b5IXioU!A}NWwLcgTOtYXrLyj!^HPupp) zcBM-+)d~XYBFpS3f7Pr$%{oX0&1t0oJpN{oT`0W z(GQ3c-95YH=mhO((<|lUt8ltoV3l}S%=Hp^4F;toc{PZXy|hxbmfaC8^ff=dz4Rna z4MMS(kt!z) zT#atRFF{2nAx$Px*M81&pnIWcp)b@a?3C8bOe- zV$eCi;6{ESCeS0nfx&(Tz#HqIK5@ z4%8r8I70j*`_$r1GvhDU;%_q(9M=+DGymi2d@>V3))D<%_90{;p{yfeWFh6OBNbpF zlei-lpe5IE3J+#Refx%#a4R6njFZodrpbgm{taL9|1A3~*ODLCh0T4Z;Jl^Ksin-m zg^6%NjlToZ|Cj7j&nm#mCQ;9(zzTBW#Bg7SVt&Wy?!=_xh#qnm9_>V}^1sPGtgJfq zkD?TUmF1jvHr=8h_5vep;Ibg)iC1o?XMeQNynhU!zX3*oC~l zL8;qC`BQ{?!e3>WO;rZS&T!F7dErm~>%U|lfKHv_u(MKo10Q9ha(w`O!vmTN2&bg0 zczGY`4ZDd%(--1ns?kJpe5WW-&fCm}gvV|;-k`(iCYS%6jkn1(o5QNO$*THMzu#Fa zgxTDi!*Ji(;=Z0^1O&-Pm|;c;@VCkSiNhMQ*#VK$5!2nEz3FS(lFyxk%Z~$q#bHF- zqzd>Vy8?)B9_`v*85Kk=T8)@PoC3mLOvYc zz+onQ8?F%dmJmO#(2$nUKU`tSEn(SQ;l(ZC)m#zHEfL*Zk;5&K(_B%@Em7NCUqzs! zuets_wfymN-UFS#vHRE~{7md0Q;cX0?ah9GmXP+AKY-Tc_SWn#*{8j& z`mKr6i-OU;n$Qc@xTS{Ci@E)O%09fkm>s=@ynU1%eT=;QoE`lFyaN&)0}8x@8XbcM zyhG+4L-xGG?j6IN9i0ju)wr+b?qFV+9`On-os6%;%^l<2yc5G66Vtqt%N>*3yi>;= zQ`fxHPw(B;yyloZqsbkkl&?x6zef-OGmL!moSpLmd&>0(-9J|;KV}g>s!3l*r+?0s^KM-8Z9jEx zfAZ}>cI_bY?_zfC67ug+cI`3xE*y8x%>Ue6@0=y<+}G$jG~hon?>e&QKX&gr_TxVZ z={ottf12ENn$3S!+;vvXf8N}6-pzk8+;uU{f4SUsxy^rd4BQv-_4_k0n$LT9-t~{{ z6X8Q48Nf)^eMkGr0M!?0E=+qMbgLlnpwazcAn<73{b(=n`^6}>X0on_E5)l0M9YuOc(4b2n8ck9$ zhsK~Cj5>j9W=1r~B1f%(3&_0C8z_iJ(tt&?Ob~=XY^T~9cPOfc!zvfSrI=KlKxaH< zv&s_R5YWYTrJCYwJe^%_14BZSV5w3}E0u;vg9;_CC5{O3vn|nDquQW17#)!GCHt7q z7OAyA(xElm?+T}~Br|OKx!)cw0t!)^gNh+xtzx@ zv$#~XB63=jBd&D)zT&mYQ5o!Lp&LMIgKtD-Kt(10dy|AJXL-nuLq2ZDGZ%=)!Y0%r zG6x`ccB!u4Fkw0DBQ3R=8>6kAP#&jmy_g$+g{pwxQ!l5; zbTI)1&vbDRiea+VZdJi(&Pkn5nmZ_P?gfQ(J@4V4e?biwoUc6;6zWc>u169}WnsI| za*=OB5=xXy&@Fi}lNb8p%Telz8dm?=~Rj1+L1Lf2RKPxK=6pE zQd;Z_ck*{yoQ$|L5RDjWhobW}eA}h;w0!tlKyg~?(ArJ^TmGuOLqbxz-2m|)-MdjB zb@j&GIPg$ga=oQN<2v3V_v3Ks6DgR=?3J;SSiek-@9 zg9_Y7<-6K@#;9a0XfikSqSyH2|J{KU!V*S~jtL}Z+Z_?*Y@3U{BDAOpCI(aGcf|rh zdkf7xgFC|Pu!KWb#fy~Zv6D5<=aV%j)cT6bJ?WTD+uP0`t`z5u3VeuJuY-WAo z#Puo%c@9&?CNmzp?B+-Jar5oRI~dSH25R|PISB_l^0oQ!M=B{_vJdb}_E8E8R!l%Q zB~D-IMG$%KckxJtrCzE}faSlRqg zVo>d&j6k-8Fn5-(omml0n0{$ieJZUjUrJeH3PDry0m{6D4cwx#6I~H!2RG&GB3CoA8JsX|WP{@9%$09V$T*!f# zC6`F0=c2tjmDJSOcxmgHuCsZS)ZF=SY5yBncNZbKWssf0fv-7M$?aLu<(o;EBP=X06qGn5geoM&4`^@`SO_x|7z-R^M@kGICRBe;lt2J#Fh6RD zAbNxZexw}b9~GK-4YE{iyetFMOcS^STd)A3-9ab?ia zRgjRhVPFj)ppC(x&B0LYzmxiYXA1q!p8zJ60i}?IshLe-m`$w`OCue^DCWn)=gQ9O z$SGjSD`F@jr710|EGs83_fNq_`+>f2y%3N5=Tbw9d=qa9SFP&iQR)^q-8<|LlAjO07LT&4YuTlapf$3v+Ahs~cOpJG%!5 zhbKp;r^n}KM_1=_566SA2c7S0?XNSPFGGEgZKDqjGj~-hmqokB*{2s7Pd6!VcPa0G zQ-LqJz_%vg`vmY~3;1yX1U~*hTS&l#Ftk(#d>)tMsZ?4CJKdT;O#defX*h;-G4bCP zlKB6ykYHn@b;Fg(Ws-l)m;E;j2{TtSj$)igOsBbe`#&wDDEGu8TQ7{W-LE&wWXZPH z9gahz#+$yQ)gMp)+d^U!pNyDvpqrRquTMFAHg_@qq&<*YPh4X&8PA zyZP>T<{t|Q-%)w6>4~T6-xktupux6}xA*h?KNb>Wil^t}%|8~BUzzvi!~H)NlHcH4 z{|n{LFE9)!!e8asB|H8w#5+3yNa9qxfoSR$yZ=WEDZo9kA%%Ob^2%6C(imvR^Lb;S_paBhd+SCao6DN>gcIDM?q{cBPF}J%@sJ5j<@c5z8}7f@@hY z7T#~8(PsrnuVm$hvT10Q7rhj?R;Qh5oT`G|?Ks8=8 zo7LkWv==P>KVW%dmw2ipIi{3YqZYZhX=tD7_5$Z8*`$og^MLC`mhWtR<_dC+9ryb9 zu1oyQ@Q)#eBJ^&phTXFF%MWMc50fh#zRxSX_nj)-&Jna;n{EpCvRfLLmoFB+pPNk! zC{Y*ZBbNkh&b!Sz@D58%2GI^jrtzEh`$^RqOv|yKw7l1Y3WOacFD98-V8H-zW-ge|NMA9uKonRKV5%*euK;T z1}WJCf^+i=N;U@sb42iYaql-$WDc0MPy~ebjX%~z4g}{&FM`)i01;d+&`6>V1%-jQ zRVMc;CZsP38PV$(?ABB$B-1!KqI0*(I(#EoOXY5jH82fyugi^7^e$IQ7}fy z;gd#!BgLO84YGk4Ghk#yWYBVAI*m zm9O3Cn&M;Nk@13HruYDEN#Vy!Aq7bgk%XAv%4sMpN7i$gwsB(qC7{;Pyto9mcRcl{ z1Nu4I6`G#LplmkIEf9LBqe$%2P?jPk zfuTO)^umG!K^rR&W3NY=sb*MZHWm$JXIv6Q@EgBEX1g(SV431|O zK_4!#j63J-!bK=X$wrMx+O$mN^SfHzt2AK-7mfU{v+_b zSna8DJHs#oTW*km4G&T;3I}C<`yoBH@LT{d8``;pHC1qoYIEFT+2=1hjZY!CR)WN` zLkC**b7{4SXn#U^a2k#Av{hG|uLbx}Afz%Su6o!4J4vRdu$d`f)$d1R6Gm&Lfn2?O z=hY%q8~&9}k7Zv9mO9b&VyVaksOmTd8CuFD9bc$)q=6=SiPnb=;8(5QHpfF#ZKjYb zWZafwLUa4Jm^gwsv+AQ6CP`mor8YQ-{>5Bl=@|Va2$c53J_TowjUj_GpV7*RG-n1F zcBGnR|>aw1;C5rSlymYf~Puowrg)IwP==R{uqJ{XErF8b{){- zV+@nyJ;r22pY}RpwO-ZUpR9YV`+?qf?!hLlu_M%O&K;zyomWeW!)`{wk+NgQbnIO>+eUt@*BS*0MNi3L<}&o zt`ZY^j_%SU8U4U$5m#?yDABv8 z0DT^K9^wSKD_LRicp`{%chGd8`8pMNvy`Q7${<@LZ6-(Awt7Ef5FW#eTR*B37HeKa*$y z0h~Kd=zdChZSZ>NiOOViL1O)BFlM>=2(;3w6Bg&L<||LA6^NOzr@gCbP|PPajb7b9 z(EI68wK8woIJ5*L`W$lkX~3&)bkT*C()lK+j&EU5>qVq*OS|Vs_>S-HMYJOaEZVkO zt0zIP;v?{APXul)_?7b%`Axg)kP28EsCgcqKMwQ3U3-6h6Xq-2$H8J8ycQTYpdg|? z)qOtBQy2agakG01I(fq)lQlK-qhr`{8KX9sA@z_W^MWD6m-w~qf<2h~iT?sy68&9A z{OeeS%k)^0q(l*ZPNqJA3z;$=bNYAkSvMgb7 zfueKb3IK{*0MhOxB~rd>KLyu-hWVx7eGT0*NM_G5h;K89ET#zXOkoAY!8&uH=l8); zCc&YafMtJ~V9j9p6*08f@Ej_9_#JC_hlpmbh&%X#(aa>Q&;?o1X&sgHjp?@?3qOUD*8c#ytXW-|bgFrp8Z(Cvz zq>!7RgWwb+4sOB_wXoqmV{y2V;RO-qTVms5V~M!qbkJhSzAU8FxWyLu^`1zm-ZVhOg8zxz{Cd1b!X_lf&gnd&PC6kikb4*PhPNDcc8hpfsB;y(Hh)pIzohaWIm$aJT zP@3%1nmXX0*l?4~PMoM8#-al)%W6pNwzju;y#*$hl6&YHZkb0Vwk(yrN zl-Mwnu3?En!eCVEwY-vB9)K}JZ1cC znL3dguUEismdcnn8ca7T@{2VwZS`w9Dr1rxd0s2?PKru6^{bXqLJxL)|7vh6NqP%+ zI)ZYR`)at0R!+!j_Ka5Kmrir@l70V@{o6`u@>6F7F7!5p4*85UWUnh)ufK53ccp_N6W zT|j%5ye5VEgE}R`GoMa02auW;Ihswok{c72&i0a`{hH)qS)i{?B$-ygn;UPSU37|7 z#K2QjWLadB7H46VYl~Ctq>XG3li=)C>~V(VYV{p3TgbUvZ0s4S?^y`+Xf5*eD)E_* zi-Rs%Po)_P%>#@^sf3p#v=P=gl%}MWrmdAstYV0#CYw`7B=VF!XR~4FW2aR}wg$(PWo(>Pj;~c5jNwmPl|ibc$V*j1wS_|PRFJpv z%byi&SV?Y-=2mNm9=264I##87q4LA{3zt>JkCi#LCS=moG{$F)LYK#nWnIuzfsa?C zz2O1F%f5~0gr`-Au2r#zrJ6wI-AGqMqzCS#;%=irZJ9oCnM-@~ zk#+o!t59KPlS%M;$?>d3~My4Gr@f$Nn5G97C=_{L~bO~QQmxHUao z)z4#@tk3OaXW8ZlQuzh`>u+6cw<&@;T_u35cH@epuylXVF5wjpGk+NH5D?w7(RWi zvz_z#yqz!=-(GWH#&hMY*@<~ep=jx7bvdXy`m1USOK=NTtT@;sDGvbYo0g#>8C^L% zy#f>c@_4uw<252yok}!e7V$N);TiM;1$Qtl*cTlNcth~UeMY)NMG19g8ADbbLpB>j zb~ZEuCM7iysqhg!0bWTgrFCABL-rfPL%)N8sNUg;FCEB$0s)yyl#Ai;jo)F|Ty4_H zx7>p`-Xq^TMv`=Ke&LOv;MQ=p_gY#H#ORJD^Nt18wX+xGa=%sO`7{aOjAhA=)m&gF zhxJ%Y49|IwPo@thbd0&a_lv?LHRDb6@lF`vjSuOfr%o``an+oU4J^@ilV!9I^G?p1 zj8%@Og!wcQyiVlOO)k7oy2ef*L6zfM=QO4cS6xi*bWGVWk2k)T58zEq!cGo(WgpE@79An_kvu zP3EWlT;tPeLb_bao?Ke;PVNa`jE0(3OIu7+U036gY>->8++4ToZSTV0z=B@w)7u#O zxiONtF)^^7YLqa!(LVNbqYijpB8Hzi1GhYTxjx?+xyZNRo4J|&(Ic_B$zwZJ2*0IA zzg1qEujZA7b}4D0*;wWouYt2h6uGtb(FfqE&(fRnuB;EO?ER)6ycE9OS-JI>rfK$m z1MsmNG*SyUHo9uDGgr9{8|lyEJ^U-eAFsal&q21FbWWh$E`H_Kxn4Bed9k%{-JEnc zrF^)o_6}L}@_gn_QRbd=>XLf;G~-pc5nw+^Zyz*kkzj3ycdg<3)gF&k_&UtN5Pb$c zR{Wr@Xpl;OTm10ZI`gPh7TMW>kUo~l#i8!xhHdY#k?)a3){#}$Q4rf66Z7FR%n<#; zf{p&MaOVEeX85zr0?^HOf<=BymUqjOpuuqK*!TUo8x47@W3Qy6rrhSl_Wk%OY7QXJ zWDC`jqS8HZ(qFH05_2^)oOTf6R6|f-euCN+0+rt<)tH<)<^w$a=~KrIQ+vX7j#)J+ zmeIhZ9XVZ^(Y6<3ZNPCcupKSSsRn8i))uG;VAzxWyfuBb0!Ulu6Z zj@uAAJEC*C_($ieP8SfyM`3Cexa+{v&y~;WsT&Sws}|?=ug)V+kVdkkBL;@U&;IbF zl~0}KUvB@s8mfh^qW7f|@NHzJE4U38`5LSO-m7ZmjzJAB(fw{&z8_Lz zW)Y&MnLE43X=iTR?sXW4bfWWfCblHkukP*6O{cestpS}ISylqO5S33>ACI7T6=WAl zb*K5JD%-?k{?!|4)4cb!fCW2+XI{E}^{$?@xxU0cBQEc%V3*IKmW0i1pUE~(cYWkcZGxD5D|PN6%G4?QNgtf zQk3?^qw)EC!LXGNB;&~CvP4sr52cgn^|}JFRgPrS*lo84JW+lNXMvMq40y~QDCE-k zp~zvO7|&$LW%38%sGX^nsa5I^rm3B)R}p%{_;}114TP*uqy-?96q!DGE zx^*d~QKyxc|MOEP!lhZ^tiVx4mO<~s>+#F44fsNfK{gdR&csSqJXqJTxyY;x`{sNuF?KaIjlnS$ zI6ogL)o{tlkroxLe_2RT)I&SkX!HWwzu~Ng;fqBd)$o5#&JgKm|6?H`k4@AWbJxc( z7=p6NRR-}^RtRXsv(vAP7m0D|xw5-P(tXmL+pT{I-+x4CFN7n|L9D-!nYVjFzU|_LXF?S?|KRaGB>;>;3w%jR}ON0Sx6Lf z^RrdxsV1JJ_sAwbGTtv{;W8h#=1G1)2p)@Phx@5H4?ZAHyu3E_aKpRkgM5z^C?*>xr`HWkZe?Y1w{S&O!<$3?hujofYRcAZa0?e^WD z5WEh(kdz$`hf~VWy>OlKwDbjX(i;w=l-uoQ>H1wv&MlmE2~N`j_Um_$3P1*fgfR#{ z*F`n)pQF?K&Jkk?+6J9&>x=ADh9ITmRpMD_iF77gzb0hIancW7#@3U~eKo3A!?9jZ zf`at7(o!29)iF#l>nbscAwE5Cd+ob??%Cz4?h8B&{08D5)~VOw5042%rR4Yp{61z0 z6+X6taF8tfIJ*^;Dt$vEbnk#a8U-LYViZnkHQv5i2z-Z;^o8J^`iK)}g#5CQT)egt z3Ml)k!yI%bP!!%_Qs^&sk8O4Xa{roe^&l?I1e?`me3Gs3V`kCPSw_H_R2kPXmR<)- zi0-8zh4QwT9J`;3=naUrq$0(^+6<{^_rd_r(bNiiPfxTJ*wN-^qt zwz9#vm2y%ySxedd6=~Nm)&eBaQvOX+C2qqahJW5taeZVy_IZJH5zR`u`J`+srcP7& zY)$k7g@8H=rbK$M4076uCOIld+j;gdI3uub>L5~=r_D-zu}z@tDA>xPFm<&KQnh|7 zA;Egk8h9rLoUQUSi_ZRw1rL8GR&cafbC|9KR*Xir0OqC|D0gm1uG2oS)}Zd1iCxL0 zlQ|;4RNsWU)iXm%OSIRJflGXBu9nVo6+@HrXEy(?pk#C?mm|LXKP;rjrRHvMJBJ{E z?%u0YA$97Ofq-+?%B2O}HtDWy1YlDwESg+-P_e^5aKhnbrhNgN5gWY>wKaOauC^cB zY~*F_rU_G{fwVd>&Qss1&)SiSw!-^iy!0>GRgxiWdftH+Bf^V@4ne(r4W9S%2M3li zu}=w{5;otE>8y5MEu|&m1XBPtS9@%fVW?PzE@U#7RKKdt6&#zWv>2VliwlN7z$O(4 zp1w4|iIBkBNX?-|Gm#}X7Z+7QW8CC{l{z=*7CuX-B|zOfwEO<%p*W5vCynTCJ-+S*GN4$DN1RZkX}+Q;*0X zGu1wVSX4t?E3VNjJJ&9&L-$|j{tR|0Am_7`)>xZM9&#yS@0?ogJLm>%k;>GrXb?oe zFZ>a`D^jCRSM@%O&ZEtX|8%CCCSqwUA7XdWj>-tHN^uq!CHO<9Lk@AgwoOVP|^XwUN#hgWobBwuO!fZ{6tt{@CX>#0;YhlPl)yF(Sc#Usj@%b!)>(iOO>h zZl$|RkIA8#cnt7cuiK_7@|<%-nT;u4;#5R^4Eal^?eS(&KS;A$nb_r8?$Q>H&{(8% zk=pYVOS`MsO=aHER&qv`er`_~-@421F0Pkxhk~thtd3!>zjGx& z=gKj=I*#|To`pVxk0G*0`$f3)zL5khv5~c!RkVM8Ul`7WfTY%}P-M;lkO!rdT@=`_4D+=(z;~mEX4{WjjU0|vr`qQz^vR$-e zzo%)AmC^dkhG--t>$+?g=AjcCB(0SEn>9reJ?SLE)CVu>oqZjfw~#K@g3H<#hh@`_ zN$fRvui0)!Os<6|-WkALCCvq?i&nJSf`G<_nA=8YGGH;$PI4YMLPgbw%jTO)x^CQg zRo*!=FCyem?a14yV#%=Cg)#j!;TS9Jn1~y zqROOVIQ}3w5;!t3CXn%Bv~jiZ=0>{m z_+2ER;4tI_dGtkho_2prf=u{n)qHp=OdC@z+17 zRsx{lgt@GQ8=#6JLbht1y9I7?Zh)fUMHV=(I=N^vx#TigYEkIn!ro^RM!eQBr8>CW z!Q#py8gw=Z4b4$QJFqlA`H@#2`z*JpBiT?}KI1&L2Ue{oBj1yTFSM6GB~o@8IMtsf zlVT{MB!w4_!f_K$;q68w6&hQSzF-@A zT&S)m6KU}35$}*ou9Y-jD3A^0m}6t~0#n>s8`oPXaR1K!`<{mn6w^za0`v?|)N^Jw zVrGkl`)Cf^0)^|B=nTlu4y=2{>GwFKplRfX%6-)V8bhVW!0txf+{p8pzcwPDWb!zL z3={X!G!5d>Xq6BTv?ZXN@vzdeMnC})+iHEdRx>oV;aj=P??@L&k}IAP{0;OnXi7BX zvqbDFi)if&vhy6S^PE8{_z9C~`*L>~=)LXH0mk!O=&fmeGKVfg%y1(7@KyOPnavgX zVC>ViO0_j)3!^NmLm~^t%Bqd;!VAAAB);|$o)=1aGT_#ajk}b8TKC^{*4jG)yC)4X;d|f>id;R z=Sar6Lc3yzTDLzN9o7e{5hRjJMoa{&Dv`LNM!(v!F(0qCnrOP3WLq;@Fc7;5Q;C

    E}!?I5Rab-sllx!%{ovOUS6O*u6`@X=(D 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

    mg5*~*v;4&GmCyPvQpeASz5)om28VV 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 z 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 zÐWUm2|CuTI&^7pyN(q3fak*2(@%MN8 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

    Sg#V)XLt%fy9fP9gMqN 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 u?)0QS}@PJ&%IDgyxLO zp^QxjTeBD&&Zy9A)3Ji#G!CawR^I8u;dlad;xfpC)uND2X85Bl@=d;cxfO{cBcAf= zNE&zf2Nyc(6D_dq)#b^bJLZkwet`E($I&KI-JyW9jII!Qgmv@eRllqrFP^h8UkB0fb z+WmdPajLNJD}OBSZMklkzu+{{rRGj{L&tG=@sq`Tp>>kFfL^0z)1?1;9@UWGadO_e z`Fut694n7)(3<_o4T#ha=~E-A{|C)G1%FI}nPe5&wr`2wKAiS^vpQi6RIyOwP{sEs z)cr*!FKfs_5au90glyzSNb}O=CwQwA<%gIZ&F3DmSXt)1 z1UAzZ=cj7X6%-lc}NO6wsmrBiiteblE7yQ%LO8uq_^wfl8Ueq@(*G{k4$ zbT~CU*9LWP9JGh;J~97pTOzE2Xf?D2MR#JgZS9FP-b;S&!Ia^zj)hhBWa-1VZgptK zae8JMAPeJXEg6aRWF4X_ZN03Z{`Jf{!ZOV7BuPB&$u`FGr>tg_@9CLsLU?`o*Mu0M z7yDELRtEdD9N&v`jEtxN$E>P0QQC~UbsNXLE-3zHR@{`cKF*B#m}ALO8P* z&p!ArvYN$=aGw@d0MXJUW-k3YbY*{ZYH{_s|BZ#)Yd0~BLw;Mx$*JdR+Hg0_LVT&s zfoE;%t}#KUqYVS87yT3Gtt(NFpfwT ze9}Px2eW3x9%mpf;t>dEW#v8~NkV~gbh35v_s_Xs^(oAFa4ldcV*cz)sKq#;UIhx*0G)FJ0(m zovVC_N@>2|+Ol+mmRDC9sAywOh`HJ~Ur&(DEOP#ow3ZzN zf|M&0=}#zg3=zOYQ_C42WSizd}CHP0id_$SF=T+C4hTkCGV1?Da? z5fa!Hs8vJkA^b;g;oH{^REG=C-84+R_W^z0o5UO)=5psZ(|(*YG^E+;+y@YgQ2oFy zyiqX9A;LsIwGujGv~YVkQ$Wj0nnegl*)GFfVKE0CsZCk>)^NoFB82;jrsroE`}Q2- zX!Hs57(X&g?ZXH}@>lBkO1N+GB1vB~i?DOHIj5t87f-&@oj488#+Ut-Pp24_@-v~a^X9{_6sqzbhn zJ4dvsyg=4ohW>?51GL=C$9^KU{+ zPCs65%rJp|5hADdUfO24Q?GQxsWo}$M#9k((7MqwlEYo|vYfq#_7b5}A7gtj#yjBr z0^zPCY$LvarO>;+kQ{71;UYZ#Zr$o)?Yv92m@b*=tw=*k&y0_lp>p)%Q_aSms7xrx zIALoswB%jLLXODZw@tuL^O`vlBKNHUI-JR68JoSXO;RYsJoRFK^eB?MC9FBS zI$a#X9fdXtRuXHit%scp3wdzN*EnaUg)GG1_xyn@aQ@aMysajrJgL`(+%KD!Epxnk z{-aLAXMjgHBmo7s@zo|INSBh=j6J}NTFX+FkgVFh*jS&+bJkNc68pphwu`ss?w)?{ zl=)$i;SnUB_&?$IIV7h`aS(b~@MKt?vC=0#SWL0BTo<65jB+=M)8)K{w@%;Mu$$*S znSBl^U(bARJ+;$c47iM>83XkXQkf0$@BH9qrgh8~Y0F;F&5xGpZT zRr%O9v3_*9VRDTzISp^ckNuf&ZdJEIYy-citCMO4L5;K{VHE%gT0T1=T$5Voa3)$Z z{n;|QIOj&%l|tJ6ASQr{CwL+CV;-2)yL&d-JJ5x zlLvnuAAj4F)g1huk8_)=)kMUcS)M6GJSG|Mu*kW8;=ky?5-k~Ko@g47&P(~CQOa*k zatzA2rAzZ9+_Ut^3A~ragexP;UZBO5EK7ALlG@cwOKJ>OG7SV;s;|Jss4)JFS47Gz z)5-W9!yqvB>tyf<2|rh8mLbQmUO;U!569eQR!r!9DP}H&4F<<@SG~|nx0dc}!y-N9rY{}f%kNd0TT{C>E4 zkmrK)y^i-WOpRC0*KZ#RT=QBD;grQmBn5kvfhH<7L}GY&D)&jo2B!Dv{XQ=FAs>jH zI8165(f{0!F}+dX4kVM*z&oHy5e>%wib$F?OT}{tp#((p%bnD+Pe@(`0y{;ujd`GF-~WT*{S-%NbS6T1`2x&PY>QvYo>xw@Rfr-7`X7 zD!@$5CL?ep*vl2uTG7>Y(jwqmpw6MADRk2k^C2+jO@Pafi;GD`E*8a_il=i|72*E~ z*SpkX8SPf1C_R(PyrQL>CoglHifR~Cxf=awIannoRjrw}cHOt-17D2^Koy?Htub;` z%{7u;W+BDadXBfD#CDZE2*KC6bleUHsHYt%d7pMKMPHXYfZWYcC4mxPF zv}g|`4ZkHskf#YnTj_SzM*8%TjMMBZw@#7p3bw7}hqnfU`OyTuQGHEoelZdKsKp^o zG@Oidh}^WD*A~)@?Wwm$=C9Uzr*xL(Fp4=)?|mi!O8r zJ5fWq*Qgx!>L#(x50rbT)}+ufi%gaEJOg)D0XKPDZaSIjLGLXsi1*#r+*(aTI*k@5 zsJ>ko9d$~je+B%pO+T1Cw9x{5l-Gx360aoPd80*?i}m#q zzGR7|)SHLo<5Uu|QRxj;0kM`ci*441<}|h&3|k6T9J1kwMOI76``F!5t=jdc-mKCR ziI?K_m)&&;>H!Qy|4lREkLyoI8SuV}0GO>wIfnS^Il3AvS`^NVuu0mbw&kDl8%??! zgb)kFK7%MnhP6Qhu`OC;Rx|RNpAA+&JE*j#iy2U1EH@5F(JrL~Kggp$#>pU%(GY72 z6RFg#M#(51d!BYF>59Gw1}AwBgtG@GYZ(d~WFK58D`plSK3H}883Mz}Buou^Bj>Zz!(Xy(Z}2;svI*6!mxmzPC))6${f zkPos&9)9_+EZBymh8%d6`dbRF=?OL zp(YNPnj3>fj~Z91QiCj*sBPp07n@y{9VQGWxW=d>iUO46%aks6-q4^LY#mDsRjJHv z+%Q%-8|3@HUC`{4_w_Qhv{O2->4{6se{*xbeUOh)8mO&iCYo-h^T`H`ln-V>$LFt>HlOuJoiC&ZfW&_gzGWo>u;#nq6}s`Qx6G77cJNvv71X1OB6mT8#rQ z^A=hN=*XHhkOscfls5r-zXt;HYaF6WXwxPzb80+u;JlXh(e`N^Zc_dINE`nwaa5`pLuO@w%(7Ii`1(F(-C}+`aFVpT5Wlx3p#+{GJAEica(Hq;)zcF9 zg>5vSZEUc3%)zjrAoyc(G4TV2>hl&azAiBx8$12w;@B$9&Y>+eK_g6#*W_v*FMW2W zKe(ATd#yYNCnP`7O7w2E0HRyC_Xlc(Eh1lY*RvAcrZ1@oEb;5zsk3q&SyyYHDl@Yz z_trZ|**u6DKxZt&bw4qGQyM64LDrD@cG5{4FiJk2SmU?DxUyJZa((SmDg{d8^<-Vn zaJiv_kieu>H!soONl{<9t^!jPYI0_(&n`rb|1w21A7)R#qs){i=NaSf+2tynae+5j?b zbY%Kb3*^yodeF$T33lp5;2C9*nMJS}$3u;#9&e=>vX%JD4Zmd1NE^=Tk)@iQ;M9C~ zra%vtx)xJ%4vDa>cITY%yxGt)6{ak)xGr}I0&P+=r_RouB=|e?vXU3vZK8#28QDpv zU{mc)Qf=Mtpt0y1S5cPC>_L`PlX5P6PTfhz4|r*lT61uFjo@~f80+m4HpnM5@0cJ# z{ofd!5|MHPJQ~!8b0yN9>Ypo!0P?%_tihG{S$JnxdU=;-+iks#&NYn@UnneN?jz1z zjW3v^Ub#&kxTDb@43T(ZNO;(_z&H#%aa>JtUwGmrn&K6B64aX#^m!7^n-cALl0Z#K zKX{VCP03L_DM?K!S#Bv5ZbKRpq_s_H9X#p%P3hx28S_mU>pYqJO_^srS$9oYuRK2i z%|Fq3vvHfVNqBQ;9Y1U#1XH_Hmd($MnI z2oKYk_0+)S->58JJ?zHd*_HmKlWC$Qqw=XG?kUZ~pr)gRr^h3IAEup4n6u}pv97Cg zxvBFV|Ic?GW*aS;T&?M%o(=S^)QZnFPfuyet!-TXy`}y=0KZ>fTKc}W)VDm;nLnjh zw$?Pjv~hX9R}m#+=N|$1jrKox0lMDb`%%~WvClk@-Fa5;!?cV)w5mT>wX{@EdyZ{C zk6k@8A;OM^Jxyx6Hv>fIeY%^LyJn}G`T)GWurD1T&zZEgZo;R<28i3jQ*)cL*P^J` zq{q_&pe-$_bsd>eevEG zJ)2m$=^^8z85WcoA9)9!F>gh?~OS02#0bT6Pwj|l>cl>w@z~N8+ zZrBaRq)}^4b};Vue-(@TXc5v-RX*oZ(i&dVpvcCi4hgr;GP6%dV%jw0J!bfkZhq3O z(sc7jsM@@;;`zAVX3|#@ByHP-VYUgYYOQCR=;pLf;>4n}a85Q|CSaNq@gb2`^kmOZ z9DpBYURthbSfJjaoGsh1kWc|7T#r}#f@wnZ@iNnpZ$A}DmMSocTx;O@Va$yzi#7UU z?Bef8LqC<(YDkx~Akt%f?z$Fys1!*zDjsjg%o4Tk&RvLAEEC#rAL+$43|H#Iw=A3N zBXk&v`8-H1V@Ikha#8)k>GK0iyc)IaSpV|#MIk#$_Ka;4Z9-{m&1^Kb#UOnYY^)Sb zIi=DF3p0udZ+^iNRVi!2&=8Kx2vSfsMsevC#bxw2ggk#CUMD)v=~zTLzJ8Oj?0lTm zvF@KfR$^c3HLS!40z4g^zbOAK&ZA5{k{N3KY2b$Po$?UwoFDg)ixCvz^#M%#{V>dt!`<7LPDUk9~gT6QqON%a0=5&$K zi~m;AvJ&b2oI^i39W5U&YZ9poz^H*VYr*ARm*4rvuyMXpnFh+}+EP0`$1jdEiIS2y^*wrFSV8w6!!h}WEB+*!`zF64mnGOL0|DG_-1Q4 zA!}H{H@&UU4N=)Gixs&s4!FT_I8}$3-Yg`B^0(FPrt+MvT#XB(ug<4c!W9mVC))I8 z{g5WKNE`_5oLjJdW&wQ6`<2k9wVLEKnzc}>GV1(8kgxuBIqe4AF!JbVgD+EIZF8$|z+u79_8LCn$8CTN!}SJA zXo=(Zsd(^trD$Pu!ZzC6r<-#7uL+{6Oqrcuo={Dka(->Vvm^_n+9{&sEq`-L>=lX* zPz<1=RQDD~hzY?zvhk44Ml!?`#UH~6`mnQs>X0l-bb2lpV;LJKTb;gtU?jpux%JL6 z`70GuOo*KG*83D=QDXU+P}N!p`3C{oo*KMysS#E(TvJ#vmdKcJQ}%6q3CdpjikJvn zXX6n`usF|HOr%TgHj!yjAJ=J2l-G4`*jBKFFj{PMAUh@T&Ao&eQ*2B`tqdtTzLb=F zY-|F9COJ`xl$_mVDAyAhM+je9DKa)bpM953DMebfA~vDid6(W0Uq*8*HnFaDml4_r zLH9H^sd;CI*%yC=NMtIumwk^VCPmhiDK2Hy*^DgYM%Ge3E_JqckE1$8&Nh@Kb@_Ua zs}o<|Au=v~H_w=BG)3N}A}-^^d7rN?MBa5QF7u{#U*IBTd~i@X>*ad?%Uc3PU+=gq zSdIf>%v8ldrt6R%lY=5rG6JO#`S={T3llMxRHX>J_}rsb3khL@Z!wYac`?rxQc9`c z5-Q^JQTQ!o3<;D|#^MWnT`lDtQk64Kp3c1 z>i+0T@Txa&B~*Idl#1MZO6fpLtO{%^RDy+hL-qg%H3>nzLvP;fyfr}3fAe2?hyIsY z2o4So0RaIK5fK>~`Q5vBXlQ7JgoGbIekA!jpk^MZqKATlg6jWhQ2%E^^S>Q*baYS) z5Ca1P6B85E>%+~>{g1szOiWBdLPAPP3hMBYm6es3mxr2s6crVfl$4+r9~Bi9)xSgS z?@<4j(D*wvH8r)gv~+ZI^!4>R#-cXoCLfj}M}9^T&G zKYsl1@$vEX^$iRR3=Iv9ii(Pjjg60wPfScqO-;?oOexGxFUiX-EvTq0`c+%f)KJ#e zRQ|iQqNlyG?{{r~chf*m>p)LOe_!`NfA7FR-@ris;NalU-!Tl0k&)4{(XsK-iOJFF z>5=)F;l4Wu|z4h7Mwb|{}`OVdZ^_9i7m8G?n z<<-^YwbhliwbixtwT+FxoI;yhn_K@8+gsaz$Id^o`|t6OXb9>WI`})F#vy1N9Uc9v zcj)r+^7{Jv_V)JS;o<4&>E-3+`T6-@y+fV;i0?n?3{+)zgE2^M>A6|{Gw)Cwt#ZlN zMf)jAsc2FG$C;u@axrcsq{m-1|Kc6Wm5lqOJ9Motlcbm{ZzX+W-chPvYPC94S2|y5 z&>dQLkNx+VnNL%LPGwN<(DqPFy88lq2x8BPCqhx8aHNQ_d#2utPIX`@Nz8lC>EjkbVP=QI5&DlDS2&b9~Q z==Iyv^+$TyaaTt)ThOomEc~)w7hH53IolwEINX9KxbOb<4!y>aK!r*>olgB|x=r?L zjfO2MgS=0Fd51Q9FfMWzd=ZK9;@l8UL^u2~#A&nbp9UyMypD^M$G9I%og%2>@42Af zp+t)<(+^rjIiXjz+~@)*ICk-lajc4(As%ba%xN+MoPKh8MJ=J;6ve4(D zC^yn;`x$YELqrV*DFuXMb&!3qTfCohRCZXvcP?v*AsDP?b(mkgsVtwg=6pc*layD4 zwjeLj%E~m=uEdJxptfW`5fY2zJYHNoXZ1(p&eK1O%j6Bx9*4FDc|lPFj`eZ1?rupb zSMw3?7ebQZ(l9;`-s$ebeR7xe2=5DcPIFRstOB{ z3FyA;ddeBb7Kf6CBpjY9A(%k|Rl_{uW>yPyax-rLX1rZ6NwU3Nv?wgUU9xF7xn2I= z&v>`uJa2oq>bhTk2U+vHJGomoAAZ}v5zzg%moT_vGluORX@|yaqYa_(@Eog#nWl)-RaZWZvgZ2 zc@M7r^Thy7<@4nT*V*&cgaq@;^^Cgx%gus$<;(2~=woK)b00*{tj{-%7ZKmXb3g7MeED2afs9$?_Xpb#z*;{R+0>m&?9|vN zLhvonSvHRxcW^+Q_cEp(*5nATNkUNV8(B*(B^mnQpu7l1>`#<@S_!G4Z{L{Ni;e-8 z#106v8Jn2D<0y~V2YEFM#uDptcToifW%O9lQSRROU-;0;DnnaT4agR-!WRwAa!k9L zFG$cU;Eq~~JCc=6=O2A{5%_D!HY61L7_VgYt-ZzA!8S!i$J}P6%6{d}x1*%+ew84zOn%C0Xw)q8W4URMT}~xqg?3IyrlZpzSmF+ekue$h&-Pj-srfNSB00i#)UXXx zS;*uA35zO?QJ@sKzmMG|R6tjmnO=Edt+wQT00AzzX<{VyrnX3~+zKgqXyW5|nZ*Z4 zrdD~163d=y1!=FX$O^%L?@>Y=wLtObH!)KkXkYO<1uCG%+m#`m=9mLgPqt4@BM zSQv^u#0*L>GAeb=>mSUNs>wqF3o43|;Qjd{zc&x2HWa)QJG0uCS$|x@4XRRI6PqV! z4O)SEquX{xF5k@inoKvez@2`9xrkCkH0~TT{VBzVxv~k#t$de$?*CeCm;iyr_@Qb^ z19-PKDDoT2{^wUD+6#o^X57L*w)P_G0L03Yq_zT&>d$G?fGeDzefn*c(O}sf@-ya+ zfngf)O8gBNpZ6|n3_d?J3w?YyZaOwqs>lReP2)=98|iLX9Vt-E_CptkN8tk?G*S$* zE|-mOoF~Aa-*zsL@R8S0WmcFw@f#Ds8vSCmyW*)Mm?nI>?@#Bb$-x~x5C@|VPV6uX zQoV@j2sWk3LC?_0sqfMorv!O$^dx>cHr)z>8O3CB@mG4$VUuV~vVkz9S2`l4Bg7Ro zWZJx?bim6YxcLm`BqFM)Q7M<^7>{=?Ids)kHrig8oQSNiEzD@0Gcrx6?WJM(!L=(z zj`zC>9@MD1f2c72d8SXG&MCy&P&D0b^&@o!S@^P@d$+rHXF+}Y-RPOON7Zssx6p^r zZxmy2Tvuw}b9W+HNwWMRoP~7&mFN;V7={y6;r4%~X)?DlpJ!T!pfwFZB;*|*S#~fQ z!&rZh<1LUN_jJPNlMKknU!^WT?>#9$h$uq(5*wmP$s>8j!1C8Qgf9nx>!vB~;Ohdu zmqW!U-iJi_8*J&9BaQLqxdyb>5|1`N9rTuke)-$7A1}w43@uCZW4HBBgeTu|bC&nz zp&Qq_bq?cCt9MW%)e}*QTh!A!K;gbCE73Aop>+#){JxJ5auFTXxmCBKhCv4ZmOc%j?ERGmX;y6jpJ>npz)`*C&=Az z^!9VG!t)m4>-~U2`(@Jj^B&*p!$eg3b)mw`k@oB3!g%{_!_D~1smJTn271SRzXIek z?e+OUq2qCW9CF+8`f?uC@w~6_`ndcGxgYO<+>O6No}mAQ@qA#oec&{F5L|r_lYNjI zeNYyB(C&RO@O-hjeX%usaa?`zl6?speLpVv65soh;`xzt`%!B6QM>xlCi{JA^kZ1? zW4ibIjOWkF?a!{^&*|#Vo$Sxs=+D34FL>`Sgcl&f9q?5nK-@JzGC4rHF+g@9K>j{J z5ijr?cc6+!pqgu-Msna8?pvLrK)w4wjDbL1#2^!mAb8p!V~ZfG#-Jx~kj;J2ckUk+ zcyApvz`!DJJ6EuKBY2Z0$nzddf{F2W0d)HoS^zD*8GuoP!Ff~2|NlM&1inB`pb`@D zGBPSkN;=xwwk9T?wzlC8jtR~#X)d4)ASesymJ4(%0J;|fy^4XprNE#HVE8X!RQ=ys z2aNay46OtPmjQ!{fc`&$KN5jnQ9zGSpnD(?H40H_!x(5S2f`OhPAg>Uh_uu&=1n3h2^bH02 zgadsdfj^>w-Z3EWSddp7$SWS?nF#Vo0=XxH+)_YpsjjYRuCD2BAZTW|gEBopKRrP? z-k`i6paNe|Q2?kU2vimfDhmOXhk&ZXKy?wI#z;_e6sRQ%)EfP7*%l4@D`P-yaiI1D z*N!B&juiLbsqUTWp1oOK1G(PA`9DSqd`64>#)<>RO2Ol0A%A6g=tOzwRAty~b@=?R z$i=#-<@)HA#+cQnxV4sqwYKE7_SChGw3UvmrM92*E!oped1Lj31HVc-epS_1)|Z#J z6qNqXEa^=t=}#;fh%Fh6Dj5nZ9r-KEM#9TRBFaaiDn??fM&o~tCDo0lHjZbuPW|kd z%jufW>zywgSSTJ|C>>jljW3fOV5XMFNd>#=gjlb%=4ewC+PDaXLB!CbCA0^$ip1u zaSrk{2YH@{yevQ6+k+JHTlCy zpN)sorG6ERrg1y{-^8mH?|sGpDu8N>rwjj0yegYV^=b(%fc|_bg%&{nCSJ`lvfZjX znXCQx0;q*?zS$-0uL6jbi+wq4G-?pFy!MUWh-=AOn_gg|A{em*07}@FA7i*;-S4CF zw;WZe={cAvObdocESZFSlau`=_(0&YnLtHc?rbRAAhTGm-cS%B7b!K_kc4p6_BM5M zA^)3-$5;)IOS)gfBigZ!>Fwmy3q+$|JLi7zqE*K0wc&*pCN7%d{mn|ephf(x`d(IA zSJe&b4>^={bayZmgFf{<_g#3a6&yATze7%u3W>;XwJ+qDgm5z?JGmIteCruT77AmseIB9 z+SF?UDdhqm>Gw)Ti>V3l)VIqv`y6a5%)A9~yWf?KEIt~A@+5S93f-ItA4nO z;&wBUE{Q$m*1}@VQY*14g1n~tQRbdDk{{(3>?!#by(%J?mIdz&S(PO$EtQre;maV^ zBy*I^=5~yw9+#JTANdyctWjAcQsN*QN%HG6-gTgABkE!#2`r(@$=r~p8QLlc1vhWDCX2$)(gjSYTnvl|Bbut^wUlQkCm}?JN zU9ZWw>WyseFqK)W&48>NExKa#qWWk8I`?^oUL+e?HU|Ri0_|)iD%YzsP#QPo82k5_y=QLq z*{Tv~4A^#Xs5Q2xXVpYF^0JdJx3oe~PJgc=$!|7iDi^KxZ@H*));0p9$VyDJytCJuGrrE^GDvNIG`+mj_Rngl`^?Q8pqjvPn7#z2&Xa-LUGF-pP;c ze~Ur&*gSC*ewn)TlUBO1bTSQ_?Wfg&1rNn@FTI*Df-wW43!X}{p$P?VV8Wr|%mv=D zUSooLelG|@=-%tBXO7nke<;vnoHBnT(T>BO`(ZAcm?4#m?Wvd<-NhK|zT)8P6Jw>@ zp0?4ub6-K3@+hqPU&OeD>SEMtn3mAy$&he%arW4fFgZV&R4CaLZ2n9&oPrg?8Qhqp zI3bHGqLeWv%8mN?na(~|Y)kE;9|H|ho}As#f;ju9TJ86MEu-;F*DFK>x&w(+%A70} zsU9peE0c9{qmzkg!Z=DRNttU|qUBrm!p#u^{$;(q<^lmmyK$UvxdiuXd$pIUC!yVW z*zA>aBUx0_KkV~JKDIU1mn)s68W>?$FCQ%J1hX zJCZ_b(D+lj(v}hX_!B?k9aK>^`!*xuevVfTsJX71DyQeK{fLHkHzVzPdCDO4alED0 zNBU@mRj`Tu+g*=gap7cnL>bI%MU}eX)gcy1t~-FM>8|+LRGL1%W?XuEPQYN&Je(z? zm@vt*Eo=5V?bH<@pY}$@VW1Y;WmyKMp-U)4&V^mwbhOdNJhObt$uKH!G(g2sl1(## zKIJ!VW4lXL6}4$@Hp>i}Qb9t%2M5DJrSvTe*KXuhYNG{Lgeb_{v@?FAoU$^^Pjy>! zYrT#Mo!nyQ6<10Flu}e~o`W9>YZiwg0dn+jPh=e_6vk6;Yq>Pvp^#2|KveNzm|wCE zopi?1F1PvQ!6FRt1eK&AWq@Y?O1Ddl-YrRU!T&|UleXr=evuzm;} z+}|rNq<_%!{#)cXX#X4N`F}y^|N0fwjt>I^1BKK8000FA1rrk!7Z>**JpB)whMMG| zc$$)u5(=oHR2j;UX=!Qy0mT34;29Yip_rJNnfX7w@K9vT&dv@szjJbOLgnvJe9Xhc z169ED@$o?yi%^s-C@A>l%NHRbAz@)*s1#mQRP^iDuTZ!wE)HE4N=QmdLJ_mHwDdoe zSx!#wUqSOf;`o19Gn6w!Av2UM|3j9wwY8yeSyxwAPft%@U*EvMz|hdp$jHdp*x1Cx z#MIQ(462GZH@C2`fI??0D=TYjYbbiQwY7!PXM215@87>WI5;>uIyyNyK}ocWiwksl z2<6ePuC8uwZtm{xP%!Q3>FMR=^{;r^&(F`_-#;KA0LrO@f`Y(caBy&NNJt2jS%-y% zg@=bnL_|bJMnd^@baZq~ObnD_$Hm1#L3Tny0+eMZB_$;%C#R&OK%sV8T3UK~dPYV@ zW@ctqR@Tp-KeMy5b8>QWb93|Z^78ZZ3knJf3k!>&mipr2l9H0r($ccBvhwosii(QL z%F3#$s_N?Mnwpwlzkb!$*4EY4)z{ZIG&D3eHa0aiH8(f6w6wIgwzjpkwYRr-baedw z{kyZXv#YDCySuxmr>D2Kx390SzrTNAVBjB8{x>Bb866!R8yg!RAD@_j>gy+`rlzK+ zr)OqnW@l&T=H}+-=NA?h78e(nmX?;6mseI+R##Wo*4EacO8bqC&CS2?GZZ>Qi8GWo z{{xz#koo_?mrqYm&(6-EYWs_e3n*y5y1Ih0=9?R+=>GQZ?(Y8n9txcwA0MII848`D z=ou=#|7+#N_y!lc^7`J{;g5)pESvnDOf(RI1mbibO)eUSN})F68e=RT@?L;k#{ecT z#OLoB#PQDzVt>;B)A{y)-n{v*=goil4lFDzbRPX5nL*I00o`AL-qp~%7kZ;Y?*!;D zLWkm?5%@>_|Nnpe|I`S)zP|o9pZC9i7y66;@dMBo|F(Ja;v`h{^Y>qyH!250*-e2M zBqHgO4%tm%AMmkc7cdO_ec@5vu~RNK`U7yOa(WJ;O$Yyr+U4;wPbdLD2EsnCWGPmF z!jt;Eud*SP`=R=qK#_{6dd1iOs9m5>7PI-`0uO;F7Ov<|vuTK~wTe z;A{N6+#UR$UT>ta+PDW~I3`B0Xr|k(aHW@_#lb9FroWAa6Y)^}chd;HQFqJb!hAP9 z>WrDI{$;OM_vdu%U+SIZ|JF1jpNY+iYK0>Ywvg~g)YyyXhEk073aiahA?dKz23L7z4e5_MyDUDj<;CutTO-?1bU z+BQ|wtV5edSZoG5Z&E5LAG#Fj1-#K}$hP|>ki7Uc(?vYlzu66u><5Ms?O#nJ?)6M> z6KK?f-%BBGsqqttk@_<40%D@6FU5$%TEwsyoCTL?cjHymkWzwp(F&5ns3D04;l7xf zu`#I9vnffx2dVTNrGSTN3E%tZ_R|G77mO3v6Yh7ybS@Tf{i&9u%u*gZ&Ehkvt8u9^ z!a0vDa)W^bo9-JYhkHtdV&MJgYO$UzvzWt0vq+sT?xWnIf|3%?f}Dd{DahT;z>d4T zE#8Knm){_D0ZN+|t=_z4-AbatZIW4DDRt>_O+>ajmJc4$Qa&&?BQa4qBk9q?nVd;AVhn!`s#&K=E7qZye z1Y|u`#r4%DL=rk>;85Z}Z1Er%#_OT4l`g;J-z!r)fke-2Rwj-2RtQH~)2wdNJnOGF zXT?BXI5QeuW$aG$99~D$hQ6cuaVlB-zZP}$wK(S-J#0ZsHgeCL5Doo{1`7|XxTB?+ zjAkOx_;&zjeYNfS3AgS((@XSVv))JCU3tA#uI<1|frovoL{DNhz@w!=Au3A#ReU2N-=_tX`fh@Ejkhyt?DS!sWdAz}JZt7JcK zfV*&bmE1F}*LC~$yANGx0<4@spCe1=|l?K>TEw;~M>#g3QraMn-sX7JYaG-~1h&x6Z^h`l!8G zqHaY=UY?WFzY;jO+T`U`AkZ=GjVeTMbnlQW!1sR;uL+FfHY24l2-QC^Y6C4_McWvCIad!yr?jBsz4B!9n zn%aA6&pw&cIeu2XRqr}n*L6SlgmNf7VL20^cs=7-a!A(L{~9>uTg>W(HDaZGo3YGF za9BS&Y43fTxs6!LIV?5hoN=3VEL+OG^grNDR4MO~)U@~NZO#*9qLlw}blU&rHun=! znINq6pFrHZyl--4!dPSf1KyO0QcBMNweJeBC(Fb+#%5x??+Sk+fg~lQXA?5+im2p3 z(i&s4Dd4+e#%PeNh4fs;>Rk!vBuL(4Y%b^Ju2c}ITro^~{^QlYOj52~IdyElg!>+( z7+tPfD!ovyeP6CQS+3qPwovVTU-4h?MtZS6I_&Z z!(OCLzelia3T!*Db#YJ5HZxGe!4e3#su!GvMEow$KwBKzZ)lyhO+54*GY%Q4Z6HsI zDT2-)Nw_i{a3MDCUL8YG`azl4S7qs@I!VXBRL2^y6#q1`!Y=lxMK>GmUI>K?!I3|rJdZtA5KdKrUFC#y12%rvk1_I?a_{`uH49t zwXP1X7m6i_sAa}zigg=k(g~1XYlO}isq$!*VP0|(wKZy{d-?^fyGJ=X2GC))?-lRE zlyuHCdYsZA9Uwo5sc%1^b-@ubsZWMvq{sr6te=POUlD%6vSo1Scy_cX;l?3gnXRdD zRH}&|tmQ;)QJ`5*dBMo0@JivK`)~@ZF3^K&JBa8B+h)4z$3m?h^yrt;buFfnOEmUJ zsGMuUZ|H1Fp{ur4HKbeo(;M6#bg@63$pf|uTv9lQ69fWb6h<}P8qTx=1S%ocbjVmV{mzc;HZ$AolsU)X*c1r0B2 zyGt>1v|F3I$h3NFVrH#`iLQ%zRxYL7TzumrkiyblqzByC%5CY|!z@H?j6X5MMewvD!-esPm|CL3jq|YfqGpj7+8Y;~V7%!udMl#Mbu{5E_797JwD#c`W?1 z^dR6#H2_W7e#rbc#nbPfBUFH;z>DBO)<8pYilD!uK`h2WDxpDFML~|JLHud*f|leT z2j%8?4D(F;54`bR4)cEs`;8qQ$Qd5286N5x4hc^S2eyVsEr-WEg~wq>BydI~ zX-1@YMx>=hWVA+PEl1=$MdV=v3pjyAn!plIU|AZlycJlv46J?vezZi?b4E65MmBp! zwx&gbTO&J`BfFj=d$6PWIHLwMqlP|OBGRJ9TB9bGqo$ssZeV@i53y%GgTk>x42C@B zQqgL{wA|Ib)JQ$=F|=_owU3=J4v$T|g}6tYf9Z|{8lWeOpjCo>7WrLl-!MhT<|KR~t~CvGYvk zK4h_qVu@-buIzzmAMRz`^>#rQ60j(l3;mdoec7WZ2q8|z%P@u zFuMqA0nW{(#Bo%rmgwCBVgUJG0khOF!7eKaI_Y1WI7P|KOARNl32cYsa!Yma*a?X= z0FoMx^Gf#LDebX5b=NdituYxPo+&ZS5-UiS1uWhaou59dLTe&*}3xI*m76p;})1n$FSY-pg8E`EUWQ zn2sW&4k{QKFQ{bwEi&TnVxuTl**NSAB2GI}Sr6%%C81W&6tpKw$wKBi@vzw+h(K11 z!UjMpaFRQCVxWboyCKEtdYD;zWBauwi;>IbaM{I#l8}SascbYO?8Ja3HM1nN+PUa5J!i%wf1Ts^K_p7E*O^@X+l#(zP-rH#y5#KAd^!pmYXW2CiC>@!WFd{zGLMN>#I2RdjikIf^;cipT0m zRU~!w04(a3<&R2Gl1LlN{%MrrOto>okqnTAqRkZ5nzIY4X7Z^T-8%)RB(UVJ>IEEC z7f9R^!DPa1Kab1Q4NnA%SBBYEyC9r%VQdl)sJk1cXJ@aSUapm)a>QS&!{VV#TEGB> z)lp^EQ@7XCu0iVQU+Wq18kl(+SallMeHu738@SsWc-I>EUmFDR8ijcp%e13Kd5BcY zGivW?r7Geic+deaIC3_LFW+?2%^DTX3ItCYJL(dD1G6l67fXJjR=QSEKbJQ+po)zA{EmcuiI^P2A7czt&np zBAdz5lbqV)?9OaQx!PjeTix1Y2~Lc1h5~?@Z5}+$+skbMHf?D(Ed`M+?`*B1XKh-u ztv>DG$jp{%g!X{(Ttk_5vvHK-B~!;tz3$hxi1GG$%Z`!Ej<#UF)-qZUivbDi0qNd+bJ#jEIIIGJ17%syGl=lr6aTalG=YulVd) zA1i4#JVIYPYd^Uy`;M{KcORu${Feck327$$D#ddN zXZW6q;QqHnDXfU}4z?kVyHaqOfPZQg3a`W#DOD<~$Uhwpe*F6Eks;FoZMsU1+Gkft zbfF{#hjdvprDxV~R&dRvYUhu!&P5&vT(9~8YOP_7;cT_ep@EK!j?t|3(Hwl>kug?+ z?`Z2dTCYuQcS%b)zN1Q9I_KZ(i598(VtoIO6z=8`?}IxHn*&mm6b5sz#^1X{95K z1DF>Pfd`K&D%NM>c%7fLm#nu^(4~`ENZwT0k-TlzzPFycS!ti&WTMeNO}07-?Umi| zf@Rrk2_4D8dHM(VYO)Yt`iWpF*=BO1B$a;X4;GRxT2&JYR;6>AX{x(H^Ekw5O~nZb zF)8|lPJ68Nz}C{@Y=)Vj{UCl8M{jCKw#DlkJ;M_@H(zGYbrPLkB185R18{DM*N1J= zEqpwkyJ|uLH90JDidQ>Bn7~=IlQi+xJYqEw_Hou7C)v&$JQ~#u*D_Af**1MXpUczn z87WMubRopTCb*mv<)5`Nk_otZeh?3=5S@A~NpzgHm@m`Od@?6M_cJ^tdGG#@*3Pg) zwo6|E0SwN-)h4x8LsBfQR`b?B|f#;^0!r zx5;UUALe4T2^8Hn6tejrUd+$-+wlI=S(9xCosD+{%MW}_@6ir$gcz568N@(RI^C5r zxNR=FR;!A!hl`!gSMaRfdb`(Jqu;Km(CpjDF1B4WMK$i#{rtbqIKbu4`fQ9DCOkym z8uarCp9-6UvEpzfFp~Wk8-EK9k_)r_+MM5%aQ+Il{{i@HZ&MDR!+vUZVuej^HO0)G zl%wktZqM8|Dz2^>BEDTz|LvuVeTUcmb)186q#ZTnL-(#-$k_GTpb@z3-@&fmK^4!j z#VN%bp3y?_A-~X0!^3fA#eV42zEfATi~osc*HQ4)Bsu?yWYyw*{?vB}H~@JP5VQ7Z zIbo`k(q2)$o4SST-e(VFwl)59CujPzb0HqGxKX(kYPWf4SN-U_lTJU&AvdMsf8?Aq zEp>9Ng=~|+uea5vS3s{*Y_YIHu!DFR-9&J{%=c%7-Y-dJBXxXvKW683$K0TkWc1cg z4>uJ~-0|vUuBTvoJ5FnV@p zVpMe%)VrD@nKu)qPT&x$LHYH>`gNytw+N?Lm?& zG=Yf~_B<-q>nQ2zI{|0NH@?VkQQo&s3$>d=4f&h-0T zHsGfX!=VdNd^7T%<-cjy+y@zjd)iY0jhfl9>U(OUJw(E5EQSXM!lx(wh0UkOBFGi$ z%7b#(HP7T$q``xq!84J=Bfb3{9{6#U?{7n7$qd1Df!?j(>7gFT^I=u$O8use&%pAA z#5?k#&E`C}YkyDvmb>jHiJ|ST`lS5(YXU^z*!ik)GWNiN?oW*Wf^YTXL`_>U{hNL6 z+b->ECJ_XFbf+!$UYe-x4wSihb%9axXZPyFmH+LPux(plZ!Pz(XX{q#{Z`!J{nO6& zR!_i3j*mAyE>9=~4v#TKi;l!itLp-c zc=B+$s26*MsmW|LTRy+o8fL)q_J{lzKc=MCyf~Q<2^H?TEifNdvL6$`= z3bij}7V(lfyWE#WK9_eDGQkgfI*-UUmc{c?8u1Rrs>lIL>%;ZA!@k@Nay;sO6(H!XQ%YUP}+u zbWfoyA(l+zLb<27l<9A5O{vyd+@kMu6|KgS#m{!P0$0Nu&0&L)oLU&@*U4cNf;Duf zsVMRVxaBfBX;&76(QrG@Q!(Z;i;4roWg4$HfU4oDL`Sz0IWwuTmi&l&rWzrPrmz<8 zFvMkn<8{NK+p`WiPo04*(kYspD~oDc6sMYl`}`y(Q;(f^a$3z41!6ovb%%Cfo0@L% zi<5LYF#C9fAEch;y$Bip%qc=Wn!EO>1n=BxZE@nfL#SP?_%}I(xu^X(xS?&@x`M}P z@MMU4X^<$4_l6XYLD6}fVVKutlH;huWm*81&vizEvh%KnV2HCNfkCEu#f-yr+WN-@ zqDzPMfzGAnhTPFVCrYG_2ipSb;H9}L(_wd;tINR3=i!{#Dvy)1k`>3j>0({Cu3&?| zyjt%e{)K;!a1A<7rXRsCeIfF!uVIN_Q&l8V8FHUr{GxyO{c}(^c+J6a%dPTv=gZ75 z(rb{;UWZ&h=FVSC2OtJ17y4Ud^{Pb$m@(m6VD51{C!bSQ8ZF8=&a$tGm2w+N=M49y zcBAwE2|+-^TTmxOYwj%aRwhL@{N2}(=vJ(mZ!`zyZ%zGr7-O@yq5#+aC`_?h;prKq zWekSGy>TlhrLZyljzGdg{6Gzaxg&I)Xz4^it&XrbUqoAQZZ5h5a>LpbwgMl!>4xZI zz$=q)J>lKYwL_6Iq9#8>iie7xBg5X~@h}o4N{`?E@_Sdv+A%|oPy=HXzPuLvWP_s> zzLZj+ZZr9kja8@Eb;vcF0FQM`l>%GE>|N7nO3T+KrEOo4NSjoECjnxkrKYyjYS6Ez zfQU(@0e++;iykuCw8;u-iRrVj?re{EVsL`Oz_*7Z1xC6?mqT$@PUxLpvO|lp6pE)Y?axbcZ6an z`@F)6PPPa+w-Qi&{v+IPDb5B~ig8z!)agr3JjTggRH72bXNeNJFBHRuX3U!NwFr{t zoLgN`r3q&#kZ@sd;t-4SNkUDQk_(<)o|p+djf$6P&}>UaWl4YFF*keS0>X+j+?~_R#Zc9A-^VqtbllIEXb=!5!ZT7C~EUCi)gu%e}LdItZebeS*tW zF-VS}gqIkW#}eG}vMaZ9vgpRU6iP8+*)Y#}JtL(wjJZvF3hdA1@IIuY>+EdhG_IRY z2rD{Mp_rx`7e@Sm1uW25q8V{OW?RWa8No|*Xp}bv+~~LUDRqtjLnnBz?i1<#&4U`v zQ3TXPn&l#pN5gNo%jP_tVe1SIlstsR zw+3m8DMs|-#J<8^sB0mGoIEB1_P&h@hR7xRO366t`FNM@1*^-kmmvy+cdOCZbMS71 zDRze&jS9CZK1x<9yfA|G+;fT8kJQC;U)OAsJIzZ~zdHL&_y|E*eGEhW(p({Yk8w?= z4i3*& zVA|z%H1i2&(P7xpp?ikDjJ^a=3b|yR1e8#6-p4bT*lJ&%h3z*+u{PP(9}w(#Ev;>S zHoooruhIw|O}P4qg-A!8ZgW>xan2&y#Nce=-D$j(A|X>3&tm z<-=|qTTFZwP4IUu;b8jtU;2UWfAoXTpIARNf2sX{*AI}8kUqkA{|CJd{Wlug*fNynRgypy= zhwFb)r`^hX^5yNS5!;f9r=xJlQCm5c&*Z}OluELx7EQibhh8 zH`{-AzPP2gl<)ix{eWq%LbtHmFT$~2qTBD@8Y065GHYhl7>Yi|wB9Hw{aTSD$?3Aa zSb@;q#jEpRJ^bI<(H6C-;#_(DXD!OZ81}lpkBU`JtMr2OLZqB~N9(DjRGX#te@`>@ z>l~0*LWQo5=i5-?pipbCJFT@5Xb1O`Ebrrz%ZnvSFFh;w>zhu@O~bEKmdQR9Hp`=tPw0?YP!SaN|wJ0(FvH5K`)%S7*D_eMXc|R}s;}JjN zm9J&j1(_|wTr(h$jVLXf&KoQ9J^T2mP_|R6G+=xOP!`WGzDk)Pu?k)Gn+W&xv;tC_ z5mu)1-HQCsd-kCGFr`G^TUVn=*vl%*&`xMkNgg+WltQ2g{K7~hSYt}U6Q0;SH7IKsAGjQ&ioY_a+DtaE8nbqAv_@8 zzvGO|iWrcc_8MNV_oMbI+0piXijP_!sgM5I0Ukh0JuC~=r3pYy-k{5n9ssG&K0N!)sZS>`Eoi(w01%hDd{>uUKu zAa)$NWegQw5kpMJEZMIN^PZX;=JfX$6yi=V{}BshUBV!VL_;QSkOCDWD)5msS6jI( z_q+YyQ2GhtL*8%^l$SUg2!CQ~M=NXhNw_$lUH;0rp=ED5x`hSy#KKewHa=B-a2S{A z?)MhS9LxteG0MhO*QnzZ>cK%9!SfVElM(vnx>}&4Y$68WmV|3IF49v~8O&?}c&SvR zBcYCeF9?qhwVLu%hc7(*GnoHREQT{kR0e#bk>Nsz8i-P7@bh)4m7+_@0$fl)AOY7W zZ$1<1C3}!Zfz{G8ZwqXaP6AV)vn%IRg=^f!kt+ela4r>rTB~M}f@LCE0m?B7Me?xM zVg364v!QNK=6GsSa(AuKRJr}C%){a03iV1EGE6$K3S2c@%%|zO=!f`tnzC3KbJ3Uk z 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

    !`HOKKd>XPup_v?BXqwbjJPX;ZT3b8*k?53 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%0D@gRA(Ud9V*P4pck(Lu*;Fsaavtj!n)7fRTg~5; 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∫VaW;$%V+eYSp8y96>@leOsyw^}# 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

    EAd-iKSA58y?5z5h*Id89mUM4CcYjGB# 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

    NkFrsFY{=N^;XF_SP^%b3}JG7I`C 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 z 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 q>2T%(UVu8SGo5r61&4f?Wsc$Bze+P6YodGkHT zn0a0EXnbn7cxUsj*90Wz)w~G~5Ai&%9m?!FoH?y&FFT6?V%hv%p`f~NR-M+ms$!+*c`?nw(Y3i6cmLvY88$g~zi;E-UU%FsMBH*I_U+9utMu&IG+!{><~BZ4=iPey z8F=08usFnMX|`8e>tnDV+oJBCP*1bvzLZy+eOqrX+v{|H=)37!+4+oXeN*Yu8&ZAk z^u(B_41t~k!gB2~qp9<7l-l)%0%I$&k@^DR$ls%W{I~HQ?=Wel_i{7Vqro$8BBqq* zuH4A~%JT1rOdG@LTx}3|m4pS03q#1^b>KE(4#aav7bX~$Po5;c3SwC=3RpcitkE{o zi0A-H0i6XB5pZtnrF0M%)hZM+vH)IFOkl;>))zVHFR-bM8>5HTml$bxqol0)r%tsE zP0|Lsds!znCY27_gCQ(Ca$78Dj3@?noZm3XDE?KIZG@$P>qkizt3Zvny%csIZfKX( z9i>;SRNC6p36p=6p_<3kDA4 zjyRnpa5tArmLDKxLTH}|@4m|U**v7fdrR=JN61FSAZKG5mkAjfNXL0B=B)!r#P!#u z6LFP_sf?k-%%P^zu9VUlrOWxOC8UbW77MtTDQLXk6k`e=N(8&Z#9}d(HA$LFB%3P~ zIo}owB$6vNr6>do-ItPcm?|~A%~j_x7wWehE6trNHS^z8+Dn*g9Gffqe*XLq#|8dB zgrSCSVd&qF|GNHX&d~q-=C>&%`r`-4|Ar&pjnt(Wkw0yZ zCJVjHxjH@bY&Qq9g_5q~SQK~b#DSD60L`-djA}_BC!TH>`~7NYb0!{7clZ0VSL4J; z%=^dfSkEb?u=)-8#zz3;IrwIF2h?2s+dW zz9Sok8NNIhj7gp!w2kYA5OfN}_P6Pnmg~c~Y(^+Y`cq9eM2y)K-vs2$Z6|7Xv(>JPlR`$lP{(yyTwj|X>pC|7%dM=>>`Gpfvq-0IhX+!;Lx_ z!gOK1>cV#YNH1-dsM6_2;q*`#JPwdJ9~rF}H*G<0wW7-_@#nlOS_y`r8|_Z+qHh$n zsB-AXMYC?2eAwKeoTGVHId>!nJ{}b6%0yap>|1EoE$f|iG3Ag|ZZr*0xfDBFD5aQ} zHi|`*<1HEMx<3G%C^?ZAjvB;vfEv9Soce%v<~P;|MqTK`W+3|`U5#92^2{$tZ{zK|f*_-@{jg`l>CvIM z@_zLXoc7~p5Y3j$N>JGQ<8G4m`s039l=kysQC0VoXPGd_`w1}7_9?K9g$(3(Igb6@UMc|XkI2!3#h{e*MtdCa%< zheg)=wb{xSCq_qrQkD1er;Y!UoG4&B@-NuNNFQuW9R5DEE(FF4Z;aMW;IQYe2o0Ga zdciCOt`q*xbcKQV**Fp)x6$rzTQ)vWOnFb@hi#}>HbD~9c(41$zX746Iv`M07-27{kBn*}A~OCdB4C3^lH5c{qS+?G z##0{_%T-K4+&(U^Q=k0N`CqjGQ8B2vl)|8W%I>sLJ{iOmu|*?nTJmv`6ots&Oozf8 z=~91b9MeXGj?n5`yOr+lGK>I+jNY#k22hIe3q=LYwri5c5{{`hze~~5!~gwNi1SkS z`pdNtK8VS26DSVMBIO|;<+m`Y&&Kr1gE)8RwU~zsi0L9lU1^m?7l_Nx#4e*aG@r&X zsmq08-V+AR;Pa)hPlG@)6hTs#CeyjiR{led#N8nqQFEW@qIAlHUm;_k;Z)4bUCM)1 z(f>!|HW81Tm~+CdSIWjNfo#Y`#y(wu_4}a2W>ztiWrPe>&vkM+Hib-J`GSLiW0sp% ziDIdTlJg!z*1tc*IQ0}ub+C0s+{L6^z7z@_H3}sX#QEB!7E;kY$$9MA#>x|K^Y{%3 zRp3n~O6O>5nj9_F-j@_qxtQYdCQ1PZlO-mU0&4>akMRz{<_h0KhSO(=Wu?-T7PTA- zt*|T=cR|2&6+F%j-jv2hFJmfJ$8(L$oTmEB>S_i1iHTVfmi+Z1B0Drll~Ix9%7N-C zJKeOkMVXc4KILkod(6dQ7T5NpNej16G1+|z*VZBCGwGFgZ7vFz0-R(Tx>k4Xli{b@ zQ?ro7?UKkDc0= z9*sFn*;N6Wk*fC(`=z+8f=?|qA)XzEz@+V2=`*!k3RVWsVQMsz z)wQuYl~OQM>}(ex0COC!V;n~`Zc8W1qvDiGDb;94J*r; zZKSl7)mQ4mhZmikdevAm8R2vn?@Yc*t3`D(O_j1a_O*?YEIko*yT_Hj`{F#A=Ypn3a~y;#AG}E zQ$f&#b7=|eSSZEC!w-%nV0e~@;R9RU7XfU4sk96kKPU8s1v@E-uKNoRGNu2CAtops za|Ih=b)~ks^xdDm77-;lbeB92xzAF#iYd^&4b$^L>iVa(?|&Ig)?Tk^qO=;}JTTtA zrrpKZZD8;;Dj35Ig_S;JV~{xAnav$28ne>%kUU=9bH-!1wl^o@NmPuhZq+DxVTh7< zEls>uOm2(7TVOLK>#=AX5_4+$Rnid3qmoO?z1A*+v)Bv6nuwHL2McU%>?+rO2&Z{_Ot?y6PPm;0L1S)33k*lg7vvMko1;zY9SXEC>l%&HpJx7mA4hf6xGx z3?4I-JDC(ygiItlK^;X5K4cK-?AgU@g&?fZHOJ5eM}eFmfVx_gEz^+N{KW$_&|fv) z^;ZCAwxg%H8nV`??;w4M^#Ui|!e1~kKaW)kJGT({Kvq43Fd(4bIk*k~V2_1F(6uf+$ zWRFQrkm1K(*l}qjqZkTYVF1B0uTZbNgi7v5*QYTc zzDE0?$C$O@D4A$tvmq3a@g#;OV7&+ttNX*a#z-*%gGCTrh(>)S2wC39$l2Fic1r_5 z$6_xP5>@WKxW(f_(){2t7_9B%>(O1Y+Od)ZJyg%LC z43SdxR_UBD+&RabeaZrVhxxDt#(S_QqpK&2-x1QUh7gyhEP;wa1Z)v4lag{7{c}Bl8qDr+vVn8YE9%VrL2A4Tgp+`1?Yk0p%qSc|FMJ8-L58eq!E$r^ z&{TtRR(pT5g7Qbw^0NJM5yA?7(TYjKio<1%ypD<mDH3eK1YlJ_Uz$P;lO&D_lEg7&vFmGaQtEmNLCz9y_vV12n}J_iki9c0LJw) z6v##q&!*n`M#7}JaeuM5f;u{ke9pNb+pze3^4MP!IgSxcS{u!y1BOzS7&4j^a?ml{ z{LSMK6sph}Srv_%uZ22TtqvRL5}ktjo;4QgBzT=IijgdE(6PJf)et2S&uzJmo^4^4 zD9)aOFC1RDk}Y(|8QvRpgji%=owc>8Md6+8SrhJhScx$cnzE4?@||swp4EKr?bE7l zqigLo?;Y#;O~sx(^W*t?$?*}LA_O;<|LGkKC*TTi<>cjRzMFjNyjq1b0?kD>AN2t|L2IzhD>?a5GKS}n|U=J{G4KQg9 zuy_ryWesq24R8SlzQgx?T|JJF7;jjEB3AXzosNz}{i1-uJPXIyvq1%}RyphrMXw<( z%^{`1K{db-f9Vj^`H%rsEdj`|I_I#NR;7v7pgCape!^YlV%VXp%5rkZ(Q9N%am1}_ zq@`lS>th6{lsYIR)#ax(D$Y7sYC00qHToUCkNFsl!yfw%-zRB}rFe~{c^Lqc$FeS* zC;?-6e<~xe$BVElioM3AS;xz|#<2^>t3Jlf5c}%5Cb*8ro4h9I4JO*UCa&@)x;`ex z!6*AaxO%uIhqF*~y(Y)CIO)13zr**l-{E_%sYR`+Wv{7aq#x^5Q%v8e@1Y$2ee=I6rE~srTfqpIuRWGS>FB@1d@LevNX)lZ8 zjEPJwo53ur&dpg`BM?q4C}yvi?9OuFOgm_=kmJu;z@Y1Wt`JNunR>6PSucxLuSR_? zP*yJoWUoelEL$_oaP%$ud7}kxF2`)HqEIdYxmLZjmqIQP6TMM6V3s1YSG}WGLA_V( zx~EG&*Vw(6DZ1Bcy%!R!)@tOZd*~d;SaI@f_noT=hpl_;s4<*NK0>0QZMsht{hiSNpsJV$glcm&y3-0 zZQv}&X>aLH?ZilL)=g~#ve#XvmQKC*@}@Qgq_^!hmlCq~9zREa*I?`d$oelaz-rc5 zw0E8PH|6IRruyf2w)U^P=7eSTr)sG=I#3V9gwZ_xA~-De)desh(vZ_vgVO%$$78 zf+EeKjt^qU=9<6HVN3Vnjn)Zt_OA8iu^;uRqt-r>OrSX|8s`>j+U1c94@#U(_KDVk ziw!c!)waaeiRbiI)YX!g%wet1=ATbMLk*&D_o;68u6E4{Mb2Rt&gozI4JIByHtu%% z^r>acMcUkv7wnlc_i;MHX35n-HSUG@)Xrq}d4SJ04$rb-&k2_O`B={RQq6f7?758g z>P6O7oA+1>aBfrP*dk_&59C_>^XSfJk))gOLh5W`>*Chtk|lfV_x5@H^jT2OAxY19 zugv9s%#8%iMzqWok4lsbu@4>3 zag-LZ))^e9;>n+-Zy5shrMuM>9Z@z=b;MBbAMV4hKrh$o^Gt!Y$k?~{q?6);PY$MW z#+UFYc!f;Dvof->6`MbwFKaIC-)^}e@r!&`pDeIuAX&pRsnj;leT<69G0*0*Bos65 zbY}R+t?Uk80OW?OX zNlQpU&KpZ5ql#-3wcqXkM;Q8zsdOS&ARG zZc1Vt?rgYP&f+N%jfqgK5ut-0!hMQLp%Ej?zTCyRK($q&cPX-zrck5MjSSOTZRvQk zRTz!K8-lHVXEY9V`OPRLm5=lWHTMH2Bhf0&n$e{3hQ01h*BZj)9eub{D9qM#O!0co z9P3Z!+D7hvpFglpPt;GL=1yq38y`(&^M>N$w8>0GaZdmy-(AcO%5C9Hvph*Hmv)rT zS#mVI?Ep*R8NSx;wQjHZ!Wz0g=~ZuU6P=R(5r&B3IG!)|uRGow_H8*g^fYHWTdO!C zx-PM?Woa@T3}Typ`Hx@r-tQpYk|Ur*(bg>!aX}CL)D5B+!N@+J{P$sFG~0V~z-eE% zphi{OAED9(DF_j01;^Ywt3g?fgi$oZjTkFr*9B)C6gz%za?l`2+naSY0Pne=AWH1+ z6j8p5?bXnVcRUZz`%aeyWazz;LO!d&Jx*jCK`vgj;qOTkl98o@6K0YZx)q|6z^()| z^zpV*#Mfjjb2%zpYys+KaDF8(%E)49UoJ2udOge`zAhpwp zH!4`I=Lcin-A^{bb^JI-hAdr?`Q!d0gjv6#cii9h-*X7!HIA@_^uv6Lv2^1Ki zlR$KnV%o-f9v%6#mQRG_Dkk225m)q>OVoQfATWk(#A#`WaR@R(TS*%Qot_JNr8FQd z1eOkpW6CGBGG#%4j7UQFG^B9=GO-}r$4SBN((93rsG7wqH7Mv3%NL6&zK*$0K^*M! z76{pP!N;t08WRi!3pkj~rBz56QraH&uPfZ81ySddH-3|0$cKx-K_NyS1eqdYLG(CX z&8IB_h;FwaTmGy!Mm_+Jv8~Cbqc|1|(X5TRzAYJh{08rQtz7JtWjTe0L(UgjKV*Kgm9R=hz*Nbp<%ZNDD--5U^=Xxoh}iD!yAKq_ zi|;nVOVVWG-O*A})sr`eW<+8W2mkaUrM|MU#R*5}2GH$CQ<-CqU;#@)I0c#7UQs;1 z9R-Q9z9AKQh!lWk%9dT)B6ER z5REjVQn9r<*_cK1mUXdDWtvE1I98j;y~2!NTG0<=PHi~~IB1I~im;GsN_{+~K!M}vGyJI&XNtYd0Jk{Y2v(K# zDS<0n`?ic(&%CvBF%4(<9sq7&OCZev2y<#utRNYyzg4_g0IGy$UNIK0VY2r@Z3zn% zHs^{=JQ3l3DE^gv_~*WBvG^0qetVM_UW554i5ez!j*CdeBzO-zG*39LYErU7W$*bR zUTYvz^VXQ$cJi^^lB?MmE8Zn2pxYY!!MEmgSW zRzSn+fS9(aw+w7q-_xMG2Qk$}PUl$GHVtZ@u^+^gg;tl!feN>E4CL#6zF{uZJugF^aFR zuIs*%M}oc|pS&OLPsW~HD#HK6-dhI6p?+(=B)GdfB)Gdf1b0GkcMI;2V8Pwp-QC^Y zoyOe>F3s(|_nm$AnK@@p&D=X*?)|UoD!RHU`1D)vvz~tYS$sl2@S7`tU~ZEG6GPn4 z!Quoeeq5y^I*rS;4^3NeNEuA)aG1ay#(_gWbA(Hr+pmhrle@U1y=s<=lJ zwPUby_a0|A+OCN3a5Md$>l$>cWceh@XWT7l-1QU;`(a*yJ6$xq1;M!n3mJhQ9wK>T zF8q=N5rYm69=CM?WkAIU>y=j^AEo7SM?kK=T5S(o!I){itUm@-M4`R^<1H3HMh`-W z7{APbGHk!FXTJgjo1QE-VL1+WdN*HLB2WDQ#!IgXZ5&&>c+7}6mlD5R0Jdy+^fFoJ z?vW^RNEh9D&zlkYvy8Zub^itLpuA&0FToe1@FB#W_SUdL>vCKTF;q(6-hkjX3R?+1 z1|P$Zm`>snEa!0ye)yqt_=W&g32!g)Cvfgx{X);*hrIWOz~Z|Q;w27u6AZ$KHu39m z`iDJpBE6W0aK)rdt|MTqrBvI6SV*N3@<$F&h2GOdp8KRc5xV$gMK3k+9B8-q2 zGkRDggh3<r(2#X`Mjfk%maWEg8V)iYjY)%(Uc6g!6Yq$d>7Q=ecEJjYVFgUf$koje*IKRd(E!6)LwBmPLv zbmS$s$EJ`+O$F6Dem6haVwe~B%s5+H0&7V)zmC6bQ3&bH-I1dZnOecbO1eN-i|aY% z=`aqlDtAbrkd#;U1~Ij3OoXy91-73_R9eLsIt9Z+rlncLb27gEv0xRW;mb3n%5z=# zZ%){Z=BxfGK)`3zhE$f(dM#FYc9G&IDFuEH%B;|0Wjr7p(rj(EpEA05!3zeHL9GJG zIpqYO5?KZ5%ymC&qa;wp-PMbWMw>*BI68@VKviF>7E+w;g zs%@=282<#O$&_i@v^sd<$GZYVHTiVI^m*&K7G-6|29*sD#p}H}l8QMzaMdi-`6$cA zPX#<7(o|2X^QX847vU2)-b#F!YA9nW^c|{qpA-bVN!cP6?qBC4aFun$Rh0*nO+5+6 zKPj&96{0D32(&Xz?~{(eX7nwdjn6#sj#qm_f}_SBhW6q5|1lRAE4^wXjg8 zNxe$;4Mv4(Z+x1FzOtE&7U4!tdSS6mMQ)T%E_`5qZoCcUTwO6Ra%e|Qm478hO+#vJ zc`#RwX=OSgVI@V4sxfaRZD1vRVI_HY4DMRy>-tLe=k`&2oW$i{O|O!3tU@gq!Fdxn z(rolaCaaHm2t_6-_3@+S=W#Q2$qVS3+Ve0a8S&nd{VaSEzOS%l83Mg$ona_ixG9=} zidxwVA};ete#|5JZ<;*q@MZLCErBA?Vp>_rYsYn+pWH>~HTv7drQP?sEY{aFVUfBz zP`ekj)R?>LCp!8T68rfx1{%5^x5OgpMu5ZKnk|H*g&V6adkrP@>j(O4;~k^&)PuVp zHd--tg7=b}**6%tSG~b>{lEa*YFZ>10ACzHPXvx9|fS-K`Cn+6lPs2JGVwz!pE?S{${+8K&$_=k|^NQVsFQIq@MvcP~({xEkQc zqz9bP3(D5p-q-aH23&sD`iP`^+p)0*DfP2`9YCM-E~l4{f(QxFU9iy&cUyyp(gzX- zg9G)OFt<IO%{! zqJ>6WUk&*v(C9dj74MB$8;xXbO~e-W4nON_3hWsN?5Gpye0MZX{%I^Z2!HT-caz@8 z2y2TtNLLt1PgCOH9?^I^0gfXxNt$Ra;L(VJT3gFy=PLl!_8Td z3ugxNzVAo!K}Hq_twBiJR`T0%ep7 zorVuvl0ogbN$djOCydd*n!d^Dcd4D!OmAUIa}?i1?AN|;4AnpX~Jj$;j*s&I+NR>~qa zaF17x+2PKh;BH(HeiJ240&L+tO_cy4_fR`WII@61yIbAhXWh%!#ml#YOW?g-t~Q|P z>)C!||A#}|he>3JL#sNV;hpaH%x>F5pj|B7mA1qYtF{Fy!0xd($YE}^Lr-3i;o@5k}dekgHJSzRO&J3#_p1Tw}OIz4+l=xh8+3sr_o6yF<3@}rV$%e!JD z3HLbLNYN;!1CPN`S`1-0=FM|VoBW_J6OuOha%T;VSJjfgNw00#%)Wn8K!7Fa;I0ye zC3YtZxae&EzUxq}6DPLTyq^I%Rv zY~e4kD;VEBYt_3v_n{~sf(FG-mZ_D!F2Ee% zKyz)(n|aG;Eh$muoZsS1-E@f7XsdkYSae|2h7c#TA|*0uj=qGsUy+#G>1-u`W8ZbG z4xH+u2k7B#4s@DcTW94ECt7M>p1(r6s$K2`U#)qq%S4z~wGkOvRt}*c+;c|W-?F=@ zyc?TSerJIaaZxa9T1Vr5vh}%qfL%0RX_R7MbLL>!;4{E1(Cy-zysl7mgG8z#lG5scO|CK5j}L@z}%+dK2O%W|5a}s#P?en*|jh7 zo=qV%h3K+UZ=mu(!kXB_CTr{U?kH?Cu`%%we%rdo)CIl@v5EgdlfwfZ+4=JPF?k#% zVfftA)5FhB?_`7j{QS7m$x-0J+7TcPG&oLh zM%r8RIf7PT+si)1Y(aP+I;XS0?BdYRjn@2mDc$b8KIrPjA_zx^4OalLuibPl4a8mR zdSjjQMvc12GJ6`mdOM^@xgr9Z$)u)Sc7y{Dhk$2G!1F`kMHcD`QqRuRl`OJD zFWbeq4NjDq&t+BlJ)&>c3L+$E8)2@Dc>Y~1T@Qzb&%OGmBGCOlus;%p(CEysNJNlf zuvx6XDdzO~qrl2rf4ko755tD`SZk@8$^Jz4mM!nYh_~!F?^4|$VSSpe8 z$BqY*KiNE2KhY@VOGRMBNVDPHkgLRh_EoO1yrWqx*KBe)2YRUF%oXVlQ5aKUP%Ty) zF2#nIVpuH4SdLA8wt8Ryw0k_`_n z8w^8KMtZKvHwn)XcO{T(Emmz(VpsP%bu+SP&g)5KKt!|NTyJ&#eR0m)WL!gp(?n73 zUZ>&br&AY6pmDb!7=!32K+{3D7QWcD6oKQ~a6dF2#p$xaCPrOvDh0*vHui z(qPh1u3YJ6d(*T)>TA~=(O=t1nqmyLt|%tu1isx$ zw8l;2v7cXJ97i{T4>CuU9tx5Qk#O+x_)nHkQa+`KriWcN&1?1uGjEx&<)&*pZw|?TdNKDYPzGJvd>GR3=M$S1Sa&@msRCRghDf=Fi?lvW)ksRQv{%AH8KUX zbha@M5yGbxh-OxNa!~X3@M0OIE^Bv?&k^Cy%MN{ZU+||}^J1OkK5b{6;(vK%ofd}Y zXPXhnr@tM02=s6&U|@Y?o2Om!itS+hd|qmoAwDs?pzGYhzHERjemY(U9J90=GkLvO zqH$NXtXe^@roJ6A4!H$ik9vdNoo*wloS=iCk)3pJ6A7v|>5@Nyh?%Z~XC*|ME5 zW^=QlP2Tuqr&%QH?hxB&!+l&JLy0jAhSwfHppxQ(Q`Gy0?>bCR;}X*)P2R4tUb4nO ze%@)sVG}NcZT@;4%E(bM#t2OWe7)%uwBxy(r+hgs9ea2|X}N*JYpdMKq9;9kuEDdB zWLTtX2Y51!`8?Uk=n3@pn+dS)Y*xk-6Q(gNd3^)|x2z>g6bR z8@dRTI>Q>jwXH2xLUF+YqWo{k;~{C6`CdO%2RPD>L*Y9Lk=g_q!_P+-6Tq}K8BB2X zJL)1b=XKlaF#YnK+dj61=_d_kFnvnRgpH%(z=)L&rfHuwa(V29GZ|zew@%51aO+u^ zi4GvSCBX@6>bwtR4%A^YM2acyXBUYGF&s(zkh4rpEk7gC?~tt^(%gZxdi4wVLPiWO zC5&`1@yl<0gP1v4qNxUyFa+9?V*iLf6d+eFu{9Q4hc%MNjinTO2Qot8Rr`oW6&)XF zKM^5Q3!+A{gzGweqVp{rP>{O{i3l~INvo|EX|&;5Y({C=-*q)yivK z6wtoT1qo$m; zl?Q782lX;!0AAxlPO=gm^~!aGe2GnKxOZ~EQHE4mTR5w+0^{O1#g%XGqrXNoCsB1y zleH$F;8S&sd~JL}vOaGiCy${3i!y{3K_wawO%_q5?j;?Xm?P~>v`tkK<@r}t#^LTs z;6{Cs0&lEJ73WwneS?wxo9;LGp-G4G>X>gj$CUVP?JEUrb}82DRA#A8X%Y%W_<3hT zs|{oQNO$3{<7Z>mo_%YRk-hykTJW5jRS6wsR;uZXIPfpcCikb6DWw+}yDQaOiNQ69 z4QEBeOHJ8OOpd5TsN8F9tC8*Z`JFl^I;`To?~5naM008ONxC?qi0f>7=6{^JuC(arav!IIa$nK_U@33npL8a^6=@Mak_k#r zG@3P+FY%i#rci917P1>ZAvny8J=Sr_Gwiue#yI+mZ}c8BcfP-FHahaw1`5DtZ)zDY zq*Wf3Uo#(aTkRD+Kn&_n9IM+|e=TmrezTkO=F&I3T~V5nzPYvlLh9dms7Hk7o&HqnAQgj-W1Bv4PICG z8GwdG!css;hZ)Qc9?y`U&UPiqjxCpS{wxI_8-(Pihdi2%f|O&$J&GI}hKeSRR!V}( zk%KNkiXpMx*1ZX?A=~$Df~y5xQi>GY#Xyd#pN&5pl>tHOF#>Z{dQc6G#{{0RB0$1B zT3%JD2SfH!A7q71vyrN(IYD7I%Hxq`GosFPP8*2jAl6UMA)4f18=_|wW0{YLZ?!Kr z{UFu)qzL&_Or&F*cDvtc9*wtRmY8scXd7GM2eO0IXw!Hw0T4B?U6vw7nl&euf`P0$ zIk&rD$3`sIIbjS=!w}D1jAHT^kpUtS=F~BjGIfk$NVEO|vm&s=T#A$-n6^}f#YdTa zHg|HFtUnyC!rUlnLUQ3Q*S8sli6WBeD+&(&b2%xM$HPz00yZ1LB$=-$6N$VDW;tPtVU8~?)(#L`B{uS%aAa5iea7@Wd7$6 ze#=3&8~M=iDE52uN$r@~;ju8jA!F-)Y13$;%>0{qgJNxDnap7$u^sb%nahe#7t3)F z12QVh$TrId>nM%gkr~N`N;f$iczc~x2#(7J2VSZ@7+(ZFVtr0D`l1Yd{u1YaKMXQ)ui=Lh#AXyz?jRG@>?vg?)BgU?g8K#<(i1pJ z6xturDCvL6ti~D{hbRXd$$gw7l%FrfnU+We-Ghq0aZ=3s6sB}SPKlfU;C3L~8}xa* zfTqOoUg&dVHM9uQbjuG}B})qWhysoX(@FC@BDq<~Qd8h}O73$N`|d())M$|&S(~qB z3tUoX@f0jR6hb#MaHQcj>m!5)Q=i}VU~fW6Ip&uRPx%J@)4{?x6eS{)B9Ul5sxizZ*XZ8Z z0*ch!Ip{OP^-)LsVbEeE+s7lD+M==k15daEJ2WF6vQi7pAbx;K={l4!g|gY!Y$yeS z%X%@X?Lig}Sph|9R3~+t+b*j2k#{IEXo<&FG)-B!*=HhYO28hE#OQgwVv+TJ#%k_P zdoG+i@`$RXs{q8OCm5~X=psW)^p;{{zd2yQ9y|^jO1^*@5<6|^Nz^xGD`x^j+MlJP zuSP_@ak?TVZt}<7<^f&WGI)hF0bHhvgEY9Qqdx~Www+h?1CJ~wuU^2U5=f-^Cg z{p|04?AN=;HuAYb@iS5C9;twg5s_KVZGV0x^7W(X&HUU6PI;rpIB#ZvP)jklW(1FA zXxi+TL6$fc-SQEKBh+39OdsnpsvW*Si?L9OkZ?Mxg0m3--Q+>}%VyqESCAcAvh2akb6S{k9 z!C$q@>G-~m6Gz(20)y@liPs19lqZ0YR!`c|+eA$ZS|f|v)3p_RwJ569SofsTpu7B= znL8RE0s*l$;zU|iXEtj$Tgxj%4+|I@4BFGztEYrZJC!8v5p*+#HX$ORD~80KH;3CB z;zyPw88*tpIHkKHwtI_9dvKec)JyvgBztm1hqy$>6qRQm3Dww)Xyi$xk{Qm(HnwZ~ zPo(uuFLq8d;jhUq&R9m)T!_~v&Yh2Km981K_)`E-tM|GUGPl_iK!zQ;W%=80kT-HC ztAWMNUnaf3oY!w=>&xFAWcw{h__J%=Ny++8%%`F5?=YO3tw^L`YCq~;s;rRwI$pD| z#xaLU1;@s9a!yX0z<*)JiUh(|M2)Y#5=w7tGFku3uFX+b+(?-g(1S|bg8m(h*;rK} zyKr+*rOQ;uwAuh2#l~x{!El|Z8q+{zG1QOu~I7#5*L|M zuUaX?8KE**XJe~ZzYjC>915`Ap^dSonZOP6izJDYumZ7f^k@H7u+H>tHGhUtkOrGtO*9kTrXrOn9wJ7J#s zn!*OZrl;o0;P<4n?FEm0pk&%cdqoBNSNdNy^w{=?GpbAPw7LFh582Izn z%`$UtJ!}Gw91(xlsXzXH_{qW!e~Va2NP>UMeyPjxQ1csDb2FPvK6RrZ=R|gy!PLgM zrMyYgv~@uEC6!w57PR2o(%MVcl;M(9W(*n}*_p)7X%_bTa_PFcK4A9FcD{lY?4{v1Aw&H>mIzDb+QBBhSPoXg(pc!8h*FQ;d;a;WU$48)Gdn2T zx&^44$m``&#A|R(2mMpDzHxGCWHO2rHp5?%zef{QdFka#=!O~tIEXnWi}k<1-%GnQ z8Ft*;A4079Nev*-x7XB6tuI;dHo5w8y8UW$i{f-oYI4uwl;dLasCsZyXZGxBa?N7$ zntD(hdimeG6I2S&Df1;L9UNMo;AOIH3vs=g(NkHWO0QSHHTJlh51W5(^lGP8HY`Ajn-$a zeyo0z9ze~6UIH{blP^0fJj9l>MLbCGmEOKFRU?1UFwgF4>gNfUd@iHW3;rH z-)!2F?@5#O&r@xRElHzuTZV^+KZp;;awi@JCBi$pU5o8>7XjF~0n?d_- zDf_)GF$|}ZE5iHcaLy=>Pe5(#1iJ21pSQQ8B(DBQc^XheftcTY40BJk}KEJUUXka{M0gc zVA9RorVdAe+=zF|T~6-R5!MntR-Mhrs`BF{{rx4E7~zAJt8LfOP!XH-@3vIRcD3`v zBl(85x}+{M&l=*UH+dcpTeLwt_wsiA?xnU||MswxHoxy}BeZ;@Lkwz0HhpI8V^N+1 z>c*}|FKkQgX??uib}!?XUb`HWPGH{CW3WBs9SysDL!Q#oW88&9+;dv|wU;oBgut|U zyH|>|v1v+gyHNg^_}4|pfpY&40Q4(>^=Z#jD*1U(%Z(A)QAjU;WGcsci{dzTuEHWkWu*|G~%wWz)4Z(NtM9q*aTgpz**M_ zey7jbl0f@#faGfDg;A))#@xj_uz+rl^n>8_rjG=-#Wm&oo;mVwYjnj{QZbsY+s!}) zk;A7wfw9cPTRTB{A^cOOzL_AlFp?DZJv*~=ZMvT#yC}QCt z4DMKCso)ogT-lb`>``9^4VD0n?}bunoc0IvEpcWFS%N>IFnQvOrIWrqd=BKUJLoB7 z4*5sIP-}wKSfyT15GHS;wMLzp4HU$`rDYg_1Hkye(7}rSt4NDK-v97tef+b)!NDOQ zARr+jp`oE+U|?WjVd3H75fBiNkdRPNP|(oOFfcH%u&{7(aR~?rh>3|wNJvOYNy*5_ z$jQk+efsqI^JfYQ3Q9^!Dk>^!YHAu98d_RfIyyRfdU^&121Z6kCMG6kW@Z)^7FJeP zHa0ePc6JU94o*%^E-o%^Zf+hP9$sEvK0ZEvetrP~0YO1QAt51QVPO#w5m8Z5F)=Z5 zad8O=i7#KiNJ>gdNl8gdOUuZ}$jZvf$;rvf%PS}-C@Lx{DJdx{E32resH&=}si}Sa z`c++B{oA*18X6j!nwnZ#TH4y$IyySKy1IILdiwhM1_lO(hK5E)M#i9kMH3TKQ&TfD zGjnru3kwTNOG_&&D{E_O8yg#2TU${6$M^5w?d|Oy92^`S9i5zaBy&FXlQtNcw}T`baZrVY;1gdd}3l^a&mHN zYHE6VdS+&3c6N4dZf<^leqmu@adB~JX=!dhmG=Y zT)TY)fc^R){SU7HhWEcC7Y+^%ge@W>B8XgMWMmM$sHmtQe$mmU3M z!2z+1hlhucj}Ic6kdTmwi0J=IT>l02e@OJ-Q2)jCUugeL_dfyun{E)=|G(n;zk?b? zGze!9%OH?J2!r_j8{WOWz5PE6L@}ri4-Y{sA0Hq8h4aP5#nsgni0GS}o7>x45Y+eg z_m7W{AgKQ$`k&bTm(Ty;8VL3dOCVXD{eN>^ozn;6S~^{_CU+nV7TkP&7&UJwibOP& zK&m!>B#ufLN~oEoU@VErXf$1_j$$AY^i{L|5JgJiEJ4p_aGLMMO1W@RWNJK4*~)2( zdD0ouYNYbHe8>#!!S%&+*=Qjy6C;?`3w7pmrD{*k`ir%uYlELp*{ypj-7YIP#+s`1 znjGFcI^gRqrYlT`Sj6~}Y`40i$z_7voexF&xSMDa+qg>rQ;xg}L~^Z8{i8qPuolmr z%4U9r6Z2MDwKkrw;esOz$R@I@kBh_eVw7Pr*sKr7rAg3#Z#o5ppra{_&mYfZcInY> zPV%!j_9W#16|!vF+nrX1=3Mor1kP;_b)83}e288QZ})yTZBBI^yj(ejIByvBvVSG; zaK9_s@?(BmN>zY#fYP+SD@n>SM=&im5Lf>IsrRFP0Lvh_?d5vHB0voED#y(jg`+4l}((0uF^d?x~Nm zq28z!vjZq-igVscN{{lKSx%_(<8!Gk3X&yOO$yT+-7Si;{hlm}^I5npONyb~ElbO5 zn=Q+JRGU6pme=1Leu`ICwlJw^zdt#x>V~2{tM13LI;$C`C_Aei=Qus9o0gzGub=;F zb>6UST6W&J?s9tGv=u~q(Y%*vbayeUpzN~q_5Sp- z3k;g>sv82^`l<(pvYaUk|EX@KccK%Ev48lVQp@cl&W9K<%73)v{|(Ir5?oMFP$0qe zSK9_P?0-qEe@U(X6H*J*r$N0L)R@oC&i?Mof9WhxO9n|TP*?t^+WK2?fmGN3q%r@| zlH0+MVO}Y(y1V|8TK{OtBK}ycmg~bcd0zr>1pjEs#{JP0Dy7;bsGt96$wW@nb%k;< zY<4H>Qp}W7Swf6ZgwhzsGkHSZWIChD)N@6jGej~@lxP;pa4QTqo~ucEerorH63YA; zOg2}lGuBwK*7SXM_4dmHv5v1p-_8WB3!`48&$}TaT{6vfuOc$JX{j6Y>|kV=NF<*V zi%E7OU4H=$nwmfY>;K8f^f%&vX)II_&?r6sBhUk3I3S?SXGs3mSW>Y>3Z>d3wIGc} zs?rP6ScMa5cqTjRBXvbn2|T`Vgwplqec2LmG&<7gAfOfVe4J<+N*BryN(?tf?@AUc z_4|OYG$5c;jHgOjtK(n?+$TZn5{)9X~`9ouEcKrZ{Cz5Th-tG%Vr~NZ&a0sNa zGG$w8_s5c1tpMXKb%#^gqG2G7RewBJtWu^s(b{kdN*Wx?lxqVmHf(<1zBj{Xy9DI; zg1^&wxgG8da*``#x^w>?o6J&=WbkIWJBg_>@-6rF+`Rx`Blsg{x$(L8wmI)2!Ti}D zp#DfAMTAiQKnjNPzuq7ICoKYGvVcZ4(2xe2%|KJxzr2-yc`N_#dMkg8Xa5|`PEJlh zvl&PQfZP_45CFA~zb7=18~_bze@$rrqZat9Mf}kpbin@6A7qcJw!4CWD0teEHDtZP zaFm+s!{2ixA_=-39VC?AMNanR0=OW9K@1Pb^9#;NMb zXL6y%u|9DzQTG2r1ph1h7wHe;{t(pqP^ce^z_L-m3Q@r_@W8^kz?|j4EHuCr<-k}4 z!LTU6z#;$mwg0F<76~}`M<^%=BqUfA6nG2_6nuPaB0@Y8Vj|K%?Msk@`5zX@*8IEv zv^PNx=O>WS`JdGvZ~y6mf^5+LtU&hYe^?;T^nbfRW-F*bX6yfUfxOzk3iNmW+tdI0 z=imR1mX?N|j*5Yvj**dpnVE@$ogL)og3MfyllzyA3vzNn1u}F0sy{7V{y$w^F>w*` zFM{GST%u}(;##nxy5RgKA2>}uu$X|6n|vTJ0mm_i$FjmevnEFQ!G#d60uyEm;pyiK(Yb!BhV?7HCbC6eSV{L0|+`{nV(sp*c%=`qk_bZi9VZw?I(_qUGq zRZS07EREM}%s1_?cUS4K zcP=e~>`su;3353>7Uy67Cg_;{3qa6e4WbW(-kG zG)u_;j}y6gCQlM{B9GRW{Ba_KT#r9a|pua!9&lz<6p9Dy2kO%fCO7f9;*I z9LT1g&nBSrgTDE-+3gQcEZ^RIy*nJIuDep(xLjj0a(z*u(sFmYTxYd8+0piJ8J7Zt z4suVsYIU3~DT18p1ZDqT?T%$BY;xHoPwlp-{PJn_NVtQf+WG;3Wxn+jM)P6J4}n8+ zmhlqjc9QX7g#%gcC51K8mzVu$n-MmMYA5&;Lw*!9yo7(0&?^&6q|gh-Z!+N#m^#F; z-g37czjdbg@L#L~w?_WL^6|3KuRmBn`G4j(-ZLU0!YGiughAgHQtMPP@M%dQNBYI{ zwlkG%9Q(AFVqWMT3vS(bOd*BDW~9i9gwqhk#1E{Sig;aqoC;wa1M;@PQWSFPqj~Z7%%*lF+{!l*H6)TJ@3CUx*U{_mrX*nR~2Eyj&}C)QCmyzBb8{Xyd|T=BTuST*9MmL zm2wVJJd>nGKC^^x4UletpUwJLn z=Dg+)s&Niuhf%bR@RdCwR|lU*Ot zjj8kB0Z%fK*9Tn2F@b<1_T>Q_k2{v$*WQU`h=#U?%x}mx4;#p2^-RFN-f!F}{n(@A zHKiC)rp$vll&Z9o9;LChg4s?+wRDS<={Gxcvu7yN==Qp(d*i9vb%$+k{ReLQ67d%vW!tjA=2b3#10Wed=+t1Lx!FovSbmW4uqf6#OF6#c*Au z&badnDYX6pK&*D$B=lp7{IS2h^pojewPiTU5o8T=-Y%zAC)fCIOQ6F9!trAIy+N*1jVnJ`jSWGz#~Awm(K#!vgQEDO@a-M`39Tt zn~yN+onEgWaYy|OF=Ap+eEE6MN=gQi9y{nZm%)J<5=wHqX@9G%)^Tnvz?7 zWeuqie=W6v>L!u_lQ|t^$c+ihyD(b$+nf~qJQ25)F?K&B#~wb@FC|iRu_D#EPh>hm z>Z9~_vBnmaMw)9r%)EH5Hkr>qHa^|4%{kAMTCpx{XDO;Os+h7AKd+%GHQ`6YSg~vl%Sc2^~Fc0f0 z^`ZSpuF9k3Gk}7|wBstG%Ii=@@2Wnjy|bjs=V5FU_}s+yFkt5ll-c@-|JV(qEAs;q zAsd4Cu?HoxIzYTuA4=h|7iY3Mh+W&@gWY2v2~th){+hvS<{8pI!puE}D1!PVt)vg~vH-kpL@VH07?h~}x2#AX$d zxa8c%~^@=^dK9jJCL$;rsdFssD_@|Wr6>G8ZnqS zTcbu@t=3^6UxcSz;Bs4stZb&oiZ_QT?3hl@Vk2m0JJE_KQFXfwZ%w|sjuFFADl>8R zR?D-<+mcfL+x6_ZzAqu*ui35N3Ya}UrR6b<0I9Jh`N7GB+No8$X zk#!ggukkDfbWl{`n-%IC=7%4@q%;W`x21fMIje!%d4J46X^NbS>@|-A`NS(e(XwclZG3gAm>orER*_`%L z<17}Ja-=OWNdIZlEjT;nz>~sjbc5iL-T!Hg!HFfQ=WI{+E^j;zd7gnoVLuBUV$!u2 znw($9oyXtjwpFwJKuy9#;h_(k5$$e(ztUs{naJI*={4g;euqrZEM#s%YWcU);5YQ& z6&6D)K%W_jURV z3XaT_Kb=y(Gp&fdEiSf(J*&7Hx!M(o3*AFo?W+6qC+VY_nXo?Cw>2>+H&OX5x!DxK z1Fn8heQ_r+|Ecg`UWnoN@uvqNm%9?Q1^E$TAt#FSfkkei=g%c_Bp6$yU_XbXpH`*_ zqhJVUingdnW_URM)XhJx2P~JCm?xmE^jsy<9KGL+;QGnvq=#Km7MLvqC8`sA+CF`G zRJ8u?D*h27kl0b37M#w7P0pf$r9wQ&65G1X3I34;ezTj^-Xur?C$KL!$cXEg=_5>s z-}gEwNq0#>GYoZSb}gXTk*nH}8(FbAnxsEwvmcaFFb9ltB2~cZ0ZK|SJBOqn%eSA2 z%fXqCD9UCCY0wA)Q~|7#KlK(v03=Sm-ADt~{)?t4s7t|$O=fAy!N>c~qw3y65OT0) za{9>us*)(cAlZwgz-@Io4+vL6cG;Fa84Yvg3(*Kyb(E!ER=0rfQj)^&K{wkLwWo$!kW`J+%ZCWIb8FRd2Trl$w1uUk+}&)cym~00EU&X zg{w&ssWlow|0vdTPe8!Jm2%`qShE>x(T~PqPev9~nI*R&u%FX~rqa+qO^)3yDcpL& zOx7B?<)CdpJ%qSWyK-}yIa`Dv+e@^348~j`H!QKI{ATa&;GXp0za-&liRES|<*4DV zOFiP%oh(5wW%oc4r2H5m8lq_jLEnWTOcp001nUhW{I#z>umY3&(}21ml@bdsZz&U< zxtgq0in?2IY5}#Y50z{ERsvLxs}@YE`vUD(+?3%KRAhI;v6S>~_7tgP?70z{sO)&Es3m zQ>@9M9mV1aB@jKylkmuw3`N5x6Szh}zMMunuSPnFMmkhP+O0;I(1%AzM3-7E(0wi- zp+GK1L%zDoS1Lt1`i^uUgtXI*FsTSHgIDChQ)CZU=;Bf2W~o0MsJ*-k-`Nf8gjej8 zS_BNxEDnOxtB)=Y;eiidEsn&4^~5WQP1XLTS(4~cGM0cWr&*{-Q()0rX!Bec%2S%J zSsD^rQk+^^`mCBNU1)kzVmVr9s|nxHQ2Iyq@5z^n(Gs)glG^9OhSaiNp7MS?wzlU| zbG)(~=`sOflnKr9X}k*1b?>3ok`cJlx)ZP|IDxs<3czy(q;f?^Y57WP1u}T$QEKJM zGvQ7vQr%YBSZM{MLFK7t)xAem7indLbY-_?CWn;A;rhYKUkt(RkrALE8mst0td0;a+NJ+G^?AfVgST zNOeq=b&9pX&|1p1TCTJ@9vK5htBNblO6nIToVGeKt$GP~)N_vtHvIbc)|xLb^@>{c zQZIF|o^^+o4RZJmnr#gPybZ6T<-(o~hP;j1T8*Z>)w*HT`c@5Febr_!jo-tnEVOFv zwVGT`YaH>bT-%zw@T=X^D!lQV{lY4J;miF&*}q!lfih(wYt4~mrD6ExQM@hjr+G12 zEy-yuIvy>lYb}|yx#=%0xxB4cIIa1ft;J*3g=wwjYpp_!t(Ev~weUvOylsu1Z6sgY znn8Dr;0;>W+Pd-E%NFZ)OB-Wp+lSNI5ANDV*V-pfb;e)XXL&nDF+1jgo*m2h-xkw4 z*4H|U>N^0S>|alwE#A%p&rT?n&LdFvuS`WheA(by=M8VyT5mhMOxI&tSI=FibXgOu zeb+O7_s28BnU``6-fo!m?tZ0ij z3dVZRC+%JzrEWvBUYhn^&ze8NhL{NY;O=|$w8|Li{>c6%k?FfGL-}3UCq&RMINIk# z+biPLFS(Avklru5-Y-_uFHbO_EQ@x+JMh(O08eS)Tl;`^c)i$Jmkz<8p*5-|-=Hbo zpo!O@W%z)FSD)4EAk+HbcfKJ>x*;d8As*{LvVZMg2Y&FP0&T~K{L;HU_=bbpdjh?N zLtndN*3c1Ahr z*GHGfMk@)%rr^hFwa12K#v0Sd+O-Cv%f~wDT0!x@yk}hqLqS&k0KUlx_<=pINx!t7qxMPfvdOd8$u)#Y z($}sl?J4`Q?)&s96RWQ0^(n2fDImf0m$0#qI@2gJ(@+`HAH$~MHm2`Kr;!L}0%)f? z1`5!;XB=c^;0?NQHfB!YrV+y@i1=p%;b!q@XFp{CXI)Ci<;!LnGD_#xyBYcCl1C@3 zW#+hSiaF@#xHsn9EGPNS=S0p6F1+SMz30DZ&I?D(%XZ{FTBA^H%qwr$Qt&T)waLHd ztyk|@n1r3tep~22T+ruVEG?Tc_Fm+tSv2oh6n1I(aJ6VRvFP9(YukbHfoaLD!qPbc z<$K1G&xEmO28!$3Qovg)9{;kR&T?pl(a(vcu(xH_#bxN9%h5V3)D$aF!Yhd#E2Kdy zkU1;qgsZp*D-a)6bG=tlC04-=R*N@QVG372_N-R&uf0RAy_2lfXRJM&tTk7xb?OBC zvRUflU%$Xw@AqDZI#~R^u{ON1epIkHNx0Dogxr|b*$63E_qN$s?PwpIShDZf*wX3P z$XF>O1RP8l?&_>&c>~VqzvWk~jBfyLB7`sbH}4VE?lLwWIyPHV0c8=(*Atr`8QAVB z0N_4bd#9T<9RL`>maEFv{`nS~Z8@CJ8iK$!&ZI6T(k3ooJ0o`$>|&d2@*5`6+9v-F z)y1dAj2*hlonIa6^hCQCr=pJV;$K zR`Xu~d*{M?vKM>G07Avic@>}i6{UUph<$BaLQVNbtc`s`0fGp=dIJ6f^UNv?#BQ+k z1KUYFJ)eWGzyqgDTzep=rp}?qMGsI4&?OYs;7N2;0$Os3zu@O{WG{R~8F3WOfEx;E z3<4a*c4E%+A14B^5`2zRGci*-k2B>lGl0jrK#UxLlfp`jVo(lkCq_xew9yu=!RNG90N;wCzBBUBpt7e;;H`F7SNG=i-b3^*HnF2jJp{2=x-_EXm^H zxBOW_=H*%EnSfV@SsUuaryI($c--wSiyY4&y zce)CP`o#CP0{6yI2d2LFhMD)4Q~TDN_v*m=?~MBnf)8@K4=#3lZdnh)oey4{yFTv^ zoJ5a)#Jd4{k90nd!BIP*U5{jd$H>j?XyPXvfv0%JZBYC#V&+q-?^gQe(?{S_cGqUE z;PbuCb0Onqan|!$$8)(Ipz{5Bi}0nkYNKB7Wx@NUnRuhM>t$l&rPFu4oA|Yl|F!>e zZP53%CF6BeaBUp8`C9SzI_Ns74f?n|NE`r;=S*?UdH=#*TU=O`@hTn6$wHl6bQgk+7S!Iq}T0F z2JL%|B;@yjz*XKG_J7(L@PDY(X>&fA&S3o_Prz!{KoH%ZqH_4}vVV!hQ&o?Z3*|Bd z0`b&NR7=%FQ^iVR3uKa6ELQ9BzMg%nHJQj1Py2eV`G2){*HKY-`~JX@7&@gTl#mb< zgAhrjr4*#39a6fxXXun}X;4a1y1To(yBQFM-a_iL9LPuD>1DDF&^E6L>mjEn+qM0xc5byXoU8H3{vdCsJ-g5qm0JD6?qIn)i6Q6W*>1<$ zbgehF2HffVSn8T8Fx22_&*c$RPNkxM3BH34f{aemAC`2bKs@8t@jW|Pk@!M|V z?E%E+w~jLh6}gYSyPmSrm&nV>SYr;d)LT94l3g!Geh1jUB?=kx)dwC5%}&Sif2%+#h{vFf+dkb*>dT7`RsQC6AFctgG8pi!klWn z_3UrQb#AdMs@bomkBZs&Tb&LHEasMJxL!H$tJ5@FhpRrhCBmfzVJEZ`^FU(fk~AjC zDA)E!GE!;-M+CwmbRU79gF|~exy00-LrKO$6?MNauS(#A4V&Kz9M*|5Z8_tJb{{%Y z;dX_0KL_mJoi~+jBk$jIi|9S%e4CO4K_?W+(!rjIdVcp!5 z-z)OMxUd1|pi{J4{)Nf+RRuredofl75=_}?m8P{wmZ&5gT%$rGEZ=1JJ zd-GV_ql~Ju=zJs^YSG2HT6KuZe#&FjFPe{QH6SC(d%P>DSZzJ3K^4oMdhLLh9k$C>)l;@AQTd(r zug+YY4tu?8oQ_8Iu56Ddz4_szvr)A!KVD^Cxm=zG^SHvVQ0L|@NCXgx*^H5%X(Gaj zV9$^r_POI4DI?wE62y2b=|R+_30k)n#J1`4oLrbg73ONtgoJo82;Iw;jDAU6S|Izt zN()OT`aWq-AC!~jEw*|2E2;%CZ(d|=yr-f(JCZ)HUkYgxoF2WR=jivv)?T=s&eeP+ z6zZqgv=HD^9*?Wj@2^o6N>tA!@65%Xu3#UH4S zqse%7`h#7CB&lyb7kfD%90Cyn(+pdP33CjDDrhay(m!v1U)XQQp8~$m-X0@nGVm#> zOPoRQxx`xwq40De9p-Aib|iZ7h7LRkXbT{a26aVRu+y_k&n5?kdGBJo6H;Z;+;fggFAM>42 zw!Xs2l^UpmB1Bk>wCy>SnmJBn&-6vWar;;u3dH1ncR`P#^AfE##MU7ZMmnti%H0+t zMVZY>V1@@1da4{nalAB!I$z|5zm=AxLAH&oH=p;3jFjfF8XMWZP;EK3DM>*wG4ZXO zf)7WQw6n8Xreks~!imfJ6HIJY6{c6!70V}3c5fy4tL{QatE?6u+H3evAC`{hEK+Ve z)NZPuW3X25W1Bc1KPdU}mbl_@+SE;PWOlMcu@1F|%>BxLZf(hv3>RwVMT>3$Z_B`#{~Oqi6^8~3p%ehz;cQ&OeF$JyLt ztI(P-9$);jv8C5Nu{FV;XN`o@fhqmXQ3C$Q^--SlUcba*xl$fIY1AMeKNI@w*MVeQ zdgKF#A%{8XWzEW}1NT!~tn;j^KdPTjjMjo|3Lv~j+9Z=>ts*wxBC3saIVZ<^p*F?o zyvBx#lM|yePvU7=*IE2y`@TJtFd6$CWEHj84v+ zwv-i?P_8q`#kS5#C`GeszV=y z&&r{er}Zfbw!*?bPFz{qRF*hbe>$Iaj^gx&VrxZbYru!sR@0jrsE%XJd^X>rrnmG& z9VdosY)Z?fw@qy;*_QZhD@LbxY+D^?j&JN=7jMUZWB=CLwQvI0Y9$FRG2o+jC{huG z*fr5o6#9I%ojFWGbzT$ZKgYZSr)(92)eA~$VvUr|9Jho((82tUz>n;ttkrqPy4G># zbmp`c)nyODe=(;w0&5j@If$rrTH%~M>-BayN|$lkP@FvI!Sd zz3?!qyI38q!*y{(ro(E&*xh}3vCQv!J~|6OZFPko*Sf+_XRoeM>ktU*Zqd~tKC43# zsza8qLjl);tm;s`>d?aL(9`NLitCVzJx*Tuj6Q{a*b~5g1|`L-$ET|&cqXVJP*2ze zA?iXAVXG%tsvG?TAxWzzFRs7SR8KKfPq|c2btH%%0KH4taF4Em=2-)+Py?NO13kFm zzEK0UR|8{s15;W9b1}T(K~n?EPy_2y!^5MO4_SQh@m}4=dv!R7aCpZZ8?TWa+{j_o z$m!L{72fzft&zL9@kLW3&rl=pQX}6{BR_JJ0AZ6LUDL~FO|OKSgyfrq!A&AoO`>#7 z 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 diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/README.md b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/README.md new file mode 100644 index 0000000000..77ed9cf2e6 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/README.md @@ -0,0 +1,36 @@ +# nuwriter_scripts + +Some scripts can help you program firmware into storages in this folder. + +## Requirement + +### [Python for Window](https://www.python.org/downloads/windows/) + +After installing Python, some plug-in as below must be installed. +```bash +$ pip3 install pyusb usb crypto ecdsa crcmod tqdm pycryptodome +``` + +### [Libusb for Window](http://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.20/libusb-1.0.20.7z/download) + +In Windows platform, it is required to install libusb manually. + +```bash +Step 1: Download the library extract the download file. +Step 2: Copy MS64\dll\libusb-1.0.dll to C:\Windows\System32. +Step 3: Copy MS64\dll\libusb-1.0.lib to C:\Users\\AppData\Local\Programs\Python\\Lib. +``` + +## Scripts + +### nuwriter_ddr_download_and_run.bat + +Download rttthread binary file into DDR. The address is 0x80400000. + +### nuwriter_nand_programming.bat + +Program header, DDR timing setting and rttthread binary file into NAND flash. + +### nuwriter_spinand_programming.bat + +Program header, DDR timing setting and rttthread binary file into SPI NAND flash. diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/UnpackImage.py b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/UnpackImage.py new file mode 100644 index 0000000000..29ae007767 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/UnpackImage.py @@ -0,0 +1,62 @@ +# NOTE: This script is test under Python 3.x + +__copyright__ = "Copyright (C) 2020 Nuvoton Technology Corp. All rights reserved" + +import sys +import crcmod + + +class UnpackImage: + + def __init__(self, pack_file_name): + self.img_list = [] + try: + with open(pack_file_name, "rb") as pack_file: + self.pack_data = pack_file.read() + except (IOError, OSError) as err: + print(f"Open {pack_file_name} failed") + sys.exit(err) + + if self.pack_data[0:4] != b'\x20\x54\x56\x4e': + print(f"{pack_file_name} marker check failed") + sys.exit(0) + + crc32_func = crcmod.predefined.mkCrcFun('crc-32') + checksum = crc32_func(self.pack_data[8:]) + if checksum != int.from_bytes(self.pack_data[4:8], byteorder='little'): + print(f"{pack_file_name} CRC check failed") + sys.exit(0) + self.image_cnt = int.from_bytes(self.pack_data[8:12], byteorder='little') + # 1st image descriptor begins @ 0x10 + index = 0x10 + for _ in range(self.image_cnt): + # Put the image length, offset ,attribute in list + self.img_list.append([int.from_bytes(self.pack_data[index: index + 8], byteorder='little'), + int.from_bytes(self.pack_data[index + 8: index + 16], byteorder='little'), + int.from_bytes(self.pack_data[index + 16: index + 20], byteorder='little'), + index + 24]) + index += int.from_bytes(self.pack_data[index: index + 8], byteorder='little') + 24 # 24 is image header + if index % 16 != 0: + index += 16 - (index & 0xF) # round to 16-byte align + + def img_count(self): + return self.image_cnt + + def img_attr(self, index): + if index < self.image_cnt: + # No need to return the last entry, actual offset in image file. + # And should return integers instead of list of integer here + return self.img_list[index][0], self.img_list[index][1], self.img_list[index][2] + else: + print("Invalid image index") + return 0, 0, 0 + + def img_content(self, index, offset, size): + if index >= self.image_cnt: + print("Invalid image index") + return '' + if offset > self.img_list[index][0] or offset + size > self.img_list[index][0]: + print("Invalid offset") + return '' + + return self.pack_data[self.img_list[index][3] + offset: self.img_list[index][3] + offset + size] diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_header_bin.bat b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_header_bin.bat new file mode 100644 index 0000000000..90242c39c5 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_header_bin.bat @@ -0,0 +1,2 @@ +py -3 nuwriter.py -c header-nand.json +pause diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_pack_bin.bat b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_pack_bin.bat new file mode 100644 index 0000000000..80110b5deb --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_pack_bin.bat @@ -0,0 +1,2 @@ +py -3 nuwriter.py -p pack-nand.json +pause \ No newline at end of file diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/header-nand.json b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/header-nand.json new file mode 100644 index 0000000000..32ac04615d --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/header-nand.json @@ -0,0 +1,36 @@ +{ + "header": + { + "version": "0x20210119", + "spiinfo": + { + "pagesize": "2048", + "sparearea": "64", + "pageperblk": "64", + "quadread": "0x6B", + "readsts": "0x05", + "writests": "0x01", + "stsvalue": "0x02", + "dummy1": "0", + "dummy2": "1", + "suspintvl": "1" + }, + "secureboot": "no", + "entrypoint": "0x80400000", + "image": + [ + { + "offset": "0x20000", + "loadaddr": "0x28030000", + "type": "2", + "file": "ddrimg/enc_ddr3_winbond_256mb.bin" + }, + { + "offset": "0x80000", + "loadaddr": "0x80400000", + "type": "4", + "file": "../rtthread.bin" + } + ] + } +} diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/header-sd.json b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/header-sd.json new file mode 100644 index 0000000000..9308222ab6 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/header-sd.json @@ -0,0 +1,36 @@ +{ + "header": + { + "version": "0x20210119", + "spiinfo": + { + "pagesize": "2048", + "sparearea": "64", + "pageperblk": "64", + "quadread": "0x6B", + "readsts": "0x05", + "writests": "0x01", + "stsvalue": "0x02", + "dummy1": "0", + "dummy2": "1", + "suspintvl": "1" + }, + "secureboot": "no", + "entrypoint": "0x80400000", + "image": + [ + { + "offset": "0x1000", + "loadaddr": "0x28030000", + "type": "2", + "file": "ddrimg/enc_ddr3_winbond_256mb.bin" + }, + { + "offset": "0x4000", + "loadaddr": "0x80400000", + "type": "4", + "file": "../rtthread.bin" + } + ] + } +} diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter.py b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter.py new file mode 100644 index 0000000000..a9dfea35b5 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter.py @@ -0,0 +1,1938 @@ +# NOTE: This script is test under Python 3.x + +__copyright__ = "Copyright (C) 2020~2021 Nuvoton Technology Corp. All rights reserved" +__version__ = "v0.37" + +import os +import sys +import argparse +import json +import crcmod +from Crypto.Cipher import AES +import hashlib +import ecdsa +import binascii +from datetime import datetime +import random +import shutil +from tqdm import tqdm +from xusbcom import XUsbComList +from concurrent.futures import ThreadPoolExecutor, as_completed +from UnpackImage import UnpackImage +from collections import namedtuple +from struct import unpack +import time +import platform +# for debug +import usb.core +import usb.util + +ACK = 0x55AA55AA +TRANSFER_SIZE = 4096 +MAX_HEADER_IMG = 4 +# SPI NOR align for erase/program starting address +SPINOR_ALIGN = 4096 + +# Storage device type +DEV_DDR_SRAM = 0 +DEV_NAND = 1 +DEV_SD_EMMC = 2 +DEV_SPINOR = 3 +DEV_SPINAND = 4 +DEV_OTP = 6 +DEV_USBH = 7 +DEV_UNKNOWN = 0xFF + +# For OTP programming +ACT_LOAD = 1 +ACT_WRITE = 2 +ACT_ERASE = 3 +ACT_READ = 4 +ACT_MSC = 5 + +# Command options +OPT_NONE = 0 +OPT_SCRUB = 1 # For erase, use with care +OPT_WITHBAD = 1 # For read +OPT_EXECUTE = 2 # For write +OPT_VERIFY = 3 # For write +OPT_UNPACK = 4 # For pack +OPT_RAW = 5 # For write +OPT_EJECT = 6 # For msc +OPT_STUFF = 7 # For stuff pack, output could be used by dd command +OPT_SETINFO = 8 # For set storage info for attach +OPT_CONCAT = 9 # For convert, concatenate at the end of encrypted data file +OPT_SHOWHDR = 10 # For convert. Instead of convert, show header content instead +OPT_UNKNOWN = 0xFF # Error + + +# OPT block definitions +OPT_OTPBLK1 = 0x100 +OPT_OTPBLK2 = 0x200 +OPT_OTPBLK3 = 0x400 +OPT_OTPBLK4 = 0x800 +OPT_OTPBLK5 = 0x1000 +OPT_OTPBLK6 = 0x2000 +OPT_OTPBLK7 = 0x4000 +OPT_OTPKEY = 0x8000 + +# for key lock +OPT_OTPKEY0 = 0x10000 +OPT_OTPKEY1 = 0x20000 +OPT_OTPKEY2 = 0x40000 +OPT_OTPKEY3 = 0x80000 +OPT_OTPKEY4 = 0x100000 +OPT_OTPKEY5 = 0x200000 + + +# Image type definitions +IMG_DATA = 0 +IMG_TFA = 1 +IMG_UBOOT = 2 +IMG_LINUX = 3 +IMG_DDR = 4 +IMG_TEE = 5 +IMG_DTB = 6 + +# If attach is a must. maybe better for real chip. +# devices = [] +mp_mode = False + +WINDOWS_PATH = "C:\\Program Files (x86)\\Nuvoton Tools\\NuWriter\\" +LINUX_PATH = "/usr/share/nuwriter/" + + +def conv_env(env_file_name, blk_size) -> bytearray: + + try: + with open(env_file_name, "r") as env_file: + env_data = env_file.read().splitlines() + except (IOError, OSError) as err: + print(f"Open {env_file_name} failed") + sys.exit(err) + + out = bytearray(4) # Reserved for CRC + for lines in env_data: + out += bytes(lines, 'ascii') + out += b'\x00' + out += b'\x00' + out += b'\xFF' * (blk_size - len(out)) + + crc32_func = crcmod.predefined.mkCrcFun('crc-32') + checksum = crc32_func(out[4:]) + out[0:4] = checksum.to_bytes(4, byteorder="little") + + return out + + +def get_dpm(dpm) -> int: + return { + 'a35sdsdis': 0x00000001, + 'a35sdslock': 0x00000002, + 'a35sndsdis': 0x00000004, + 'a35sndslock': 0x00000008, + 'a35nsdsdis': 0x00000010, + 'a35nsdslock': 0x00000020, + 'a35nsndsdis': 0x00000040, + 'a35nsndslock': 0x00000080, + 'm4dsdis': 0x00000100, + 'm4dslock': 0x00000200, + 'm4ndsdis': 0x00000400, + 'm4ndslock': 0x00000800, + 'extdis': 0x00001000, + 'extlock': 0x00002000, + 'exttdis': 0x00004000, + 'exttlock': 0x00008000, + 'giccfgsdis': 0x00010000, + 'giccfgslock': 0x00020000 + }.get(dpm, 0) + + +def get_plm(plm) -> int: + return { + 'oem': 0x1, + 'deploy': 0x3, + 'rma': 0x7, + 'prma': 0xF + }.get(plm, 0) + + +def conv_otp(opt_file_name) -> (bytearray, int): + try: + with open(opt_file_name, "r") as json_file: + try: + d = json.load(json_file) + except json.decoder.JSONDecodeError as err: + print(f"{opt_file_name} parsing error") + sys.exit(err) + except (IOError, OSError) as err: + print(f"Open {opt_file_name} failed") + sys.exit(err) + # Bootcfg, DPM, PLM, and PWD 4 bytes each, MAC addr 8 bytes each, sec/nsec 88 bytes each + data = bytearray(208) + + option = 0 + for key in d.keys(): + if key == 'boot_cfg': + cfg_val = 0 + for sub_key in d['boot_cfg'].keys(): + if sub_key == 'posotp': + if d['boot_cfg']['posotp'] == 'enable': + cfg_val |= 1 + if sub_key == 'qspiclk': + if d['boot_cfg']['qspiclk'] == '50mhz': + cfg_val |= 2 + if sub_key == 'wdt1en': + if d['boot_cfg']['wdt1en'] == 'enable': + cfg_val |= 4 + if sub_key == 'uart0en': + if d['boot_cfg']['uart0en'] == 'disable': + cfg_val |= 0x10 + if sub_key == 'sd0bken': + if d['boot_cfg']['sd0bken'] == 'enable': + cfg_val |= 0x20 + if sub_key == 'tsiimg': + if d['boot_cfg']['tsiimg'] == 'enable': + cfg_val |= 0x40 + if sub_key == 'tsidbg': + if d['boot_cfg']['tsidbg'] == 'disable': + cfg_val |= 0x80 + if sub_key == 'bootsrc': + if d['boot_cfg']['bootsrc'] == 'sd' or d['boot_cfg']['bootsrc'] == 'emmc': + cfg_val |= 0x400 + elif d['boot_cfg']['bootsrc'] == 'nand': + cfg_val |= 0x800 + elif d['boot_cfg']['bootsrc'] == 'usb': + cfg_val |= 0xC00 + if sub_key == 'page': + if d['boot_cfg']['page'] == '2k': + cfg_val |= 0x1000 + elif d['boot_cfg']['page'] == '4k': + cfg_val |= 0x2000 + elif d['boot_cfg']['page'] == '8k': + cfg_val |= 0x3000 + if sub_key == 'option': + if d['boot_cfg']['option'] == 'sd1' or d['boot_cfg']['option'] == 'emmc1' or \ + d['boot_cfg']['option'] == 't12' or d['boot_cfg']['option'] == 'spinand4': + cfg_val |= 0x4000 + elif d['boot_cfg']['option'] == 't24' or d['boot_cfg']['option'] == 'spinor1': + cfg_val |= 0x8000 + elif d['boot_cfg']['option'] == 'noecc' or d['boot_cfg']['option'] == 'spinor4': + cfg_val |= 0xC000 + if sub_key == 'secboot': + if d['boot_cfg']['secboot'] == 'disable': + cfg_val |= 0x5A000000 + data[0:4] = cfg_val.to_bytes(4, byteorder='little') + option |= OPT_OTPBLK1 + elif key == 'dpm_plm': + for sub_key in d['dpm_plm'].keys(): + if sub_key == 'dpm': + dpm_val = 0 + for dpm_key in d['dpm_plm']['dpm'].keys(): + dpm_val |= get_dpm(dpm_key) + if dpm_val != 0: + data[4:8] = dpm_val.to_bytes(4, byteorder='little') + elif sub_key == 'plm': + plm_val = get_plm(d['dpm_plm']['plm']) + if plm_val != 0: + data[8:12] = plm_val.to_bytes(4, byteorder='little') + option |= OPT_OTPBLK2 + elif key == 'mac0': + data[12:18] = bytes.fromhex(d['mac0']) + option |= OPT_OTPBLK3 + elif key == 'mac1': + data[20:26] = bytes.fromhex(d['mac1']) + option |= OPT_OTPBLK4 + elif key == 'dplypwd': + data[28:32] = bytes.fromhex(d['dplypwd']) + option |= OPT_OTPBLK5 + elif key == 'sec': + newkey = bytes.fromhex(d['sec']) + newkey += b'\x00' * (88 - len(newkey)) + data[32:120] = newkey + option |= OPT_OTPBLK6 + elif key == 'nonsec': + newkey = bytes.fromhex(d['nonsec']) + newkey += b'\x00' * (88 - len(newkey)) + data[120:208] = newkey + option |= OPT_OTPBLK7 + elif key == 'huk0': + newkey = bytes.fromhex(d['huk0']['key']) + if len(newkey) != 16: + print("HUK0 is 128-bit") + sys.exit(2) + newkey += b'\x00' * (32 - len(newkey)) + # size - 128-bit + newkey += b'\x08\x00\x00\x00' + # key number - 0 + newkey += b'\x00\x00\x00\x00' + # meta - owner: cpu, cpu readable + newkey += b'\x04\x00\x05\x80' + data += newkey + + elif key == 'huk1': + newkey = bytes.fromhex(d['huk1']['key']) + if len(newkey) != 16: + print("HUK1 is 128-bit") + sys.exit(2) + newkey += b'\x00' * (32 - len(newkey)) + # size - 128-bit + newkey += b'\x08\x00\x00\x00' + # key number - 1 + newkey += b'\x01\x00\x00\x00' + # meta - owner: cpu, cpu readable + newkey += b'\x04\x00\x05\x80' + data += newkey + + elif key == 'huk2': + newkey = bytes.fromhex(d['huk2']['key']) + if len(newkey) != 16: + print("HUK0 is 128-bit") + sys.exit(2) + newkey += b'\x00' * (32 - len(newkey)) + # size - 128-bit + newkey += b'\x08\x00\x00\x00' + # key number - 2 + newkey += b'\x02\x00\x00\x00' + # meta - owner: cpu, cpu readable + newkey += b'\x04\x00\x05\x80' + data += newkey + + elif key == 'key3': + newkey = bytes.fromhex(d['key3']['key']) + if len(newkey) != 32: + print("key3 is 256-bit") + sys.exit(2) + newkey += b'\x00' * (32 - len(newkey)) + # size - 256-bit + newkey += b'\x00\x01\x00\x00' + # key number - 3 + newkey += b'\x03\x00\x00\x00' + + if d['key3']['meta'] == 'aes256-unreadable': + newkey += b'\x00\x06\x00\x80' + elif d['key3']['meta'] == 'aes256-cpu-readable': + newkey += b'\x04\x06\x00\x80' + elif d['key3']['meta'] == 'sha256-unreadable': + newkey += b'\x00\x06\x01\x80' + elif d['key3']['meta'] == 'sha256-cpu-readable': + newkey += b'\x04\x06\x01\x80' + elif d['key3']['meta'] == 'eccp256-unreadable': + newkey += b'\x00\x06\x04\x80' + elif d['key3']['meta'] == 'eccp256-cpu-readable': + newkey += b'\x04\x06\x04\x80' + + data += newkey + elif key == 'key4': + newkey = bytes.fromhex(d['key4']['key']) + if len(newkey) != 32: + print("key4 is 256-bit") + sys.exit(2) + newkey += b'\x00' * (32 - len(newkey)) + # size - 256-bit + newkey += b'\x00\x01\x00\x00' + # key number - 4 + newkey += b'\x04\x00\x00\x00' + + if d['key4']['meta'] == 'aes256-unreadable': + newkey += b'\x00\x06\x00\x80' + elif d['key4']['meta'] == 'aes256-cpu-readable': + newkey += b'\x04\x06\x00\x80' + elif d['key4']['meta'] == 'sha256-unreadable': + newkey += b'\x00\x06\x01\x80' + elif d['key4']['meta'] == 'sha256-cpu-readable': + newkey += b'\x04\x06\x01\x80' + elif d['key4']['meta'] == 'eccp256-unreadable': + newkey += b'\x00\x06\x04\x80' + elif d['key4']['meta'] == 'eccp256-cpu-readable': + newkey += b'\x04\x06\x04\x80' + + data += newkey + elif key == 'key5': + newkey = bytes.fromhex(d['key5']['key']) + if len(newkey) != 32: + print("key5 is 256-bit") + sys.exit(2) + newkey += b'\x00' * (32 - len(newkey)) + # size - 256-bit + newkey += b'\x00\x01\x00\x00' + # key number - 5 + newkey += b'\x05\x00\x00\x00' + + if d['key5']['meta'] == 'aes256-unreadable': + newkey += b'\x00\x06\x00\x80' + elif d['key5']['meta'] == 'aes256-cpu-readable': + newkey += b'\x04\x06\x00\x80' + elif d['key5']['meta'] == 'sha256-unreadable': + newkey += b'\x00\x06\x01\x80' + elif d['key5']['meta'] == 'sha256-cpu-readable': + newkey += b'\x04\x06\x01\x80' + elif d['key5']['meta'] == 'eccp256-unreadable': + newkey += b'\x00\x06\x04\x80' + elif d['key5']['meta'] == 'eccp256-cpu-readable': + newkey += b'\x04\x06\x04\x80' + + data += newkey + elif key == 'publicx': + newkey = bytes.fromhex(d['publicx']) + if len(newkey) != 32: + print("IBR publicx is 256-bit") + sys.exit(2) + data += bytes.fromhex(d['publicx']) + data += b'\x00\x01\x00\x00' # 256 bits + data += b'\x06\x00\x00\x00' + data += b'\x01\x06\x04\x80' + elif key == 'publicy': + newkey = bytes.fromhex(d['publicy']) + if len(newkey) != 32: + print("IBR publicy is 256-bit") + sys.exit(2) + data += bytes.fromhex(d['publicy']) + data += b'\x00\x01\x00\x00' # 256 bits + data += b'\x07\x00\x00\x00' + data += b'\x01\x06\x04\x80' + elif key == 'aeskey': + newkey = bytes.fromhex(d['aeskey']) + if len(newkey) != 32: + print("IBR aeskey is 256-bit") + sys.exit(2) + data += bytes.fromhex(d['aeskey']) + data += b'\x00\x01\x00\x00' # 256 bits + data += b'\x08\x00\x00\x00' + data += b'\x01\x06\x00\x80' + + try: + with open("otp_data.bin", "wb") as out_file: + out_file.write(data[0:len(data)]) + except (IOError, OSError) as err: + print(f"Open otp_data.bin failed") + sys.exit(err) + + if len(data) > 208: + option |= OPT_OTPKEY + return data, option + + +def __img_erase(dev, media, start, length, option) -> int: + + nand_align, spinand_align = dev.get_align() + + if (media == DEV_NAND and nand_align == 0) or \ + (media == DEV_SPINAND and spinand_align == 0): + print("Unable to get block size") + return -1 + + if (media == DEV_NAND and start % nand_align != 0) or\ + (media == DEV_SPINAND and start % spinand_align != 0) or \ + (media == DEV_SPINOR and start % SPINOR_ALIGN != 0): + print("Starting address must be block aligned") + return -1 + + cmd = start.to_bytes(8, byteorder='little') + cmd += length.to_bytes(8, byteorder='little') + cmd += ACT_ERASE.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + + dev.set_media(media) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + bar = tqdm(total=100, position=dev.get_id(), ascii=True) + previous_progress = 0 + while True: + # xusb ack with total erase progress. + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") <= 100: + bar.update(int.from_bytes(ack, byteorder="little") - previous_progress) + previous_progress = int.from_bytes(ack, byteorder="little") + if int.from_bytes(ack, byteorder="little") == 100: + break + bar.close() + return 0 + + +# default erase all (count=0) +def do_img_erase(media, start, length=0, option=OPT_NONE) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__img_erase, dev, media, start, length, option) for dev in devices] + success = 0 + failed = 0 + for future in as_completed(futures): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print(f"Successfully erased {success} device(s)") + if failed > 0: + print(f"Failed to erase {failed} device(s)") + + +def do_otp_erase(option) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + start = 0 + length = 0 + dev = devices[0] + load_otp_writer(dev) + cmd = start.to_bytes(8, byteorder='little') + cmd += length.to_bytes(8, byteorder='little') + cmd += ACT_ERASE.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + + dev.set_media(DEV_OTP) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + print(f"Failed to erase device(s)") + + # There's no way to tell the progress... + ack = dev.read(4) + data = int.from_bytes(ack, byteorder="little") + if option == 0x100: + data >>= 2 + data &= 0x3 + if option == 0x400: + data >>= 6 + data &= 0x3 + if option == 0x800: + data >>= 8 + data &= 0x3 + if option & 0x8000: + data >>= 16 + #print(f"Erase count state {hex(data)}") + + print(f"Successfully erased device(s)") + +def load_otp_writer(dev) -> int: + try: + with open("otp_writer.bin", "rb") as writer_file: + otp_writer = writer_file.read() + except (IOError, OSError) as err: + print(f"Open {opt_file_name} failed") + sys.exit(err) + + option = 0 + img_length = len(otp_writer) + cmd = b'\x00\x00\xf0\x86\x00\x00\x00\x00' + cmd += img_length.to_bytes(8, byteorder='little') + cmd += ACT_LOAD.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + dev.set_media(DEV_OTP) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + + for offset in range(0, img_length, TRANSFER_SIZE): + xfer_size = TRANSFER_SIZE if offset + TRANSFER_SIZE < img_length else img_length - offset + dev.write(otp_writer[offset: offset + xfer_size]) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != xfer_size: + print("Acked size error") + return -1 + + while True: + # wait TSI update firmware + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") == ACK: + break + + return 0 + +def __otp_program(dev, otp_data, option) -> int: + + img_length = len(otp_data) + + cmd = b'\x00\x00\xf0\x86\x00\x00\x00\x00' + cmd += img_length.to_bytes(8, byteorder='little') + cmd += ACT_WRITE.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + + dev.set_media(DEV_OTP) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + # There's no way to tell the progress... + dev.write(otp_data) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != img_length: + print("Acked size error") + return -1 + + # There's no way to tell the progress... + ack = dev.read(4) + data = int.from_bytes(ack, byteorder="little") + #print(f"Can program count {hex(data)}") + + return 0 + + +def do_otp_program(opt_file_name) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + load_otp_writer(devices[0]) + otp_data, option = conv_otp(opt_file_name) + + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__otp_program, dev, otp_data, option) for dev in devices] + success = 0 + failed = 0 + for future in as_completed(futures): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print(f"Successfully programmed {success} device(s)") + if failed > 0: + print(f"Failed to program {failed} device(s)") + + +def do_otp_read(media, start, out_file_name, length=0x1, option=OPT_NONE) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + # Only support one device in read function + dev = devices[0] + load_otp_writer(dev) + + cmd = start.to_bytes(8, byteorder='little') + cmd += length.to_bytes(8, byteorder='little') + cmd += ACT_READ.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + + dev.set_media(media) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return + # FIXME: Don't know real length for "read all" + bar = tqdm(total=length, ascii=True) + data = b'' + remain = length + + while remain > 0: + ack = dev.read(4) + # Get the transfer length of next read + xfer_size = int.from_bytes(ack, byteorder="little") + + data += dev.read(xfer_size) + dev.write(xfer_size.to_bytes(4, byteorder='little')) # ack + remain -= xfer_size + bar.update(xfer_size) + try: + with open(out_file_name, "wb") as out_file: + out_file.write(data[0:length]) + except (IOError, OSError) as err: + print(f"Open {out_file_name} failed") + sys.exit(err) + + bar.close() + + +def __pack_program(dev, media, pack_image, option) -> int: + + nand_align, spinand_align = dev.get_align() + image_cnt = pack_image.img_count() + + if (media == DEV_NAND and nand_align == 0) or \ + (media == DEV_SPINAND and spinand_align == 0): + print("Unable to get block size") + return -1 + + for i in range(image_cnt): + img_length, img_start, img_type = pack_image.img_attr(i) + if (media == DEV_NAND and img_start % nand_align != 0) or \ + (media == DEV_SPINAND and img_start % spinand_align != 0) or \ + (media == DEV_SPINOR and img_start % SPINOR_ALIGN != 0): + print("Starting address must be block aligned") + return -1 + time.sleep(1) + dev.set_media(media) + cmd = img_start.to_bytes(8, byteorder='little') + cmd += img_length.to_bytes(8, byteorder='little') + cmd += ACT_WRITE.to_bytes(4, byteorder='little') + cmd += img_type.to_bytes(4, byteorder='little') + + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + text = f"Programming {i}/{image_cnt}" + bar = tqdm(total=img_length, position=dev.get_id(), ascii=True, desc=text) + for offset in range(0, img_length, TRANSFER_SIZE): + xfer_size = TRANSFER_SIZE if offset + TRANSFER_SIZE < img_length else img_length - offset + dev.write(pack_image.img_content(i, offset, xfer_size)) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != xfer_size: + print("Ack size error") + return -1 + bar.update(xfer_size) + bar.close() + dev.read(4) + + # FIXME: Added time.sleep(1) to make SPI NAND Pack Program + Verify PASS + time.sleep(1) + + if option == OPT_VERIFY: + dev.set_media(media) + cmd = img_start.to_bytes(8, byteorder='little') + cmd += img_length.to_bytes(8, byteorder='little') + cmd += ACT_READ.to_bytes(4, byteorder='little') + cmd += b'\x00' * 4 + + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + remain = img_length + text = f"Verifying {i}/{image_cnt}" + bar = tqdm(total=img_length, position=dev.get_id(), ascii=True, desc=text) + while remain > 0: + ack = dev.read(4) + # Get the transfer length of next read + xfer_size = int.from_bytes(ack, byteorder="little") + + data = dev.read(xfer_size) + dev.write(xfer_size.to_bytes(4, byteorder='little')) + offset = img_length - remain + + # For SD/eMMC + if xfer_size > remain: + xfer_size = remain + data = data[0: remain] + + if data != bytearray(pack_image.img_content(i, offset, xfer_size)): + print("Verify failed") + return -1 + remain -= xfer_size + bar.update(xfer_size) + bar.close() + return 0 + + +def do_pack_program(media, pack_file_name, option=OPT_NONE) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + pack_image = UnpackImage(pack_file_name) + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__pack_program, dev, media, pack_image, option) for dev in devices] + success = 0 + failed = 0 + for future in as_completed(futures): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print(f"Successfully programmed {success} device(s)") + if failed > 0: + print(f"Failed to program {failed} device(s)") + + +def __img_program(dev, media, start, img_data, option) -> int: + + nand_align, spinand_align = dev.get_align() + + if (media == DEV_NAND and nand_align == 0) or \ + (media == DEV_SPINAND and spinand_align == 0): + print("Unable to get block size") + return -1 + + if (media == DEV_NAND and start % nand_align != 0) or\ + (media == DEV_SPINAND and start % spinand_align != 0) or \ + (media == DEV_SPINOR and start % SPINOR_ALIGN != 0): + print("Starting address must be block aligned") + return -1 + + img_length = len(img_data) + print(f"image length is {img_length}") + cmd = start.to_bytes(8, byteorder='little') + cmd += img_length.to_bytes(8, byteorder='little') + cmd += ACT_WRITE.to_bytes(4, byteorder='little') + if option == OPT_EXECUTE: + cmd += option.to_bytes(4, byteorder='little') + else: + cmd += b'\x00' * 4 + + dev.set_media(media) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + + # Set ascii=True is for Windows cmd terminal, position > 0 doesn't work as expected in cmd though... + bar = tqdm(total=img_length, position=dev.get_id(), ascii=True, desc="Programming") + for offset in range(0, img_length, TRANSFER_SIZE): + xfer_size = TRANSFER_SIZE if offset + TRANSFER_SIZE < img_length else img_length - offset + dev.write(img_data[offset: offset + xfer_size]) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != xfer_size: + print("Ack size error") + return -1 + bar.update(xfer_size) + dev.read(4) + bar.close() + if option == OPT_VERIFY: + dev.set_media(media) + cmd = start.to_bytes(8, byteorder='little') + cmd += img_length.to_bytes(8, byteorder='little') + cmd += ACT_READ.to_bytes(4, byteorder='little') + cmd += b'\x00' * 4 + + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + + remain = img_length + bar = tqdm(total=img_length, position=dev.get_id(), ascii=True, desc="Verifying") + while remain > 0: + ack = dev.read(4) + # Get the transfer length of next read + xfer_size = int.from_bytes(ack, byteorder="little") + + data = dev.read(xfer_size) + dev.write(xfer_size.to_bytes(4, byteorder='little')) # ack + offset = img_length - remain + + # For SD/eMMC + if xfer_size > remain: + xfer_size = remain + data = data[0: remain] + + if data != bytearray(img_data[offset: offset + xfer_size]): + print("Verify failed") + return -1 + remain -= xfer_size + bar.update(xfer_size) + print("Verify pass") + bar.close() + return 0 + + +def do_img_program(media, start, image_file_name, option=OPT_NONE) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + try: + with open(image_file_name, "rb") as image_file: + img_data = image_file.read() + + except (IOError, OSError) as err: + print(f"Open {image_file_name} failed") + sys.exit(err) + + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__img_program, dev, media, start, img_data, option) for dev in devices] + success = 0 + failed = 0 + for future in as_completed(futures): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print(f"Successfully programmed {success} device(s)") + if failed > 0: + print(f"Failed to program {failed} device(s)") + + +def do_img_read(media, start, out_file_name, length=0x1, option=OPT_NONE) -> None: + # only support read from 1 device + # devices = XUsbComList(attach_all=False).get_dev() + _XUsbComList = XUsbComList(attach_all=False) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + # Only support one device in read function + dev = devices[0] + + cmd = start.to_bytes(8, byteorder='little') + cmd += length.to_bytes(8, byteorder='little') + cmd += ACT_READ.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + + dev.set_media(media) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return + # FIXME: Don't know real length for "read all" + bar = tqdm(total=length, ascii=True) + data = b'' + remain = length + + while remain > 0: + ack = dev.read(4) + # Get the transfer length of next read + xfer_size = int.from_bytes(ack, byteorder="little") + + data += dev.read(xfer_size) + dev.write(xfer_size.to_bytes(4, byteorder='little')) # ack + remain -= xfer_size + bar.update(xfer_size) + try: + with open(out_file_name, "wb") as out_file: + out_file.write(data[0:length]) + except (IOError, OSError) as err: + print(f"Open {out_file_name} failed") + sys.exit(err) + + bar.close() + + +def __attach(dev, ini_data, xusb_data) -> int: + ini_len = len(ini_data) + out = int(ini_len).to_bytes(4, byteorder="little") + out += b'\x00\x00\x03\x28' # Execute address is 0x28030000 + dev.write(out) + dev.write(ini_data) + + in_buf = dev.read(4) + if int.from_bytes(in_buf, byteorder="little") != ini_len: + print("Length error") + return -1 + + in_buf = dev.read(4) + if int.from_bytes(in_buf, byteorder="little") != ACK: + val = int.from_bytes(in_buf, byteorder="little") + print(f"Ack error {val}") + return -1 + + xusb_len = len(xusb_data) + out = int(xusb_len).to_bytes(4, byteorder="little") + out += b'\x00\x00\x00\x87' # Execute address is 0x87000000 + dev.write(out) + for offset in range(0, xusb_len, TRANSFER_SIZE): + xfer_size = TRANSFER_SIZE if offset + TRANSFER_SIZE < xusb_len else xusb_len - offset + + dev.write(xusb_data[offset: offset + xfer_size]) + if offset + xfer_size != xusb_len: # Ignore the ack of last packet + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != xfer_size: + _ack = int.from_bytes(ack, byteorder="little") + print(f"Ack size error {_ack} {xfer_size}") + return -1 + + return 0 + + +def __get_info(dev, data) -> int: + try: + info = dev.get_info(data) + except usb.core.USBError as err: + sys.exit(err) + + _info_struct = namedtuple('_info_struct', + 'page_per_blk page_size blk_cnt bad_clk_cnt oob_size usr_cfg0 spi_id usr_cfg1 quad_cmd \ + read_sts_cmd write_sts_cmd sts_val dummy_byte blk rsv use_cfg2 snand_id snand_page_size \ + snand_oob snand_quad_cmd snand_read_sts_cmd snand_write_sts_cmd snand_sts_val \ + snand_dummy_byte snand_blk_cnt snand_page_per_blk') + info_struct = _info_struct._make(unpack(' None: + global mp_mode + + init_location = "missing" + if os.path.exists(ini_file_name): # default use the init file in current directory + init_location = ini_file_name + else: + if platform.system() == 'Windows': + if os.path.exists(WINDOWS_PATH + "ddrimg\\" + ini_file_name): + init_location = WINDOWS_PATH + "ddrimg\\" + ini_file_name + elif platform.system() == 'Linux': + if os.path.exists(LINUX_PATH + "ddrimg/" + ini_file_name): + init_location = LINUX_PATH + "ddrimg/" + ini_file_name + + if init_location == "missing": + print(f"Cannot find {ini_file_name}") + sys.exit(3) + try: + with open(init_location, "rb") as ini_file: + ini_data = ini_file.read() + except (IOError, OSError) as err: + print(f"Open {ini_file_name} failed") + sys.exit(err) + xusb_location = "missing" + if os.path.exists("xusb.bin"): # default use the xusb.bin in current directory + xusb_location = "xusb.bin" + else: + if platform.system() == 'Windows': + if os.path.exists(WINDOWS_PATH + "xusb.bin"): + xusb_location = WINDOWS_PATH + "xusb.bin" + elif platform.system() == 'Linux': + if os.path.exists(LINUX_PATH + "xusb.bin"): + xusb_location = LINUX_PATH + "xusb.bin" + if xusb_location == "missing": + print("Cannot find xusb.bin") + sys.exit(3) + + try: + with open(xusb_location, "rb") as xusb_file: + xusb_data = xusb_file.read() + except (IOError, OSError) as err: + print("Open xusb.bin failed") + sys.exit(err) + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__attach, dev, ini_data, xusb_data) for dev in devices] + success = 0 + failed = 0 + for future in as_completed(futures, timeout=2): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print(f"Successfully attached {success} device(s)") + if failed > 0: + print(f"Failed to attach {failed} device(s)") + if success == 0: + return + + time.sleep(1) + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComListNew = XUsbComList(attach_all=mp_mode) + devices = _XUsbComListNew.get_dev() + + data = bytearray(76) + # assign option file to set media info + if option == OPT_SETINFO: + try: + with open("info.json", "r") as json_file: + try: + d = json.load(json_file) + except json.decoder.JSONDecodeError as err: + print(f"{json_file} parsing error") + sys.exit(err) + except (IOError, OSError) as err: + print("Open info.json failed") + sys.exit(err) + # now generate info from info.json + for key in d.keys(): + if key == 'spinand': + data[48] = 1 + for sub_key in d['spinand'].keys(): + if sub_key == 'pagesize': + data[56:58] = int(d['spinand']['pagesize'], 0).to_bytes(2, byteorder="little") + elif sub_key == 'sparearea': + data[58:60] = int(d['spinand']['sparearea'], 0).to_bytes(2, byteorder="little") + elif sub_key == 'quadread': + data[60:61] = int(d['spinand']['quadread'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'readsts': + data[61:62] = int(d['spinand']['readsts'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'writests': + data[62:63] = int(d['spinand']['writests'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'stsvalue': + data[63:64] = int(d['spinand']['stsvalue'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'dummy': + data[64:68] = int(d['spinand']['dummy'], 0).to_bytes(4, byteorder="little") + elif sub_key == 'blkcnt': + data[68:72] = int(d['spinand']['blkcnt'], 0).to_bytes(4, byteorder="little") + elif sub_key == 'pageperblk': + data[72:76] = int(d['spinand']['pageperblk'], 0).to_bytes(4, byteorder="little") + elif key == 'spinor': + data[28] = 1 + for sub_key in d['spinor'].keys(): + if sub_key == 'quadread': + data[32:33] = int(d['spinor']['quadread'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'readsts': + data[33:34] = int(d['spinor']['readsts'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'writests': + data[34:35] = int(d['spinor']['writests'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'stsvalue': + data[35:36] = int(d['spinor']['stsvalue'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'dummy': + data[36:40] = int(d['spinor']['dummy'], 0).to_bytes(4, byteorder="little") + elif key == 'nand': + data[20] = 1 + for sub_key in d['nand'].keys(): + if sub_key == 'blkcnt': + data[8:12] = int(d['nand']['blkcnt'], 0).to_bytes(4, byteorder="little") + elif sub_key == 'pageperblk': + data[0:4] = int(d['nand']['pageperblk'], 0).to_bytes(4, byteorder="little") + if len(devices) == 0: + print("Device not found") + sys.exit(2) + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__get_info, dev, data) for dev in devices] + + success = 0 + failed = 0 + for future in as_completed(futures, timeout=2): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print(f"Successfully get info from {success} device(s)") + + +def do_unpack(pack_file_name) -> None: + + now = datetime.now() + pack_image = UnpackImage(pack_file_name) + image_cnt = pack_image.img_count() + + try: + os.mkdir(now.strftime("%m%d-%H%M%S%f")) + except (IOError, OSError) as err: + sys.exit(err) + + for i in range(image_cnt): + img_length, _, _ = pack_image.img_attr(i) + try: + with open(now.strftime("%m%d-%H%M%S%f") + "/img" + str(i) + ".bin", "wb") as img_file: + img_file.write(pack_image.img_content(i, 0, img_length)) + except (IOError, OSError) as err: + print("Create output image file failed") + sys.exit(err) + try: + os.unlink("unpack") + except (IOError, OSError): + pass + try: + os.symlink(now.strftime("%m%d-%H%M%S%f"), "unpack") + except (IOError, OSError): + print("Create symbolic folder unpack failed") + print("Unpack images to directory {} complete".format(now.strftime("%m%d-%H%M%S%f"))) + + +def do_stuff(cfg_file) -> None: + now = datetime.now() + + try: + with open(cfg_file, "r") as json_file: + try: + d = json.load(json_file) + except json.decoder.JSONDecodeError as err: + print(f"{cfg_file} parsing error") + sys.exit(err) + except (IOError, OSError) as err: + print(f"Open {cfg_file} failed") + sys.exit(err) + + try: + os.mkdir(now.strftime("%m%d-%H%M%S%f")) + pack_file = open(now.strftime("%m%d-%H%M%S%f") + "/pack.bin", "wb") + except (IOError, OSError) as err: + sys.exit(err) + + offset = 0 + out = bytearray() + + # Start stuffing image + for img in d["image"]: + try: + with open(img["file"], "rb") as img_file: + data = img_file.read() + except (IOError, OSError) as err: + print(f"Open {img_file} failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + if int(img["offset"], 0) < offset: + print(f"Please place the files in {cfg_file} based on the ascending offset") + sys.exit(4) + elif int(img["offset"], 0) > offset: + out += b'\xFF' * (int(img["offset"], 0) - offset) + offset = int(img["offset"], 0) + out += data + offset += len(data) + pack_file.write(out) + pack_file.close() + try: + os.unlink("pack") + except (IOError, OSError): + pass + try: + os.symlink(now.strftime("%m%d-%H%M%S%f"), "pack") + except (IOError, OSError): + print("Create symbolic folder pack failed") + print("Generate pack file in directory {} complete".format(now.strftime("%m%d-%H%M%S%f"))) + + +def do_pack(cfg_file) -> None: + now = datetime.now() + + try: + with open(cfg_file, "r") as json_file: + try: + d = json.load(json_file) + except json.decoder.JSONDecodeError as err: + print(f"{cfg_file} parsing error") + sys.exit(err) + except (IOError, OSError) as err: + print(f"Open {cfg_file} failed") + sys.exit(err) + + try: + os.mkdir(now.strftime("%m%d-%H%M%S%f")) + pack_file = open(now.strftime("%m%d-%H%M%S%f") + "/pack.bin", "wb") + except (IOError, OSError) as err: + sys.exit(err) + + out = bytearray(b'\x20\x54\x56\x4e' + b'\xFF' * 12) # NVT + CRC32 + image count + 4 reserved bytes + + # Start packing image + img_cnt = 0 + for img in d["image"]: + try: + with open(img["file"], "rb") as img_file: + data = img_file.read() + except (IOError, OSError) as err: + print(f"Open {img_file} failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + img_cnt = img_cnt + 1 + + img_len = len(data) + out += img_len.to_bytes(8, byteorder="little") + try: + out += int(img["offset"], 0).to_bytes(8, byteorder="little") + except ValueError as err: + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + out += img["type"].to_bytes(4, byteorder="little") + out += b'\xFF' * 4 + out += data + # Always put image start @ 16 byte boundary + pad = 16 - (img_len + 8) & 0xF + if pad != 16: + out += b'\xFF' * pad + + # Fill image count + out[8:12] = img_cnt.to_bytes(4, byteorder="little") + + # Fill CRC field + crc32_func = crcmod.predefined.mkCrcFun('crc-32') + checksum = crc32_func(out[8:]) + out[4:8] = checksum.to_bytes(4, byteorder="little") + + pack_file.write(out) + pack_file.close() + try: + os.unlink("pack") + except (IOError, OSError): + pass + try: + os.symlink(now.strftime("%m%d-%H%M%S%f"), "pack") + except (IOError, OSError): + print("Create symbolic folder pack failed") + print("Generate pack file in directory {} complete".format(now.strftime("%m%d-%H%M%S%f"))) + + +def do_showhdr(cfg_file) -> None: + try: + header_file = open(cfg_file, "br") + except (IOError, OSError) as err: + print(f"Open {cfg_file} failed") + sys.exit(err) + + if unpack(' None: + now = datetime.now() + + try: + with open(cfg_file, "r") as json_file: + try: + d = json.load(json_file) + except json.decoder.JSONDecodeError as err: + print(f"{cfg_file} parsing error") + sys.exit(err) + except (IOError, OSError) as err: + print(f"Open {cfg_file} failed") + sys.exit(err) + try: + os.mkdir(now.strftime("%m%d-%H%M%S%f")) + except (IOError, OSError) as err: + print("Create output directory failed") + sys.exit(err) + + if "header" in d: + out = bytearray(b'\x20\x54\x56\x4e' + b'\x00' * 8) # NVT + CRC + LEN + try: + out += int(d["header"]["version"], 0).to_bytes(4, byteorder="little") + # Fill SPI flash info + out += int(d["header"]["spiinfo"]["pagesize"], 0).to_bytes(2, byteorder="little") + out += int(d["header"]["spiinfo"]["sparearea"], 0).to_bytes(2, byteorder="little") + out += int(d["header"]["spiinfo"]["pageperblk"], 0).to_bytes(2, byteorder="little") + out += int(d["header"]["spiinfo"]["quadread"], 0).to_bytes(1, byteorder="little") + out += int(d["header"]["spiinfo"]["readsts"], 0).to_bytes(1, byteorder="little") + out += int(d["header"]["spiinfo"]["writests"], 0).to_bytes(1, byteorder="little") + out += int(d["header"]["spiinfo"]["stsvalue"], 0).to_bytes(1, byteorder="little") + out += int(d["header"]["spiinfo"]["dummy1"], 0).to_bytes(1, byteorder="little") + out += int(d["header"]["spiinfo"]["dummy2"], 0).to_bytes(1, byteorder="little") + out += int(d["header"]["spiinfo"]["suspintvl"], 0).to_bytes(1, byteorder="little") + out += b'\xFF' * 3 # 3 reserved bytes + out += int(d["header"]["entrypoint"], 0).to_bytes(4, byteorder="little") + except ValueError as err: + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + out += b'\xFF' * 4 # Reserve 4 bytes for image count + + # Generate key file iff secure boot is enabled + if d["header"]["secureboot"] == 'yes': + + try: + key_file = open(now.strftime("%m%d-%H%M%S%f") + "/header_key.txt", "w+") + except (IOError, OSError) as err: + print("Create key file failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + if "aeskey" in d["header"]: + try: + aeskey = bytes.fromhex(d["header"]["aeskey"]) + except ValueError as err: + sys.exit(err) + else: + aeskey = ''.join(['%x' % random.randrange(16) for _ in range(0, 64)]) + aeskey = binascii.unhexlify(bytes(aeskey, 'utf-8')) + key_file.write("AES key:\n" + str.upper(aeskey.hex())) + + if "ecdsakey" in d["header"]: + try: + sk = ecdsa.SigningKey.from_string(bytes.fromhex(d["header"]["ecdsakey"]), + curve=ecdsa.NIST256p, + hashfunc=hashlib.sha256) + except ValueError as err: + sys.exit(err) + else: + sk = ecdsa.SigningKey.generate(curve=ecdsa.NIST256p, hashfunc=hashlib.sha256) + key_file.write("\nECDSA private key:\n" + str.upper(sk.to_string().hex())) + + vk = sk.verifying_key + key_file.write("\nECDSA public key:\n" + format(vk.pubkey.point.x(), 'X') + + "\n" + format(vk.pubkey.point.y(), 'X') + "\n") + + key_file.close() + + img_cnt = len(d["header"]["image"]) + if img_cnt > MAX_HEADER_IMG: + print("Can process 4 images in header max") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(2) + + # Fill image information + for i in range(img_cnt): + img = d["header"]["image"][i] + try: + with open(img["file"], "rb") as img_file: + data = img_file.read() + except (IOError, OSError) as err: + print("Open image file failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + try: + out += int(img["offset"], 0).to_bytes(4, byteorder="little") + out += int(img["loadaddr"], 0).to_bytes(4, byteorder="little") + out += os.path.getsize(img["file"]).to_bytes(4, byteorder="little") + out += int(img["type"]).to_bytes(4, byteorder="little") + except ValueError as err: + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + if d["header"]["secureboot"] == 'yes': + + # Use CFB and each image is process independently, so call new() for every image + aes_enc = AES.new(aeskey, AES.MODE_CFB, b'\x00' * 16, segment_size=128) + data_out = aes_enc.encrypt(data) + # R & S + out += sk.sign(data_out) + + # Write encrypt image + try: + with open(now.strftime("%m%d-%H%M%S%f") + '/enc_' + + os.path.basename(img["file"]), "wb") as enc_file: + enc_file.write(data_out) + except (IOError, OSError) as err: + print("Create encrypt file failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + else: + out += b'\xFF' * 64 # Just pack 0xFF if secure boot is disabled + + # Fill header length + out[8:12] = int(len(out) - 8).to_bytes(4, byteorder="little") + # Fill image count + out[36:40] = img_cnt.to_bytes(4, byteorder="little") + # Fill header checksum + crc32_func = crcmod.predefined.mkCrcFun('crc-32') + out[4:8] = crc32_func(out[8:]).to_bytes(4, byteorder="little") + + try: + with open(now.strftime("%m%d-%H%M%S%f") + "/header.bin", "wb") as header_file: + header_file.write(out) + except (IOError, OSError) as err: + print("Create header file failed") + sys.exit(err) + + if "env" in d: + try: + with open(now.strftime("%m%d-%H%M%S%f") + "/uboot-env.bin", "wb") as out_file: + out_file.write(conv_env(d["env"]["file"], int(d["env"]["blksize"], 0))) + except (IOError, OSError, ValueError) as err: + print("Create header file failed") + sys.exit(err) + # Misc images + if "data" in d: + try: + key_file = open(now.strftime("%m%d-%H%M%S%f") + "/data_key.txt", "w+") + except (IOError, OSError) as err: + print("Create key file failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + if "aeskey" in d["data"]: + try: + aeskey = bytes.fromhex(d["data"]["aeskey"]) + except ValueError as err: + sys.exit(err) + else: + aeskey = ''.join(['%x' % random.randrange(16) for _ in range(0, 64)]) + aeskey = binascii.unhexlify(bytes(aeskey, 'utf-8')) + key_file.write("AES key:\n" + str.upper(aeskey.hex())) + + if "ecdsakey" in d["data"]: + try: + sk = ecdsa.SigningKey.from_string(bytes.fromhex(d["data"]["ecdsakey"]), + curve=ecdsa.NIST256p, + hashfunc=hashlib.sha256) + except ValueError as err: + sys.exit(err) + else: + sk = ecdsa.SigningKey.generate(curve=ecdsa.NIST256p, hashfunc=hashlib.sha256) + key_file.write("\nECDSA private key:\n" + str.upper(sk.to_string().hex())) + + vk = sk.verifying_key + key_file.write("\nECDSA public key:\n" + format(vk.pubkey.point.x(), 'X') + + "\n" + format(vk.pubkey.point.y(), 'X') + "\n") + key_file.close() + + for img in d["data"]["image"]: + try: + with open(img["file"], "rb") as img_file: + data = img_file.read() + except (IOError, OSError) as err: + print(f"Open {img_file} failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + aes_enc = AES.new(aeskey, AES.MODE_CFB, b'\x00' * 16, segment_size=128) + data_out = aes_enc.encrypt(data) + signature = sk.sign(data_out) + try: + if option is OPT_CONCAT: + # Append the R & S at the end of signed image instead of writing to a separate file. + # The signed image could be used in deployed mode + data_out += signature + else: + with open(now.strftime("%m%d-%H%M%S%f") + '/sig_' + img["file"], "wb") as sig_file: + sig_file.write(signature) # R & S + + with open(now.strftime("%m%d-%H%M%S%f") + '/enc_' + img["file"], "wb") as enc_file: + enc_file.write(data_out) + + except (IOError, OSError) as err: + print("Create encrypt/signature file failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + try: + os.unlink("conv") + except (IOError, OSError): + pass + try: + os.symlink(now.strftime("%m%d-%H%M%S%f"), "conv") + except (IOError, OSError): + print("Create symbolic folder conv failed") + print("Generate output image(s) in directory {} complete".format(now.strftime("%m%d-%H%M%S%f"))) + + +def __msc(dev, media, reserve, option) -> int: + + cmd = reserve.to_bytes(8, byteorder='little') + cmd += b'\x00' * 8 + cmd += ACT_MSC.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + + dev.set_media(media) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + return 0 + + +def do_msc(media, reserve, option=OPT_NONE) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__msc, dev, media, reserve, option) for dev in devices] + success = 0 + failed = 0 + for future in as_completed(futures): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print("Successfully {} {} MSC device(s)".format("set" if option == "OPT_NONE" else "eject", success)) + if failed > 0: + print("Failed to {} {} MSC device(s)".format("set" if option == "OPT_NONE" else "eject", failed)) + + +def get_media(media) -> int: + media = str.upper(media) + return { + 'DDR': DEV_DDR_SRAM, + 'SRAM': DEV_DDR_SRAM, + 'SD': DEV_SD_EMMC, + 'EMMC': DEV_SD_EMMC, + 'NAND': DEV_NAND, + 'SPINAND': DEV_SPINAND, + 'SPINOR': DEV_SPINOR, + 'OTP': DEV_OTP, + 'USBH': DEV_USBH + }.get(media, DEV_UNKNOWN) + + +def get_option(option) -> int: + option = str.upper(option) + return { + 'SCRUB': OPT_SCRUB, + 'WITHBAD': OPT_WITHBAD, + 'VERIFY': OPT_VERIFY, + 'EXECUTE': OPT_EXECUTE, + 'UNPACK': OPT_UNPACK, + 'RAW': OPT_RAW, + 'EJECT': OPT_EJECT, + 'STUFF': OPT_STUFF, + 'SETINFO': OPT_SETINFO, + 'CONCAT': OPT_CONCAT, + 'SHOWHDR': OPT_SHOWHDR + }.get(option, OPT_UNKNOWN) + + +def get_type(img_type) -> int: + img_type = str.upper(img_type) + return { + 'TFA': IMG_TFA, + 'UBOOT': IMG_UBOOT, + 'LINUX': IMG_LINUX, + 'DDR': IMG_DDR, + 'TEE': IMG_TEE + }.get(img_type, IMG_DATA) + +def get_otpblock(num) -> int: + num = str.upper(num) + return { + 'OTP1': OPT_OTPBLK1, + 'OTP2': OPT_OTPBLK2, + 'OTP3': OPT_OTPBLK3, + 'OTP4': OPT_OTPBLK4, + 'OTP5': OPT_OTPBLK5, + 'OTP6': OPT_OTPBLK6, + 'OTP7': OPT_OTPBLK7, + 'KEY0': OPT_OTPKEY0+OPT_OTPKEY, + 'KEY1': OPT_OTPKEY1+OPT_OTPKEY, + 'KEY2': OPT_OTPKEY2+OPT_OTPKEY, + 'KEY3': OPT_OTPKEY3+OPT_OTPKEY, + 'KEY4': OPT_OTPKEY4+OPT_OTPKEY, + 'KEY5': OPT_OTPKEY5+OPT_OTPKEY + }.get(num, OPT_UNKNOWN) + + +def main(): + parser = argparse.ArgumentParser() + + parser.add_argument("CONFIG", nargs='?', help="Config file", type=str, default='') + parser.add_argument("-a", "--attach", action='store_true', help="Attach to MA35D1") + parser.add_argument("-o", "--option", nargs='+', help="Option flag") + parser.add_argument("-t", "--type", nargs='+', help="Type flag") + group = parser.add_mutually_exclusive_group() + group.add_argument("-c", "--convert", action='store_true', help="Convert images") + group.add_argument("-p", "--pack", action='store_true', help="Generate pack file") + group.add_argument("-v", "--version", action='store_true', help="Show version number") + group.add_argument("-r", "--read", nargs='+', help="Read flash") + group.add_argument("-w", "--write", nargs='+', help="Write flash") + group.add_argument("-e", "--erase", nargs='+', help="Erase flash") + group.add_argument("-s", "--storage", nargs='+', help="Export eMMC/SD as Mass Storage Class") + + if len(sys.argv) == 1: + parser.print_help() + sys.exit(0) + + args = parser.parse_args() + + if args.option: + option = get_option(args.option[0]) + else: + option = OPT_NONE + + if option is OPT_UNKNOWN: + print("Unknown option: " + args.option[0]) + sys.exit(0) + # if args.type: + # img_type = get_type(args.type[0]) + # else: + # img_type = IMG_DATA + + cfg_file = args.CONFIG + + if args.attach: + if not cfg_file: + print("Please assign a DDR ini file") + sys.exit(0) + do_attach(cfg_file, option) + + if args.convert: + if cfg_file == '': + print("No config file assigned") + sys.exit(0) + else: + if option == OPT_SHOWHDR: + do_showhdr(cfg_file) + else: + do_convert(cfg_file, option) + elif args.pack: + if cfg_file == '': + print("No config file assigned") + sys.exit(0) + else: + if option == OPT_UNPACK: + do_unpack(cfg_file) + elif option == OPT_STUFF: + do_stuff(cfg_file) + else: + do_pack(cfg_file) + elif args.read: + # -r spinor all out.bin + # -r nand 0x1000 0x100 out.bin + # -r otp all out.bin (block1 ~ block7) + # -r otp blockno 0x4 out.bin + arg_count = len(args.read) + if arg_count < 3: + print("At lease take 3 arguments") + sys.exit(0) + media = get_media(args.read[0]) + + try: + if media == DEV_UNKNOWN: + raise ValueError(f"Cannot support read {str.upper(args.read[0])}") + if arg_count == 3 and str.upper(args.read[1]) != 'ALL': + raise ValueError("Unknown arguments") + except ValueError as err: + sys.exit(err) + + if str.upper(args.read[1]) == 'ALL': + if media == DEV_OTP: + option |= 0x3fff00 + do_otp_read(media, 0, args.read[2], 352, option) + else: + do_img_read(media, 0, args.read[2], 0, option) + else: + try: + if media == DEV_OTP: + option = get_otpblock(args.read[1]) | option + else: + start = int(args.read[1], 0) + length = int(args.read[2], 0) + except ValueError as err: + print("Wrong start/length value") + sys.exit(err) + + if media == DEV_OTP: + do_otp_read(media, 0, args.read[3], length, option) + else: + do_img_read(media, start, args.read[3], length, option) + + elif args.write: + # -w spinor 0x1000 image.bin + # -w otp otp.json + # -w nand pack.img + arg_count = len(args.write) + if arg_count < 2: + print("At lease take 2 arguments") + sys.exit(0) + media = get_media(args.write[0]) + + try: + if media == DEV_UNKNOWN: + raise ValueError(f"Unknown storage media {str.upper(args.write[0])}") + if option == OPT_VERIFY and media == DEV_OTP: + raise ValueError(f"Do not support verify option on {str.upper(args.write[0])}") + if option == OPT_EXECUTE and media != DEV_DDR_SRAM: + raise ValueError(f"Do not support execution on {str.upper(args.write[0])}") + if option == OPT_RAW and media != DEV_NAND: + raise ValueError(f"Do not support raw write on {str.upper(args.write[0])}") + except ValueError as err: + sys.exit(err) + + if arg_count == 2: + if media == DEV_OTP: + do_otp_program(args.write[1]) + else: + do_pack_program(media, args.write[1], option) + else: + try: + start = int(args.write[1], 0) + except ValueError as err: + print("Wrong start value") + sys.exit(err) + do_img_program(media, start, args.write[2], option) + + elif args.erase: + # -e spinor all + # -e nand 0x100000 0x10000 -o withbad + # -e otp blockno + arg_count = len(args.erase) + if arg_count < 2: + print("At lease take 2 arguments") + sys.exit(0) + media = get_media(args.erase[0]) + + try: + if media in [DEV_DDR_SRAM, DEV_SD_EMMC, DEV_UNKNOWN]: + raise ValueError(f"{str.upper(args.erase[0])} does not support erase") + if arg_count == 2 and str.upper(args.erase[1]) != 'ALL' and media != DEV_OTP: + raise ValueError("Unknown arguments") + if str.upper(args.erase[1]) == 'ALL' and media == DEV_OTP: + raise ValueError("Wrong arguments") + except ValueError as err: + sys.exit(err) + + if media == DEV_OTP: + option = get_otpblock(args.erase[1]) + try: + # only can erase block 1, 3, 4 + if option == OPT_OTPBLK2: + raise ValueError(f"Error block 2, only erase block 1, 3, 4") + if option == OPT_OTPBLK5: + raise ValueError(f"Error block 5, only erase block 1, 3, 4") + if option == OPT_OTPBLK6: + raise ValueError(f"Error block 6, only erase block 1, 3, 4") + if option == OPT_OTPBLK7: + raise ValueError(f"Error block 7, only erase block 1, 3, 4") + if option == OPT_UNKNOWN: + raise ValueError(f"Error key number") + except ValueError as err: + sys.exit(err) + do_otp_erase(option) + else: + if str.upper(args.erase[1]) == 'ALL': + do_img_erase(media, 0, 0, option) + else: + try: + start = int(args.erase[1], 0) + length = int(args.erase[2], 0) + except ValueError as err: + print("Wrong start/length value") + sys.exit(err) + do_img_erase(media, start, length, option) + + elif args.storage: + # -s emmc 0x800000 + # -s emmc -o remove + arg_count = len(args.erase) + if arg_count != 2 and option != OPT_EJECT: + print("Takes 2 arguments. Storage device and reserved size") + sys.exit(0) + media = get_media(args.storage[0]) + try: + if media not in [DEV_SD_EMMC]: + raise ValueError("Only support eMMC/SD") + if option != OPT_NONE and option != OPT_EJECT: + raise ValueError("Unsupported option") + except ValueError as err: + sys.exit(err) + + if option == OPT_EJECT: + do_msc(media, 0, OPT_EJECT) + else: + try: + reserve = int(args.storage[1], 0) + except ValueError as err: + print("Wrong reserve size") + sys.exit(err) + do_msc(media, reserve) + elif args.version: + print('NuWriter ' + __version__) + print(__copyright__) + + +# Here goes the main function +if __name__ == "__main__": + #os.system("start cmd.exe") #Call do it. Will open cmd window in each process + main() diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_ddr_download_and_run.bat b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_ddr_download_and_run.bat new file mode 100644 index 0000000000..7eecc00fab --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_ddr_download_and_run.bat @@ -0,0 +1,8 @@ +:forever_develop +py -3 nuwriter.py -a ddrimg\enc_ddr3_winbond_256mb.bin +IF %ERRORLEVEL% EQU 0 ( + py -3 nuwriter.py -o execute -w ddr 0x80400000 ..\rtthread.bin +) +pause + +goto :forever_develop \ No newline at end of file diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_leave_ibr_download_and_run.bat b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_leave_ibr_download_and_run.bat new file mode 100644 index 0000000000..f60706d163 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_leave_ibr_download_and_run.bat @@ -0,0 +1,8 @@ +:forever_develop +py -3 nuwriter.py -a ddrimg\enc_ddr3_winbond_256mb.bin +IF %ERRORLEVEL% EQU 0 ( + py -3 nuwriter.py -o execute -w ddr 0x28000000 ..\preload\leave_ibr.bin +) +pause + +goto :forever_develop \ No newline at end of file diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_leave_ibr_sd_pack.bat b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_leave_ibr_sd_pack.bat new file mode 100644 index 0000000000..c1deb2296f --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_leave_ibr_sd_pack.bat @@ -0,0 +1,5 @@ +py -3 nuwriter.py -c header-sram-leave_ibr.json +IF %ERRORLEVEL% EQU 0 ( + py -3 nuwriter.py -p pack-sd-leave_ibr.json -o stuff +) +pause \ No newline at end of file diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_nand_programming.bat b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_nand_programming.bat new file mode 100644 index 0000000000..51fa333d3a --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_nand_programming.bat @@ -0,0 +1,7 @@ +py -3 nuwriter.py -c header-nand.json +py -3 nuwriter.py -p pack-nand.json + +py -3 nuwriter.py -a ddrimg\enc_ddr3_winbond_256mb.bin +IF %ERRORLEVEL% EQU 0 ( + py -3 nuwriter.py -w nand pack/pack.bin +) \ No newline at end of file diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_sd_programming.bat b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_sd_programming.bat new file mode 100644 index 0000000000..01f13e1b33 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_sd_programming.bat @@ -0,0 +1,8 @@ +py -3 nuwriter.py -c header-sd.json +py -3 nuwriter.py -p pack-sd.json + +py -3 nuwriter.py -a ddrimg\enc_ddr3_winbond_256mb.bin +IF %ERRORLEVEL% EQU 0 ( + py -3 nuwriter.py -w sd pack/pack.bin +) +PAUSE \ No newline at end of file diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_spinand_programming.bat b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_spinand_programming.bat new file mode 100644 index 0000000000..2325de7aef --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_spinand_programming.bat @@ -0,0 +1,7 @@ +py -3 nuwriter.py -c header-nand.json +py -3 nuwriter.py -p pack-nand.json + +py -3 nuwriter.py -a ddrimg\enc_ddr3_winbond_256mb.bin +IF %ERRORLEVEL% EQU 0 ( + py -3 nuwriter.py -w spinand pack/pack.bin +) \ No newline at end of file diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/pack-nand.json b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/pack-nand.json new file mode 100644 index 0000000000..12eae70b7e --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/pack-nand.json @@ -0,0 +1,21 @@ +{ + "image": + [ + { + "offset": "0x0", + "file": "conv/header.bin", + "type": 1 + }, + + { + "offset": "0x20000", + "file": "ddrimg/enc_ddr3_winbond_256mb.bin", + "type": 0 + }, + { + "offset": "0x80000", + "file": "../rtthread.bin", + "type": 1 + } + ] +} diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/pack-sd.json b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/pack-sd.json new file mode 100644 index 0000000000..2f256debc9 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/pack-sd.json @@ -0,0 +1,20 @@ +{ + "image": + [ + { + "offset": "0x400", + "file": "conv/header.bin", + "type": 0 + }, + { + "offset": "0x1000", + "file": "ddrimg/enc_ddr3_winbond_256mb.bin", + "type": 0 + }, + { + "offset": "0x4000", + "file": "../rtthread.bin", + "type": 0 + } + ] +} diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/xusbcom.py b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/xusbcom.py new file mode 100644 index 0000000000..da14584865 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/xusbcom.py @@ -0,0 +1,154 @@ +# NOTE: This script is test under Python 3.x + +__copyright__ = "Copyright (C) 2020~2021 Nuvoton Technology Corp. All rights reserved" + +import sys +import usb.core +import usb.util +import json +import typing + +XFER_LEN_CMD = 0x0012 +GET_INFO_CMD = 0x0005 + + +class XUsbCom: + + def __init__(self, _dev): + self.dev = _dev + self.write_addr = 0x1 + self.read_addr = 0x81 + self.attach = False + self.id = 0 + self.info = b'' + + def write(self, data) -> None: + try: + # Vendor command set transfer length + self.dev.ctrl_transfer(0x40, 0xA0, wValue=XFER_LEN_CMD, wIndex=len(data), data_or_wLength='') + # Actual data + self.dev.write(self.write_addr, data, timeout=1000) + except usb.core.USBError as err: + sys.exit(err) + + def read(self, size) -> bytes: + try: + buf = self.dev.read(self.read_addr, size, timeout=1000) + except usb.core.USBError as err: + sys.exit(err) + return buf + + def set_media(self, media) -> None: + try: + # Vendor command set type + self.dev.ctrl_transfer(0x40, 0xB0, wValue=media, wIndex=0, data_or_wLength='') + except usb.core.USBError as err: + sys.exit(err) + return + + def get_info(self, data) -> bytes: + try: + self.dev.ctrl_transfer(0x40, 0xB0, wValue=GET_INFO_CMD, wIndex=0, data_or_wLength='') + self.dev.ctrl_transfer(0x40, 0xA0, wValue=XFER_LEN_CMD, wIndex=76, data_or_wLength='') + self.dev.write(0x01, data, timeout=1000) + self.info = self.dev.read(0x81, 76, timeout=1000) + # not used + self.dev.read(0x81, 4, timeout=5000) + + except usb.core.USBError as err: + sys.exit(err) + return self.info + + def set_id(self, i) -> None: + self.id = i + + def get_id(self) -> int: + return self.id + + @staticmethod + def set_align(nand, spinand) -> None: + # See if we need to overwrite existing json file. + overwrite = False + try: + with open(".config", "r") as json_file: + cfg = json.load(json_file) + for key in cfg.keys(): + if key == 'nand_align': + if nand != int(cfg['nand_align']): + overwrite = True + elif key == 'spinand_align': + if spinand != int(cfg['spinand_align']): + overwrite = True + except (IOError, OSError, json.decoder.JSONDecodeError) as err: + overwrite = True + + if overwrite is True: + try: + with open(".config", "w+") as json_file: + new_key = {'nand_align': nand, 'spinand_align': spinand} + json.dump(new_key, json_file) + except (IOError, OSError) as err: + print("Write .config failed. Please re-attach") + sys.exit(err) + + @staticmethod + def get_align() -> typing.Tuple[int, int]: + try: + with open(".config", "r") as json_file: + cfg = json.load(json_file) + except (IOError, OSError, json.decoder.JSONDecodeError) as err: + print("Open/parsing .config failed. Please re-attach") + sys.exit(err) + nand_align = spinand_align = 0 + for key in cfg.keys(): + if key == 'nand_align': + nand_align = int(cfg['nand_align']) + elif key == 'spinand_align': + spinand_align = int(cfg['spinand_align']) + return nand_align, spinand_align + + +class XUsbComList: + + def __init__(self, attach_all=False): + vid = 0x0416 + pid = 0x5963 + try: + self.devices = list(usb.core.find(idVendor=vid, idProduct=pid, + find_all=True if attach_all is True else False)) + except TypeError: + # list will raise exception if there's no device + self.devices = [] + return + except usb.core.NoBackendError as err: + sys.exit(err) + + if len(self.devices) != 0 and attach_all is False: + # Object type return on attach_all == False is different + self.devices[0] = self.devices[0].device + + for dev in self.devices: + try: + dev.set_configuration() + except (usb.core.USBError, NotImplementedError) as err: + sys.exit(err) + + for i in range(0, len(self.devices)): + self.devices[i] = XUsbCom(self.devices[i]) + self.devices[i].set_id(i) + + def __del__(self): + if len(self.devices) != 0: + for dev in self.devices: + try: + usb.util.dispose_resources(dev.dev) + # dev.dev.reset() + dev = None + #except (usb.core.USBError, NotImplementedError) as err: + except usb.core.USBError as err: + sys.exit(err) + + self.devices = None + + def get_dev(self): + return self.devices diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/preload/Makefile b/bsp/nuvoton/numaker-hmi-ma35d1/preload/Makefile new file mode 100644 index 0000000000..3a2124ab09 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/preload/Makefile @@ -0,0 +1,68 @@ +TARGET ?= preload + +################################# +# GNU ARM Embedded Toolchain +################################# +CC=aarch64-elf-gcc +CXX=aarch64-elf-g++ +LD=aarch64-elf-ld +AR=aarch64-elf-ar +AS=aarch64-elf-as +CP=aarch64-elf-objcopy +OD=aarch64-elf-objdump +NM=aarch64-elf-nm +SIZE=aarch64-elf-size +A2L=aarch64-elf-addr2line + +################################# +# Working directories +################################# +ROOT = . + +################################# +# Source Files +################################# + +# Search path and source files + +ASMSOURCES = $(notdir $(wildcard *.ASM)) + +INCLUDE_DIRS = -I$(ROOT) + +################################# +# Object List +################################# +OBJECTS= + +################################# +# Target Output Files +################################# +TARGET_O=$(TARGET).o +TARGET_ASM=$(TARGET).asm + +################################# +# Flags +################################# +MCFLAGS=-march=armv8-a +OPTIMIZE = -O2 +AFLAGS=-c $(MCFLAGS) -x assembler-with-cpp -D__ASSEMBLY__ +LDSCRIPT= +LDFLAGS = -nostartfiles -Wl,--gc-sections,-cref,-Map=$(TARGET).map,-cref,-u,_start -T $(TARGET).ld + +################################# +# Build +################################# +all: clean $(TARGET_O) + +$(TARGET_O): + @echo -n "Build $@ ..." + $(CC) -c $(INCLUDE_DIRS) $(AFLAGS) $(ASMSOURCES) $(LDFLAGS) + $(OD) -d $@ > $(TARGET).txt + +################################# +# Recipes +################################# +.PHONY: all clean + +clean: + rm -f $(TARGET_O) \ No newline at end of file diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/preload/Makefile.leave_ibr b/bsp/nuvoton/numaker-hmi-ma35d1/preload/Makefile.leave_ibr new file mode 100644 index 0000000000..d0e949ca1c --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/preload/Makefile.leave_ibr @@ -0,0 +1,69 @@ +TARGET ?= leave_ibr + +################################# +# GNU ARM Embedded Toolchain +################################# +CC=aarch64-elf-gcc +CXX=aarch64-elf-g++ +LD=aarch64-elf-ld +AR=aarch64-elf-ar +AS=aarch64-elf-as +CP=aarch64-elf-objcopy +OD=aarch64-elf-objdump +NM=aarch64-elf-nm +SIZE=aarch64-elf-size +A2L=aarch64-elf-addr2line + +################################# +# Working directories +################################# +ROOT = . + +################################# +# Source Files +################################# + +# Search path and source files for the ST stdperiph library + +ASMSOURCES = $(notdir $(wildcard *.ASM)) + +INCLUDE_DIRS = -I$(ROOT) + +################################# +# Object List +################################# +OBJECTS= + +################################# +# Target Output Files +################################# +TARGET_O=$(TARGET).o +TARGET_ASM=$(TARGET).asm + +################################# +# Flags +################################# +MCFLAGS=-march=armv8-a +OPTIMIZE = -O2 +AFLAGS=-c $(MCFLAGS) -x assembler-with-cpp -D__ASSEMBLY__ +LDSCRIPT= +LDFLAGS = -nostartfiles -Wl,--gc-sections,-cref,-Map=$(TARGET).map,-cref,-u,_start -T $(TARGET).ld + +################################# +# Build +################################# +all: clean $(TARGET_O) + +$(TARGET_O): + @echo -n "Build $@ ..." + $(CC) -c $(INCLUDE_DIRS) $(AFLAGS) $(ASMSOURCES) $(LDFLAGS) + $(OD) -d $@ > $(TARGET).txt + $(CP) -O binary $(TARGET_O) ../nuwriter_scripts/$(TARGET).bin + +################################# +# Recipes +################################# +.PHONY: all clean + +clean: + rm -f $(TARGET_O) \ No newline at end of file diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/preload/SConscript b/bsp/nuvoton/numaker-hmi-ma35d1/preload/SConscript new file mode 100644 index 0000000000..73123b415f --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/preload/SConscript @@ -0,0 +1,14 @@ +# RT-Thread building script for component + +from building import * + + +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') + Glob('*.S') +CPPPATH = [ cwd ] + +group = DefineGroup('board', src, depend = [''], CPPPATH = CPPPATH) +Return('group') diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/preload/entry_point.S b/bsp/nuvoton/numaker-hmi-ma35d1/preload/entry_point.S new file mode 100644 index 0000000000..210a262d4a --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/preload/entry_point.S @@ -0,0 +1,109 @@ +.section ".text.entrypoint" +.globl system_vectors + +ma35d1_start: + .word 0x10000014 + .word 0x9100029f + .word 0xd539f220 + .word 0xb27a0000 + .word 0xd519f220 + .word 0xd53800a1 + .word 0x92400421 + .word 0xb4000141 + .word 0xd503205f + .word 0xd2800900 + .word 0xf2a808c0 + .word 0xf9400001 + .word 0xf100003f + .word 0x54ffff60 + .word 0x91001000 + .word 0xb9000001 + .word 0x14000012 + .word 0xd2800980 + .word 0xf2a808c0 + .word 0xaa1f03e1 + .word 0xb9000001 + .word 0xd282000a + .word 0xd100054a + .word 0xf100015f + .word 0x54000140 + .word 0xd2800900 + .word 0xf2a808c0 + .word 0xaa1403e1 + .word 0xb9000001 + .word 0xd503209f + .word 0x91001000 + .word 0xb9400002 + .word 0xeb02003f + .word 0x54fffea1 + .word 0xd2836000 + .word 0xf2a016e0 + .word 0xd51be000 + .word 0xd2820000 + .word 0xf2aa1000 + .word 0x52800069 + .word 0xb9000009 + .word 0xb9400409 + .word 0x1200112a + .word 0x340001aa + .word 0x9102000b + .word 0x52800009 + .word 0xb8004569 + .word 0xb8004569 + .word 0x5100054a + .word 0x35ffffca + .word 0xd2840001 + .word 0xf2aa1001 + .word 0x52800060 + .word 0xb9000020 + .word 0x52801000 + .word 0xb9000420 + .word 0xd2820000 + .word 0xf2aa1000 + .word 0xd2840001 + .word 0xf2aa1001 + .word 0x52800009 + .word 0xb9008009 + .word 0x52800029 + .word 0xb9010009 + .word 0x52803ce9 + .word 0xb9000029 + .word 0x52801009 + .word 0xb9000429 + .word 0xd2a00600 + .word 0xd5181040 + .word 0xaa1f03e0 + .word 0xb2630000 + .word 0xb2640000 + .word 0xb2690000 + .word 0xb26a0000 + .word 0xb26c0000 + .word 0xb2750000 + .word 0xd5181000 + .word 0xaa1f03e0 + .word 0xb2770000 + .word 0xb2780000 + .word 0xb2790000 + .word 0xb27b0000 + .word 0xb27c0000 + .word 0xd51e1100 + .word 0xaa1f03e0 + .word 0xd2800060 + .word 0xb2780000 + .word 0xb2790000 + .word 0xb27a0000 + .word 0xb27c0000 + .word 0xd51e4000 + .word 0x10000060 + .word 0xd51e4020 + .word 0xd69f03e0 + +.L__aarch32_code: + + nop + nop + nop + nop + ldr r0, =ma35d1_start + mov sp, r0 + ldr pc, =system_vectors diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/preload/env_build.bat b/bsp/nuvoton/numaker-hmi-ma35d1/preload/env_build.bat new file mode 100644 index 0000000000..ad8f1ad7b9 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/preload/env_build.bat @@ -0,0 +1,9 @@ +@set RTT_CC=gcc +@set RTT_EXEC_PATH=C:\Program Files (x86)\GNU Tools ARM Embedded\8 2019-q3-aarch64-elf\bin +@set RTT_CC_PREFIX=aarch64-elf- +@set PATH=%RTT_EXEC_PATH%;%ENV_ROOT%\tools\gnu_gcc\arm_gcc\mingw\bin;%PATH% + +make +python transcode.py + +make -f Makefile.leave_ibr diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/preload/leave_ibr.ASM b/bsp/nuvoton/numaker-hmi-ma35d1/preload/leave_ibr.ASM new file mode 100644 index 0000000000..91571076a7 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/preload/leave_ibr.ASM @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Date Author Notes + * 2021-06-29 Wayne the first version + * + * Description: Load the routine into SRAM0 0x28000000 + * + */ + +.section ".text.boot" +.global _start + +_start: + /* Give execution address for secondary CPU */ + adr x20, . + + /*=============================================================*/ + /* Read CPU id */ + /* Primary core(id=0): Help Secondary core leaving. */ + /* Secondary core(id>0): Notice 'Ready' to Primary core. */ + /*=============================================================*/ + /* MPIDR_EL1: Multi-Processor Affinity Register */ + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, .L__cpu_0_loop + +.L__cpu_1_loop: + /*=============================================================*/ + /* Secondary CPU notification */ + /*=============================================================*/ + wfe /* Wait for Primary CPU's notification */ + + mov x0, #0x48 /* if (*(0x40460048)==PC) */ + movk x0, #0x4046, LSL #16 /* goto L__cpu_1_loop */ + ldr x1, [x0] /* else */ + cmp x1, x20 /* goto *(0x40460048) */ + b.eq .L__cpu_1_loop + br x1 + +.L__cpu_0_loop: + /*=============================================================*/ + /* Help CPU-1 to leave IBR. */ + /*=============================================================*/ + mov x0, #0x48 /* *(0x40460048) = _start */ + movk x0, #0x4046, LSL #16 + mov x1, x20 + str w1, [x0] + sev /* Wakeup Secondary CPU */ + b .L__cpu_0_loop + diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/preload/preload.ASM b/bsp/nuvoton/numaker-hmi-ma35d1/preload/preload.ASM new file mode 100644 index 0000000000..59acab7d19 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/preload/preload.ASM @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Date Author Notes + * 2021-06-29 Wayne the first version + */ + +/* GICv2 - Distributor Registers */ +#define GICD_CTLR 0x0000 +#define GICD_TYPER 0x0004 +#define GICD_IIDR 0x0008 +#define GICD_STATUSR 0x0010 +#define GICD_SETSPI_NSR 0x0040 +#define GICD_CLRSPI_NSR 0x0048 +#define GICD_SETSPI_SR 0x0050 +#define GICD_CLRSPI_SR 0x0058 +#define GICD_SEIR 0x0068 +#define GICD_IGROUPRn 0x0080 +#define GICD_ISENABLERn 0x0100 +#define GICD_ICENABLERn 0x0180 +#define GICD_ISPENDRn 0x0200 +#define GICD_ICPENDRn 0x0280 +#define GICD_ISACTIVERn 0x0300 +#define GICD_ICACTIVERn 0x0380 +#define GICD_IPRIORITYRn 0x0400 +#define GICD_ITARGETSRn 0x0800 +#define GICD_ICFGR 0x0c00 +#define GICD_IGROUPMODRn 0x0d00 +#define GICD_NSACRn 0x0e00 +#define GICD_SGIR 0x0f00 +#define GICD_CPENDSGIRn 0x0f10 +#define GICD_SPENDSGIRn 0x0f20 +#define GICD_IROUTERn 0x6000 + +/* GICv2 - CPU Interface Memory Mapped Registers */ +#define GICC_CTLR 0x0000 +#define GICC_PMR 0x0004 +#define GICC_BPR 0x0008 +#define GICC_IAR 0x000C +#define GICC_EOIR 0x0010 +#define GICC_RPR 0x0014 +#define GICC_HPPIR 0x0018 +#define GICC_ABPR 0x001c +#define GICC_AIAR 0x0020 +#define GICC_AEOIR 0x0024 +#define GICC_AHPPIR 0x0028 +#define GICC_APRn 0x00d0 +#define GICC_NSAPRn 0x00e0 +#define GICC_IIDR 0x00fc +#define GICC_DIR 0x1000 + +.section ".text.entrypoint" +.global _start + +_start: + /* Give execution address for secondary CPU */ + adr x20, . + mov sp, x20 + + /*=============================================================*/ + /* Enable the SMP bit. */ + /*=============================================================*/ + mrs x0, S3_1_C15_C2_1 + orr x0, x0, #(1<<6) + msr S3_1_C15_C2_1, x0 + + /*=============================================================*/ + /* Read CPU id */ + /* Primary core(id=0): Help Secondary core leaving. */ + /* Secondary core(id>0): Notice 'Ready' to Primary core. */ + /*=============================================================*/ + /* MPIDR_EL1: Multi-Processor Affinity Register */ + mrs x1, mpidr_el1 + and x1, x1, #3 + cbz x1, .L__cpu_0 + +.L__current_cpu_idle: + /*=============================================================*/ + /* Secondary CPU notification */ + /*=============================================================*/ + wfe /* Wait for Primary CPU's notification */ + + mov x0, #0x48 /* if (*(0x40460048)==0) */ + movk x0, #0x4046, LSL #16 /* goto L__current_cpu_idle */ + ldr x1, [x0] /* else */ + cmp x1, #0 /* *(0x4046004C)=_start */ + b.eq .L__current_cpu_idle /* goto L__cpus_trans_state */ + add x0, x0, #4 + str w1, [x0] + + b .L__cpus_trans_state + +.L__cpu_0: + + // *(0x4046004C) = 0 + mov x0, #0x4C + movk x0, #0x4046, LSL #16 + mov x1, xzr + str w1, [x0] + + mov x10, #0x1000 /* 4096 times looping */ +.L__cpu_0_loop: + sub x10, x10, #0x1 + cmp x10, #0 + b.eq .L__cpus_trans_state + /*=============================================================*/ + /* Help CPU-1 to leave IBR. */ + /*=============================================================*/ + mov x0, #0x48 /* *(0x40460048) = _start */ + movk x0, #0x4046, LSL #16 + mov x1, x20 + str w1, [x0] + + sev /* Wakeup Secondary CPU */ + + add x0, x0, #4 /* if(*(0x4046004C)!=_start) */ + ldr w2, [x0] /* goto L__cpu_0_loop */ + cmp x1, x2 + bne .L__cpu_0_loop + +.L__cpus_trans_state: + + /*=============================================================*/ + /* Initialize Gtimer. Set frequency to 12MHz. */ + /*=============================================================*/ + mov x0, #0x1B00 + movk x0, #0xB7, LSL #16 + msr CNTFRQ_EL0, x0 + + /*=============================================================*/ + /* Enable GICv2. */ + /* Assign all IRQs to secure group. */ + /*=============================================================*/ + /* Route to secure Group */ + mov x0, #0x1000 + movk x0, #0x5080, LSL #16 + mov w9, #0x3 + str w9, [x0, GICD_CTLR] + ldr w9, [x0, GICD_TYPER] + and w10, w9, #0x1f + cbz w10, 1f + add x11, x0, GICD_IGROUPRn + mov w9, #0 + str w9, [x11], #0x04 +0: str w9, [x11], #0x04 + sub w10, w10, #0x1 + cbnz w10, 0b + + mov x1, #0x2000 + movk x1, #0x5080, LSL #16 + mov w0, #3 + str w0, [x1] + + mov w0, #1 << 7 + str w0, [x1, #4] +1: + mov x0, #0x1000 + movk x0, #0x5080, LSL #16 + mov x1, #0x2000 + movk x1, #0x5080, LSL #16 + + mov w9, #0 + str w9, [x0, GICD_IGROUPRn] + mov w9, #0x1 + str w9, [x0, GICD_ISENABLERn] + + mov w9, #0x1e7 + str w9, [x1, GICC_CTLR] + + mov w9, #0x1 << 7 + str w9, [x1, GICC_PMR] + + /*=============================================================*/ + /* Enable FP/SIMD at EL1 */ + /*=============================================================*/ + mov x0, #(3 << 20) + msr cpacr_el1, x0 /* Enable FP/SIMD at EL1 */ + + /*=============================================================*/ + /* Initialize sctlr_el1 */ + /*=============================================================*/ + mov x0, xzr + orr x0, x0, #(1 << 29) /* Enable LSMAOE at EL1 */ + orr x0, x0, #(1 << 28) /* Enable nTLSMD at EL1 */ + orr x0, x0, #(1 << 23) /* Enable SPAN at EL1 */ + orr x0, x0, #(1 << 22) /* Enable EIS at EL1 */ + orr x0, x0, #(1 << 20) /* Enable TSCXT at EL1 */ + orr x0, x0, #(1 << 11) /* Enable EOS at EL1 */ + msr sctlr_el1, x0 + + /*=============================================================*/ + /* Initialize scr_el3 */ + /*=============================================================*/ + mov x0, xzr + /* RW, Lower levels are all AArch32. */ + orr x0, x0, #(1 << 9) /* Enable SIF */ + orr x0, x0, #(1 << 8) /* Enable HCE */ + orr x0, x0, #(1 << 7) /* Enable SMD */ + orr x0, x0, #(1 << 5) /* RES1[5:4] */ + orr x0, x0, #(1 << 4) + /* Disable FIQ routing */ + /* Disable IRQ routing */ + /* Disable NS */ + msr scr_el3, x0 + + /*=============================================================*/ + /* Initialize spsr_el3 */ + /*=============================================================*/ + mov x0, xzr + mov x0, #0b00011 /* AARCH32_SVC */ + orr x0, x0, #(1 << 8) /* Enable SError and External Abort. */ + orr x0, x0, #(1 << 7) /* IRQ interrupt Process state mask. */ + orr x0, x0, #(1 << 6) /* FIQ interrupt Process state mask. */ + orr x0, x0, #(1 << 4) /* FIQ interrupt Process state mask. */ + msr spsr_el3, x0 + + /*=============================================================*/ + /* Initialize elr_el3 */ + /* Jump to Secure AARCH32_SVC from EL3. */ + /*=============================================================*/ + adr x0, .aarch32_code /* Exception return to aarch32_code */ + msr elr_el3, x0 + eret + +.aarch32_code: + diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/preload/preload.ld b/bsp/nuvoton/numaker-hmi-ma35d1/preload/preload.ld new file mode 100644 index 0000000000..bfe4705d25 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/preload/preload.ld @@ -0,0 +1,113 @@ +SECTIONS +{ + . = 0x80400000; + . = ALIGN(4096); + .text : + { + KEEP(*(.text.entrypoint)) /* The entry point */ + *(.vectors) + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + *(COMMON) + + _etext = .; + } + + . = ALIGN(16); + .eh_frame_hdr : + { + *(.eh_frame_hdr) + *(.eh_frame_entry) + } + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } + + . = ALIGN(16); + .data : + { + *(.data) + *(.data.*) + + *(.data1) + *(.data1.*) + + . = ALIGN(16); + _gp = ABSOLUTE(.); /* Base of small data */ + + *(.sdata) + *(.sdata.*) + } + + . = ALIGN(16); + .ctors : + { + PROVIDE(__ctors_start__ = .); + KEEP(*(SORT(.ctors.*))) + KEEP(*(.ctors)) + PROVIDE(__ctors_end__ = .); + } + + .dtors : + { + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + } + + . = ALIGN(16); + .nobss : { *(.nobss) } + + . = ALIGN(16); + __bss_start__ = .; + __bss_start = .; + .bss : { *(.bss)} + . = ALIGN(16); + __bss_end = .; + __bss_end__ = .; + . = ALIGN(16); + + /* 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) } + + _end = .; +} + +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/preload/transcode.py b/bsp/nuvoton/numaker-hmi-ma35d1/preload/transcode.py new file mode 100644 index 0000000000..a918f45245 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/preload/transcode.py @@ -0,0 +1,41 @@ +# -*- coding: UTF-8 -*- + +import os + +def extract_line(fname, pattern): + with open(fname, "r") as f: + lines = f.readlines() + f.close() + with open("entry_point.S", "w") as f: + counter=0 + f.write(".section \".text.entrypoint\"\n") + f.write(".globl system_vectors\n") + f.write("\n") + f.write("ma35d1_start:\n") + for line in lines: + if pattern in line: + new_line = " .word 0x" + line[6:14] + "\n" + f.write(new_line) + counter = counter+1 + f.write("\n") + f.write(".L__aarch32_code:\n") + f.write("\n") + # Append NOP to align vector table. + counter = (counter+5)*4 + counter_align = (counter+32-1) & ~(32-1) + nop_num = (counter_align - counter) / 4 + print hex(counter), hex(counter_align), nop_num + j = 0 + while j < nop_num: + f.write(" nop\n") + j += 1 + f.write(" ldr r0, =ma35d1_start\n") + f.write(" mov sp, r0\n") + f.write(" ldr pc, =system_vectors\n") + f.close() + +def formatfiles(): + extract_line("preload.txt", ":\t") + +if __name__ == '__main__': + formatfiles() diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/rtconfig.py b/bsp/nuvoton/numaker-hmi-ma35d1/rtconfig.py new file mode 100644 index 0000000000..5d1b514111 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/rtconfig.py @@ -0,0 +1,77 @@ +import os +# toolchains options +ARCH = 'arm' +CPU = 'cortex-a' +# toolchains options +CROSS_TOOL = 'gcc' + +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:\Program Files (x86)\GNU Tools ARM Embedded\6 2017-q1-update\bin' +elif os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +#BUILD = 'debug' +BUILD = '' +MAP_FILE = 'rtthread_ma35d1.map' +LINK_FILE = 'linking_scripts/aarch32' +TARGET_NAME = 'rtthread.bin' + +#------- GCC settings ---------------------------------------------------------- +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' + STRIP = PREFIX + 'strip' + + DEVICE = ' -march=armv8-a -mfpu=neon-vfpv4 -ftree-vectorize -ffast-math -mfloat-abi=softfp' +# DEVICE = ' -march=armv7-a -mfpu=vfpv3-d16 -ftree-vectorize -ffast-math -mfloat-abi=softfp' + CFLAGS = DEVICE + ' -Wall -fno-zero-initialized-in-bss ' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__ASSEMBLY__' + LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-cref,-Map=' + MAP_FILE + ',-cref,-u,system_vectors' + ' -T ' + LINK_FILE + '.ld' + CXXFLAGS = ' -march=armv8-a -mfpu=neon-vfpv4 -std=c++11 ' + + M_CFLAGS = CFLAGS + ' -mlong-calls -fPIC ' + M_CXXFLAGS = CXXFLAGS + ' -mlong-calls -fPIC' + M_LFLAGS = DEVICE + CXXFLAGS + ' -Wl,--gc-sections,-z,max-page-size=0x4' +\ + ' -shared -fPIC -nostartfiles -nostdlib -static-libgcc' + M_POST_ACTION = STRIP + ' -R .hash $TARGET\n' + SIZE + ' $TARGET \n' + #M_BIN_PATH = r'z:\fatdisk\root' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET ' + TARGET_NAME + '\n' + POST_ACTION += SIZE + ' $TARGET\n' + + +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/nuvoton/numaker-iot-m467/.config b/bsp/nuvoton/numaker-iot-m467/.config index b23d434f74..46b064294d 100644 --- a/bsp/nuvoton/numaker-iot-m467/.config +++ b/bsp/nuvoton/numaker-iot-m467/.config @@ -798,7 +798,7 @@ CONFIG_PKG_USING_MPU6XXX_LATEST_VERSION=y CONFIG_PKG_MPU6XXX_VER="latest" CONFIG_PKG_USING_MPU6XXX_ACCE=y CONFIG_PKG_USING_MPU6XXX_GYRO=y -# CONFIG_PKG_USING_MPU6XXX_MAG is not set +CONFIG_PKG_USING_MPU6XXX_MAG=y # CONFIG_PKG_USING_AHT10 is not set # CONFIG_PKG_USING_AP3216C is not set # CONFIG_PKG_USING_TSL4531 is not set @@ -1152,7 +1152,6 @@ CONFIG_BOARD_USING_HSUSBH_USBD=y # # Board extended module drivers # -# CONFIG_BOARD_USING_LCD_ILI9341 is not set # # Nuvoton Packages Config @@ -1172,3 +1171,5 @@ CONFIG_NU_PKG_USING_NCT7717U=y # CONFIG_NU_PKG_USING_TPC is not set # CONFIG_NU_PKG_USING_ADC_TOUCH is not set # CONFIG_NU_PKG_USING_SPINAND is not set +CONFIG_UTEST_CMD_PREFIX="bsp.nuvoton.utest." +CONFIG_BOARD_USE_UTEST=y diff --git a/bsp/nuvoton/numaker-iot-m467/applications/mnt.c b/bsp/nuvoton/numaker-iot-m467/applications/mnt.c index dd8a5cb210..ebea69fdc7 100644 --- a/bsp/nuvoton/numaker-iot-m467/applications/mnt.c +++ b/bsp/nuvoton/numaker-iot-m467/applications/mnt.c @@ -30,11 +30,6 @@ #include #endif -#if defined(BOARD_USING_STORAGE_SPIFLASH) - #define PARTITION_NAME_FILESYSTEM "filesystem" - #define MOUNT_POINT_SPIFLASH0 "/" -#endif - #ifdef RT_USING_DFS_MNTTABLE /* @@ -57,8 +52,11 @@ const struct dfs_mount_tbl mount_table[] = }; #endif +#if defined(BOARD_USING_STORAGE_SPIFLASH) + #define PARTITION_NAME_FILESYSTEM "filesystem" + #define MOUNT_POINT_SPIFLASH0 "/" + /* Recursive mkdir */ -#if defined(RT_USBH_MSTORAGE) && defined(UDISK_MOUNTPOINT) static int mkdir_p(const char *dir, const mode_t mode) { int ret = -1; @@ -127,9 +125,7 @@ exit_mkdir_p: return ret; } -#endif -#if defined(BOARD_USING_STORAGE_SPIFLASH) int mnt_init_spiflash0(void) { #if defined(RT_USING_FAL) @@ -156,13 +152,8 @@ int mnt_init_spiflash0(void) mkdir_p("/mnt/sd1", 0x777); mkdir_p("/mnt/sd1p0", 0x777); mkdir_p("/mnt/sd1p1", 0x777); + mkdir_p(UDISK_MOUNTPOINT, 0x777); -#if defined(RT_USBH_MSTORAGE) && defined(UDISK_MOUNTPOINT) - if (mkdir_p(UDISK_MOUNTPOINT, 0) < 0) - { - rt_kprintf("Failed to create directory on %s for RT_USBH_MSTORAGE.\n", UDISK_MOUNTPOINT); - } -#endif exit_mnt_init_spiflash0: return 0; diff --git a/bsp/nuvoton/numaker-m032ki/.config b/bsp/nuvoton/numaker-m032ki/.config index 6f62b8ecd0..6ff71a489c 100644 --- a/bsp/nuvoton/numaker-m032ki/.config +++ b/bsp/nuvoton/numaker-m032ki/.config @@ -796,3 +796,5 @@ CONFIG_NU_PKG_USING_DEMO=y # CONFIG_NU_PKG_USING_TPC is not set # CONFIG_NU_PKG_USING_ADC_TOUCH is not set # CONFIG_NU_PKG_USING_SPINAND is not set +CONFIG_UTEST_CMD_PREFIX="bsp.nuvoton.utest." +CONFIG_BOARD_USE_UTEST=y diff --git a/bsp/nuvoton/numaker-m467hj/.config b/bsp/nuvoton/numaker-m467hj/.config index 50c9c014f9..aae4c090b7 100644 --- a/bsp/nuvoton/numaker-m467hj/.config +++ b/bsp/nuvoton/numaker-m467hj/.config @@ -1086,3 +1086,5 @@ CONFIG_NU_PKG_USING_NAU8822=y # CONFIG_NU_PKG_USING_TPC is not set # CONFIG_NU_PKG_USING_ADC_TOUCH is not set # CONFIG_NU_PKG_USING_SPINAND is not set +CONFIG_UTEST_CMD_PREFIX="bsp.nuvoton.utest." +CONFIG_BOARD_USE_UTEST=y diff --git a/bsp/nuvoton/numaker-m467hj/board/board_dev.c b/bsp/nuvoton/numaker-m467hj/board/board_dev.c index 16e6ac85fc..e1399a6cbf 100644 --- a/bsp/nuvoton/numaker-m467hj/board/board_dev.c +++ b/bsp/nuvoton/numaker-m467hj/board/board_dev.c @@ -332,7 +332,7 @@ ccap_sensor_io sIo_sensor0 = int rt_hw_sensor0_port(void) { - return nu_ccap_sensor_create(&sIo_sensor0, (ccap_sensor_id)BOARD_USING_SENSON0_ID); + return nu_ccap_sensor_create(&sIo_sensor0, (ccap_sensor_id)BOARD_USING_SENSON0_ID, "sensor0"); } INIT_COMPONENT_EXPORT(rt_hw_sensor0_port);

    = zeH@C>pXBI@N3JGvA+&m>B}rKg`DDc-RUcuL55-o`2>6zCq<0KnHi@R6>UZTPN>v<& z?YCv5--dVQ(VtPgWR8q&qap3l>YpEbFJi`>b34|dT%OO$cENsd!}x?tJZI@8Y@w&m z653r{%kALMZObACQgzf^olcO9Z#~IfE^fqwcwIt8cjI5qFwzHW+BCM)UnOK7Fb!7E z{tU>uIEV0nSMw38Tty%@15!;_ZKIZGUE8Ui$n&^NoC{xQ4!7ZJgX^zv`N{ zX)KhFaQ<7yfpOzu1N$=!oRwSt5+?g zM|`J`r#4PldM1G9Blh~MjoD@WUH77XC;XrHO}1$sA4iwGs}Y39e$i_&(+{B+4;e_0 z=Dus@5hamGC!>*%%?KUR6DtYwu|b68KECDsUMX}0Yp-%oo$pUw))lpc=h7YlbHs z!EE@K&O{A~elHN2FPmjK2!~jx&-YjSkEqYRVul7JgPX~kkJ-r& zGeB9<%k5^=ZDsXs#>@U(4G;_G?x1Gu$S?m)uTw$)yVy=8Pf0Fe#PnCaX zl=QlMA@S5H=Cd%8knEDw>4qEmi1^9R)Q?3Ai3%cyGBmFByL~?X$tdk)IL9Q5buQ3r zH~heuC_4Xkpx2*7XE2U|5J*QI_3qh>0M zzh1Z`Z=fMKTMy{{`gplLavlFuDCEuL)xt^ui2zM8_X>s^bqHB05=8{d;Ohq##{!>P3{$5uZV=A{e70wk zGz@J$Zj_pj1c`(=>7ZVQp$DR&X4!Kie&~D4JL(|f z#6mSS`@nxNO7n%!RO6^Kw4tIZ;~eMzV3eTA6ALjQCr3p|-oED12onXfDob^VE_4JY zPB3>huFTid5vPgFsdTt?I4i3td@)Mv`5R;6;iDOUrdVIr9XJnLomJ~J)DD|84E!E1 z05nEb=dDYEK6VABzs#DoEOHLv*lrW)rg)5Ubfl~Pmf9g|JM=(u=q4pMv36Mt@in(7 z$C1kE{@f1!t7lcgx4d!S{ku{pW;CkB!0+?WRb(M@ewiacs1Qrfq=k*PHOvW;(>R>6 z7?rpQ1c8Av1P_yeSAGiJdOa$5US2vvL7eLlN2}{pAq>x3*(}YXc(qsB&Pl5%!{(^X zBBuga!79pvmlZ#Pf-Dy&Qnb7fJt=Ae+)#N)WedFtV?;d+?ox=vF})u!_83g#wtc~XUg<58T~amaBmL#PJ> z!@FQKPq)))g5lblho8VMuS3PYXhF;`jR%J>m?f9kQ>yeFxvCW*Ys zW%H-T#-N^t#)n%^sA@)MP(I03$+u8=sfh!RQ2y6?Y87{qF$9||y19CVmYu@2B!2H( zwPOC(yULPtcTY7LzYY(E#U=Wik&+%?zljn=)Ct7s>AR3HpGDtZy;kUr{k zgvMY#hS5?fB_UHp{KOZdWXVC3JQv9-{7nIYIfZRlI@lt}1b??^sLr*D&uP$vFz=BV z(MKW14}vUYm~)g?dr%0|X0e@HR8l;iDK;kPz{M7;5JK6EtWgSn8qfRB2zbks}>X_YI;Ybi=z z-t`-l(X!k_Ym?%OQ4&5>6l5l2Lta*jPfjGoD$0~nYySgHrz!ymwvv_UCj?b%q^duV z7y3b?l3jgQ(6mNz!&=g$%cT&+Cq}~%H8f?+W?S+oZLJ!bR=J#OqYXNltJ)MHRh~U; zw2B4`(ZanX;l{?Men|AS+ef__?9b11Qn|;4!&;KFa`9+e8-3RlAp2)-g3+1Qgx6Vm zRV12fO(?<6*U(RAG>isrWX0&Xrxh~GNK2{<^o~qU1*3CV1oA-pntU+|lc_==*Y{a;&abU}B zsa}MCZlq>MPEXsGhm2gRyw)$BqT5#>8DMw0rGU1-JBOH~hq|4&!Vs1KZSW4>W9pko zxO4H@w7-9(m2~d74wfn;Irx7<%Gr0{RTjjZE4MYNgL0&L!}1VoW{B)S8Z-1`B^sy` zbQ<}OH8E|yk%yo+sMI;F4Dy(kYsBChL;harq33ms+*IoWj&9Hn4IS=Wvsx13=U5V3 zZ%obU)0&Xv!0`o4VZRTv?801fsEl{gh^WjD%wevMv)tpGv)v8VIkx3!K(QpNtgVUa z*}3Z%+omq^*75H>Sy^P`Esb`XbHkU%McJbG-omqRf?qX;bg~ei^PUJYSq*i{Kt89OieWx;n2Q2IaNUKR*8AC+Td~Px@l}A9M6=YxZ5WcMuFD2e>G!= zXNTR&wI_G#TP131gB+WO_^2AKTZh-*rkX~&uE>FG>#Jqv6y2Q32W{20TTzZbX;!-& z`tei9ANXB98Fgv1^54?)kAC*w2mB~8w>3F2W%pdPsWKgy>7q7k?Po)hpEB+2Al!Bz ztpdA?i&-U$!|)h?6E5D>VrdY^zxxqoS&a6=(_mq)nxxk4+o;lthLYa65xyWMrw0v?ZZ^N|VX&_Xq+ zfQN{dcI&m?gS8`;s!m_mq0{i<1W?A~4;Ii|bIsW?d^w^AiWz$zUfku>EC%hHQw86* zBbV|9*xrU|f~WW#pBtsmWS||-69(|R9#=A*PN>fF%*@R%XyiSV?C!FAn=YG7WS^@Z z4~Y~F#5?JGbvE)wcNtjgXshhCE6(Ar!z* ztN8{mxRSoKb}kzh47^^b%y2&E64r)Bh>eabV}4MVUWCMsGOq-du?|iiL5y2LL^7ew zvfdeCHuwihx&&_TyAHG1OFQ4AR=6A zVMbFCex08EdGrEU8div|IWJ;V{4ZsEfUmL}&#UfGhY#wY8D)P!IEZ6WrdVX5t5tgN zl4X!46AQ#yU~69(I)KC8OO!n^SubNSpo|8KWKi}%q)4ip3XdN|d*D~z;Lhy8)Ogh% z+R*cUB3pi~)7&=#ZLDh$fkA3=Y??am2{3R2yn{eE%=;FJi!^!!Sr3E#$GUDwG z=@}V#dGi26{ObMjxKwZgI?{H_FVW1T)M1itN~PC?mwHA-;s-*v;d=Vd%6hXz<}e}N zsC;?@(~;v2HYM$EwSn=Oz&;Us(a2leG9y|}^$7_dT`Iea4rv=9iPy&Z{rVt$K{jD= zO9-K^jOv-b!RSKCVA)P_Sit9RZjN{kIFlNe$)Ui9(U?r$sy2qb+m;WS2J61ILsZGx zfH6{L{**+%jd`rAKG6nYMhVkgWmd)<2;RRFsr&8Z2mZem8(V+thypt}I8~+NeoNoK zH2bt+iUYzWdC5gsS}GUD3oepfiN|Zex@#H*PFZA{@S?LCIZ)4}{P!uSc~hRLa%Myj z2qP!-O-P3;CbWZE?JM%uD`d!7#C92FF$%|fRa^O3QYUr_uo7jpoD;Q8ho=EJlasQ_ z=cLvLm1wK=HbFx`+i#@>w9V4sQ?vL@c0nVvPGwF(y>;k>tf1}jK~qJfGA*Yi>kE=K z9g>wglgk%!as`p|%p-Sr^_i98d$0JvJJEV&r!BnLme8^>d8ag7=tT1RQH7?@BOCM1 znXmBW=hh@+zjNLt4r6NZ#@i~yQ1kMoHQ&zmDBLroYm5EeXk*ytWt|YK>FCUWpqV@G ztbdqEJRdAVn-HJmcRe52)KP4g5e_t+G-+cjg&1sDQ@m`DuB=pyYN&H>5MBNubLiaf zvOkHs*(!%H_g6`#R(66ZlNIZ*O)gEuv~K9NU3yPNi8QDpc&tlAT1Z26>UL16S(!oh ze5ikL1i=p2`ZgeDbuRFXjY2qHzo+|$`bTLc%)CdoF&7FnqbDvSTXu*hxl?s9H9T z_A$uQLXELoSpWP3Wt2EOv33MMQk9{JY;jK_8eufuOJ#gdbt|YVVxRB^evy-4(V%jH zl#bioyCYAEB&AmJJaTcMJnKeORU&V4RaJ_Bm$5rjO?kE);ZJ}oBX%&2pPgt&Cx`K` zdVjm@UyvFR1Ql>Jb3R#`fzEX@qHtk$QZNLXafr1o(&K??dFn%q>1;}kvaCURvWuca z3BjwWQ_# zQF2I?^Yv3K`SJ2;^HX93LbedBk{CLJuPnk3HL9dgT6c?@f;)2&r3KM&~D=N1Hl zxvv)%A95?RK@=MK;s^lQpXz_9pYoUtfy~aS-4VFnOB*LW}GjO6*%rTZsI?Imcb4F}L?LM(f#MO8;_ho~+Usl4*29Fi}kYqSgmYjpPD z+Fzw`XVYg)7ujiI&W%(`gdA*gi4HX@ZVu9CRQVnP2|)DX{LVL&F}_v1u|<1d+f%qz z7^WC~*?iZuaZg_VAf^=xsio*b^Q@=zLbutFuqd|IFtJyqmgrIit^17xHAFzPg2eKR`|tvqPp`(Tg}64zS3?UDY^z(eP+2yZ63!64T=FB6W8`( z#Dr%(L|R9A0nzthK1Id|vs!yrW(ozMDpplOL_acsIGibKNSIxk`GZJM4A}cp96m(;KVr$w7gy(OlgUW5n6XGAJ*%!H}2M7`hbQ@R)>F>a^F zUd+NQ-_rUAo3KoQ;Qugok3p73$-=0s%T||d+qP|+UGB20yKLLGZQHhOTf1(}%$Ygo z-1xp5H{*>Jxz~?3_Rk%;GoKW!lYT{dP8(dDRg3%H&)C1OeMy}mVw@|X=c=nWBe+bf zvoAbVd~eU|g;Xx@rFpTAAOA=!4WN}-($KS>9ct*_(1r{A6jsDLZ0;DiFy2e1r%)(6M6FJXn*UTWXPA${5|ib*rQzCa=L94g63Okm zCe`xXa?X}5UV{pDO{)4N)oyQ0u^+bUa4+=1^{}%1`iUJ+JJiY>9Xq zSgbor1|Amo{6yJqz{u|J;C1loVcx>^&rB)FitFKT%%L;Ka(^5oe%2Q5W&v&IY0A#g zQ9)Mi25gx+^{~1`gN%Tiub~a?Pvnx<(@1Yqk4?n!L($FnZn=pXAvO#7Eg7c!xhB+< zjg8q=5X}NU)9p|6OhPmH(Rdzucx~ZS?fm&$@jd$rcI6E($rE zgG_eUrfh_lfd|s?nTYOH!|=d+-bjHXsox35vP1z)9ahoxc$Chb59KFyUoQLsC%+SO zpW`nPN6BM}Vn!X_%DQ5VY8mrFS%h{u1Sej4xpu|FFi&G;S86XDlRH*nEqa~|QoeF( zp7lwCWp6w6#lDw>N2a$@nB(f)GGh;y1EbHoX_o6MM%}|BUhWU_eYY(mb0V;PlZ#Jb zxhrAt0>&3=z7`$~kp&mzIz4N5`zlPfYp~h)k9`w>*qxOpv6K8Wl$L8&B7-mSGp6c* zikWM50GUJXwikMy_n)Qb$7jI^*K=uJpXz7qN8teS``t3jkI~hZ88`mp{4yL&kSSfy zEOsbzjqqlC?&4cKSq;+i!|pf!2d@@>v$$x=WOsGd+r&8^@mE5l3#ehO>Pd@X+l8#) zf@}n7;XnJ3uns1y9)3a+2a;SZKi!j0J0kiZRNHxOt%|oS@6F39$p;&?4?k$MRwiwELUGwr zb?c~#@5aOHTDmq~hkp!A6Q9ZGj=Fk{X72;qbe-dcy~gPY#PSznGd58PpXR5HX$F_l z!sb3*mY2~#1@ff#DyLF)9Pe!9B&yCqY+OvMy;caXSLw@_Ef{kL#vU38eL7b@22Eqh zeK?H9-j#%*i=^GEyIzC%3+--_A_0U#N8L|=^vM;G1)pV*-)NOr*Wyl@frnu4t}nqa zk;4QefBro2=eL4B^y%;!oxWs&e=|xD0INVCL2AD*L<$-ThFyUWczh+26)7X(a8xLw ziIm%%;TUMaFdB=veMw&uWj2$MxqRtZM*aT}Mkz@K(*AJJ51C%9QA3qvF-Vh`D+6$f zM66z;POLY{NOuy6fFGlG`soI0w)@zjQ zU@yrgR?Mfo{!V@Zgmru{{Ne|6sTe;)VlqYAc`8bDF@xK_Q zzTltqeC{OutuTrBDi=JjW--6hhZFGB*~HJo)9EL&GPy5OM+cR~@$fpvZnxN7moKt7 zUvC$y`|)2D+f4S~p6{=(zxe+SQ7+^9+G1)LI73Vo=eWJ)w1UrwPI@IdV@)= zAP2z-L161bAg|;I)~dm)No9OE!nMwA3y4ggRUxfzC$R0SeMVOb3B zxp2PyB9axfbyVCc7sW%q1pXtQ|Wlrt4?Wm^x!^!u3W`5G%E2lp|%7 zOctD)$iQT|(9kFun^=!ui6 zjL>hyNZhSD7eYG_>g?E~#gI zC;1;48&}mb*t=;rys;H6bm~r)d0BtTB{6HsPx?h2P2I+HO_&b492K+4yBLjXtD;U! zLGMOo2@oxp1>3Us##LJoZ|6C=e=th!AmVJs%2uMPnwF9@9Lqk%$!uyTq#sx-Zd_GQ zt2)7-9GhoEUF1jJAaZQGPVrzI>I-$Obz6n$K3r#iIzQPCwe~694%A$?xI`nFyV#`7 zhoc%U?fZ4x*Ys;QpV#Uk{_xxZek)vdtHvFaZfs)%PQl?m#gJ{ zx%Wp4_AH*Y_25RY$Et98&WGD^e*P`f&`B;pUG>#Re1y*8UP9#B5HTL;AAxQIx1x5Ta$ZCz`5O5fhYDd( z2U)1~C4;mMwc&anL>T=PLyU2?5oSEZSo0-AtaY`KwqC?I`xL{RbG1<}9mII|CBwXT zwb4Ew!~`IeBZA0vF+n^eL_bSMM413}u~A+mB*c`Xl1g=PNgX6)%$O)5gA0 z<7_Je>wn#vB#m64Qe|RJ6iCFY^i!#2hGF6wp%$iz-5xRjX(arWOCi)b7ULNeSKImb zp8xXTh%??@R;E-bWvSpe$n87~<@vM4$82WW!Kj?-$G4+Vsu(p<7{a~6ln@=0+N zB9387-3PL3MPmcBNf=?9ASR5;h(XBn@4uG3#I%n zFQ-m(XlcV(q7R83Uk}BR>`bttQ{+!zwD-P}krb(Rjtw_xb!jOYN;~zjidY`ENAx~^ ztJ&Xs+)v~*36Ar{s3{{cOs`q#>QkkTaz!&VglbV#5Id^cvC6r(;b>O#{H|$kl=BcW zbhG>5h==+c;t-9t-|CprIlIddXpiQ+Lf0f^vzk(-E1S9%RfmjnZ51LvjMYA#XR^99 zGCyBW%O}|<*h!x#^f4EKRMGR*z93=S2PqOtqZW%7mOv7p&&z?=<_30lluj$72TQW$6+6&XjC$iF zv^Fj6X31m?UQE-Szm1II*%w)zon%qYZ*E) z*mGvp0Gpl=-!bpU#|^AM&+dHy$Dea=*&qjYhGXdE_E1pAplq#v8+cUa=T65_52w-S zsFof~tOhl8&0Ts|1*sF+a&Gmbeg>0Bm68Oy#M$>Vek`Q8!$Xc)(lMDAtoLDH7lGe4 zhZhMJXJjYe2B>Y)?eKg<>FeIFb3J%4!Bbc&mMJu+QvyJKj4o-?}o z8qF$oQ(Uip)eU26pL3kdYZDodb$O^I z#=5~xlTGfPC8qkup!uHLeRhD1Oi2-ptEB0kc5fU?i+4r%mrz9Qsx~7Rg#tUwz0{F+ zd&!T{v9C?hmR0?6*iE%SnHRzxn@wr;$E+-y)vHSs>aBJoD!nFBAk{Gz6Thjs>1x#Q^Xv~!ra@% z0Yn*dY!ISp!q(;D9m!t>Pklo!gz=Lv1%^UQ3!$UH&rGj>J~wkfrxLLhjK*>-8v}%A479QNb6uIWJDP4O~`;IM-L!+ z-H;O@LSR&jp~TBSBq0{3Li)KD&52cjxHuzFh5ca?ja#RQ4}O5LHpO5RB?LSz!e%51 z$Q2tofRx?CUNWIYGm^f`q68-;JyTe?+@~x%KrYHxDx3aUL?RTFON?i%phiStMk0I% z&krCG*&H^^sG>!Ba(-i{!oRJ1c$bc zGu1cBvuZMxn=*xkN4TmfjI}7R)hk^1AT!F#H5$rtj4Cu%%CavqBQnZT%p$h;$ur%O zqFRg5fscZvl;7!r_s9#U9m9h%B|7Xq#w;TT7n+^FE1A%GbYgCWIF^=9$#avR|#F8xsS)MXeM&f zzZAN1zxQWhG{4?wM4T zOJ}&EePsZUsvyvkAxp>(Pz)Mjf(}a(6Ms$$Kb6x&KqVb@{TNbJ(OEs42q>gTHB~^i zM*s}0NDcfsE08cmh#(coc?BDFYmyZv?|GHfIhct6xYOSfK$(C}xj;(~AFN0d^gvUW zB|%6Tc}Tf-Ds>My4Z5h6m`G1s(|J35KnI||bE>=vy1c8+isGf5`Txc!B~^@mGfG7j zV^uWcO%>x^G!sJ=6H_#kOBIt_G*e|X`An817Ztf!){Q|x-|y^Wqxq(pnwk2Vf&I}A zD(3lU7sM(T3OcR7?la<}3Y}X*=hKwCO;z>E!C0-J>3$0--AK z=R^Sjqh9!LZdGpj{BK4Ho^BWIYCDW}FYdCft$e1>3L1s>n+urbyIKtrfG`o*+`HVw zqC0k}I`*ME3934YqB~8x+99f1QR)Swv4vovn?<|q4C>|I>E~S$W~}HvhYmP2`j(ff zP62c`;MMw%Gk~)*v?pDk1C*{hur48fg1#%!w^v=Ai2*?uGk{evz%Cd0JmHN zx6J^5Tmyg2fbd*{@Wp@#QHzMci1c5KQY|t)<4^Y5pZts{; zuLm&VGc)}+qr}W2Ue6-W%&K0`s?W@3UeA{P8y2v z7YW6e8{r2Jf-k}ZGw*Ue?=~~vaXsHPGyiiv{};0WM1ueViy(S~AU=x_d4mu=i!ghG zFuxODu>iX~i>P{o=r^Ne-XLbjBJSEC{)a{4|HLS<|8a!WsN*od<4?Fp&0yv#zvrs2 z=k9jo`C?IkXjDL8RYY%8#Aj9dE_2eeDzi5#^RudmH>$|9s;W1t>a(huJ1a^zNV_(w z|6$b#Zq$fo)l6>G%zjjFFV{-8BXzx%nFln;Za?r3RLfnn$Un2_9XIM-v+6%L>VL5s zKr|U3uoy`ot3-!-sFqzH$?Mq1a^D$ zW_x^g2l8h-br);)W=DQ@C-G({d3I;@W@mkNr~EoneI~N`27!S`+3{=Ja!0%5{|lq^ z{Dhw1M|aTdbM8vt>Zb4O7Tp}0%@J1of~?@j2ov@?Rc@Ozky|M1Tqu)X(BFz9pS>-gpQ}K;tw5fuFqtXXwI$eGBqW@}Etwr|Gb#HpLM|pm0#WQDOe=mkxYh}1l+8?1$t8?#&LhhH;~-;$Rfn_;-q z_Fr4$J=@f|+m~4zq}yAc-=c!sbBgct)VaEj+qw}H&BqQ87Jw4j% zJuztdORt~$*uDD5z0f0oaa4fgt$>M3?g#o`hm7BeX?_e9JC4xzVt9R^1G$B%`>~sR zTx+_@6XyPDj&n$5db+__c_;9YO-Tz9?g zadnjn>17t^vt+TGe;ZpGg&F3Wl?vmaa(Jmmde!ekx?HPf8})e4b}A~*q@B&OeQ?yP zbv5IEFiP?tB){W(NJ*jOlB_W!C_@v8T#!g>zR@K}R_%&_5<{v0>7E2&_HRaM34|J9 zfJecxFa|_gpRbd|*<>GupYW{W@F&hh=I#I+l!vVKQo5YB-KCcY)mVg!d;~9d-i!ZC za>#dgv5LeQ=-)l~ zeKSh5ODo2)09mzF(^Q+KRrB0PH7#?-iYH3AuiHLqL{XAiICw=BMG3}~-ZGt+XeXkfMsyb&Lg z&zvmPaRjnqAnwvUbC@!s*3nC{sFCILu+yue_%|THtX?lQyPfWKWAJGHc$M`N;k#F*vod4e`GJ%o07e(% z3+I#*I2Y9PYrzQrRbhaC%cafJT0um8WB}Y3iO5!0Q2QA&h^+>hsH!AJo7gEA(oll~ z)#nC}P{t72v{tY+@g{%>S`_XPU4+om_U9pk5oePU6tU8Ehy=|Z61HO9txZ18#5^GD zhDscYs)^3A?p){6s9EHawHB%UUH40@VUQ3W>95w#47t{E$8)88=%L%dTZ6{nLF5SP zXub%(v$+U$TU3~bi9Y9F`>+G=Je*PxVZ!5ho))(HU5?v${6Aos zP?#_hJA{7Vr~HReN=FscG=dS%yk8<)c9Yh*ic9X~$;W0M<~Kl_4$lC|r;kmQF{O)7 zopd^)G{ls(kc&@SY#?heNtG?0Ve(7<38tFW+G+>SoN>r<%sHDX=Uf$^IlXYiy^AUD zJ{6z!*l^5yn=0>p6`%e2aLoS$OTpJnS^ITFoPUi$0T%Tk2TJt>SC|k>F;p%g54G_` zlrc>)(l#L<_whtr5NqxaDCj@2A8?>AAR6u;O+YUo^uWcCKtL!!Kv>_Z&krDw|H=OR zca8&uUufalRy6x`@zD(`UeE`PYUQ?$@lqv`9B4q|6~5m z{@~+(V?PAn=YM>l|6CFg5s~~e{$&9D%l`S-NkKtD`H!HcqGG3}7NDVFprQE}`tvXA z=O6M9{lDXXIY0mW@J#{zJLnl1X;~Pl*cd1|7$|t?DZbC|{QHKHk%ozhfrW*Im6er^ zmF+v&+1NQ)IXT&Q`8fDQ_=F@yM8zcJ#if-5WDR%}Ere9e6g2cT4E1$Q^o@=6%?$N_ z>1tT(@Y`$CI~ifQTflnRf(2QC#v6ks>w=|dz$C~Z#mZqNsu1KDQq?%HGz}aCKS`f&)#u+&&%cwd-k#3h?yi4% zKi!=j?JW(J&2^>ib-5k289lYheKpae)u9Wu{xkI@xeOQi?1HP>_XkBbej%Z=}=jqmG?-^S0|LF@Bb`_ozH!*S2u;lRc2 z*#6e!*5=I8`t0ob?8N%qz}8&H&SKlaa_jL*+v!^S#YX4VR@co=&)r`C!@PXo*W;aot>VYpPru|pI_`>UTt07tli!(Jw8vp zzK_0ttbKf3etbNBe7t^szP*2b008g*zp)>{PACr4b!NNE#ZqCtS>)1iGQ_QuFsNfe>(Cju{qzGOwTzV%<+W5m*XKn+!&0fj{d-A+drJimkvHbdwn=xS!UCJ z<7t1s9*73`^F<8rF#B;eYsz*jL`m8D{<`2;>^z~oMdT% z$Vzrp_g?f85^Y4Df+-1B<@P&dYnb`3eiIe;bD6IH`7`3uAK9sD0xUAC{XW9Iupf}t?`dF&7(zw(3lcMtq<()hLjrSQv zSp$`MnRxS38MQ%K-I--E^APk|)xcenl>y)(zoHK0vObz`Mo9aj!Lv8sy!@;K%Q|$W zgo(Owr^w|(==xDOrr<50yh`iF;GL?X*5~Z9?ZJ|bt`+LikxuYt;rv?d#;NV3>DHxO zir50_^|}vwlbTTI?TT8V8-#N7W{|zHe{P6WZ=aD3yxXrvQ^Lr)t{;jJ-F^_H)zLPN zY#1k=3vU^gX{79+VvM?uL5OLBiN3f-hUY4zZh!!{foc4!Mmc6s?43d(8Wlw9kzYs+ z_h4KdJ+g6G)Xru;S{WpCc2O|jbaE2>JcF60ZiFd(T9+}^#i1Eb7YVSYf6mKlBz66b z<%Gl9zU+pOSAEkx>{l=QG2(Qu2MOx7uZJn-Rj)@Gu2-+eIl)~aLom$>2I_6tptIy{^*C^8ys^@0N4e|ds7-|c>BQ^Kt^K- z!>_@+Ps`|y$Fc=3ULt~?_dAe&!U(zgq^pXxHfR${e zPe&-?;G$;cjZg_gMU~SUG;zwA?7ljiD zeIGeOPC1hOT_fdop5J-5Wfz6NHa>!$nwXHfK)Xea>Q^~Vx^ zD~a?OC{_!LKnA5(5qIWFOfgJL@|K;$w2@p3qT zl=+&4Y|>mT&7~o&-tdH4WjQFW z)$F0ZTGrImY}&)ywWhTq1zLw>_*XvhT&@0Xu@%ji&a8ePY)s9C!0Ydc3t_%yT7VkC zaiC?6%y~?O?P4RCp@2^Bnd&+dQI$5Fi1zVV$lDug+k$tsPV)HQH>JIg{16w~pmiVFgNPl~BLsVhk4<_sR3shqB~f7rc?CGV!WsXePbDBi8}p zNFkMIOO>sYv|6Z(*AUR2u;V z49pm_2!CFDks}7n{okq7Fqv1!KQ8Y8$^AUqe@^!LY`Vk~!q2zq=-CI#IW0uEFAPKd zFs1`B8AExck>+eo${>GEXrt-IpfPhaJ!Xo;jgS2`fb2o`g}m_bEZ3KtUO@oEE03F$ zvXC~`Y6|gourY;Mc}+@Oj0vnL*gjkAKzp7tz`M6n*VWz|`~H?s!a%ND!j`#C2`i54dC2j(j$Kd z%`bMN%eAC~jjz#ZzpmxKUI_w9yp^o{JLvtAB!9``3_nJ_vj7{iOhD}Eky8(}f>i}L zyVf4aA~a)!l(_!2fnVZ2_Bxg(gCy0t)M7wS-b;)-~AILW4M9}q#iA`M>JmRy_(>#a3V0RlD_9>rr{!m|p zW?!0itDB95bqnC%pZfjs+A|D$Ek&+NFlx%Nj{xt|J>=W^%d}DFRy%^k^|L#)`EvKP z&7Fz)y>i-?+l*ynw?R4mvTl1?uq_fPX*`oKXbCcJ-7_X&Ijz^M2-KgJQ9m1DVCAi{ zjz0=_{j5j*)!39zqY!Xy0EWQ!em`lI)ZMm1?U}Kq_S`lc?!BP*tn-%B@{j}b3yCFRUW9h2&{2PIUTo1sGzFK4>MXHq(2q%NA8k}SVYp(@IXrW^03+}7S z?&}NDg7*XQFEZ<2&=GT>8Q+83zvqvVku`oaD}HnmzA%OSv%)Iax6Yoz{$wL~4aF`* z--XOYFis9UiV!1A7OkFTanJsr+M?cpPwavzge0hcc~AV49|N`+13(LCLD5D52D-oB&2r8urty&4of+R>8Fjv;Vz3K^VreLv3@e>^gtA-4& zUkR&e;d?fsvP+2={S`j%AJYAT4*~>kisJYD7vb%%%K1#_yabM~29>`=$hdGsm0Lue zn*e-&gv5Tt_wJ${;>hh30&oS~^%I1Ql<0fNs9uSH%a*W&5~-$_AmIe|a|)6Em#Art z;2*8g0L5rP4gxq3^vg*k{3!2dO5jO+%uPrPh(+-9h}3V$IGOmUyOuyW_t+Q3Xyj6$ z#};^w5u-K(`u7cZ#rt7;kEU;qf!^{E)5e z29dKK(b*l*l@iH)71eV!2`CR}X$QgjG}-?)Ny&n@ojDmeHwCUY1!^}1>_;jhVX9_s zN`hp{T`w_RXllJ-3f*x^vISx;=l7H5^7^x=6ftKswc<5Ai_*4yH3e2N4K+56*)Sav zDZR2a-Qpz;lr^bfHTf%txt=nkpE50>HQ7-z!(}yjtQ0z-E+h7oZJsk7)Hl5&HFFtY z281$`xwV?)HQYV(Z(P>3d)mEw#?xt5!6=({#@Sd#K)LitkWB^nS z0hK54TjqD&dfPoG`!zQ_HTljW_q{alCv@b{Y8J~|mP20d@m(HDZaU#w{tR2*jzu0A zSJq)_U^%B?lqO3=sNiNn{#$=;|7i#ZX6B`1!5`vO1*}}8-h95b!hNs;P^>J$vrGyq z+cL;hg|s3`DjrAoeDt&;g|(vh?`a(h${EZ|Kxwu{eSytc0bW_59##ntSP{VJEHhB6 zsGG7luC-t|wGdx2T|F%Mb~MMrGME-C|IEM8J1jfLBAtV(Bxg*?fGdYwtH4hplQS&; zWK>a?Ia4|<_X9J7nu?#gEjxlMV`jCuO)GObG@Ti%tOr^uU#d(bEXT87U_hgIGa=5q zA%1)<_EsaV2c=?R&9`5wB7`brysYBJ?VDZ;*@BLoU5oYCtUSU}T9ztXrHVR&3^$Yv zJ;G4fl!^nQ^xvkcI`pV|gO)wz$~o7H55}mGp^_9!5LTrWIygw|C6;|(t07pf2DdER z(Tx&w6Or5gZgxv= z_MomqBc$#6SxOa_&pKX+t5uI!mQGRMWb$6&Al)40N$gVI92ef~rH$m{N!QI>8Z6z2 z8&KNhfO3dpR_iUbA58}*kwH+&sfX<|0Zf{;IPvGkG;$jWcV(cpoOxMcCqwG4s?(s3| zI!^D(lc-noEHw8_t{G$fde54`%!ZZ8+$wMM3@bziDbKD2oWWH!){Xk5% z;@iZk=6a15oQMT$jU|8W>!p^89FdR(FRWqGh|;zg ziZqc`&lvp8Bdk3!XjERAg^jMM9mXxyV81bZs5k(K_Z)zNF8Os^irl8`)Y{_HF@gYv zdKR*I*ZmoeTcIQCPzi9|a4H@C?2_&~aLZRA;};#y2{S`UKOXxqocT<!}YNoRbYCkixnp%BeEY=^Ys=wXkk;tif=L;--qU#f@p?N#4{9KW!4} zhk2dwjSk$<_nsvRfpFL_B6}&p-q~WCcn@a$Z#X=q_+|Ewjkfq17B{%QD-<#w1bJEaY zN|lx(M+wUTytsy&L7ajaf|m;jpG`DxE8@BaUrtR$_BWkmXaUYjhb=~m-&3YDH`hK}hc`D>VmH`6VoN=%aU~bR zsnYu|yW}r7FJv)xB2(_)2B>J-ux-|1)3)#}doMe;V{W(LkZ8H%q)s#j??2~=Hz(}0 z*K{YhVXsgDoru)Jj39<^EbS|km#s;yn}!k_5LxL^)=f{Hn?zZgaC&?CCF@9ve8^ew z%Pc$lR1*YOyC9jXjJA7hQ|Jg;^kB7nv{U``e5F{}tF9GkP<(A-S@Y~!2ft(Y5$pFs zdiPS#_XT*ir1TDj{P%2TY2@e-74Wt-KD+I#4~+mzxtT~*fCJvEfhUhX@mb>0be(ymiGa^sb6gpNzko8H-)|zRQ zZ1Dj7uc;GXZlpon(+nTXkShUg!10gIS)uaPOrNvh+tVCAMliu$#*uuX&Qq+z3MJH| zlB|O=TPz>|3-I?ZaoE|SC~7@AFBPBjA-Zjl+Y#pS8J*AKCtWJ<$cy2v(=tA-)bsN~ zzy-bN(voA`ywAlVpKD`zdoE`U++>&9YK0ArVB3R?o@BdKS8o&G@*VeT$?1|)>%x?` z_*QS3w_?#?s%-q^@*(Q%3Eu0as(XcYFx7Giemj0ocSoP@7VPU1f*!Hmhi+paPa*Q) z3YrZRKL+uuf2{&={X_ru!RHof>rBx{L`PzROuzF{>W-Etm@N7((C5Yn{)CP$nBnV? z=}$b1{IW9NEl2b*7ycO!edzvP6m)2u(DV)8#U)eblDOTC=N2Nj{ILQ`&6&o~rO(j0 zt%PMpq9Om2tIy+3)}t2yLHmnah;H=w^TD&?$%_9J{r0I>FLhx;sIm0Yh5ty>?$j~r z)Vg*DO>5gX`oVe|-@ED|A0E9n6REE2MUC$z%;%KRZA@gVt4^xBc56j~F1cfDRU#{0 z&;KRq&qjzXmfhE6uvOZpc2gn31?XkT674=l+1OUWTY2<)%Jf+v!h4-}nkMvlon(Gi z_WOfwEj1v$FzW3+BKp}q`xSKeY<1%n&*!7S?rapQB?W7A`TgUW`jd0}JAD~Q#oB^d~tPx4ejiyq1XC|Fsyr~xunq)ed zfyEj1prNd~8T`HP4h%=*#-J|{4qq%o>^2^p{MfGes!Bbvt!a~4NJDT%(39w16 zbbk`*sOfjfbMI);ZOn)bdl_RZGyD(iCsX^`cB}JyMU7rl@j*$#dJ-Jx9fwKyq)i>_ z6pn|ZuiGTBES}E0%hhJ*9|(Ls9=B77P~pIry2`hcVN>ql=`Nmwvk~g%r&R9`AHe75 z7X*XA4^Qgpock=PY2L$?HEZ6=H=`MnPw0ecItX^EnXVt~2Q|V7{Gf~?UrZz?0>xcK zkwqtE(p7w`SOYbpVI~ELLz5aPvMrdNeu^Uae?XZe2!lx+D3BqTYAMI`sHvJtGgP3Z zatdhbq^PS0n51dlxsh{2!jvhh^I!bJCK!Xytfg6(P3mRYw@J#zNmAbcRJ8dMPSDe2 zfp@TS{9pgTeuNY5r60V2Y^KW|NWv6@-f+ILAM(NmrFG~>sazE0b_7;tTsSx>N_GFp zu|SDOE80-8%5w1!oJJNkP4mLWB?#{{N6P&TqtU5(9Y5!Vd9O=na--_9dxDaOo+nU*lzBu!OpVA_0^dfBHO`Bc)U)_sCRHeKgs(_{(D-i8tNnT!c)jTNe& ziCbp)hv?sHR07~PT_DI>4E*~&pJ&{pmBW`4#EcsR50$J>>%1wuq{W-K)@9^B^>{f< zV#Uc?YXguTc8eONlv=lfd6FQ-*4U8iSA&Y{5y>66eXey{r2ybuzjA~5Zi{sirDDv3 zo!Krcf==c%D$!Xfpy1*ngGcp3G^^@0Z zBl8=sd>+j*WKrAgy1)2RtVt)k*v?GX=g&yqj;z*2pM2ghevgtDcj)$>l6(-=X$Wup zo^n?CaQs_3KjWB5RL$eOs9ycxpbG`@*@uVj^>zzp!{gnWA)S1)M5hVC=e8T{gnODG zZW$|vwVlr~9Ht94I`mcmktuQ#Jj~~L=}p5&8N#=}UVQTtTfg|OS)AYdvHKiA?!EQr zS8T=g#H7{t_zVA^&*$yR&#WgxNFG?DNQO^X*~q@IPXO!-J%Dw_7l9_?%LTZ{5Arv` zX~{gWe_oHLZlHhn8v&^3H}-=y`fCXb8Vp1N5!OtOIZF~nUtzFPq0%y_{6}I}$^j)G z=8Xp_s1ah|O8st*0tFRL2-w$bUy`$|C4sR4#HJW)bLN;C^=umWyD8Q@+-$f$PA(|= z9)cgiExwe=9=srARq(EzFR)cU_T~##(`})Ew-7GIV~aQ-be7Oe#Mr}#i5YuJL6dnr z7xmhl#)q*~heP>5{BA^CN{z|W#~PAAlVYTDC&X}Cc@bgPg?p~#Q0(17PP{B0Q@s^B zI(8?8@q91ZRa@p z%Ot28XLj7S$V5t39)jV9BM!SFUT<73 zKGZ!|$-tzERXNo>~{^m=j%_FhF(gc|m2Wz$?(G}`D& z)j0)DYTX92v$qYevo|x-=>XGzozm9IT0sh5-=uDCz|ebJdZwC6j9hh*NIN)XV|IyM zc?4fus1zzqp6rG75)RRQXItr&!lGAvnpGxE6Y*IxO;dCqPaCeBq{*yEA4L49;WA_E zLJ+eLtNr=ShRhcr36gy;N!SLowp8?YEd&yFk1r4m2*jaa$8xfVi)SJ;rh#*+* z{0STHc(K4M23D)hjx*) z3Z7H;FX+d*d(V*0)XHToUZwb!fpfq<&C#$6`(!ds6tmmR4stb9o5o|9Ab2gLV8FUj zHwubCKagwYXvOQT4wcLsRO{8&7K*bhGGc`$|70Y5Yl}ZCnj{JWpUT0K~Yyi#at(!g}KF;s-26nXr*yjWV2He&*v}>DRMYJ8X!0i%M_ALTc z>(0TV69armr9i~8$}*WTPI@MOw_usCtE}W~o+NKdGFOFz$lK0j( z(eWcX{}iaA{IUVZ-hMUAXu8d5(TGOiU!NZK0g2sao%rqL!%fmG`*%EV8fZD?6nycq zz8mmp^A$z_^2M>bf?j;;W{Us=b-P&U^YpCmc?FTo7ux+2PyBvg8%{tLMBHS0-wnQi z5A?wM2iXq^U-rg0f@dKAyD;d*zg?cEXfn94E23gT{Ao3)Sx~6-Q7`h4BQMjA zS}>>wn?7?-mA+5aI-C51Sy*3W$VsqkmZ|c=VaOa7Zlok%{-Yc%V907!+cqb*t%>cVb8_AHdG2$b^RD--^Ixm0cU67q4_#foYVZBqG~p0^JWF3F z|824!jyOuk6Y2pQm(f6o(a_3x7nXMNg&z?e>;yl> z!wyC@CB=suBqCu;o%Si{CUAsLM-wZPVip=Y24Y>`g_9D;Gz=xh_G^b3iAOTVvTX3Z zB2ib$MmzSI)Ao5}4#o;}Pz@HS@SNcaJS(YZmk zcVhAYBC?}0y-XWNudO(QxWjC&4$(^FaBym9rCV{1>asIO9=?chkX>52{hUR9@Orp) z0AHS&x$t|rHsj=7;`GRh?D;5O3>WjG3f0rX#H`@d3xq;pnfxfI)X+N5BwTqR7v7?G z`ZN3tR8}NtRXIomvTtG70b>fRuOzl49`u7kf38%83STeE>{k`|RoqOclIURTL=(>} zX4ME9D@_PXYrJnV9D%JRuK~kHDbXPrX>9P@#xhSNr(tv z5g>sS8Xqyb5~)kRp`uLdSPA$7In#M9!~#B4(;TXM-Ar&Lplv!lFfwAyR7y=y@L6t?G!G-$4xu^M*mj>Q|coi>eEX8pw zM#05(n?2*GgBbc@OSb&kxuo_>?H) zzBzmR2bOJX)*{pKh5K)9sIP1Ls zB>e>Jh*Km2Ok%$iwscI=pRKdT;%BAwfmU_oI&=hLKh@QOPN5(liQjm1dBWpYCPYG~ z8m;YObQ_v9otgnE!p>c6g-w`)`2vZPGF-A+(K>4Z-{wl1RKer5M(dW!v&JgAX6SBJ zeC}2D)~8b{OEBkDmm_lD?otbM3~GK#6Hxgk}_k05bGQ6<>tDRz9_}&v)KwZ zZr0EH5cNkwMzeQiMOuVNFLB$WaQnJ+J91M$>|Fm^gT8QO6y#|8;-R_tk9etRjZ23l z`8R5CX^wN(?02{!-g7#L4O%i^X~_OwvnfZK#_eMH&yYoe`_ zhC8!uyVDRDvy>&Y zi*Ng-`tgQq5@=lteGzcG6w$^|h1;ab74VQtCq5j3TIlvS`yDqmk?So?G$x?g`+>?M z!m?fV_tPfvI?o(C(!;AV#jUc@y1gXK+p?V-w4_Rai5=NS62YzC6{VYp!WzS}$+X)B zEEP#`Qr@OB6;|2ui-+?j`tmmV3tqHKLqga=c|1u+rhI1gg;c~u&^Ex|L|D*7AYgc62LGeZd@t>iBL4xdn1kiQ_(6(F0HdDuTz#|8O zsvyl7orOQa`)+imI)Ub%#pd3_$F`5h;Xo+cC3Aa7b4T)HCpQ%_-)({+IyW;5 zEuUkL>|-zBZ*RR5|4Z|TVT*t*3#QZ^_Ig5k3>`?Go@FJ&`@_xnVUyotC!uyH`Af$U zKqx1PQ%8eSN2K2lAW#n1koJE=Y-b>C9lmiRk^kE21@oICX==?GYyYOo3kPZC&X)dL z&N7V6%3saO$-=56#Hy^=s$$rxN{;I%GvmG0ZfF-FE1e-^_f&(}awCCNl9^>PpOuZ@ zS*zb^Y4&M(_i5#0@z1TZZ*vmA$k+Z_m5q^|Ltt0|L&eU+^v(5dnma}HoLvCmDW~U3$HXX$_$A#^-d$xoq2t2Fe zug;xnv-^DyCtHt0+j?jD7?*x_HVfHj``I>Cc14p(wi-BGxA&*#YvgBclIK%)1CVx? zZkC0>%RRtVJAwUV8T&YX|F{AAji;?-!2uLttpDeg$%0+J-1)1S&0ezg=#u?XF)sY! zfg#{X<+1?=dAe8bT2tqG*3SAW#9=@C`T#POC*M?|_=obl$+w3MMD~6pL^~*U+g3<> z7=2qb_viq~-oLL4%-pB6?VY5V*P&{t(Rf2r1*nUE=bC&^|wEF+oHN1CXMj ze@9Sl98H-iJ?)0L@koC4$g}(~0hH!I?lw|%YIB0kqI){5?S@;yju>r=+tYd?rn~x*&Hp<#)EHaHW3if2^*?Mx{7>tS!{W zWicb4lga3vd}gM3){c2noIYJtFm7a}4?J}U%D0v0+4P=Mzf0r&6BR8L?J2+Q0a@eh z!T*)~0>@%+zvrW_acUekj?I>TmC1a;t$9I>@dA%R5*;>W+rE~2)QSeXt6J`=)_>F~ zaS%dS*7nxxYaVkyoS7B%ZdQMtIeIQ;f2I(BuB=|}r`M*n|8neE4FKC`7?OL3-dg%z z$SE#<)l`loo*ISW<&p0|aSd&lORlL|_Qo*GCd*e?;|`ohApiy^Ru7 zY&ZppbEK<|SMwd~_f0)spXT@~)3qT@Ww1S>Ssmdn<(rAdw}<)Oc$50qb~HkAgb2)- zV0#l6mBlbXd|^MIWjGcy0fGL|Ur$U`6^QynAkmfZo*nZ0gOMo78?oYYdw&Dyjqp|+ z3nU{cr0Z=?ZpkK6nauw$*bh@t8w&Y1LIGSnIF{J}#CQ~R3>o0c!>(F*xmx@e7Gy1& zq>GR&n#M+~lSD+EAKZ3Zy;1D--?1Nty<&NNu`Wy19cGXFN~I<)$}DE;WcYqrb5cK5sgU_XT2E2hR7T@YGK_xADC{z3?azpN*Yy+@j(O$=oJ9!8e#@jaZfymdW< z21Wuk5E7O}R~1Y)9$O7aP<%`rbE9jD8-k{1p>4yp2JtX0^KCS7jdVWyUq4%&H-EUV^tXcE=FL!xq}P?+ z=E_k!E~iB4fqma_eHi+gR^M_Jqx@KwJE|U z@L~ExSwVB&FEP}v)l`}Et|~LHMC05syVvPFwmMrvuPq4P#WX95>+6z8OZdPf!gRM` zr!jZxjnc%PLBle_sLy*m!|Wc#vSJv)>*gzUbr2|s-})K@fyCjMG*38==PHe5?tU}x zT2bLTU3kk~y=el+$FUo{?0vqD^j^>k5m0=AvIbuELA!1@;Hzy}9~LsxfD`v}?VS4c~2{i8E|NJ1S>e_2!v|90Ir9Bm-oqv99eJ26s| zs}QJCbO2=BPl1hVMD`zbVKO%0xGS}gOrB5@R#M7YLMD0mMsdP|Ym$gR|AqaiJZgdC z6pV(jF*t_F=@_9f8VNv9DTrgAB4tpSjIcW1MCc{vX}+rr|AYOM;Ot$fcnEAF180Km z?luZpf+?lOzPY3XO(Jj`lS@Q}(@9z-kRee1QH*yI4V5uOR)_A!psH1005`N}gG5zN zu1{|6H1(5P?Gml8jf2Hop{^UwFn~l&8Rj8pddQa+^{XLu#>+V@{7q-U8k{=TNzT@A zl44pMpHgvedQ}X?V8t|)zQ#krHJ?T^XiFcrX;X}+`647P32)I6UnKg~zY@7g>v}2_ zGxRH(>1kP;Qtxw^|b4XtRZ^X~b`qHgRjG4?PyW~Kb9}>b|Q^A*) z8PqO?S8RW{47@~w`V+}--&Yl%ZP3hp-?cGC%jdJA;|me+N4d|hW6W;>zv zr8Fma9*!iO9xJL^g8JVjYF*{TzU5LsAzVulWhp(m(&A@CNKHOFNi+GBaOB$WUBvOT z3##)A%Z-|<-9GZvy2e!VP|%C)v(_wF#ABhs=B$Sca2B`XH5Ma-tAig*#GJjB$CNPK zJZ+2lA#S7n{~8lEAcbMPZw7!v$V0( zpQFZmZSFkc#c^PqQ)O)gZv@Nx$+Z#(u!c^Ghh*Kv$coo*Q~N6fjsoUehlNbcK{m%`s>~hU7sk@B(zQV%-xE-zDj2ZHSrIjHKgs+9NX<;1$X>1 zPw%0kF8))PYO5BW^TBg0h|0xb!4{f6fIZ`UVf7;@o17Dl_C)gPcm`au@em$|vFOM- z*TF7IVtCz>&$_bwv0=OCN7bn+>c|{epNkaKx(dU%O0zd`{8IFea%(A*-Y&BmyW%IU z%~tDLg^pi_)NBivVYssWuZuJmZmYg0TZEN?Znoxc$~GETn$%a8E@eFvHi5pc>pzoh za~rBIU8x(UL^kU5T72fXF4O1|sjLkQolPiOmYkicl1e8K^peHWHzD~sDmSY3hEq7i(@~+Wlft-`H-gR9O zsdG^6MwyHFCwclTc*hs>P%u?tRSmb7ZIcjswsB`}%U0L_8ebLwilL0rV5A)g(|gsl z`~ox3f0mEqyK;EEn>}#)plRTHUA@Y@t%xbEegS)9yUKp-R&Oe@H9*3G{{_kPJOaaT z4e?>Sp(zpecvW!a=*`;)PW%i78T%Qt5BCdlU?lV!O6dKPkpE@;^X{&K^5bC{sIl1N z_b6ZcvFGpqeHU}|`P0znfLi}9Yj}OwbJf~L9qLf$@*{mpkl>9rw@@+X!7%61F$cJq zBe=26f3OWq+jieUTnbGaHjNhWj1str&;&B(!oX&L_v=H<tcf&ohEp{c8wK843jjTP^ea<5iE;SM)*nK3k0#Z8?vLJ$E zPo)k1133nhk4u;UIGz)Ton3tx~k^dkbZNq)4*|{OKkF`J`lQ8Lvg@ zcc5g-RtXAwyZnENUl2?v6s4_QaZBS22U+0wVRDB;(@~m5l3b(3=?D^dHI<8t`gjhx z#7w#U@+O+lI!YJv1$FLLf$6e=87*}iAtKV6;futOce9VBs-Ch2)~gN5EHl#mt^l8iC&Vk zFJ)E^k$J3QXuceR@8(_~Osa}yZkHaPHy-299_jy~_&K*KqtN^IP{8%QSewd>>=70? zv(d)7lpkyeu*>ZN7U7SclX>!HIQ5%jG^GlX8~<#!$eB5oT%%B>BiKwjwu*z@ZyNel zv|>z2VEY>8T4#}!TM~g$me^~d_~$R<+>gNKP-3k(aM!}=G~IpQIPr3eBtUVT9c4IC znVs8iWPWP6>PZY3Oehkiw^m$)Y+B&=?|iUkad|&drcV4l%G{_dKe07`P#%+;h7&Mq z9xGz!rU&-~0!V!qzOI79S;_*ouq?H|ZghkiA!JnoF^T~bXS=X8#5<*|T7=W!DM#1gVE9f($C~UUYn2EYquxZ({DwRF;uReuh zjnd;I7%?%bd6gNqtDGc&>>xikqQd2M%$C?d>XkHieAS=kNFzV_JBqXLf+T6+dpN;V zA-`3*0Nng3_Sf|*brw!#KTPI1NajnL5fp!H;CPnWUrAIae)FSLS8RPqu4>OO2VLe{!Bo6IwGQ9~PiL^cw{tKrG$4$4hpqG?DwU#GiNIyfgFI4o4t8N*5g z(JI4tHJzbCq|3H(6V)AY*#kX_)6G6_a-!PLu2$l>RH3uvC0_*yQBD|;M=M#nSj|aE zNyO$?Up|JMMq8!Yk@LRlB%YRrgh2-T?^ml(%3EGFda#@bctWpAXS7>Nii_Qgo_ zYrjAsMmS>%X#PvQWdxf|na@3yKWaz?ytq2V)yVVq4Ph6Mgk#S*PV1YOiR4VMbWBTZ zx2KoqJ?M^`=Vig8G>B(=C9%|mXX`h;)%p4M6juo)q$R?B+3$bo>3ZsbuisC_u}*Wp zm(NM1p{3Vnj@8{BE{qyE?#oJGK_V7cR??PCMJcVvAlYYbeRclREtfiSF2yoio$z$; zr$z6xe#(^W;In`eQu$X>yD}b$$|Qp zg1<3cX7l!SmK(QbS=S|M&Y4#}okiN}&EebcwS2EZk>yRAe)0*n5;8#zv12=CL??0YdtU!*5rzRG_%k!V?=@wV28^V<*7Pbr z3r-!7zo%Tto^1*V-81pk(V1f@pnj+5pnS%7Na8J5Vs_=J38`@bx?+|L-vBJR)Lm6u zB-9!jMOt7~dYDC>UBZo;Quk;nP|HvYTs_Mkl%%Z_oaoc)DNS;mubo)*e?L4)t*D*3 zYJL*))ZcAcvKVqVKZt3HlDMVy{lI(w$-mLBH2});_a`5kP%@HGAT&5`?-f~H4PE=C zNAA7+-3bM&iKXy$t5j2NxuG-86JrTIQ%zpHXASdN+1o9fvvH$K23t|z4;E+#lw2o)I{k_(nVnK-Z5Y7Im3_RTufv4%)U~3_+Lr` zfxLe~Z#0F7dj;uT1j%Un@j;Y*8*JJ*7I|SC3dnLfc{$pF#p_bZ5d?QnmV~Y!A1wk9 z&jFYo#7KhVE1>kHp!l6s)u(FEMcYc**G2u$de?=&QPbU=Tik!Pcnp9txPT(a1X1CE zK@Rr)+<&TCb641Tj;FBhS>Z@LD_1)5VEM^`EEiu<+jP9L67vQ(#m-%LtQcAERvnf2G5gXmh`iPLCv-# zUzWV(^T}1l_Bz{b2@ibw4025BM$=aWKF$pOb3$BeF-xY5lbGQ}ttP71B#PQ!Oiq#g z4%H_n(!yDlQ1zYpFGOp2RorcD-CVtEuhOQbzY1)CL@{2K>ReS%T;=vy1)p4%88X&v zTt&-Xjq{0Ll}k-(ZA8C!z~5eLmou#P+Ot}ynz~sux?Nx>-tvt(gV`M9wz#_GI*`{V ziZMHkhqv(0yqcM}F-AOUfG;iDuS-5$_p~?U6rAmZ3*rgwSo7QsPdA<1+~3?6;H5pg z6YhGf+r?f^yV?D^U0gHDQl`sC%HjAdZ{G-n4$1$Mdrn3PZHJ5Y7I|8T(02r+{toR z7(L@eCAXWw?VK){udk7)wdX$H@m~4tZ0`UvbjUY^kLn#fA{G?+YSs8|*0XLNf7C{H zZ9RR|Tz73l0f|>XMEgNgKf#%x`vGu#`x(f)E$srNz&&=p!{e}1DWIZS_t7>?q**e7 z02Mf?a4HEni2^t`7ALaCvIF_JAxVQ%4AWJy-I???Gqs8E5|a6{pM0YqfFhU)?x74w z`3mH-QxE@f%y5DF?P~etHlyj1*|8MKl@hVCT%VQ?agaEm`!A|g&_EyqG#E0-m*aj4 zo6v;TAVEyAadQWeY?l2@{b|p_&(nhy5LRuY#)i-~@oZmMKH6i#$tZyJ%pPkX_!A5P zMI<$rcpw;oSS*oamRK|hE!zY728cM&gZgQLRH%qFEa3m?^3fm|E661H84Ckz8HN-W zgowMBSbCQumyJQmckqJxLoru8N>0X0g;F^}I!o-rlR1C-r&68TM0?WNLM2DAS`jQ` zrFsKgLNfY#(+}+yh0Wol3}-u`0*9RDDr+}-_0CTQtAoGDg%a^F>HwP;reb)gRIBLC zvL~y@FvP9*b6FQAigi!Lq6uQ@-oBcH6qz z++;XDwhHyyVQ)ZOkAKV{sAy7+IfFg_h)-T_Qt&BycsBiYSzqN`(6ysUY7u%C-k0oi z#Ab>ZPQI1<#_f)5D*hgz&;8Y`(G~xb-99}}`Ey52^X*ZGRqyiocuhIPQ$!6VjaIVx~~u)aO0#L+zkWxyALr-hd1RrtR^o)%y^Yrc)$@9KZ)Ev7xmERH# ze_>{7@JApwBWP(|U0@oh&|WTz+XSO)nixHpQfbFfN3$-*pe9%8u_CHzXyF=9VVc`n z^U>}oQwK@uYf#=TaX2trMKk=J;eFz=cs()C@xIRm=(?`rzi@=@^SW(6K)ASViAXzp z8ce`v%YMzqJbc>0xX?x%F@qb#lEM&Oq&lo-_ghj5Tg|Q+D$yBsoL!0aUA`o!K=U}R z+B9XmH~>0buCJvNFCp3t66>d$Ref|Z-6xLIIUlG?V}7_SaRKnz3u2moY!q$djamg& zzKxu^@EWx=0SJpb9^&13@fP#ex7aRr{V!J*U^DDdZsBu2y_@^E7uh^=cV&Sp6X=9* zdoa#ZKDOCyE}5gFfiWJh34}Ec6!g?3kGDhMw4K0=27Emr%s)nB1vvOb4w~>ngjq?fT{-!0l{p!sCz&ssG&bGeWj9{iz0ot5P4wBp3Sg zN$BrTjrT@`CJ4-9@1yLM?hV7x(ugZ*m`ah z=ajFHjEF_sx)s2Xs=T*J2f?} zoul(meoss-sRM=_$}&>+W2`cno+^_mMt#!9vVs4HSA0aQ2^ZyLOjz_i^Hp`vgN+f=`|D<_6eW&!DSvHpHemunrPO zF_h26-<_l+sTW3G4P`+T8KLAL6QUT|RV9=P=S0YJbX-)3!O~X9n8B4@2Cg|yx4ia5 zR+Ts|^UqMR?+K-#n^tU2_Y{$!>WN5Xds<$*X&IU%mAajlN~RPmv7~Rgd9{~H2$pIh zQrM}0!|P%wOH;Waf|cC#nsS{NYef=_6<$`oT0zqTZPx;owmY_Zd$%jKiEXHUUpTs| z3p%T{RatAmNn_xFo%>K@x!jqMdMT`Hg&=mk$<-_31QTn$%qoq-l$2(Tl4@i3OQjN< z_{!W|3~kIeDicHsWxo!o zHRk)-*&(a#13#qo;UZF-5Ao|9_}}!Gl{f|{>~7?4-geJ#QzAD+uN8TH^x)+&245Dh zqjIRR2AAlH7ijBU8;bRF*HX**5zgY5snnZ{mdj0&oHQ#UmwL54yQH(25?Q%b=;c*Q zw-1?2NAQl8t*|F7^41;wo!OTEnq5j|o45tH}BD1IiNCDFfg8ybPNSx!;-{1zT5n zlby%1DQgS$Zg=4)nWi+`T(jP84eo(98pPr)ed2x&u9mN2lBixIjdnK;hB8{WTk4Ii z%{6{Q??!MX>|JEhY+*gVwhrbT8}0!1mI~Sn@C?t@jK$lwMcHj9Vej>mWcw`L&U5LJ zj_y@*_w0)*6Z-_OITN+31~^`O4|$F4Njmr9tW!IuZS5UDQ>R{8*z#6>@AD*(YLYmUAx5kjx9skH+=HC zr+jM9V~Bcg)o{9(G-~wi1$Gx%`#2Y<1e~?2op$Y4xR+4B+n3b&_6DZa_tt=%1Hrf^ zMMFAu&iMw$E_zRhBpb(i{x=Eh=e7ykZ+lCSoHP90Zh616uJ@+i^3xCwe>}CGl2+U7 zXkP5+a=-u8^JiayvvZgn@jDNtx82T?b!#5Sx)s3W9Wbx*V7Ys~6ddtg)wEYzfAW64 z>f-Zoy?8rB)SL0Y@Yx;jSwzGAxN(f}5&U5g3w$2%@1w8cF|PUP$qwM(J}zmwTeZ7M zzr2gK2f4AEOsu>Lr@M)@+XK7Wy|=qElb`denKruuodmo;+TF>~H&#zStJvS6*uDrL zeN5C;Le5;$M1644U5H%2ula`(Nr)dg~~fykwS_y9xs*el477*JVxD8t$dxhwdr z%VP!x&?Nhgc41{X!^WZfi^6Xw^^vj+c z2x|@Cm=4Cj^7SAVG=c#!4hf`7et#4w51rzG$jktiP<`Dl-~1=`^ZcvRat0=k0T#3X zh$0;Y0EMgD$M(vD+Y!Km2!wvNg9N<<*{196ww>~t+83+7<8rufuYO3qLG*V3EXu(s z$Dn#UAeY!&0yjq4vWQs2VNk%%OhCUzN90gZ{7gXZr;q0 z&_I#D5l(k@*Wgdqf&RAN4ZV5kM7mki{m_-;4n ztma)%$S3ROeI`kDnQ+XVpn$?xKf;)vVs9S}F34k)s`F>(V_`|PWg)*+QIb@TWIDYc zz}JQ{EJV(cKfn{_Fp-WZAqmoS=sC@3F_C%GF4{58)B_gPCdqMaNs>@zaAIHxm7)2_8GtL47!#9-)z7Lke-X4siGWWcD4WHgsmQY+!qUzyB`HX06PwZB6Yt&!!Ex7~o9( zamJ3^z;q^bE7rhr@db{@W2nx{U5m(v5;cX~an&(%H#u{+HE?&`arfPECnd1R&i5%W z6BiCdRWkFeHt=rV0eN?s`3{}=P7>(#ze?tmgDi4kHI0Z0A-^v;JD)lWz%&XV+zTMH z2%4O{b>Xjb`5q(*Db*mfeJ>Bns_@NK0j5a-;XwhJRS{iPabHC)YX*SVL|nEY zM~Eg*mPl*|3?Q;2QdaGUG$7I)G*A?ERgr8`k$q56WK~slRh4a0JVa9>S%jfj6f^~q zFDekBP=SZugUQ~3^;v{T27!qbfSw9aje5|CW7SM@)l6&B%tDtfLQ^AFl`>})v0hYi zEfGN#Qilps_kDm3P}K-~&>U;hnS9WhWz}7D)m>MSq6AUfY|^4e*LHN(c3;%)TZ9>G z(pYWM|9H>`Wi$BZW{|X~yS->omZ(<4D&)wj-j<~9{iQD_8BjJG(LNe6vKg~3i6b-{ zqb_M-x{>0zX%k}T_qoD^Jixyjnrgb4vOk&{vYDB>nOUl-a$^{ZDjV818CDg4eZSxX z9tnX&kJ1hHs)+rMafFS$>s<_NPb_c^P@@dqIJ)b&BdeL4V(Q#v%xHeR8D}EpqsgPGttH) zVLb*QIS;u|kkDlpc4r5RhZuQb2LU6`>1GFhD!>VI7jPbcFbASU<_@5G0!-~VpY%HI z_c}>01LWM1uZdiB-CcQ8Tvgef#ao;i-CebxoTdd_*x3=N+?}1>J;GW%qMkhB*gca{ zJmv!c3q$~qCj<#h=L~fOrxq_pOs{DH@0JwzrY8iAWx!>xSJV@Np1V(+I$*Q~=+UO` zRkQ3_l;Tr|>2o6Bv+VA9qwYCx0N_dS&ua0?Sav=U01zd)uY)LE1prod-~p`x(*giG z_5kc>z~gdYnR+0zyBCaxPX=b7v^xN{)pN5qh~6VmS|bQ|1#rpkuh|-WgXz7k4wz|i zVO;TbR);5I`|axS+q3nz@AL0Kj?iF_(6H9fsOQi)j<6(;u(Z~&tmm*ij_@Ln@G>l; z3KkQ~09%+R+aVA@ZXaeg2;i?F(hd<0pbt7U7YkYtdWQ(h%@GwE6qW=l)4Bu-26Ok+<=y2AqKamE;915o;sEmxCwcTxh0QWe`W6g5#! zHIUmuGV{`s&#+MRumKL(C^ViZerYLTtEuDI035?4iaex0oQZL17$De*yV%)J8Y%SH zDCL@2RcXmdFPZ2#xx2YZT`zgWuX&y?xybElPi;95Sm0a+1)S{#ysrgN7B^;*o1+6S-HZ7$?zEtFEP8kmmy3N92H+?udnUmLW})a{=TfA`};GR59+BmNkr9g9`KAI&<$fckVh% z?&g%YD$Diu99#fPUYq%DtL9rrpLUaUM?=**AQ2bXkPtQrOO~4z;!5a(X9;M79FV2iYH5_Zu8QnFA zipp&GojDfVJ66Lp8WwL3_WYwy*h2`)-0+nBnHo-s_&v^*P`ynq9N~+sqd0y*OKkWk|Xc3tM9UB*Rt=&av<+Yuzc$2%Uu`F+!)DP z*WB3X_}G~4+HhBl8u3|Q?ZN^CM)~K#b@Oh_e$2mgZHM_xu6mTS`i?ifkAV7(A*b!U zY%C1$%!c7jwCU{JW$vtE#m4b0V0O=bWNl-2VPNp03i#|&cTJt}tn+psfNu>`1Y#f= zPGIL9I%d}9y-)21V7TDM*>*1g=|PXsyN>C7k1jT*JpJ~=w&tfdh6DX39Mg_$2}Ue) zSMvByi~LT@x=*Wsr*(X1O@3!>-Dh3Evp&A_A;0sn?(<3D`7GbXqTYqHvSHn`6>7c% zLQ6!NAnv^&Av|$p!6wX30M1$W*0u&g_-HFoKlfaD~^@jCisgJy*|6&*zov?lMRTkmg^W5V9%pUl7 zs6S!|iV4!MNI;TgK*l6wf=Z+DE7St#uR|{KFGLEZ3Dj9=JUKW-t#@dq!qGTV>3Elw zLu0X^wyht(9;Ej~aImb_I>VStrm}dvU*BO^N@wy!B5-)aS<2>$WHPvXVOg!_P*p0j zV*}BtqpGwGJw9Ofb5`n1hC&19BV$u3Y;trw&qy!h+oWSxM8PPIHoJV@UO(VG?6-IV z;c)pPIqLR?M9^Gc)}QN)IDWxP$9Hlx98G3&djsLQ8Z9OnD%1I*xSCEEE44fP5V)Jq zR~xO@yQ8>UE`gh!-fuvJOe?i2osOUfsbm@!|Bu(rhJ+;>?H2o*L06%a%Obs0af+?2 z&5q}Q#y(fnM^L=+90+*ja%?T_UeN$^*)qK-c1Z_W> z`{E!@_ZNzsgkkV1?TTColGdoNK;QmZg62?(% zTcO6$T$iK9F?>L1lUN~uq)D6@L6}Lr6rE&&|0h0$LE>ksXi=aoaq5n%mfe_Xik=^g zS*lUAq*bZRrQ!zhFv#|d8X5pWJxL`QzZyLtW9k{K-#8mm>|NYzIV&Ps$q%`&bDz*PTICp?=<>7M#gE3JSWoW4^_>C(>PrZ zyz>Op^n}yMyseGeaM+$r(Inp|yvvLbqO8lT7-5vloD}_}%e)*vg6o2kysYb@ntoJ~ z>ynoJr0cStKZ4teQOi&R7FUfH+lX<^q}#e(4}$xK)3mJnrrUOu`*jp91i_T96a%bz1&4 z^zp2^2jG2PKP~5d(Y&o^deSZ*=6%)u3Glh@N0j%u877S3x$dCnH@KbRNA$g)lb82> zSkjN-zBB&zZ($qiA7PsZwEs)krUondUy$}c5$J#4{b%nR2nY%U2tEV|B_s$3IEVl^ zm@qiFgR?+Z_xW|`xXC3?f$py{co%r7Z>;cP`m$abpHqF{(`%|*1wtVFQfZEKsN;i z#s41v8|$X}uSNae*Z%^$|3SO|=lYN3{h#39C;m(A{(pV{(!QCPnEt;2_lp4YU9YF@T8ChDg`=mZuF-tPfUh z09I=T(`=2{;fUGgM%3*^)#c07=Eqa*FPGzM5aZ<(>fs&e5&X+LEW|%5>{nbwNMdAo zN>o%@R7^%pQcg@}VMJbeSaoA)XK(1lMEvwn#!OGiRDI(_(ZFc(++fIdkHnn1;QZqF>gx32;o{}x`t9xMA6EPA;q~e0@p$fTVd{Qi_Hk+D zb?N_6*d7UcJ_Xm#{6(Zl@7XKE}nX{g1F60M0!KrCz%`5Q?hbnZZIoUoVd?oh{Q=fA}SA zTkAzO-pm!7v408M?Tsh%rOMMLJdZbei?zn%U&3~?ZF435&uE{HmaFaFpKyfP*LGu_ z*8&my(w%L0$6vyBinWi;ZT)zO^>%f7t$ROs577HquA67Nc7(sg<(RJH<>{IplaGVH z`{NDkYIhN#o!9vt1kyrX=n2|lCvXUVMBo3C`0vh7wMBJ>KqNIRBEFNdk~t}$=HK1l z{E`x}p+w0)bor#qMht$EH~%#fCxu1Zk6;0YhZ@5BX{gG7~PsM5KQSnx9dU8TLhBayxvLpuy?=V{g77thcs#V2K zz+Dvk+60qL;*{Guay^Ek#|+O_^7=COe6e;_)3Q|pt(HnUHNEJL8fmrQ?L-B=_GM+q zB|C`smveJzb@xYI?Xu!p=)ucG03Au3=4KF0-R5Qp%e?Yt7|;FuW`yWB&Fv^@ip}lV zkCMvUKQ!unf2bHnXznHw8*T2sq=?G9DW0eEyJ-Qat{Z;UiTmqVWx7fhM`^m9Uh)i+ z_%ZSXj#`0uY4eZiStdtag-)&Cw%YOV5*N zzzuIWm%?r7tw~ZrukjD}?Lfi^(j6~t7msyx@{`_GIMcb_{n!}aidmnl%~~Nhf3(*n zz>uv+sZY+9MMC7KZ|j*&#gy83Am{TbkQ9tcLeHnJE(%9M$hhRp|X9%;X35)#jm z{{RCe@;bD2T_=(qHRnbOp9&*kkvNun<^*|+4PjBiNBkTa0`0F32z$#1*!~^Di;r^z z;2Fc3hl-K_MnK>dpvkE$kYo&IqDlj|QQV=BUnvp8Ayb2ipd=-PfWq3~GNBl49AcP% zuES;C^RPQYhiLs~e+?NM<7j(`L6O)0^f-?K4N8gSoQoqGfIGCjhh}G(LJWVvoukPY zl~!vVNUjt(ps;Qk#nHNn&wwByo#q&#uAWWk^T}np3z?8+ix2KqDOwNFkWwaqKuw4> zvkWICxSo(8fdqkK9$FRG04gQ}rOdfpJzFsT?h!sK41gnXiIY@DS#t= zUZF%nULiq~JscDuJ)I5$4wNA^4N-!5DYy$f5Ym`ZYQRv%BJK#6Uz+^o&#;QA%oc(G zruM3G3aS$(5IhhB4uE**rBh3QDc`cNTB{Bg?vom-{A z&p|>{2Ss`FMfGQ>02VlMA5)Ndgl51}R_2ZszYe2T?f1kS*(e~jx$ye(Qu1SC`_3TL z0k+o6_bS7mNfH83L2J`Sq^*%zQ?jVuD}fV^bz?)3#@0fbf4Xn$p#(`i`jwH2`&FwU zRxiL6sF4=hmC+v$th`>r;6g&sn?HBX-NQ1p?@qzGz+~;UPpB84PlFgrW`@+=y#qh@ zNYEdNWCXL)6$7i;`toYO1q@iL20|ou9fAIB=|8;f`^ybqh zX>8lJZM(5;r?G7{wr%U2*tV?`n+;E=-`{6uUd)U6C+>akwXb!paBB(f?O5o2u?{E= z2U{clWAJ208*YTHkn%i;x?!d76^BKlPhX|xBxTwZ^AZf*Zj0=ltx?C2?i>!axZ5no zQAh3Y2(hcb(20amjds&uR|Y)saa6Cj)ohMeYk|c%da`HZvf#oNOmz&9rs64=HTSgN zI3)#*l~n)s)bU%R%1FbpTdCF@02+!xq)y_V4EvcGoTwL=t`zyxX)DHSz*lrk^bkF1 zpx5qm40$wKO47$DPui)%Z>={wUK``q?#D#%4zHBE*%Ae<+o>`wRxQ7nvoWSzxaj&x zLs2t`BF=eq>5=4MHi|uLEL*I9uO@qybkw;vwy5~N>X+AVZ$_`Ru=`Q{j@2q+Z*np# zhcn-y`7kuXcWFhOGb}%Pr+$BJZ;cEbAEff~0yhvk{~C%2S!IyvAogG9&lX?>MMS$( z`#Rp0;a6U!CpBaE$b@D-*91sDX!u{wwj`vDs3QGJ8{;!By~UmmY=e#!F0_xr^CYRk z`o^ALLzURXHjtZ5EV)v3`uHdK8n(qeEu%k!j-`Q@_2!FN1cmdlp>lagi8Oy7Obn?O z11Wl9CWKHFsyz_O_DTx5PxvN+1Fsz>%oD2dJtRR5s*+rYzfz_ff;qr7i~}v~H4z!I z5YZVmRGo)jRy*{4h()W1>V_WMWIT$sqTU z!q#K^StBdP!1Z$&o#;s$gWSC88;;>Z1O047AG*Ecw<9Do4cnib2 z&EjIt1OYJdxz@35Jkk5137+e5Gvm?z>hYV}zh63I|L(`Xy~abLCS+J3{%3<&T^aM; z1QEd`@gXX)BQwtDEM_57cxgTHKby!u+DU^l^q-x-w`mfd2E*W@<8EJ*#6uE4OA;5o z=)dzuP!7l5jVEH9$B@~8lh|lea3X*C>HE@s-MGKAp6m-s!6}X$0N| zaBoT9Y*3s4D8F=2SYZ>LZ89KC5?!-Ue5+C%t1=wUGaykDy|OZtcr&A-(_?I+5Y=Fz zS<^<&GQz7;yt6VRb+S@rGqSU?prW&~ytDFfvkPppO0zQEV6$_xvSR_+!rIJfciH=$ z=>k}p#j-io-YD&~*;UbrN>v%q(K+Q4Ic4WrXb0)F-nn%)C=GyI?sJ<_o6Pp;Yyco< z$U7VHAZ3m>I}=QsTse_Z9{n%u3mPBHo#sVJ)Zv~*=WoT$>#NFH2IRqR!5Dn=D$}3{Me7*dClI1DctkQXAX|hq|I%U&4ppjd!xxnEFASbhK`j5imP}+idV2j1)kjyl!TEacL26i8Np7+D0C)PuXVczgWKLji>ln zomp!l>Qzl)ADtgIOx7Hj_H$f-BCO02FHLW=#K1?#eli)5DT{EPXqpvwf%DstHYPpq3l(qNYez>L5d|C37r6{_I zfwGzE?~S`zjqo207&-dix=g}R!rV(KJTsyrdY=ygjt>9hQGO3~<=<#HMs zym<&ent1eb-C;A7YRVDbaz)^>&1KuH?HDw3P_$$7;m zi)7_XtEy{nz3Uq?+x_^N{n=oH@H<2JJDEPD(QR5Tbvl-8@(iY0U@y3T!naHKWTk9& zr0X#R@^@zAcZP2TblWtp>SW4ywPtT*xazda)TFZNFek|ap1c5!c63=?fb1>6U+Ui! zsRA@^4o?1m5Ls`fCt=YOEPazGa(F# z=@YSC*?7Up_25@qtC#oD%dVJdWxDk_+oX%@kMu#HK6Qnmzo%zZm8t>zlX8G4^riC~ zrBt*vfw*m=_9ONTk=maF2oQqo_@hO#?QyZiOfj7Q;xi2yJsnv!S#vdgc*QlZUpU*65ky;n{*kVHQ95l6 zw6ZT4`s^OFZwwIVuoIYlXTVD%m>F9fBEO3B)a&sapZ@ThUs#wsnWl>GOa=mZ9r)t+ zE*c#|=CK6v;2dgsgByM=C7^!A$oMUgF%sfl*Yh9rGhBgVh~ran1QwaTrje6I;ET*8 z=utXS(dRw@X!Lm_0&|i0&2OKJVvP8d2J{dE43PIol{8d2X1VkXsg=Ano82?&j4MI< z3*vbzAu7u#q@*A+l)FYwXZyhsg_UC2AsU-$4aH<$+-2Rb)ldD|Vlfn>FJu$OkbTGo z<=o7`fAx>rHK;6cN5r)-e_VY;EGU&VPr+3rmEuB%Nffz~N&WTI9yu3>Wj8^TScCT5 zoqvYyF-5wW7=n!)K&Q;dM&-^%TF>T?%Lal9v0>eYX%9N$M_ZrlX1Xk}wrA@X;Zif~ zRy5<5*B5Gee6w-v)*bJ9ch7dej*xXB@DGjALe$aPl|7{%`p` z$b6hVMvCpUjW>tBbGv~thOGIwU6<$#MEnCP-F+M)9B3grC{|(_K@_=}eV(hdZ+Qn) z`SbORs2u(%+<6JpnLV`rhipRhw7UTZct_ru)9k%RK>NMO)5=+0fPfGPbam9Nza=`` z$fyWXP{PBnAF=FNwdmYYG(66{2OW(Mc@C|%e1@qz9vdg%XxF3AJECwama8k&!)KqE z?4Ee5A4M^u5Hq2WGHvorEu~za_yin-oso9on05`9rr_ho{_8!BV8S&^*oP=uZ`tYm z`!!}1aF*PQ6+L?p*t_llK7;3*OxZox+c|9@+|8U7_s9zYUz7cy7if? zyN9og^)9)xmn8-DJ6$p4OBp*}Q%9p)($xdjN-Wm@Q-bYcn zNbNgHZ;+8J3Ef9%Xx@Fz#+?$h+fMA8HZpow2zc)hOBm1X$N?`0etxLDzxpD)R~xRj z6F*5M7vYAJ>_tuLP%Zj^}Y#3gd z`##o{L7T)aBs~>9uFqYU*Z0cLl6&RBh#$L#x0iEZk3fU}?v?k2At2z!*Md5R)Ez1-sJFIuk=Ub356pFbRNtn(-@7w9}o5O72kz*!8yQA z+wn9l`5R7IyfUrEN{v2&*CrOr&HvZ1-DSnUP4HCpEom70y^M~n%qA`jk#24r?_Tqa z5nl5)&*1+yZ2$i79NHI&#MVmiDYm|v*^y5h->o)kR4w}B?k)KL7`FStqxhBG1^M3* z`<^byE6Hm|(QD~H5A70}FR8Ak29mPznMLOy{~5MXr74;u&^^h1l0f*2Ig=*|!NCIO zSh7_paZCtc#t7WEn*{OPA!%hIZMT0>;wnq9$x>#RH&1M>&7VquwDNdwuvKa zZzhrZK3%35jL;Y5SOn1@r#bTek6}BEU1^{#Q9ru*lZN8b1y+_IL#xqRG#+ zopD`x)@c)Dp9khf@HLL?m-t*3WwBog{<*+s>}#Ak`JZ7s ze~D5?!&KLy9sk7JD$ik-pRe9F;;!`^Z;rvPpLtBcwPnGv$~hA0_DX8%;H85DNSS+U z+byYqph&|RDd@2geJnsVge^rt@ue!B06acI0I{QHxqqXE3*5jlykH<34M#^$Q(>f!r~D@@|X|ZrX`VE z9&L8#EHzMUO3ip0VH7R02@R4{D})&l!`7_PA|5tDa_7lH0ZQn+8Dr6#nl}j7u|zP} zuKYC|2P*4KQtoe>V3hGlwm;ob!3~onMMTxXIm(-TJ*xLO!i=)2F2q?$kjEyDWL17m zOLrxk$TPf*k{i}U_q=Df_ot3=ye#|<#K_*)9wCct8%u28HaYC}- z6wzEv4rnb_oLxdS_MR|}2d$Bj!cOuyDufq)E^RRZL7tLAC@RVS~~6oT;P_P#xTCwliSs=Iz(WuHN%T+?XX!%|lzjmXMd!C7_p1_LtEF5O47X)XeWLMVD1dmp2_;A@+5pjxD^;0+O;xh?i zACSoGu3BW6KzC&i(hKBUB?bgFFFW1&6Yfs{!acH0{EP9W0TS(l^LhW^5*36`+zd zb6!X8aHe=sTa&)=ehrE+K`;FvMuM{u@J0*yH>ON2W!2*deN~)2y*G} zI3rvMq-t+nHMMBTDYFcBZRQHK4dJ;yBtd)QQs^@EbC%7N%JG02x5nfI?{=_v`ubk` z(*%sS#zPBB1v;vPZLNCX5p#|=n*W&rjN4ovmyS?~(mJAZy|AdkX`^zLUC{e+$Gi%zrB?wQMP6)_Yu>Q=4=OddEdWf$1l^%-YS z7Mh&mEJ>>LWva8$r1qIw0Ho;ClWDQ8J=gObHND!Wu4(?+T+1<>B-yAPRtSz8ZmCsa zT1jPnz8e|zy=NN1vQS}z=3+( zx3e4o;=yVPF;7DreQt!D4~gT!tv&7Z4pD*^y5m_Kd5j}>)B(g=^}kyOKae^lHm|Ie z%D9s74m`Rhc+DII;Cv9hn(eaxmO`=kMC(FA~ch*QD~@PP6q$DiW;!o4dEBjHhA>)V~QVIA4hzH}0Cl z`{!un6Xx``?&l7;Vf*7oijQD1jI%rQUqI`j39Q4IXK%ixG;&#*qj#YPIK0od#`boX zfy3E%_u0DCckowyi)Fybt(M&-U(rTUSl{lSJq*9v%r6=Cyq6OKvqP*{e^aZY_UFFH z0Hn~q0X4YvpDl}>8I6HkWSbuy3($e|70h+yxO-9OC&i9tsylZb#4m|+vJ6fd0ZT93 zZLzhUO-YjhfBx*H-HpM%En&aY3w?Ca?T{it{i2G{?hJVBgB~urcjfplz_Xc+44+fI zo|*V#nFr=cUApXQ3fQP$EByJx>mis8zO)K}a2+%+bEM^ov$gnI%2^w5S z9W2glZtWUmq8O5U7efgJP7al`G7NDkl(4(Obtjh@05jK72)T#F+1dCRK||C}L`z2$ zN3ar&i;Y4Y!yMB?5*&CuapE7=jaH<93AJI_ClV>Q81n9fuPOkf4UgQD1dh3wB3gS9 z2?Nd$D)HyA`cn?ha-XK#KT?r7nzjiamN6lCM9)o9V|nCP(=cf+%VW)m0mkU@xn$vd zA5=}BF~O)sYsJqnO6suOUxzW`Y?QD^0+z#4y|6;MsU-j4M4MLfO`r6yhf$a94toh{ ziJ~rdHjV{gnoMb@TdH)pi2*!AiGh$_cR%J*`D)IZ2St?bW#F4dn zU^OT~Q7{MUZ3)I#&+Kn2EKeiX;&ap`jjyy+ALWiSqtBiy;2pLiSyQxSEKfvzQnz(Y zZ-mX>EVG?|#zx>Fj7GPNsN`AkiQTv<-I~uWnR9SmjPYOQZ+~P_=}lK!PrNKE1A?YM z1_j;ZXzSsL7Cs4^w&x%uQSTTKbDxx}8mq4`*g-694M1hcws}drXr)-;qf)HVUo}9G0F&^N3nhvDICiY-pT%k*DJOAsA^~Oy#RYtSekJ^oEWM)hX5MAf(*IKA z(~pD+I2R%Pl@ET-;MWS>@N?sta%a+j7s<;ON90xcW$THmQW<~)aJdWSHB+}Wi>#81 z2s;bokJCFLECO(B;0?6hRNO2bg-8sGzE=bL=1dJiX+Gh!3b*z%3sG zwBe?;GkShz#_N1D8;EbqSb|f_4Obc{;WYci#>yS}k%XCIHg$rb+hIO3V78&(-CjaT zPND)A(8FUeA?b**QK2YHN}+|np_}3^Jx4PgD_*??p;wEcSG+&Q=%NU!$?zvA-bos` z9-eN`o9N&iAFLGIsZESnqN;NR?$uIle~N1yZ)IrwtOJrz6wHt+TRvbCqU2 z7w%hQn5@U2KWmJs-bfP%F^LftShHp2&>0o(-M8sASoDKQOl)Vc4H)pAmj{a%@=~zL z+(q8oWOfi2`4*P~6-uFy8v5^y`Z@OBIhUl+8?L4@ysoCVCRt$Xf2QT__fqarb`|w4 zw|DnQ#Sx0MSf~T-H&HC5iUsu_nn`s;33pqwmc;d7;kS26Tb$nHS;G$+DV11oV3<%~ z7*V1a3Pb3Ez#-Jmkg^nVQ0ZzQfWco@(Z=tbpXLYa2%Ds%qtd@1sl7s|gF*tW;pnsv zDTEFqSWJUO4g-H41{#}EN0`!LXQXa7!j9vi7vPUl_l!I4z88-ogrb5kv=BtY4Y+Pm>U}(;A zGp-0T?g)^aQ%R6R*HEn8Wt`%|2ka%q2c;X&(Vx50t+k0Za zd*TS@Y5{f%7%}zy;4`7?M5vfPArqv4UEmCW5Oy&H0A;$ zHZ_z^gDp=(Jglq|tisDrBYLgoCR6=JJESO&Q_+_@XZCQvjN@h}gM?1p9jz#Y&Jy#j zBHB+Qxj1F>V1-RYez;9IklQ9qp&g~2$Clc-E1hu7+E`=R6Gl^~J?Y(*l%krx#BKv90zQP*?%!p#fZ`bp^Qwv;|2~u`T5mtFvS5qfb%r}Q#Vjipv}=^e|3ZZ?^&E0L~}JRDmYH-_UJNmq>< zcTMGrSG#8&4N4tylpMFEte1Q3iB5{^30N+W8jx1g7t7e%9h^Wrj<3BAxAj*i9@gK$ zi;ijJMw=j*ABu4{vH?Up|7DE*dAa;;cyn8R;ULttGi0{}d!H*RGg?akcWVf*ERB$H z)wg>G0euT;#lK=E4(i^Sf-)lW-F?;gb%aGA$z=Dv;0n9K=`_LMy4HDC5Nu$H8M`4k z*?4o0ZT@SE=;5vX>TXo5U0i|yW5Hz8rDsM-Ec}7yPe1ML%~J0}^=^ln-tD~@^GsK? zuBm_ogCX0WdjzP5UdLaE9WIc6?gV8YdNApZ+cbg8hx)v3{6W6*hwUyg1;4w`?>qdU692K(Agu65|duMqj%re?HNz zUE}nfDkVQUIP|7H>-@*0fh)*6lHad`eMiiFGG6Y2ee0@!YS~7JAQ)cDi)J}D?DRz5 zr^e->QR{Bm_ly+i!5H$AQ|Hn5bTtVwRw27_fbMfVeRNWGc;3YD2di;8{Ixfxc1qjX zbhrAm=lX|7X=X=2VKl)8lb<(d+*YeX(&hG#0B9Of;LnHOHSp$eCSi$vqxaF#E0WlR z$v3{la+8E|W7^SV25IUCd(}5CQ2gJ1#p6w#CjfcO+wUZ2U(Z6^Ch@~y=k!yrj~UjL z=+UH>wv{QDkz@V=%J;7OX4X^hKPe`SN3?JuA#7$7uZtcNRBw&VJ15j317R%aE^xlLgv zGdK9kb$@j4eaNEqG36hec)IzoRNuH9V8`kepaq^a3pkAo2uKVV`3tRu z;=g!`8Z~G9sVTLXJdFtscuan|cN)sh{@U#Ge}<02?&SJn|9MP27`Tc?roVniIvj>X z$(B2wNH!XWO|9GNbzdTtfGV2IVDmsRnM$Yi|7+NOU-)l|0NSKDliP`S0HX`$#)lfA zXdoU_T=x-t)<(acVj$~70Lx`Rm4G^h=WzMLxZUY;x>#rThiSLl=g+DnP?dJR_Q#Kg znX|^)y(GFZTS1`4iP&J|Tysw*52?v?DEH&_)f@ZSe6e&2lf%2)?i9_pztb@~MF)eJ z%vwLHURWhJ*$K%Q_4HaSY8xU;m>fTO9zc^B>`n=~&$6pREf2knszq8WYZH##^nSi$ zdw`7?Y^CnPx2M^)7N=XV;OFbZn;183PsKpEu?>5AWdXVOS5o+n)_-8Fq@Z<1O;zu+ zJZJ;|M_C@ya70u0Y_A8!h^{-KsSV{wr z5;HLFMJM@h!S`44L|TBCN+iF3rJ+_dt!#-8*JS2yGD$H8r4Or|>`@{z8?Jt$fzKOd zrb*13PC6`R)lw1?pA2P=n2U{Jj^fE#W}0ofELy^86)#nR|N9$tVQ{|NsjwAr7($$b zBy~ubd!1w~Ct!kyER9MLxDlUv!E5F0u6d!FuZTuRQ}urg+vBL&5T#t7M;C~eRJLfv zu(Z1WB1o=OP?~eT)@}-k?0Zd_mu9rN!Vd)yc0(6hCSB`-96w{5Kjq3rP5h)SeO=4p zMJ2(cX&Xc8FfHs=j^1YUh7+nT?^S1F&xxKXqNXo%@7qOJL+*s zuiu=R`zB2$!|wLxM*c4$r2gj2+i7|MyeF@em^`O}A3dIX-hr(yQ!u`5oriYByX!~I zb%KQsjg<9V@-}?|z9)doUjEy{$?Ji%?U%9#E%EpfLE2dd9!KNo>ZY zLshCROtIGeK2+vi!L;Y749N#UpfDc8T6pWcAq1;?zx5Tn`xcSeZv;Z?J7NbKVXuT00?bdfznjzf9MrFLG{EjGUk+A1-9k9wy@Xv~VNLqS3Q8%o$_Y#T! zdXz-)7qeSdwT5U_n_?6`4E}!qAyRdX5{5Q`I~&49G0Spgd5m9D&LCAR3rlOJ=|@g* zv|fV$uI#0^Y_j~r>tBOKUhpo4Wd5m?0=vz|vY2eS5>z=Z$p&WQbz45{7g!&Wo>7+f z?=Ed(sFF3ool?trFd!HIXV|WWi^ZQd5d$Tm-22BS``RYq`o73cEklcOU4pVLCz2(S zn=^VpEmVl!`eeu?(qK%E|HG7EQZj88rE|e1{q-ij&G^Hv|9^&U8w``pq|Co8C&Gyn zL*uD+=_jVxBcGY|=zvRYk79i@uc{gE#g_amb=aB{O=+avd*Z`aOUAQcWW!H#wA!eWIGt;L6tAWIXxm<+9C`oX;mJo+B05 zP}PthsX@{L`}YZYBGo=n*#ztT7d(@hjL~Gj^dEG2B)r(#>KwyM)HL2_!er8_HQk{p zT*^9bNPai84k@lCQ0EU8VS1~?ZR?@etV@n!`i+!cs_&_2$aI%r0S5n}o@>1WO3wa$ zRR|mJa_H?$?XBfI`Lw@adIP06n>D`1#M*pfrDUA!eiCfKJBSlCmP59-T_Y*T_--Dc zb-2V|@1F^s$$6@(krL$mORJ+uFr}PoncYetj&-)LT{4WuuB}|CVO9Pa!T>04Bv7<6 zyOG*j4kgJto=5aX?fz>y2&mLBk|33SLx&Eq_;Rf$g?8p3T|^zx!j0cQ)KX-HJIGr? zn>XG%&q8O(|EEB06w@>z6;ab*paqdB7Q-Q`TFrpIUnBO43_DBxeHPavE(3d-x=Go6 znq}#kvTW@UVanvN*LE>c7XG-~giZGJ@UKQ^KM6cg z`7P~40|i?g)%&r59AMfKjG8uNXOU<6mLD>VK|15TOt2(74I_1z^;m0lRQg8tT9@tG zc2W-!idz+~$ySjGn%J%{4f74)D9u_r{h-5E-BZc1fQh$BsYYMAN~KB-n>v$80WO!H zv+utA;M4F;aJ`&jix-QTC={eA%?8U+r+j3JTv=`|_kuZXG)Dma-i|ANYMjlqjE1W_ zI17<+mMv?T4y?sd#SDj>&Ovq84!0JIHMOlz-Ifwt0c9PSRCc;Ea;U90)!R|WT-`@s zSWd*~+eI37j{c7aZKZ!Azb6m}J7H_0Pj>D9C{VIhyU-Ti>S`}p^|ad2>Wdy@^0;=m z=|Zl*kKYR0J+SBL%7MQJ+2HKi;=lR~A?|Gc>ON*t)*K`~HzpD1k$P_7}p+qpEXEBphaKD_9E|)o5?9)jsK3X zp`*PFrtDl%*kG13}9k2 z=8p|Koe9o_H%ayw59PdWcDBggKfO+Fs_)=G{RO>uRaWB{e;3}@_;)vCPux?5ERK{e zcNP2kgkF9V5gue1-i3L7-J>Ue9&>}Qavoeb{58y(4AiN-W`#Zxh29Txz#kD>0*Aln z{2t+xSCxC!i@#8FZPq?U3cd|)eYzX{qea10`QWs@qw6uYx4of%+KMWpYn8cELK0|O zz3*rRU*W`JaRuvOQDgMy0;yliyw971`@=sxNDz`Yp;w77I7uD^Nv;HU%SPm-0P}o^ zxO~rWR3>`wJh})(Mcp%ne^y8?j|&iQh{^g9YDZw&3DJ@_R5JiLswR{0WJTC=S!hiA zUz|k{LPfAY#vQyf9lyrRU$M~udZ$G**s~_x;U+Mfg|7$3k0W^)tP6c6gtNHmCikSf z3q_#-k+2KhS)^KRI?d`Y^ImTMYt!%#1E?>ek(NJ zRV;fXs2s`YU9_n2h=~#kiAHzhD%VV8=iff#p8wNwwlSgyA4c_%K?sr22$5m1$@anS z0Lx~#1_;5U6QoezOE_XOSrSah(~DU1O}@1ypkbN@B91W?V;@;dd{g?jv8K)$voD-T zauiJ#EF#UVO7!)KV)pbCpn`LliHVVR#QQ=nSZ2mhf5bp0HuTdZ^LUd)g_M6KPHc2N z_d5UitwaJ1TLi6yA)@#we3GMQO0=GY#0FFzjf>*4DUl8`)c|qsl1Po_1MMkXe}SaF zEmAt@WDMlW?wXqxfv645xlTxAR!d2%w14=NCT`&5Zcr#u9jl&~l9z*6^Ch2Xvs=Ge zkRC>5ARaT-6{|XyVX{(k@litZDWF!X{Z!gZ<=M$FDC>5n)B~H5E$*QW7E8i`ayfA|BT7%_091}gH6B_R_xfgS(3)8mqIMMgGVF8`u9-U_$IAOGM3(Z6m zEOPCb!?62Ri`8=VAp%n?=gm}4r`@*m}pAn`Hwf_x_*J_!z2c&m^r8gJ(lT5}e zYl^PaKa4sK3eF^WwIXEmRF7_-aMr?2tO)fYLsy%cxDM$?ME}FyPzKHV+b*6VSZ*&Q zq4M{3g>x~Xx+eCid;C>cYEPI(5Q}ncc&2s|g@T)U)H_M^4NXMmnO!sJy^Z=hc)Y>@ zzs_V$#WpK;X1Wb_21T`?<-RgiDe8A}f$|~IM;k~pP9o1 zEw}Miw}E{Jy?JND&#WiA<7InTD~^`d@6hB+706dt6^ugXw40e0lcX-f@%2_K%!Hn1+^vwbE1)MasNF}vEs=8+L>Fx?3()pZ-QOcw?KJLY= zxs-VFxVKp8dMWZkf5ZquM0*H*e|bdbqH*nwxigq1My_~bC*4{K+qU;WH#nZQT<_$% zJp3EZg|T73BZDE$C2qPtPx&l~kU5hs!@x0>SL06txJ(xhDi;@q>DllxrPB$?Tql!C z_Wb?%qO0L}dk_sZ!i42ClEWC1y?%1dfK(-yZt;u@v}qgZ(2adW0{)hYGDNhVBU;_+ z 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ɖqQCc)0NdOMtTmVk2Ye|+se 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 S~-_C2fp4~3!1^;(eJm7zk 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

    >u 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 NCf{Hmzi=Rr@hKT@FFL30ylFlPjmL|@)vjW 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�G+YEKG|VJ)H^=qK6HNY5)y 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 z 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

t8Lu_{VXn2xsb^$h`Wt2ddR{$AG zHG2!t4GV@o709$VxLdV^0zRsNEdXFk)JaPWVrv{@Yl3WRl2vO8pf#<$H3QiC>!dXs zu`QReEnl{+(5kH%&{kUBRt{`SlWh@cZJ5SoX5j%Pr zJNjii2CX`V0Ue{|9l)2CAjAey&vyUz0zUxuEMdz|Kzrax$4AWN`bp;|V%Iif*RE{W zzE#%&pzEl->jc^^r66QT{i5RME#c-p72} z$BNYdK_Ah0x5F}a)|X>1ShaKV{|9}9G$6t>ASyQ?Zap9wIUrpzAUi%Fzt;O9B#C?AkrVm<8kU-XfK zb&a-nr@CBcG5N^iYK>3iNO;8vV0m0rs%^?CdM*>?bfbHYJ&Qsw3D}99Ydz$I@tlaN;>;IsSUV)8r6phw{EC0|(aufU3 z69}GDKk`fe zhdv^n)hn76IGYtho)cl76P2G6x0z#M#sUWiBY%Pdhy80IL4i+#VM5VB6oY|jfq^N5 zfeHTyh=lha8WI#37{q_$NB{p1K0XEq28Ip>h7Sft0|my34yMQhW~vQlZwBUS2kv19 z>0=8WW`>kx@bL&jl&(sYq<|kMixVS;8Yzev_66RT8NrDh-V6s;3kzNp1BD(Fg9Hl; z5Bp!%2eHmT*cIiW3`dI&0pXr}V zANT*m8~vAS^ly9a588-}i-(hwmz`ajfk~f=-kO}oiIm!vn9&=bGZ>pU0$m^)LnIDY zJcdLvf?39mU)D%UPE}T3Q9(gjSy@$EO~+94ho!!io2hG{gI}0OV7#|)Nw{NglId)g z{#LQ!agFIotNrnKz~OSt-k-dsho150$?n&cj<>be*R`gn)rQ;k#*5|Fote&QV9(e{ z@6d2>-%wv)e{XMZ&ws7%uI{d`uKz@k{_c9Z+WMN?hKrl0G8-4OnhzV>jt1L~C)-aJ zJI*(Hu6O$G_6HvihhP3~BY(F)qYoQ1hs(?BE2|ru+uMH*506hyPR~y-Z?13e?;oF@ zoqL}A z&U6liz-S`n`%pixx`k#yMZ8wx)E0;3ya}-(vCVHx}uUDN2I!DeQTC0qu5BOX}Z`bt_dw8kuN)1Ns+>! zU87jRp^^M(DTLPDc%uChsssg`FR_W-T;a-zk{Z%`iP|(r`!RYNY3Rv@j`V-h%q_)= z(iH1j|D+pDNKIxsFIdnDn3j|rWO?5o9c1Se7Js*uQL!*i6R7(_EfmS&5u3|u^Tjy# zqbbNd-HgVwG(Cmj*rHHDAM4|JO6B<|#Uucpp}0V>j4l&IXmMVBI8Y12}7j@Hnw)VKo6V zH*c%R#kw8qUf2e)w9YTQRJNQ~Wn73qaI9YRfSt%*wjGlY+4nx8@K<+S zF^o^Qwx6$@)Zm#_Tn+W%0C(iXXQWs~o(j|)MQAA#ImW1(y_H89NnNhTA*Wvz$JmD} zIDq^Qr#HU|_H~^mc~Lv-fg-AE4O0-ykvEg#@2?oM!jx}ybF!p1pC#1XDsLAxoNSZ? zu}?hNhs}#C?^m|h?;S+Nxn4etJQk?AiMXLAK7fQCZ`Zlkf1X4&i+Fvss3_=dEcgB$XfK$ldwnEWiBR<9zm0SNm;{s3Px9p;PsX zM5U_G+e3|NQ2UOrte?Qa%8g*xv%gn&*GYWyJOA-k`^C%2c7~nD`q6GSShkrE@XCe+ zPA&%mmj`v5_`)A8G6$-5mwo?NsmDcoD2$#XYLIzNAQbqvu-Ib^YI1B4tyr$G8s1kN zPy1lDNOCx3^S-F5DKdr*LnO(OID+d-3Xq^RIimbwA1=;bpcMZOj3`|{DKC1sh;tr> zCWbiO{bd->I0dHLht4%pz5F$nZfn&IAE{?+O zR+Z$vcDUkpn!|5SjtrV(INb$(>9N0~piY)rPDL%+ElzG5^i$CczHkW*~UfD(u5Bl>;wk{uP~f${PYJ z3yG@aqdi11Ors(9&H7N3eQY|~^ERIhxl~G0W+p!Uwt!CFLh=ASCb{jlkS!P%Pfcbv zedV@@=Xa@s+t_T@^KJ1{M^KA9x8lnQL!oF7wTDXvAC8a#)3kqT#-hCIC5 zuL$)*{kw8q=o5)11`XGAPR48ZP@ToGg{H24M6;-J-O?Sf+~)zoALTOq2z8qNw=QIU zZ{^=PDVF@8lB<7;pBkX6EcN{usEw9q5<%h99@TNBjO#qr|>;O9kExpI50j1}NicZ!DL4#{p@r!OM5jzD|Nw(H+Tr*vKj zRC`aJY}~ChcidIlc|Y)dzd3I1ejQ}}`L?q1DTB6)tQScu<&T(=px zOY-tKENm+4R$jOJf)o)jlcoeeNVrGC_cW>$%^?yZmqhWfH&W&ki=W1{&*Jq2G|-?; zD*j>8YJgvDHSGXOT^#?z)&7)hBq)S%iKYLs)IdLaDg^^f4oUkgbiGqmsEXsSq* zp|?H@TIEof?|C}b^;)Iv>;792H!A`g-j~_>exF^7L7TaV@d@6zc+@=2gy+f{-`dwjY+4)i^e&^jyhq9fA8TkQZn9qLb|A`{^@u?6 zW=nl!P3|GGJ9&dko!BXKf(HPV-4NGvcQyJkQ4}`F@EadGo!&V z{zP}h10%!l2{T*zc6q<@_;vo>AlT;o{Ab;!$GK%p`^K9x(zh_ZEp1k~25pqdO2&ax zAI&h<6+xS%Mb1?y@Qz9DNe?XfXGY;o6lFahtZ!?(hmh<7$EtnKZMNRyTj%FTaau|R=$|D5id$H{IeQB*u;Qsb?@ zB2NhNpR&ac?`~#=AwLmPe@069L4eygn%TVn^m1!*iIuc3M{|SRc0mC{=>S7|Cj;9O zb^{h8we|Q^5|233EM#2xV7~Q4N6H4o+fwDu=0{6p~^a_ooN|+0(vIPju605{( z`@xd?5S&8Gl9Mi=nauTFDZsWE>D}IEI@EQ_%!m3C^_&*XjwirgD%392M^wuPv`~yj zE9|?>jg;5p0-8b`%|Rn;@e0xmZOcIgDM4(Jc@!1-IMTXu;weTqha0AZe_$&hd++2! zL>W4?WIW%+6gT|?uk^=I`BXrg6on!j#igM|Evy5cgHDl~r=#i5>HB9n?GxX?7ZY zL>+AL)PnOQ)D#5r7{P(t6dIbTw!Q(eC;B6^ktF&zffq=w|sr}wi3K!cIXuX)Y!0t%jf=qlrQ@JTLIweCm>Pl)Jp;n0Q+~99au2S+O}jNh zyPncaStjVKMax*u^wNf~f&=&-xjUsHozq5_m4@%(MUVDGL$<~RyGMiAvd@PRijI=S zdC(ME5eBA^u<6l8Q<6t>G90y&Yqqk@VWXjygAmh#dY`;sS~K>v!lX;$o=Y=UJ@P~y z6azibmb6nze hcxr)XZMC9Tx>-Frq3w@G!qjGAZRa;Fxu9qR$mudhBn!5;Qtp>? zu(aI}rgJ>Z2u}}lq{<2smQo;<0|OsIrB^aj+(WfIldVHDjaMMdzQheXcxxUNP_yOY z(tDIzB!9?Ky=;K3%Ot1c6t=eFekny(8FXgPc+H+-kmq*1p`o)>vGV{IwzLK@f?>i% zzuF)CL_+X_k3Qc&{-w~Wr7x{;qYZ?;H3l(`Q2Ki>qiN?(5UZQ z*05K0O=EUeswpLHAaHEOoENjE`*P;= z8r*j5RZn!Z44f*4{F-z%yZKtWRa5*IR9bBi8YLSBP3 zdOz|# z8Phn-uvNURyoQ#5e+uzZrj=dn-cw< zyuP(~b5!bBrM}xYy90hLF*I|^q6@IKCVp#8=4%aDEk<2!h&yTud1*}+Y4#s$iSml? zZEKDLpry38C1teYI(Wdswfy9Bc{e~_P-^d^OH(9_6bp6x`~|IfH6cqDtqHMh$jafS z0X(0#t$(WH_e*2Zb8D#=TE(}{D$ohRoNIzhFsdGpCG<8l3R*|wNoO^m(;i~88KA3+ zugiw7qlXb~$E)M|q}ErbIYhc`k`W@1p;MNzb-ulA@dY=C&m?>o%tg#ZAFX@as|$9d zM^U!t@LQuIH}(}__l;Mt#&-GmNyh{uJPcUdtQFcvrEwt7okp(fiOu+K%NAbOtFyd8 zz@v{_5*=r}r~g|oUS_|h$ghtwqnt7rsdWpvE*hnGD>xEmO=#cxKA4Js&uRP5=5HMX zjDuww9fMvvDnu?lR)ebigSxtwY8`_F=pCFD{iaOTx1Zyeq}v7!2(Q5gzOHqbwYN3* zv`NZg{45`^KN)EBY8RCl0$sfLsp)DOXAWF44h>|C7+9m>5DnpOkC+jSnrC)US;SKa zBMm6oT`7S%yei|03^ywcON^IH<&qd_*`u9;xg~T0SFFQ{%zk=zA@W=9@Bxni?L8+p zCXv9%SBzSw(H>pfTQ#sILsSH1u#w2|U;IsTR;{@o7LpvUFFS^idC(fb?Xn>s1+1$Y zNpa^}Z?BbQquhu#lJ(W+k#+TOTzU>jSg_DFq>YvYNC zzo*vP0Ig&kyry2pX`S992*10cbkW*hM>vV5QRJ~NnI>`M>-()Ih2_RGtUE;I&?cD1 z1klEkSL?6A^`%BYk_PjA5w8Q?Yg5d>(6KwGKI_e15Y6KLn(d*pg|?q0)dic*nH1?5 z=Q`+qKOLu*9~-aLfgr~gO6%FI7*Spy#?+fv^hQ%dn*A&=uZcXWWi!i5yr6OjHbOK2 zBRqc5Gx~ZmDxo)!$~T2!#U!*lXUJ)!d^&QzHmHp}>LK6nvo_+jKCy+gM7TZw!)K|0 z77h9m<#~M4T431rZGn@9SOPtPU38HTA<HTNxP&g%crlIc%{vzkyHS!v~p$5gS>K`Z@qnHCvH{sq^G@e4R37~ z;%Zd@t&R@VIl$^awLJ~khv^;fT*p0Kd!K@=L)+L9*w`ap2WXQczxEtS)?Pw&opwxg zXS7S2cfpOc*Oj;Pq)ea-^kBVCt-Wn_9ItQ5Z$PnZ{Lx!&lHYunY~QwC<&s`U;_1=x zPVjndM>?B&6~O97+9G19fY9F}^W8#u>A~;Xf;;^1ayE{B?Vt&6b9e*46ZbPrpnqE5 z=29pjMcIL3+3_!3yB07(()T-N+~tz%Vwu<(BOZy={RrRK+!tpY}YjZ>jlAsC5qdAa@&|Pgz8d#6-?2WgSG& z?}JoHHq^U_DNoR}H_+FU`mky>SG{*W5VWqMiGau*s;((I{Sp6)dAuwjr~Imn@4V;6 z5!vX059r{{3{x}-t=Qxc(#uSw>ZcP*chvcDjcuPbi3_JSunB1-r3n}tePA?xk_9@E zg*#SdIcATrp5`&0Jp@x$U0kz1+31)s@f}H`Su&0u?E2=^H15C>d9pyVyU}s<`TV3u z@H~_Dlvm-ji>}UX9}{T1o@slK@p~RV3O%}OL<4ytljMMYdv9;!LeT7-oMrt);rMid zd+?Wf`mc+fs;O(=i;S~N+p0@;lymv6OOWr?0n8&yL=n`IU z`c?2s6?rn5WEQpZC@K1iW7CPCdl%yUYRG>>{S#U$a)^WPB8Yh?@N6(RYH^F{z+P}Q zP=3jX==Rh5ZM4SCzRyiX)Q#)(4gX4Ujh6%a7pLO~N4>afC87Ig+B-FcJCg5rY(LPn zvM=|64rp0>SR@b5r1#GX_wL{C-=*iEXqmSJ{#yWe`*hrAA> zHkF$F-eB7w#428Pq)qWsmVR{~ZOgVao({9qzsRs$D8#&-zMHpZuSm*mi-lM?3hg3v zv@3S>)Bw;9S+9OL{yGE&;qif{&x$vM`cftg|uUlalqFPiy`pPb?U%|b$) z-&=~O`4mu@V%27_Eu#4ySZejZt;6W@D zGR}SaFBZ}_kPF`e(@MR)$PU(Fb>2~|pa+eZ9@d@iqUd*2+w^bEDg~ZG?=U2~|7jtS z@HdQ37iibHmZaz0WK?FC& zJ6@8$xS&pkvASY0?PkkA?-IRsG}dx779TkvoDB3>Xv92dzmz8 zn`H-Ubba?nYMN(P{Zulg{Z`9aBw&$OImk&#z^(I-g+!j7473a##FZt5R7;1i5w-jPunwh81i&LS!CKYJKMI}k zs8<^5kZK_8gsYCXn529US?-F0J$~Gc-F;(KJ+^09)(^S{VKe;*-&G6SNsW=7#?W&8{;J1GL2*jz6)5QXQheNO@24 z)|>d9rzID$oiuW7U$1cIZ!&uqr2kq-oH$4LT#`m|0|7wV?Oau-l<$UA^B1`JehlZ_Dcs3(5QD z;am2419e&VTU_OXpzr&8%KB?&LihFh1=SH|I4($RCxaQE#&gBOpxJk>xl@FVpWh$P zE9g&Gcp~CYQYi8vC@BI6t^ut84>Co4h}50|nqc6yTEFfiF5XwA9}3Gk_Zl#*X!ld0 zCj{g=G9$5=>8GrW<5B3dZrx3T_I^1!sR{!FB4KFfp_&7E^#LQKoer15>>@i#bS+{G z=}6vc))biPACo-DD9+kJMnsB@gULwKwwA9u@_kEOoqLyV1h>1&Ybhc*k&=;LTM-vF z<}#Kp2j#2l^N6Uwj7m-`OPyup5~wfX`gD%O92=@iJvt8c2!{s~-r^=Gjk0pGQ^h9+ znK11eOS9%qhM2EWAr2cgPI8*00Z^_4VV2tX168|v(&~1ZMXmq$q-k_lQqTb4F6n_#m6=cTGNF{IR!cLiKMGeph zCDRP4OC7hSK@nI|937p_flbmr`jfmiuw*+k~IZwGvvMan_0bNNHL z#luT(=wVF>+4cZBI=+V%wQHv+Ex;Ow5U*;wB~5`Vl;SatM-dc!9e0fG9|}zT;tg<& z5(sF0`J}eF%{45BJCzN~>yo(Ag@IfF8G6;mHuY^DY#M=t@Cl@V7_X&#vTHmzjEoe9 zdTiAa-C!%-j4~z5Uno>72<0fy0iYQFR2MRH>@b}|$NBWVswhWs>mRJU^D$UsG%A!* zf(R-xAFO1*Ph$bd^Is#=4oG877#KvqRZ9(LFCia~9wuZ~N@nRk~GQ#j@5hLx68Dd4?~2 z;&)3sf4H#{KKd~e!O1xwzR0S4P6RXTH77d-_$i;cV!-roE@lGzgcrv^9aERh%72X;w ztRCa2o{oowM1GXrM(PH(PH7Jvz=tC3uH~`;Sih6vnq_A{WDjAA>&mu6{(~St2uG5a zwPR4ehxj3*-m&d<)Y_L*-0Y6K6NQJax4irLd4;ZuW^848KMt#<`~k#z-5=ZFn-ldJ z+h*147qeFFhQ&-*ovjk*xPCibL@QF=x|c!F9mpm1&u(L=te5EmtR$sg?x}V484(pZ zJ)`+K_RJuGRCdp1H&-NSE+s#H_-fe>XR2&*uo4-8IM)Bejl<(d}Gu~*Q;tz%d!xrC6U$* zt+5qxFS@X0f0u4Xlc`P*a$*L|XTC^xc&7w9x{PLTghoQ%9?e~3chz5IH$o^uy?s|b zneD|~;AI*RJjil9!a5?j1MIr0JeX^Uv4CERj#PZ87|3*nd`c7mA`4|u9~cC0F?!p} zA&3Wd05{f>F%!_oQb0%rh2C+)!#MXPuAiD!OcW;bYe#8cG+KZ8kFVTN$e;H5J~xOK zf{PMhh+Y#2Awl4FJm$es)?5B)yKs!^?Pn&~qbj59<8vNR8SQ`af=UvY>tI4^iK|btk>Q6@DHZVMXX5A6n-x)=8~mcv zKWI^Mypsl8Nze`BDomib`8imU!M2_wj+nr!Vq7G#HfT{mO!`y}E|Z18$hNN9@MEAi zIIv#wg#X&A);SMxmA9KvHQrE1z!WHM88j?&Jjk^NmzRTU$P{L4Ely`dNet*X22By< zmkMq=mAd7B9>wok01O9rV5$XGH7ySfsMer~6(IAD3~do=IkR6l)EMM_T5qpc8mm{9 z6At+-&Ez0uJT0-z5fi?b0;gJdri6Z%-@Un7BnuEC45&mz8g+{l&gLJ@sffS$#Co#T zv^14S@g*$WI-c=m6elwkVW3W%u?H7Q=Aca`cTR>_MDW->Nv$8>)(NiYRwBZ2EWSXv z;x-d8kt;rEs4@sh7~WZ30L;*atFs=AlWS@sLPEEW#Zs%sUZX9bptFbs_E*HTBBiw@ zriAp!MiR7)82^Gl<;L7A4gA!y0pAEFHa<}h--=ak15C^*Ntq@9UiZg>egTQ+Z^svc za0Z>R5irxvm1F|RfaySq#kt>s z1s_Tz))(`tO`K4rZirG#8b=hLei%_AUSX1H5G!W;7$q*xcV``~nRe9X z!Alxv0*+zbDL-pXlj48otH<3aWj;KSrI;`B`^ptWC7c&Gh4}`WrYA;OvQ|Lc2|qa` zDXwS2-Nscprka__VKr$WY{PynQ({n`m7bn}ObV;^?z@2R=A@pZv7WsV`H(~eGRYInBhhKu)9crOBI>}ejcQ~9YGAT+j5hfzulS`< z^S+K;6%At&a>gef9<%_BlZfv{(XzFA=f^L>r|Lv@UR6f_`C9p++a z-*0~KDO>f$U9EXXY8=PLh3+q!-wMi}br!uUXY8=^>_O0I9SE`RzrXH634L)^^ybu> zG+(T)sHyR+q~z@Qr2G{MLny5vr^hgY-*UQye<^A`B1nDiV{Q*_o%g2vQ)WhIN?=~# zfR-1tT(pb!)RZQR=j>qOZzgJHRB`h7MiwxiIyjSMqt|6RpXJ=(^wdg9Uu3M>I_%Q8 zoXn4i<35%|btNOB!N~b8UFwwz6WsjHg6|!}87^Abo-2p4JiXTS0w$9VX|;r>l(_-5 zRKL_KlU6*g?E(sLzdsNUaHhLA zueX0D)LnpwgT$j7OjJyyPWP*Et#Ko8P#FPasUHH8KbG>av z;f6zUnd-~7DS*oM!@DguUx(CL*Om1J1wC>+-#i+M{# zC{egDKM)zFrhjjK*WFOE?ud5cHzia*LI&;7Hf@p*edp%f0a>+OW(=5GZ(*~D(B1El zv~F%Q{21r`A&#_4H8eo9_oL!%hb-Caco_h#!-6Hk>1eJ!kh(k5=*j1$LgoD zGUswH6wcUW_I1mGGi>2*xnnFnOV_StG$?c0&Z7l#a~fW&x;Jy>F>>QN<$m$wDhav7 zjY*n3sqxPCz)bE2eIe+xo=%xKz-7{pS;t(K9rh*$F84DCO2fJBrv8?M!w~%VTDu8Y0yvD zZY-PHR63tY2=r8|B#OCQuy0aV{UDO|kBitv$Qav6byemiz|9(fk}1gUrgK z*0Wp_kSzIE+^MqdK~yv4a`^MLoYEuluMT)_cHWeFjQrZ|lnBKVGo0VzT6c#pea7g% zpV5;lA-oUZ8XZmM0 z?NmAGnVg$&ot@g6#94FEyAhEp-nQsELl~}SpZ?HP=oR%-k*U62h<4x@-;j1A)&q5K z-LG!n(<-65Y>>DFd`yzt)RJJ8m;`USW}ch+xQNHxdCL8g{lHd#r6zz5o3nn?rwyY4U)mO3ZfA!Lr%Os#?>UR@n>v8pciseAm?eK*Q86 z6_x2YPV_ngH1Jt?{D(x@`0vE?RTH=Vs_UF~NA93q9vC~5NLS3?)<~*@2mQHqHG5$$ z0AE}gw_*a&Nwrhfs3LEBuqIc~fUstYJ7s~pb=k$ilR)O3*(%xM?|HXmR1Y%The)yu zmd0!!!fAx>Go#d>6yUqg1W<7jZ&N~tjY%HkVt0po_NXO2^@qiHHa+;8ECzb`NJ#FR z6HJ70JYNZ)vMqRzG7jXJh8OLp8b)jD{7i5spY_(Bt$tVXS1Z=meSh`L9dY3!q)#)bIHJnnO5_kIY(ud@&ttUIcir&X9*#AAl;N1Q2?K&FO zdo)xQG*;|UO17}N?>6-UH1xHS`{OMe;}H#Dxc!rr+LV>1=)*U#Ve__Um94Xo^0xfY zx5B+QNl@|j$4B+n#{dR#efiCm#5aM-wbi`-$^YIT0X)5PyD8^q4X{JCXg~R6fmVT~8rC6oX@{VDlLPwS06eKf6 zIZ%T_t-=|eu)iEbCtlX@=RW&)8im(&WVwCSc&dwqtv8>&tzvTkZJWyz7u$NeTQi64 z=_C8zNIb1-mGu+HpYe1b&$CRN+@&ew;`IHJhdjtw`|syWr|egjk-pmL(Ve_hiV2^O z`a;UvS+_R;mj(ChQV&Bew0yXma5Tb#?H`n-xH2XSHoE`DR^f~Pli$&w8@ zyeXzVyuu@{B#(pEwigz{9D%YwxI0C}e_BX%X+NpZwYEf;#Hq8CK>2s~3)1baX6QcT z7)8oII>7ODVQr$>sbx9*puCKvHO1vno1@Tl2%ap+cQFK)4_l5L{ z;i~^-A^lSK<)lnTCmu;maSPYZwrOfio6QyknH#71!yF{!I{&qh;$(Q~OWAk!m@)eD4h|r5##J4@*$5KMZv*$*L7dczHr#I$AYi&- zP92}&q!0NJ%VZ@vF~_Vt-`j1&l4lV!jm}m_Fs}ZbT>ZFNk9EjbW`ID`*mt+iyWd{| zpK@%V`k^#EB8wJh1N{)v>E=96I=MGhW!CZMHFh)a77U! z*(41!XZW-PyOsFV46bk=eqhm_j(%R)kMluxK0M>$tRPRqsBC|(i8$CX*VUwK*Vgky z*rE&t%K&NKt3g6Pe&Zsy;O8x!Y8KF^ol~g~3u*qFUnlQzK_JS*L8ejkm;EqBlrOu^ zfxwkOiN{Y<0EE*Qy&k{TPj4fuenOxp+`D?36`kl2w-^IP zaHMx0r6$}cg8~M?b8h#*)px{h?uvnJwW1F(jLBj>~F$6EpbBI0Vj3wB|Ua3PN(CL2mF5;xQWj zU3$g6+v}7qBpUExX$9Ps>4?PfJmonLEN7c>T@Um_e$29|U{|Y*v}4noExZYDjcOvk z66iZe!$8}T`0TjP2SP`sxZ!EidT=ImGOA@W33CY<0WaBNR~`a@^BkfXzEC=@6=mp; zIOZz3VhvC88UG|JP@%+!h15DD;WZSOH^(@PV;+Zi}%TPPh` zJm4Zu6!yI(7^jOJ#cm7Sc8Uq7$F{G+wd*DxmN_L*!m~{C*HxwT8>7MO(oAUAZBS2S z)?LmqvQB0oar5Pnda))7f7nId>7#@^wiF6~Y(G(BkN6jRWw6GvKAd`@R1|jCMdRh9 zk`auuw9|zW6GxVsrcP#b*bLgRKIgcw%0qRlt0>zwh%%zL5MeG$T~|DA;tt_3|+ji2iJGO1xPM+9y$F^;Eo}9ez z%$fbp*)wO?RP9yQhgIvteScl6>bm~F(lT^>tDk)xs0oPXu~X=Tzve6T_D(USJJ~Pz zecu-4S6m?t};&J)CNf3A$0HnAb-Ik;(_ zL|_=j)-|*d6DtVd#W)=zP|wH83@cUU6Z zIs<)wui_ouh=Br8BAQ|Xu?%QcWcLcWx5gMVtP+ZCs7lv5=q&-RF)VrDU3JvjrQ_YU zML(+5r=j+Q(Dz444Hg!#xEn+HJ$4ypVUn3|mOK=se^uuR)1PUf@UVq&944dDcRB6} zeTR&zK^S7~1EftTBLRW%v7B6DjF_(-Rf`U`uiwrT(K=RK98Z41zwd@uXw4Fu9x~5{ z9v9|gsUeq;D}iw5z*~zQDjBIB0S7b4}M-Lu4F)P zcHeK3IfMpp+_FEnVQorDD4%qi(!})j9asiKTkaCtG<1_P+&vr;jxZ-$Vf$DIl@OaJI`{$!>eO+-wJr2pjpQ~T&h zGlIW}qy9MT@B`iaEQSqz-{VgqgA4jC9tjYNdCFQ&)Fl+1C)e<1VSvFEL-m7LJ-1Au z_Xm0+0=f~CKk#j3pTUjhutHD6s6z?eCc`0mg4aorSLd*TPS>G++KUovhWE#H8*BHi z49;qe6o5Ln15*d#4J~FeLCdciQ1o-*kHo7+;t+55Ly5fCCV{J4ODQIR;TCL@j$qgK zHRIk=0Kvwk25m04`?*`aBKty)w6j*(?ZgrD0y_6~ZQrG4`Rn2it4g%>+5OfX$|u?+ z`a4f8hPUl=#5Eq{RBec3P9O&R6@_&QfKl?@2jjJ)-0tI*m+&2J7U-|F{kr@Wx$?vS zTRyouM1=sQiW{UE)(o2Yca{izIQxS>=pcD0B#5y7`?gWmkWISi19f_!`1G*|MH3y?(NcCF ziwVa}#-C(G_!k0USMuQ1h(YLt`9T6ff`swj`tgs55qNqD=Y$c!ezKkf@Qn&HQiV1_CH zGWYMoa|FV#9R+1q!BWQvJ5HqD1|AE~{M>S^kBw?u_q5VP1 z%VW$YSNL6yRESMNONK;u7k&c+9py(FH&oGJejzR?haat!DRB7>k>6N5F7*wWy7iug&0Q%IhQ8#45not2RDb?ZCqhGyAVG@ba+vA z%j(d6qfa*E4aV-~{q)}{8N*}mB2vyV<={5;uQC*O-404miiR0!WlI~h4}bOm7DGQt zYfR@T-7UIP;cG!1@s$_5)Exp(^beE8bnZ-*Tnz#rP4%Kp6@F(cU>bO+W*V4LFrbuJ z{3O2uU4`h+`Rqcdqm!8BqA(r~+A`ghS1{8DJAyhbG@Cy9urJZTrcj(Tg;e@36=vp< zzO4uGrKoKieiw_=jSFlYH;0+B%7SLAo-yt}${3}vRWrX`De-@S3*IEReKE`J5=Wk% z(_P!ctTEH?PmlFLc6NlN^vHMVro=U*6xlHoMfUgJqVzc`^|>-felYjt2tqvRMc@YbkJ8YB^cPiv z~zGM~=Kg6;w@6)u5@|zcuRI|AtplJw&RC+;qKFz7pEnMag%cM8+ ztZC}xB}=3Y%c!{mf1!=wtG!(2tXrS#8ab3gO*-{QAQUl&PPD>SBA#fZCh2@x)CwW##Wi-H~?(!r#2zox+Cb7yU zIof8qb2^=Ky3qi@Fj$LcyaPzi5J*vd%()P;HC+%`%WwdorjpL!yh&-WQq8iepUPU{ zSnP%xG+(&B-(k%y*Nj?P!DDtoR{jAqe&Q}R8%bbKzvBY@l-8R0aZcw~$2j;SiK z#tNyaVlcsG?5%VtC*`P%qIIiy%bTcGOHOfxcKQcBo=262AKhTY#SECO528&}1m#1U zvXxJ0!0Cj-;K-a{^{QU!LI~vIlg;1~<&s(Tm>kWx8W1lKXLv3EekBIW8VqtZVrvyh ze{xba@Mew7ceXxfxiM}9dY4vxx$=WVa#JTP03!s|aldpUW-J?j=U2@Z3`1eaMUUR) zE=kRw9J-vXbUBmJ0Pa0|veLf?`))oobdbUGjy0ErN^3%cYi~B9?t!fCfdUYAH#`I0 zz^g1P`j62ZJHO+*?qaMTVdn`HsD$Ach%|Xy3{MnM$9Htsa)b1pfjB#*3=6_k8>Kj% z1N6OCd;KSYM*D^rClH1ZE06}_4^hK^Eo>BPRn}zZ&1yesCZB%Lt!vSL{fl$QoN6JE z;h>ZOxi&%!l%5Xs&NY+mgSy5uUlR;P@5GV}2&{#c*1Y;Lcm=3tB^!J#x%Pgm@jesc z3%Y&|v5SyOrkAik9lt~f0xSEm;kKrl54Qf;9a?r{7yg?GrAHbBtwuB`fG?@mdkc&| zj|o1s7M1nZhsU4(p#O{D&fa69hpVW*t1Ir7;vD`(-yU0z&Wx))ffD#@S8Wh|y%c9~ z0QCGAw)O<=i=i3}z=XG;a*wD6-sa9)QBo6zYaDXIHPlw*)-C<|0*@oB92P^aL^_#K z+=bz z0iz!AT~BO##pnoUq)F)$nrHh#ThLnB$G0i$37+@4Omy$7SP!W7`A!?>)|%*UigQ&J{~dAf=5$KOZ4l z#62V|+%58Cz8%XwK|RDkWV=YjZG|AuGwADc47|8BfN`M4UYuCb+h-lcNSL~7J=TE2 ze&w}H>|H<5gv60NY8V4-d@Ie+ns&SC?;@z71hzZlk55ir@*HoFXE+?@0Y8nyZF#Mm z891G^X#q9X?O@FHTSg&I_Fci2$Q{n5n4E6fA#DY;Ee(}`_R6L`Hi_dW6@5l%QXTBi zRqX52(l<@0L@T%DXSJ+mj?zbu!22aNMq;e+_XJpC-|^qqQE}vsb$c|V>zsiz7Y_3h zj(BXp?%jA48v{AHLV!f;fmjkjz7OWgT+iIP&SqTUtgt>_O&-2ne0H|$uj5-OTv3U- zwoV*)+Z;s{(d8z~3O5{aqj^Ap0J!*|zpbQNP zh|u+6TF7Tz=vC(fczN4tbMGvqn`S(7lsl@m-<#b$0ihmc=7{%u^lyT$X91Kjm}42* zuI)&j&YhkXP4C6ao~he!o#38bc3$Tpqp>AVyf{y4zl=*v5oI z`t-fC)c)<7hwh#(<==(pS+{;4Z+S2dW7&5Dnyhs;fdg0NfjjEmhj>2g+TJlv!?K>; z=f?ymoL&9G{D+y{HTvCMl|Q(TgDOfN&Od*gJ@SkE1YQV$4rF%EfP2@*b8JKFA%dBp z0CBHbMOVND91^`x#DORCKBw!z%fcT=+8==o&PU|r9;)9rFN&4yJ0Dwko+g0vc)kmy z0$0y(FPwIgloW->pRUh7k1YcKu#n;m1OuT_C{$YG4F6#vi6#Aqg(Lx-6%>yp5)46K z4K$HVq?E)YX&{qCrDV+3iT5~^oXUVIJXmN;{IZZZtfxD{SS5*}m+-%dyfL2km&m|U zc+=R^%*Ucsi*Ba57^~On_l02arr2mUn$MP~cBI&9x7h6t(^Dn<+Ki>T%}^PeBbUkl znY;7AomMB;D-@2aOJnb#X07wd9kYR6ZZaN2jFk1p#dMBW+f)XUTHNLnG&t!HM#5X1t@d<4y>A!W9qSOPh} zJ?@WZOVxXRSp9k?aJ$z#UAME(8;Cp>U|@X(8l6nlDqHbXkQx8#9m=VQ-~j=*iKD)x z0E_K{{hGV!hi9Ht7(nRpyzY9rIjgQs1-94b{Z)uE>dDumk>VcDb427li33yM!7Z<- zDZJomui>4_*q7;_=c1b%C5@L+8Y54?_%pEaQ$%ubTdE1R2OUir=6=vZ!W{=G#|aX{ssG*$S3#E`5Q9?RGsH+&abY3H zQP*V_3sz23%uh1&kpxTm8i`NPU_t|u&nq%?$pBa--~*oKEX%8x)~xI4X_Y%T=q<qa-9Mdn-^4_P?I;c5+(B~+`K+qg2}{CQ2G93(IT_r5|b(S`*+;OFk2#t zajggA{94%!rQQV8{8H|ppSKr;97*-np*{-kQ!{l#caz>6Q}YlfY~C`vA~0ouBsvTe ztTb7Y5D)YmA>`aS&}g0PCU+xEJ8j6iydwaok)!S8?Aah@|^4+gQz8RB&6PWEt@HFB;V# z7y=%{1gm+OYiJS6yVEoy<>vFYKhh7$c|oB~Bl}0FWS49S{$--r4~T{E0@RT4!ul3z zUh!+s1)yoH3AED41`&8JTgEA3-1FnC8@ktpFq+<%g;bkMw|8B@^;iUc-uT#8B;GY# zXRB$Zt#8&DioE7=#j>?rk)S5OkYeu63p=1`J92Z+iM6G3JwhH04&ii=#!y?ew zwaTNB1#qPjLzs8R!BUdz-QPs=h#V-KKHKr1CBShYA6=A^=JFg=uF5VRT-rAfsE8I?oucp`3UJR^IF6#S7$B2YV~7=vk_IId;v zOvqBi3aXTdI;+l-{y3KvkW|Y5Sgs{vMVXK?SM)A&N~k$F?#Ce&&s=dRC+#GYhH6=X z(0@S3=(t$ce_yKmc&6Tgx6U*DSSI?McmRHE1b~p*k;S zidyCUc&GB~QaxWGf)k{!gQp1I{h^XDF0yPv|wV-Y}{M1c+2d`DoCkM3~ zs`>NB`R}yyb6!f^c?Iqr9L36ilV<-Q?eP}@o@>G#z=1rL_(*y{g7plFVh)gW#gnK zwd-uG|xBWf7r=r3T8Qr=s~4`;9-!-=S3@r=(X1RTE-b zT3B&I6Cjh$eaC|~&c@ugbt0NjA#Qq~iLpfMIIT<6* zoO)y<6NgP4i~eQ;3VqCwM4dREZH1ONz&Ir%ZA=#UJ;JTfs93k91sxHZu{RUVzLRU> z?_+J=6OS-6IJI}zd;VIh#B^}PSC5p6t#j0g3HJ=QvqB2e4|p$aO!Zflqr2*IG2l_; z$FJ7m-zpWpLEJ}hdo^jDPEK)1k^nkH4cYwS`(kE(PTtUya1Wrk$p`TXUElywgAkT+ z_A^@(CQms-g!9V^R05kofiNo|mt$$aYtaSPO-wsq7<#8%?pQWs0 zS~APg6_t6mX1AJ27b^kY#aN9uh4%ofx;}!dIoOoGAa=lK%(zvvnX{jAad8KR%J58` zU7$n`HD}i*_pic~u)U|}o_h9+M2WVt1wQKr){~Jr1vBnVl_h#RUEVNGyiyzClyr=} zX*=+&eFD40UhYK$`P`-q;H3L2lP7_s7B4ZM5EU`8l*w%}N*?5;o7YVRa4XYpW1s(- zyJXZ`K0Y_|VDzXCBbTP+h5VdXDZ5fS9iy(pXuV{p{bHs*=aIyJLwktfwEjNrqV$+< z+cBGGo;Aj`yzyaA60xzinb56mIpiE;fOR%n>#p#+N#A0|VvfE0z=HmK>%x_&e;V<* zjWOr8vb!?_J@Y21Ce z0-rGE((_%r+{B@t_hm}Ehw<2DTJWcOO&>enhk~KMAcUmPyVqjCYb1idqDUQg6TTms zfyE!DNBr-P@+5OeZvl+JZ^%JMGaF}&*9NA;S|hp0RxHD%{?ifw{IaLKScP^<|DWK$ zL#m!kWS^TzY=!N-3X3u{`?of=Y-(wtR?vni zv`9$Hit1bN2@LF?s0hp1CCeLkdIaiOttEwwqe$ac8T<$!C{|n_n*5X4;|`|{ZbV2SV16?u+b;Xw<)k$MB>9%IK@;%2jpr6B-7}l zo13o5kx2`C_<_l9v<|qXho}THmV1WAY{QnG@D4JNs;##j_Cwf8y%+(46e7j3_F;`A zQfz85DV;ZhFXUoJw}-v3wLoyF)Ib9HE3rLhwyo*_)M+;CQzA-9BoEk;m0Om{gOI&y zr!s}cr&$H5Yl0Ti#+|B5_ZVF61lg+D`6g@h48#6{BfL*2`=<%3BT>`VVbzFpBF>ss z^cdc~Xl}U)m~5I-FjU1(OX!JFZkQ7+tjn#SdOu)Td@9p9iFY{*vJ$F;;7&7E` z>v+X@4QV~9+>eBl3{b4mA-vVY7Dp0tv}0JMBUm;uW58f}8q<=IBsI|$w|#=((;=~; zSawqN6qPvDP#jfau?<8$_Q-VhBs}peDs{c(pw$7r_Vl%y)NKO`3!@3`ITC&yXpdA0 z8IE)h3#&txm^Gi6bygpa%6D!yro#ke@LF;G(O*aC)JJ(rl%~?&->s&|n2ES&XyB~k zV@x# z(wRSy4oZILinkB}B=~;$i@kJ=Gp8Jd@xU`FdG1%ZZ_WMdTQs|_H{Y@u&bC-_xlc4W z97!)Ln73_tvGJFOv7I|AA=`ou6F;GSnj5I3nz-=O zJ6SRKlj`3r!gz_2u_^-Fzo@~{Z+A`w7N>7u?5e?%#M&PC@Y%$tDl*)iP0j=%zg1Jo z&{Ff)-mAfjhEj1d+7XJ^%I4M_Ceg{E*fmNa$@d7~TUZrH)TVGS#;>r6TrbEAvdIcJ zN#nTicQ+xpB;8S+%PikZlr@R$0;#6IH!5;JvJ);Q^*`*~)Jj0H8**R-p&zO6x~Qt| zE5kFW%-bq0CaPLCtF=sv1;dFGKN11*)V&|o{n<5wRpG;$HNu;7L;6u|Tr|_0bL?HJ zoEMWA47JLewW=Sr>K9R)7E$5yktueyi42j>ej=`cpl3Yl%r^7sG=Hya*4=E@YDw1a z!q6E?)|q10y=B)oHr9pR)BRxAZfVx;aY5~O(V0-yN8vEE+t)0o)q=m$Cr;7YS2Z|Y zG`LnZWacnljWtxBG+bpjB6c-8PBu7yG+=)+QB3*d;uz-x=vQN?$$^;cx@apJ;wbp( z`HDg^aF}`k%uS)X#}QzFP7Atge!goF;<)*7Kt=AgCKfjALJ6?*X|<5)h^+0 ze`{Ss!h?LQ&Lz`9fPG<#{{Ai&5ES1h-@*_rb#oNG)mh-M)=$B1Qnl=$)p6o*QRj4L zP0>%KzzXwsG+pX$wOc~(($2m^i+VIODEKgiTgnob1 z@SUdxQGN3Dt}S$y>D96SLO}fes{$P4KuS~QyBT>6F+KQKcn<-tcFz{~m_#p2cBjPl z&@KK${YXUhp(ltSybvL_V#qBwknfx!vv%1qttgi_FavS$&9%Y$8X>2rem{3ZLaz_o#>Txqe!>m$-{gvhXNtkNG|SS6fqac!#Nt$;MOZ75#M4*yUV52YdyFp zYU0G`;zX!3#lhmB4rl~@dljp6x4>A{ZEQ8VY`(^o`mKQG&v_G|dmm{LpFU%e9~S;y zwa(lA1}qsTj+iB>8ak?O)l;w0_Mrue`RgLR>Pg4-u&`PHyz|x5YD# zIKe;1{p}k~<-l9Q_G|Ksy|1l%{P+RpGBec}vVYu)cVQjpkY|joT|k$X+jkoOVajLc zHx5(eM044AzqtxC$4ayglt9I{_P3C8PuOcMLDKcQSY{L#kMNK7+D!R(w#?L559C`G z_RI_va#>~81&S71ahBq;+FQeTT!ZFhqtv%F^B~yL8z`4D|AXj?p|{Y|gc9zKoc(j;Q9nx^ksjoIq2D_@!oRqTIg(X0x<(6K#D9kzHp6YJhclA*J_)iWmo`weG67p@ieV~a{ap#Y+6NsW6dVXB6rinntn)THZ}D|sqJKgq}O-RKdbBgIA}E% zjbcXjvzr40w+u={@@mU0VJdD>pg#J&MNaYV^5}g_!gF}uI+?uQ z9~!j7+q`-pbFVMcsgFHVdvkV&yE{>!x;e#9*9h)ZX@Hqk4~_A26UO0`0~_5=9g^zk z%xLr@+u1YaL~zwa!}VqCmDhy%DvbL?9iV%;Km8G*F#nog?)3U1R>3-JFzxn-!eQ}< zaNQd9g4S@X?R~r(i?7Hp7G#+cEzP9d*R1`7+ z(WhLN^Ca^Tp(F+9Fp*qqx~rzs8Sx;#d2u;9v4@*%OM>m>>_NH_Y%pNQ;}wTPUzfA` zc`JwtN_5Thqj_{W7!wv+B|6VPlvG~kvMfniK~gkX(}ce-SwoEQbTQ5>Usb|`%VRLx zOG#)be0%voV? zr$~j3i8%98CwVR^w*~M}W(1db;#S9OSz1)$9f_2c*6gjFrpI-A?D`d_cvKnCp^9q6 zh~C0f$0{nSE~*M+hMNEks68+eNBiMyYAjLlu4>5`LI~;`#KKKGTnW7_+8g1{7;0Hk ztf;HIJy&T9T+O7;avLJv>APx`Jaxhv8R(3>!?xavi_Ic%8C&UIt?P25H`Q~3_Yl8T z3_(C^U6;Q#SnIfc6Nq4{dd>MuJGuL2?NHlorE@ifi&VvshqJ9+DnGGxQl>DJJ=d~TrstS<>+}n zf_-XX*w185zU^C}+z1x>=DfoJPRKS*{ETs1s+TxHk!@{E|Hu1!K+j-Rv?yc6{;UkSEd9I|_s1gj zs06=@x~jgeT8kDI%lA#cPja3l=sWL>qM~5HM{9fp8UG-fls>}{vd=dA&~hRI<aWT>7RV<*2XDuJL;ubj zrAp)fRAdZ@Xy4d|SOKo6bSDrfZfW`?_tFvH7#xpI?FSBtA!YzoI7b07W6tE@ZXqb!2dnStF+Y^NfE z^k8P^!Y{;`2^(gsaEP|CDa6}`85w=>(X!s;LX*mxKN00k|W0-6-|mS&?VnYRG4+E|;~7n9n+MF6FyCWgvg4k75eb^ zS(TX|t~TlN+i=UR<1RJM)s?y^a0>;n&CqDN85}Jn$o2-tS+bi{JVU3+<(@;?6M3bo zI>g^_fURJ;Zxw%~iG*dfCm(-3+L- zia{m|)70!vA;O7S4<-_`+;f%bsKqJ<=X4uFhC#Tv|8}?yAlH04d)o_jElEB@g5Tp zPJp?d!CEY`{bJgET&1QVx%T%mE}m>z1IAX&;<_=}$BPGjxU>tZQ~el|n1C4v$`qU9 zch+qifx=3hlQH0`)ZGeS3|i0tjackr~5293~&r(3prz^Mw?jWQX0?v$o?qUn4Fxg;a{(5>AH@-&U9S|skQ-Vp1{Df9Bt4lRP26Sq4#-7>@&a~pN`R;(pmS5%sSBc!98IYbDw3Lx$mb|mp4S<81EK*#KYJ=8yoX*efM|$2a?-lAh2mY zyAGBv9|*-($#)oIUni}982b3U z&J?ap*;ORg$?;c-ixXkGeN7QQWR3GDcD$}k_&kY+zSE~TzFY6DoC4Q7EyNHq*XN`! z3)7Q|Hj~Ab5(`v{Z}R9abCEtyj5nUzuKVaK1Qtpd6Z#}|tqgN1dYBCPN-p7mYM^9Z*H;RnWP$*MSK0Bb5jsKhX^^_x`rx*YWIEN%7_4 z1Ta$tvRY_SS$Ip#i!Ahe1wpwWLK&ip8A6yFdWi>$S_Fw}D05)bbDuc;d`3zI309;E zR+b1>v4B;#fDO(IPV5bit%G*_1N8}_WPF13ZWi(n3#lvwXgwNYdlF&?6Y4+}>Ld~B zViEce3#lyBYcy1xSS8OM%Ipu6qXM*79dzssj80i_uwQTr6N)NKcszD+bZeLn7p$HJ zv@Hmn35=5WNq8UeWAyxlsA&o{&okY!?*e*eY1!{zariDd}hH0Fjw2ek5wnlb_h4+5hNifle z7BR%{1Yn^Asgr~ylSD0({?$T~hfP+bPF9voR<%r44^P%CPu3nw z);&$uhfOi0PBE5DG5vonB$d}he#z*ElLRK5#1^i^c#Xtl_i#NbWJiz?zSTql*ff9Y zv_Q$U|79VKrA42n#loh?Q>Q0NrYBpbr-rAem#1frrDva}=fY;>|A&PXo)LeV637+1 zBoXNt9?PPc+Wr#Fxf-n33hgzP%6pp14?NB6`40=pGHWC}YpgtLVk~RwG;0PndzLzT zUNU>pGJ82Zd$m0K-z_BAoL%aieaW0d%bba^%-^dSVc4m49>HwPnXY58fb>)_l*pd4 zoX+yx_p#iM)7($kynnZltn#2E@?b0S;K%b2&hn7p@=<918w;r-@603Del=$mJCh70 zSJge$of{V1Fs$1>_e}C%ETr*5{xFSKCB4Mc_QL7^Hh$6{~BI)rW*|Q>fxZ*FN zNLi{_)v8!M;-40hRME3$^pbl4)mx5yLxHkJB9LP>mI=2|Z@lFHU?I_z1xl3#Ta|@I zl!bqxLgQu8XJxT))5V7i``hmcxU55grDRsv7zdiz2GVDyk;NtESGXX5gx4X{zU?su!)Q|9>o`ZJH{E z*Mw)T)aw4quC?-B+^X~ckA(zR2TEH9E?oy{T?ZXm2U}SOKT(HpUWWt^tVf}(|4$YY zZGB2u^i@Vd9cpc=eF@rbeal$=e`_I0*HNz5q@9IT4^*00RDSk0idr{`M>a`THc3x3 z{SPdp^X3b!rk;#SVp^6?DYRefu~ybCZjmh>l`UQqE#BuXzVNO7w5@^Ct-;o<%F-=% zyiGr~OSs}&89ZD6cMB=wz4Zrti*Zwd{9W6>T1eIB?X~b7^|T$0(jCp#9W9X^ZFQ9$ z|AmDF-yww8Zq1fh7tlEa-!)6yH80(@Xx+6O*|l2P_3swad*%3h%{bZrz(NA0>jjtT zg|z8~zUTo9?uGyFEF}CM=%N40Lego7M??N6u!HaqVCOsNBFGE)_kRF8|HVT35^_L5 zSU^DNKp^ly5D-AHp+U$&K-fV*_(4FVKtSX{LFFJJxnN-#5D|${QL)j{F)=W{@SFdn z-+UQ3|8#G@*c-gB!o?-P#U;YSCB?@h!N(^eA|U({Z}9QI3jg0EoUhH-$(MNZZw$_t zbwf%@`mfv#B_-vTZ1cs`FflUy8!W@j%*MdTOGz(H%%FwOXz|r_NXB8t%C9LcC}J+c z;3-NJD2f#$j+!8io~DG8t4)}1!IEh&6z3@KXRqyUZ)|I8t#9QhYvm{WEB=Q=hJbUf zsAq}d?|eP~T)WWBz_|33jO@(pg8ZVA%IezIwzhu}VE%pE`(?rWPwIdF!vEcq-tNA> zj=}!+;epoC!RE=nhS~mx#omVHuEv$N##KPmdR_BoC19tdc`v*9D53d06maPYxOD~G zyEfl@G~amx?gIgLAuTtNEmyJa7m00W=^e+JUz5ardxayL#nY?hvrCnW^EGR;wL8;w z2NSi&6Sb$~H5cQxmt(cpV|909^$(-g7P?~~2%)6MU*fcH7T`(n%c za?ATl%iqwx!-=C_UJm(7-kowl33j*Eldqobj%lj-^M#j(q^!Rw8_o2~x4 z?SZ?U!Moj|+uhNd-RZNP*~9I{t*xci?d8Rt)jxY{3qemX3$jAJ39(ESbvWayr`>Yb>3~{TT>{ zfa_E?TPTr8qdVU84`8QI>QZCDV9{T_^nU?61kxP)-3=D=6}l6E>h%`;{qbz+mYU5D z_xrQWiI&>!9zSq+LYdaO-GMMPTD{5E`u&lA0d}mnCfgd1XYzyvrfJ%nzSM8!O1-J} z=JVw`_JkPO4#4GlYdH;DTu00Gb}!}j$%@_c&CX~dt-jB4?``xD5|6oDSNr3+ZmCn$ zF9qJGe*!zpr@H%^r!ym!`ZL{KBX?%e9l7#7-5*z{tY?Y7Jw2bF%YC7o0Jj1a25u;02|C~nZj1Nore37zGz7`soRvfcp;TtaL@30X_63gVM)!nsCb{B3ktXku1g^>c7($F|tP<18 z>2Ob>5}4g0rof6YP4R-^7#yLRkw6S3YPPnSrds*n9PvU8j>+?hnxvy9DcuQE(kcrH znu)mtchHY%WUv|LiN-o#vNCUk6|rRKKEbRM?NI2a zElJ5Qp`C5QC_gn1y=L%dC>YnGy&Yr_UDE}u>AlSqC!1xU2>g90MDl-;geI{Q)y$%3 z8?Z{ZN=9J)cHN;kXyufy-!NC%WstJ&n1KMDEj?vA{$4W4FV204*7%3|2*O{8c`C_0 zqMdSD&+j4#Gq~TfuK%?k-Z@V$ExkEUr?H(zKz}8@WbyVpvve(ZC>%>Y`f;@zP=qEh z!eRK+AmgS5c`9TkaaZi^WKY%m%{4i1DSK!Z${q)l5w@-&D9zx0l664#nHPYToEqJB zQ~}0gl~Y~ed7M>4N%MYSrj`y_>4ADqlbm;kZ&shp?Z&^yP8ajqG4O9I?rUzw-EsyZzP!|@twjz`}j#Oy_7RHezrA7 zBP*4CF9i$gzT0Sfr0{+G^AlwLZhB%B62gOvmNC-?F!dmnq)Hv`;=^J%;v*}w_ngyW zBobM9_e%VlUQIeR1<61aCDQ_ADk^nDNOxYFd31r*PU>dcWN4ts5%1Aag-iXsLCd$3 zf*SQWRIMWMo%6W3EejMw*RYsP6f9;Wj<(#o8s6DAWl_j4V5gy2qECl70hmv6Dk4&_ zijpm^KCU$Cw?Mql3oYr7gY{Fhv6yS>)KG6NE^S(+^e4jEmistzZi-5oge*;ASo>E5 zWq7$%bcM<#xGF*TLpfV^g<6YMR~6=Ch2$NL`iRuhnF@v%w4tHK#22s=a9jmRU!t)o zwcOqhRRaN&K3uhjg^ui~Cd;PHZ8}rJ!L){8S$o9c6^mufc&hBJ9T0 zOJHBHns{T@7>`hGfkYEO?jvK8(=KR!38R%+#o?9d4ZO54mtNmY0@QmDz~~FQ1TMLb zwitR;+gMBMtjW0&m)Kee-uV;m9GSF!N2zg&l-3<3R3{#*9#u_?Bs#HrYRp3ovlD>d zV*4;||A|^_Kl5G`&;;nb6lE+kqTN1Q!>UU>1i?T|(2e+O%X1@(<_#&c^D_P1@=ep$ zulSwpkE#_dz_c(=)Y&>izGr-yD=oHD(SM2|6#=$nO*S4Q#j zp>N9Nvkytykg0TEuKUvQqOioFZ?wnq| z{ggilg9UyUM0{uZ)tqFPLktU z&j%V+jeOhy(mRCCwhZgQf46&5))#~JIFDCm@1(^(_YKFqOpl1&LL2@SiCeui^wqw> zv-9koxzeqWCb+X^?A+#;_geDX`d*LGiV*VOz z825Nu@8P_ng!xNP;=A2JF8<)^3ufW27K1naM=%Y zMGc7x8HLKf!_*o1k@76q3f#f^tkk)|H9*?cpC-)rz*Vb*9C_}@F4J6(DdhLCm^+ud z>(|SytlkE~!4H}|@X^&MEyR^VH84djh_5vWupF>T8uSU}l?t%DF#SEE?kkfPoWC2$ z2^Cykj9SeZZ1JR9YwikK7HlDbqw`{>H%dfAtPjuOA%<<8t{P&xOhD`qV%ZvMQXite z6av|gDhOp=r5>vGVgMu^4UMoMmMgRI;|gk24>RGi%qj_tbPtc+4gHxWgkfx-W^S`5 z9+VRnUPOhH@e<~p96CoF!KvY~pBhwHW@V=l(G-SRx?)dt8xh}XS-0Yvq7m5(gWZzm z;7bzlJJk9>+}14By9U#v? zi8yA~MRPJO09HBR=q0AqKPI!^QQ#>O+AQ`aEjEKVc8A2ZQQhOSEEa4G=kF-#162qs zb{u$HT&iN+nq%C+v2#v9@HfqPtCg@#n0Pa)`0B7&%-8s^-MG!dcq#1Q5al=i6j}E z=r1zwOu{-GTW|0pF8$z4l7MCB_=sa zj@d5LDA~p%poAI28%9ZILGG7rvBt0Olbc+3F&@Wd#bban3Z&yb`O=m-Wi7b!{iZ)SlglHr-K z=_MW+maDNz67dzOX2BL7u@sqj9%%$)sV(UVWz_13$59F5Cd!goVqunEk{MiSaeq9r zWYV*Yfokb&qfTxw;S1q$^O7EisZ4#Ix7n zChAaM%4~q4gHT<0S#^;dvYc!6*9U+3`<6#a(>!Ei!q@^ zeo=A$Z{bvE;UagcA|9)lS4%6xm+TN~Y6+>F-)NDN5&sW+?-Zm-&^ByN_q3-yZBE;^ zZQI?`wr$(CZR=^l!NK zSdElBDJ#hEsACJ49XEYWFP8+A^DLFCJDVzwL}^LpfEkxszvQr<^qPQa* z-e-OFovWkQ(`PkI`Y^Tj#ESXfO5r_%mB&o?Ics`X^GSq!4u@QGF!jpS@>kSKK|M{# z&BB^gYr!rgy@BTZ<%Xx3v@rq-M%mbKOY*@(vVOd`-~z?mp$TP+oW zsa`V#7M%?>ka~urN3wTm=6aNes$w*Pax~I_m8@r!=vbt^RWvekH3*zG7Q!@HPQ3I8 z53yRd0}6`HBTcw6-KdH|pR0d!W!Zhi$Xiy!RvOK?2kd6FOqeGtjkL-{#`$hkkZ0Nt zpQLSOIyR4$8~4@WAqckP4(5$-|8Fj_8Pi`BlfYlGpXC9kD(<=Baa$E2aiW zm9~`G#qH1)S>ClBNxmtSzQfgBgxbCkmLBn|k)(NovQYFBG8`; z+({6is-X_Zv&ChxF4T7I6X92vBPEP zqPl#e&7Et2i@lKz2S9e2mcHV8mDxTS4#?anA(S3$G9A=+?H`NieYmK5IP0Ip8iK9r zR>pBqh5Z|tIb>xK&U2Y?`(_%2on*^3Jf$|A>O3r|-O}z+viC^ zcly*)5o>mp4Cp(l?S)JoAJtqP>HPg^OUpIdtTvi**_)O%_R=wyCEZQ(S)Yqjoo|(H zaM@|4JXY8l28ILh%Ze=ZimmS)|C!dq%RP~PQ4Exth=2mvg-vK_+jUG%ctQcThhk_U zL(joG-73uU(?=PlC*`yT#@&r1(B1FT``tFP&~b8msi#tBd*GPWOU!J3R#s-tn4M01at}JCjhIpOtW%DH z;ZEOX#`ls>z_hrQaQK9D&!7SLZ8l%mL&mV186EKZv)iqX(WOf^VN zEh6G}6>K(Eb96#L;e|8Ksef)Du-$?r%bo} zWZ^O?mzU{3my0RQl%i*yt$kg;MzpL)VIzn9$aF?cXR zjPG(Z>r4zaT`iPdaBq?rb`6g$jN-N;!6nZCt7}Y5*?spqO*g7DnD*jl`buBXZ`MS*o}LK-(al zE_uLC&o#0};>Xw$bWa7%4i3J-Qu6TLXb-)YF<}+_n zfNxa0HTRC|w>nxLfu%$K>`R^46sK_Sg4KcYA4Q zcKZIw(vOeP`0F-Ay<2443mDe9q?~Oxc;Ge8&fT8LWbnqt81ESk{IT8VEqSd8pZBN| zM>AFKY|yVxejPvz&qJv3Vky_0p3Q1i_jDTkqa5j@q1rv*y66W&mSpZdK3`T__O_4f z6rJt;D(};B%gn9E{AlH(+b*+g;yBAPt zBniI_<;0&*I!^`2Mu;1wnPw)f%fFa6klCnY1`{Tb4y=H*U2}t0Gt_up{e9qFd0Z>U)kL6x*V#4-&Ec7enFWco*y>H(hfQyNh)+tFHSAiHjz@SDrtF-M0ogr1dwr zdY&c7cFTtCfb{}*WK^PzaL5a60u#+y@jtNxKOd)3oc34>YNJp1%MPVtqI9cZw2aii9xWs3l#=bKew6D1t8R~Z$dJpT<7RlHz1;bq zhuF9A7;sTLfY))^xFEZ>2S|O6wFeynV?6HsC)l|ke?E3Q$*W(^u&nLF%d~2oQ}rAz zYT$miCpM4VbXd^~{i2<$e8x8F<-zB68jz6dJSB3q;(mqHNac1ph!q2tt+DjH-%Pgx zv+U|!#WrPkoSr{xcYq!@2k3mh zUoWWAbZKr3`-WFV`lfcfEj<@_!Pidt;-^ALVw&30ME9cM-b$3nDPeMXEaYPY50U8{AB2)0;k2e9!=6h<*6-HP&KMDEA+& z0{;gp2uAN`Fn3^ZF3N15GyI9Go4FKg^D} z7H;e=IAz%+$*WfSywO4#57K;Mu2Ve099f)wkp7=sC~&ypTR8dIyWi;YP!*&14XCtY zDS3m&w53Gja1odI{69ho6@cZEs(^Vg{W9W&929X!XGP|e!6MpX4w|_4m9b@WxG`b9F=}+ z>ReU6Wo;MyiwK|?q%k03<8WnI``3I_el*-fhSyTt@m{5UWr@Zy(?H%qMonmYNH?Z8 zQs*A+ABE)pN4gPg=DtO(=HzI`4V6gm#}zr?dZ<=vuQGjIVEU!X3a3?QcOIME{`AwR@*VDBpu5L0bt@oFa?Z;#&I*V&oLdZd z7EfWVjXw!93fILWc#sSH>AmgenY;_C00Z%%rOkG>{~RHwlTH`zcF3wsI|_~C_;rIQ z&U)*00@fxn#*soFyrrqA1%Ng2Tlx)l)M;iuk4cDx5t8b^cjWsTFdxFu81wCkJu27^ zAf9(B4Xipteovb#g(xn>2Q`;aTA%l+p{p?FxllZVByt&k;3K7pQ}Y!agMMSK4(73% zs(>cay1q}<@izbYnXx((@@y7eonof8u|6a!WDYkV@a?*gx>^vt|~IFn(PeC4q@;6w@j z8QN9{gO?HbVM-Z)@5D*BO)hP$Z9*zN9mB$X)F`@n_|(ASp@w4?E_>MzmF!woPmIHi z&A$Ag`#R>#TN2JB3+(E|B}uHZ?Yh8x1?+gkyTPYrLlPSU*7)!jSt9%3+}!N>Mte!Hp!kYt)3Ihp3{ZSpVR>G zCjJ47-c`dM(9aI&tnOc60=47(Cl}nOTu`9Qy$G-^WJ0`fNNg>heTYeYFqnOi)O}Fg z0%sFELl>6wIy~4=Sp=j?ZKh5QcD&EWzfb zJ8LOMnH;y8C@$+H1e?eb9v@JyFW_K6)!>m+rVE_ma!6 z5aI_qR34WMvofCP`tpXqxfg9zUz`9Cuu}lgY4U*l>2^xzgWSOV3D0?k)wJ+ zv`dL=N{LBEdc;ZAzzFFgolHYoMy^=J99x;4MOpYtQ3MxC^b1mqN0H|WT=rA+Ibvw@YkvX+?pe}PVw`N%OdQJ1MVx3j5t~GC(^|G$1-A9G9M@@9_jl5z?wOhR$xWOWK;2`cawH~@J7$lW-m{ZsiyGoZ*`Qn%5~}V z1sR=|YR!zU&H8NBUKXXkfY?#xVMCn;1E+=(;jJz3k)H!3^ji|k#mMFq&*&N`wU24&F0@^B%uz$~Sc1w~& zND;$S?E=7Ub|tj@3B*S>I@#TWM$ueG?jl7rio4-j29B@(ihur{gxm9l0@Wnfhrk0x zQPuAN-^J10z)jIbN`WAM1ws;rg%Z>65vT^B=<1_?vUQ5=YpNKu85<~`LVDW;V5Auk zcJI@O9!Q;U6&ve($gE_`9I)fz+rw>~T5nBu=@mXPo6O4u51{Za?`y6vVy75ZUKp@l zt9=grHE~k>eo{T37gpn$5fp6|BGuY+-n3L%mIBN)9u`9LGE25_Nx^Tg;BGI0RJ`(Z z&Sy0w&vl8T84KwiaN_N7nP_M87;k<_om-0Yvgp7$N_JT#eg_O-we0y#=?PvQsCTm} z=4`X!Z8rul$)h1}1Roii9Bo)Digxa*i6X!o9w#~;-v=K{>mC}39`kjrK7h%=0cY9` zM_PZJNWh=yW1DgVX-xr3hy6cWkUh$#B63}H*T9&h`hQiRkfKH>8sk^9fimr)Mh#F3a`C)>&w659}5g#J5pUqjXb>P=+BR{O=}H2 z+;c}N3nkVKYUJ}Ow8`q}gPI(wG;m8=6SMB>9jW8Vas0* zaCs`0p{(Z;A{AWuqZKuau+taIzc0MdHuLz+CvItUshvMm%`J=%|yrTi|jC8Qprmw(nDsYqDkc$S71s< zODzq{Ef@0>!xlNYu2%;ZHD?A%lW>kDu3$FVziqT*7Nw1B1ellSF6EMI=)ax>Q(|n+ z;ICLsF6u+f1Z6pIip~6<|DC6A*FkHLhqb*cIS6U7nr|`LqBXmnwsQH&-Y0tmuXOW< z)^>(=2H|kF$b5bJXdBAab;D`}ihgoea&fPE*%`5V1)h^-gLR~eXl>JQ7;?RnVh6!w zSK~~*4o_hyYWpR+<})mnx^%V1FOF%_hD>J%Q+os`x$Y=gJtefqxf%Z*Y8c%;fR64! zK>~E(k#$heb!f10ko39NUs5P>8s%BGYU=uA*V~B*g4Ktw?l!sznQWf zp*@vTb&Qm?u10ZGO}{^K>K}!h?fa^+m0n2deqhUeP_aKYe+Bi~g(QE~CqoS55&}tx zmgG)#tnzb;*fJt|cI4MHmPB~e!hCd%0|7G$;KJ4?>$O6@uZ5_-Vl7hcXuA3^*B~xc z)<89pq1a}VK9@YQUN1R+GVbs17Q_1P#;CO(p*)`4cH+l;B*jovCEqg;2er%C7}Pf1 zH)*dTe;A6glR=Y_H#tgzyMw*n(O1JwympBUJc3|5jS0E3;&TyLxobuXGnaq%1^(Fg zodqRtdoe?>P`jy$T)Mu-qdsglM;XXHa=Fpf+n!l+0voY$I&nRE8f3P8;dgiCM%^>_ z3y_Q5CvyqaQ3v&wJNBcaHy^ojGjN49kzUPN4EVN7(XaQ5#c&Ai3^ceQPgKTBTwKU; zFwUBVN@D}it;43mStLzrEqq|@KhN)W( zAOD(--~WDn5tr=hM6!n`#x*4Mu1?c_sLU+0VglvST-LChzkK9O6?QDK+g4 zRp?9A?SIkN6#v^nyCx$-rks1Xv}3Kt{8YJolc#+L>1`pDg+kpkyIy)O;x4UT%exLa zwW@k9q&?e%?yW=oH3z&HfqJP$7?9BOkxRdqPoHeGPJvegp8F0TpV$|^02jMVu`r+> z(8Dkh=P}q7lQ6%xa7|y(Q=N}M@K*glc0gWyeaEA}{nLE?e?Z}JyC81v9sEbIgUl6Ol}I=le%!W%9Wou|#-k^+l@9Hiwh> zYRebe?M{!Eb8smItLbbWUqaXnyR!aP%Wn$jiI@LfuwydjLk3F9^?JG21QpKj+3ylY zM=H(KXmj<>a=F@Ix=;hqFfi>i`Bf;B71v}w%q?H(qxJDW1UonvS7GfF$UsvJ0)yrr zsa)BvcaGQF{gFgE+ihp3um!#c_-u?{JwAWi4Cg{_q|OPHr~f0^;qwE5!BF%-sBX=4 z?)oB)Hm_cM07F{k?i)b6q|e{+!?b842*ve)((;GLRo`;{HVTzTyZLj6V5i=>Fkts~ z^+FKMvhGF{1LWvNF%TjO2-y;(s9D{QWYA?VjFF&hCr*^v9widuZGkKj6sCWT4Mda_ z&kx41WlWqj+j-rcEJruJ95I6==QY;g`wz*c z;_#6>c|kZOfLzRzbkWrI^OHypc^z&YLm-3^KvA0Qp;=l8B~VeKkkX(+F67E@#AZ2w8OGR_UzqUsMCPUTKHJ=;;Q`!3%d$%*YFVwU|Mog`n&jLR$%4_<58hC zRufSJ6g}YmRoVB5oORu=NMbcVfGcu2JBYDYaWQz1p=DnMCpN?&jzttjTa9X1bw0FS zFCqqjs@*LN42irV})><4NT&6|uuCis6;bEd4L*`wg3pqGt&=qEa@0 zfGHSu&iGt4YF$segN3Ni#ghK*LQE@*fv~D=v}p( zZTJG$d1CQ>zC2v`k_iyJF9mf!R$urMNbJ1eFY%{w!s?&%W3;ZRwyzMwy20nEv^G7G zzhK1$z?Un1@0oTXgvuJfNM-~12evlFTiTW=Y~5RbZ^JQ^)qQ>0>M9wkLyesXe8JV( ziDB=7M4qzZY1R>vG^PJgKpWCTiVws+%tfM0;KNsB2v_hToRf5+)_RMw<6_o^TR3H6 zNrCrxGmy*plZuE*UgpWI-e(pbg=}uRx9j zI2J(<47JGZBc^6`8o@Gw4ht^NCN*6i;D>-t0*MrIWegZ%qn?H`@4(P-4cNHHZ^ zgJ5ZFwau7sF6v1@+=C`4#fWL57pg8GLGQpu1d19RAT1HkgbOiE}_Vq9MNln@k+Rj1|D*l!*do z!tH(5=~=;SOC&XM++-?Q9@Zs3C2q+n7UgbtvHMx{%^R3(QMhG$nC=pEM(V zbU*Ssm@f;Ba~7=0zG>1FRg;`jrv(cpJu3S1;x_N&@Q`Pcq(k2bSPX_(3b<4fmsOIO z%|l))urAJ1Rmf0l7``p&R<>00g%L;xIu}L$BogOYR^Gotj?PcYmpP$i80}xIMS9w@ z-d|^Jfk((WZY25TJXU3Xj9gpvU}@BIt|2IUn=8$N!@5$j$jYl?zCg63eDV6*^*PT{ zBluLck8{00g0bbwJz8rKu#TyWslH8p#-%aU0k!5g zIJHiG|FieQ)?bAo%+=HGlv?PT>c{6Nva7S_n64!&h%b{}=9s0nifB7_Ic@#Fv}&a! ztdy2i0KGR|W`pk~VjTfe-8Y}qk>I0BZ=MJZ)3dbF-?)|rY@X5&Xt6GP)^)58RQt$* zviU1lhQ837b>1*crKwAmaphK=izR52BBC|AsTTVvN^ZRm78_kNvpUn&U1aP-TAQl*jYXdwXQJt}N z@tiBwdQA1Mt%--a{0>8mCH@lvbt@hKt(*^5>Z)x(ZHqFI8`fH0+xG#+#~7y?w)eAI+py&t;D zeY;4YA`2Ayt_=Db$;%Vfn(4vn2qk-{H3Zm#d0=P+=q~CI7I_8nD;Obbwb^_5&U)C- z`S>-v*xi30hIW7WeU%=?LXe?? z#jx}z@+x0Srhp=+;9Q09!CS{hf0rw~pm|Oa8b+bTegoZG0SYD?YM$^cuYe9{a8zE9 zRi22`z3+#JPfuFNNE=R{f)8W>7=QpF8EJ`FREeUQ4=xzMNNKlWH4E8%h}auqerXa? z+304E?c#(Ka@G)Wz2hOl7;w<)5V#m}Ef?}^6QOhwarEOc?-%j`4Y>@6egtg2MeD5T zL$8=ESbJI^5A_8)K*iP{`e*g!!32|w^FTIth0DaJny-{y$R zIkP90YB|L6IOLmzf*d5yHQTd+EqWN*zFgYAI>P&GCzgjG`Ew5~DBmYNe^_X?N7=uP z$e;Vz_47$Xj~RwUMfK=qYghs8D4qO>o>E63AgC8by+N7o65L_7jUjnnW4 z8j(g$vGz0x$@8dY1CT`abeNY=7#x`p8H-Q{qU5hj#QoWkA}gGrbc`W=P!Vj2A@6aT zQ#Qh>A3Vw+-{lWOqvM_=$-~zP6N8A7Pa#7=Qu7p(1aVSh15yDqQUqcXQ-_isa+4$a z67%H}Yh6Pb=@MfD6HAkl1#`)~&tGP&gJ#<$_IRbt$0o)#q_!5vwv57d&GL?m7Pi zJ134orfwA`o}|H+Hl?Nx$Hhh^-Ui3U=cNI(t=#sWrAhov83e*vfv5BWl<0m!Wa?u?6@%&#|gR=DU!hv`)0|4=1I>J zQJUr{F%;>XBFQckX}m#6l)@mY=IPxOSs6i@1?J(R!e+AOS;yr$EeW;%>OsH{*M{{=ZXJo&wo$<*Z4motbKt{zyBLyWwau_ z%k_&uqBGdUh$sA?5!Q)Rdc*&LuTbMvI$PC_gJ1{d$rgbC8E-s?reWJnJxUcnc#hN+fc!A(;b8M*gumb0i;VB|9ZK( zOr1*|xn6&?DK|C8Z@RMczB)Yaie&5IV{-i{!zIhpeO593hp>{C?FPWIp6(ia7a!yM zr02V8sifVpVcUNVi6jMITCZ$);zx%pha)ei8rWc_u;#g7#gyTPu4BGv`GF~t8$=>J zpB}{WLr@&X3F95>Sh326A%;;hCKE?p3vlc!?ok0wdZR_ z`?wp+`_W>S>*RbnrK)IS4IPE}zd7q=<^_)snX1+gnZy)jq~qHFD=9TfvYVDIE~?v( zD=N*oDKZS~L}i}OYV{nPjFe5XNz`4k(NI%z$z?M%YsFNKE0eB4hK!33vo$Wu>bBd= z(`=?!v=ZvC-3+Y{S~L%8ZilIEIv9lUSsLhoI#T?G%>j`QWXXY_2i!u+OdhEDB{kl#%qvSarCljN2T2xlUEoy)ajAFD(crrIm z;+;?}_EOlEwzBZ!q}=P5YMgW_E30qWpEJ_Ed~7eb@hSr@{P>6M4XZ-ZzU~I0(`MUC zN0hsWd%Lzjtl9HaCQrp){HhtSrV8R{NV-`&oMp7BVi}-o-Es<*tA%dct7^S|zo;7^ zrV%ZT-&!vB8>+%g6qp%qSxf1-VwzzLt#*&>>R7cOYLJ9>cE{|<4WlSrvZJG&%>PCk9l(3P4F&Qm&%#HiB7dzJg$YO(Ag7KFlHMbR zBNK-sS%Qj?Y2HPsPZpqwrLiRzod;{d7GjKu4>M-mMVUz#Vy%o0vqF?dKxG)TpAw6) zt>4ACO`>X7?YEbn)e$Wa$)m3%Q1CwA(Ix&ORxEpJd!@b(VdpL=>sG92pNa?x%9oKVjsiqQYn@nt$7pMJujhx+uA`^4Z z!ta(ef-# zt;!VZC@mC15Tv=e1Bt;7smikOmqO-TI}msM%bz?6GO|+?=iTKTB@V--f>V{cFYC&6 z2`8RJQM>YXZ(|0*zkMv8Om)r{s$M^h>~9;*U4`3dG=Yx14vWQKqJ z*p2~0T2+RQ_&0%PDnC?`RbUWy#yqOD#BW@(-1qVRZPb_@nYw_rSAOAY*7lRiJQ`z4 zbR(I$iV15vN4RmCW_vQl>}bNfhRWi+u@Tm5>Q%uHPl@mxmn=N11hM$`U963^q?3cw z%R0twyOz;xt)Ispx&5{K0Vot0qNiHtr#pw+%SAn4dyYaAnWTooZw!ia;NaIb!D)5&aK?> zN$wnzVX}`H-XALp(J!5Ue?n(sn{@vcVNFlzd>mN}H9Fd79Y`?I3nM}w-4k|iq6cNp z)7E76KNp|KI;Qt*&BOzvdS7l^#xtkF>_jF}35H{GOdq+YmOvfv&&W!bV4^w68J&|C z7F}#e6v0L#jMg!Zl++NwoZ|?v?@iHIBpk|CggtuSJe76rg*CFIk#N;}s#oG{A)<^y5WFmg6Yh-b3Kb7LNDQf^Ntr{4k1z@0q0uZzF2rVC={&e^c) zHFBf|}E%cdJ zrU+EaF5VWQ#gpH9?Ih~Xb8PL0mFtxMEDO20o~NXl2H5$Rhf6^>Q;9|5I4cg&wYhDls8SWXWdy-MJ&F8GpT_@D9g3T|e z)$8%a6|2>c)GdHGkR7$(Cm)2_>BXzO#C4P{0QllH-0I*09so`ru)^j;5*EOZ5%d_q zL_MmrQRFtC%(abfe(Y+*${yf(;?D`?qx35C{tzgb7Od$ec^2%EWWv4v5~P3c8O5qS z!|27hq`~mw1STE~LGCwp;;+RX>V&}v*W_=$X9_*!u%T)~dMHuUN@GkSP#7w}FXjvk zR#y#wbr?GF3Req_!w7c{4UQEEPjCxQQ@2ZL!^lhv&v^~c!-yzgk0?@)C~=F3TnR@A zu>W*HhFXpQfJT!7RVh=q!OKECO%>N>(xu8kHr{LA7Dov^* zw~ulFA1pT^N#TxFuOB_4$gO8FFauH4p`6(?MI-ms$v~QotwKULS={G`j4a6Tr4<8@ zlk^@|wDAW`r^JngPy=`xS%AzY_hlMLA--$HJ`o~(6=}%tcN%BvIv{K@@EXJ_r!p7h z{=!arBIF^5=3XmE^&*CA=sb-Hl)9SWHut`44DfU3ayNEXuuc*jzqPG z5L2Oq)@ILt#f>dbf<{Y%h~5af?6G!V<7r&*3B#Rt)o4E1xz${fu*1!5URi0zFzDLR zte32FMH96pY!%dv#zTWRCD2BjL&PyC_{)hmG0TFxZTbBm^W2q}^L*7+GZ~n*CwJ=?qC12&c4? zND^;WZc#U7Aa$~`_f*IaMJn>79ZIWc*BDq0PS}^=SRhR*q9~Ja>l>lKOF$n2agb!t z+Ii--YA4+yPYZX?T2zQaWwca!iiKBZBQTdICCMu6(?bEn-rM5^0F^N5eo`w!$IAMP zlW6c=vLwm2iYF^!R}SmUOXv(7Cqb2|Q!+<4HRrTRIJJ*i7XP#BmglzDqgYAgk_2ag zW&G(wcN$wzP;?EOdE>@>rh7Wf>TAqC-_Le1OQJe8YD(d2RP=6G)}tTGad|VvKF-(i z7w&oV5EV<-*yq*|MFt1WQU-}>SI%Pv*v6LmE+i*Dh+4pNX5&J~X)F}PKB%*TTJenL zV`k)af}|RkN|ConA_S@p4OpcuaEV8FBdn&nO_?Ha+}>qLw1gBdR~p z;%1n^d77zxE~$B9gpiUh(`e?=lDgCxnJDGSKt??o#?mblwoE`3W~hVox>&NL{u@e~ zCu3=B3Ld7Ua9MrD`KgpgU&$P6Mayt*FlPZ5Q7oEMP^(g4PliVy7OS2n!{U1qW`MAx z2OGh7)%$tEX@!BT3n_(a6_$iv@^F5zg@vJ@W*EuedCHoDF{Sznlvz;&)V^#UHtU`I zx=SX@GAyj067t~T#a!p8T+FpoOeV$x(mz{jsV#vR5{zNF9>)JRoc%LoQ<3qQ4g|Yj zRNEyBn>eiv53CB>xhB|=`P@+F+H5vUC_jUhM$qzN+f``U+_)&x5;Piw9_>LX@kZbA zhbRJRuv?yyt7GDmoCb1-DJtOF6&}Z3g#%g)uv?uQnqLG(!Ve?J`Xa*bA{vy4?WkJ) zCUAP$!@41&{5{*kGTS0L+M>AFO)CGyZnPz2TIQQa5|xJqSyFU}TX(6e zM0vjPrfJy{q_!(Xs!{^t7DZi#(xPiO>as&aTRI#PGdsAIW9-aguEHF`!WKVlaC_19hLizo4Ya69S=kOsU|wNE_&ZC zLWsHh=&cxA%w=37#e>06)6nz6lLo+8jlV&ulO?1IKuc%cRa+kgb(Zv6p)z$(G9Dwd z{n9ct>NVT|^|c+EQR%418bS*b{il$9@z?_fuw)X&AvkV*TQHQ_XgL{o1Aj@V`CDWf zE97TUnGK$p3yb?QgguFx^AR-bfk<5Hpw4-3plCl1MzjsB@>qilULslBlMHdjlp5RN zVEcC}YqaK?snSw*!mBkvxgj8$Mxe&t3R8FYi^w30ktGdxA@k8#gdx(0X+AqJUwxe@ z#@e(QWiV2z*t+RndH%T9ro(!-IMTqoC19KQ=5IQOXp>fn8Y80A$deXpLgv+4^#_bh z>|1uNdrh=|PTeVH1!@jhd!%zl4IE2HX;%{e6q-y{6OxbD+$x(?d5dS=_p0wm*?;3b z(vXApDwrmWl0VYG-kkdQ7>$CRhJmB|D;?NtDTUWEy|~%aRW|Y+Q939#dK@sCIjk3$ zK+l$1u}ocJ_Bm4o8>_<&ocPr>-!?xh!I}DjF(;Eh*6?X0>^3Le4(*D+Bx}^|(usDV zvT76GPj#7RN;?~7S>lTZ@^oHmYtey*IQe3f-WA}aI{9t1WX4^uWmSGXC)tf2*!{RP z=PAx-*ueK}X~x6Z^RV(Z2~gtdo(bz{6WRJJyjC81bEH}}q&k^oqXkH_&526I;J&>*#m(oTp+&(A zp3{Qdy>0w4>M6CHQ<*uK~Kt~iCZ{lQdDRkP1) zX>@u27f?dqx$xx zFvpzr%VKA$uZbF0f}-+!J%wrcun560#YD*R9qczBsqA{TSS zFkNQ}JO+w&pES9jcuXHYU%3kM?kUP1dhs5AdZc53;!W&_9vQ0CaLf{8t1mm13w};( zVeWSC9aHj_2wX-d$3(Gi?n_)Bmg=6c4`M~(QH~AowZom3>mGbIo!i203tMN_+FZ2Y zm15UixCoq7f^4|s9V*nw)y6cn0nf+)jyv9=2sNiwGUOSXRALr>{Ebm7K__{`ssvqI zYu;61yhm2WmjNkHWmf?AaUB~%X(g|xuZL^~I^B2sXahUT8@vuKSiz1` z*0Trkr0Zo4#!5C$7K^grHT$==3Ln94V4F%6?On)G;oiD-E=bEzP{`TGD*R)(sxJxs>fyY~()lB7X-btdo7XcOy`#;{%-cfx&!1*dZQPQUJHe4Fr z==&ZVXJ0GI>HzUhRevd1%2k=b6pG^C{zNewf`6$8qwav0V~%znRM_ zatwkWwQlFV@x4Bpy^z<@L<(pR!8l^{=YY!;K^%$65jvK(1brAC`QBW@H)QfADWFLTx; z`Vy#5lueEPtQZm`&!$V6M#YKsq*aMrufmjB)alWlNu6>Hqy3IM!zA^k+gh=~4tq24LTt@XLHBaAuSDCtPtHU2S`<+~C#AGfOE1MVQ%yJJv{O$%1vOMrM#aetZ z#}yGg5zQF)O}8j`;oB%)8|_O>AaS!Yw^@fDhB#u0l|0iYg``#Up~4z!m?>;aTesap zyM0eFxfUkKT!vJx&D-coEHv25ezi8?%IKZUxtohBZR3xQ{>9e6b`Q+>C6`4+_~??^ z>Ud(OpN2YWsT+lDKjyd`H{>gQ{8(qclva2ylwD+*SC7w@P-7dzHaX3byDkZ1cdOo- zOPJSPxoxqMUb^parv^N5!3URkGaBhLt7wi#o-QNDZ%kWgyu79SU9t7vnp}F(4v@ph z7e5$u>==CyZov$bS>)>sCk=AU#unH1paNBRkJ$F-CHx6;rEs{2_#2@!uYbxog zT;b%6#T-nwjeLvv&Zkv7^sG?`wmc<58s3O@9oXTNsc--kbb z`5gtDJ@p?)?4o&HH*4TyX(nHup34 zpz$Dsz|^&DMI5{k0Xwq4;_+^M4P;>Pj3+w(F_3$v`<_!~hd_>{@PO`85P%5wBG)Oe ze0i#%<@$!Q7XEL3M?_*0m1w4fP{wB6`v_nZbdmg=5Q{`a*a5&kaI9bK{{rzM?Q0+8CU+uKAWi}kZtqhFgppyl)*5E5D6w0G3T

%?XI#~rPZLg!&nxN6g`?U zN91@5$VtDeK!SPdtmmF1P@=>u#iWYzAw9i6*e`d1s5}XY5bU zASyO0byR9aMk<)pJeJSVZW!mEhllRH8z1`EN6_}^Gk|OYTh^?>;sXyvJ(EKvnTL1Z zC3y39_u-%~{2Q=)2gVW;=vlrW-g)jhgi1}^`m0}IIG4ckzIn*+*osBbg*f%L8-yZO zU$YL6{Qi&l*lDMUCTsJKZ8+etRrt}h*W-fozX|7@0gS%l6CsGpe?9)tY5a%bdrdp0jw)VNEI8ano zo)+BY7h8+?HW|f%#)OV{8rPU~lK7LKpotO{6J(9N? zhi?uBsZk`^M45un79fHTC7_aL?X!N3dqzdh`8MFdJRmZlk#&>cK{6vqsv7s z3I$}3p33BemJ{)MpcKull6Kt(H}7lJfmn`dJP@l+=7|c`hJADu2*WK6z=YbsM5&4a zhewLRrooimBEkybCx@JtvRv;dRHvOhYX{y(oSf6yhhleY4nhfw-{Atuxth?1Op21U z1r}i1Wb@Fn?lx0?BIjVQGR15Z>@T84ruD9=wc!77e|I*Rh|Pjhl}3;6gTZdxMcjTj z_&SA5Q6xW6hZ8}k4o9s9&A~zC-p=t|1;1&^HRH=fE6okx>~AD#!1}vQ#THh^dn&^Z z67rjkt3$Fbcop;AkeoyWtl=;zb!140Lla+?u4RgXve$rrXtAf*^PkSQbT2NALb zIy&L?1(8T)p*r1S*UG$)Qn7%1E)Jj9je}S0hikugB@R36F!TDNcva^`NxGDUcGRf3 zk{E1Rq#ETav#4sCOWRllUN7eI3Bwl%tD37%)%1Bzm#fRsa(G$}N3)nOC&xyH-+b+r zSAO}WuYdjVnOBkh_YX!MuDjtIuRr?NpI&_FB`O7wZ^V*NLQ%vGZ8ZO^Upqs?c27Z zzqbd+9dj&}?7LVHiLIM9qb=HnO1X(WV-uLw-;Y$WfY;WpM~=D?&L@fHn2oKh6r4Ip zBDO6OYf@ER%yy@8?_&=be2vLIE!-%_;D5aAqs!T?0ik&_i2wpC2-XL-Xvw6^ceoW=*xXxGrFXF`l+N|cm;R)cxbH63U z+!J@+hFp3Is-fY-CmfIVwjMn6$G>1WIf)L19B$K_I>^aqdk2CCtiaM$hv1L*+=H)u z?QBeC66omd#qF0~Eu8O0TM%Eo?h1?#?t#x6fZy%If8Y2ceDss2z*#Eb$=mONvs4rt zJDtsVsS0n>&F8^o_;$;y@RhJtwK@#o-dwU8{8;PUEd)tYcLYVedDaQobdF`d@sK$j6lA(@nf zZKvCb8mWg~9s8VkJi7X4{D2H=%IMyp}%1F^KYVi;aq&^zplg9XP(BQ za4%9rd!Wzlf)Q>TVRh8hl+HSo75LIOM}eqdYnRx5q%UT*6ZiK7>vGZPn^vurd<@8Wvg(ipL$ z)HpbIs%SAtkyHL~8^%&*K0}Ak4=*%K<`eQ-J^m0HtvZJDd30(jBHtiwB$cGJC^ZkYOyg zQpg-aN6L$}F@?zH@#B%Cu8%HfemXO9_z4aIO~grYDiX>^y2;+A&HOzvQL@1Y>pMmA zc5!dYSj+}O<)obXOOh+WX}g93DaZ|Gb(mBm{^3*7d@ZWF5KvqqcBVVu2R0Ayqqi{m z^)}7QY98!M$Eth&ndX6-4^y+jwTA_=bGmt`JDIJ}kYi=gK9;C}(<#^16tB;Pb20Fx zv#=+X!Nv#w3T4Mu9P93cQqCf8v@lsN$r?>pGe=89M@Kh?21k+dIq+OPg{^g9oJfq{ zCwVL7d>$IHJhy@2auyAr4hhftoJ6m3X&_B`xfyB!?hl{j7h;%wD z7d1CI-Zb1qNLOO>z?*?nFJGOSiUu-G8Zj$~2EF*|zkLP|-F_=JzV;#>_}!i8=m;ZI z${;wqAJ6>xFYp@ytUUY}5egv^22yF%USEqJp7Tx2Ejq-hr-BxCIjcDL{yTtG2b#fH znLNff?n3v#Y~1i)KSQck#;&muEbUu>E5CUukgou#gz2!-$N|+ne*MMIAvKF2!t1Cp5obCT6^fX!#f`6wn?F zV=|M1!wBH?E3U=V*f^fM^)@(5d6eD2XV3mJl-}9+&5v$E#ATqGNuya#ONgJt;X;64 z4psmFAOJ~3K~!FGA-sGA4n5&mTyw=`2uDKr&UIG;19NfTXTO5s)C78#F2SBk7T>w| z9=vkjAJEp)P%9L$?~0{(;{N-w{h1eK3dhZh#x*|6m%r{-QOFmCnKlsep^!F3l6G<^ zCxgAJDXuJJbMSI%DptZ)i)sRP(>tg53|Nnuu>D^10%c&K=j105R0HH00`Q3(wWWI_>TL7c+Ec~4v*gBcUf>np&kW){@&K+BD6tBy-HVNem0RtfQ zr*7tE1)wfUj4~0AYI0uo|kHlt508sDh-E z5H%hGE0`OYd=bUuCLq-(pPRHXE=Jbla=WZrhFH zF1P@NpWcl8$gnuLlyw~o|LrrtVMhV9{(b2sWY#=`crGIXUut61hK_8O>;c;lYGqPL?H`<-wk{$4UN0QkGP+tW9CG*}&@Mj@*suYGo9;kt!&_)G++xj}Lj@%^ z)OE7Io!~@SQONZ+DGNm3%Bm9?)qzE)enQS?cJ*p#*&Gz2i8k4V{BLuIdB6Sne|$_z zHBw~ldr!W6Zk53c9167@VAt_dln-6RAQTBgF!G zprS3@hFCg-YCh9eDUTTj-5lbdy2D_M|?OYZv(op?DakyaNK@NyKjF+mI>+qPv$p5W*kOoc_1A=U`jw~n6mX?S;N*i78s#SRE4Y-At z%p$)kZiS-hDQ2_| z=Dx_n*`-oM?LdwhM_i`7J~-N=@Ex)e`GXI_x?Q_5_|$XIw(rJaE=#t$Z+H3dJ&tg^l6r4{ed=QvPo$0psKi#rl&?IAZ|;9r<|&82Ep02 zqsu8&Z@y<4AlsjtHJ+S*bKpf*gX$s`pLsu~=F~R#k@}5BAtHcwNd3zkFusO~Jg~ki zOLNd71qDCPHyD`S1iH(5Bv^YvuELw^S+Kd?z$fbA2@)s&;BwNE|@3K z88sVSowG5#Cyh7OZbGO%iqUu+&%W@2@HR0e=V{(a~kdpgpui;h20J(<{WhlBHgpG@uj!0Yj6bG zoK75m;<1?6GlFLyeH5-z4gY%Tr{GalOzz%=S64p3}3HAN$FV<5xHS7>6Em z5cb5zaLQFzvPJ z>H%08XG-RGHXVFHt^=7Y6d!dTgMSP*N#lt9F8)XPm&(>e5dgJ^Sk z%-1pVV@-}UL+VIVXw{MNs?ez2sn$`;m!uhWIfxi?GF=xZDhaz1Yh{K;anQm)q?~ao z#%Wevc(j7F3Qxt##$j1Y$0VY&3~Un$C^z^Pbgu`yQfZ`oAsqc5|AEXcx1vR>(n=i@ zOdt+*V$Q5NFmiRYVq=I^W1zaW>2Zilt5S8LtQ%Nx?Uh)2#~pACCgCjswMr8WzkyfN zyHPc~DDZyPR9UxuEeE=5F65g@1id|&s3g${IN>rhKAFUT z7Dl;LLdMxdRck@fny6Na0I3z6K3A&f2t`oLWwCHz9{h$5wNQpK8bg3CN<`tR1r$XS zLy@B<`i7>HSg!)T&IvUyDW`bt=bTNfIQnR@ZQb(7YIN{EB4tj3In4Ws$lL$Pml@n; zq7LtFAoe~R3nST2d1rFJbeb|(_Lo(MiiX>Vb(y$`hxKR}>&MN4zq_*w6O)s&&&~jt zKxe;?^rBM8W1^BqP;o;KdJ)eiWuF;{MvzD(g-*o$2&LL!uC=@;uiuY2?=_+hZoj;b z(Mn!41QB0A)^$>!`a)qbmq=Et==8V+siX4}*UT>73(Y!$ngJJ!IL(C#24!-uwu007 z*&`0G`1y}HY8WfmFjw#qpkX-wXXJtF7IhB{8Kf&+ttpAjdDAlmotjsibV#vcdbVH2 zr{;QOHjMnFwzS#|k(2d=g99Q9?`h^{oEeJ(MWM1~5zAYh)fK7EY(6>IQ5`5Yt7x~2ED=ko7T)cN*_R5`atACN@a_U@PFPsa0#pmWln*M?o(13I)oBUS1KY8 zwQ5tAQ7^6Mt93~Mk5ww7<*4<}!t1(*1qZK0Y5R7>-du;{jW!s?JaQ;Q)kx)0Q6-}4 z^`UK6FE(s^N6?tHXkZ)9uWGt*wW&T-Y4NN0k#1F>c6Op{xUqis4wK{NbV=?7^Jlmo z5PjfUXj|FO)XmxkK6aBJ0diK2$!nNvshoAzoMIlNLRC~NV!#%Im~|>qCAuUvXnND+ zP}D@+1$mUA5BHyz7zEK7j}2s?tqmTJUua7@le0B9f`(71d#S_(YL$XC4>#O!Jq}&9 z3Txk3gIzneNmILi-CF2w<~r0cyRQd(_6!TPopYtR^XDNHY(qRAN3LK7-c3x6OVarK z`3uqB-icr+((3B$8qbwWFN}@s`AadCfAW;iewOm5zx#Us<^e5b{gvOp{?!NmaA_)@ zQoelYrRe;~Nm#ReCrZ_Zz|C~oNo7;wP0NkhrWFYkGh^~^2d5Fz;lZ*S0h`LhX}COQ zb-*Ilv5IqPNM=xcB$$JtLhSH3aUm)}K{Xe}8O?(|{pWk4J*q9@e)r_x6#8(wAkB!x z+3%$|ak|GEh=T8#Xo1OD+pB#bZ`yudyD5@I%hFHG)PLA?C0>m7doJdSSh4?dy!^@w zxbOaZ<)WN7rxz;^UXGrwHoW<_H5eNmLcLy*9m3<{`>CT=t7FdGMPhM2I5LI9jyM7X zix**dY#fP9R)k9|u4qvv8w)iW)H>Mqat!RFKAzgX`Q;ge0t5`x58fG;;D4>inG>{H zYeBrDG?47+z~y({js>eegwlpRIQ6tM@P+SQh)5eOlcO{3up;H1mGgGRZAzukNb(#c`5o;~xM=K@QYVfD@bjmqdG zR0bN=OK8?9cC4Wp3Zwt1qa@$p#>=n76+ihA&=x}W#h0=9iRW?1p@-w8^>5;cYp;=M z_SoZ(t*Znsy$05zA6u%g0CKY8K`E*-U6N$gWO z`tUe>qJ2m>8YuCeELGrwBHsCQD{Hi>&>Su_tTcP6L2N;~(3H&3C{k$bFS~@W7j=H8 z!v{AB(LOPmp2#DA&!Hlv>4h6@xrYAkS=ci+Dvn=@ zM~4>l$vIOe^YH5)jFq#J6weNaHs226M$vH+LagX~0K;F4JHw;7G7xi=Y0_e4h>&vygFHBt3JNr)I}S>AA<%cqdY5N|O=} zn3y^qj$lVBhAB4ap#VnGS)nv7YVSs?(!f-93Y}^QZjXk++>}hd{T)&48lMofAnNrZ zSFfN{sUspdC6GqVY#Q3zF%*l5t5Z*~O%jcVg^mRDQ50IpW3paBx5o>^>%m|=E*TL$ z9UT~-nv&n+8st-4sI+SEX&jtY<=AFxq+FWdU&P^)=3xXCj8*EGE5tS}eO%Bw1h0Ux3ij$D-tMW7`|AVdqoN;4p6p;d%}E zO5QYov4%-%AcXGz0c?Ed9aL$4;;Le>S;I(+&QvO#mJ_N=^s;i*MU)iGpdH>LX4@v|Y6zLMg=Qf<-PGX*U!cmn-iIZ4>dy3=IRD2f3lGP1vR* zvB;4|hx~9h50)0fL>%^tqwUW!6G5?m)^3#SX2}*s+sFbxvu*b!4Ud(+&4xr87rEG4 zSU7)yh+!Umz|86D%yLnToW)23eGyN_DsusdzFxerc|D$d@oD&U2bS-%FHZf)$B|E`FsG*%E9cFFPRhosYw?ROe*?}^ z7K_8Zm~2$>LUsz+e-SSJ-EHV!v>z~1!nvRMJg&Osr-;s;CH92B{K-w2*g1sn{p_a_ ztDD%l14Dn?AiUK+e;6;l_A=DY0G1wk7`}bwHP}5mj3t#-oIoP%4O_XD47&YL} zzr7CwbNX=fhd%^=R}|Y`c^Pj#`7A!V@-WnPj^J<4J_WZ@fumIt@|znPYM{rvADME_ zghf3%rn2S~jhyO4sfbRyc`$tV#FbZIa%>VW|KitZ)$_tD-v98!G5gfhB_$~H*fUu3 z>@!GYN6_x|qtvJ&UTHo`z+#uFSz+NVbPZB!S`9eq05To1WUf1+eGt8asdM0BS790_TqtWgCaPs* z;S^u*JjyVf0hy-oy;DnJxILIErw}sQF;a{n=hEu}f51LffE)aY4l4y1>iT zdKn&H5QS0>4q7FeAiSL8m_xxtp)Bt)Q!YU>49O2z>WUNP z786N57H66~YNo={U4+D~CJZBhYO!c)ML4apY7UzdFZu?FgJ6?pdA!JRWp!xYbenXn zj~@YS-Uy85fT=vhls_0W?R;4wmebPMB9;?t88+9|Y8@WUBPe5uDb~RNYRL>-I-S_u zsN~YfJDcLlRH-$vpnnd^;|YZN=5SJiCf9rx`;8(R9$;#G9NiuU#MLFRt;nFwXjG0J zX|aaiC(|~y)`YuQhqt{0l|~8KVgVjSMJACHabzgkCMZ}Yo9tX@N>s>%M9$e7~iE?)%MLK?YNQ|wlGuEyyo17K-i55|Ybq_`&6pFbZ|={(15 z0~Ps7*|fZs=D{npB{mOCASUu4)8zk!w!{X#Mp_B!Hf|kLsAHg8&XUcqbFIvc%akn3(}w{o~Dp`R@L|(3V7iFIpcW57dW>m7c6sq%E;| z5E*a{qGOSXz3#?jrHqMY6MF9)tV!jOb1Kl)2As(x_ES`}D++Y4CVH4^lXSW=oRKzk z_4ecKwdX+ zKwz_8c&(ZZ0a1cF8bl9Ws?=_*+w7bzsrRURko+dI8L2eP`cr8t(}HOkhI2Wf=7y#h zJkPWiZJa%T#v zE0(z0Mh}G6OFEP4l!H>t<)1B5ZnrAdlzzV;G`6@;N+t_1uf5psD@ zspo~g!Og3{C;-EYcZvm6BOweMUVQ4W4*@-Wfa(U)In&_W=f=4g{X3p}<#{;O1_t{3 z@aNU5&CS`Zn@P8|Cbr)26Rf%IUSyJS931M!P{ejFeF#g8DVWPjUC$;l(TU(*vU5( zWVz{aG4py5@`o_Abq9WZ<4p)SJ>uFF^6FSHFo2EgUdPh5S!l)M=zt3hljoGB4mJ;p zEbJ_f?B>Ct=}>eRVmZ@7m$tf`oOcF-n961V!;dq+cMY}HUK-+>Co=Bmu zs}})JP^PWp#*9F95pWc=r4SE8CugDvDf0|OY@y&K)Z5FC{j zTnz<&!;cc_Fci)<=*;DS+fb1zBt^KcIs#Jgks83vhgh{B$AaGbY<_v)@meV{2u*Pc zRjFAj3H^-%$SBV_VQbQ!cz;_-s9X{W*-Gezc~h8wNZYah&h?Xq30#QXUc|~3DXgm$X(>yf zlN*R4bU-%S^1Fr`6V)2x^j+6I*i$JX=u{Cg-0&952svHCgvu65X!E&|<8|(2ovx!< zsY2%vfZSe&DTx+?&bMZvV)E(tT0ELHh$+$(gTSguj39C=cFWTxiA5n(2&p?H^iKG< zq`yHI7JNxF5RZm1=L?@k`uQiYW5-75blGVsh_QO90UZ^(^R`g-uq-432KcHD1j=q? zoC@~+;dk)T1HVIc>nObW7NVLV_ft{_%IyK{sArKXl@P3}Xq4-4_}!?~o2cc>2>Jp@ zWYaig)nSN_Pm10_qyCESXtO&}^=a6-Z95v3CZZlU9L1Uh(Up=p7^LRq)9|z#&|C`g zlLK{U%Thse|PCHwizq1oO&-_{(-US&U+sc!GYSZq=X_>k@u zZ3M->LB)koD2TySTqfjf7)ZtAp6633YSod-leEO7>kg#S38Y&MbQyG5bBdKUzq$hf z6tY>kc@49W_ZUbQ3xY<7Ejk;0TFR>LZXV`4Jf@Ah4wJUT28RO^HY_s)(`+6poDB2X z7~ZMWG0t#5E=_I^hRY>H4ILqej%q$986^>?3qiNr)IroLaFK#CqhYZ75pD(m03ZNK zL_t&=i1$`o=6Nw`LW&?lWCC!|Vzv?-!0?IcLNha6)>!Az9ZT3P96-_WM|Hu`U`7pv zx9@gT`p24w88jygJ29`7y?V}n#BIrL9)zJm!L&3FW=;gJOEwQg;kX4DX4V|)P8Dfd z+D4+7f5ee^V9i@tbjZOd6q8v0{8QLh^}t&xAz!b-ubY;~iE15cM-<(?v+>TG>!CT_ zDA7sD(ZUu-3ps}i&0GbgRt0Wn2vx&_NwtYqdjuPXhoI;l=q|Tp@dSK9v24v13P@!# zVpq>E)}VGynbf7$V|KKF%_Omh<8~cO^Ng8-Y5tth_8q2s6N`AE*EL&$Jn%khG|2lT zbH+I>n3flmM$Ca=SC`~G#FH7Jfs(eQE2_{~E5)?9EgiUgiMTDTI%oy%y!}>jB&3CG zHkB3)Q6Zl}AmGD(OO~Rmt4o@P!NEQ9UKv2gbC%2`5uc37XD7W z!Lg~>Jrn8tYv-STK9_;N`}zRd5|oV>UUBu?fBMT6`9w}&^{ ze#MT`ZjPoOo1xj@>&>J&%|tcCDwbj+CKc9Ms5zuL&Il?Y znC)<5soRICSKh!v!-YfV&c)MD{}Bgt&4#N`gjTIVuRGykxQtSOi=&Wq8UBDz1ZO*P z1-WszXL6Xeco_~q`Cp(IeyknZjlLE8VfJTF#X~pWh!@tpgkZpnh~dZi*Io~#GI-{e z+u$zO(BpRF^@ktD)XqW7hl*}*2;+q~>J9_V?g&2i-HU(&mIG@y;r?I!3TIq#F|c%B zU}zAJ-uoL&CSv&fIbTB2(Zq|-J&Sq42o`?yR198uJ+{C0Cg%3fK_#7mzony4D`Tu$ zK;G@dSRsd4z91n`&9X_d;U+mN=!LUVK}1pEDwWZtXvnwdw%|pEX_nBSIvprAnBx#d zGMAL|p?Q6n%w^x*JXi_T@CI?*1?Qvvgrk5R6!{haov028p>9)D%Z1EKF)e9_93!(B zasu-f0R8<)zWfRze$M42MG?pq0H4pyO-ScWS_RPnPKi0$V1-{u0$ouc9tRx!e{*6a zKf{q0GaG2AZg_xPR@`Pwpq*Ky&XdIuH$*#n#8 z`?gdJC@yr>8VEL<28%`$)GY*^B0e?%6*`>xB|NA=VJ3rq=!jD@ zUF0~qO3 zhI88l{8cA1xeWB#voPmdU%+F3eGo%qV>su$^YHd-Yq8&w<@m$@^K-H0J@bkSaO<6S z;!CH04vzT?e#*eQ3z7*M7OTp6li}2NRzK#d( zxC^;t43Uly+B&0Hb?BjZ><@oJcH=HAJLDiN`OHbU`+@sV-8GJ4HiwSI^Pp=wcD=Cy z9qn!K_jMzg%b};cAIE+8IK1)N8kDLP42}$AUT+`by9Tj!Y!Gu#JQ!NDhV0|7Vt+k= z4yJrF#7}jgRxXN0MFN;84z(u297B`(MS8|$vxa4#Izvv#?uS<++EUJaX>GXk5TE;&dR{gsWPHF3g4|Ji1$u zk20HguOG=q9XqmF(PPXC1~HMzhz_ewbs{8b!e!zb=n4ejrz_j^V9uP4iH4HLn+M$D zY1)Poj;5_K;Qh+_Ml6=54JY>ICz$7JW>X?gleQJCO|AbYn}_!{1&x`og;gF(z4JbT z>6x@_{wR+<9TWLRslnj%ohxEPY0B1R8;Q7e2h^G(10lLv6}W~4f*4qJ7<}`Vqo}EP z>V?O!`OVj`zi!Am%9IN5QHNP;prAR?Y>Oh&GYi|^+$gl8RHKHWS_NxK-&A$kv)Eob z6az{)gnCC5ldU?|?b=}(O%S3Yu~mE{f)7YHRIgicPOQ2&NdCf@ym= z&c}HT%0SqP8nAzl*Q;o7t!xmX?=ss(=uC8RGBY8V{4F#lyLn(^+TIS2$A^5eibB33 zgLSSEwDhf43ven89C*MI{OqSc#`2|$aoa7w5*un=Q^i1N)~p^uqbJA4ao~y-f|eu_ z3G5u)EzP?>7?5F8CX+@gnGhXOCY{4ROP3-T2*d9WCxU+CuAz~Udpyyux6U}@jA_r# znH|IjHV^N7>(VPXJ-qs=LL#G_{N*p9>&#QJHa>+|xr&l}@QTH`rBKA2-v2!{$fWnxjSK>s6LVaCq$Va1?d`($i3wEbEzD_dp3|Zr;!H;* zhkQXV79P9|+lF_*<@HF@Q?Jx9tE~-hz4`_ww(NkX*?`_^i8bh=Sv|;%jv)*cA=Q9p z1TdJ5Ax?oJa~+&c?2J!g#j>U1B1K+kDx1dUU3=gPt4P-Bh(>+*#x>W<`x(FCXTVfi zTs#6z6~UHM>`J#c3&?p@Y%kXlpK+@Yb`Lm!N!pb9RCEOc7$2qZ(t$LcaWn(zY6V_J zhg)@`Sj(Z!%O)=`!Z%LX?B>Da^&nO#32liv4=rB+pSbi=6b&a{f8j|et*V^!d_0RN zf^aDs3Y=^iPBa`vcs(w-N_BAd*?st7Sbq3nxclZ`!mqoqWz*Z}4u{bnZbNn|21Rw5 zA%}$$y4yP?wY5^oL(`p58f9qB1`Lk}xm*o7`ahRU#G&R=QRh&gQJ0{$_MR?m*}4^- zo!uxF^HPZM`HJ~0TBRy_17VcnNoid6U$PkGOa|$xam?%MMDt_mH|Rj z+=5KnUfsz+EnSN5Op^^MojGV7>qoW3>(}(cCIynI)9ye3iA-M7yGxl8maIGg$N%dm zaNQM`p*vH@61M?Yv4|DzZDMBQ>kYFnvLJr3VwAUJHwxz4V{^foy(Ictm73H5 zCgaBnU$eNyEiUK|R2xj5)i6;rg@6v-0awc*MNcAIM5hPnap*#GV3IpUt1O^peK9S+ z<)t)THP2a*!a8b-xEXMUz4vX(YHIpRn1^$Q0sFL@)r_LUE?P`xjagjU=c24Qk@2^o z|APNO?T%k#_nw`I>IM)BBT9QwzaOvt*RQeaqHhE5tii~m55u786xl(#4>ojcBmPUw3zzPT6~DU~7~YNav#(*}+Vwd6tbY@_!0Y!v zgx>x>^c;COnv>($@YY5gaO&yUaQE*dglWmK$H@t44i90=*iH-_c>p|g7kqFv9>3*& z9Niv)JI~A*2RuZgsC!X({!NgLVrg;ScW5Y5tZsPFbHa&2soM77AJOJerI~d)T5vJ* zku(O<79^L!bnD@FPN+GVCf}L=mUC_!dPuQp<`alJp&%CK#cEzlwt&LEZp;FYx+J@} zF~6JBZhjZKE*l9rk!v)OZnXr7XodXPO2nARg4aZks3zd#oqN!jtbOE>YbceOWZr_$ zW61kRmy7VSU?c68?q!_%2g8E2Cu$Y=pup$zBbLufjXe%ic?D0x7$+UVFq0L531_!)7wHa%Teex6wd0+u6 zo;zaSYC2}UUomDk5Oz~xhSBX6$iJ((_y;r(|9>_Q4QB(*8nqf`lDb&Z8eS1hC!0+a z0};fvAU02qqJ$E<6b1VzD*7}{v|OZ@mYYDqrJ&y3f%g7>Y<%+_)Eo*XO9kv|0o&!C z5RWQ&NRD#2QJ{V$8bDG7w$kxS3_4swMb%X|oHPn(GUtouj9ZeaTea_vy)-5!ZE+_>x4%DvE5|}w2R`bB7qRwHMW!OWPCW@!0n+Jyr z{ zq|w$E#hf{FEQ6f}Ca0zlOT?vKrO8pfQH9~A7Oy5$(qJfp?(SYvo#VQ${$g-+?A~+# z<2&2mFI}4N_XC@UP3K>Hu#+C*rJuCwLaCTXrBr~IP?gK%))k8s@i1=Qyx=2kQ49_a!|(OL*(}Rv zVe#K&hfZ);b)ZxC4!q2yKR?KQmf0AsuVO_m={$s}weh|gSgHMS1z z#OmMv29c)^sP$~ za=CH*DaYf@7oJCHa11J%NCG(T(*JZPZPGAl<#_J`}(~cr^f6F21 z@O$!Ubh#DuDsDMOy@ ziC~%f?yqH9(5G(u}=VnEb#UQU~ZpOPnA?0 zdRG^={q<=qJmp^`J-ybf!gav@*z~*mv2UmcH(YrIG7$}J!7w@|tMGP2aMX4Gj-hM{ z%LCnb_&4|ABgdbFk+D%c{o2bo<+M-Ys_$Kk%Pzbay$hFM=Zi06U|;}$xa%HdHw|LR z{>!lP(x_SyK>x4wlci-U3*wL~5Z4nG{l z&D-$6!+*r*FaCF+zXP}2a2*a(j1$3y-b~!mhE%=om`eA95*dX#e@QWdk?^l#f=YE(!W&Vs@BvxZN zV+r`*XiNXMn}@Q6Y)MF*C75QFQ6X)~S%*u`Sp$WNNnNU|E~Lor@OrQ%U&f}E6E&|7 zx>|=XpTm-d0|P4cBy3|D1n5AD$8uIXqVwir-P*V0JPnnL7-|4X(xF^#sMRKP=%_(O z26Z$d5tMx%Y#JFfjSC!_urWwkmFz7xCk%nJ#Lw@}1~W~6Y$l4-YT|6Sm)>L#nE56- z&F9Ty3#lddix4wwtt#E#96}wX+Y)V$NyD`^L$P?Z)NCe)(cywO5{9a}k;xV$;FHY` zA#3(P^-5ltzC<2w`tg5a<^D@>*PXXx!}_&S=l1o?5(WfyV8LJr$wUkb7R-m&=f}{{ z5EAJWIyyQ8jTjysL05a5il2;(j^2IY<<}3tXN#Hs=La_r z=Usf|#z!8xsu;^Cr+oD*h z>weBTJ#G5q`{UPh&DAsA)zwueyzg^A&m9(y?}EZ(Azv_f96txNrG?a|`KbyyoY@Sf z=cW;jsK{s1&|@0fwFbDbMI~UaBi&g^lBUxHg=M)eQO+mgx+G=t;^QLQv@8^>HQ@)M#Oe>-SA=zMk09X_xGYaJ%-~?T!T|D zI1|IGmtpP6Cn1{43twM2Fl}-MW5Bk3_~zTL!g;5kgn{lf?)l{}@K0}fJK7IFhw7n& zNGmaf6bJ1PIXM7WNmYZn(uVTC@R-DPSR4X|&N2zBbTi z;ioDXZCJ=h6#=siX1c^RxlbCVi$!`&#;!)AfuY`B)QWSGl6p*9hikN%HmgS zMF}2)Kpwxd&(4fZor4<3OpAhPprM4t;*0o%>I=to`SKvQB`e7_{faTCI%njY5Fq+_@BY6@$tHKfYyHzrMSSUW^;_O#m3qb_| zMeubNhx|EDsOrcyz`aS2Br$2$anNTfuqaB2Pvm5HnXM$fh)L4r-SxNV9<;Zhl8;RuZ-6g9nfEuweY)mnK19XntKfx|8g~qL=?|G@EA7!!_~mOzr)UZAHZTwg+dXZmOwF@ zz@iUcj~5<#2E_hGCDZC zZ3m8DeKNK`@(_-@^gQg@vK{x{_FWA3FU8yL_!@R>dlhR2SKud~{34DVJ`9!CtGbF$ zeB)+3^w=Xf^Yjfc#^wZc53E>?M}GVh?0o7)oO$LMIOz+Y0CsM{_~baOwu!|n)`7^2=XgK-HiyXfOg) zESebjS_erx^Ck~m&*eGj+36X~xE9t74@p4POuZq1t2^6`smdH`v_Mr==y4qfs}&4ovj|%*4%RD@1Ch^W zFkUVot&&n|AQoeTl2mC=EKEwH9@dV62M5U0_~Wn8mi`<(^oB4`TOvJ}^#wKVF&Zf_ z)UVx!rADA8vZ%W*wp9xAfFYGiqTXttWVy&P=OUejT`eOU3PIOAXE&AFIntke{TFZQ zh2X(cX!z49pWfu3G5?k&VD!dJf(`$4FbbE~g`7w4n}4f$u<&+YSp5C}1sR-Dzi`??1c;(ftsDvCGwA&cBfOa|!C6a_)X~HpVwk1I&T6AC$I+-M1+_l}K<0_my zXu`-K^@!_mn@!uemj}XPnqMbq5IT}+O1(#M^uh-4!s!B=zSKOhDNW!MSi91(iRXvU z*R0q63_KWcNedRAWd&hU9O+Ofjc?wB5$M?*B5DlPS`)EYQnH;~lg2bQtacr$>f*%p zt8w$qU&a|H9gpALeK%fu>3NKgkBbZ7z~BICm6B)B0|jlPiBvi*x&}5nN#m!^mF)&j z&uaBLVliD@2!|Fe#_;0Bg^p$3JT`vhj(`8+H#kiHs~>+AJn)g*-uKZ@?Y!^4&(x=i zp)20|UZnrwE!aFgjmf5gj^aQgV)q@37CI3HMRHI;iz?lxEqUV+Q{GhY!O>(uN0QMH zHI)Iifdz*@-VZjxKrqcxSlpLfzQ2AFwTcA1P@g%n1lVuWKteSnwty7jI}D- z%^K>piipklx_R=CjE%_!K=Ca*oXKbs5tZUjL!2`9jgE_xjbYh{YB5xb6`4y5(~QSf zgn?1S^n@IT!JYv`v^WSsxQU2&lhHu!-~sG-@mY)?-is4XUWfDE^cr0F=1Xy8wg5X6 z!Ko*migt_h4i(O15xI(qZ(sjjTzBm|fa8|oz)$Z$zp6oBz82G8|0e9&iljV8Df+Q2 zBtw7})6rJ4m}@dglA|CZ^E$E#4N5d3G%O{l!)%#wN)(>Pkcww9U9X|4tC)%dhm|&_ zX4^PDlSkGJp*P!wnaK%MP{-2b5ZrnjT1-JG8^c7ofL7Q-Uso6EV-rZllW2Fs2xZdP z->RXNjA6oPqu#a5X8rI0w@)Ftl_CQ&W@Z@6I7)8mQ0ABF*IDI>nb! z=(dZVbP`6jfvVF+m!86GldjdCP2FUxiLPu8Q{@r^rwI7~03ZNKL_t)XbQYI>*W^_IpKKh_`&V?4jWm2^qw10O$Vr2%IQ6pf$ed!fUJo*H3 z(sCn>h6S)HLdP)*f4#nlC#8$4IMV7s*Jx}ImdQ^-i=ttA6Og`G42?G3gn%{KwCEm6 zri0bGCe#L}Sx3a7#=sSiZ4YewL0Z%c5F8VOM&g)kw?IiV<>xgx((Mz`wh}_avC*yT z7;QE&kWS!8wIO*L#U`-ixb?X3omb*BAN>#(b5nqT=1%ndD^Iq9oUo!ic1G(D2%C22XFn{moRq64={0HpU_SaOJmhrE{B~= z;P*fKAH3_zD*&U4@dy6^b*_Spo)&7~n9;=PAGjWS{`drHF3}ZVFpla4&hoh+JVf3zBfwddY#HMGTLSe@qIlgOGtbti9V{G#-#8SG1!0A01 zJpbg=IJjp&UU%`uh-nf0{8vB6@X%sh@}@W9p5Nb#sqqg zi;`Ka+HfM4e)mhj!TtEdJO34p(S4G|l0yPT)X)nJ1BxaEqv4OF_=z+JrlGXLz?5y` zMTq87 z7%SBT;CICnNa!id6{e6)CM6-c-fqZq#$r)eEkh=_%Q9IsT1{yNvHRbj&7)K*%4C$F znqYOb+Q2fMsxbwHW*uDw2@w^|4jpt{#Ax===?LdrD0dwjdPEa9Gy)=_ErsIfME+9q zK=8ozNi+{GFb^JRm_V-v<~W+H0Z27dQEnRo7MfuV1=~bC+lBq*g5=L+qY<$(ZdN@F z8yf`2Bxy)d^Q>sIX)zdUa)Qk13v)m^eyXrv@6+8#sFCy89>I<4&8vK+!#q8br&4^G ze0rHfCWHvZSr&2<N^kr32S2(<=1^&r`=)iQ?@y-h4A1od4gz!`AC>_{6UJ z@Bh42tcR|6@Ac6B{z_~aAH!I!35!Bx(uRCn)F5LqD2#>A@4GJrs4bu&1%-1^TytTO z$M_QrUi`uMhmTRC9w#e!KJqMOEaZa+3YHgY4Ojs4{{eWQ{Z?@D<>z>!BM~IXx7T&C zs^i$EQmxAOh!!Os+n-bf^r(ef^TH_tg~)$GMOt9{y6|=V$s+Cp2qH=TSu!$&#~ynG z4?OUY++dfSe+FV|NP>z|sVI`E1Ws7L4l7r$#FlMaMfkFG=~9$S4U`HdbUlk$GKFY5 ziI=u)g<(?!$3(%1+#GT~I_#2iBMKoL)x`gu4l@&nr_tL#05uht%_$WPL+i9)%}&59 z&Em4xUWg^f4r5^XFb3DJ$E{!cx{T94^1hEEmPo--qfp4(eQ^tJeb05c?3@iyj4Bqr z?gF4u0e0=jb9ek$f|e*6?Mq}N>DV#bi0d3tTY|35P#bEfgJ`FXjIN>CYNJgDC#Hv{ z6L9MmOv`|V6q3sp18=$rNNI4R3aZs6GSMzzbjnNb&1XF#FYmWZuP5-e>p)Kiu$lPF zRWGn!R6J`*-q7)wh;;30LyCB$^Fn!O?b<1R@=A<;A2yn`3X-}G)XG52OSRtqyZf={ zl~;ssJfg-VP>9zC>0q-h=Fu_{HGzp%L%_pCxg^;aSAF_MjE_&?>F?ixYHbERJ^gs= zHSa-qXc*u9!4L7C&wdVjfAuRo^~+x%+G1E-1f>Yjf60Y-?Hk{WZ@&NI=ual`*1LXz zN3OjF2e)s*%EikueCj$JbHy96?Y{f4_OuOn{)a!sX`lZrFf)anpZp~HY6c<{h9@*M zjV3~NSlp-PA~t541{!|7sxaq7k7Kl4K`yBy?u5ivIMdaOiP9Wq90$w#2BiDjG8!1v zqDWGULzLEL(;v-}?@H?ETkc#05^&l2FV#jv=R-oNHQ@ild-cFdd}< zgk%!Ij%!rF1<)c7orM9}aX!t8fWz?Y>yeH~n#~RwrwrYaK;B|knG+ZmjHFl*==-8p5yAQk5Zf+n60rLy z-W-nVcQ!pe13x^|RFxy6=l+?@?BVU{WW;{+uwpQRX`@9B1MWQlX0tM4D@sZ zEzjz3s#=Dc&?N_hx88Kb!oHblWV-rrWO7zAX&5f)HcH4KiB38#qRFg7XBh|4a10f@ ziPX>#c1#|^q}>o}MHcSep|E6)^u&{hv^rAwl)?@YT}gC`b)*wX94yaa1zk)m1E4slF~W3k9sr zb|Xfw0xua3su-!z$<9HWQ?K4G44rqbF zp$(JbQx@g%I2x9XNIHX^6BAPK=lTY5s8GNm%fOOs7t*SN>DgHE6?^kWiyANdNc?%|i#1t&T64W)L93fd^a?oOm$Bnz=P5-PSz& zQ<0tUc@!09$CZ1Q4HNd zN~>%N(S6LuCIrtn?_HjAez5Z#*z|f-7Vi!vg=yY?HvkVlXpjbifCsKoOevo49Q;|% zgG6?Ei-L~@{DH-MKUBcOJWlZb;em&R^`Zw$y&C2ysNiFGUil?D`+51>Vd?4zlLzVQ zb1k!gs2)e5(SnmoplkVZY_U7&dCOZ-O~&!c!w=z%o<5vnt9a$N_rR=`LBBa25j41u zc6Xs`WCX8n-j1r~Vu#tpP8&Ex9ZkLqxlkN-!$hZT!BI6>`Lvv~L*+R{^_1A8dybu| zXk6^DXLJz@N71a;rAfttn!36mPJs2BWaQ9@$G@i*+VZn5<=(kaFg@=&Dzv8v8mv9I z2AdXahj|x4SSYVKPSQfK$dTrTC?`A&J(ou`=4l@2>dK5D8doX8W#l9-f)m!R#7$rR zEKWONJ#M@8>o~A~zvw+9p)k^!l(=k?ey_)3^7>PmBr4?!4v!v2B&vy)wpg4KohB2s zTWvB`B4XvddiC0>WwdTOGCBIa8^89wzZwwdwE+Ld$M*Mr?Bl!czyFI)xf#0bx@!@6 z`xV%H_G=?A-9ZQtJJFVlZSW;K6-(`&C!sxU%yrRf9YgkMa z*5O!T)Y=9@(InDWT>&iX!``hgBfD}ndd|HV*6$w`n@pT~0?NBLniAuMbRoTCdoo3mcne? zn>=W-1jgG(!Gn^@;mQx*fKs)Jhj0H8W@=MNFB-tcH@pE_Jcqk}`CDA`w!g=|?VGXr z)o0OamS8qnx&SAfeGy*!+SlRETfQmaVq^+tQ6&luRMcLX;*2+^EF5 zkAaLVhG=u!ffZqK?zt7!+%Ot+PzNa&3ywO55!%UGf)}M7c zUiZ$o;ESL71O|&WtX4gX)KmI;#m1JjC2wNjir7xpDghHAkMm8p5bl8?py`8zSjPhZ zEXk=0F~pnSMVuWrT2qJVV@~Z*NTzyPh<2?_946%}!bzu#kgABY3|(H9+6uZ=@~BfpASD*s4H)6FSSR*d z3L^Amwl&Xr>(Yy*GhZ7Wg+uYI%FUU@SqGpUF{fP|)A#fN<)Y`L#f{i@g=R9PIgd~++4XFTaUb!LC?Tkt5W?OO~Ixz)3xjeK+2T3;!EtLV{ zQFIKZiUW3`hS;(tK(mV3Lx<4Qe+*D4q7^dX#DGMSA*ZYWlb(}VECJ96q0*qYvVfF< z5#~!w11$^a%}efu5w@iml6YHjGxG~~&+FGul4W<1t>^|yk3WF}&%c0Nvx!CN1lkSm zH(t(=RumOl4d&W{eIFve}oF zEYLgIWIV9SjiGMZ;HN-OtC!$6-#@w@`7Z3)$N zSvrX<^I9rZai$8Ug1ql634l8a9wO9U$=c&-P<%quQScyIh@&(ohR4yd$OD`Xw1wco zxBFdK)g6TuK8BdD_&gBs7j8?!nDW8H0#M;m;r_H(48Q{~E4~k2yMGQIqEYHNO=*gf z8dNdqOc#MksxTbPtXqqvXKug`zIqEb4)^0D=U$9WzquQob_3~T0_AcQ7A?hddE^HM zuzmARbo3Z@n-#olIoM4NN-`nfLF3G#B4T#I3&lh{8o~PGR^SVt{|}sT z@`?E6&wqmFH*G?tSVDhq9|i{pMKs-Mo9OHB#n{*w^7%Y^`+G4udKeQE6QaMA355jI zX=t#ncNH;O>Fph;C1Tna$0rYe@5Wnx$ezJp{rH>UVe5N8`r%#oKll~1P*&b>%{55B z^-b6`K8~VE5hc5M7CL52(n=+$&XCV3&(OKieG&Rt&G}!6Z>m4;up%%v3|X-1wW=(HEP5z_mbh-QLXBeMIp@jG zXfZAZ4h|m~$L`&`1=MitL})aR#(m0C;H1RI6YT|)jrj|Tn~4vmc(MICttzao=;#;HnRN80hN9)Qj8Df7+?o zwe1D;uNXo&t|DsM(3BK@@$paMb(g;ZnNv^ltWfD4Pi+9xj1TOW;-#pEQG|CIcw_fPM_;~%&d=be5!UVZcl?0fMg z^hPvv$8{M85+J3cNz55F;kAeL1g4q|bmelGER~>A^YG>W6syyhe|H}ZA<#@Huv85( zHHF$#0gDnjD2|1yRe_cw_t!$puyOqHrz3Uxnb`eNb zM1`p`f5S#9os~6~Hl|V}(3Qz#$2f^<+Y|~6!`2f0UD#V3#Z907G>&1RPHSHq=uzNV zwOS6Meh3^3cA0Ma-9T={B5!3|Fl57!MudZ?<3ycor5;OQ z&Dk5UZsW<4Yhe^?h(~mU6&(>*lQ77h{w$7^4v9%dH)AL3oC>jsc2GAO(9CR8&j(NuCd?a8j6j+ zd^aXv-iDE(VH~c{LCZ#wOlT;~l6sSt28YWeW21wve6L^#!*$SVG?7yiGQpUbn}pui zjcSDY0~cMkia5y{%>E$Vj7t_Bd_*^8%VbL?P!p3#Q`<#a8jllm46<48ILHXXmn)OA zCKfQXEEYbY_dWiVy-`N<5UVEs^=W`2#FC3)VQ4^*3g>rYgagCpBKjrB@x!y2pv}FL zR>|b?P^-f4SDT(4GVj%%epw^TQVF5%Zm0u2C>3X=%Z@m&la^34rY9${Yv)c(P0k7! z80zUoqgs0gETVSW=rf?Y2#Wp8e$qycP&I>nrIP8dz5J! z?+vaK)H70NBH$qkLs2jhu`$s$Fic?U0H$!#TT;}g`8%PYn}xsG@?3z}HCMfXHJ2rZ z-d2qc>V(_Tl<0oOYGqUiUSd(S8Dwd@-UKDvB~8Z~IqRItBsC;h&$K&YurZX)i5nO1 zU#`VcN65OtQ{_z@0_*3FEJzMi+nXfFEhCnve0)d%27iVETd9u(tMWSg)5(Ka+xw-S zuqT44RN%rDTnfG|wMS$0=%n*z3qBP}j3WH-JE7zG=pmSEat)+lny)G9d0@+Vm6mAO zmc59VZ_{v*;6#_ySlfZYu+(q}M-p+YyXHMm`ucFoXFrLzopuJ^u;MuU?^nMnLi41q z!6q0`RfJL*WOLovvuh_}$s9)A23~121w4dw9bqFR0EP`wPRx=+L$K2cJpRgyNaXWK zCe!Hnsn5LsLNu2l1I}RDvja`lB;$s)8Ff$GX9)sW0|qquz|}LTPx+Xz<~cQW+8s|z zzz{ix%e4(D=6m~k&}uh@+GcgAh46W<(!gR9&0pBPgGv_UUINF}k;_TZ{(Gwt;2KmZDNBf%JtK3HAKA4_sBJmw#AuDj^gRsKws}?CdcN!f8(vUdSNVo<>POHhb`CM@S&X# zK74btSXSQno@>$dcbDPC$q6)@9(d@$5EmPM1TIEi(1sUs#3F-V_w)r6dw6aUHr*yV zOyvzBOkY~kj+kq}i>hPF1saTr1Q|;5p2trMQmPl8%pjCQZap7(NE*559yoqwDqmf6 z1C3f8ecfFGD)^e#tXhpFi-+Z6X|xOpR-2fbMyXnn1L;|~dP2BhTqVfU50I0Q9B&j~ z!x41?j7ihLPDbYliuFf6H^e@VrVx_ z^d=I}DM+o%^NP zn;v)&8PkPYsbSx9n-Fgp=*}cD)vS9w*l-Fn?V9KVl$4I?S`$5K9i?g$(PRpPr=5e- zH(r29G~tPx2l8->vvAqTNigStX)a~R{F|xU%u>krV0`}pEb1TdHhgLg!Zs>n`;i&! zLW>S1dJZU+y~TQHqh4(C>H9oMI=*M&X>Kyp+AoUN?j}` z!xantsXXeXngpm7%VoqfNmN@^#FKGE-7t3V-G{}ikCkrjzAam@sHY3AX&^~o__l+H zY0CypLYMfR3$i6i!GaUkq_f##n3)27jE;MloP zEn?r~C<@aPNIMStBN}?F5PH-Ix@fJ(j;%Cu!?1W9X!G2mu>x%x<8W2dLfGFI*11qO z_*kZ7hv`-(e(WB|kPV!V6Y%55RamyCRSJbAXQdVf%Bd*oVFitPLkd%Jw3!nU@0dvN z_(xq4rdyzHg0NM3uQ-VL&k;{QYFYpD6-Ue(ILn3!l7s!z*lItkPb zqzL#sE@Cv4XjNr8;syT&Do;PpgU5_uLJDF(zk|Sm#j!*K6J7CI^k*x+jbV%6CLTp7 zp`%i-OE8~kQjCt+f^xb+aU}W8?Sz6ohxWs2Sx7`<=;`W3D(SuFY$AoY;?bx&W(R7N z6^sqL)qq1Kf0(oc&uTR+bULp{6G8~{1bD7BRcJC+%ar}cpuI2wZ6pLY?3qo(!m5OK zB^+0*Nj(o%e?1W!7T>g*9oQzoD!&B$Y@N1n}|z6R4ygs5;D!1vQzJaJNBd=!SzXIOwJT zRXig(aivCswTUWPH-t2(3>$29Fe&rFD2%v@u~r>6ozTLX1T!*~o>sFdBvDsg>~-sy zwSZ&NDY36Ej*VhfS3hj4jc~_AjtxCd&RmM>9cY$|d@PN*_8ijL91hm!kfau|Y9L3d z8uw-um<~H=x(95D^VNB^@R(PDQkf$#UaajBiLOm!PS%K?@l7y z>EOv*zm3*`LvXAnq7f#bJ3`ZBlZtlXySHu;m&1zYVlw1lpXs0yilAY&5m9up8L!i} ztSbvEnZVBRF|?I1din=NV_BRn%6rYE(^8*$u@Byw%Q}f`ESV>)D+8uVwNjPF6>C|3 zogI7rn^OtaaI6U>%+sO0tSOI)X;H*=9fg@`w2YQG4vHX}R69Cb%5;J`5WZNN_b~5A zpSGk$6KK-N#vpB%lStCWh=$v+%oZ-b_(I(L&49C(x^o;-HdC6vSU z1=!RRFcRG9z_Be6?eKuI$;lIc+DRu1XgGZEpiCKv8e7~XnAjSpO=?W6yy(W@1>$QW&%WI#%+1Q{Bdv-yf*wDW zI*zc%*$Xqo;jBSb*JoDEK5viTgIfAM8xyYk{a&&88Bc3Cczl-v~2Xk0Ay8ucbt ztXzdcrHa{78Kq_&iw76MDV8uCjvzBNjrvQk;N)BqD^eQDhjt@_HmtgZJ{4HfofE6h z4mWXvF>ag*#<^RlX&NR~4JZEVd(lp%5qtaJ1J7?oY4a9T4~}BnwwEz$70~GILh_Vz zF|v9c&cEnF?D*}kF+7k*N?Lv~VE2CD>{F>Gh4sp-2xX!OpS}th8^@kc--hPCaV)#= zOr*{|8*OqxS^NwR0Ixoe!mbz4^|q^k=eFU2FW-bquD(n_@v$!>@n*bGVHbHk@-NE_(OXGVQ1znZ&@c%kbEP zzejg>4wF0f;GE;uVc#>GuzS-BB5EG!&SBbaqE$9K#*gDN?S$M0d6y-HV6u!sZun;m8Vc zcsltt=OLC&qkqvL+*$)6`a=`cvV}t>zGK5_wV{xD!NMb-@hBxMEOu`P2K#|r4j7yC zXcr8ba~+r?dF(G0am?^i?B2N-YgVjAu~?P`Es;*5Y1Jf{CZp*BSf|@{a8x~*$)Y+v zg=A7ghExo8SV;@v2X82LJy|$a=RDCtL_^E$piPlV2{%k$^6Iay?lM%&|QmP<(I z^O!4CkV<8snBM(vh7181x*A4;&reHV7Fv?Z=84V3QijDCUE(MV;=ftQOY(Klreh%& z6v5oJ{$_v0doL`Gxt>WnR9Maz3qLENpeVq{TW`dIy4^xfv`Ab~TJnB7dImOa1S#w$ zEyH)33z`jFm*_MjG$j9f(u|R$YcFVye%*nq-O=@k>nN>2z3=fk=xHzJOx*0amM9^i zg|T>$Nxg(6d3rB)dbyq^;tAPg8B#`2!N=#bSjbCSurscmk>(5sO380EP!f&?r~M0nKRCk%{RN#w4QSu!3T}1T{*IFRu?T zzk{?d#qq?A6!;4TjPyEA*X0;_1YKtH@S5R-*Pz1=!Gq&MvrOr(XEjywXOxhaW5SNT z=zB;oqis7um)r^-KomlfKh+lHN`y2&Z(j@CUo3H-ThPR^x%V(Dg3~PG9s*kuEom$4 zpy`JUXmw7}JnLUqi=Y&v<#!92rY%lrZajh}sc|}WXJJg$>M)txkjkLaFp$gji1l}= zRDnT&8TXQ*E6h)cYgp9RD`NAC=^&Acqmztd>BtgXe%V!`LA&j{-x03&(sVECVs*+W zHV4ZGM{sCjR7A(=hzgZ7TFViKwIkJ%*tQb*a!SW_o6WMRLRq@%!=$7XOGq#rj76{$ zLXHKq7Qs%dEN*!zHHuU!jRqMAbdiCEEIP=;LXL^$H>Y&D^0_%~s3$5*ln;yYVvUd@dy#5?y7B5D`4I`Jx;=rR%ArsTkb-@OY zuE%CcqlLr&`#)HG!9~D}J8)p@7NLP6qoM!0t1f%~X+0M3B;xa7uNwsQb~WdjV3NFxqwpy(g_ktyY71a0&@6jtR3S+se}J9@(ct z@hoh^Mw?iN(-$`YCw&@L@c+cNB@PJO=vn zaHb}(sM0_`36rh`MQXT^=mkUh6#DxHv1j{s#Gs)PaWETlF{Q*%azdEv)P-u?Kv+cC z)MGj63=YoC!HUI@?d}z~CDuKucnaxw9OZIJfENYLtQDyd;93)~URZld5OS+E4=iLY zlscCd`b{6-+uj!A*MnU52-5UK91};z&^8)y*{pI6Z@=KZ8d2cNI_Z5-Z^I@DpD>Z@ zf~v()uamF9t=kjEYmpFQbbmqz=bU*qKJ{-O#q!0A@a&UM;Dr}9q0y`(m(8M9ucBNk zVq|1QG=-Cslj!dsL~m~o=H^Ng7{~P{u2axG4F)DBQaP!Qn=KPv-943PBy_`}l5yv) zx8C|!)1_q_|68cymG^w~y}KWL_`jT%8NT$oe?j`Km*K_32T?B>aKq%Q+UU4Mzg{sN z(3aTE3JPdX!{E_&g2x1DePXZ7i^=wqR0GP7bo0se^*74k^#$KwSd@zul^^cGLZ2HY zd5GR79E8hxQwwGXP%OjoAy53NC!QeSVgKH}s5ctocG5F2C>{EV*;&-84H@mTC|(E* zxWUM>Z+q`4c(1|xmy<1k!`q+(p!BznbD2EylrG3{WXZ7b7)h(*rb2`mk9jt-9!TB*=#`96R6jl(8vQ%Bv7f;e5WP_FFf-s z%9C@5C3G}gOAMrVvf`XpFu^;>ZIx!9E1?ORUYy#=Q9?VXTA*rc|Iwo9-lLl8{&;C)I zaNKI_d*V?nU%3+4wFm$EsjuSHlTX7j@B9C7Xv<4D=G?Qz5@)T-#nY-@7 z`gdH0=&GeSFjvIH<{em5@1S#dFTxQMN!}a>W-!=2fJ(I>bQ7gxV9M-Z`SEAs!1%N@ z;!2%1HdV%v?C+NiY+ztSawbZpDnd;QAuh%l-K#OHO(bZesaO(m@3^jA4R{<(*1B>z*94S`N zFKStar8&rSrKFRZN@h@)nnO65z}9jZO9%6~^1|0**Y+Ja`P?%xcHjUaGgb7dNrc5h zBnsQ06qg+}b}uNL@4#*vLh%5(zp9G%8%vkJ&!>E~-OdjZj!46xe)$+kZ8JVtb%oVFh>M4|~1?dKcMPof4rrs7*%adHR@19G%R4@=_2OZ7=VJb8iwIC#qXT%QuHPl$`S8xe@zkI zF`dtph$IgOuSt05zJh_YIOYX#(%?xWJ(WZ7eRj~9!^0xe6HXs>+wtUP$SBh>)uUFtS5wnkZT=aoXZDI1vpL?DO~%C^l*pFR571px&$^rN*QwRHp+;cQ^LW zO^K~&PLH9{Y@;`okx<2)o!I-q9O5l`vDVULje9E5q%s#HJ{sc0d|7a=8s z0~D`$#LwO&+}{-hkFp^ZrY6tnAPQSV`bkwooPq5WmiyS0!f!DP@EHo^xid(T(=dX; z;8`WK%?GVP11gw21=DRFXVNgjs^-&RJhr*m2!|YT4dV+>I#IawmRtwa4wPL3rfneU zat5ry>M$KUibBN3oEFApA`GKHkAYK8!uH8AD0&jhRxHQd#0)ys8nT>rPfVaNHi_o+ zG-9nbmS?(QH4GH38oKnnSg@80MZDwFpF(+d4C6CXSl&M%wyjMygnF}vMfon&%2he8 zy*>RXPtRg%Vp7t-NsnYwJtuLbJPi&HNl2TXNFto%^sDYC%ctNrYci1u)eIn?6Jrd{ z6zmfByeO1Z0?ld#2~zL^i_9c-H!YtkYXCK-eMbOJT}k0$!+|!&)U=Sob>uLxZk0@L zw?6&^9(mwlEbSV^?AQ!uj0RS&Sb;0P{~gRd`6Nci#!;UxK(Dr8yB%mtayap_%YavQ z13Px(>1{9JtnYmX*z_Wv{`$Ak)lsqP_;tWnKY{6wehi^aJE2xvFf;}Ir>zJ6&$XEN z+0S54lrg;F9N>bDxc_ZeN(iUxaF2^(=Dc+mWd>_qD z3#qf#iDqE>v6rB>IsLP7(%SW~CW|;Swht*igKD#kENMWbc`6}kl9*8iQ!NJ_CL8N9 z44!`u*1YCoT>FX7VCC^^@%Fb}jzq13$8P-|x>(zov|cr2!rS8gm`|ave-OL3?+|@i zO>;5rI+&z+LpUNKr%ogeQ&nMTF{FnULCJUFnQdF)#C0TdSy|gimuEvN9*JRQc1oHP zv|9}{wVsQmA~j=Bi?YsS14vjbQk!`-s#vwMKgGvVyWmszdCxMnJRXmtFgu54yDmYg z4(nxt2d=|xAhCJnvzDk&b-Zyh;u&flqNvuGisJX%Sl2o(bX}8Udgg`=xZy+Z$2sSp zjl1srZ|vN;L#X&{`lM4y0Vo96w#^2(6ey@$sY9sDD<({!Q@k>a`zx&#pf_^vzbe7J2i(UWeR2T!n4p zM^G!%N8biZp0?G5(egA0fmoU+XrX}F^o7m~!GqYQ%D9WJ6zq=s|6Y*kAO*U-K@VI6 zMY$;3eJYb@i`DV0SSeQKP0tRGydLj4`R_)fCL`@?wT!;5ZtnuhHM#H2gA}mNQeGA;*jK3QM{Iq#?1mq_~>_RNNssd7$`3z?wgS z=*stqc!nsHzwd=-oTo}BHghO8XrS#>rR|J(1TNkhVa}2zsE2; zz4aDW4GbY%HBqn3!B$OVlPa8Y8GW?uYg(w77Mh79hOfJZL{MPknJ|(uMAxjq_^Yo< zXjd;6=3F0;=|g?nP9#T0@Y0WN$Lb}Epr^Zm=XQ8}+cnG3IkXSz;>D=Wj3PXeM`Fpb za6bN@IP~fcEdA%pfaQyU-XY+D$FS$?w_$Nu5zl=xeUkAE%$9|Y(~wR`hQfuYj$+M_ z#fCSWl~A#_RuXH$te(MKvw>sJ*nl;sZ2+2V!=z!hYSK+r30x+oJlLIxam)bp^bdb;z$akWc?i4V`Vk(hFu~EW6x(DUz40^OQI%ZScJ>m%swT6k2 z{ydIM6-9SaXqp(8*9^>=z>4l9?52fIL_sC&;GaJ9L14OwyMOQl;mli22kRn94Cz_a zszpSh!H$Grx?Xa7SdWQNEM(cxn>Her1KVvOBtDH%DeTo)90tW-brVB9!zfJ`q4oD6 z^}2JheP#@M#wKyrdFNrrp8a_I@kepd`R8K&s#SR8cYp9wH96@km(bJZ^l=JZh$625 z{h;d-b3VMTK0CUc1~7-g47rl+Fln~H@{mLE8Z5*VT{^J5&N<~wsVNjYRb*p1%(kmY zXelVRM<3zIo~_MF$8s>FA?w;$s^<}+Rje>lxL|uDYPL62(g#?$Gkk~V#@9knzaUO- zEX2h$-z&L2($ZgkmbJrdOWCfmv)GQk<*Gp@mJ5@?gqtNt)e!nA9>-rN|7UK%ZA8rza8~7vzt4+;KZOQm5OCI<68DAYp{K>Sl=|Hnt7AgDEzgY#OItcmZy^^;@XUHn6y>2NSiD0E~~_atpqC^H))-G|-+Y zVVLow5f_sQ3t#;Hw=w>`pW&IuA4g>Q051RbH^l(p@lSsN#a*Mg;!9ryHmt$+fB!d> z?|BBQ!}$zw?hPLYVh(=t<2#Xe<0wtf;UrOFz@fboREQ%pc;!bw!ijv`s%0KMZqFe+`mO)Q1@C$% zaLx%56@i#2DR1~5VWH}~W4 zz4v+Rf2WPEXcR`P>G=h4y`?m!yBCKGbqt+;DtfMd3vT|}&3I|wVch&*-^42~J`GGw z;0-5kz)x?w3F`(1Fflm^RZ(T~;B;k#dbDTjHfe;GA`T{92cwRHMkI=AvnA#xT!~vs z1c`wGgfkgzKQam@7Dp_d5*-#BuPHqtR;rasS!{&0xThs#ttld6PL73Y@0;WJQ{F#s zXbba2%rPuD9j{@`pW&33>onI@QvTXz6AJ6yke`jly_kSSa?rz@kFwqhV1J<`PFazPau)`Yt8S!2_9a$=40>K z^M?n&Su2(zZ@T_k^!@$Y@bbhM8r6<;@dzG_P7@Y8(d66t_Ne?N9(eHWQhhFGV8zOi zGwGQ7fB$4-o3}7MD(mOSXrUlE807|&h>maJ7HA&C_u20v@&NL2%?9oI*nzKOu(!uU zjJAu_YgUStl^0YOLEGx!@S$;xPL9E`!y=+?(&2|X2mfyX9=Nf{#ll6|zsQ0MPL^#S z@GJyB^B1F!T!}WDW=C!YVLgOgL@8vpOi7t$I1Ys`l0!j9PzujkECgqg7nEfprc<)# z3V6_>aa3vzaaN+m7a!efw&kK~wLCxLlTJDXTefV$`>wkd$1h)jWHyPS(~_?9$3J!h zH0DTDYN+koi{tX$P@8p>$0v}F#$nNNRZAl6#u3#NM05*IyNs-5;h3n70V4#bX(E)( zq4%9vqmfpTc=ta58C^Q*&g3NOvjrsBm0Pybi)NjgkwSdmUB5zaPZ}@Y_aIg}I%f79 zgy||+zvei+^3W3~J8cYIx&bTKu0-Rd9eC`CC$RW+7vYrauLoY-4eUOM>QC=PxLic6 zTg6P1v=A2ToJcVhIf+cIj$+%wK$K+eDIG&3FvOW<%1lM>lVk4y4CAiuGfPR3xK=kw{wXT!jZuE+}nAHJ~1HP*H3&qYSf&AVYx}H9?wOHMxrdp5s{^peGhCS%CDA?$wn zRn!U*FUE_bQns7qbS-2aIMas;<6AeT#%KW<55f}Y~ zpObSGGjUL#zmD2#MyZ|FFv zng*)A4+*cwd{jr(Ae4YKf{F%hG9w^B;OnBdS(uYm*plKNKo$bUk!%*Na#iRtAvT;~ zqc@R8r9rVS4Ltnro*WzR_y&HyVuwo2i$krOZz$l8?77R)qEo__MEcL`)WfK}4zm#; z%OccfevXv=9zft9dH>Y)@qc*6SN zV}6=M7a<;hI_}B$HH4C$9_O&*VvnuE9Uj4o4X45F&tueSzAd}6bu^g)8e(?)T zS7u~#wIUoBw?uZR*`BNxx1oK&F<_28esd8_9xrX_*t68`YHZ(!ff?XU-u zc>hM4)piq>6^cV zv#z)lIN><#{LOE$`mI;trH_9eYgesC^sSd;^PP9#_z%7p)yMycSfc~&&6lI{zrRFg zTjJAQZ-*_pY*_fFgMeovO zc;VYWg3>g+rl)H|zf5en001BWNkl!BJ!B$*mR_ux3Kc2zSKME zK6v0{j(d_uyH)C0+Dt&=N@?TF(@w`nKJe%q&%f}zEE2sP z>q^pn>9)xlu-Wv&k#qSxI%XTqdR1Ph&7^Ok{VT}jy9yz@bIpxk|L$-88faJmcmDdf z1Mtvkwj!7O%e&EY<(u%-=pi&~mLwEYO>a1D@rPF<5#fV+v>{LA%uSguhC7pN(n2vl zYU>*0Fa(sPU=$Rbtc9bY;4#5yiT|Jfd4JMCmw|aTygzl2Nd$`(cJ=-I2rjThmM5=2 z0gYx2n_qbaqz>hCT^L!m1Rc}G!Ld=XIF0K`)EdOiN5McqTMEDf=|KVF41WJY+Eu_s zmag7{3Oy?)#hx(Z4?L^ZG7VuH9vKXU?2+=J&h5 z_x&w86{x5qL@t{lB0)2ToA}5uPC=*n0$#6y%i$!KP3v)K2T{6MRgLWQ zy!d$1ZS@Svn^20RM2h~-PV%+_LBmIrzn-3sPOuf2KJy@!Eq|A#k3Y#l?l76IA-qCq zC>EK5pEM;l8Cfp9{z}UG`grKcCt3LI%V}zCBk|D|QY%*x+54#q!lZK(8drn=lry2V zU6ep1-g=Ybs!z1Q?d>0-@mm)_G+?@(yzwrZKm3?ND$9(+55soi0-m_-R+^0v$&rMP zPURkPmuw95_0rVZ#-`4FM0}<;MSzK0g45Co#!7m2R($9k)EZ%WV#8`(XoN!y#$q&u zB8vzeiNdl}r; zfinwZYNP7pLo|Z_bEospz4vm=#TUcTNAcF(cX8P9CveZBkE*5YH}C%wAN=%2d^S6+ z4b6PKdKITET*&W#a08=@Wg;?#5hoSVfruW(Cf#J=WLx^$vKh`MJ9p0Rq&r_!uq5v| z>9P1EQN18Vwv4+WD6UxYxIQ2KX_G!CE)kL{>I?hniKVo&I3eQ0Ig)0S%S}+|gW}?5 zWgb*1BWB{Xsf4g-_@)5b%D2#(Od8Ub!Ohm%>lBs)*Z7lN8$0)KE)lb>92C1X{C@{H$4_J!y;1Wa^~M92@x%3X?p)O@!03 z{;7e3Y*J>JmiU+}DAB_-rwMYD`jTYCE;%|@vAZ992*+O@TY$cd(j86}$9nxf_N3AZ zWaUE&dc!jQQBAM}=sDyXIW?HiU8>+HmGKJYQhhmhLv)GDl7Ne7i0uPrke7KrVNArJ zl#+rGY9!<^m(zPi2f3yMe*bUl>$kphig;B8&DNw@v-ZphfNbbO9gz=_LrNb+zLV=M zfJz=;asd1mm{9tXY9`ECjAk{6XMlB#=2cZ#x_?uy-hS$#ufJeX&D4OTq9R_k8WxaX zVV(nbbP?qTTqZ~8M+fiU=(8u8T8GP~k*YW6*=a_Nye4csxO`cx*8j}w_ zgk-TmXSb|%t<;2SIQq!>OdLOf&6_r8BW`?M4TrThv+~&`^sin|G?t}3R>GM|v9;W# zg6<>FKaF zcC9H4-!sf#fAUkxqoREE$KO-)4LZBH;|DkBq~Ma9Z<01HZ0+Qu-`~Mds+XSO9>zKY z>gJgCI!RBYUEvAXinZddL^>dzm@=20CBedAO^nS38)bKF-%0v9@{`*+} z>@&Rb_L~@!TKV?(ui>p%-elqDKF3IGh|N2C&QbGmk8LK~zX!wX;jMcgVN|$=f;25lMQph| z^+MY&l?Zzcx-(g&6yovIG+iGuo%b;; zqZv z28}d-MB66KuUtNDWxwQ=ilq${dDF|}LSCCRuxw6k%t);kh(tB%U9_rIO0E35ggAP| z*{oDx_RLv)=kiNgblOS0`O=GQ*}RENHl;%7q2WQDJTx~ot1Lh>bUa?YZnn`2;@~d~+3uWgC7k!d=W7xje?KsndxkMsUfoP+@p@ zgq^#0lSpK!YidxAtpvw8#0^BYK8GQp4w*5HsM|$771qD| z9=$ua@%`(rrhU?Q<>b#k`4n*bz$Ic^w^>~YNL;mwyDq+r(;G+8?((pH!y1B<#xv&1 zZ;~4B#g@0>bNWec-a-FRFQuqg!v-S+)Q+rnY!mMKAh-Sg*PQo-Gl-5o2v)4pqBv0B z$R~e$mf7FB7_xng3=a^g7(D;@GmKjNIcAAn>&x%5?xtTcPW;_7BRIlNdc0n07oJRb z(dR+@#rN!G*ROA;-Q%URoMFsq$H6zh2E%daPO$ zOkQ%Nl&K~K0C_-$zrcvd2`m~AE-!r}!!(MJ&JsXPXb966k1-@hMj;O8b&Ie9m(PdM)_}h;h_4|C zEiJHTAAPUCM{#$b+7i}|Zldw3??6`U;^Y9r&_6(-tsYx2gfmm-mA^g1DJPx;ks!kz z9X$K|^BlKe0ngt3N2c2h#>iwQIiTR7#cju3DXTN37EhM{x!79@?>+5w)0LDoQItL= zY)_xpa;+&zD!G_Vxfo0ph(!GKkEHMmpe+J+%&YP?!Fi>6&3Q=Z%FHm3pQyyj$drYeL( zHqv=1NUirpwO|%gFbN8jY!Cq~*{tdTWCCGQYCii=twA*{+v@&HsG<%0o*-n32Aix}OPPPvwfZqdv9`q!oy|O&4GqLLS1hU&T|@ z**$9c>bAM}7xN;Z74nhLwp3dt=15Ar`pm1}3hGwckN`261j^ncY2#&=K%}x#XvMur zuDw{d1_VgRX%t7hs;RCxJjp#+GCSN=+LCH4tO+@$fCTGHLOA4qJS(B+^k@zmdCdy@Lgd zPhig1PFG&r$g}VA(zDMo`sDd6IR6|?bld#e8@#jRB^I7^DicpXT`54kx0>hf{sU=~ zz{UiJU%BkVt^)C7mU_FBNU1_S4jK(V<+90Xm&u)51lx!?N`b7ih|OhM$BSmoXA>G{ ziJgTk-m#+@d-=t@a?7n`dWP`Yy~N8U0+YsZ+Fifl+Dk8?cUL#{z`WLJB!-9Bo$ls8 z|N1y@J@GIPJ^uouXHVbk zkhKrpOZ&n@s9k&lJC`hB{LDl7E^9>-sXg#+{DnGzbDib z#A!I#@zQ&EE6_7AK)@j`RCWw;$rN({73O;xE*43Z9qcX@7)^_ypo8RBg zq_Hg=HD(;;Pd1V3=+gCabZs5OBT3y0iuEqG z!cJZSA8mGwNF6zco&HP;dnka-@M=RuV80~ZOD!f-1Yvi$r9o*KM94j%P49|i!1%SM zm0C^yMruF-5AwIw|F3qs7HvtVz1BZjf1OUdQhAlOq?)DzrCipsWHrHqIOK_8g}k3- zk+X@=zb2||p5a*Bq^Ornwu#s6#OF1X7B+XzAzXXacUgGy@jUg=f3to2R;_=BhK6vs z9O{rK$0#faGuzD2@1^-HAVH||a(wl5V$EuT2Q}9yE0sRsC>1Zi@%DQk`L}6HTVH+k z&T=;ATzKL6M9)~v2VMIpW^K3(;g;pq<6C&XRq$Yf1yivu3#w3#v`a1TZZdd~F1F2f3lHaZu`PHQ_Xwec5`SfNBhy6-lvS}cQ7mv$9v5;2*lYj^D z5f1r-IHfadHIeC-VmA)X{UAaCrHMPny6-!3xu6Qa= zwW1W8(}9sb{0=*lni@H5%qV&`Z>FzfrzTs^I`VLi{My;P{>oAY5*bcid7An~i zsg7P^AFtx!>u=x(XMGKladv*Zobg}%GO0SY2K8`{lKCe0U5 z{tAA71aETqfPcbx2A6$A-N`3Gz^vj+4=-Was&yQB z-PO?84BbNvJn{(TPgW4Mm&n+Q3`HZfUvvpfodG2$y!skle|;QxAw{M!K+Tbd5V+(* z)0yY>RjhgNas25F6OTO-rj26#k|zjBvh_$(CkHJNpZa|Frpp9^PWlr?wSP-y(=-}h zZ264YffYOZg4u<1`A|AU-LlOH^BS^kU z#23OF&r`|g=^=^79iV;QOb$I|F|Xh7b0!-RoW&6gcUilyaT(p#hM92MX)t;$Y~0AZ z>sPbAzmL9zScKY@DwQb|=%{41K&yAaEhGoK%-|=xSk{_B zY+7tug}N5YLIcx~I0s#slAhiyfLM9SM8sk7e)$yrj|@on+KD z)v&K~SPQmE^UIu$Xk8@0H# z60(JNuOPyrfXOewQi$=rASkVe8j_|Q%>dO2cO`~bIxXYeCJHf0*s-HgN12i&@&SiRN&G$pi5I8*g#SH5c>jd#@`s(w54x^`q6C zect&z_WD~)A2*p%!#Q?-w46k4h(yK=8kMP9G2kMREYKjCFJ(!XcF<@ul!7MLTnbFN zw4%ck@>y2a2|2%3!$t;6F0mvPN?lVu^`AeLWsg0EFH_QBJPB0XN0~1@^AHS8P2w>%;8ZvX%DH;}~ALQm;xRN+F<%p*?#M%Vb?YYH+p+^s#Lwh$ zqsVUC$=Ge)T#E9w&Qqads3T=@+Y952+C`xDm%i z4|b1_faqylPImP4;EhJ~xwB=d$6RK>re&}1bDQ?7Qae@~+xoQy9!7>o@cDfTDCGCV zzE!@KLR=>kc2gHo&EKg0%(P%N_Zyi!m~71=W$AX9tWe6DU1G(zsGv>O4<~`zdUe$l z7f{UxQ9YB{xRixjtXhvh=2(99iyN6db`+b|t!3AzJJ`8%yVi)}OeQ=JvvxKoC}MLf z-wSw<>BPQ$`xH0{3qvNUMKLf@=RTdpW(>pe-Cy1D!2SO=c-ZvP%Xb!28Rr+T{tm%K zC-Gs|K60tDTDI9dg7OOLL!K8KuHt9vbfpy)Eh|-*X%|?fGYN*Oj)vs-)TzW09v`SJ zsP?C1!4kAr%}b~Pkm`b(OPh99YIvup&n)VNQ&uh7MKGt{&*z5kd>2}3VN9bacd{a)8MRA`1rR!Ct9%M$QQNyA%(C67IkIwIQ>qB z(naM88cq)ZnHpu2O4AXVK)z7cfSrQZL#J3C`a+DP<2t$>;|q~aC-8YZByw2-PLHOw z4^n1M+c-9L>|(F{p12;BibUKY;>9fc%2}o_Jc2_Gp35t@+`*x)dV-ETX?ua~l{CR| ztxR6D2;v0>pMH(OWSUR1L)4vkIPK@0Ouxs*nAXuc#?Lq%^laL~JNG_7{q`7(T(wMy zL~)&aI&|%1?W?b8V3AMWPN^&*M}VAkTmlBW5(6Z~-cH8DWjD!Uks-rQ(oxo^`%t>X z#I)FIihK=f9nfqCpA+T|>lHSACx$LDb~Bpl>W zfUbCwx}XGt#js0=kl|n;VTyNKeGZItiSdSkU))AaAH4%Y)vONvKNjt#9Kb>m*5`kz z3Nt~Fso#)7#jF$0A!4vmjYeH&u)iy{j!xJBk3GNLOb(&h^2F;55Hsu zWO9hVmxOY)`D!#{!&bSHAz?8Z{me4G0D%cD17Sj zD}iP5PjZCBVWi~1$eWWM=_3o(L<+;S-${QyLtoa^4mH|PilMJ)rzkeC8eS;o5~i)J zd@J-Gher^Y>{X^AhftR!C0&4lOYA*0>q({tGDSD1=|Yor371)NIn7s*k!V-zj1riOZ%lr*`v zIdRZ+C_|CjsO%LvHoKwq%CGTKZzo&&((LRV#up0HKRiT3b2BHOx=5+5Ee*|teIde< z@-0-gcw8L-ckI}~vK7ntcQm8_x_2~Zn>U4JGanW8^w_;@V7tynXg=bJstb@(l%idbPn_6)z@J7>> zC8)Hh6S@YwO#>IF+q~2`L=%=W<1CQQvxr6Ql(PvcZpmIUr+Q-JDzO}P;oW=OIHR=$ zPCbd<*WaLV>|_R3f6SVZK2i=B^~cPkKbB&GuaR6l!7I(s{*_4?IfSWF$n)I=Kv zqU+Insfb@JI&&F3E+@WnnHtSZ3M!>$Ae*M6l%Zk#7!7@u^R5nHx{ntKNC;w1(0!3y zCPt7lEiShvXp62YpG@jKBy<;dMJ)8ioWicbnwljd#tnt6S(sXc3R#&1*t!*b+DX{U zdLPN8R!lCGaw_+;tmC#aIj5;@l8{EZ=fvep+`}9)eY2*G(#(+NnYf3SMVQ;t%GB$x z)sDkM&n)4oSC(?YSHHlSr+e)Kb(Jp&r57V`Sk4J_qwkckASX>DcO#;xR>c6O%X z>;gKZcJzlRYe2FcyTgsk8^m81RomJF{ zv}}?`VlmB)k!G(nU#o1Is%ekYVe2uVj_8 z%lcsk#i`ShWTX{~7?G&1De@T72vPfH-8c)l-A<*#&OiJJuD$xZ%s+IF=3RAm?$c(p zygw7E1QW)O)vs%6!pZ~^O`w3ExLEaCQx?%lNMl+iicYsVQSthMLUqs8MgmtmYFh8P z@x~iJ6C!np-~a$107*naR8sxJuJkXr##NVId->)UU%8!p-g(A%uf%uS34GYGmwdXS zprPcfkdu?5f-KX&yV_;fPGQb;LNc94aTH;_DrNBrsie#W+sQVwk*K1?DNR~33%M0#S; zYLjSz8WPDg*+NMZ`+CKe&M@#e#l0z|AtN$b5towcO;dd>a(q?(n*b*P45nXuQNNbg zF2~Z^(!icw8+rIIPcnTOFtra_a7+i*+$xypfDjy>$ff=v9E{Vw7Iag zn}OTzp-wa`UOSw95<8xK3?q?aFqx$-9Hu{(Q1=(<2b98oiY|kIzfLs<$-zDXZYTM4 zoVn9yuyVtC-E_SYn&kImc!GSgW}Sk!K*-DXzHZu_K3v5#VW*Fr3ONf}gnlZ5zlKJJ zhWd$A1mxKnkoIa_fR@8%a@3r8thn_dMi=aO3JEgyGMVuWjQh$LsdRR+=KYn-9zT<{ zTQ;-SouU1_#Z0*LOAH1*6v{SI=`^j;HX8Bp#IJ8+&qL30^gbKWWP$L+2F9KHB^c~w z<)0p+rQoDh&Udb)0YpxZk2Sd=b+i$0{$SZg!RBJ1#*Mor%Gnp5&)wJmj6F?HCn5vPn#=>=snd67`dM8{w-pQSbsqB9vM z8mJ+bjA=Is!=XZRDOy{-E{sfp@op~xag9+y}C^i4~~mEX3wiiemAI5-KWXRUdb+y>mYWS8p3Cp99hq&ojEH# z*W~rvm7*jLDVcJaM5#csT-pyH;s;syw zn5zN>ODC~E1-LrFsn|88SQ66ZKXES8>uZuxDH`Aoh8d2fiI-grR@{V7IF>czYPj?5 zx4;pi;_#^3ptz__oIHu+jysMilcuN*u9b~=04GjjQi?2Fxq^>A`iNayci;|sd3E*M zGz1L}aR!)Nv=jSi4Yv3&$DVRLZOu)*@$yn8&O3y|zjG0({vp;q{4&emd7sfI9?tIG zF0TI7Z+YXU-?DM#YNjuk$ML`XA%*puSa$1!Y~Qd6&&*ML?XKHkZzm7@;#U;GR;AeF#RJj@;)<$rCvJ8WiMc0eNQ||d$gJUUAu_c9qi1f=`gfs zLruw}ym8T5jAW7+LZNXuR4^|r3Arj|#6d_^lM*e4S2Iy6xJ%OfsL){dYdB$lHo=gs ztOdW}mek^`0`x>ytOU$vR>U48UzQ*@QxhqmX|&5uxKJkQ^HRv08DAoVmGz|{H1CR2 z^HS8Y%a+qMOd1)QB_I6s&!jC$4Oq>{ z+D|jB=7LqN{mnX7YDuZns_skG`m;)@S8c9LA7u?y^N-I;X{D!2_?}odOXzMXM=>jT zJ66K9HnU7|oitI*X}1Jxx^&d+t*uw^An!@DqhkgW%k);(Az9((%{hdtuDqOuN6+V_ z=a!Joq}6&>+%#pKZ*6JP8Z($n z_-dnJ+`kVVHofrj?aorgdHR*#!h7mMmUZr}T9y52s;h?EL z!p61BdG^^?sSCpWfBGZG9dnc-^5x6k=c%XuMlj%K%EU<;A|(`#88c>R*v_8ad&!p_ z1nb)A9gHb>5aIXJ&pxLvQ9`FlXEUbOMBeNYB&XK47I;u@t%G7-1cy*`JII%_7_x|^ zW1KjBDxIr7;zt*MgQlRHAASESO4%G^+eT5zm56tbP)w$1@^L))y;tXR2>$xZESdEsqNjEv!Z@x)HQb@;-hck|6)x-Bw=MJ)c zU!QI&b(gk+J`Z)i`H^9{CRJQIU9gE}hIC;cgiq~%Y9i4*%T=4T7 zVA3S=8+YJt9mU@s4k0(fp%%>8H0ds!(DqZd^VGbyr*j$q`n*yp*Ef%Mo8cm*xGt;kcO$v_^Is^qP%0TIzXLx-^~m^@i^UYuV$PP!kNx1 zRnKJvSeqSTw}?aC5X#ypINj`W=W^$q`<0F1Q%;K=ZRUT8i zbMg+;$)-HEjOE3u)m5T9k;Uhf^~nMcE;lVU2Yy+fY=di773VJ7sDPNjpA-J#SenQ+Af z5Lh}AS+|5j7tiOZ^9IODD3%mdjv&cWf}k^`E-bR1OY&@{Ql!5q_n2v?+7t+DE=wt! zR(hzoISHVMWitd^PSw-Mq(lk;0Tp6eFp|y^_PR8ISSUqhn{@7qL_9%Kxj1#MFo{A8 zufs>WlqZMe@Hk23i`0t^X+F;=rx$0jK#fye_DYn>c{6EN&WTu^%N5b7w-PbT;_m# zoc-l1|`k_Yd>C zU;dh_Z}=f=26n3*YfI9`eZRStOYZ$G9lN%uUw*AG$OE_C$+xe$ijJbBOgjjr%Di~% zZRAT?I^%Ih%fwUMmK+k}kfla-R{;Wr5}ryy&uvUzV12uW6V}&*BWZh1k#x%~K&yENFM193Zb|j8F6yno#nvJ5Fi1;WZB>$>}D->oppJq=y zqf;9Z&CC64^`6aBijyp5F?B_v4ZRcz+g!M0T4G)OVajTlQGJh?B78d$3{s@^v1@!j zeXfXMCzKRu0&Q}GXT?_8p_(JH!j&3KQmciJ?G@Iq0 z)N4w24+QqtmDSvus{U5MxlSHLaHg|G(gwmABJ4&i~(71Nlh&4RO1Pt1BmtLE2s3g-tMY(2H!GWkw zJMfmRs)+?GA8hL)n76DsS@_4|y!!iYyJ<0%FPWXZ>d6-Ih!*Q&cPdHOHppf&7#7Gm z^~96t>FLr0+@-I-f|OJzoO&v$RGPQmdtYfw&8;n}E0E)_sj1P&3;6?T{r2I9?<<|j z?+fn-4+lPf6%bW59%k3y)IiAN$miNffW136^7PYBOU?}okDH_7n0+#Wk~d*NCOh)l z3%b}y0AFi!i)uIIxrFYM%!^pu$*kE2bHtGgcy`J21k}wZrdF-Ox2|sNf@al|SVfM~ zA#~uh8RGm+(G7`gO8LowT$V+%XE3nlV;b^lqP8-7*KedLWZ)}7oztg9^+;zYt=1Wia@dj6S+)8D zn(Ld`{Ms@Wjh?~EKmU!c&P~j$8O6wO7eNO~-w}OHDdMB){I65lvYE|m*AtBA@z|a8 zq_WyEX^*(6Bob;}T4-#>bNel9|I>p^Y?}Pf zdGLEzap4U=X7G(Sc<$lH@rG+S`<7qu!2S1Q%fp2?-@+{yU&478UO>ZP^Vt5v3*>wH z7#tZ;%fanCwo_MjYEoyYp^o~)59QOPuc>X_;a~nD?>_%DJ>?W9%{`1KuK5|KkDi8+ zNf2qQg;P)DlRw^vFB)a?72klPrn4#C!IGg}WZUW}8eY7i2*t9EsIOKn`eZgAPY;vZ zxrar*R%Ye{ym$GJiI&QYxbqxw;aBPZ)1#zz_iEUhXcim}H#RR)E^SR26|L5SLLT4halr*KjV57zY4_>R6FMlT;W3x>EOe_7b zz`{TK|2p~jAE;ITo7Z#TIXUoab*!`iggV}dut6OmP^!_{y(||%8 zqQoJtP!!8XCtE?r|OH74f3-i*5m>i=7{gQ!=d_ybg@XXRM7iM zda6oq3x*j?#0ZE6O!96@1sdIcviTH2TR?M8#BVESvolf=dZ4L6lKQH_W~0t+kj`a@ zhH4m!4^!jylgy;lHA*?ll@dXZ!LZoFO7LVlOVHy~VYYxz!w_0(h6Zn#kxYylSD08K zfy3@0Z!2o}R?zPwmP*s=GRPOQwAur>%2~pO6I-dE>%1mgi%W|t_l3$}c6kr{sGgoG zn2>I<3G&QYkM5W1t|b!<^<&b+<$}2NHMj9`(Z;7O4LsV{f%l-v?Ay0j*WRz3eKvFF z%;E64^Av{cFIPq2siq-P?G`jSSoCpXmLYyqJ)8HkZXE>A(DytFOI=zEXnLwq^!j`;a%E zeuj7h($xnYuB%P%-6l8EXLCWXFJAW4Gpr2yFuI3Kn)HqVe(4CH9 zbJ_8VxXA9LDBWed3wKe%2_0m#+g!k(&Jzt7_(NVsh6X98GSt@BgU72@sU!I;26ooH z{3b?Lid;#1PvDmzy+WQyt(QVPqhjj@myN+fMc2Zp4}7Ahl*(DcI7Q=B0dL-N{<5YD z3K~8$6|>f8Q$tgwW>)V*)$3FZgZAHjcC(=%f@A?Ca_8BkAcw3qEtO%8Vfb-H>uFhV zICsDJ9GkNRPCe_39Dmed46NV4x`&^nxm+QWPUzh%87^6eja3xalrt z=%UOvVe`1fS*xt{)r#Ao?D65Lt0Qf*v1;p9qNCa=iGVm?#1{xEP%mT(T39P6i98lVlSnHXo z%9cxpx$djBu54HEBU+3|W2@35lc}^8^zsXmOI8vmE2*JvC61iGfFFMEDh`=Bjb-n@ zOEMW_@7_IH>t?cP&3BO3*4o;vHL(USik>i;Rwj-#?xlHNDHW7~BZ6twDvMMsT$?Tw zQs27ijtBnyKkXm?a@$ex@WM;CJ4$k+54N&LZ3YWY2_;M7b$hitSS*><`&7@5hu>O8^ zEE2aPaYT~8U%z&ps`2~#NA%`7kbZR_5USpcRS;DLLIR}3O=;G&NvvGCjHOGLs^gLf zShCp+$wXXpG+G*)G#T6P^(nA%OKPx&nHb~>WqhGJ_2I6qt7FnZQ+V~Y*Hv_z%w*MZ zNsmQ4S*EAD^4*H2D}eAALk{VANat7BPzfBBympK~fAGN!e!QA!VuZ<&Ao1Nhai>$d z2nCC1igBG^{HWs;9YwMg^9|UnD*qBbe;C_w$HJl$^&L{ExHJT9_u4HKvN;ltoC=H& zZ)u{xw~Ib|fkWpU%E;<1EPLif@`VvvTt0k$vA;~|nqC)zSPtfV{VQVYz{a;epfLx5 zvWsC!4R(YmhM;S>mm0g1_Bpe0ef>O$k3id4ckwWZ32A_$$6aZ#l=5qmSXSJATjE zUp|Z7Th=mW{sNZ%>ShMEeyX;A7v6p|v^GO;g7;s4i*S8CV<(Q|j{E+=l~;Y2j;=21 z#U8J_{BY>0Wq4OA6wv1>~GrK-m#+ddte*T;PmFZ1G~~lmwo^!opGjHyrc$_td{Mg6 zgWKm!oBF*NY#QCx^yNoCTz=!cl+zV03;#V!jmu86-G#4GvcQArC8|qLN%{0bTk1($ z;K6PuQ7Yp13AICh-Q1s*he zLMIodnr zBdHAafgnT41OdaZ`9X5*LRC$qQ$&M)h7u_nTyFA(JT($xC+Xa(1u?B(rNgL>VA5<; zi{8Jd9REFdsAfCJJtUw_ZbnlTFK10A*zyxOXYq=iz1{%Z+gkX@<>K9JMl%71`UW^+ z{^6Ya)$^D#buw+uEeigmd#xa%>Rnv5+0~1r3L@Q4l7ktRyz&Z9eXx{$-Mgr9+L-3{ zanN9qfsa1sq$B5Z_=2PO?^}P%+@lU-@-c_0HFs`n2k)#{O~Wb2@wrRCsiqsxJ@zD@ ze6Wngix+Y9e|%eAnI8L(?~xpd)14aT=o5~kp{9m+mcBtI9_LG6{t~fDhE)Fmk)aG* z)~;oDyic2X4XzNeWCCAvgHk!>j-SfV-o4ZZyhLk*^vC-+^|~MM`s>Rm`U8ZUgVg$5 z>|4GHS1N<6XeaM>5j=PX!B%L@MhwpS{F%IV&!36y>tIBNCSgMz{^~q_GD9(i+6a&dur&b`X6gQn5X)A(dIxH=Mej|Gcrfv#+z(|N9&H5)crfX# zx)9ogW@D(qj+h?w#xq2tjcgd`g|-%4lP2)&iZwXHVKT`<+MISq$Fq$0h171{>v5Az zX3hN}=%v27h25LB;r1BxRdV#&U}sK(0L2K7iz>~I%G->DTQ|xJZO_zC)xJDqpzE$ z2QuLhcTXAn$O#jbO%*s;NKK}->Nsk{CTa1-5|O4>Wr#>foEY{fZC~6;oe+xXUzU;b7H@@)F9j+3t#oxYEClAYeI(70Oa|8hosccHe z)XMeML`*Ya=|ByDBpp}XhqU`{CGkn;NVT<3^>3>nq6#Xi0+#(_A+Du9 z$J)AjlG%*Kn-dkCd2?5V(`MlT_PhuJD{3z(*HiFmFqdP|l&N&Rzl_O-gVAm~y_+`> zE|q8t_z0EEyaw4|WHU4T2B~6Fr#pUGTuP>aQ9c-=_QVsRp#glg6o=zfl4+bFgIx#+>?t9xWSKf{H1Uyc#H2*{ywKPbWy;B?iP<~r-}#Ve zsYs2}M>g%D91PIy&ZsA%BU_+m%qX_Xgr=#HdWVyt?c1;?M$`h;=8fVEMW|_M#N%@j z>+ZrK{>M9a(_UYP=aggE_Sc6YE$#$qTuwhj#SGE#D4e55V;nY(2VPvlFK)SwWiPxy zUBu6%|M(8+Kiz|=a7W9PH|=HC&GwlmP|C;a7wd^9P@2ex6NGpFKfY`|_a zaQXdYZFbrn%@~y&nRJqlLNC3Ydx&q{$%MfoC&t|@|IK~0q{~dHtEc_UGuU+BeT3XT zTxAEjk&IG`x+x-gy$QUPvElH&m8kzFM>d;opFZ`{zkR&+=Lhx298>U-VuTu-jVAH` zm&StizAZ|QfO0O(oWQKZ6rxLxcgkiXQ7Wr8Ni_traqD}|U{LJmLP5IX32GHQ#FQVb z;31wiX-feYMzX*-pBKM|&YPNts;!Y`y_77Pk@bfCmoy*AJ&WsL=08~N z$NdNKS;4A#5NhmWlA8rgRGpyYu#2+(i+^~fVumhSma&o;E#wfPG-#v3N`0<#xCy&l zCZH3O4fUP1CJw4avB=1JEQ0XFCfhW#s5r&E!c9Ree`RwmmFSmi={D%gXYqJlny4O6 z<%tA6Bx5=Ac?GQ4U1a56vPn_sR6WFq2oj|uZ86dsLm|@fICVyVTsDc{Zm1Yk!rx>X zI8+eIlEF|Wi`Of3C5vk0wvo(K2>IQNr1FGhJ(Nrd5kQLdV^RKJfRR*^umv)LQcM;~ zG^#rlcwJ^tp@f%;Al4=HC7Fs<^?TN}sTOvoK1K=;^I8?GI6iZa5L+%OGRy{%U4k$x z4%U>*?3giyB?Ck3@c7C5Lj;{(F8St#w2f-#q*G5+;3wxqu8JfC2faQ@MG?H0u}d1U zT9ZjKy;*>{YzA+>`vFh9vV_$eS7MZlv{&q$7HXyU!<8I5eL6=ScPxMS*^PYbmp9U} zbsepZ4cHn+anIG?FJUj_ubmXb?xM|Ib=Al5^FK+M!TxkJ-W`RE}e_!L`JKw&7H~;tuslI-?OBJ1* z$%owIvy2Ef@$MHMf!o1gK2OBwppq^rcxbgbsj)dQG%H5T1j_ne(MGQbq^)U!2zM2r zN;llh%-k>3-#-+TLb_y51w}9|g|fF`(wAhV7E!g?k|>i9ijd?K`3(jnywUE$Xm8`7 zv(BK;ZsW(lzn8qz&dDbp%NG|M!Ir;0Pv5$AB!q&hwU($+Y!pKV4UNt0-nW{MngRrkD=h9Ve}a6hKHnNUWw*S0~H+v{azey7x84w zq@r6BHUS4xZ&vdks1LUTXmlRWKyX7P&^EdGLr0d@P2`?IoKpq-z5HZ{2kFzd3nW zbNO|bu7CdJJ3QE3r(f|cJf|*XMNcQ?g0Rm^6kTP~xilr=ldIasq$TO;w9uLv66f4c zUow4Us|nPfaIoIHL4Uaz3K3jKq9y19g-wd~rthxMB`;q?Xygn~3Qwb0qwsof*VNyw&? zN?Q`$K|GnnYXq%~2@|B~`>yKyXa&P57g#+RMFeB|9Lnn|6=hmu3U=f*iNk{3Aya~) zD&++*$lt|=hVl9R*hQmIEHXGaL?{r%B{%-?prT7jNbc$DRj?z@SKdI7zWxDoi_zmT zuZ{W%YeUb0O@y}DIAw8E5LBHnP~-AYS15AYxGC&;`(4I6Dm2;44DH%Ro!3cjI8D7r z_`*S46^U54VL05BvvHioJYL;-B!S$8a6VLI+<4-fTbu34mdK%0<9QyY{ zqSIXI3PFg}OUw_hLuSJEZ3?_(O3>ZYN1ZrA7!Dd|9i*+%__`kUcJyLv2r-x$##zoX z|LCJhFL{xCM+cE(4rj|B@57zWX~%t}n8$^Iu(bya7svnC58)@`6JP>+-=7v1`62pHtIZ|COU+{!mEznqUZ zuBWNKo?5q`M;`ez7hQD)&7(%K`I%R!H9YL;*~5z6o0xmvX&e-+XUh$Lpbi@ozVStg zL8brkHz|7E?3`GO^W5WjXS9R(xCWY<+brMcASFEXi{x7ZyyAHrl8fTV&>Hm7@!l%x z2a-(Bc^G+f8U78OL^EZ^A8`Z&?|w+8V*pQC63gv$WCuyR4fYjFyP6vj(H-&~Lqi}Jou>`@g+2mYKy3<81K4qg7 zfBJw|rkc|EvD}tiZiWhZqP_rK=_ECNNe_>!34;ixhmu(Z4=p}BM!L*6uYs>98->_$ zR`foX4|Nlf`pSY6DjHTgj%m5~fAiTa)}+`oGZbWB$a>sr)!LaV;I}&|lr6UBqiHHLK;Zo@apprOXP&It`RgI(ISe! zEs}j9G*7b|FXH0vH8?n$wMmGdqc7iFJ^RkjKrPaek;J>B%U zYX~=u#*r%VAK$)$a5Tc_zi_e&Cndh8Dx%+?J7RI>#Oq!(k3yl9>5{ycHm%*v0}nmO z`yafG;kDCTv~m87!}#>w51Br0G)EmikGpRA6&GCaRs0i1iER@dAFgK2h7C+T@mR*q znN5ChkX7$}NYAd_%$+fdQHRdc3%={EH+c8`_i1ly##St;&;6#IJDAwiL}S|+y5nh% z`Re&}z40z9wrt?EYc9q;x*hBu9(>>drY)Gy>{+wP?&+e?(?@MI%&OO4VeV$1zK9UH~oSkJnf@8I=^pCI7$s-@@^FaHf{gBmirsw3!5NKE)iFUKhe>P!(Gm9C+Bl==9y=*V(A;$vpFp!hf@i}HOFBdT?ruIyli%LbZ3R-C_n75rtQ_Nd@ zLYc^D7@^wSmPyFSLZ*uUA9?QqZC739e}B$7d!MsUFSh`rKwQ7ql$+ilgph=UBtWEt zfK(j|!w7yw0 z>zz4SSt~cU?Y+<5zu)tHo^Q!mm1tPR-SYMF97~ZaP0Zfm0Y!b2dvqj|r&U7Y&Oe*) z-h2}go0rqhIftkJ^aMvXH}UOrF5u7i`~;6fS1wh#tm*Vt^f{@oYvjPT9oTIShRHE( zv(RsI62-<)S^`xiA>2XUaAL2oBjYq!wPOdqhDPjOpVHw<&2HEnNIsa*cBLU9VS?gp zBg;@u=zGWOxo)wPtgLw9Bbo`Qu+c z{^&oXd02nt_b=b{!V5n)ESi4yHCLgXej@97`zaS?d<-Q=NjXa7lETF@H3@1#lTKCz zJeX+CP#3pq4<({5n{GN3nLe~;H+?j1Y4qfx+Igvh2l+WwyDSm1rIT^m zHmdv%m*G$fc=6eFi}kCf8xIi$o^Nm~rD+wPu~ldsuS(QtE5#Sh;eg z5=+T3NC=1AP@A`GQM@!6yXT80ppk1(1qO$0Vol+Sys1@?AU{VyK`xs|*PRL(s*fcu zJe8oixtT;Vt~hAb&xzI6$ndbb3FP-njze@rk_3gqq^UqVp-=fkHEIfz7hYdcrWB^z zf}m}gI>_hb8YzHdm2rO73^@`}VWB{s%cYztPMtJO35XpdgETst9Y8-yWT~ApG%&GkP$#>Xk zak9snC#7k)3i7a)scrOe@r7rx%A?=DnR>&|sTX`6&Oe{+e|(g-=}kn` zIM0p46<}}oL5@D=Xg+!OT{;i!L2GFyTPiR<6lB-7tt?!;kbFGPdr!a1>F0iqk9v11 z{Z6f+5sb%K=&ND#^5>ZG&tGKwowpMzS_r4JigF>YLIsfD6JwUF!TC*9Xa zK!BfgB&7gx80f+k#vtApV8>t|eur0OhlEQx8fqJfW|EX8fwN#y54VVxMn;Bc3pUUz zp?ZdgX_Gq`*t#9NO*%Y9hO`15XDnvvv?KWFhW}uar-s&RK2O(&A7ZTUrZ1nu@h_+H zQJamfIb*0jZVtN5!%!kle>$zYUXlhc?l5lMf!m>D&Bmz_CzAdMiH$p`OXiqcbP=-E z({=zZ3)uiPhSGBWM>o$Dwjg)Mk&a`xq<=@ zy{QBtr=Q_;6pPq0i;b&T$_jXpra(H+c*ALGWvT+TN`qg~LMp<*su=LUTeknF`U0Us zSF!+1@SxGHp}>PnSu~mja^MhnkbE1{VaMbTf2#9e6*p85>eC;OI@qdX(tr2(M}M8^ zu4HNssv%_xIH-w)Svn}U6lD`=+ChoCo$BXQhb5XuJR|KS&_W(HG3pX$A6Y95%LT~F zGFK>Kmt&NB+bX}?ibr=SCmi883vXHqsKa-M`JNm$b}0#FRv(L9sG^Gr??gb9IBN+l zRSG|;XFM+6OQu*iwS!f57klz{9R50t5?plN`5Zm(XpWgT>rk$UOitWxLlrZMr!6N{ zp)BQO4^f4drV7c;>$mdT2Oi*)mG9#VdI;uI-AkP~;^-RTL|i@V)?5KwI*m&c5vueZZKTq1YJ(wS;e<-_6@j?~ovKu5r<4AC z5#8ZZ&4QxS#`$;O%;w!Ym~qTJ)_$^@+VNv)pE-;C=AA0%fT3QPF^Pe9-$bu(;<2|^ z^Z9G9qZHCV zVw^9;Q4=O8;LyE$r+U+BJRYTeh(?o?d>%<6#a0NqVu#SLrL(bYtDiI@-%VD!y$;)&jop*KG;1tG*Oj^a6Gai>KrRYG47OosWO?WSQFIh8$>MpKoO8g;< zpSr5mU>);A`MN{2r7|?Mj#1ztJQ7B;i(69>BzvM*!0B?}HtZ~2yoB#xcddH9UVi>r zMXm4b+(N#Xr>-`nj#&@mQRM?j;7P42~ zeg7km{NL>>e|KKK;mYq_x$*hu@AYU7?er@zM?dpqwnZfIPFFU4sd7dIW{CxrY=G)u zCFMDPnEx-usoVfnFrbQ9CA>5F_lh@GNlUG20jffk(V#&tfc$(Zq^nLv@_7LfcAHkA zOO2*Y9gYfD=usAWWx1DE7hiZ~u}B!N$Dk(QW$M()tXjQZ6>}3OO=Ii!ZRGPgX3v^M zI+aqL9J@p3!w*)f@UB@$%%*eaE=IypY?Y~j8qLc%zJgS%0&h8Id86e2<=6#4R6&6W zoGRC(P$ZFv<90gKltVmtt2z%;Q(?g-KSR0}VnnU%+ZBH{{)RK0HTZk`@f6b3`#j3GIGRe}w+Cc? z&PXm##OKC;!qG5(B9Feff{3?<-8Ks&iht?Au3I_jl;gPa`pdx@h3F8`$N$JvxBoj+ zjV6ve?QB@Ggsm%AF!gh%&^gdUBAn!yV~-<$po`SNAn(5RI*ZOYnb3JBnWoiN3%lR> zh(c#Kx&Ao&_8;W<^Umd0y%Ckb-2III-IQMC!z8V)R(EPfH$=Q2tYVDY(0+RF5YB|OJMELWzrwuY{u zVd{M~^d*w2ZmaP+=nF@g9%`g#qz|9PkM7h+6(Z!VMZy^gAA^~vox=x>p&rN?Ruk=37!6aTyC#mNN1pNdo zRveKyjaf)_?!>z9ASYUaxSx2J?)N`o>N(4>Sao*)?gcs;C$X|`FFn>GQMa94@l5R8 zd5drF9_V_)n$5(nSG3##}Omzr>{q(brv z*`lJ%g>BH6&oLw&996Vx3g8QP$mR2-#O~7VAd<`yaJz{llPdornv=OMN zOtyxs!$FT;raK|sWgCS`8huDi7-aIG2t6_xHB0ttz|cPe0L)|g8ho4)>?j}Ip& zkG>Y8&+qUt{k51`t>qO5ma5}ZPN+rF(2*dyw3!wznFuPlOnH6^o2F!1J6df@Odhb= zFf1m$M$+E&Qd#-y%P3zm52^)B)mciJKgcy#MYKi5Mzm!NwWnt z(M=>XIMu<3n7fRj>BRFnYz`Oka-M-)UVXo8M|B9 zPDcSo5uR4U+p0MX>O3nbQ}!pxaM7(YH5QGF(#@*;02S_60g!^td=?9ShZC1PlQLb& zX0S^EsIoCc17Q{(3LmIF*UZe2dM~4#V@$AOlL?>I1S~>FNy~ldb+e{mVSRfWt2HM* zjvxuqUXbCEOTNgI$rCwo@gg;qRa;nR_18dk1#k=O{qngFSkS>W~e z_OWd7Vswh^lmfY!=Zj~Y#k`iWg!_l^PiVzo->6)*62l2n12MWj`heXp{hkJ`%uph& z_9p=eqVE(Fk#y3e7W+JIQi%k9&4N)V(`2<0vfEXTj{=*A=2?}sNKGG2TGFA$ZUwZe zdtDjgNSb*`39#j57x$*JIsKB)i6fW#{*ss#h+~rv>14{Zt+z@V^kKKq>Y8U-otn8` z)#ml+I#uQOsBw+S?5NhR)w-<;9?Hd>0-uM$gJe9I0dj(p6;sn9nk5Ss&3-6hIvR_c zwXGyfD}AptLo_Vqf(nVd3fqje06TqWT8pD!Brm)-b41s&v5RB31)(Dx&JqV58d2|1@n$PF^A5{}en_ zI!j9ABAve+`IOkgmen}VaB4KyHK?40Y$~dX`FJ9uqQM7+54vwZl04|JYfKnFPTBRz z_+3ON(RhMgdk-)$99DwlvYI-W>igl;)6 zR%1h*nn3h+A5?Z*f)>L=!z9uvd}2qc#659S*y8ajuX;hf5_}?K`1edeqj| zD>UkHddQ};WRfYBg&`d?2}Baji4;3}!J(#XX>rfWCD64p9twQss9Ee=w}y=$zQ@uf z3pwS?(`X#i&Xg0Dfz@TU*@mOw4=O?O$hNiIb;T7Nl`Qf3B}*Yb$l4cQrV$HXiv;nw z>B`4Bh>d=aL7}~ogg-=o2DJ9^q#GKDX$G6tZdDYJ6ONn1wO3z)?w3+BL-hWKc<6gS zVo~!rj=A7VFz*=FzVj9hr!6B>BbJOA>YPr7*KH$EDABoUHIwHZLF*;wfi#t__<4=&;J4kkFGhJsN!NB|u+(*x#&#<#MUtmC%C!dd?=4C7nEaeOX z`51#ky|fq}YRXnxWt7`Dgrlb)Uit|CFJEVxD@g5`^T`STS+Rp12lp{-v68Cuu{#o_ zrK$DJ#=4eUlRXF4r42)Go-}F6)P;*~d*bf@IPwUGgW^axZYzXzXmi@JCUe-O>e9?) zXv5=Gle_L%ls@S+xeQ_!h$KxbPe~}20xg@9jR8Df2P5$;A&*B<1_KTsv8;dxa5_DV zBon3ur`^Dw%h2j};S=BNVjf+(#}$oQQO4jEm!hh5Yqg6~1rOD{gF_tiiqF2Hj#U0F z&$24$ie|vz(YxjIRT!dz=NV!9wHNdT66G^z=;3vzei0ADoM%8_Et)I z>2zr}Vud0R@f9yC$4GNBVK+BuX&jY>FHcE{$o;y8Q!AqvvZ_;RiggcJp;rnS(_7wr zKTPnT_Fi$Y!KTt!rI|$g7aMdWRcpK2ONyR2@gFXbwST31a{NAOJ~3K~z+x zk*Pm1d&4Gxkh(=^9eL@(l_g8V{ahH9oDAX6Q1p<7M%Cc?DIM!+|Rz)+^OrK69 z9cJN@1)Ol)aV(raj~Z$Clpz|8;1BvtD()y6t_1Q4fY5crv{(k7dG=ZU^s7gR4GoYk zro>QTP2q=`$PD*%cf|L!NzQJM6{+G+?aRdk((p<^Xy9)c@00D>2 zfn1jO)afL>Zj!@c7EJ6Q7#`-y#~$tQ!w35ElDyLk8)_j2Iiex}Ykf}+F8 z)33hC`x~~CE!)r}_|4;{DHOnAD=^e^Kuu6eHmAxlX`j@gXyAk0T?E{Ave7U%UUCWZ z96eQ#Il(jFvs9&rsg8u?00nBWX?EiAgsKtMGpF)##78l(FO5Rl``AHp)qmmIx%q_wK$EYFDcYDO6@K;p?oY{_NphZ&~en)RZy~wwhsZ7lDv76 zo@Yiy`g|^hHj}9cV_VvByX;EnDn-4=EB0*`cI@1(V(0yCmjVnDAs!0))nA9GcNmi*!@_*H=2RYX2c?de3HERa9-+rqaPdC)psj#6o zSzM)KDqiE6lyYH`n@Hlv#q~+XPP)U6)gm{Nj?Z6%r?wW|Fxc3+LpdU33q?}Ntg^Qh zU4@*Z@OIVPAzWk4iY9!>qDk$_=|X8TX%>z`meYk`)df zE;_Ehh}@V4Mv_T-B1s~e&c}Q9(~~Vx+cKVmon0yqpg7P&n@8t!%Z|n$8>091w{Q=} zX>->zdC_9{+&Ofv{E(?%zZ~jAN&r`mMcMSH7qIjW(zk5~P2*Y_cidctlX2xRwElxn zFf1;HlSzhcWzM_m3VLL$AB~gvWIY3K{Dl)++SvKpi%h)ubl(5z-8AGN95I8V(pEdM zf)&T44i?>WH?RKgQD(J|r+N0#JpS$PFr{@I;~E=z3k%*|P5d zU%lconj4y_nJ|SnANxI@y!#&0I>yjm=V#ML@2QGsY@mj&$glz{L3@yqQdofpVL=rQ z7afb2a?I>GJb%X>O!U?;^~y^bdEsRW`-kXjcF}v;QU*_&MSNxln-UQcC0SG*wE5eV z$Bzdav8+s(oTQUO*y9PN)YnrEM{vfIys`p%x=+%ukLZzK|lcv_}TI%E1VOK*MXJGXSq(li`t)1^G1LxX0) zk`^y>@v_%Rio=X_J47FlimDD$M!4XmGO=u4O%OzXBj7|E0&0W5i<<$}^N2!N2{wzjs0y+gw^dwoRXF%y_NU6q_62L%aM6AGcF z#85h|1gdhZLAypkGjQYzI3+JcouL#>Wilc-mGeQ+e&=7u@e<;7ae;}VXTSli|cSY<*Z;GrV$RuhQI{J; zR<{%=2x_S4d!%Nvc>JtOXX$KgX074m={*OSdcuinf03Z53oba1Y15`MfBrFw4ItmG zCT12J8S$x?%p_e`&#q~qDc0v%3b`V8+;SVAtXx4#eDQ-$W{2vj+prf;B+9WT%;%^j zi}}O1Z=|lZ0qeA}SbaX`PMyuq@BIbs6DQ*IdDY&!h zEPv{0Ce2yI!QpXU?w5Lq#7sPnSA`yeHcm1}+{y%*sx7UAA_wXz>B|ogb!AIr0&JuXo4+WJ&fcexKC#! zkydoSmijuzHrG)|$JyA~Nf8%$tB$k5&$uZa$|z)T|8Cs56lYGF%>0~<+4T*y&Y1?2 zJCs`!nF8$VA>Y}_2fzO#_Cj8D+C^s+7d@Yd&%`*wA7UUnqB5=$*_^UGH;T}%*=V*2 zcrdy5{~hpP7M7(-j-z?M%X1)frqSR*?u@*I6WUC0AyXD%QiPL2vGTD$mBc-69J8+Y z8W?u&c;H?(_4IK1*=KX!u?uDaE<(Ono)gg($d6UV4;6P%HGxp0LGu}uoQIP5_m;C2`jRvwDlqNS z-~kIppaxB|lZeH!%6ch{>3mMrgqko%D02MbCER-R_n0?-9`C>YGMhGSpufMbVzQHB zaHyZ=rY2>+BU1-8*-%(%CTiST#_b=c0{PLe`#j<|pRafFV=X7?&lXBVBjhHAWNN3Y(@*u*pY6x0ccx@Hk zg9#EUV!XyLUT^jRitLU#fQj+3Uz)AJzD%y^!foGBm^s%b#P>qDAI-YR_&HZ`-^St(vkfG<<#@ ze&P@45?fyam(xcgkyiXs;rR+zRf!Gd#uraxNvY3^t5c4$gp^UlqwBbG1(r>p$*$FF zIcn-87B4=QKwBg3*)#dkzurtZmEpTL-a??I9xO?zu3^<4R^IVLrp%c};KI`(+^rli zl0SKj)YdK%;S`yPtxSF8x2E}Y-v|TYVV-#HCEnY#3134y4fXA8d}l4`{e9>IeY9E% zxMTes*V;&+x1TXi4|#FTxZonV>M~aS=GT-aO{UP+h_%&6w7ZAI`|CJk>XGzq-pVsi zJ%ytoMDIW!zLG&ETi}ArzDm@k^Y-pemVDtN^u`tjcJHVA<+lm!@8QCQi`eLnI7z^I5jqn+Dw6gw?Cw9T@TIAtj0DNBlNjN ztlhhv{*|4$%MQA8Njx?6g$B3r8(VYp&-Uc=yDnR^rtr#ydEVfxmQ!b)bJ3l@yXLzc z!Eiql94@lCFd?r-sBA&YHj70a0oaYvK1K>dR!UXD{WzA`XFnN8e6N$Llr!HinjDW7(AGcDwW1` z*`hj)Qm7V1a42iD=(sFa!s#?Ip<5nW=*>>OOid*yPXxm3n{`< z@nkPi)-+NS87Y|B8-X_sVl7*?5Xf5TKELV~%9RPoaTE$P+B94;eUpZhfNkZBQ!pK=)MUkMKr5|f z$yRX?lTuKoBWAXVXwwvD9XtDN4%WF`taUqivU?w{iBo8*X(E|Qa_Oa)GJWO@nwy)b zX{g5+aFY?U0deFRb%GL#DvpD?xCIvBgV*2T!3Q6pbLUpV(SD{+>|na##lL+)wV$9jhDbTAoc`5+;l-^xDLehDxs>VcWw>({#r_`r zBEGddX*>B0x}@_fRI}b5E}3&Q&;Rx@4hSPa-WN{|BZ(+(uc2r>iA+ivK6J$rSOOvX zvPEp(0ExUbNmVzJI=_pS8XpG_^b${N*u6n^_U+}^CC4&j%2+n9TtTRqVVcFl{CJ5P z3Dhknv1lbqg%XC{iLE5Y3uRoQ`ANiyl!_{#Ehi37S(&mxjmyhODz3C`BJlUyOaXnn z%}R^az!2KFvf%x%ClA$IpgM^#!Gk$rP=)~|5nKxm+jLvX%Y@ESQboOh0Ex}0uWM#^ zEJDWXWB$b#@%)+(S@_j2^RM^a%l4hSxb}hzSx|ztPyLa4Nso`n0$?X$(a;)d@zey^ z-MNK~Q)j*C3p+ZPx9n72{>wW`vno?aaUIiqK8(6LvNju^2zc;%mFB@|7;5TS5S>HW zhOX(vk_jbhmgcM!=2F8|L4qkTJ`5hJ(-#G#D#i}g$%D``tIh7inqAYhM{*vDGHxtp zD^5$MzDpVDDEnKPQb;YV0(5W%#VAK39+O?qTws;6nk;A1Jt*c`aLhbz_};agc>Gd+ z_uB{Q={cyHY{SFD>irZwgVf9&9pez4hOEn3aR3vRNjj}+0OiJ1Tcg~)vKg~hjzyCc z^2NMA;J*5YzkKXh|0sC)>c;1n-)Apdb>|5BNd9IZ5gupEQLfy74TK> z+bVdda{i?|Qk_Ip73_)=CTQ=#Y*oXsA+^szGbYbtzv350y7> zR7QmS9HA5iLq4*}1P+ItbRvb_uyVw-8Kja?4({JYTU#52qD6Ix#2ui2XqcX^15BFO zK}ZVub!(MfT{4|fNzTn}WBGW^8gerFQOSX(#zOh=R)X=WlbGtqLP4tjpVA^&tpr0} z+#WkO+;9{1bsk=P?m3P;W)At`L52o;c<8}jF>TTW&i$v0C}(nP{P;tTIOSwD%I;pb zjz~OBGG4-BcjEN>*|~2&PrvXY>4F5v)zUv0hO$lZjU`{BAd?uG1}UJaW7CChmZGec z)JC6|6jg^osBGo9@e^48=3AUNXAWQf{&oE2so&wL^--4OQO&L_YSZxq^Nu=-`nC>u zXB~U){2?KG39m*x27!@w)L zh`}s$4^b0IP!o+X!)@c@WhYYjWEDfZ_K?Wrnee$Y;S1-n{Qmn0&YH)rbeyK?=?gC!A<7P!Un)aD_*jroJ{lF6> z#p3tNClEe=0q@VMXJ@fUbK1}J<{4~{4bvM5--#N=iZj-%QHuN*=ge`| zwzMppdj99{{KLQAF~hNcH)CW2CZ#A#wODb=HMBV>6)mK4Wn$$#2T75(JBZsX49Y~a zk_phH8PvPI6qBOWF}v69QQ#pglZVP!{{Lw5AjRz{+L9Dvhoymsa}Ex<%p9W1{54(a z(D+^u$Ny5=k|H%!1kH-}t9ZX9MO{^HEjA6!tqkT;3>Hi$B%cjxYzE$vRnaNr45Ty{wvu#K z|HkQ7RTn0xP?QZx!1j2EClaa&;q|x~P9*W#9VBz2;qeenCI~tW#X(O<;;}Tm@a!I%zsbp;RK_cKnq{0r1gY@?h?)463UM;>(~J-hZ0uo$=&EM(O$A7t)1XY;|+ zf5ta)92*N6zHs%`(AoykIGb+1g$=L2ibJ;$uMP0ee|giSCFSz`Mu;Y3SS>~V>AcU<=(O|76Av@Zs&Smvi8mal>?q=N85kBjrDO(cx~wuC zLVi1uT!N^jM1ML*PP0(b>_k&p+ztn^Y!~cO{wTfI(&RxSHlZKjFrITB`W19jG!B9O;uP{Z5s(~ynZ;BG6%oj}XP&MzV z)~;3ULX|SFR-92`$kO;W^|;cM{p+T;2_Ve6P$kG`WDaUlkK}qQL3xGtDikM~*eI>F zGz|P9Y&M;^7{$ngCQK2FMQNXeN>4Gzf_d}#&UM$Y>@&;w-LD@|;GrawSFu~w#l175 zG*)eG&5HFRzg8GK5)vnMsMByOla}zvkfQZx(jrjLkci86Zpk+`)LeV_FCV+_A97pT zbk+AS-SFJ<2MnvGpZ2xOaGrTGTcVPhX(;Yk&YoAw?sPa#DQ~(BDawur+A0P7rza1G z5t&4yo7PdHdHA%@r273;upwQ0`PwS~Ou&PjsC3{3ewdSo{{%dg%4BjWH8x8|B4*%D zxlE`gz|1LA(1g1x)@Xvb;u11qQ%HGmB&^c>d|tPjJQVXeQpvb_b7iB7#8V7MMBQ)F zn#4s%3U4{aswHbx@GZwCKVQzFdQ(=>t$>H#frI?=!QZO!_mA(siHj~cm)@@ZeEj}< zy!FP*)c8F#H#89RN%ljU$&)83!FM7VBRrBIP$P5{4a4VCMbYwCUso~kc88=cqBw2> zAOzLQ4KCs|Aup9h`=I{H&1oT{&}xQ8pPy#C!3iBx*!c3xoPYdrESNQotFE{Vr=c-z z##ExiVLCVMqp2pKx`XrEJD4Ez(!B==kjA6QGaznUIf>dNod-j!p)crX^7Bu^m=+L@ zT`J1fJ?r_8habe-JQkNTgu7(0`{Q*Ctyxd5dlxh9b`~`>;XK$wtLQwO1`|(M3|Cyj zn@>DJI?#l*zMfEfJ+6F?wU0l|vT>6LL^Hhq$}8$z#b3(H7fB5CkXb!qa4yI`K`51}C@S`iYmNZ%HZY%k8iGpr0ZqX8so;`;b{{1c{ z_-oNyJWROo0*3E@jP6u|;Tf$=y6bA5pBrLDGRD|qEz_Hh;Nziv><@=A0$!EGo9OCg z#<*7M+*W+$EJJHH(Yhl{$5wjBFS zar(F)$1<4%b@lb7^udF+qTlarXm4L!H-GLe_x<=kW{r!bsL7=;DA5t};TLO4QO?>l z(%B-(Qi*;k>0ExgQc=WI_z*=%94D~S?Dk>JW+@aTTfzhnLzT(HKMWo|MO*s2;Nep( zmrv7|s=MU{|gwosTPHCz&} z(}g0#C7D0ih^vVK_yYmn&ER*rNu-i0FGwgc;+~U| zDY*(>G>D}#iqa);z-I-I-L5E1HYxbT_(Htzb%;95-yKX@u@}vtICC;)`pJt?fV||| zYr%T9<%)E=b=K55SiXBddQB7KryWT+5~04fmUGWJk8{pCTTSV$V&znQRRua$$Y+YI z_}~NHe&cmMdhZ=d`846=AWepYC9Pv9ZrV;=Uj$n&#k^COG2_fL_`{92bMd#n0n^8_ zqjLv6udSwY{U)yX`M)zf)Q7G)c>m>>2ya}&7w-BuhN5wXMuzEs=L1%K^byxRvz$zS z54$(4WZSAw7~a>-Wsf~UeAf0Ux@vXOV%4bhw<_XJ) zui3;$Z@+k&$HH}T+^swW)n^^s)r_mf1;te%i`of=} zwGl?*Jbc5=oE2=~rF(ycmbbC5Jd9Isz~9oqaHOA1InS=>h$^1DWUsYb@r>zUzu3Cx zOSpppl^-HOtm4mq?Chg?<=x@rVHb`8+@z z89iN)gRcs!Wh`3#-qA>}`X(t+b*0@=eIu&{xynqac-pE(b5uy3blS_MvU0YNH(0t` zO7fN$+D1Z+t;KCgf_?h?`-#R;^xu`Zc2naa$0~fZhL#$>`@QRs zFw;4p5NUwysmtxB>t0wBtY<12P*a{s#Q4)tE-bUCIXlC&y;UZ+l)!k)L^Vrbnb zESWTcZL2?`&d~6di}*wUoh{;aI0>gSq{$PIv{b{XMD$V^i2O!I|EddC^@DNNvhez= zVE$Zi29%HEmbDvr{Iyqz)`aMjAQihod^kd?zn5mGjmaSo)4gu$`$vdw-%TtMVd;72 zG5-5kbH}Z>GViRW&v{R3h4@9x4`HdK(! zyL)zU`Ay%YpAonfIn+BCY;rnRTN0=_lT83}l>dz9EYUrej6l{lphrLuTE9wL>=gQVR5 zA59+q4tP-eXB82QW};N~(b1cxnF~>wMEoxY4?+!>^+W1;MS~PoK*c*kG+F6Fo}yKR z%MLO!@haqq$QoSPm1JEM8i5q#0ZGHvP1{n*;i%GcRKTU_?PRVb7Bd`A(Q;&eQTFX- zdt4^k(nu1^R0*yVT2Eg=x@p2DFDVdOTN`BWP?&nB0cq35QaH;pwU7WhGtJr*fDdLx zt!1ublGZEf*glJnCoevBCFNFBREf^!%M7_Yyye<#cCy7BPDSC%s^Uw|Spb7!707A2 z^d+)s>|$ae_SsT!88&j6qB=Iw|4255TeIP^m=g$bRmxinBpl|I@rm(7(WV+l0#L*u zP%S5w4EFb9v^MkN?oPh;gWD*0opjVSvEiFHv*X$4 z(TZiFH6FgQ`hD=Zp?{DkfASNi*lqmwzMpaFHQ%6p_K_r926^3z-BM=%?j5A!QF?m^ zdE@<+?CBe3-(ZxY-A&QqQnX>G*N(?!Cz~2kIS$2G375lzC*W6I<=Ef=rA!>FR^U6A ze1)^7%|a_=@f|b8wAN~DH4|8k0BqXM&a=*?A)BQf^s{4VLorzL~hiBHrjW|yq`a9P5o)wk_ws>)`k3|QfC|n4`n=V7sC;g zexqA;MzAtr!2m4U2Gn@a>++St+E#kmd#lYIumgHg#wBb?L8Ib0OH4%*sV z*|~ZxNek?=TG%N;d5uljl&1J-08z!#>gy`388v~exXH=25P`GQrlKiO)cRtUveaQBoK|2! zy3iF{|4I;_THDmmFf|VX9>gKjbVv}Yk}Prs><$gP6&5Zymg}$m2FEX)$7`>=z_x8$ zRWn`kY*Oij0uN)yj#Y;{I5dRM>m?KnsYbV0zh=`px(@EACKSYOw<$fg(!OSkI2=aK zWjL<6{pSzMBKZ z6&xrLw5aKeMdjUG&45rGFq=7%s7@bbp%vs*wL7g&AmsDnq$HtjCTK7N(5ea73Oopx zOu9qaEH?FKNyvtsd?BNJrDx8V!mjOG6+#S05{#QTS-HP#+qp}5%F9T)xv`NwyLRIB zxKzkU+nBM`)Hm_L$Db%svN(1eI#-MM^%m9nRL@1mVdC{G8^mZETKTuf@8QJHEaj;` z{(;>)cM$M-@hf}N9NBadpUb730Svod@#!@VQKV#=;`i5(h-Vdj$?5m0%}<=7M#6D) zhoSiOYBR5pwB_2E+~K0~Di_;fkLD#K$15s+heoZ-i7%aI*@TJou6Pe`e-G0FZjyVp z<4h+Al%d6L;32Qq<_q zB>9(HZ&W?eQY?bCcZ8kKF2~v1!^SsX2@gxk8CD~A?ck~8`)fnT3?WKHcL30qQ0ex&E36t+>-F@p?hFRh5t>MI6*mLz5Uu7 zN*L)kOxrxIEMa{mYW0AMtslq^D^aB69?12bdcram&R@u%?z)4??jTNw6^GxT{p(+2 z$ItJ>l`ON>S*Gb%-(lz6c2>lO(Z{sYXlrIqrk9a&7EcjQ@U+rUvJlS<(Z6yH!BzXw zKG=r7b~ioU-PE0S3=^hJ;pLw`LQ6@;+7-sfkW3`gwPm+mcC~&_ zQFlyitDSb*N&bD$zrfi3xT*h;DleUe6(7^HrIW6Bi~)HP-43FqG6&NV&LeaYllyHg zTkv90bg>$XhFeC$MU%GVaypa+Xcav8Tpp5XGpYO^6--wr52L|@&{3*xONTa#|AgAE zOd9?dg9i~Wi~C15Ur-by!R*pGuQGYWkU^%Mir%2v$=a;MN_l11EbphPH#ALk<)qmV z6xxzBdrBY;b)omF%KcCZ_h|4?ffLH^*5nGyji9z>(O-yDyrfg>I?;TNfr7L+%-IEk5raKf?pV)CKF9I&re{x|e;ftLGp)_v|K_O(?gPRAL0Zl)+QZGpDVM zG3hMsH9MGSb@Y+f~eC16%9Zjs=u#V|t#$nhEj+{T2x88kEdDypgbnxo??<#BPR4&VBFS&## zR=msAciu@k=%vYG%l?Jf$S_UPK-#*Cl^eHGuzTrGWQd73ujmk(YN@aD)7P_Kg{T0j zKvutnhjVy5E<#NW)Ya9ncjq<&PWgEmmQ0$&iA`e|TN`4*m(DfmzK!BQB~&2;UV4-L z*IY{=mZI$Qus4=aV*irUt|&|aUw|Ijy9@`(OqQT#!CfdbRyP!Qa4BJL=2Mf0zZU)f zcff;uho&fV(i|5mlh`vCl?J4!+{h}SgLVgzqJ^oKT*9_BpRjuS4i2Q^1nmKK=OTh$RtA!2Z$)=`DLNda z#n#?1*wVEZ&FjbR@u+8C8XCGx8H%Rmy)FXuiiV*I9OUC_9a`1eRvW`r3X=jCmXa#i zWeu?DcC>0BvSbsb(_};wEQ}eUEu}^8ASYA-50#0anJ#UvaVAh0HF>Cj2bqkBJCm?n zM5k*h6*&5+IehCIU+3&|&f>+Vo>WW}sc(CFx+@`Yvc~DEks@3s;0@T*{S-tW@<{Uj+S+xpn z$>$I9$(prjErWbqO~D?0 z(^b!{I!%!=q^v!2=gv`-A;Y1oe1J?kgWu<6ptr9Q9+y+1ZuuRNNR;}fM*8~(al2*U zF4nAR2E)ReOmU#67pL2FSPF;3DuY8rfi@8*mZeLWN4m9kL%8QwoK`8o^5{Mn-hdZ- zp+Ku$XHj!2+g^T=y66yd8f)p_w3cRvMkbNqh(Hi)B(6sO77Vp1XDvAlDW)??N;(Xd z^4RTGjBFX7!$TsQC1R6tZh?_fi3LX=L*v;O@aN^Pu{xJ$f5^$i6PED)%1=13XFsPN zx0su*{|2=!H8N*}SKj5PSAG+FJk42`e3ABBzQK>~x`VU7d=-;s%rPsLp<(*Ace4J& z56BJ_0>?ZaNu6VnpA0kHq#)-gx8@ zK0EIiHoW;Zg=kb2MB>k{$;NEc8Op{fYYs)r5@08tQ@Iun$^0mlsByW}Vx2D+ar%68 zM`Nluae55ZB?UYQn!R2I<8k~5O~FCZmY}SO*RxGo*44~8 zO7R_^{PB-ys5Cg6TIxCK=sDP?&m{cha<&}UPhrM*rr!8f)-N8=6^W_@eXq=}mVr4kxaRbXEn}yXh}xi0c|< zuR-6)08_jz5@*luY?y{=3D~JP6nI`Ns+Z`B^f?die>Wkra(v?i(cRGosg$81%`&j}J{XRea zv8bY$w7NW$QVGVoUHFToidAb-b%m8bx!CkotXgH7Bt`D%uuAD-O9E+iLO6OYss6i~ z8KG=D{|nlZd~Kd00j#viIh9SFlmv>JUHbojTD6+aM~CZV6~0$-NjmIWWm-3uRM?Y7 z+)`$^kRdGe0XcJNs#GjWjWUe&JFup*3QQFvb~R}>T*490;V?`Qa6VrmB;lR1KRI+H3ThyqWmxHBB+1uC zt<8-?8Za`|5DUdh@ToM?1k5P25BXy;!GqXjSHXkIHxke!&xPEJ^08HFLNjPp_9^*( zndB&U*9r!gYa%XelGEbS?AWbka@mwxpF|j4l1YzlRn%ceK>&n!FsVclC191}N!_!GfEkTJ_nV&aVHBoFT3 zna3Z+X>oGed1q2Ly^Y?TyXbu8b!^Ez10+di3W@^flY|aQ5?3{bM%JM*te04yNTGS* zvTLtnIB8+)?k^*z$ z`95pyndHEu_xsg*|GD?~8=mu=aLSyST|S@nUh7>>&UWy*_gtkN^TEZ-=;&Uc4aZb2 zp_7=BZBlMJDwrOs)YX2x><=Y%pe8dX0)@t4!Du zi8Q0-0*P2eZD9qFcL#j*I05DdBg8ZSu|d=4HG8!no>Qx7og$W#a~{u~Jg8Bs=$Ay8 zr;C9{TQdD}ExR(O%_=7wQ950dfZwHP zc^Zkj5v7@ukhm`PJoAh;2=+_3UL?w{N}XmT!K}FM5yl^nkvAIzGFf7Mz1+X?QGAi4 ze!UqC5H`YEM9Y2JkPH|xVVP6EsfkZZgDZQ2vRhhO+_}J^4IZR0*N`_6B&%(!mqM-1 zMYW38?3EQzgDEBGO#(NC!qjp@lcBNouEvl zqA9IkMKBHidMX*Y@?&56&c6yC-h27RU)=HCXdo0l|4nbec>b9@Qx^Z&x(1Pn=0PS8 zRG8 zHeXIIaKJo+fZlOwENcMh|S8pVc1y;LLP8uVs5dGyKk9J^*U znf@*cGgH(j#z{%XabkjP_utQXXP(1-pSg*MbORlSTri|zA5JJpzFbitVY@bofI-8t zbhsfKy3m+#-?Z35Oe6i z{*44qJsJt{iY4QeB(N`J&=?-Y+P0skZ@(A&@f{q~NU>>XCy5gd;nG)J#$8|jF6Ev3 z=?TQJ%_>=6lDZT(>Ks#Ih&rbXE@NzXA5~1Ei7d;GIg;b9d>wbc?^>46Iv6w4gd<^U z^^!2O)d^#aCPTQ)ND&wCQxfiFz=!4criLP5O*LHxd=YvLgQz6!J_kHxVlj%s<^68} z45n<}zX$7?%6im0Ap5*U6 z%U-wr^B#Z@0i_l2Q){|Z9GjBeQ2SQ(!x!yg*kH6`F~2j#^pt1gI+)I|zmTUVnq;O{ zr4bHL5BkYl(n0p99ciIyiY~ycDMh9(xg{cIbbVNMgJd|WW*Vx`vrVEA&l*;?CZW-m zYI6OCl|~yCw=n?$A(>2wPR}I~4=Wv3EWCxxEyq))4`Ov3lc2#sh?w6;)U^mG{lvS6 zYBDjG;62luWXds>@=SszNcH!N2P)tH>Q_1Ywa>#%1vHVHu?qM7@Q3U&^UT&7 z48|g=QIVoebTNf$k!CQ8)tO*-wZLej&Rec}4@(vu$@X3QsW~n)v*XO`NpQ%5KEjU6 zjka`w_CBxcLp`^oE>sa5bBaT-Lh2~w=iQ1{zROE!<&Pz~3lFUYJ< zoa6#DdW_q0vdgilVZB0d`&v+icT=hP>9h+LxUNM?sLFHG)}c%LBM%ez(=?1frq$u!T+A- z;a~+e7c6-9@!+Hh(d&DL+l4MfoHh~DUHPN7k zXa)>Q%HvC8#Uku47pMkAA7tRl{w*vSu^kQs2}_u0Ao?uB8wL1n)(k$6YA6(?*4MPv z(+Z6fR*N)=1w2Td+XfF(2TJ`XdICr6f&UZmaFF5HqAi6Ck{J<98{`W`DNZ#zCn5pF zTGq-mr^cD5p3Ze2dOxdk1wukyzZ8Wb)utOkKRSfVXYThR5q~7w?*y*P`>ZU5S)>Bs2^~ zWo-e+vt5_kuX65lwNGMu@*qMLdGmTe^*#DqBcOxbJOwlj>FfrGM8mkYqk@uLGD%N& z4zpUKSj?+cs|=C%kBsTqx2Lm%>8T0qhDAi&E+ovyw5Zl4FF`%C=$|)VL)_Y8@wO1U z{o31Bt#fHxx)HXHl}u%%$ds{EM=rkDYpIj&rCkEo{ZsRY+_csf$5BwIUxU*XG=zs%uA(-7V@MDWsW1jKqif8&mhU{ z9Wkg^z0KMefiVkqx{w>}V$};S!FSk7uKd);srBYCg#uP{h?+j4HJg{e;1U)N^w2Bx zoj*Rv1GnGKvQ!_3o_ZX?>)ru-_rYuvqA8GqY;ufXDg(V;%AaUXjtV1Lib8o?@g@RL}WXIKrq|rz4eOv{)n;OHz^WLge~vlDDBZ z5o4-cB}GJq&9io1JGYh#)qtPglh<(iS!eRokAIS^fK?+ztyE+Y5jvA;mRxWS%p1Uc z;1M3#yOXEFb;3*MlkV>$HPFSr+6+;#Ox-+0e$yTr%>e04j_o^larVV)Ir7Yt_`;`e zBr#nfBY6y!I(?}WZm~!rlw`kMW~SNXkZhN7E2l;588rwt1N1ML$Lf!KkS9L)5&HKP ziCZ@Lpvg?5tp3{)#5LrHkp@(y^BXm=YmQCSC^$KxW zLu3kKHAu!KXQf6w6rn7Qmsm`B+j6Yp$tbg>8p)_oo5Z43fPgn$5O5!yf&?kYdWbL zcwfV0{mvZ<(na&om+K^JM2HEmM+pu903ZNKL_t)oLejMbJP++>!Nd%?nLOQ&%e+8{ z9x2X(P4@UKHkl^9tB>QfOE2elU;hc`yyIP5_ntS=zj!`Zyzg4>{`NOH@84g`_1AoW zoNe&B4}XA1e)tVec-<9z?dt1D#ZtWNz3=ANpZYZCf9gg)_0~7BqPK&KuY41Cefl$8 z_<;}bxwpQBu4IOnf9yv7bnW}u(kyYvNyjigyq~?h_j34=N3na`PWm$43=GcWuKRw^ zQ70VF(>r$Zf|p#*UHATh!&a@LZ_#3gcWh^J;}cXz_K`NiOgCLlc+C~0=PzPrc$kg9 z{uQr3=6Ig?&E4!B9m5J4ltM9rnGCyzcM$7HY4~O>8m1JAFl^STN3%>;EgWCSvjr}f zG^gV9|8cK-l>NvoYub2M0J@ug<_97~WjfaM zf_nAda$RL`=pEFWm^m$aO}nP~d*DI7Cwd#LLxeIYQ#8MrM2Hqvv^rkEax5CBZiMMQ z;&7gs80VpVyV={YFq1K+t2I(qlT|)g-qIq;l3c@(89B{FocZ$y*t6*=4Rzcb@>7f^ z$(uf^j-R|K76+0s5yTEhaMDR8>os;2CzYxv3Exd&p5W8EDl8NuX=z!W&{^017G=IY zd1%+I2b#UDX3~KPgx>=dV%M!^G%bCE>KvpNHfya0xrDrl&cVxS&~fu~G!N1MZuu`A z)I11y5W9aPOepAA6A9Ulgtm0*nl-%l>UVL<>ebxy%b)SL2mh*8tn%E87A<6aVpId- zB%4L3Rl;0Rc97kqP$-a2XLNcfq4C919?KMfA%7=AI+baJBK~U{k&U1K@Q3d|n5FP6 z=rDKU`*s{Ov`9ab|~TQ%J{rqs;F38xOeiLa>0aU>};6? zqaoE7M3PY)2{S4eNgELsBvY(NLLH+dW2O=a(R<2j&N%BVe*E!I zkoC!=$syW=wCj*H;#e_1g9`@fKXaW@u_zQMR7;Rfus1)68~3Y4Ww!+1i9KRxmJR!M zambogJiTKpKfL*N&NzAn`_^w(n@R!PGHDtx5=>fUMx`^GO=7q{h6+VJ#~CSvrfc+e zcCzLxpJns4A0xeWoMbS-4yQ;Z=A-0T?60GteD#ZR^gaR}q&uQh90`=O$cTwRrApL@{+GdnbQ{!#twq1lDXGv2#XX}%U(!a%fx`4) zQ7na^6A*)l|0E<%CmVBVOaHsTgJ@LLh(f`Gt6`mOuD(toT5GWg3J-#Z1~aas6M%q# z2T4I~I@*v}n2h3=$%CfW3U$ewB#1vr)8BG;5{tJvk2ZkN^|dWn_Sz)s1|!X&_7p-y z&{YYTvK^(+)skVxN+ydlDT;YfGNIsfSEWKaC{$NZt0u3*7xcmnCmW{c4klSFqG3&? zDd!7h5-FX+3oW!WnxtAQ5eaF8#hmFETZ}k7u5E zf{tR9lL@h0K}>+4P&iznkwn;QxU4VMIrgISIP{zg`TSeo%VjTlIf33ZBgHYD!hY}8 zA9DE>uct6wWS|)%V+6VNj$3%)<(D%uTGk*hFA=?*ARH{KPdRmJH}U{P5#XaMHT9Jo)Db7|it0)!WbZ&0Cl^Z-I(; zr)OvR+v5*$$yM*thKo>JcVB-4KmW>CR9h05H^^&#{|E0(`vcta@2};It}gEU{&%$# z9_;9%XT?!;%o}8MVjug*M;Xgc6G$f+GaEds(+ROCEKS08+ zQwxU}HyfIhQ)+{UXqNHXEU`#}YQ3zJ@oqnK0`r1V4TzQZEFE-t$aO9XG|xCxLfSkX z&fLdy!GqZ9$_Q2yru9e(ZOPGWBE1d;u!^3oYHJ-Mz@}^%loN3_m5V%4Gii3mNMt*h z7mkzOx{YNagQ#OtuQh29r7HTMWR$L+4t8$cgdOxT6b>;HiZEHSsEhTtx~T=I%e|7y z63k`UGc&`U;xvQH4k41xFfu)<0lS$@M(?TF=^1j_?gNvBw%d~Hhy#+xWRchWT=vU> zDTLIWbHGEpR`qnbLR~k#X`{6NRP!PrLOve^4;njr8c!Jr7Q^`6suMV zq!cQkG|D6rK$_{oLXn3Erem>$+tri%q&brR*oSYv`C!n+|0{TS;>v3-+I;6-KWNsi z@73*E}@)|t1C7+IgWvk0%Q}lIql1{~V z_-}tvJ1eWO3h^c!bNoT4lq16&V&SV zI4!GK_4REPA+0f2o60ozy|l+-s*7-J?V3tT;ez?|=KKb zGNT)hFBZaV)agtn=@MjKD6#&&Kd^26V=P^^h&R3aZLB=`1d@vvLO{(5#U2N9WIJKm zjkXQ* zxU7BoWkl!qvT6O3*!et14$kAx-~9oJN}Y)C_aYI-OI}wn=on;r`WUsVJTpE)MD3WNB3D1SJeF)?~J9)0s;%IwRbDKXD8~37>LOts0c1=wE#jr=58Qw_NuTlCsG8 z1GtXJwjC9rcKKmpM<>BqizALbncBYn%I6(znz|r%1ceq?XQVbuc(9wNXA4wA0rKSn zdv@((Www)<*(v?|nQ%5$-1;n#Hh+VMh4H_J>as{cY-o}P& zucLRgM&6uZEZAfw?4w{gj5Q!HYgEjDhJc5fQXFKV!GqE8Tr1=p zMPngGs||7~N#v~(2}W?J|I3pHDR`yw7l#UMXvk_Lc6(ynAPyYjy3-1zYqGi}GzZ(u=nGNDn zMfss@JNOJAWvfXl1{hnZ=mG`fyO zGL~SbS|%x!BG8byOd?99Tq6-OC^sy!u{Z^_O%$$roSAZkc*IZ}be(9+eIgVH=b-vS zyqZ)4A>Qyp!H|no_E^VOFsHvKdL9XTn+t$N`Y_-7+P8VtYhFj<=;OgPVErz>_lb{j z+56r`bm=@89N>nluA+14LjLV-Z)e}ro4Ng`xAV>~e}kK^dM``oFXp7}Ke~=h0oQQjG)|H*NAR zlw05-5y>)9&l8V`=CFj(M3b94T$mRUtJbDoE5Vk|;a>p{qHmB|Bh-`y+_MQ5@L)-5 zyU)flg`MEX*Kl=To^3b`OFqTIMU001Jms3qhC>{6!bzO8cp1BXavO!Gy~b566rk7$ z;frS=9V3y6vwhP>eBl5)eNBcOm+^*2X%s46(`Qf@bAe2ja91Zovw5bh8lCg!YX;2j z;eF~3n(W9C4~qj;nRKR0YtIAJ`Z>Ts_V2cZ>w)E_)#Ps1t^zI;Cbe=N+Q6dGuoOH< z&8yTfwHIwo9_FM^w`ofv-~S?r$7C%*3zPj5O6d-GsW`d%NZLVA(PH1{axzJ(a|v#PfLSZ-v9pLJ$m^D z{9&zED&@L>hvxiweP0+K+w-AMf8#bW&HTHMe@I*Mz{9V85OUq*d9S~M#D&jiPt!-O zYUBFEH`_~?Zj@@ez_l|N{Ng;&D%#b)RBZbGlgWdirS{2_-)p-zwF~aH*jiETobWjB z`!*sdmxFd7U!nyb+7vYz<-{bcOuDpYT{kM328iY%9+Smc5~78o;3uBWYQpr;$f&wh zh`Wmjrfthq!L(3J!qJ#+gu5lxS321(UTgc}^N{Glpu0Ax((9sS2{w0nlFnr{?e7&Y zdkMe%`EBaq+mudgwWQe+mt3@tnfxTPGt+c-b}GecYHErVhpu4L=ABGUNd82KKs2I` z0?%yQNnIuywrmhW%J%7~N(G_*fTGR?OBZ9i4vPjCkTpb*(;(iRRrijNl=tFYK03}L z_uWfZ@do0qgK5>Yu*eB`Qc99Cp}8nQ9%igMcJMy%FsGSL)`e36)1ftJYl11yN7@HHK3p(f+S(gDx) zMm)k)rA}0nA;lIiO4Sh;d!Hs$R?Rw{=`6LfxPVC^kYKzx>**h&3C3#z9;GS3DNUV~C< zXESUt66F6A;31$E&;fN;QE&GafY7eDCeL~fEX)B9Q+9(HN6wr~9-_K`Byf<7djSu= zT7{?-BqG?9g5)`qhcqEv zq1vg3f|wHSB==lhI`xq72QZpJ%%%Wnzfu=P_+2t<6r84tbLG8shodBo2xhfHE}o!R zoYiT9IQxjmzf!B|dx^&lW-AuSupirWNk(JL)~X65(5}7MxkgOk$2&BnmXi;0t!ny-IDVZ137JHuF+#zT?}=$cp;UoD9Djc=$=AM$ z;+|dXu2eYcl+#$h{%HU( z=l>hd(IOHH1{oUJPqkQK`N^m7$nXEi38$=~R;VcL_qV_P6|cSeos0#b zcj;mt{=juA=8i?ej0Bpz|KW!~=&Yp*w_f*QPVCR|#T!4x%Ck>p+0n66;Kn?o3dv6e)~Mc~d%Z#|j!On!f;_ zCB610PPN3U!FjA(v>ach!13pvO7Drs!2VIJe1$-{!Sn+UV*ln>LKu~K;_~V!-(EKx-Pi{mMzqqQ*;UOo<7}o_uu|=_CNYCjnXXDT9Xn%+)xr@)yFyNWGIcHcqB$7 z8pUcfmC4c0=V~{y=ThY7)~D?nwGAG;^ky&TL5^R$`K`96R-L9clw06IssPcM2yLn5 zXRQUeERXU&TWyeVI)`C|DOajA1$;=LuK*mOo(p{mhczdj#MM{5le5n{li%Ea8^8M1 zUBr_yP0dcU8qfj|Bmho6%Q=$QJTx>+S67$*yHLo}u&TOgiQAIAPrK11mC7^+`+L5* zefPHa-}sFm%OU>f!NZoje)WT(<0j92-M_Ba~+rFBEGplRWQl8p-OyCeTsBE69#J|^-4qdYfjxVMR1}@dq%^hf&}Bm&?%EmF2|akLR)%T|&KDXD*WZz!^iCR5s_U2^Clj82OcUk{VpM<^D`^e&sP-8S1Ukq)@T>t(h){8uhI z`&3?b`3nfe!^Bst;On2ho-JEGr$xzyO+(IwsPuAUc~$tU&Np8 zy^GV&TgP8N^EFO6XC3$5cs-6)r{t7WVA(GsXTge05A}SN zT1SemFMgCeu6;kgons{9Nj5i%jN4wujTGdTFQ!_82!`rL#Cg9V;Gu2ZDV%ZL+=BFk z!-RzsYkA-y5f3t6kyO^Yl8<#mX+y)93L49OV?hR4K2+>32|F8=YWTpj^q!3heVt} z3p@zd{~v*eHkm?zOZ(A=8Lj=;J7<~#-TnzFZ?p&RHMD#oN_LP5YSjEerrbJ~0ftPX zOLgLY@Hf1i1;22qWqK_i0ndI`ObCjOMNvA%t!pOf3+iOdES9~AtSysogKDj=f@(Q7 zb<-s(*)25(!{^5m>S{RBa(3}!gu|50ss`u@y+YuE?sqLg|AFQd;xgzWGKXvvU9)mB z?eRfPw8HY<1w6QZVvb+WhZL~#VT!g}uJMMfb7As6A03Arim`4jcYf>JEIR5~j#zs! zw|wd|yy9iA#3u>N(-Uyi3Wo2vjVGVpz=c;`#mrUj#XmIa+1Tn7$4AK*U@ty)+D$r- zIF2=MxRS5la3imJ`OEm#_r6QCTG4PyCvI^3D_+XyZu&AOrxy?nK((*Q5l0=xqd$ER zf5Ro(AHyGyviht`xcOV(!f}hbE)J%efdiaJ^8r0 z(oKf^TzbO|IGs5vGgI7g)93lvr7z(2>u+SJFhNx2*?xnnoEv|Gl2gMDLe&T&us}Zc zH(Y809GeF5jO@QP9IHxKI>GexG=W%-NHW7jeg?Z&9Qi<-e3o)?ROvZ3g&4x-ZJw3C_FH6TUxzF-Ih*0 zA z$G!W8*|%?>c9FxOAj_64Rxez+xWu1dtXlW&A7jgootoMw6o;TxlCr5-rV1~;q*bA1 z*$4h#J6_`4qe+C~jv=pCMtMG#EnPw>Kf}jA@d?dH_|xz2;+T_GvFYIl_~Y+?%M*`1 z#JaWT^1>Hfie**Q!gcWQl~A+!>wS+iTQn&*9O9WA-@N%2Dexj)eKEFlQXcCy3>abmw}N2b>Pasqfv-J-7aZm!7|lg-e&P=`VjGUz}yesdLJ@^T;e& z%C8^zGmjT1i6+w6yQauW>UN~g;qwPL{ftYv>*{OSGd9c>Z+|P1Q%{8LJGkq*>pAzh zli9TXDV{D4;g2Oqr87*A4%1HpA+*TVCfTgBJ}`T;y#2GE+5 z*?^y~eCc`=1F!}F03ZNKL_t&*5~4SeBpwg2dwh~?cZ&TJMHUAA>SVE}Ue{tlrWD@HI@T4M#0q;|V{LGM&k!DdtNG9_*$?!*MhaX}nZYpw*v9&?uK#l#G#e zTw-=Z-BW}Tr961C*7F5%)Kk9|WY~0deKN(WvqeRb^Ph=^Rj}%H(Is@t3j}M^V_eZ{ zw5(cH`z7Eb9A+fcWTb2n)(gd(j;8UelbN_JHH0o8P4NH0R;_bsOBxo{N|lwY0(pq} zt{gWZdrOJp21WenLnjZe2MB{94?M(hh)NoHJWjAy(eo(9j#^sj!wYT`kRpymUZO+G zh3SCV?LkO!fL_-6ZFv^iuN92wJ|T@JF&s!zYBt%^$Wy?j8uI9f!YlTfE(vkhvqi2d zMR@>UIIP+?S;GZPxbe77AWALM1aXau1w*=4xK`aWT4*>*LzP?y4Y&*HP*$}EZbLrH ze&`h0dIp%e5R)?4AiLzQ~cC9!9ch4}pckN(&VvJ)~AIIL& zA(kJ#5@sgZ_5EAusnvDOaO=XEhlUYgJQ!qa)nxJMXR~7M#oTr0uUK{LG2Hr%uQN{? zcC%xgxaKrEPd%CM{@_QXrcCU5nG?@HiRCA+<_918BH3t~sqzRHzUYPIjyi>}ed3e& zV-}4{iPydG64!&E@l^| z!-QGIpNcX(F-){8$yB34Ddc0+X|lasq#RD_#8@U)UA=wGj*lvhcI{cGsgu?BZ@+_7 zUqAV3nPPs1f4ls0owh!4-#sj|VO60)Pt7D?*hrn{mo9h3*2#BwBtlN~IFj3BgqWhrvLAm}W3|`Y!qJ|HZ2H0EpH6mKJqa3ftCw zDtDH+ElJLUT7xc{|T(78Y@{$#Y z5=?aS*tYHLof)UUzn6(E+qLPp$+p;sH+k@9)07I5_Y)+XOi{62DgnO=+V@RQdH~4R zvXUjF?^CiKf`O3InZ&kU?lYy(H~l*4*G_%Y*2%t17KFW_u>wK|SDH^qKZ_{3Eh_i! zO>yNED{dFpmaw>*x5#TvEZj%gUF7eyCe`irNsK#mT?!CRXNW`+RH`*)j9681oU!nS z4C3(!P21wcRjYX4)$it%RmXAHoxkLFzq?0uvjQMGvT1sHdU0Hvy?gg^*kOn1$Bvyl z*|TS_HYsHKkk8NJ*d~S%(ppyN@w2l95wb6RSHgZB62`*V|-+ms;rx%PNSY)IP_r#8hvg3x5lqx+WKP|zTm2ci{_ zpOH?`@G98`7qDiG^op|zUo>;$;VyQwRmtxn@UVWeOcvOqkwBKdG zb$RmkpYi_7Ud(AnF6V=9yHYvKX-U17dZ>)%479tn!skr|L#i_fSPrRhlF?F$nM|Bh z-}f$l^w6I;=@l=dmd)|;kA8;g)-kSn(-o|_;CPD9Y`}bC3q$w+4QKxdA@%E*g2E+e ziKCWOZZS%!3>*AScIPWZtSC7nPG{IpA}QfB79?XD2sKokX7%~!uzzenyPw#=)vvjN z+P0l+edr-(C*)peYH=dOnp7-I!)_3=TvFmhQ!I{0gwl}7FqF@em4(i#s~2-3 z5}{D3lZ!{0QNgria73^}P3YXHKZ$<3sRV| z=}tzem1_E)>f$ugu<44Yn5q=D@b6A1XjIG0OGN2+{Y0yEosy_<*&oyopI>bK{P+w% zrD}y}B1xsuU{ATIT90fd!#?4QMiWH*&=Cj{sMatg?X{H=(5P7&3MxyNM2X1SFNJ3# z8e!7ss<=BK!9*I^Ws|~BPdGwYoWYc9+(Ie;LvtS5JBp_V@yc~6D5MD~z)ViC)DTkS z$!F>G*Fpy4mdUtlV@c43h%&{|PADBtlNIq8foip7OXxumg$}L<9!y0eO{FvmxDX-q zvn8G0t7?ObXYYF66zSkYIRE0v6rk#dS;u15X(~{aKkGMwDme7}1Jq@V+d5zJ6j4L? zvVN-4y%pCTv(jo}c-MGWI7B>bXgArAf2{*7NI40p99i8 zZEcovjX93wJ_Nn%rWL#@dIl+CTt`Y%Z#pI#44FhEV_|}ld|kH`JVabs89ard+NT7) zP`^f9a#o<2j1pb892P7gv*-{uJiQB_6JmaMzluFA(H%LaHoJ^?2yp=HuxnHw_#^Jl zZN!B_=}6+XOdkS_`vPpPTXYp^P+LladZ5Mwm#+Kp)$y_I|dgt3o3@qS}kFTdH z=cr+^EFPxE=c6keVW?7JbJ!rhWD!q2`50>!Ea6Do#}_{IVa91v7g}XcCnubCB7gex zebnr#C+5u;Xhg%zI6mxXijw2QABt*Ckqigbs{7p2R&(reM|1N}Z{@M4HqhHYNF)?t z*^;FkcGwE;_~q>k1jC$>9Uxk+5lP2&0wn={0a0+;e%u|~>E84xD};U>2r+Bb8I{~E zzvL`IS3J#ZrAQZoAhiXovO6 zB*weZ3`v%^8dNm5Bt%0(e`W6shuB#vv&D9p@dwHEcCsLwh8=rZbLgQgxp*Cor`Gex zlTWd7)hh1%^B-BTa4}n-*r-j2-DX865AqQY7$kxbT+`O$Y)3t(th`V1HfFt>ObCcA zCpdlm0qN$4ywqvw`l)7C@>YTxeAxy8k!YMsxu6ZgNF=OU1XpQCVy58J-<3L8O%>)e z#pTu&r#>;fkz5DI5iODkG_+9ks7eY3TUtK>9XfdkV5HIn0}-mFBEhJ%BfzfLwE-ct z`)oSNs-utNZCAdDwd>C1$KU=s+r_}ARMIRAVKzt|D?nm+c$mS#0j;C=4iD-7OAQ&4 ztP7viyOP=Bfd&B;(MVi?N3$cF0Ion$zy0>kZCkIq{#!r%*TBQ3U;p-p)a}&sUj0gX z&VN4pf+5Chb(%8bX{A>hrs8^CnWs zxS}?BKB1Y6j*c=tHO=6>K}BftJAHk9jE#-y^T^laBovBeie(X^dYi$)iO9j5u1&#` z*Vk6#9}rEu4t~SW(xpr3>geE_Yp!Byd`vfjTr#4Izu3uY&O|UoP>+=tMkjd?a^p+! z8IGms>K@>b<%jd|V^86iPKVtj7&g?tD-`jvBZODi+c%FyBE`PF`|0fN;)%^q(cRmP z({OauHQ3)rWo#IG*DkteXXzT5;KcrJrgm?lQOuKxz@k)&T+PK-sS^rIGO$S~7Nsuk zAR6)|(Q#3ARTxRcSpI=`^Ywdw!MSgHD~nD#jdNC?Lv7a#U%&Bs4!hta{`RFCSe+eY z?Eb$n_0Yp~S#^?@=r16Y^y`?PM2_Fh%-}nD6^C8$LNf6Ic5c|jllT6HE57zcFe_kH z`Sd&9#ig&foCU`p!SLu_?!M(GT)OHc`j1)7Bk#QiyI#e$N@No$M#@FiJt(KTTqQe?AEYM4J;F$qb#AxctZbOl_^6q!$>Kw zKsFqYFrAO|YWD4K%LC(M6BJQ~H zn{??oyh^=LU}2<-YPn9uA7mJd4R(r*lV?Cq#@-Fte1c>mu@>(k!bq*mzGjtj z)KBN41v2|meXS31TM_+( zoMRFALRdn0C5zD)zzl^MZCH%CHua#_@e=SH^?Bgo@TfO=P*A2tjRzj&`2{@G#3Pg@ zQTrfx_-BisXTb-d+o}&gRGKccc2fbl0A0}y$or@^M67S9>yT{r!iTr&Cb3vlL=w!_ zN~AMc#_}`zyE3(uYp6dG6nhBIVaFFxI+3~#3J_5DH3QqUJi24URp-B|1XqO(wFPh6 z1lx`m5LGoTU2jA~Avq6nFMBv3NRh@uIa)hf4s`g$(^_zg@>kJGiR4+>NK?9*T6MQ?p4)tNDE zis3}L{XOp^v8e**v`-4>dO@8~g zhdBPc=aXHwR0ZwBzrT-t4?e)WWQJXZJkR^UHPkan>iIld?*9ufSaCQve)5yN@EvdC z_zN#!e_@7XcTNS)U--gJ3=Qw&jC0Q6_Fvz_(|d-=H++;DVh`^p5{nWJG>Q0|BtoKn zi7+%Vt^l^Xt4DLBq`r`8iRrVs?A+&b#cAget($bMSPtD?5EK4-(DUy8>jT{Lq6;}z z@S1kbjo zfYKCheXR}BMZhc*Vps05V1UU=8QJkt9XSnod)jUi8t7x*f__dqY$Xrhax4BqNo`px z)gt-nS+WEDtRLFR!lldE`1nQw!6f5YY_d&u%DxbalCT3>)Jx^zM8wT0f|ZD{Vb3ma z3DL=jkN^cV$l4!|SrYNMHiTzpCYe8ffo4((O>XOs z?W*;VbZJ?Oq^T~95;;hs1(v3FB9V0adb_{8Yww5wH>4; zh)pRlw>1N8P;o%SC{zd2Lw#-Vpxv&P07yZL-O%3`ajpbov@K%=p^5vF zI2?&!SVYJIhNLhTA6&6TO{Y>Edg!5w%tY592UlLZfQVhYb}3g?l>VMQ?6ZSJ+OI)F zg6j1H9>8W%W6W-!;Lv#sSiGcGv!R z?I+lI?;km5;d1`=+g~zZq{zi$xRyz=n#T%?ZXtwpk&_x_)+8D*vJ;}rx+;|wL>6NB{`qc zajc41E*d6ZGqqrs>rD!pyiAdV4v|b?tX#->=dR<<&wP`439)#bqF%0&Lre@DB#tfK zw-kFpA67?}sZtp`5G0k!st9!V?meWVaR$;^U4+b_g;guFFqOsJzn`st{tLaXpM?Q~ zkaQZu0b)t92ChTCNxy{P`F%K2@JIuoDaT5ZU2Pia7#j-S#6nmRG9I5F&FcL%=~NlT z)iJXa_yP=Nt&|Q+-EC3}IK(3%A_BlHhk3wKp*IBrlpRTGZ4k;N**{&PJDZ>~<5>?j zjUZ*q)=8bDcFX29KN%rhsIlLj0l}_E!2wYKsK05!^DhQVP7p~>L9nlgS=0fJpBLQ;kn?!&@ik2 z7VsdtIqCNOlbzGKJE79gq@yp5F27Hcd5gBC0)I_ESBu~(_g0B0oh~EVs=nqYZ~nnUXZ2FCN9J)U0!1|B@s(dE|oDNL5!FH z7lr@CB2hYvC7vG*a9E+tqUkzO+o2kVe8^?AVKZz)=c=PP_r)*cbD#P=@3{U(zW31& z>w5Kuk6z0IKfRqb7rux)|8O6bke?Tw|9tNM#@9LL#g}pCFMdVH2($JjFXksVeukG^ z{b7D``>iCSF6Xa3k6Um28kfK7HQfH|JJc5U^wZXH*G)HZ{(D~!xdi@HhV2hN#FE8} z@pt4D;g1)l8JeDA)eBw-&+K92V~_IZ9UFPeO`pKcJcxktl{#lH@}%9lPP}k{abkL)z@(N8{P=vn8&ZPOuqN=kMi?dZ{^5ij%DA-1p7v3 z*q5(Rw4~uA86JK$VHoJ|q@16mQY}$$Kqiq@>hnNvpEk*-W=E;}>OB91RjgaERD<14 zJNFC%N34`h0pz+H8e#N~U$gawFL9U=La2g8+h$T|mtj8>rb{l7qEId!01rODO|0oC zcvv2cXx@*~4gbaarwty|rn#lb@#Opm9Qg4C419qgWz$6L0%Xe7yKn)WXP*r#RzRhW zBMm&CL$I@pky~zM$D@x>tCg`DbqxZQJ+K@JFmKT^o_X?V0^uZi!_S7&EL&7C9aiul z1_FLx1UnkR?nn~o>EMq~Jm&2*3La!q=hdI`zNOPIbnZ5br41hB`wgpsB}{@=Xq?o4 z;=U&u25H1 z_x1Iv(N0yuXafPZ?c7c{5>X%_)*wQel=@cOo}@M|mCEw-jcg|S$?=itn?C)GZ~XIa zOCEUm&5r|(W=euwvge+~7Sm#+Tv1ma9}OMD$q5ngpw3FIse%^mu9xi~H>4a?DW&msa^L^^PJO4(>})UD^aK(DNl0iRw9o?51-l*Znw%!L}nl_rW_nntg&d(BK>|D+O-k8$%YIK4KXn_B?)dvz=J%e*}z6O zW^O6k$}4-J2cWPnniM5BEeCF|N1OlRZK87%#9PPfc4|bc?fJd_BLEofP~&#@q&h)vGWD=dgDwMIhA0(*C6!+%u$G+&QrrJ2r2@Os0vIv&0RF zNQCLs1nof|*=m)sa-F>~KSOJl@s3-53ZX8Zx$jXvf9C&+p{G)C`&%?eXY#{qW?3vLrphD5>N$?uZMYqsCl+h?55AbJvf5 z!U~DH8=ausDA6VKgUcdcs^f3KQlE+GaA|9|L~l;zMN-tj^81*vDjY1;73lPbJOpY^ z7PWP2v-hZ^gi+Gr%v{(%j!o+8Ah#XKR?IK<`2pA1b+DJAUq{Qs%6Hw@; zT&_}-%~30cxB0iw*+rM35xiY46OW{^)vIa@Zhm( zL|e>5qpIGk|3Ao<{@u(&MI>W?j(HH7PW9i%JjgIFQ*euU_&dRan!1~YMJaqMzVUofc6($e!Hsa^R-L$8N}J-s9* zC&)^xtti?@_TC#-}*;9qK=Fe^O`^Xj~P0VIB!m)KXE zfskip27Ki6MGXL%N@i&{4XUMvo;&TPN3UJpx}immvYizNhdOuMV)iviM*NI-wqu@j zJYU>=7fUv5pl8W)4oxN0v@MS#`tGVFo<2#0Yr_=D*}i=wes&Wt>ltL>WPy4zLA^~1 z(i)5w3yeu1$ch!5^AA^Z!?mB_%FC`)*~P)3y{x+!4G+M=T25#`3lxa64X-L{(1UuXHx)tl_hUq-_Zn=voM};f? z@hvMhg?oL9Mf131{vzsQV>Fz?c4pOgRV!ApDi-BEBb;J5 znCJ0RtyM^tD@=%NQlf+_4Pqj>DHid&0%R?bSk@5nQ>U=I{{i4Zm$^;ZjY`DjJ|GdT zNBUjR=u|cROA32BwdUE6KLwA_>&PP|gA zs>_0gdgVlhB(thUa_bYfSqNFIO4xxzz?vaOWjoGW=GI!Zsz5^KGFiIHMMR*Bs&6V) z8$8GhBhn~E1hPuE{Z4YutGvBwm~Mdwo9nh?I!x_g@Q}~uwdz0uV#G5c5zZx90y|*c zi6?U1$F61FNvoB47#$u_W@O&nx%zr%rTAFBM`WO~BrJ*K(8=WVq|UR`a<0nn?{bq$ z&EWO;^!F(V%hl15^}0PD%#BQb?{DgPI07DOjqrJ||5Nbb4oF2-g-j-^deGS>X{BnU z1g&lZiX##oIe7#;G~M}Hl2*1aN|JWe8oXO5@CcJIs}6iNcxe3`JusVoixzljZI*10 zg#CZ=^)kH6pe|a`Idl58)mb)A@?!e^ew8cj zIcE7W%1-RqxeK2^^gqa!j?hw?z~j=bzZ`U}R3`bE3Jk>5Q?p+qc`d}9FV9yZV&!}M z!GL~`&}gE|E|sg8L3!;B^-5?$jIcRUj#8|X%a;iTA{rqoKdUMOiVJe-q#Ad$MeS>{0=;_4FBsqBB1FVfjX}2s6?A}RlyiMgAW(8KX z4^SGLB<8Z{2>7UGl5_;Tvb>WN|6w0 zpj?Xtd<0E8S1sepi!bBG5B>{QHH9PSCKUEFGnU4UhduJDhdSs#`wVV*;C_ryjAW&* z3{D^#B^ZfPEtj?bLgW;NQN~p(Qkt6JHDWOT^(N*?KZTfDni}f3+lf!&Af0Y{%rJFn z=FX)wC%@$MFlAN9$iPs+20c8FacebxO9c)AcfGkDHA65!7$w zCsit_WMsa}&4O45Z3VFMIdT+Kem7Fe(;E#^P34psO1T^4i*@D%LZpR3Q@My&-?u^2 zMW5kO!?axR1;Aw_(Zy@1JS9`HB_<*X5k2m7AlbnfBqsDUwR207n}{bEam$j;J3fOo%!p} zVD-yhK|Vdh&%gUk*!di%opTn0FTaf8JwqJ$!7Yp)80DxpzK)d}H}Kp;cQf?lQyhAH z2Pd6;3dg+h3KGw5W9s%t*|U8+XT9!9?%(zVOP4Qaj%@1t``P@>Z?bIeLV8xOWyihu zvh0L4vdPh&rpI^f;(|B4k(?8P{d3v>nJ@6@&u&qJbha(XJGMREWFBgK`N~&u^^)WG z)z`m=zq^lY)gqTE;BYy}6w*{(H8Qm#MW34k**rO)j{|uraP#4fw^LEQdxc^)#Xwh_ zww_LgW)cb@a?>+Zb0v;nyqLvSrxKuc;DFAXqN))lVr=w~DpV4Q1hH_GuC6XB zl^Pzed&=ct7teb%eP6E3&0cHyP!6_?&-u9r1I|QrVI)4-QjgOBLOy z3wThoaMQD(XjGVnW^r7LAvjVB*Od1t^H8@93o&QP=UUa{@&XGekcd1sL0K3{>u3TerMYB~Y96SP@Dhu+>2n!7G(te= z=Tu7N5VE0?@09~dZ%p+DX27rM01~;XKc_D2Lz+Uqip%ZO8(k)oqgJ&~z*0qIU(&rO z<%XiYGg!9dXhug5bKZFyx$4T7*#Jv4zr`HydiOhMl(R(21tzvWMPw$8uU4il9%lbc zhOStEda=g5U>EHkAAYOKf_OWge1_8SLFTwTxGHJ7#lTdr;PiP&h=eB;WJfZCYoMQV zzxy4mojY)Jbn^K953%OrOW?_;;q0^Fhu>rW=FOy^-^D;MtWu~#t*Qn!N$zQT)hk){ zs+W^B{9JJHOEGb9-SyY8{@k3mPWN!3R2=`;IR2IszV1#xsQ;GOm8$m_~?aPb^Xdl}!qmy3=&7UQvP)OYM;all8H z&qFFb$^3yn+T31piIg^$i(D^LEs@ZmRT;*eOq9iF4t-98u+ytXcS(WDIW5YDrF!*% z*Q8z2nH&a%Oo8!ShQo%%WTT4TZK`H>!HFvgcgA_(?t2+9BXp$e1j`lKM-h&PIWRM# zpstWF;uB!*bx%3g zh)VNlx?H9v3`*8+1n>5TC_5U=sm?%jfY6OIHzvxE;SGHzi5r z`g7nxJP%@+mZ)F}a?r)HUYc8pLPxI4|7rf?-_1PyyTOAWmn=s9oaf=i%tO;K{kO_4 zWO1Youc8W&k|*`zxb4LN4vo9al&j20`?b?ex-MtDfcT&u6JnaSD$@EIVIrR*DvKlo zX7X7&LJ{@Rxx@%5at*7h=ZYMk65;Ch2k;pUeEAY#my=w{ZlO*UM0#Y)l0;@Cmu6u$ zf~JpjsYtXbU6Sifu~NqAGI0n1FJy^md197u&?J*99f^3BgDHfASX*4Bi-}B*Y)M)! zytMn4ndT+Jf_)T2>;^y}a07V-r*y3~Ek@v5qJx`T1nc6M@kPZz#Dduh*P z6u?i-h}fq_drvpp50BAz>`G34&FlH`$3M%fKl~wn{OzxhotdO9BgLmNYTZ3t^1~lM zqelAozh=`7H{gi|xct5?+O5DBzs0X^{RQKLeZ2LTw?Zw;GoSt}&;I@%0^tys-T8BE zS}uJ1Rvz7a56>k=HLJE>ZLo03LK=Qy_Otk_4x(m=o%{AO_vocOGcv?6r=CKl++gKt zXHbvEpj_nfTW%)1XBS4kKp_@n^}FBBfl?laBpE&R4DVdIp5J`^J4`hok*{D%8*(r} zHlJduFhkw}m4J(V*&5MB10>xh&reKKm#`Lxgq}!5Z<>u~pTW5oY~(Xv`x+C|3F`S0 zUd!NuGtT7XHLJPh#vfAJw~y6T51nNTt6rd7w&?Miy1en?q794r4(QPs`I;`81Uy(x z&qGHz%8Ym(TmkZ;w|CUEEY+4R`4l|J2L5k7e_G%{XTDa;yp*VER!nOlY*1?Y%q02J zl37OD(A{nh=5uVX)^JCnq_QbO7A*4yX~RLfoYCG8VFkn^A(B|PNa&{Wlo}2W)U%Ac z-0XI_DY#s?ayE>SW4bEAGM!O;1Kr&9*dsKWDM@lH%b+iefR-fcQij1v8A-a* zo(K6l`40zXq)nq*vzeU!zd{Rm9?=iG@pDvvHd;5q) zBf1oq=MfBr)c+s`_D3Fh1edhh%dBj`&Ye3I5Xs!@_nOTmx5eB!b4GAD-tmD?e(ttr z=;WWhAN^JE&?wcyXGz-9#&bC6bgAJ}wjGiKuhrXX9JkAql{MN=2#ZPAhFA z2(eHo>T{PZydX~9_;@`^aUC8ztfta=bLUaF>Wb9FRGm&`HI+y6jsJq@q2HQ%SL`xA@iNF`%FRiTy<}lJoIX5e zK=Y2}qF)iT?sZ{Vc1^j^WVYMiK`auZVL3T}~&M7%16 zjD&C!^|v!x$UtW&nVv3=e*e3)Ii?;mx#gytdBqi%(?}-SdhdO#y6iGGefYy-RRf9MLk>4fmFbQKuH-Mo$eQ6 zI9>Gy5sze5fPe>)Gl&$%zxcK}Fxb@>Vs1bMy+gLs~ z7{?KaGE}t~^O@uZ`(U7tlEcUE@4lD3MiGN6C>zMC9pC74QgakA8YSj-MtJFpRfHbh zj=6g;a~%eqUZHTy#DYFT4iD*6nz39_Jt(3BPSh=S&*L?8(j2}G6-M9RP{A0Umj2>1? z=p08I(^i^bIH)&8(TR)POr%2{ffy6{q}|&QGl%uxt0|LBD@)N8Fe&BjRITOR?bNebycKCk7AaOk zDRRs7DzG|KdVzTm=1Q1{7I+XNozTzr4eY-%c=%tCExp(<{dY4DQjVl*0^6*pvAs?$ z)09X_0TIGL$hkgImf9^tJr)J4j@Rea&L7caCrU-y{6Vr}Jd}k%Fw9g|!X<(vOF2D` zwAH$0s27Kq=^<)*iIi)&gr)HMDU|XG5{jiFrrT@Fe#MOMa#5<4mF1LciTo{IIk&^9 zY@?VVWoeWxXYn=xuE%YsHc1bSEN|p`7V(?7gFyu$a=c4iajIMB5{WuGWp7~O_m6{Pj7+;O%W2=xYMJDQAwoQGK+ISa%->b|0kX^f2vgu)R`XyA0N5fPmbTsv-??WBE*+ zeH{b`dim{^JDY~-=KQPks?khV)vO;75FuYDH2_V( z$ECwO1NdgAWVZ4$VnokQVq?hRzn!~CU#Nq(DFRAsXsN>lr8CN zDt=P&cS)E`D8%}8r|^*vU8BsyPjCE@f`?Q(%|M@khbU!P0_1W!qbtaB7#i{;Y>9vj zx!j55UH*tXU;fC~cXjn}?26_4^2Ne?vvt?+{zm5Ey&HGkamP(ou^K+}Rj<^vr7_c| zhH1IU)@w!G(pM#^!FZu0tz}3S@X*?_x4?r)b7Ui{v{qAFCY0}NX2I6^ztG0q8oK5C z*Ns+5$H6cgtKOk1HUi_5UJ?kk3m5r^I=6 zceb;3%^Ier#x=P??r1a9(?p{-8zRV2r5B~5wib)&C6_A@@<;LdLX1x)*u8s*?K^hk z4~NxgQz{qn1qD&&HCoSp4JxYB4frE=?zyCi)eAL!&S@ z%FNyO=m8)0L@E1xs;?b9`!sHS<}uc8Jd4iuD89BBPu=!=R-Jx^%9j54lOM5n+Xy}F zrlukcPZjXVb}t^`=FBwv9WH{g0UVZ-Hm{G2P`;%y-Q7K;W)hTTv+Ht@NQ~3Ha6pZ_ zj_3Ds-8h!(O0=TP@pXuJ z>?)|g1RexL=$5a^JV-u#P?DEw;@K!40S_Tb36iZ3H3bhcz*H(#+#)A%*%wgw`v7bUX!Upgl;&NUj zb7j&EJ5@+xSTly5D?Z0z5X6OPI4RY|)McvCSr`SWq83?*oXfIHjXF&_ojy&j$T%H5 zH#No>6>6a%+p;;%yyATR;TvCvT!r%Q?%=84Z)V$F_Yx4lQ7uDPB+hht2ES}g@KC80 zi3Q?}=BHHy-W>_h$mSUgc$w31;nIs`L**0#ctozGdHlgJDTjlZYDsVSGwC$rjRw6Q zAA#;p_6;A@*S%Bn!-J+8M^%#Lb*r>cJVuK`J_QdU%c(LjInNb5G%Q9X%|vw04a1K5 z74RUGvKZ!S<^KmB{y$Dz((POmy0xSO!py40(Qr@`nL{u{vM4-)0E4*GE*iyAR0}JP| z=CpM>RPQ=4%&#|XX4U!UGh|pio5^tdwjERgA)KB7`E(9T%-_+Nma9692Jvu|f-v1P zX$ION95dL-C*S^N9{TPNN$%XiJ3sJl{q0gab`V{*j5{`MV#B#F;fG)OHfAWmD?agI zSiOo}Z+Qn#-Tx5%M<30CV~?ZaHkh~Wcy9XOyIDMc0euTs;PINY9lMwtKl51@9=(=W zPY;nUldg_-Zu|7tSiWK<&V~JYKWv+G6nB5_Ul=WU&1zVqdf^a0x-H$%b)?GskCv#L?ex|YoWr$oZ zi=OTdGRXhz(*duaxJwifRb}{Owd3e)!`I);$j@v=wW@(zfQZmUc5JJpE$Oop<{{jM%k3eTwk1j$dnjd)ZkHxIiXY_U6V~#+ z_q>bsr=P;TcWmO|{voz)+eV?eD3|;gd5#(tKQXSqQ?xCn^Y?+_VeP5u=;+ird}?Y+ z7Y$36EM>)t6><;To=DAHS3Gcd)8FKIc=RprJ9pn7|M;_dp&CBz6)$7p%FEbWuIS*9 z6?(sFry$iW8IWx^d8_%d1rl0YcfFxD(OWCJRKHeCr_JwcF%~U=&|(}~-`fHWt*>i2 z|zrI#S8(uh;52>`Ow9Z1LrD zv*k#w$MpI9f08!!Vjv_Jgcd8(LZ}*>DpDA?n{u;Lz5Dj6bZY3}FtxgyRJx#%n zNoSI+sMq7CD2=`O3V}cnpVvb=Iju!TRoRkN3%JX9Uc2#p8dH-@KJyGqmn>k}X=_8$kT=F82T8 zw}f*I!mbe0wGtJVj~UZRs#YT4m)l` zD~CNk+9HFRG%{036N!iLH9SmBO%QMIBArg+whYpRBxSSCG2LA_p5D&;uY5I&j$cAY zJjC-4J9vd zc09WsL~1C}hoY4chq$y?8a}X0`UeJ8q7;{*e|nOo0T0HZA&%?mqaz;R+3h#d* z35P+VTG6eUU4&(lHw@NaypauGz5x>BG!7nQWakd{J^DD0|KfMd3$>BUCg^nf)ju&_ zOweVJuZ&f0NvpP%_tQv=facIiGegh5{hck7|Q~fQOjn)I=Le+o-!-Yq9@)fBiMtlKg^lxV55MOD+%N?L1sG001BWNklX;JMD*A94R9z0+==eX2YW)vj9*&gBwc<~jsVthtB8~Fe1SwJr z7ny2Bfu@|ZN(_nzqTZm|uy9MzhQzQ6tKgL4Q(>|F8fETnvRR2rP9ukHR#P0vb-PX7 zYvS_?qg7D&9=?ZNCHAQ|*ARIc*Ko*|;WgB;pF!pUn+A~Q9^*vK$dtEL0e zsq0Q<^w0?VcI+Y^3vtvj3%O#|@l@`(pT>a$oOR|J(y3_{&6~rneft=iPH_1@zK?Ie z=R>^oqRWXcS;){M4>E7{DsKDMx9D53j1{MxjAgp1B(fSA{dJY z_|bKyMstDM*E!Q-2Tab#=UF~t2dm&!RPle zv~M4$o^~1!J@$wSS~gyC5#PJ%CeAr)1Ia^^I>0_WypQwV@EWS|xH7p9-|$sN9(a(D z>82P9apjl)g;FFyuw3JhKll-=gJHh^<$q)Tach~sY83;=EGN>@PClDv^PRU-DCRUK zeb4A&c8-iQS!!^&Qo;rY_+zTG_Zz{4s-l52>} z9^p`kSWFs|Y(_ysfaG^jyFk6Bem?Qk3hN;0p%M}!A9FgLje-8YhbLwx|1CY4y5stP z{nx}_x-0!pWJ~Ye`1~L5ys1_whc~?D)%0F*3ENX?1rIfeYOLGU+fuevDpjbIY}ro> z9LNI-@{uP!TaGk)0GBsNhIYBJ&jt@I`e?RKp!H_9{0%Jww6?m=0w!{yo$WtR)TeK1 z^I(>PLIypDO|j|0(`YCwA*f7Vcp3QRaf-!)?aUX4y+k=S52_ZUA~y)rYe#*}evH`? zE*&VF9*0(mNGq92UY}gCz=XITIRE(7Fg`&bmF8Xl`Z=n@&*NUTf=9M& zX44&;dHd_$O4q=A(Rt`*nTHy?Z-bCzJTB2$tWZ z5H~1O(M*0REUYvvEnf>8PPXlQhDz9AWls;TXSOmQKkLsujs3f}Q#m-otJj~3R`T@pvK4HDCN9(e6HW?%u0iBDrFb zl*Hgt*QA)vct6kW9Alts0Cy?FW#^p1OV3=#frswn&hLJM_rB^?9CgZSm>!4a$FTi| zuk!T0_v+1}hLxV1>+#c7G8lX68GiY*n~A&qN)P9) z5{u&l?4230rACpcofwwRFxTNCr02dxx?b1!!xQl0aR*3O%8V59gkw==k|`bR;=X{U zQcc&&gd8TFo$X}OX~v3K-DdWMqnczPB90CR3K+WF2C;^dh}hM!Gnkq?as0Pyud+koPVX~;co*EC6#~tRq*h4dLHZn+-4tI!?-q3>;H*F z$p#R0kugb!f>l=rLL?{xHdT%%GQ~iU$$XB0O9u7^X{%0GFs#h5>GP8+X7G4}YQRp{ zq<*oX2GW?@z!c-FEUyg%ziHwWFeRWt^YLY{vC9pcd&xfm4+>x!0^qBdE|Yw%q|Zq< zsOeG}k6d?THj!vXiBi8nLo8dk zlu|a!`1k}hN1bFY&GBoGXJllI$7NngB+@tI3{4? zbbE>R_i_H~-^$NF`2`mC&tYW$eynQznZvI1dt z3$qYzXCx;JGY>(DdX~20y4)}7WD6OBk+_z<){A8Y1q*xoSTt{dT|1s+NhreNbeZ;Y zS(nekv`YN0EP?zEFTLX3Oect{Z^t52uQDo2Kqt%yQ*H*xl=2E5Qcdt+lu8VE4dz+@ zf#9LVJTy-vZFFv)MY2(so)Q^;C2XJ|vzTnq4MQWFpO&&mF>~mcwd6nqdY=FbeLYS6fE`_3IV%}gck`P7%b^f&Z8T>ajQcHjBOpH}n5z{WSekLC&?QtGAEBmD#;s^n|iSpjrC&i zAkS9{P-Z_~3#7FEme;8DxUJ-=mbqIGDFfE7T}^jqCs$p0i4Kt8`_9){yYg5bd+dIm z-?^R1@k5+(`l*~CDG^v~-~KEcF1s9~TI1f$_aT6KCYi_U3-hbr-hn$1V&B0LZ8Vmx znB34L@=FHZa=9)HD~3xN2IZuY%wi|mY+B{4J$)Tmr5vmJd&unC%?VxIy#7NU;M*T~ z52;*+w%%U$KevYtR~UD(MkwTEUPmXH;RB59+{T5cuOs9!$fhSCo57baQa+TTLt1zR zp;ts>DVs72hu6f_FjTYd#DhnB4d8Goqnq}!(@VzhBW1~zGlp~F(R^?B4u&fb_jKsZ z@Q^!Ap;2HU+KE-FsE$1n2w_%g>^r!JqPxOepPzY$rs+X8%mwXGINBFwK#sdyf+f-i z;0sdD6(~!syvISNVX5|A1_)&p>J|~N6v{bffd|_#EvYD8NnFqe+KA~o`|Sq#PSAAb~Q zo_7x4{pjb28ZNpzV=5bzHmg08Gqjy>0-hB|@j!BtOyL8a;3&(M9ZfQmWOVW{ zHIb2-CVjnwJn;Clw0HE<8w;^|;UGta{InIa?EB+g96Q)cz%)2{&2a?XUVinHn`q?9 zx`CN!G>C?L8fAJonPgr^2c<%hbUsI?G;udgS%%+DF<&5H*erxd10>p2wzn18#uyF~ z(x9#7aR$DITazK=rqj1z39tUdhj{jxr-(#Dn3jXb@4TA}H=YlX0NWpYh(G)Qd_aT0 z<~KyeV^cOrl#+BA0jx$@+sOxlLAuLTVwy8qC2N%xAjm%gBBTwrRFl@$08Ycj;cQwz zCxvq&hdP*>#_O=VRa}y0A}pZ8rSEStm(}-4(xs%;S5%{&ZZShQ)F7DkIv6gLs5ilb z8r~Z=cyRnb@bFidhyQcn;RVp}0)S|3+AP^ZI)wodhRUIZanc1LUZ!ldrsuF+8QyUw#R(_z?7w~!>)8(e^0)y}j&u z`e~{HZp1Ks!oA~@S zA7Sn4b)56vFF{*7eB)Mr|BY{R!MooGi~8hE;HIyAnU0=bHoWF_FqP)fU;mcn#~;t# z58ls(FTIkXsWHCv%Uk)#zkLZ`U%xgLKl6@{@a)aMpgrnmuW9ktM>bLHiW96?`OM2- z$3L_$V%Ke3$dxRlyHu=yGsPrzhsbe?)Jzv+r5qWr$^LwSYP4Mk`RQVruD%}1r5xGB z3}>9OmQ`z3D`=99vm|q+C#N}SxnQHBIOr9NmFY7 z0(cOmOLOfYTY)CHFdB9Ol+8S}`V&;%txkF(6wvn58lSrXluXguYj*4*y5-kjFY znf;_&;Gy+7F^$az2QBc>VgdvVycj&#Ki@`*V)l{G%L^{(Qqq}(meSv?S;Y2YGjxmT z(BIi=y6c-y^2J{(KV!C8TfVHtWQb%-Bs%lv4YFX)Aa8lw8}#s7xoj!NE?dmV!F{SV zeQxJ|O<(GYyNJc2D#1GWkTMz&DJ;|=lZ*S>+?#@DwhQ!ASeIq$rgt znguRpD(PHF5sPfX>SEe#NED%qV!1%wsN-)7(j5!1vbUFKZ@Z1N1_wE3)k?ni^?ze# zDnoa>kGRW+Yq~;Qit{`UikSqRrb$mUOd&NzIN-tOcacrx@ypiLf`B9)2xw`xP)a+q z#{M z9OUL>Sz=%|a0-PfCNmi%#Ft|DR6j3iQ!~{JMYoU83ClS5vdj3fmNgx;^6gD|? z<*}UD(?cwi;qDuMLe!{X8WvqqKQW2JE0*yX4jgVbB1Fn&^8~8U6^>BI<<&IpGhEsa z;c=Lnv~@V2(aUQL2O+mfsan*sAS>+05tL&P4opvzbXj^s@mNm$4LAN81i}%V@hGqS z+^6`>SHH~K6HinL-_1Y26-UVA(n~KTDj(@=Z)bRVT8F}JcR;TV2P#=D4;*ao)Yka~ zHNqIQg~Lo`(yAZ!N%OX_5*|N(!$F~1Cg*W5QYuq*p+kl+4=)A}B3sg})nB{{|E0_J z|2-f7-@`oopOG!uTOa$y*9s{WX}=&M)AvOZ?=(q9fP_o7Vw!#==|~c0EFjp4OV0;s zgqE)@)*E<5k}9DUhLdWePCVMqL@KEO#2*baoJbyFF0`q<`5Xccr=~861W*Dr{7x@U zVMk`O5B8X2r%bxtBuZuNc#!CHIoBjzB_V~JtyXGZfQe!r)8(V$a57oR;Sa?aDHhmM zt1{_!@s5vQkJ;7DwV(PNZeM`$;lr$4aV+B#V~kEuQ1`mXS!GtAbRt8;!;I}cKu1?6 zr>$MXWvkcn^f$hTd*6QA-8BXxeocon_CRALR~0?3^| z`vnXPa`x3%Qz&HFeCsVt+;tZhUUCUNZ+{chk3C85wk>RX`dP}yAIBwceLW+4p5@oy z`wrb!h@+2N!Le_-l5KZxW_t4zjO>1%vtD^Q_doL(1KquxuUGpuTz(z zUwhq~xFX!o{WtxRiAs&hT!ATaoN>~6q8&lDJaCVuJ4sUCj`0j7iL4ET$vaHa;(yU1 z)gsi2T(IGEF1q9;eDnL?XZy}wh>E7ayO%RgIh8=j$4$5Vgp(I6;_S{r0=a@+(kJPU z*#gB(iE6P*Fp(hs{C4K3r`@58CY3F@AXS4{I7T9qBIFK}tQPS3TsVqFl`YM)+$vl8 zyTOAck|Udew4++(-vWADU|iUE@sHZYY$Z{GxIDV>AFJ1RT4paTxvT4i@_28Mph(TN z`Jt}hI44VNfKr@40{n zd1hrAI%q^qlccnm%edk2lD7)l;UOCq@tnv8MEU~cXG){Be4iv`cmjShxjZvQ4gYbA zxbUi%anrS*qfyDw9*JtiE)A1{FT}t(XE5E>!5W;H(8!OJf=pA%!96rSJ9FMs+i;y6@`E}M0c+(_K5Y*uCP7QRhe zq{BWP;H$~34&V`YkeoF1I_fIZ@XPsW)d@Phy8RHTkmO8BUx~}-!}9vrH9A7lY3X29 zFAH#zc4{}B(ovDk(Ys_3XTRs2-2Clt(6?wIr(S*uU-|6km^wVhsjH9Y>@&`SaFhps zbR(PZ-OK`i2!A2V%5WE5Lh&08^0fk!)dC4O%m|3pl!+MSdX;>+q(yU*24xx^vbC}f zg(1^N)E&^o5)p(5&FiexnW~kT+ZHFCm?7vfFe?oO4};!-{aBR}S+~K6w2d~wgZ4>S zFu%z>_*8oZSxAJG_BMHUXtdbjJIWFTrN z7#){E$8hP^*Qp6j4N7&8v?F2Fg?H`W!&Ph7^8^7i}n=R-me~g=PSYTq>h7 zxHw$OEDN)tk+MzV;RpjEmm~?hXw>kB15Bs#gaWn}JCm(Y=o62zcI8^VW{gZ7rs%LJl?$v| zw~q0NNoGbTSu!w(qx$-J`RVI9_=i7|c;Yd7YbAn}B4O!NDwJuTJHXlR{wHqy;PtFK z?_5I5=G$h?OpTkq{}WEU=pyEwdnVIUlk9(HD|>$VD;CciWX$lWY%`Y0GBQ5SYd`mS zc8?74+}4Na2nKlmk!QK$6<4r%=L1ZPjd0%4Yk212$4ECSOiX52YWi^0>O|)Dv1|X3 zvK@t-bmmlWn2`Wd|N0!pzE zma|S`@AI59e<5G`%D-{!t1jauZ+i=)=_37e=aHHm=Zl~JH0_ZXa|Y&e+Z}haZTA5R z4U_4-FxWCMH*}HY_ZS$pf=VI}9vsn*kp8Ydy}n2oOQ}|(d+pEGnq~hZh0P#fQKgYAdBC> zGi^yiOZ3cl>*PrOp-7RoTiVs8OD;=#Bfvfdzqj{Dd6LY z{kthEx{*DA3yF)B$EvE!yN25(ZPH?j{*&p=PFvE>vOi_~TA;!H>Xs3y71iHjT$F-o zq9*|oO~bWZQ&gE#x3{QAjM&Y`7GNV`Fm3JHd6X}dh(w~Aid4?!2>2x&NXjKGEVBO2?KSk7`LlbIYI-Z8ZM zxy^?s4nI`Qm&eL(x7+D9=7rn4kMl>PgQC7j<#vs`>i;5mc-sfA z-u3(2zUHbMuJtdwioPo@VP`hSWT~t<=whtZ5;aL25?H%%-paM2pT)p#ta7p-y+y~f*bXbX6V=b`nuvl)OEcxdHq z%>Egz;a-}9TL-~x_T*1I4$V}lmZWJmYckuPG24hE&riUERT+|Cmy%`CJki2s-)tQmFCQsBP($>?(+dlhIqTNxx`Olx?ml2v;D*yl>07*naRA2on12kA3 z4bqrSsZ?Mda8x*`&7n&@e!OBj)O3UZ=~|J)lIbpkpRKCLR#dhmH+iQM8$6im zm6^`uh({w#rtIxSduJ!ZlarcKBvvNzOSpU=XdVb;<&B_eXLt?3=1q5p6MAL*z_ynO{V6U_D*WklL`)^ z4lfz2tiYjvpjS7BV>4NfHKly7%557SkP(OQYHKgd+Uj%5vo{Y+*GguO16!_AaR8ZRo1wi2!F@;FHp zi@1XU4pob!%JyAIu1hlh%QF(TOS)g`<+92d)tjNsy)PK1l^JmxWXn};H_qn^x{wR_ zO;WiMLAOiO{KS_xT`p)_bkT5XXoWQEj#kQKL!F#(@uh4XALE(f1EdTG9eo2l_0(35 zTX`(Qqr*&R6Bv>%mQQos%GHb>7$G&5VEMcS^af2{dD?n%k3GrAy?3$5=fP7*(-91j zDdcdrwQ=6dU(1%?+|HTreJ}M&8t43Zkgamxr@z4Z*T0r(Y6^F6w``HP?d@;lymhDH zUVjdBb-~VOdFUrMa`K0+)2m^1Vh`^5^ZEHdeUvLc@?j`ULL>-fHxGaHt85(_)^~4J zB+6turE*BQ-bwkDDj^(B+Pk}Xeq@+ezUi%m<}YRI{sXvz5i}vFqy`dt7ZnSxtFF2W7G(JlIp@szy`J}(NiHg`U)}Ftzv0E}-rP*?%$)N1yr1{`DLD-EgrSx)Fw;4NGz-&3 zU@~8Tqq$hJcn;cnllb&!K8w}wJ_{H8+rI-=%=h+p9bEsluVBlIFQcQa3wwtrv2$b^ z`MQqbbPld=`Ob}zAUZqa7~Qu^=$WK_2Q8|_RP=TCz^+tLbE*g>Ev%V8AEys4L1knZ z^A^v;+N0MZ)ZGV!qQKA?cHVgx#((r3EY(#B5-fTy_ExH>C=hLGMh)U{qLopNL+pv0+6g$~k<D~*@#pX1uyp^F(%ZMS_KP6+jo?A@4Vw8A2gNKLIW@Uz6vQ=8;7pLx z%A{y%C0c;t4f=;>^!m(63mugBXiY9=>LmDmYYM@CL-4>Gu2?RkP$*zlU#~dS=!S~v z>1k2F^Ma5P(stR>jh;ZkPROkjoJ| z#Wt1z2!`nJV%1DlZWKBqcnt@oash8Ybt8_OHxK{$=}%#)<6^_oh1mJhlZa@(WofSo z^fZ7rcG8-zA*B7#S%5`ifbw6JQ%GtVbjiXf5Ny&pK=Du`FtSV(?K<307(<1Ubl|8p zDU+{Qu1Im(+1`!m6puq(Jju7I9{MkNH{N>H7vU-IHC;JepchvcG#K)!}g zocdM?j646!m%?e(aL3oKN3v3eJ2i&8zyCcX8o+t;=OeXemvn;X8v%3}K{#dl{8wS9 zA#sElcl||JguHJ64+=8165QtGA*7qIYgHM`(#?zFDgh64Tgo#T8ECgmp^T9yPq4)$ ztfRdb#YzF?auNBajU$VPSUl|CS2Q7T9gNmp#8m|WH2@_RL2$_&Y&iWa-2Ly@BEj0* zv@u;Q$fB6hLzs2y$>0vs-@F#9dioJ`>hOv=^e};)T>i|IpJmbChCL&`)!-qW z9T=aQmZB$+h+rgJL@=Nt5(pxdFQJzdv2Y&(hKYUI3G6`yBvSHNux~|(&ZW9$077RY z&~kwJ(FDv=Lo@_iyaG;t$2)Pzx#!@EpZYXHW#FViNp+#eGY!8$94Ae*fJB!pv0R2oGFISPR)DhHF zSXL0bOSEtF&&gz|fLU!Fm`+b4915dSE+Il!4-e>cf&M@UL6`0#HVUSS{mhPNf`Sdx z331P(C2^+ipgk5sE?))%#z{}3z9CMh6jeu|P77mG*18Ex!z7FTx`&Vk7&9giNzH(z zYBF{BQ`9BD{&3{JD%o}DOz!0|vR#Bs1LdYblv6a*2#A$ug{iqg6H~#vjd8*AX`X73vy~*!V!n8!qCp$m>L?xg6>&Zcf<;O zc*6#Sp521&cijoY$-%A{(Gf7;}579;f{RLevx7{sP$p2DIz z16cXacSsYb^!(F!<@R4AW`(e?=%By52jO%EiH{hX4Y{HxYgk*yEEHWA9bHLGrpJ-3 zlu%L?RB=qOhZ(iMc53s9*+E!W}I94O^F=CPOzaK!`)u7lyaEz`~vX-na_I6Oto zn1BaTiPcIOvqbaY)0X~szyqhJ353ymff(whCbC3expsSBr)=4YXScH0rKs*cj3| z>e)ys4UCp6sELS~LBzB?Rb*fF?UfW5x+k{Cth0C@ak@ymWYW#)ocPC&W}KS{tf{x< z7`p}N{k3FfQGH-?;kUF~BToOTk6(Owh?JuQw>qpyT!Mj_1?Acf0>L0^l?s?n&nLFU zqS$!idaOBO75?!b|K6)*Q=~n})T8zeGon|7oT;G^Z^GAo`&B4QE zpS$d(+wc6UU8<>PfAIb2zu+7^H@qKH6p)C3)PYmCrF+aJSGZ(SG}jK~DTo&?NAoP+ zT|Z^{AQg!`FuDLilEOa2-1$4>q^a&8c1!Y6pcXe5BG-&{ck}Is%sI3-Wahxm*E>wl=ZtDwk@K8xW5t zF*?dc(v}dox)AhrsJexT$tld8I~RL)??G340;=LlC?303u}EC9IZCC9T%d|YArnx} z7Z6}qO!08~u}5QhTM|G0!WXgB($Pli)Y3HTOQEeS=`xU?v@t89%k;wXJj5LhbHWKk zO0-=iUy%h^)CVq_hrC-uI6|tFgKE8mXe5f9UBj+gSvC_EbJMOZg=91lMNsv_xJosF z75tRghAQU0?;Uve)n5YQ35>t;8ovJNf5X+kx?R#iVTN$c1@FZv=bwqCAAASk)i8Pg zBY5WS-{Pplmg1LR{~G!x3y7EUXd}Pg0|s;*Ay1RdMb!*Ao`P|w09p(v?2c2=#C5_2 zVu6rQ1yYr=-#zg>5!umgiGV=Sc%6G?tOU^x_Sn&?e*PQFn0k8#S%((4Jtze>0o6vFfz0q&>hj-yk*%TNYorG zvVs_U=yB+oNp!RGt^yHa;#y58Ogu++fR?qu>}U{$LPf^$HG)sul>jW}iO^J{KNg3Z zFCa);TLxOePk9~-I7n4&0i)89()K+(#5_f>v!4QlxQ@eFc(px_f#WClfh2@8ciFoD+}7z2CeJ_dfLBm=%koClSN^wj_?e=px@I`@Z|I|D~5C*CkCL z-lSo1i=!eV*%8Oov_I*I>%Koe!DNt$!G?x?xh!U}lUig5mv5=d0H$&wD;q_-=7WcB z(?Y1ppDkND_7ae4>+weLz@HkLPf_A!)TEaCjw-H#8tJIaSfMbMxjfaf zh>%s2)HT|-DyTcOELMbGOBXMhFi=R{po5x+YBVTLYSl7x27I3ymV!;+7xY_UvF{W! z1&{W=q%iS)dIG#j3t`EosG8WG^SDdHiN{BTtcuuTmgs83vY1pSPIe6q8R(c&!WcMm z9kSsd_EgGveR>R$j&^L`v;`-eaH80P4~^`XZg`_o!CTh81=FLGnA|goIeooYJg*Ob zw{9Jb2cN{`vyY=q^$?=?NwJZsyHGkhaP~(o!JXgx5jLK64njw-L1lO!g7G+h{hjNO zotQv4URANZ;&{h9-zk7y3&ps(iUSi*Kp~fbsT#0V4g1SQ$q=fg^5|+yU@Wx{ zk+u*##X(=N9cDca-)^v*2_ojuZdKKYF0#nSnuoB4E za)?*~sFf;a2UN^PQ}e*)YV*GT!?onidhG|-15pw9W$^*sgFne=Jx2l<>9!=32UYY! zieZR0XxwqJ#bZN*?8hfIBCt{_{X=NgZ;0(%sdJw84hN>Vky;d>a=)@6>8O_ z+R&_AwxAU9WhhqA3z){Mg^96i@=oQB^S=FU9;TU#~cGT3I&n76~UUkideOPChLfkpJ_U zXpUVvZd!bU2Sv=SsQ|y0t97B=NQ$#?#pr6|7yK@}qI7&B?@e+e$Xn;danL$drU?QQ zcw#7S@xO|0!Sh{+7zigUwU!c}nuIDrP*p-hXa~uHUfiW-#F0w^D220sVC6bfqahut zT1_SqvKbkM01E!O>bMBR+Yn18k;`W>F*b@AMOAhM0Z9mTP|O!3=z}*OH4Bw;O>!Cx z@c~XjaS8&MR6PV2?Dm+b(Z5-AJpKrtGCrCK_~%IR!(8ZmB-4Qkg28}{OPS8Bdk!u* z?KG?!9K_c?_gQGA0_YO3gucJc$MIb|lCvpGsl!p(n7s?qIPV zmDQtIPl;L8-dp zP*l_CoKY1ArDDZKf@#L|a%YAJk10Q6fMGy7rb`v!9#g!?v(KViHhe`x*<)Z@lN8qs zbYTVq^CP4@vi<9L+NmR=n_}U*w_3!!HHYH#Gtb1sU;hzmd0L`2py?(8p?2&p*D(9^ z)6lbFJ?54!tje3jiANx|}vj76~X^(~0TA_zyqIOoI@B@?6H z@$m3>et=%r!E8-IgxpZifi8)dO`mMlkj@POJO!c=lN@F0pFEg`g__Ot>D$)^4PBhJ z_+Dur$M8GaR}QE1GI3&ORNj&yYzA4)x&lCFI0UP%NWv_iW3{(qTPlT1KmBRwfe@~} z<{AWa151}K#+m>0Av}KTuWmsI5 zqXG0-CW5jsHBe#56hkSE5Yjfi#XNMHVf2{>!cGlFwIrX@Wz+`m0S8iOlLp|YvvL|E zT@GIuD_Fv(t`O*oxVNeI{aXM8msaYcL~kP8{-%JK=b0KMZoER5QJMup)4sG>EbyJN zpfwyeirySN=#B#BuUCx##_hUfYq%P(5D#h-pa)!FNiYnPCKI|M-A6w7`*qjfCurBn z2Z4rU{2X{6{`;hEskNK<2dKI3H^rQ-V|HLmZ00(&{@l!YZT@j4C4sN^Mq6F(8gh=f z$7vc0b`2TZl^hVCcmY`_=+0CpwO02fo#LI%Q$-NYK#nxVq&6z%8wQ?_`-bog zt)&$UD~~(^N>D{=Xb3OfbuSh#T#C7C*CW!`i{j(=V; z<>%4W*NYWLtrPxhb!ZaLKJhfRPwbNQd+pg9aQwOFVeGd1fmBX3UasQFRJqRl0J=b0 z5u_9q6R9+M!(mj*IixG3c9zl8KLDc+1TqyIK5GulQWlj$9($%HkyRADUaq5Vg;4f* zkJC}p@h!fYr=cpCZg{8!E!4tE3>6D#1j6Dj=&}x|Rk3K!Y-~8~WZd=0Ll~YM_W@<8 zig%uW9%c{p;fA055Gy)5u*$K}(@;?;~daQzj({bwL;7677K$q9MP~IEFS$v z0&A>;Ka)o7ft#o4v~-||_G>Dd!YG;{_b(ftilIwIMz^KS%-EuRE=(x(5{|S2vOYSV zDwAnulT_JEj&`AY_5ikQehJgMf|ooG!>W$add+8ER2@laPbS-u&J|Er6wF_BC?-lJ zIIPh~{c#%b=%y$Q4GkL2P8_-&l6gUTyKnl#=CtT{X~oTkYSTHimFK|wmyT*yD9Emf zOrl-emE)Y6obo3cnl4uO{M`)cC4HQ%n4LRc$Jp2?Ow&NUOcp>>2El{N1F0DZM&rKcOheXDuVj6ii)u=@t3nQgzb@6Eza3@(@!xE4Gcm>4E`jf>1HRJ3_mN+ z4@IM$ZE=jIb0TyO2O>z2R<8n1UN253jYl5E^b4=S&6a%rdEG^p4p%>TU z3W-1jcEgs$;6N;hY`%hySQwSO4;~r~UZZ}{7tdLbWgysa#F?wE85pYDD8oXT_oC;) zLIWMDf)0ZguMQC+s+tcJ2p%|vAxD`136I$GfrD)9&6Qd@&(i7l*R#JhA7ydOut<#^OP2C!%6R;+0^@yhd0 zAv*t1%$mDUC_9F!;(`0_!s>NLB3G><9FC%+w-2}f=mty;55ZP}73ZwS@}*00+gHDh zu;U;OQ}(+GuStgc*)EK55R0t;ioP(~xesuMBBhQ?eY!>6wDeM>?!f3959TQVXJ06Mz-c}HWa*3(9GU4d&Y)Ai` zS$JW`He||0^tE>jGoURLMcuAqvdy#&BLDy(07*naR5*nT)^EU-fB%oPO9X-eARHBT z0qMCI8i%`m3m&=hGGPapY5-|*+cJcnIZ1;D0+&(-v1DB82FLL=p+H$|cp*H(R4SD6bUStU73KZ}%sS%`oIz z&5@?8p&HOk4Z2144DC}b1VcgO^Z5gr4`k9v)>*ZLRB9Ug_U*xwPdzRUTnkiUrt?2%9Jn53R3SvQf zlEmj1YKK}hTUkkQ8X)A|`JDt`Zm7P2jEgKS!VB1BF!99{#tLS9@K zLO~0Q7tTdjXA-ID2}FV>ve^uxAxnbxm^|#0<9uPRL%yQpN+&m)FCty2AYG_p_vjQd z`Jy-)QC!2`7^C8O@d?O~{;v-nM32GW3*HPI#k-gu9}ye56OLMq8@_ifhPJ;3_6g2C z`y8B08_-w>Hf`OGqmMrc;odI1Hnbg<;$p6*;p%_*2rfSQc!WDTVQ+d7hGqhZUJO0_ zAO*qlPAwv;rxCv~moEpxO#@wUPh| zY9ZQ!F{GU;5{E9v@kbwn`>*{m+BF@D=}FL_r$#UV9o;9MBw>C}n0UF$sz}a@8SN)!Tm{2e9Rt7hsK2 zykE!LulOiB7tO_OpZ_xY92I)Hh<+=Cu&!Y^Gl9jYyan3P>wuht+;@H;h5@;H1!D~l zc~i%5%|T~-2gXy=XbVKpaBb9`nphoYOBJD#(W16pN5wX8@T7 zMryX4KUWJ&P5>v0Q8?%}O?2rji2aV2OcU4`Xs{smIrS2pDK??x5+4K)ETV-9)NJ>; ze}h|!Pz%H=(APiNN&~jME~jHE3>M_J+Z62jQ!>t-{P46^*WaH!{Pp0$AF~iV9GpDZ zP;{=(eqWuJ9f1t@2A{SB1Z`CY$*xA)h5s`tbPgbcnSh{qummZzzMo;1@;8D9uHys` zuCBt>O=+m*Yc-i7u(+4ErD;;+v->Fye*_QI9*Jf_N4nxjDs0VDvA>vurUnF1lLK9A z_(J|J%S4;5!DJ|=6%E6#i*@I} z6Wd$`&y5V>#T~C<_Pp81jZI?t(nGLw@1$h61VbhYg()1qVhQ%{BX}ra(cF3HvkY8* z_Gxf_|0u>EdmK^KL%dN#HyS9LDyHWz#<`bYfm^Tm9M&AR3Ukgr7qBa^H$96x@3<2u zzxxA-%^L&~QDk3x1^3?aUpV#c7b1Di1*q(J4Z+tp;g%o$Csv(!wm2d&ujTa@pU3`J zHY3><#}Q|p4s>?l_MiL+n;&}$EA%8xQ$yd0t1)ZIeEjfh-$thb3`UYrY?5gmq3as- z%MX|sF6I%|fqoaLxIjt=CLO=Y5fidy4YND?kS?WU!er`E?5Mjq{pu^x^{#i&c|^L! zs8n#}rI%sbrcGG0<|sV<-18VqWiXV=Vzii*b42P)A{It_Jc3+i3KQ7^95$~!V8zPA zP|p`oO=rZGwV;%7!cm7|{oDnJY6@1YJzO#>5Nih-CQ$K!M;^mt7rhJ13{B|DsRDIf z3^xTB3mgq6Fj~qY7NYpJf~W!{*q8w@I~IpmDnf7gN%!)QBxL_C_dFkTYQnSkA2aET zET+X!fbL5F55NPjTVAKs9ac31n$?NUS^e0$>3CcPTtULYxS)-LoCBN3Iv)-~% zuQ{TL5L;Htt~C#iT^E{eE|-&9jpvgNS_a2Dqz&2*CMUc(;V8t?p;#g5nkv~UD|j??^2QDZvAKfa4o(+{z79+g4o=0J&*9{OloaY1{HeiA z@W6j3qg%r`FhOV)`n<4t5?O3;6ex(6-SsBWXiREAj{wF_&aTcLnbc% z$cORqk6w(S{kt${uup7H`}=!Enu}np z4Q)LG*uHxhyN5if_gwMe!r7!BRxHdvrb-*NQ8n&217^mb`8PQK%+0b>Q?M}6fvMD#6xMx_Hnh<_$_U`K^eCKY1e3KIhU>IK z4NLf3yh*awOQ=G{svjy9;WdEyBQHxMZvCOPosfcK*hdVL%>ufokubdgu#hp!wY`EfeF_I)>TkP)yhq)4DDK6kh5cl1+|(R5$$&KY6jF?=(Al+zkmH zXlpC9C86#s{&eDh6+EyvO;qOxC-L>@{m%7(%b~otW*DkpRvesm_#Jm&^YGVz2b)yP zCgA3^<%5R^%o?ex+*5o{-413b$@l{^|8dW_0>@yggHGp4!>w8$D#DuTD!Ih z7?s={Qqy`9aTsi!lD`9xGJk|zHglt}|1P_X69;%7~HQ0r&S$)|0>Wi2N zD0tHL@G8^XY0Fxw$ho9h3-_9U8bWt(pO|-O!4Mjz0mU$-o6m`@U31|ugQr$UFdS@V zG#qR!aPGkD2eJZef(6NPprK6bPV{rhq-jj1jnY8a3ZuQN6LV+JMZQ?X@c#W`Y0M^! z(B(=6an>9g-Y18PlqOyS2gTOS;>IwLOm;zMNL(%}hD5A$o5~UdOhcF=%a<;}r#EcG z8Ra_mU30Cl69SG6O?99JIg=&8QQ?&8Fb#47A{d5_{SobX_lUV?A9w%#|L?%VJzxL! zd)FSm`uovn)Ova6b_8bkW0aPX4G*dDX>hK=IFsf{f~#K&UloXeC4w#7HPyGk%<}&A)3=m|D{Zf(Jie!lyU!&n;lo0vWAi zBf+=qJja5#;Jov2;e{6?%{RY_YN>>LE`#HbJqDk;`f9m|cRc+R z7Oq(<9G6Ycy@X=ffuovmG!yqd_!zcq-GS+BK@t)9TsUzyVI z1|h$@kjBXyj>GarvvKX0{uOJMFTxGC{t~HYo`FGu(~Fz%_`{Fm!neH(W;}*ye>cM6 zAdoHNcc1(;$}et#&h054L-(>pP-0PRNljripd&dr2SFtSyXs=`l4V%Dcq!t^Haz|K z6R4yz$mLVG`Byh%_F$iIYxh0>BAi|O&?AJ8vUJ+Gs1q=BhC&!B`yGdYWE4uKAi`Su zJD0Tps*x~eA9fgGy?q#&m_T1!2ijZ((Nq?Lw8Hgjc>c*ppp*-e4okPHx~oWl4c&O2 z-t(GJlV*2!A-!){tV4UO7;H`lgovYoC9Z8~LYJadt27!K4Mc+>$uyYGlY^?FDxTFo zjUmVpER&Y2b+pB!(&3=hE1gl;rQ~z?Ab2uW4Q3*aV!48HwIa!|9Y?Of$tP{VtzWoK zz=xw$V1_Kz>Ly0&9^z})p|Nxkp30?gFdI>_6|hS84Nx2AeIFz^f)#mF0E+Uoo>E47K@%g;d8VG%1l}po7pJx zC7uTb?a2;IWTu3Nsv1(BiYpb37RaL~5G4JvLdl&P^fNP}K|~pNGc}HExq=RE@(mYZ zHH37dD7;=rF~rNAounbBjCrS?fb%c@#K^TjMyOgwRMnC9Y;30;U_iy5S_84R2rB6!5>^OSmA$AsBBq6O zy^2UEC~jZ`h;FrpFmy!WA^{hD!GM4VrUPqq39;*#bb$=HyX3eV6y`UC>c?O?PR)At zAc76m4CHNSe?eP`{AE?99e&o1P@t&u zX>OL}N%}bhJoSF-h5M&ag$_&}d~osCf(M--h22j&in*R>9s*39CwTIlW;mL!^YDfB zZv+nqfJ2j|#PoUrxXtzaAnn2z84Fa9&(o4V{x9WhkPgZzv`lamnU=By%Gc^bBVmt` zYk*85xtBFT7(-S&5;5enc|=L1Pz+SOI?PxSyYo|W?U0H@Dh`bWx%P1a5m$BSHOF^h zl2)oeNfs&zC(2Fq;Ah$T;GstFK+OX?y3{;q8YW!@3r;*4ui3zu(!i6OU&7$L0i;I8 zv1;XE*tTN?={!579`c1rtUY2S#wVt*dpL)I-d+sE!?^gg4R9WN6cdj=f_bnILKz_o zD6)H;oQ-q-&u6ji7q?)^S*PQsAN~+-y@Jka5vbPDv3QkaM`#P?;DuXm#L%{#SaHG$ znE$a$fywNW)|G2411_WLF3Fq^5mJcN5%ERY}2d(P7Z5Kg$(h&&IOv zD=W2Q(@U|b9GVG&q)KWU#`Ehz&>-sv*K*d9%{64!zyLbh+J!2gO=XeJ<*;zxLY#c+ zDOhvFk$C>a=kV39UL{A1O-0sa%$BIrgrM0Vk+;dWq?$;ycR)9S$YgSUhMHv0a1!ev z8fMm)h9wIZ;EIhWI% zr1sEHxJ6qM>5h5nLanUdh<1xiHJ3JX2KN0xXga*et?l zI7;z%@-xp2iEANNAGP~`AB~2w{7^HAY;+7?|H|jFbje)&@}?W%*cA-#--{DZ zI02`gb~1{^f*|EZ3l}4v=)l7dJ%I*Oi&Ya{<ZYh{^I)jMN&$LBr+9JvPQ>cYg9SMlQ0FX6QJeF!)I z==*r|*=Ho+B@ztbsxN<;WO$^vzKXV0%Yf}$@xsq;Lhiw55S&QCp*UP=AnR2{JR6Cr z@B#tspYpp7i}Vo64wI=>)S?M&c>ntloIi+H$0j9BwZa=Qok6lvM=h7e@-@rBOr>Xj zeG85{?s%YU7O-cZ-x^%J5D(pPE7qTMf@pE>`_CVuGM>gFc159z#i|7U7-8|&E;&_L ziXjU#gJ&XiNFgPw;QNfTXoyBb;!IYlG;>cHicrpI)#{43Ji8HwxI59CouA1h1%g|@ zu8P@5EvO;9av{z-;|%=ji`OFNHn7*NVpc$dX(o|U0_fYY5y91~@KipH@80?=3=Gb} zvrj)S{9ktD_6?7~(-cIl2uxj*>rJPSE}6u}@u5R7BheAs7r|Up|GNNL=Vk{4lh`t2H|)Ey1VIEz}U| z4T|Gz1j43tWU`r*Xau?gL4;I8x_+H%NG3R=sAFE&0Cr9e%YQrYy=Gx8QLX>LP(d(h*%b!Dg)>=v9Kk0=nq-2>?#zy0X?Xp zXg5#|hQ%&$ik&Pvj?mK3X-?F11zoO%2z1Fm;dD?TF!ETU%-|t6mnSKDJ%7TbNphLr z`G2FE(Er7j;IYBc)Li+DNPle>9fEJ&%mS-rU+PaC{7Hx}RQ6x%Zv_wJc@aEWe*hl% z`m*&mQ=eHFQD)a$h1X=)gg2`c}1m4>w|80N!-wd(&O;e?FGv zN2@{)6<NhWu6iy^kQx)jgp-FE zjbWr(M1}%W5d7zVAt(L{HYgc3c&Q9_MUq%@xVjquQ74G0#~mKZL4k3p*ZdX7h~rQH)6qQCn2xcc4pKt8wzX--}9H4_A5beppSKMC%MZblx1NuO zuKPN6yz(+a?J+Dm_9z^6&IP#ViZ5dS%UjSMPhdDViJl{u;p7uez(d#Fh(NV04a%y= z0vbq~VbRrC&{0Me3*)olRr4ru8X|2fpZ1do22rY1urd)rgqcsY3?<Pd z1(ibSicIdNN<}Ck3-wS0uTQ6tH!W1dQS8Z*-W^7~txFn0naN3+K(AhX6t?f)FCFo* z@ln{NJTAK6e9Y--!$ZIMHD=p&oMOb$O(#U|G3=_79@|i*BaU(&Jrp048cyzigA;8R z6%8mlG-ok|LPMeCj4ER-K-In{Sc`LLu zR;@q3>8>bR4;S0fPgBc<Lx_j8VJf8V&jdm2jOr8EQc2_T!?>R9#<}ht>6Do^e85b zY8j^5fEkOzYt)b~6~QZB4JXhDB{5+IP#K(6wv@(2N8ESUZU6J?_UE7Rrsw{VU)=tI zg-aHFXL#SR$qw`G^pt;N*sch<0yQ9)&WNzBbzFTkcChgFyYYS}zNJ@~QK$P$y05yC zVyyKz2rgLP`?RIjG=aSFRsk;~{-#>K)$wl?_^oTV1xUD9x5UbP9SNLsTtV2pNd&0O zq+d1dwJ37p-*J>1IWdaw zeEXYXFS>5cDzqoU*uM2u1Opn%g`5P(QAkBF(B9SoGhiS=5$)a~1jA9xUAO|vSFORb zo3IpSNXUjRs=q&?6%LF?AOa4@fYKr*1b_;G*lk0UUWG z5HMIBBeiuW+Lx`s_22qBuKdPVgfrjY-GzH@`2`XkU1HmaY8m6dz7^K4eK4Qg3~b*G zr<4;B5CfS;8bDS9VqFT{nt}c4I*zg0P^&t~s0xa0Nvyx*!?^A@cj8@_e-igT@&q2f z_rFok+j z{@=cY;xn&eb~KKf?ul)hW;+P0L9rOE*qn;!VslG_fUw1GyN;_6zaLFI)?YcBpDy zQm|!W5$Z#6Ny9& z;cy5m7caova2SJh6Z!2uSP>2)R>%u&iBq2$g9ovum1|j3WQv^bArald;apoqM0t$P3fAOJ~3K~!&*8=4h@6N+MlV#9_H0{P$sM(AjX7`&P- z9@iYhFYM~a=E)K9Lm!@=fD^F9E8h*7IQ4>av2gZWeE*AAp+^tH$rlg}SZMF;#De3F zK=Om<$Rhlk^WKlu!7fB5%W&K?W|fmcXr2$|Sjt|OcX%eXg0dsUm8i;Zv~fK;u9 zSlB|QR7I5TDD3)?W+K!&7Xu*+p%!?sR8;E?xC9%Hi?E-V;A>o6KV zXz+o9|36oETl2-x?1b|@Ne01RG-w+S3X z-|$DYC0W?~>+ny2hn5SB4?tS3QU27ycTOS@dK1p}U%0cf7*ktj6wLrx-@r+OtLvgI zs5mYPq%I1B-tS)X7%~UJrE6KkL*2F|kkC|A6ul}e%@Tb_LG_Ta2|)Py6}Sv#ZQesk z-9n5uuubqF*FqCG_`r(rfoZ-C3E-^K@=?`L67WC`rGk6&E=@$u6(B7etkPpGL5w3&qJ40znNo-gyfye9t=(HY{YOGH4%| zgP&b>73`4|Mx7$&tzL@tM<0uae(-Zxm9jJxSWdc39x@H-#D{bpWv7lMZEXlwswmgW z*iW5`3IRT?CP!}~id>c+TE3ouE!!O$kP2Jq9Gr)q{#oMQL{k$U@tymJFp@7|%bxu( zJG(Jit-><`2u34R3}b3+1k0B!#%2Hf&$#V3zs22m-;eo&bI{k>f%m`boe1a({_S5s zg?DXSkGIcVj_SVsqT@)$qwuOOLPiJ%g~8L~DBgK1bY}19h9peqIAPKh6snHsYFhL) zx_9wfCB=@`tlWb*DNoRbTlE7=4FU^lP+iKdnbXDd*virJCy#$Kc%WS|t-_mv=@xjX zsbQd+!`e^)QPKXXa<9-is=|DzKs(xdd$9fWO~`~zJY1>cSsDvi0iaSjpFJJj3WQ#c@BFqyiLtzN5T^37aZV22a zxo)&~^+IEJIqk+xa05$PL1WY!>Zu^8%eXT!_pZ`t$Wj*Cyd|5jq;zxwf};NgK^-0?BRP`?oj zhBd0$gY8Kaxmg-a6SgtAYZ!f9-Hfu9lho?o&vaYzgWY^O(ZPrRyrZT~xJAmeAB@j__!4z#oQ}=Md@rVN8=KGT0$Bl~PubFApj*Du!asWJt zFs4b3lC9G7B#S{N86v7_qHwxZ)G3mwiB;qQ8WMfKDN3eW6N?es*F?{o(5f1W z(2e>AX5;izHsHe_`g`o$x*4-)cf(LUSh|N&F^yz0idwmfS^a(J@8=D)9g`E2XiFqu zG*nDZXE89i04JSsJ~nONjj`!0ilvH-zp6#@>ROp3%pvfz3mg$Y0CCeo*b4X;GdmW! zGzR;-u>R;ZNDb}5?Kl4L08cVz>F6NXNp>I@j7e6({Ej}jl^U|yDQtb|1w@{%enP=gZt*_#NhaZBYJ1`9u|MH1XVsghWIH@TNghPls zRkZCJfqDP4h)j>7Q?bx69b^q)2vxjP1Y8}M-4;Y)vVw(yDC}ATMa{%mFo0t|`XT(} znJ4hCx8H%in_t6wFL)PXK?}G3^hN|%F2cy>XOY?cIwtS=9Zr1fTYblk>l zNyh`r=b^go6o@)c-93Gn7@tB%Jc;4qVR)ME zFOGHt^XAUM)~#C+OGd=!`lMsmiC}tx8NdVI`7Sz&S1#n2N1KXu0MDvB@^qa5N5L8u!6Ya>TI(AQw30L=^0F*ic zPG5tv)-aQT3wb;iM>?Mu3I@HxrMs)@$THEqJ&g0;{x%G@_28Coej9;2sYX7nGPqzC zPW#s9WCBsS>27TM_5GM*>xjCPZ52=tD%f19zzLbyTP6?If?Ki0Ki%>aaa;-q14vhD zV$GW`RuQAcvjkKsLNTM}VIUMjSiplTSeY4JEV3OdguJQ>_$WFqJW_;6WpjO}6Vg@q z`+~XxtKqX5v{^ffC#nELwAZ{fra(P)02t{Eb zNC!Nh1k?QL$RfhRW9HO>ulARLhl5tFe+V9YdXztT5b#i~!O+r%*43$Me`bwBL8C^2#`F-D>RHKZ0FD8O)nA2g?U~@yWAKL+aPJqw?H~(25y! z2TgdDve@c2<}bw=mt2O&KK~UcVFSl}=?bLw?LzK>hp}(ZUi6=K8s@B71*cFzW_TZd z`K=$|lOMkVhz`IW*^j6G>jqRBMVxZw)wuJ>;+vnp3>RN|3GTY#76F3i z|MR8z)@7HWHaU%`ZehVG>#%U{JlylGA0rA6y#&QDPz{i_t>(aX zs@PWc;Dmru8DOv@k85vd5>x4n06slvVK;yiKXV19uzNg))Bfjjv;5cmyjB zJq*un-i(*FzmDyr6QWxi%Vbb-YUu0fl_?|bW(NjmW9zQH=F7rhO}=m<2^gso|Qo`U za9Q}h+)?0D^f8Qf_C7WubEm505RvYUgkD+IpAtoo95fqK0&A{A{Z`@&%HX9|?*~YxV z0sQmZ&c%Ae#cf~w5)zdLI+;$*Od2?HuOnnai6xPkGY8@R*~nT!RC>B#%wo|IH=?J%V9jeiG<-s;k zCtRB0Zp4uoi*zZ(MV0;(19sOb3@_JslIQ4mexd~_4(`4LSnk2iWN&2VbP*F_}C>M!Mwp9ScZmb zF@r)eh4l0kqM;CuJ@#nKojZsp9)C=nb6h$`cn0Ea9r%Y2e-yXgbszF|PiRa82W1L^ z%z%IxE(8p@iZZf3mzPl-J5q+FN$fehXDrm{h|?JlW6jEC$c*m8UANwX#dG>_!MSJ2 z@45KnmjZ3=06nEUyL{SUz6=yfxcu}pC2Qe~jT^Cb`|B9b<(ap=MYSiO7^xS) zBjNvJ?LELHDa*9syQ{mpI>(daoH>&NlYkk*5G3cEL2y?w0gAAqe&V{Tt_eR3tfGhr zm~hD;A}}ZjI503dhjY%H96P6~uCD&C`>F0>bY(wv|GuudhM75ZsIK>YpXa%gjtt7s z!+z|s3h1NXz7Gh~ks)t;?UN&H1R^;5&d=bf-P_Q#Vii&a6VLqoaYQu_uDRkegd0Mz zd+!DZh8#wy!;}J{!z60f?~ru zGc_Y(;1Yee-4xE6BA6z}GVIjE-fePbO43Z34mnjU$`r*T1{K_NR1v04={W@9fDnj_6=grtR4)Hj3BQY@cI3y7$(A@0EUJRA`%HA9&f1M6^A!V)k%(NY zjA5YBsh}YgK{=Ddbj6U(pHooYM*KxFpWmxWs2Y($2IJ(?8Th>cISe?!V1l<%wImB9 z?vEmo&q9qwu`@A+FMR%U@B~8m&SyR&>yn4{WjEb~gRi}c0|N)}z7JjpB(j+L$z#Cy z6f{p2mRH68R0`8oo30RxMv+OT1zq9VDA8TZuOgW*qamOnpVQH(xKXy~?*v3Nzj%{3 zxSa6lIvRouEGi0zwN$oH<#*|JODI^zFp*=kBgckAHhHh6p{kb zx&($IdQ{0ZA=(wx6tVoQ3#O%c=ER*Laipu(Gz%1o^1LY16u{-Skq5emNX~j?P|s30a;yHT1z`Sea#? zfoxJ)+VLau7$Z7GGZB90S}2UkbQT$yLfhnh!vuF-FQD1wKsdnRi6KHzt{qxrbGhmj zLr{I*ry`VwLnhQ*b2*0tNrxLJU3)#Yl}x;PU>|l3_2byJYp{9!Tkxn}l&fB(vKa(I zJ`qgQZK<#SAcjWLnB6-EOWT_9)eqf((jR`0H-GvNn$0R2nD5{=FjA;Mo3{{We*6=7 z=-NCH?`)N;_)qsWbvGenv zM6#H`(krjUcp{C-*S4UsDT23W`f&E;7hva`o5e>wJTzA=tU7TGaP*N7 zd%(Od%?h?|$HaHOhXztZNvCC45o^X!1X+WEeM5p*h3UuXb-64^G3z##LUfble#-$C zeN#em1juv*)`v>pT}1`f5HvwHpW-uj zqGh0Ofm1ZE)WkBNxGCCzWlNW$w|5TW4RmTOptYk3PLB$I*oVew3|-wF2nU03yJ)Gd ziuJBX^&pW>!sicSCNU$74Tr-e_2J&VdvRc2A2z=I4m6J!g9nE&G&q7-tN|-ltir_? zUy5udhZ{a{10H(lA>4oe{n)f=qr5-eWLB37-7Ls`B^J)&eCb3}TL;`8KW3(rC{m|L zGof18G3x}nj5Wj}_|O@rIV8k*ti z=z!YZN+-t=^d0!fjn6#s?BB4>{na0N&*tH|UqAVUXe{=xmRWVs3bIrS`rzivg1f5Q zlphA9@L;PK#N0vaE<=)w;C$CMwbrj5qA}UUG_Q@_Y}5tGGOe#QBz3FRx;sUk@>6df ziX0Kt+>YvDAN+G&r0n*34!vHzTdx1S#T%{6&rw4{YL`e5lbY^<8!w-i3yr#pzobV= zV<2vW?;o@NZ+LEgIkuT9&G9*9C z_eggrvelah|YTrZ_Q_OJykz8pC1qcD7;ll0_IjxF1jc>S3gFCeD7}k+|_A zA42cKCD^cOBUY?F7ENt!;vi8;q+#woh)2HreO!Ol6)0vhXj-}yo8EXGE6zC|=a$H`r=rU(45$1<}qy+5Dx(59MHr80S`-uf?~V@3$D8Y?I)jzd!P9YDykR3ibsUe z0|)!i*c?Ug;<=dL(1Zs+^*Ma>;w#|pU4U)Bc@8~udJ$-E#ZMo+7w24XCK`LY@zmG9 z3Tt>0%^r%(swi@i%AsF|$LWPxq3q5=qc?~|k%D0eO=#P}e);aXoz=t8S~U;cZV$$@ zDa2^6M?YrKH@J{v^Pste&&uaufgpa@wdY`Cq|I)^_3!^DJoLr8z?@Ek>2qR!=!OeJ zg$jHtSE2Wuv+&BqD1Q9J6X>2j8$$!bnBCQlfrAI-yH`CLG>1!aMW!YuQLdEW@py3F z8K>ZViAe;>0c5;w~T()O+9wj@QG6iIf|%p#GGy0GruJOKN12mAp{=b11K z1X%EzCYmBKXw@oqrjt_8FsFh)DZbc^>3+M<(kxS>H zql~aGjy;8GRQw*?{OQ{;F))nh9)BD+-FiEwH*LYT7yf|JVgjy)5U#lV5}h^`h+Tqt1qbkUlTQvPHyc zOb`m7N~`W_RWe?fT5pNH0e zf7U$I!u0Gz)lR-9I!1buB#m<)Af2FWiV&3FEQbni&4a97g43tUo?I$c5%egqN|v|@ zHijB-Ff)yaFNTpq7SkxhsrixB^U~;Xn#`XI)2T+)WC+CK&n3=Iw$hD64H0rXohWef zPODZn_o^QatB%4xs7U!VyuEiP!qEWwckRO&r=E^o`$iGXO=C_if0gCTDWSAPBrc>JF4;o?ty5)<2YVej5u zSo?_&;^9x;jKJI_xajWhAoajQc=Pu!VRCv3*WLMLY=7!C83rZZTnBeh#hed(5Z}N1 zJ7}6V0keQPryPZ4C#=RVfA&jk-M1fMDDc67ZhsslnD8#@!1CqGu>O}%L*>xSp$Wx$ zylkg{6WJ6hz3PF>&=F@2i&w#jZo$y(d05or6WU^&w9$ML9QN^!Va~&DpBK4k3^VyW z8d{rCEgQmhCl!!3y{=FM`zI$cM9Pxe2Tvp>&XL7J0YUQmY15s_AlTR}A%Zj0lXCX9 z#=^+Wj3MAQaddMt&I~jloXQ9-7_&!K?!sG>C?%Hn?FRsn6+xn??#UFtDj`Hd)R#N~k*`^DL;J z1Mk&5u$d?FTxG#cT%N;@S_s>uRl#PiYa$Qu{aN!+u^h7A4HZb44k&?UX&$!jcn6a{ zCtfX?SYKh7D;o@32*s3jW-w5181Q?=I=o_*&=hSHLxvB1;DfmKx~tGVZytXB(+6Qx zbWCSv;0bsHS&m0zP^snhKsbUxFo1pg`cN`-(fyK&O#5zH z02?J!kp9)HkHN=3ezP=-XPe(?Pt;^BuM#^%kNL?30CG!5q6L`1iK^&D_{0%&RO zKvi*Kd~5;@4RNGX8I+g{Apy%(#2RDh>S)7FmtTs8@gcnQzyk=DDrk25;In`t^F$a# zOPlL(7`n$Jp}M}dHiSC6;Ecy*?I(u%UY!+=eBhsc@&kftfA{0BHVpm#qBP za3p-EX;d7fw2&9eiK&Y>fx&zQJBL9`KWcVfQv546j9W(o*gVt={(AFpsCbv~HF|v8 z)1rC-ez=1XZ#MpY-TKrPtGw%GBy^j@X;bw~g&JYF{#>$!))0n68Vp*^l7m+}0qU<` zj~(Kl*~n05!KT4Zing;K#D12C=3!Q??*`+&JIP|9Z#N&dg{@pemrKx)x@MxgyAwTK z?YQf%ufc^f7R;T6bZQD#xdcPcW8Rz|(JriBa}-Ltjz7NoDpo9Ch0)Oo*TT ztXzE@UVi;;5lmCHuN(9wW)21$Bqst)IiyI;D5I-qw!mP~SU{$$v>v7QA?)>%i2|Pk zc;m(2p_rY<;`y_2%yGxyoEvY%&R1T+e|+nkxc#$tV*bJf7#$i!cPNVd?ta{N*SGND z5C0R!CnqrX%(Joex6flVUqnmSEHs1~P%tg*ogT%~6)UlI`xd;teG~Ft3sWOwxc4(( zg14jqV+p%j7}^dD4IuxEr=ScE3XhMLnFVe({s8t_MT`^;%xwx{dNPaFpcjMLqHK!$ z0bKa$PvfDt*Q0sOF%r_V@zu9w@wIlfVeY~nWV0!pcieH<`ozNyV%AVd-ViXqE0ejI}Rt zk%t19&g7ufg2)0~3k;i~P%RWkCYyz>R7E80QXFFO=J#omF~ZO}nKHBZaB%5 z{7zhb&HM3-fBUwCA2DiIavn?#1z#AgC!B=#Q%=SoCPwh3AN~+My}dFWncdkfKGbwZ zQt84~GK5n;Jvo7n=$3&a8hf#0svje;;G5Hl>u$RV;f7{l-6p*A_%nEAvJZ=0 zUNp2cpl^5xYmQom&TFp$UR;Nfjhk>VnZzhf1_pgA;DT@XExJFFp-*3lf& zP|oORq4N_AX$pzf`5jJlMx#)2Ie3^nZ<>-_;t(e@0?7 zMJiQ9qw0WP%ng9~Oc^Z}5AQu^9*^$gCuH|6>m!jJiBX>XePz(`YuR zlD17-$O_O9^N2sbTB?Xge4E>k04F|daLJu^ksewVw&BI?o z9u99F>d1pM52Ye?gEfoqT7Vqg+n`^I2vV>xT*}xDH-{zCAkfCufsj8SMIYBUks0dRc<)G9 z9Pb;IAz~F|%Vngi7N#sG&cEpsm<%`I<=s2*)XOhm&ivWv+qDO?n5^t;KtV5|Z(tuZ zj{^&4cVb|07&93QU2W|+a&|ZFq)Xt_&tUk)bx;afK_1+tf(!+mN3Fu?H+&F}{QFmN z!KD|X+S7&U)D$`+KK%0A-@^%~U4r&ys{qvpWRv*yU0=cFxBm+e?~&?$)8}r5FYH10 zMHeLI3XA{%AOJ~3K~&?L_k17zY#xgmyP!7taqL;|!*?J23G!1ZEbuo74bkKFU~6U= zi;q1L$FE+4bwB#KAhaewyJAUB5ci=l^GujGqeg@-;$z;1M?tcbhvm^QRbmcL08TxJ z`N0@EJu33a8PP5jeIe{9nMgB($yr9q$O)&O=t9~wFjJ}EKsJwp&xf4bhl81{G>g7a zOa#-QcFN;HV?2(12Zzu#d$t(Q?A@~i%NNhbytYR4ZGH=@ygr<&YnaDjeK9ME&@A|= zrz_H?l5RsQ|jD|Im;%wQr)75^USKTlR5pFevp+b5kp_*(|b!qSSN&e@I@RofT^>e;_1z9|!jLVd>JP z_|0?AVgLU9m`P6Csnz@rOL?0_#!JZiLO>G*;aD@G4UICSqZ{Vb^dw5T92|xXuWL zNjLC`OD;h?9>v<@k4IuE0Z+66zj|dI0!?jjRh&3DI)=1TL7=Gty^H2yGRxo{AgH?0 zYI!lXVH;M2nz3|lCnD_u%)Ij^+BWV%V8=9OYHQ`Ql5xS%>!WXz%*9&Mg5N~IhMs9=WIo|B|SvvBN!#pr+NIrMl# z*k7E0PjjO^97S?!0>M}a^Je!Te(pKI!C^e{lZOy)h~nUM65&7;g$=y=ez*TT>+4%WK$?#V|;fS_QICO!<}Mckb3OLcNfO*W0GXG=wyi zGPXB=#1+7dnL~@W0i(qf96moLN_pfho5CdN@3q(AeHZd-&?t~Kbh~-rdJ=B8J%}hN zmQY+$)hbdh58Booi|J@H%8gOHwQIYCP;Gx_BUT)-0yAk-Y|^*w*n-Z^M$GMQ7vy0g zRYoKj!m7Em@R5_&V&akif^*+~1WXfAmj%@{5NM9zKroKWZn+J={o37_wQvp^&pHv& zrYK(f;SVvfV;?U6=pA_GM-QTfw&B$hcFm07_)9NAwXGL1kBYZ`^j&2039R|Z$1%g2 zV>E$PN3Ft-zWq&HcKub@+_w*k0i3w(82sj*dy&h{KykX^TilHkPd)*UeCG$~@Q0D2 z1E5((V>~Q^U?Y`5$mJtIBl!T-MQF_R(X+7J8fFX~Ay)uC(?AEcOh!Sb#r*E3pkNy; zBseJYx#5k4(LX$fQ%*k#dxi$lKa;@0Oa?iR4>O7rquD%^KnQJ}-GXRNkB?#T++JLC z{sq``pbt+z`wZMfH%bNE{>fW#!s?Z{^OHAWZUs2K8bo_ehZhw=lISL>xEXxrhLh*e z2D)9Ss4DVh9m$f7l)7s+^32#01hZzv%)*&x5gQ1<(+0apkgPts6~>}5B$8A-=0L91xJN})d+Ioj+-BOzROdQ~K6UrqB9r)g9`8w8diK{(f58{>{i|6r z9ilnlrd&f5#4?qeGW~7|Z`F{8dh@_H@LtUWYxzTNNeVL>Y>h%4J*YPa@|xAEKz()O zp)N+2%m^M1q&wA;lIv6dx@*%R8qr~&u-=gTS+il*vKuHOu8FUuD57{sQG_B?e}DCc zLTF74kE+-LZV@3J<|uV|C|>>l<$GoWai|#))Wwj(ebve%Ff(-9-#=eKtf3LHXan~4_aoliWH&%usBA1uQwpA5PCvG9LT4C{zD=itp67~DUAi!QqyUay9E^X32^3wws%!CWSSe*0%A{r(NfV+cA` zD2g8mkA^?$N%R>87B{rW`#zB4%#@p_8*?8qYzl8-0W@G1DZ=f_b zhGwgR5EFF$d`yr zxUux2%Me(#5`UN+!M#sBj@Fho;VAcXcFCkH}^_Hdlgoc`jgXwwQLZtA?bw^dId&>&NQYR4qc&$Y~TZh9AczWg&UDb&xm_W z+!sT}GBE)L{TWb92RggE(Vv(UD0u}mc%fiFiU@>Mu_kmUa_Dk;p^&c7(T4cBX9Jy` z_~U)|VZ*>6S|Twq0pKK^#s&0;_lCU4WQu4EdQr+2(d3}O-46Bhu_&xqlIY2TEv9Nv z%1p%u8dNV7+91<1nb(eDX`)KB&2&0M$1+(mc^9P&a`wuFv0XtGi2{*LQaISqI-r!QXoG@|P!y(2 z!{`oWNnt~YHM3)=c_?$*PE7)H)BY#T!y&gNz*7MhlPbbI5TQ+((qJ=@-88F6SF5%_ z5(*;TC}P1N5|e{sm+Nz@(nPpvH))!1v9Yp;t+p7UCXA%M%nrA+FWLX9`TC2iUT+!> zmr#hUJiphPy{!z%_=`w@LqVZpVYF<}f*w<3hW)N1_4rPsre$iUar4b18x3|dQ!^Z+9R82ZQ! z(E9hn%V1Kve(~Nm%g7sL!~=e0^F?@kUZJcda(U4Z$g-!#Ms!5>P=nWmO*hBgbqbS* znFMqzl5>?w^0wtWsX?{$1hH!WtB=Dp4<@Nm%Db8e#cd-66O}Ty5_zCSIgtk=jWwEv zP+6C7H14gm&docVP-7j^JZ#;*0i$XaFP99wS+?)tg5$Yq|vY-Smn%Z+R%iBKqv@yRJU zGc~UtBV*%|xSr1BuyfZ=MB{NJGZ~~3Nt|%PNf;lW!roXPkY z866d*B9o!fkli@&ddh>tCSMTIa10I?|GzA9*?cYW(G&&=YmI0_99`{gxaO)$ao*|2 zIis^z%Pq13Z1S*^j2#a{t|iM)RB++ z)SeKT?B_LmJFZCnn?Odg3EIv{^&(p=tZLIC{!G0osW%U_t~-3vU$V^<#uzt4-l{d+JtG%UR8L}CU`ryIdw2n;3(1Z+J+ zxl%<=ui&3Qax-3gdkaPdhO4iGgn+VhQ}x2i^NcMsgid= z{$sgVK&6yJcT*HYd$%E2(eZ&xFT{U-?W>r{n`o^GtR$BJz>=UJN-@vA0DiXs5NPo- zQoVqd*7>;ZiJt=t=KxNRbkBWbgXoymg`eI3Q@rxr3z!{kLI0iuxbJ}np>}qVum|YV z*tq)-=tw4^-v2n%^;_V~QuDxvhKxUm^;Qx4ih0ZmM1 zuyv$Tg+FH_3Lc*iV}%U7E-#!OHzspwK~9(k?R7X14@Z&7r34mqyBty=(5jIa4(*XtFOHt58e4KsO3CT zbaxWHm50Rr*!<;i4uO}w(+l?F1+|+{o2l~<7-XZjZ{?So+HYQJ#QZq9$2A_|n z1Qw21Fb8Yr&PT7?jg7y01YKqsF(Z$VJo}#m)b(b;MH zTZ$=o0{kuvL82l~A1Vx{E0qv~g^qX!{xmZvQ`&h!2cp?3=EI5BKnw?RGjO#wqixl4 z_^!PMZ+z!_*tC5coO%^*%R)eLp={(O2r-i{qJfZaK99K5i%NxPiY4eFr}X^JIK^y_ zH=>-$qEarRP4hux>Mo~mHM?iYu;FCgrAp|g!{fvLbVle;997I%3_2nj;cM0#j(;>EnZ>Ro&r`=ng9sM>J}*+1h4Ereg0dWb561E(xewzmd(!VV zDq?-fAwiJ#!JJN3sHTz;+M(vbtkKKP69-aFSSMVzXh$gqZXmHV=6w zlPi8i{5}-26Ve<8RC2YQGO1_i6$335HXpKzY>FxGOHNw3CP}HYh2H-QJAhdyzYoQZ9%KSu z{N~k{;qkk%ck2!;n!gAo(=GeP?wwl^Z3hUKq z`1Ehk1Or{35YlD_Vc!c&d>U`x^8*ArsYSaKzkB{SSX4H#f5R4>c=qK`7S0!) zTQxm}$A0=V9CgN-=>F)((f{Tvc;M5w2_C}4EgZY=EWMQ2+l zMkglV4+Zhce?5)aMVIi_%RMn1b^I}S>Vcn$rFD#_N7a=5(&KcA2|&4+m;0IlpfrY{ zCStcvw;~8VHtg`DSk0p=(u|4hBpg2GK3JIa2e9_eJJ9)|588H3KA$u-U%llM*uHra z-gojTSif---rBZZ#JuC#EOM4EQ|n+T0L`sH&og1$9z8idE-5Z~#&e)ZXC2k!z>3aJ zoY%DwLBqt!XPk!k>8AlIcNvcTHDKRf3|)IA;*%4ye`iWL*%KlGpJ-m(4yQ0Hgyv1* ztm?LDRc2WzimJzrqQT)QjUg1fF{n@-W20Fd4+UrfL0f5t5)wb)u(e`4vx)hQAkTkg zA=H`&X`ZQRQa!TfSntS22S|3<;mw0$q;ZU9yDf1jtUDY+tt+r7j(4GXb~iR}c@x9# zDt=!w@K(7hn!l{P2L&#VhPGMl!mywgp{u10H(Y%!uDJLT{NJyC1Ap4EUTD0*coe@~ z_X2kBv~$wP3ZQc(sY*s62fb93K~OfIv9%@a>>UpD%$LbLY** z;NYMj4ef31C=@tcwRNta`|STgC>%y&W(Lt{4BNMF!|(s_GW3!z;%k0abSJeR68<98 z)=;=XXiOP8K=QgXs({0oBEf+wA`LNgwzc5uD=x-$mzGxQ>}e!M#N<>X@3Ef~%@*28!q0e8(4A82nw2_e8v(eB{Yn0wMpm zR8@1)O@`jMjL8&IpDu*wD^AwR<5kaUTYlam77Gc__XlR$e%r%;{30oAsI)dINSvMaG++b(R~xkp5~ z@mLInd{zWNoH8@;PA{97HM>{3PF66pdKP0UnL)mo6YifqxyWHoTO+3Wc41)C2Ap)n zBJ6zqHN+Jl#F@KcBItA@!if8F8gb2uu;~!aCHd11mlpwN5CxAHoAX7qE?)-K8^QL8 zVW6`ay~`KNRCjmZeoX2)neyIp;kD3rAA~kIg?XI~uwrH8w!eemOMgUbDu;j@9h=9;VLDY5Qd#&sUW`r+izC$9 zuGu(p;e7n+iC^MlAN>dd?VZ^6+zWW>hY#WNU;jFO_5HhXAF{NlwIFuQjycJJPc&bD?aZWZH+gsi2OmR97_X$$FZ`#1B-(}Y<=``H0CmBw=5fZ;J#)rWrjP5RV(jlW?a}tne~SN+;;OId!hqA zkA^h0Nz7^pN8qEVFO?AMyBW)nLq&=yNrtbAZK$LUC_t>W8QVt2ggVvK)PzhjCD+!c zXmE!E*qxk_aJhWmKv4YK%UC(@2yEKBO+M!$PaL^Y7JFeJ?gqMDPQ(ipEOh%(HOeSZ z(5(VHGYNDay%KA#y%xFQVcd834-i*1cyzAC0z#SxX`SCsfLu`oRohXC+2?GcS&aEq zw;=oEor_?)VxZOIg=Uqdc_6(D+pJ3b{1e3z+`%CFvROe|)PM&Qw1d@DXcZ1{ z6+|3PgqaLWdtj?9e0KRNq)B^^>EHkJD6qtw#P4yUYSJx?ZK?}eAcAz+!hoJY#i|!EeQGaUVm?7!gdBS!28zmXqw?Q|Jg`79fkhr4+`1u! z9F-mn*30WecqyLrVcO-wGz~oLtY#6_vau!ABFHuAqHvb^!IW@Lm*vbdY4B>(N0=}@ z0TuI4KMStK%TS7j@L$hA3rneB|F)f2x@ak;Q-)}&#>R)y*c`?&E04h28#iG*VFxCz zoIe{kpM4t2FTaf3`VEK_sfSDo{W1{nKwEk=mYsVMUc2|lIR4TLkhDy=R0q7%V@OWV z;EC7Y!Hr+}BG4WNj3S=Bx#D32$wD>;TmM=rrxr=O1B-Te~;ibeQjI&ES~a4TC3 zEzPq|ZITNOE{A;XfkFvo6+)F^s=R6#XbAYEk*ibCD3~tI?uOPo2XmJkApxs&;2Rwu zL%LYR@bomY4h07jY3!bvLWz7dFDX)GVJtMqqVQ`j%*-TEcDUgWg^^0nVDX}P@Tm^; z?b?b(-AytDy!JTR8sf&VDqr0TovS@Ttgn-Z5|X6Oy?B~8B2jH+=k|!Zfx7J z0b?FTkcag~9eLn>s)&tlTX(0_eC3jXOU}ChpZeHM_{k6N!={ZJaQp55f(L&7uvmKE z_uvCq|K^)e$`u*-II9k5ZWoH#3<`Q#nkKFlIxle$*xS=7Q~Unm5p=Y7V0dgq20u#{ zFT~Kuu$bOxnp-Sj86f9W6#V$dKgOk(ULka4i~5euoAKix--mVU)*+Kk$$I1|Ng=!C zs9Ckb3DpynJcoR~hzd7oo{s`&Rz)trV7kV56xUpSF+O+GhjFlfA9NS6X~#As={)H6 z$m?@`vff}b#o;gq&3vB*4R`WI6iWt1#>e-pS-$e@kA3#Df46A*J)4JT9(n3R!ASTX zm&@g*Cq3aEv0kNSfwThh*BB^5o?X@E^_vx2KfsQPT`Ygz?Y8H|eAG1oGF%kzTw5J4 zE<`Su&Bdm|UKSZS&$hJ}3wIIi@bYnbLqQ_HaEeY0PIGKK*h8zsx2~G%fZx8MJ56D=jH2>r^n`@-r#T|#@FU+)Op&8-{0f_ z03ZNKL_t(_8&@`15+KBg!a5&T_=dzZAWi_8LQ%xLC7Q#as^FfLAgf z*zk09bxG22Yg-o<&R>avgTt6i(0){d&+A5|kU?wEgV7zEQ64>rV|%)=_x0Cg@=u7D z)7_A;AT31QfRAFZGSH~GFs0ib!xhzoedQ9`k3JSBUU3!DCNNYiV#CBRHtyYxm_LlS zcWy&AY&%|Dd;IAzw)f%m_BlB5$mM`J1x)lK`Lkc6GB7NMk;l#YTtU|9!7ihO3A(|! z9OA$oFY)|Pk#JU@!7umhO2Sv@yB7;i@!&EAc%(_ zc?kb;@4cAVxeGoxk=)aduJbO$`fq$0YtB6j=-Y?KzWFUg4GRrU6;8hwDNdCsi1zs5 zbo1VFV|sep4nU)xrBZ?4=R?6LB5zW3Pu?*^C>`|pWVxE8xi1K)Vy z0mNI|MW{t_BOCq$Lqoz3ox5P6(8%^}+=^H{A}H69M=Zjc*}Z5pE7iKv@{gO>J>}G(#@fWxML(LC29U> zw@ERu!GgYOXFm92QS446(Gd>F{xC3;l0vbmA%=V=k965U!dXSutmQ(~+?)a~zf2GF zH8+~J#%2sokIQ?U?N;QwoXteessqF{^k@j%k~2tpT`0%H_~%dF3giqt{_xL{A04CL zG9o@NGKGTJH`>iZ5LF2WtibOg57`5MFeFVm4`9mX+dKg|yxpb&wW8OAy>{Vh)?g*l zj+n5XH+c|Ra-h;OmO&9&7LE*XV)!DHM_me{PDO%%7*Z$$lX|k=UuhH$1!exlza75m zi({TymB}Jpbm}q1nTPAQq^j6kn36`$bgP&!bZO8<$QukoPh_x21LFL?swzwlL~3Xm zJ>&fWPIrs)85E-KMB$to#>)mqYgVm9Ky9}r3tkggNW%ubEZ*mwl)F40q_PDmsw++p z(tZyTB^_C#D6bV047DovO8`!URTqLpx=5KKPncw#x*-P9*Fz12ZP}{Y46y&-9)I~% zoCph5w~n?8%5JX{?jfWR5rH7mmX{#GiXcAXkfgfA35@p2E|sAK6&bov)4-&9>IYN2 zP=SE#>&a|J(6#zXtXm(G&ZVlFts#_rA-j2C_*O#oVC~iK2j(rpu5kpaR$}v}t;iIeh)3g?*Vcf4z4i(?|FjPg5qIFTJ3#;*Gw z$7#o$jF$!n5N?WK^{hs`_S@&s-#>+!Y+jJxvRRbe8DGGMfvIUkBVl-*DvX>>C#3~; z_sWGh=akd&>^HxUxxP3`#k`;h9?9k5z{5gMb34k(Jp7z&3mT)NUoXM(0?8s|7{S2P zj$jBOXH|mYs-&U#eArPjk@NY49#jxFA;{!EX8@7*7>lH2gWBSQS$lG-rI}5J-gv@lrgWP6@I0R&X9(tObW-9oM_D#;Wlz~AApP1ybNQ> z?sXxo&~7%5gjK?-&)f$1{5bHfyPz=#g^DemSyN1!w&`ljh%mfvOj!mdavAvC97otS z5y^C_WeN4qXI7w@Hp0MWJm6A58WXjCuCfWYMOiRuaPO*GZGW+MANA}m+S&^*kBu#@ zV`=~DaA2xpN=mfuR#Ao<4kM2>ZZCpmdtj!MO0H59W}zHxK+CKi?AfsuQ$7{Xmy7sQ zsUl~-$tGM3MohH!bc;5CP1<#rUnTS<28~{F@r8K!p@$?#>7zH@gn#?$mjwxk1#Ie) zSt^RDhoKjRnjQ4|#Y|gFbDS;&Lt#NJqOk^a&g#bg1AW-Ob0^L`=Pb#{di?Rnamgi@ zV0tQn*I$1fXP$XB&OP^hTyV)nhc1Y2RB+Ed_uxxk`I3ayQU4&+9Rb^^p|GI1JZNer zzeB|zvA6gn4@Xyy>g=3d2M4_01GaM9M4;?%i4?tl(b0SzP z2LpaVR(R7)j*MYksLM`-A~8C4j&!wkoO8=(KC|WT-2~sWd3gF4Ph1rah3?OnN?wtuu6fZ+(~{Q=`U5iF z@p}Ep=d zh)BIj;dSTpOK3>Bj94rt#j0tsa5O}iOEU#2CP*8oHClXKTE(&v5tOD}mj7?z!i5+c z8%HP{Mc3?JB$657wa!dUqlZEr!$8cwEWgi(|c^Q+>UKUT7> z58M0=2zAWDvDaRQm-g?$*{Cj#MEH#bN>MltZH-5R~S$z>dDG zLv^@>ZXq_Mn$LEhsahhOqHNYlRfb!GX^@sv5_b$c&WQ-A9l%A$7`u6}{ork;qk;@Y zeT(Mc!t36TN5Ak*xXa>;gRsvHzY@pRTnfgDRp>hVEDTjFeCOeZ5pHkC&b|AvV%ZVG z-Rz$n5q^7D?<{d-8Q!u(at%VE0G7<|!Gd@k?G+2V9)AiwsGRdqTd0VnYtZrRkiBRXZl>r`A7Yhd%0up{oe@*PKspVt>O|1zN1khdTz^hW zH8;izMRbOOC{e4Umyj!0q=<5AUgSzTrZ~)?1!gTR)lce>1++&RB>RElYSz}AO1Fi> zD5O(pp%tudVv$ROml-o|6-ld%-DLv>&57-L1x;N|Sa!@BEIaQ!Jb%xBV(;dy2s)f_ zmP|DIBFN^`=m@l6GB;||WF&jQiCC-=gA-$DaQoqAMn$!XxLbv%Qij{2@USAo5q`%u zTHt`gtVk2d$+Hdz5>{E>Pm+{KhmB}xv^_N}G^r{YRS!Jn3c}2eD5b@2vQ8oRGofys zrc*!MYXZkZiOtjlkg`*z|C*hbBljR11x_UuMZ%`4ULS_j2}~0O5N96;#!*3QAPO^| zM6&{PMSRH4*a%d6xCQBK2Gdpn9ezKY!)UR9Y4ZI!9g>N-375-) z+pw_Mr$Hm~KnFgCaheu1t|QBV$#PNLwCDuIdW21;xLt8gF^Lrw1QbQCQ@mP%k5ocI z^=zX_enN%T;Z7Iynvj@w$2^c(&>xNt|K&mY*DPS`blbo8(5?SGzb}InS*{;dMF|Sh z6$R~(6KYZuID1iyXtWps45V#|hiaP~RpVb6gvOlQ+b=TmSh zWvpGb9NTy7#L#eB1k=YYU5E>pE<)AaD{FlFs zN-m9fV+>|NhndQv;PT{XSHJc{oPXje(3UR*I2@TA#*>ddioRqT zajzHNa#f5Es+xkaL<&s|++tP&o9#kT>?z3^UwHh{IAY0C{Q8^UgJto`0x?As)Q*bD zCe4Q>vwKmQ$ReMZM$qfUU@?hHSNPEBnqG|wPe?YErI+aIGbz-J5h`kJ~ zba}*VAa7=15z}#$;r9A4mds+HSjB`##Ta#RK|effa)?5YPGL=`3CEpq9G)B5hv94j z)>IN!Duc_;J_9GMITFA8>3wjgvpB*XgfE>%HJ?XIV;qTM8hSd9X4Q`1AY+8LT?}RN%;!$h`dyrjtp`KIZ~pS0DPvhcT{~P;yuj*m?ZPYtc78 zg#H72aNZ@CV%>MY2iM>vtkeuz#s0yt_aP=y`!(4MJ;e&Drf$=bWjJc5(KEDBw6S7? zY!A%pGbQoUAq|MAvPH48Ej*{)s^M}XY5{XCpw;Ptp;nP9<-wkrG|pVqkLK<<7~FgS zlRgdqg*5(Huq|k5-OO5!=V&147rkd&YYWz_S%d4Zy#~)c^DG)08u8t`zb%<1v${Hv z%A{aW8(L*Zt%_2CL8kztGQ75xq9CR;C5(kVh(;s0_~MIk`)#-5iKm{#MHgL!Et|K9 zW$RT}UWwo{acJe#3v3nx%RjZ1&Sv|;Q@{&bCeF*D1&E*ouC0@%=ID+0;vvB@dr{eN+&%mEH zyn)t5^H3;PkeWmMKd0 z3O#HYI7Z$vd0Y%LVxd6+sCXsYlpr<_v>W4OR@_5eG%B?u0a*?*!bapG)*LiADJ7+c zq9eW@53{n11T?@er3D>TkYAxsbWTn>d?9{!*YsbmK6<~Sn3h`_+)sY&cNL#H&) zp(JQN2OA+aBBZ(SQP)(6_M_&wbjVqWc7+t^Iov4f6hv3WijRjcR27O(lN(jjZ1J0w z%R{Z0GPR@dWulmarMWOUF(pkFIcaQkIEAH67+;Ug3_l+qd|#w~@$XphO-+x%r8*@b zh;SVXPbpLd`gcl59K+#^qAnaq77q&+EkxgeK5=e1I65p1p+I$B59W0BU{OaWdV&Fr zZ+r*Np+TH7XBLM3^cq?fAX;SzkXzCzLkcH+Ov5E5gNGAEP6`rLQ;Jvm5S;Rne?sHY zD=}!AIFLxm^zf_?eH_pI=%@I`H}672XPZRC-*?}=Xr?wIF%6850DBGq1O3?Y;KOhX zjUZm;B*+7^Vj*V%$#NN!Rpu*Dhu}a;uOdOG8ZyIuF#rw`jpLmB3Fwdne9VeGI0v2?WAEYGVD4y*^!(Sn-7_GR^eVe3+KN7dOUgOUC@dJ1bsGy?6pFe(ERXSa0VjB z9f!9M4&iG*{4v5ko!GK-2bL^cj6^btvE;N^n}%AN1&K1Ild@)mfdEchvl^!^UydF{ z!Mb~X0Cjv2a}^CiHVQ8ZsrVGF4{Hc#i3bnuIh{2G%wjPc z$8;fwv|&>eXnWfejG~lDh_xZ7iHlrr1WXoUCQ1$k1JqhIM6h)_g>qPf;`a&1_0$_b zgdLAQhAnTth2-cAntfp?dIeTRM}rzfrJ55L78ZMPw}zCVquHUsU9F&5^B@dP)H(Fv z8nO2^e$UKm;DeldX}sVR{YHV#A9NJ5Oi5RzwQHhOMuXoYSr<%$?Fz?WrZZ^u2T?II zb`U2uiEIdJR*JlzIC>7H7N4)zgSYP;Adj@roE=kQB+se}0?6+|=zVRCl!y6p2Mr-tEDQRrC(mJzhC zt^W7sfsQP)4qTiDQVXM?>~UkBn>egzu+*0rm?dCmIa|V2`L-l`ZHvX1_*cPnYqDkgKNa8oD zf<939Kpjm*0}?vW5Dg%k%E?-fc*95)(}*g5LDTcJ3Uzr=rK?%F3~x9nL#xs0NsN=$ zTSGC$A&1?jB%C`?bUKl6d2sZ_m!ajjlSR1w&3nFsSYreSw(ml$u^C#p8Hrp5*<1=% zB`@gY)=k?mGL}Uo7{=vio`R2^@jgsH`4q-p{2dz2BDx|mlnNI17G}`UI~S*X=%4Z0 zH@}G>L&scBB&SpMx{P(;h=2PsO8GQ0-YS~9X5n`qz60sWe#u2(?#1Nfm@pZNhAI0& zv)3z3ge)6FIAqQ7)*aSqHq2R11Cpg2B3&Ig=ll!stGn)zHj6()gdtY7er-_Une&hX8r=>!j4I|ecc6b_*cP)Rh!NzGjYN=ThLRRW^SoZT;x6nP z+>M#>VYppxq-OHyo6aH?jAC5#Vj`eHXU&vOqp4)!f`v!m)KgEx-Rqvjmi`0iZEAt5 zP{dhlj>Xzzj>f$|{4QoO{PpY$;mj1!!U0b_f*Gp>gGL2fYxvUH*iCQ>SJO3r5Xo!@lQL+&WQq^e>Z0{|0 zTB1;yxX(#vVJ|;64;)x<$Kij^IDpO73bKk5y30bS3@oU+(d5vey9^Y{b_NpnigetI zmhQP2-8g^=j~BmoCh+^bow#0A{V2;I%^|LVqd_tU2mv89Kl4 z{BxL2*ts@*PaMP&Yb|8+wq~_riB&6WSb_q)PwlhIf!jWHD?WAWt$5>&*9E26w0Se$ zeCsW&UAqm{OF@sA(>3c*?7SP7a^HWi?#8NUHh5;oM`Q6Mw>Qb54t6=beC5SIaS|MV2br=~G^aJ16f-TKiRZ~6addk-i{ z&hlLNsp?8yohPT=*}U3aZBkezBq1Ro2~d`h0D-}P;l~$@2{yrSg##wq*cg+;B?%Bh zSwbL$1d>o#ZQf<`?99&0PU@Vhs=KQ0dEV*~*ax43&-LFrt4+N#-PK=x-}}B#dhb{N zm_6(FpYvZf4-fq4-fQf1^4p3U%aHSE=q7r4dgP6akB_4#lZz5?c_47}CFEMnizv12 zIY`89DXK*)Ad|^x!WvEQqZ|nS+O%l>>cNVW%s|dFGZlPkK3Kdnyo`&H&!zi@gto~k z8I95uPSibLoC*XX2oza77 z1v;AwN$u?9GYEZYv8m}a5S(F@oszg2C~XBTCxBCS;naBes7RzT;#GZWZW{d~eW=t5 zP-DKp`K985d@ogD(OHKbPYMFVR9T`WoHRv^OLT}z1K>IGdWfu0z)85DY2UQ@lyuR+ zmxhc#FE$UnjudsX!4-j2qlwXFqo|fE=<4alHP>H*L^28JrZge<|Kwimcgh(Z zS%W`*94}q78k5gFB}t|!zm1&ExV8|PK*fMd8U@3f7)S$Dl(x`GYOV{X9ikfeB4jRk zEujyMoVFgX_|rFHa()KKCZ-TmbX4+Xyy8#Z0-T)0r#||>(Pf!nB8697z(CS~(RKvY zT6BTnZPsnmZq!GU-8OITt}G4|N=T|UN`{SXx4j0bO&jpop#vgVGj$u?Jw4ca-~ckZ zi3?Y5z$NFNgO7jY{kZX_tFiX1t=RdiU*X4hd>?Oq^Pk|C&pd%wUUn%4as#;goDUymPrI-*lDA3 z-d1?0t-(aSg`YnE0U#KAY5-b6v7b2mWO&LtV#IYiUN=HK*G5! z5CVpobzz}dlY~{S6_cs1sVv-T5k01knA^ez-4a_#8VL~5Ily}+XX9wKfzY;4t2i?4 z86F(KtKRiaz^USkpZp}c(%qPxp21413oYLJ%=yq_sJ7dJES4)}q*V)A;9^ZrKh$a& zapok5c(>C$bb{WPY|LbG?vdOR>0HvHa2_fewBclt6a=tr6VnYBacUm9Cr}%Z?Sfiw zB0*|P+d;sIW;DNw!s$Bp)TEipteSfk8;i~!CTNAAxDl7O)62-`B1l(*X}v*`5q`&QtKMjwI}b<92%pZniEbbtT( zFNUb{wXqqeJuy*m(qjAo1yVxUG&wW~;P5Agic8^s2IV?UB$!f8q%tO)@+PmP6^CLP zqRpx?!M77M$u+@Au5izNx>o^Z&A`@cZoqyw#7xk}iP>oy1P6k|h|phi15^Tsy;yIug! zIt!C`{zPbrrB)p)RxE`^t8v4^W1skElqZg%n|Ct@qz3CYqNE{G(8Pv1%Wk68?6|;1 zoAP1_yl9%ieIlfugnORsJ*t=hkby!2kR5bZiW|Z_iMs(dstM$nMDN$7ZjSi@N(fQy zN?>SoEhcv!!)(mNPhurJ;dxkq23KJ%6b(LTL(lq?dzxmN80hK4^r>la(z@lQo3V6w zL^88ZO-;eHO$;tsg6Wwl%+8&XeR##_G7Jq33e|^VbGk4cA3KUiANe_!uNW292J5uB znHhZJJKw_AZJSVQ)bQ&kpTqKHgXrn$#g6Cq;QR~D#y7tDbxcm2#Mi(2E$rL3A2-}^ z3r?P#!u=0Egz4Ft$RCRPti1N$ZyrWasWt_Pm(QAxY90DNEzXIOu3fbXH(qlU{`9q1 zq&0=o$6xyx}(=gCz@TQI|Pb2CQH)mBi;U2lQEf=QE36PI;It!naq9#MlLgC@& z(h<*}UhiI;2Sgx2FHG!gcNz-cp?EN&O|al+=o=q#)0Xfec9!vkEk!p)XXN`+T*hXB zt|^QX=iePadQ6%Q27>U=5)m?ykWS?L;(;L%_nkCsFKnSeaacM5zZs&uP?epU9K?i~ z6u8}WSk${n_hwLTl;DI7qv^(>#R;mD+FdOcF~T6Mwl9l=O%GqEM~w=@T{_mfd>@NcvjuWQyK=&tTeoH{-v6Gz z5Fh3`M|oNdKmPGu_{p6=L{3#OzIO*kVhS!^w+ds=Zx_7-H*&r*78$h7TrPhW6+CqW zs42c|?vY})$A5Y+f_e?B)~v_DAN&NzpL+q}ToGw6fK6%|{p|wepeDMDzCt}H@qI-`N*eXx^?6%-XNqu0BmczUws4AEt~M{*d)IH&?Cr=F2M^scVYd?H8OD~ zlEDO0Gr_g#VDivm*x9rsm!G?N1I}5t9HW7P=fC@1^i(QXriMr>J`9x;CelBMF!J+{ ziZ3>)i^c|vKT8weDU}&ilrSyXB=e3V?ii6jKf`X~DApQs?Ya_a)ao_R5V22H(Vfd- zCZCrB-b%(fJH$e*5jgUHn`b6}tk_kHXCVB+9$BwH$atOOdhJi6&n z)Mz3bPodhZ%HbNIjWzK!QalvfE$E%JRzaA=^(V^55N0GVEf>Tpj*+AHViOjI_5`VZ4^?!NKFzV0p}?l#B}jM;P(}W5+9-b;DjPN zzBt+D=ewx4p?0LDD~P31I51xkLl8C-EIgBT48?{ojo(Nn16xmEW?@FqV}|CDrp3Qo zVgd=DDe5|iC!KN}6o?wD-23T7M9b;`x=+D0X-k~QMNKNVC5uH$XrLCfQ89tQh>5Ln zzU9M>n<)D}%3efaAc=wk*f>$b5EzaDDGH6r`uAIA8fbe}Y+1h=zukWj-SU@Tklc330o_hh_{PL?Yf9wRZU0IB5ScO8G z6xj-#0}}|2jN>=o{XQ<(x)JOD?9JHuQ+=_cs&&#T0|$2eMf$D);ZU=G!HSdR1~4`lBO66RWX#NV7Kc)O~s{g zGd*C7nL?MMi`$`T#1Qk?Jou=0XE3yMHO6-y#vBaXixQpyExHvn6r!LVaxdxLT;X(E z(@A-6iE#`YgO7aVBlydA|GA_Ek%d8J+dmCpcV685L1P)^! ze)vJ0eb!mH?n01BBbiF0*UBOV9bT!76I0_rcN{GPs5&+DX1kD4 zEEsgg(=0r{eHTvU%jh2&_`%3Z<4tdR)9q0%!5{hfuQd;M-t#skhJQ8Y6^pbJ7A;bMd!7{IVspj~ zo8f5`WOlf?Vp;2RqmHJDPSZoBQbTWdAIjw_db8cAl*$sG#Pm>3;WP@B%6U}12F!F^ ziuUR0X}NY6zT{#NF;9$7V*B>(Si5eW2yrREWTC%darf~f~#zN+uG zqx4{giSUM{SiDVPQcT1?d@p>JOkHd`j)-|_|Fxv27ZqA}1_2suy5bgcy*)@INMEDvI0+sFy9tF;9c(v<*NXy^(Rba@bd zsbN$2Q-)&dm}`_V6Uj4RDH^nF4|>nojO-iU0Do!{v9q=T^j6N7SYZQGC#3^F`0?A( z#RAFokcg{NVg)XK=UZ_1zFm0R-``G~9$bF*IXHS`3=ci{ zFxH)UE_Q$84xmuLQ$M{I@A%7i0jK7PO_EC#S<4uMY5vih;F=An4*W;kos;6&ZUW4rf2 z&E&9q&mOE@x=Q%1+^{IDG~$++738NT5${e*&cnGIH(=|MVT=Yu9)5uSdJRME7E(kW zG(yvz!$6P+KxeVTz?_J^FaJfE7ZGMHcLrUQ=v=`fpE)49CL1j()n^(!r*9QNh{Y{5K*3VYJHdw!4RWA&^!=%5Jw|6xvAWX$OD^) z4Mtp=2S4!O>N@rl(X(Qhc6{{Yy5N_ZFz70!lQ!idueGq|oUOR{Lm$L5|Mo>3d}b#a z`2zZM6WMqibCnX}ijH>JLZ6X>?^Q7pv(OV$5NC1hN7soLC88}YHWAUi#85ca@SHje zty4tu2HGxN#5`0qV2)H47Bo6w)+7B9vqw@)gVihva|(GM2b{DM>t(vIw0oVe8Z{GK zQ4%5*iv)>s{dh=r@L_6tq5#mS2n@^^)IEVqbQh9YWRY#vBlaoA7?Tqhnhl|oHmJ%bg!R%E)tMuzK*g`=;_G~0>C z5HmHgqAYq2PBH_+B>JSFS)Pg7LkIx=s$p2$>JLS~LxfHp9qR?5dJ1 zE#wSKM@59NL?~ktgeN}wypp6q@HNL`f=+L3-UqAX zpc#0wZp@^L{w2e>@^3#T$?uQ6{T=XXG^+vDY+5Unn*6+rtQqYy9GEmi(jrw<0~H0g zEjpKcaaOcdc8uCV8-BGB1=DpXNK(h~-}`_WM0T#seGwFsJH zLhWb11dTF?LU0c`;MJid<1z`4`M@SCgnv~hmU^vqxkJ__u14DJD% ziew^*O0^<2p4W^tth~R;4&ixx_g#15ZEt%!-u9sni8CTdAz}tt+{FH8pT&j?&KF0Q z?N2?8fuTXv8co?F?!V^&OpK2soyv$E?~WZiaNh&>$pD)g`GR__aFa9TzA8b+{wftg;UMfzV0UTFPb{h=`nOs^B4l3wP+k(l-vl2*Q?=+h*p`%Ur zjdBImQdzPM#8sl{O5>nvIx@K&28KtlP%Mc}*Xp%vv2Oi3ER;&ZH@)`SYo(c)nwpfO zm7N{w7A<-%3)B{h8%|8r?xbG@@X00RB4UBZLeh?7c-b(PEE$#nu|Q70P>@92!1(bo zSbV-8VCK|3hL(;Zp2^_3UAtuSFIEa@wH*`+3s|$}G~9U8P2!^Q@{3-I^Ivuu28V{E zAt9~n(#tQy*zu!szO>pNjvqfRf;GQEUuYil5~$GQI$Ca9Xj*K{bxW6N zIYV0*drpC~N}80RAv8@)=NCk5mq}Q7`Ag2n@txc8!p|PW%QmgY_;Y(?!n24x#1$YN z0{tC?A-YP@Ml7kQ6j#wh*&q*@A%iWHsR8KNRQd+c^aXiEEN3CHVLiIu_r9pp&KIFB zT@E+_@c5Gmj*UTGF^cg|e+s>JOei7Th?prMUewuc94h6ZX0w=Uws6w-aOxu)6d}Ii!a1C?z{`Hz402j z3k7Vx{Bpo);J(j&9$~G4HK}ft8x=Ig#U*<1J(E+FiQ2R&9*>H=Av-A{axBqCdI#iyKRSC#5QctIt7=V|Hj?)$>7+60qg2!x&=}Bv zT#ek(gwq_+mKHS+71Aj?&BF?69;!w3nmQJn2iuP*jA7iup{9eTZD73NA!{bYb%UrN z!-9^sE9lB4Q3^d|M}~0oTmB3vRPoh+`WIOj-Bw&sL~_8Z)lwvw_L^9c>q5L)7vZi> zN1@Jz;ZKXMKP*6~C*d@Y7s=~TvN%BDFol`~HnqF!1vEAK@&n}tuqt7oUH62llTuXC zlW?!0v4l#SQn|iFibzU`nmcLiI0=+A))1{29es=_#W|$iD%W!4sKPyq6EE(>q|%6s zOSL2v7*a{3snBAmb@p`9GK7c91Jk~Pc`uN?gqNxkM6ZwcCtabeR)}uC zE+d9?OodLJi_ny!q-i3_Ch54$xyk2IcU+hqg9(Q&N1f*3{}0*{&oLr~yu9RgE1l*+ ziZuQgGf*ex%1+>DgLj0Ani^m>05WM4<*FMMcb)qyDncTP2q(QnGMOX62Ax0nnMKWM zbZ<60TA#D8y9vK_f$?SoM<&N%#5J)#z4Wq|WB1_+X&xN64yRGVnVU|-(Zk13t|}Pr z?ZeukZoK2F%aDKM0TiG8jUcl`1~Q1DdvFx~U>DAL-Rto4zx!J#)F0Z06rhR&%(YwC zdh>O7;=pbgsW`5>_!2zvgS%0jIt9*DXp@>2@ZIvH1dq)~&{hi_XMDcYIf@YKc6WdJ+d~C5#Q^ za9C-fNO~f>Jq{(+HcAP>fsm~$P`x%L<|^n}nT6h;#E_N38Lb4C7CcyE3&?0OG_4pe ze8X!o{fl2>|8p-O%aBVghPvisp;3jAw8T+o_3#MxKKmSUaT}FtLmD2gEq?y%`g17F z7G-Z8>Q3ThzJ`D()B zdl95&BM_mO5w)BHG9qf6su4-&{=@t9aJwOz&kCuD0kB-NBxIBJw~T|(+7Krxr@tG6 z%U0v?Zw`Qg1iwH9&m+W%4#Fk(Oh?xx=Viy(!_Y-mD_KUjz2;VY@k?LAk^Kj7`~SWj zaa}{!wqJ}PAZ6UNOc~nJx}43!;!yVF#0lJZ)6KZ@- zg&+?DBO|CT(v~PdCvxw4FsOSCe6dav&O?YCWzfBoXWV$7+K--v;}A*>o2 zL2oRM!u$;C453ZOMF&)O9Bf^^0hRd*y6qhH@A)kh-NY4FUA5zx-#mTYd;jKdC{z8T zAAhiU_~nm&lyss0y{>8R^!-q!I|>EImtKB3%&d*4e*G-2zv1u8Tr{6v4Rp#b0RJd5khtl>(<}pH^>xUr#-7KG$x9iSD&_47S-6@`(%Vumo<4la7oREe8hBv%MbQVXB9FpSQZ@D6LjcJ?=6XvFNBjWrmZq=L) z(d)iD(I<$7t2D6r>~+|4a69(ydmc`+i1PfLOlI{^N8HMyD>sBIue}93_8mnt&@i8$ zgW=N}tO`4B(J=;c=oejr{E-vrzVu39Vixne_M>D^BS&)FcZ;M=ITeiE0J<@+DYu?bUEAWhq{BOIHGR9J6D`(A(WDlcfVs z{0ax3e-?>^g|XrcMzUQ<8F5U`O<~)TRj8htN4;G}nn|Oix3sD-sOjPK-gSlc#Ep_h z0DQ0r5m$i*(Gwo}!bR>_c=Gyj;?-_5C$gsP9HjF`2FCTTfOY=4cy|00K0~Y4m8)@Ld;)7nR-iDq zAnS<;6*Wc_%uh{EARgD{UcL0ZZFt${jaZ>-c>GIWhB18-t1TVrpbb+aFP@Y7=)Gzo zKTB0CLxokpXq+#6`6wKZo46jg=Se-N`-$$+Kz35}k8c&)BA6S~BV7iV9Z5J1jhh!FRt@Iz7hd6`L zVj-lx{0Vu5KCFnWiV`0oVhyL4RqE~Vla&) zN{tefbQVV|1dr>SsaX2eQ`87+pe$M3SDPKx;GkIg;&jO|mH?eM!DAi%1bQ zM}cd8sEdmoLk<(h(%YJh~-#`2Vfl-q(CY9dab@tVj(2Wp%?XQdA5msthwMQoK6%tJs25AW0ED zwFVvyFGvfGsJ4sldjHjF`u{4J{+)`ueS1nQcGlOb@y>t2tpb1uZe zg?W7ZpFe}8%STY0n#IWIGF00{KRi^bMbv9~oN@YE96op$3xzg%6B%56&KdaNwb!8b z@PinC@A@$VRLM^u#k*sJo~oQ>f5(w@vLD z-O5}nSRUGId$D}&TEyo<9DZ((Ot_u6g7l{4*tB{Te*3L^F<5M2R7;@ItYQjHT=TX! zWBh@iVd2CiX6y5UBW0i?t7K3JE9kPaqGJl%Z8U-kELf4{ykSb#O#>cMh-1x~wRr0A zE_4&_2uxJGD%fI@y^*rgGSHo=&x#2FnF|{C69jU0NBJ^~_@yU$G!B+5jprFHZ)4J+ zYjm=cFgXrfJJ!TuM=!*XMh+o@07u}-+31nl&tN_oJQ^@evOIV{gedwgxC7l7SiTwu zpE-c(c8Di~3SNMZ6EUE;IIZGFx5(O$n6oe5N*r!)-Lej!`|M|tN~Un%efJ95WCYZM z`C>C|Cu~?&TsK}qtXDZiZ`PaW?d`?6+qOy2?TYRJTy^D@_{8V_8QU(p z2)#>2@X^2fd%Wwt@5MXb^{(hpUwnOPfSo(GAiWhc2j~UI!c)1|7Fr^(}Rk{~jPFn-dZD78%fboTC z%oj`O?;gO4B`b06mTkz-EJ%2qqJ+DC`NZSbfAIF(*^B+rk3ZNvJoMd%(wgf0Z9Hke z(=aS`em*Zgw`ZJtE{tRXPd&c_Z+z=p@v2u|i&e{)M{X~sg$rMDJ__>-I5jniY&s=3 zal($AjC65$Xh#8Xi#$=4Jh%XcZi&t5hD{qVF?kYq-gCDk<}sU~(d6;ghRSRQc3=FE z$+xrOuqev5lNeeyiXGcuzy;@>CvHW@j*Vfke@H?w7D^Rt*n9?h28S_QEaOk#_WxmY z&1o1MULsaw?P>{sdfP41G>ngrMH&mwK_*2XdQK@K8!(T;Y9=4b4G=}T$3h)}XQIx~ zqM(8+uDJ+z-1#+(kMGAoZxU;kk7BsD9~nD?uIw=GfB088=c23d_>;Tgn<-h8N!3HM zQWRR)mNU+hqUbN*^B!qlmakkPP1V5g5H@e#j9t5S3e}0PkDCpheS~sA$E#)w4Yw}M zg6F&96kx=4RLgat2a)GTezUGJ*|#Ox3NF)qjhMjQvfE-ji6dtN9L=Ug(0 zO06d0CSej#>?9VNO!rKne`pk?*%GvNfT3gx3**PIB$I?&E2HH*^6v$)qDQ{1qSy$K zj_XhY6`U3tS{enymGnQiZOoM_NF_5UG#jWJM7n$wE3@cT)1qI987hv}A_s;6#X?Rq zP;OPQB|C~lsNqQY7zl`S;_U`LtfVbI;ZBoQs|=ShB(ahER+6EJegMbkq?IlysmKAV zUPFxyL8qAIKF3Xyjl&{qnwM?y*Bv|W7bk^$J_`qZ-4L#R{p<0g4}TICxu>14msXNE z90HS@PlJEPW=#4jzW3;(NDPhOE916scow`mRN6qBhFI0*>Aa=@Yq3HL001BWNklr#y9dJ|#QN!)RBpXdWs~GjeI-gffwZTaTItotg(DE_n%_>Vxrh6K)GiOvkiO z>*h3yPF=#f2z!%?#6zV@2ew=Wtn$s8A(OAk%rAgsd@>SAi%P? zg|yceKDwtGm~DB;GxU(xjwqag*E;_^yivMVm%Unk{PK zTq`O(>Vbly7orr#P@{mI=yR)uLEA#k576(2$OfT&=H$SKv5u&p3E~}{9BG|=L?#(5 zGNVi%nG1FV|FXV2fA;@s)yl8MAq$aX(LAtxldweQ!m!9^!>&O!EtH&wxW$$HwxDo~ z@^Ki}tH-3lb6PZR<@A?{)RZJgubX5vT9Zcm4B6nn`z>gld z4+BHJ*z?Tuxa^8oVCTUxK?>{jGFo00=bgC;W5-UQP@-*d2A8f|gV$}{jQS&wpmksu z%#en|(c0qc>{+`O*S!1Pc={8cfl{qV13QslkbP}n#Y)UnD@b+s;Lx!nGPvqZWkmm! zid(2Q>X<(^@pORjGS!*6*tCLaGeGU+6$`7$zQ3V~0905+vGCJSL$HiCEzQ%W7)iY(S` z-HPJgNhswO+HDtV#zr`tLw_a+fVQ<`y_ z+|XS!48(Eo5Uqpxwm5KcuA^Klqiw`QM|E;?215fQSl&O1 zV+W67aHt=TJ@&}27Ut$&{q7Hcm~6p6`tgU6hi`tr@22ws zH|U1bgdI;s1-s*-x363H&i6lbKXTnU%opd;pszk{!ooKC6G?>Ss!SMfy7HBX#Vy!N zM=@Wo;eq?^$J$kE(bv?xE>6*z7aUAb=gnY0CJGZ^a8u_wkjDj0V*juvgqC7v3<)h1R z@bD3#Mb#R0affm{859ih+O};Q4jeoX*@3oP;mt2!J}MnDdD)yy^BRZk$d!sNRirUF zbq5-4Vgp5f&%ambe$Wo#IZb(9e}6yb@(U<0%wyx)HSiYZapv$Ka?L7cpL!Bku33%J zt{oU?`RGD`5i5z7(?HrV;f2j8)5`w^Ss>32Vl*2@taB(Uj*EzC{iINke zDLb=z1CD=~Rx2FJ0GdJzIB}ns3AYqrBFy4sJAkMAkxqc$jyz0eu7okPS@b9|I7CW~ z1YC+C<0j_O#zMUUgQsuH7rF<<>yy5NF2j=K>~^z)EGV;eu-qO(OYvpeI_FlUDNuCM z=rqJQ@nZu)bd8*G((C9X)(*tggxv&-x|FUVX~!k$l?9M!bz~nP`Itv~#6@R8BYTY? z57Dg|GId=<@NG2d`Mi1vTduzW&wuKR$clw=Q;N=PY8WRC3*}4BLF}Bf@!L`Z|8&Rq zVUcIKZy#0-G1tL`8Ba*_K)n(zD(9z9$h0bvO5m1jUWv1oEx||tJo;~6K&Ft#D7oWG z8-^-5>hhXoU-moAAm1b5Z8d5_X)(+|Hy#L1yM^Aq0TIKMsx=hrlnF)+(;~g?^h_5j z<$@G7xm=g5jmi8RW;&ky6b*Cjkhak3z|x!;Q&h~wX0;b5>k$u^aQpI(Rcn#y^3psg zSdq@btrXB3HxX;PQS(3u7;U&Q4JTX=fo@=;<-xL3(rA(@Nm#k%I!N0IRO)s4xzwn` zPNY!xUG$DF!7D!W0aTuP2KWEu9+VdH7`Ef^8%+$8x)(;%w2VOdDztPOQ{@tdlHD?N z;QD5RBI0bH&8P+?MiFoeh82fK<)$p97+QJ^H63WMXm&|Spqo_Wro^lXx|^|4Vj`}= zH5e+Av`j>THyCwSEVLC#b85&WXd+pB{d~}wiHnFjm^KS(pA;+`)1HsnRvV6OqSC0N zFOh&zuVZ5}4ZGXXI7XI?VlrQkj7mr? zc1qZ|b_Grx8%MbYWDOfPzT|xT)vK??j_-UOCm#Q~*qf?NhPsN=0cyDv-tygV0x!G( zICV)#7MFl{h9WSa+C;NbmG43JLQ*qfl2Vz8OD>CTB!tV2Mx`@#pnqlz=;@*-J8w>) zwq=l84K6s_7+`B5Xpqv_Jrl)aY_W{%z zRb&}TX=qRzHQ0uRg42%dd>aj+x5&EkRam?)#bO?^CRnsH;5Q0}i`)@7fFw;c+VQ?IS*`t z=`0k;9xi$>qJ&Jl4i(HcqakBFX~Ac6=LSeo%aTZl$${O|jmf~p`mJYSeE$UY93RI) zcsOhrnCc(JuK9Uc&m1b$>O3h(GDt|#FXwEG>DbgJ1OOwr_`OCuBIutQr~>@kLm13s=1C zW!SRrG~9gYrFi1;$Bnb%Uw%1erYBJ@mZVFITa4>=#3oB;;S;t+uuB?{VOb&s_S_I- zN5?QavII*g8he%!_M@e*mTiWV$_j9ug&9C zmt8CeTccTn#`Ht@Vx1bP@WYO~5%n<*(PmI6&4!0iaJ;)0C#O%MH=D$gp&X7M+=czS zpTUJ^Z^0FpT_UbegbfQ-4?n*D5iC7z3!dA17}KQ+(y1;%RNBo3x^g{ue)|rgld#id zNEV@V$91K+PbF=PpFAN&0PQTTI41%snjRgNqVAQJhf)YIY|rt;?TQ%=xm-qaFZeui z?WOr>y5crvY37T$7QWL&e^(YtDUX+(z8>jP9)})!0Dpefm6&+qab)>A>6+4xrVlLC zWN^sE-=X6CzSDvf^jgGku$h_&wfRwUzzSW zhzy3Fi9=AZYor(6meWyAWbw$ZT`&g*@xtCcSU$KE&01ZC06bt=Y|yPFKRbzmT$f~_ zY}>pEOX3DrS#c3e547qSrMOWEV8kLHZw{m-6OAq*bpFy+v^oM?T6dD-$O49&=|V?L z%lE)Zx&-=kwr9hPiQdC#L)W_{jsH=3&vQb&mElXj005w#4AIUeHa1j;oBx$xcXfpVe(teIE;28_B+I-1gSD%clLk&wpN;(B|A+CyAYWdkwZg{|Xu{4?P34 z2b>ecFlc*%33h7b8D>@%FN@CJOWM^v}bPYOz*icJX%HmPkcgF>VA#-RZ3hp1_cS}7u*(w~c)3!4X^W!O07 z1(@>NXv9sqj%*&RdL5hW6l|x3xJtqF|6KDx+SsDK42Jlf@yE*D$Ioe?zrbJmZ$4+2ia2Soy6t^YMYoggK zV$*3WF+MhdYC{!wv8&J9hWFia9d`fV+c@~>gUGa9*lgl82GvJ#T5|52G2W>$9635J`ohrj(KkGZwid%&sfd~UjM%~V*=ZR-Unm?R@C@^Rw@A$Z#ae z)Zvc1*gOzP^Q|$9WnBuu-bBv-OXhcYUuSu#R(CW|Og17xSe){QuL&5cNyw${> zmX8yeA?z*@qb71oC$Y%1#E6mhPK8zU-WP)~Ngm@6j1>gWKqrW(tupoJdEE&DW(^e$ z%Xq%<2b-qI3S{vI2bvdb-hdl!yaq4q-y1cKih|y*Zmb$vj`JA4I8(%iRqIeJR`8{7 zd;{OQ`-jLAk1`S{b4^Q)%#}t>mm&2TDZQC&s$Z5yih-hcSQ z7yk8+oR_@#v_FVE@NXae^go}MUAy8N*}j3(cy;4e3RXIcuibG6GJ^wX8H~T4M{|Bo zxb81~=}WPE*)kO73Q~-+X`pKl3t<-9oQCtDCe+*}A2-Im(8SdAyf}sAtOS&!u7CU6P|;&B5?S1J&t2l5 zzkbykX+UU!*55mXM$^OE(@w{(1BbDbzP7cd(3jXd#?&^>*|Z9qH>{KZre?Dyou4Z@ z3k8Mzf=rh!i-kOk#fZKnc3I+F>0@DL4n5f{0@uN|Gd5%2u3dQg$zP)@ox+>n@+M@m zU6@&z7puHyUU&iBJ^fM?oSL0Swyz)a)h4oCy&|l6_St7)no$_sqELs~8XGrml*Xl4 z;Y1~X>w8$cW)0kC1EqyInYwUok=IO`73o&YuV^}TDPq&<6w+zVKLZ(xM00NPVSS|f zdr_)2#4*UNR*_Oe^u;u+OQ-PsPkw~?r=P-KUUM~e+Jww}5;;;yp~*>yA5j20_f>S`@xbr!T4;mD)1S36HxoxEm4tlV2xSmw2R1Bpl9fP4 zZiQ4jM3!uUT9d{^JnVTOcYV_kH%VGVw%QUhHLv(ssJFz)p~VJJ(<0=y)s}*l zSEf5*3hYX^6(YNw!Vbr5q^$&+zKa53KxvF9+zpUO)BUOe+oI>bk7heW53OXIEDWPr z24P=Y(IR21#sW{3#!>V5oZkgGEg}!%SOFE>l8u-l0{5z}ptY zyClwDw%(2B@(K%;frF_B$Gzm z^-!o(vD7dSr~ZQuK8Z9mI}MG6yc8OS=#F&Tz+53OG({fbx*5-&mAb z&Iuu>iFQK7%+vGJ=M`v8o~*;j$|f_g?$IH@5v`n$(Jwy;B-U9h!sbpQ5R|s_bd6F+Y#~*O^^ea z9h#Sf-|^3BfYNCmrs1J#nJ76;p^%x4CN{^@NHiUxrf~n}7nL>H;bZ@I56;Esvq+aY zEQc4|_d4_@TE23i!#!CFkVR`)?umS{qUYc~DY&|1Zbnwn5+UwQF)c-M8W!13>W7l$9dA4-$<<59K> z4KfDSt;emec@6IVhfl+GE3yyLd9O+?yW_%DslHP&sHD)fWDq}{+z&mKK!2bkqsLLG zR#10q;=4~;Qp;mVYP2X4rir9x2t|jeOq;aGaut0&z3_Dvf#bm{6PZ2M04W?LBT~{21m~_n?CQ@CPXG01y@AtTFNCO}mgH#T4vkOR24C}U$Vcr#8vRZ8k z#Vqzm@pY4 zJ!6Pgy(ZcvMl+wYS&iog zjeF#4F8TqIHOkf?I#Yh1cDs1L@hdLUbLBq&PrvW7HGJSBAHZR{U>!XqlxA9@F6$e? zZGZ7TpjZV4mI6n{@K=BLF?{u>_X>*clZqx3D@Am%EQlk!=xCokZT%*!T)7fYJoyyr zg5vnHznX?Bwe|Vuo{O!U*5T&suE2rq&%^c&1kE<$i3GZOdJuAdS3}V^7VA|Uo0~zU z-G-UWq1kA|4rqbwqA@%E^s?c>xBT_zKK0xG?jHDGHV=<|;u9M-UitEG_pDfXMift~ z0r>*H@%67sCm1Geq0l6FKv)*8yY4z z3NRDE^a7C1VfxA6;Ikk9gixZ+JnwA0>ZWVawRQ!~zD1SOnxDg0{{7#ue$853^6HzV z&@|#{Jp91Duww=;Jp1e@)jFB(kY;(CL?Bd<_yI<+QXr|`&^zKT13_#-6J8GPYu zUjuS!lo>!0`q;B;Cq{aDu=2d~qEnHlqZXHGeDT-`+;h)8a#QnWrD%`PTRM}*OD;SQ zS}GaYmh##WzOrpr2|y+j{n_H^J?aZOmKqG$3&7) zG5(tGuTnw&n_okD_in5h8N%To{s8`L6+K2|_ePfwv0>9mGm4r8nS6Bu^jHq_mL!i@ ztOUcz^+ghJBLq46_hQwkOMb_T%>yCb4i$3eH;=a;~tooP=OTYBqOcLcXGl7A0+(f16B4^PFjK_6H6w3xeHDT(yOcZGqXX(6l zQ2`=?=}x7PoX=VM&DpBuDa}E3|VnxYc>4l z|9l6_naJ9#Aw!|IG!NW(qmUoEKPfFAblsvw=wc3vSmhBx5ho*2)4W&=aYb;zBu%AQ z=&?H#?tl~kCGuc9dX~UfBvg>i1Diubn#QPjlyxRzypF}CP&b&ey+~W?!F;1CY0ob< z4}So8NVKApWKPYQn>XXkGtR_A-}??U#}#CWT8vcO#_CO5feSALre`9&x>g6ea?!%>&H!}O zVOLF_l1yXhp3cYLlpVGO(&yuVG%=Vzg(;xZ86LEoFpNipIUD}pL;TFBQ( z2-`PeuzRV)>Jd?;<}-(f>V58EaiCP_Ktv1emB8fq%!>nM1pIVR3kcDX-Sk_CT_cEu{ldx zLY1l29n{-QH2z)j!X}S}1(6_9k9co1Nr{nE@kKHTJ@t9~hSGe7vB+vwtdct#BDVTW zWv{6!N>&n^uD%9XwH~#&iEsYk`vUdMjGe^b@CfpaK#&fGs(DTYo7b(v`0;Vn9bKA- zSG?>(yy>!waPmh#ME==di(uMTScqp)qE0ZK#9MBA1Ag|eUxMk>g_7hcA!caJOd%{O zmqr?WZIk1F%#WsU)>4 z*#)ucMzw^-{5)*x2Kc$q#Vn{U001BWNklIv*1k4SBYP8QBA|u%+gOP6E7u zOzGxgDVLZ$7HJPMX#~}ZXi(%+A&;GB^2u?OgBDtJGfXBB(+wo;1Y$8BmKK`RQ;7HV zc5LdjXo5^@@V>$5K5I6kCY?X{TI)QAJFhQc5@LuBbe^@U4U~$&sgu#65>H0;2hVTY z#MsW~u>8W8MBl5~qK|n;L`<7sA2rnnXYJf(td=LVO10e*(+FAsGx42&M^{FUhw}NN zyc8oDN0WPWserCz8okL3s^t(@1Z0ir1z6k_u0Lywf9>4zwYNs{~rJkQ-G zCQ&L^MYGAXhv+Tof~1}EeQ<2T#=+z8x7vW~)}^77z)Y^6);n5UX0DJ;K}LbWpA|Z? z(NMx*kuSrXKy1pn^-h+iFn7s(9DCyNQb+J-bJ)`rPl_8}ceWSlftlE{XD@Dl@IkCz z{|2^sHKCu%dgSZiwXqyUH8UL;mWi3O=8Hgk%!q}LkjHdf~r4Z3wPUAg9 z`ul-Wm0<$v;oxLpava&2Gl78tAk82Ts@&?z?tu0nT;Sy@y*7cG2dv+Wt!rKv>JY^p zPrUE~-v8lM7&>*O@^!3~WFxte&BKC4IQ`PgIChaN`AyF}3$KvJL38E-nT+B^GQ%L1 z0djd@bOOk90n=uL4=is+189-F8CT;gilZ3dMQ)}Xk`h^{9$cA}d*O&%c`632I`nKD za4b}c6--VPk?9%01CKtAhGF6p*L+L8ZgP4XRXlvpuQ9xK9Zo;;C`4->e7A{qED19n zhg)l4WMm)u`Ua(WVDlA^CB%N#ju@y^sxsY*MIAV_o0O?2;8qCDF+@ZO(*0&=KN&{H z*DDRQ1*&h0EhYcv*RdG&noTJr89>J=MZ`2<`aW7yIrJMEoN^h{qZTkajD2g@!Y|dN zpGuNWp!xyWz9n{x%;)IPkqFT$;U_f@O|)qZE8;125OUuRr49lHs!RYS=oI~eM%a`v zv-(>8-LYO{@!HZX__TPGpI1kq`@)$dQW0TM!Q1sNlLL!72Jv;ZkP9flQmz|3xJvY! zhlWh1OAs@kXohWKxKV=X7)W|;Bq#!>&oV9UV4)}8jbf{Yoo-1cfV?Ngx{IX4(5tot zR`tZAs8s99>Q1Oh{3qn+i%ymnJ`{SY0HTh_SZEkw$R6JxpFExs{F{x9zOWDHUU)I? z`_7GshRL{mFP!@fBZ?Oi4(6P5Hu7c^zkB96WM0-D7nk%Txql|~fVvf4M|xcG?y;mJ zwx}8*5_LwBNtqB&k*6NMS7jrq&T-kGSfGUw$P7die{}u{ z*OSx(oGtia^N{Tk!E~MhM1P`r=!w`c8=hz$*gTNR&}km(NgKP^JY?c%v3X!|$NHIm z>d6SE$_;cUSr|8@d7w{7jn=c8k6g2bIsJVY85>u2yrfW=h9pqO?FbG#>Ih)*QmkA3 z2qvmE_>mZ*jR4)_OmV0Ivj<@IC9!njBD}u(4@eYh$j~`QCv}3f6BT+8Wxp&OW=@f9 zcxD3CHnS)^$fTCxiwVPi}oGW?xvrrC(PrsAxVp2#KX zv7Y7u-!i2+8I|Utfue07M{|dm38&V=Ax<1o*A?No7kFq|s(Ikg{j-PQf8#`@bvPR{ z(KT>jCMavDSqQ)X9WSsFE5SxM(%YShi#Vwr$;xYSlz4oy9SS9*FlJz6|T{x&zg>-`*c2 z%BF{d06USyKYaGHc;csb0@V_#UKPc?mAxubW(1Y3d&NbJ zy{)aAh=qZ&G;tsevg+258S2MqqbkG9R6BxNu?n~8qrto+&lh(cq7tLUDR^;9GNGo$ zGRTreGBt%nHjd|pcMCe%W+HmEf&OF$rKy5Ag2lU&D0vN3Yb8WsA`^)t$`ioSF;y?Y zwS1JlCY)3pl}Z_ABfwBBgJPk8WN#L^N?GW?j@QH>9K=imleHR*go8rOMXsgjnnN>Z zVcp0sG#wK)uO)1bz90(IV_nchz1>8WA-kk|61xxDNQj8Jjk>MU%_WP$3xop7sXTY` zNm@$i7VKmkg(9QffL>;D5e>B+6g-9zM&awapz_IN9Os{Vo_MK0^vhrEcLbCfXLy!{ zo+|P=?w8#ADG6rsJm(lafi4*zJTd21bkdjg679o8oZp`{b=ZU_QZL^zrAB zhs*!^q_x}LxGP%qdi7iZM$Luqxfq-=4f#e*L|ctU6WL5gV0_jw%Me z6PP_`E|Oho@s)SEX|n+5q?j9+=V9*bIoPz}ZKRz9_U_t;TB(Li{{Z$Di`ZG1!uRj` z88Cm2I37?`=hYgx_10T)=(6QF>ZJFn4xKk(%NE>y%Pn~GnP*`)Y8Z+oW%64Z85I~c z?nDu_9pU;@n8e_rSUQf1TTzr35v&+uE5<3NB(RD*kVL_Bl01Z}!osCqZ(y=n!$iVF zG4L^SUj55{N*EvX9{>oC7Fejok9w>Ch1NLLXx?*G<&pU;{)9`ZA`UWn4;r^G!GiASQh(g zQ$iOI2Ol#E-)v)&;#E^a!fhkTL!J<0n690rb!*HLu~oiSLm2_GkqF9-hWt*tAxza8 zh*Fp?)CG00^EGrRJW8g@X=#|29$ILskT^xt;s-xZxYDgN0a=H&WCkv{WEFn(&HsQ= zslv3C(2q4%(MTbB_9-~@!ym@88@A$$-?87Nbz>)3K%iu*>9 zOvMClJ?Z#kaPZI!EKaBJ&_zaQ@?_^nm7I_t2i?2~-9mHD7Zd42dV4|tV zQKhqxsbOD(iQEAkJBFI40wa}RoJ|#5JWZyL>W^wlnG#P6;iyA5qZYd2bSG&F&?}8E z>)|l0O&+I^Lc@xiP1kO}jT~tdLR2wO^lQjQlHyBFfBI;%jx_TsIHpUc(3~+7v%h{d zFfq0Cz33wPV zxB-|^$qv|y8VZ(%$z~e^Q5}(bfMuj`NOH9S*KeZX5Wys(*_PqNU;06QGOaOrzdLKb zgTlT0XDW1pE`8)Ss|h%@@VST6fy?tAXW+Vxu` z0B%+y3thrFDK2lI$-!kN4x>WdUR`J@F0FpkaoJ~!Q$+z85VerB9XQ1X9MRnAQt-t> z#IoZ$#cN|G;uxmzI2K2wWg_1wB9k3N|BRV(J=d>Yi-AO!T)T19F*s)y<_u29+s{7_ zqco1LL>Js?-AE4&z$>?)*8q_~ZogdY-mo5XdS}aXyRSTfDYuMe%a_BfddThCM>rED zzl1bQl=K#i+1*%t=yEyByCX@U(!|bJUl-JMA~z|TE5BMryXs1#z~+l#iTP#=UHt>_ zsxG#d@;GMY30S*rBN}cCTGhpTD+9aX2}OnLzG@KF7wkT?SLY~4L(S1;4m5(6OktT^an#epEL#ROpDM>FBMug`!2h1n0wfY7?jn^G(>g1+S^XNNcD`Eh6ZC zsHYUmd11NG1&Y-l84t>`k4f!3toWqpKJ}v<3QDSq4EGedQw_=ZGY1?;9Ja)Pj%N?M z`7phn#uhN+7_AqObmEA_ObqA8lye;g=v;AT1TJ+Qripc)ix+AoJQtL)J#4N!XBaJ0 zxj$G|MD)N;grRk1cvar%cRn=BKvy=4(@r@V$ITtW1+%;H_{~2=uTCwViv!+!EG7aE znOV~$lr#70+wjNB=t^YaC(af`bY*)HOC&`+M3{??BAj%(OvYn@ zC*h#3aDV-_heoA_bRvOlrVINN;oXp$ggV8;! z5eO`$V(nD{%MC~-|D@k=ViQg;)#O+gksH&Qc~Fe&0iuT=iuas<9%gh6qEW2jg{Pm# zZysEYvp={B@B8-GL%5Vv+a|XC;W6BC-3^#rzX|bD14;N`=^isR*mRk29JD#{a2wLB zuplDrMjw7E2U`?6`vKB1Q+R8cOcME0S@D8-D3OmWVm-PW=)yy+H)`U|-|6&a`Y(<+ z2HLugI;WC0MOtm)>T_cnbfW0iOl07TqmM&Dmtn%DSkt3WPhulQnB5(xot!6vHBO7` z6nT?w!p4hS$4FcWLfg7xuTdB*4s1-d^^nopV(q5H(BdR5kFm;CRt`(jYLX=uifD!M z9%?1{Ju=M@)LwbT%aB~$9aMrNA4vM3w;T&&dVmQQ&lC&?eEmI`tQJ9@G(S4wZ)x3- zX#>+{DOzWtMRAk7e}*&}z)=4H@)J2psil1;r#TE~s<$cjq_;M0XxJ>Nb;UxOf+)E^ zve~hbQ`1OkxZb4?P_2>r|3sNc<12Ccv1kS^Ty+V4_3a-(6UUv z9=7L7cw)^P$W9-^+PB`q{K1*1Rw~eKQ*0j@bi?00zH6s&Br|mn0mju$al})P>0P^S2^CFOErGq^DY4bq0r8$!GkVh}|OGF;5h`25B z;E|jMPq{7aZF)i%q%OoJ50zRR-$No2k$aquMUZEBr4tn>nL@W_^`P?z#uB z-*`KwP1evGP_)UAsy51W*5#o@=SEJW<6=HT|?+i>%Ou?fN@Q4-Yx#>o%`}xms(3PJAeseEwxav!|;=&8@ z>V5ZNUM)bj<-$oOP$cy!6d+Tx(PPh~x!;{~|J(k4^&x1~L&_NnHmab|~Rt>Wn=;+dH(5;G= zwI$s|HBiNK=QQW_XCijou*Efthg7v)mkBL*DmQf5Oxgy5rgAqTnjz1F)(q@x0modp3ftgdN41QnUU~uD{aK7`--!bcJ_K8bb3$8U^AH4e zEMGDon>KDisoX|Sst@NKdptgS&KY?9r?+9}Q;#5Hw!~eFE2_oR^S*AZ`uNB3@O9tC zRDMF%o-j7z7EC@%xiZ`UIMhtSwGEtn)u(aCeZPb~T10o-#?ZX#kS$3PCE zx|saipzf!Iv=M_J35Oy=)zYD5;;0tN=#j=%QDS+Kq9Of{*MhqUUF}F~Em3)5JCbyt z8kmlQulyLWcs|3bfRQ|2yXJa~jf`T&=_}Fu$&UiNcLEC*VC0(b;>}GPaN70X5uU$T z2ss&4|MREVyk!#(`Ooj*&VRTP2ONDU4!QJFpyUE0Ijp_?=g4i_i7vV@nLdvG{Kuic z=V)LPXVNyXehUg4w;=PO4`RbL-@%@3Tad6L@FVI>YF8Rar!tuG>L?OP_5)0xzW~dw zzZMUD;qS0x$97~i6GJTvaaWo2vi0N|6Mb6vr&}~I8j8%jvA8xZL<1A421{Qh7oI=` z9<#pSVysff^i%{x(KL3BjbW}G6a7_<7TOxc{#Q{vC0fQrX*$6A~FSlZ$9sKID5zv3MR zMTO=PHnlGmxn8L_v$Z(8IhsMe}f6qkyNcz8XC#vLRYH`foo)dq-f= zLSW}!toz>25E-o?4hLhdkKF9u32nsz=b!xZTc7#McRlr;f3|seYyW_d3 zXg8BKOC>2RdBBj1R%^9H_+jgGWAKrQrqQS?cWLsrm~2Ouvw}N)l#V>z+8xEU22g{E+3K$;)W=zMM*IkP@UwR4kN(-5&;_7RvP9)n% zg2q@2GrpW*X0?Dc4Ay+)YO5xLlXB^1L+j0`X^U967>(e}A6}33YhK0E4?cz!2d}^p zt1iPgKl%|w(kb*Wn1di0LD8*)!`Izewd^Qp?@Cc%h-R2FRd}Zw;EJRzDecoZS)R}WjMl1XvoLLO6Sai0 z#RNt=Dv>izLDDoQ4xJXgEz+H2SArKbIS`V9h<3qUj*S6Y6;~)sZ_2?av>sEFMvN!| z4{ILcY#=(KMpaZOorp{oS!|2m!52G4-W&=<`FDlXAUh)Y9R+&R&!2{iR;|LXuek}P zTSvq2;6ydFD+aa)0S3-~KjMcShS!Hjap!{%Vb-EWSik-)%o&(2B7DA~N0N_i(bx&#@@tpQad!({_?HhsaY6(Txm1l_}>KQ~H$^{JC7Id$PCA3GRWg(~8hK`*SU79v_Gt?~-7Ziz4 zpfnGGY90#Y^M=g>MZrPCMZDcc!ir*FvxY7+j%tfe8a7H^9Z^oobPdyHPRH{1t;C}b zKa5k({s2I_<;a-WReD!`0dMVm8;9KWUEug-z^%W)A8)uBhqn_j@_E>_*faxF9i~IK z5pe-Cr0j6X^V&xvQA{=Juro2_T6OHHw9(sR%QIh`XrS8!GE6DuDGIkqdt4YGU3=@W@L${(BYf^`zkcWJ;jll@uG=PH~2aZdpG}_cQ z;n@l)CGzlp(>(ksO2O%;JkO$?dKX=ZoK7zM@Q9VbMHX`xKZ z?r`@@Cu1V^EjC+N+B+c411W~}dKGora1*WMFePASMH_(>hiWLqdm|xmyjx)|&AZ*s zq+sH{#Ky}oFdhIWefSgD)HblKRKiQ^-$14-g{^PBjim=3jD6!3No{VnNqMc|5H=5+ zwxC?q(VOhWaSIpW+E0H9oA0_4Yw!Ox5jah{yNNk-aPeiA;J4qo7WGz55Q#`4 zf^rZbUsFl*v^E~nV_09w;i9WPgD0PV7R~j$fLuWmfN3nj$$3vAiJ(QQZ9~o|?zgkj zJ*Zae7;jZ&Zx~8vF+%h&9+7=K!L=JA)7*PH`xt3U5`I<>M2KBzwNWRPCy~aXmtF`Q zb|CJ(=?B;|GJ?Nl!#^|^k6-;YoOHu=c=;!{;Q3cx!6_%5jHOGLn0jw{c(1YO6ShE3Oe2aCS;Mf~FHU&5u|{u*BS?Y&s{&{O#M&9`IkO+UiMC!fb) zEx@=}#(S^33KcWJ?ce%7GJ%Ciy^TW_EyeuLeFjf_@gLBY%wYKkF9s4Ow*2u4Y<=c6 z^ky(k z0Whuj>5#>`&oq=~&V?uLWo+L0J2-Uf1k`a2h@E`+4m}oSxyFWQvJ@J4uPQ3eP zum6uV4=t)*ip8Ap|6}nus`WY=9>p=#c_qXmu~un`t*B=)9^FBL zk6E>dY(#_U)nS#YQdoWTn_m$zcyaRx#&absc+atT^u=c}*qz0a{y{u+!;g^Pu?6X9 z1hu-d8kM3yEY8^Q@!;VG!8;{^eY%NKnB>c;4hygaP6UI7g(R~$7^)L?>zrf-gpUX# zF|dh~N6;Cf59ailNWSL;lnQw`ecf;iQ%JF@n4CmlYj|yP1i6KS*w^$im>R^AR2SSe zFF@b12il$-l6pj5TfSDpU|&BbD|z@a9d0g%gOlB8mx@xtuq1TChR8BhX48-fHhmzFd#Hc^UaPU@0u34xBdZ=+BxV**XoOs3v4 zut_!aj!aca!c}w+p@Xnx5YGZ0Zd`^sEK?VIQQd3F+U>C&NwXf45I?o{hq4*?`2xB% z4PEUv24Nu0hE@wuH#BUa=%9DzgO+-o2P@@r5TH=B!fcy=355ZHU-m7>wE6crbh@iwHs5KhWIP+HxBx9(RYe-Rl0}YjS3sE8xP6QQk{7Mj%nK835jeYkkl zMY#XE@52cih({c0oQS$`C$SSTDg0;)Ot-r$zWN2c{L%~9^~ke=7J6PytkOx3Y}Q>F z>Tw_C`u1MJiPRadoi_Z81*fC(AAs9d;aa~ zc;aWbVPbp~7hm)dV8b44cKxk=sNvmc(1O9U1?#@8=Fv@%wy3fK88oH`4&$3%%>!z?~T1Xarn6x;?d82 z6{mdquf;HA>nkr|{-T5N+dF@XbANd=c0RNkg*Ucg`9+tb@{iv_Wz#k^TSc*M9rtpm zF}Eke!7oMAx@7jKb4sCO4387zlMvOFERl$fL{C=S@y5q<@(4J#iL%rW%J{@$2%a55 z!vfCy@G4ZMrts>$4oPltlJ@Bx-^-*B=;auVrbG%B$;oMaU%Xl?*Q z1lD}-Y`;~_=rZ7sIuGiwXpzsk0Bza@`esIkCV`@Ctr#N9Eydy97X}IQIiIj>tPkpV zJ85BS#>TUy0(Rvgd!$fHNkw;+(d@ro`>#0ey(hzUnxJ!EQ52{VT34vjk_>%`#l)6GC(Aakzxf?Gy3{Mx-2%Vet`1;_V%KP^i@~|A57K`^8riQ?4L--k7iK7~4yjOof`8ZzaM>pJ2lx7{|1t%{=b z$O7cTC7ma9>!G+PTttdGp$>1pel`zvUB`qCB<2jk)g7EeulINgC{~qC2*u+>OK71s zvR4WaiqAYfK>ys?m@F1BS}J3z(!k!`In)CK*;%tiH(=EpSU!IywE7fgPanYVzVR(A zTX866UwjU3_}=w6xPK9%i43M6cLe(9PKU{2Wczl!@NYLD_tsky7tb!3D1<|YDG72R zXOluX#rM->#>idV6iy)>6A0PSr+ZPv!8Aidy3v%Wzu2qtx@d&PDacflb7mUQnPOY9 zjCrS?F7RC6hc3aErydiRsocwNpj9dhFK}(6fYezhp=Zf~IQ58A@XQ@|)v#0Ld_s=ythjwsuwG+aQ4|mh*Zl`n;z**+#p$jN%<`(3-<-pT)$h>!T;aU zJTTme&8$%992@@JX}ECJ#klXZpi&CfBMO6?gEKqw6a>22?X1lHNW>OhJD-!PD^JDrq#jj=NCg1WZ@T^Y2d3h3tn z!2gDh4EKP*7q0DQK9`OqNz)WwHma^52W*hpJVfFVCrzRxo-+du256QM6Hf&svp_I4gtEvMr$3j>+`e z=j-JVhX*jle|8LcSA~a}S_6je3q;QLLW*D31!1O#3U1`#&8C~pu_l3K<5dr34H%aP z$Uvp+ODLk)__BfUfjJ2qQQk;hLxBKtT^+DYr}nf2ik5+M{^ldN?^kz1-#dX`ADC@x z7$mym)zs?<*{K4^Nd>5$A5sCu1gd4DT4qTyJ3xvpPH<^CA(Lbm(Db z3X763fGsRJ_MfAFu6gJfJjfS@g)g6JU#wQu7&4$E8EJ~#Aq4^D6w{JMjn?2uBrw%# zVYpEh`iPZCV{4@--=DB!uxYZ;s7qQczn23bHo!At5k%NHd%i-*t4vP!(e1=#k}GYr zgl2M|;9jE$pDJ)p7upi(faIc6DBUFTD{f0B%2o_rD~`Z+-9{l6!J5q*#Hx7rrmZ;n zy(i_> zaNS3`D}%ia7b9*H7p;B-o4#^2w(r`Ga-)LOU>8oi{(E@*U%!b>qhomAndf2tu`7YD z0px%23p~8~0bKIHF99|(46fU-1uy>kek83pmVW9AthxU_9Cq~=@awOC6+2#e17G~o zRpO}h$hFrY(Qrj`b;{TN1~~C}c&nd)?dlkRW0Sa9&inh%;g|pPdCWTQP$Xs!pm*Lp z^dGwtf4uCoIP#$7h^;&pyPka#TE2qUH?PMz|NhUo^_p*^x^@Tt=6g2--~S1AKmVfO zGz@PuqO1d|@SPS~ZUC#3-bxgg)H=xnQ88-V7l@RxVW4{?-Sfo$mx!6`!ZtJ*@u)Pq zWSwxU<~W5~nzKIr5qQ-ap1l1oL5bAUs?KKKd)~zk5-oJ(&VV-jeCKOA^w-YUbpBS@ zy*gw0GdqZPr?-Cx^LwY)?@ahRuY+4w7jz_E6{oXNvK;#u2F~8-3>QtW8v4n22Ah6b3eQR$DY0tn5+7;ey3@oB0j9_F!t$He7V#nZW!73LaRp1o-X^sO=dOiVZiJ25tKMCL)>z zliYMe7aLX5m$>nAQ=uSKRVd`zD^F2btTHub2dgX+S^tfBRhT_J2zq)j|F1ud-D_SI z`cAUH4_mix#jdTJFn`)Kpjw4jDdMd+)*>E{;izMd#$&I%gy*;KgqF?V$YW22A5G$w zP212v(2tot-PpB$4Wg|ozI@qbc=nc`V9D$`=sxRxc>R$_F*h><>4TQDD#FBTFQa#` zADBHGxceS#f9h%IrjMwj!L3wbGby%7aZ!MMhK8xOCxRm$EKIa$+ZGDGC&|f#Yib~tW`R84Z-~Y=uv9LLX#k8BBFffGS zf4L6ndK0c&m3zYCDQX!o8y#+A0?DpcME*2M~dxX~^V+8&t;$ ziV!F#nF4vz%COczf*#@&B~qx(IC<(cBBZU<(d%gN8ZDy9!j&hiSam(*>MZ&wPE-?j z{!#FjYPxh^(H%^Qq7G39zE+M{!;m;Ov<=c9Xn*RrMKJBn83>VwAHk_rk%+P3C6_vh zvYkf!h$9d`Y6VvB+>SdQeFT}_er(;k12d*iN1<4R5o1VPRoSgF~@V!SL zfg@(m!t|hx$8Nk4er^PZ>JE~DD^n`5#8g59HT_o*isIJqPt#U5g=EIj$!lLzQHMI3 zj(5|SxR&_;ZA(MOiVLbhG>1r}aC03^G9P##n4Bn5a2iVLgHV7?5g;c|JfMg=@NWjW zk@r37QuM6uZGR?%W}zS=%>B)Sg4G-}|LPXIK3h>0%^3OL9EIw&q zK!IX98bhvLL-JkCL(~f}eP{p+>Bs&1-yuC(M6B6_M%|QUqS`W{MU$voI--NUm~q_U zSoh=~k=!wk9!|VS7txw<>5t5UoT^PuN>ymI(79xt+1!~-L|Wv$167G+d=N)a+C5n*g!nj+*s?UEGuRix2Ha_t@md3MaHfvJ6 zW|9nAbp@R3@9o3BiE-HE%5xuJ^ULyyYeM$@j&-hTlx5Ef?=tTn3qtYp2!W?0b5`0q zb~GC3pE(~(zx}VMKXN~Qz52J9Hg6UZsThvB;!3Rh$sIUw*c#B&b8*a9 zK96U=^GzK0$xq<1uY3))U8B;#Fq3K75l3OkH@=GB{mWNy&ey+;dwzTi*1!BRzINRY zfjjTVoA*6{WFm?^K@}(d<6jBI`*&aa0j3!V$!F-EHxmPY`*A#W-_LRKm;M&7KJ*~A zY}tZKuJ}8=eATr`_$GSh&qcZ?3+Jq}@XSAd3CDloO02%|KatzC6(9P+&A@;D6ziXS z7Ev~7Ze1MaNI~P!m0Hh))X7RgCQTMY2_~XlxzN67K{wWBZoy$ zMbdeRY=}vR(!P=PBDw`KL`Y+l{4lkB$@wpbKCy}LypVH?rXx!2Ag@z~#H@*Eu)*g| zB}g;3g5S>2LGlaYP8>gPhyIlolXo8Q7K2OKls3lrPo~haGto4m*4WVv#5sH29%)tz#jd zn~*H688fCKs7}G+bVh21m~tKs4HOg{ND^gC9q< zcM!M#`ZqZ8xMOkBstfV>e_oG!Z}|^=>%$+z)bAfdbMFWiop&ZMZvpV?dX8s-fgVi0 z_6mA>vx@up@MFjg@09nSFIUl%a3pZW4s_HR3Z(lOX>lSP+F|n1v1#?l1`W`gK#YA? z)WkGhm*#;H@w_Npo5JDe1(E_%Lna=_4k9}}S@gZ<1Z^8Bj*e&0^vWlIfXOO&<#liW=gb} zSDL0YLz=-X3SUvUD9mLNw3spklA=qR8y`=T>o#CIDS5I{1kDEe6Sf2oa=nPKDxQ?J zo+}sSXUkxx(?E!;SLnx1c$8DXw&HYms0QI+dA}%_RS6w^xDgahz@6EL^Dn*-zyIDX zu%T{uSP?36x0cf z?b?k*DuGNkgM${##p13kX6pvFJn#VKYCun|iX`1k^gx;iCF**od9W-448-Ca;5DGb zgK*W`6gM_d3ODz62gP+JPWzEC@%07#f;_ z?GW8gDg=STKN~TOpo)l=fXy5SAwJYG!%D*8beJ@-W*Z}338NZNA{ywMs5&}M|I}sp z@lS6>wCH1jW1x!(zpjUV$B=?CN!K(nT2MCNHmMDqtg}#H0qL3hn}GBAjpqa*VF`x0@qt93ykqqLahSNS1w`HnxGnzn~~N{6P@ zX+{*C_#Nx#iWR}o(Z``OI7`H;_dod-B7uN>1|@vUjG>v0Rp06O`F zh2?%rT)HcTWNNMr5weGNono;`_5j7NOg?5}y10c=I2*$xbR7Nu(}Bsr8@)5lL&1+EKHjKDsq2&9R zd&q$py6W?|`NNmuQ~&&rz~P4ilM~{9w(ZKVATm|PxR*yOlfvPj`v`eJSbzP`5igK3 zs3AUQ5Zzz-3|@ZV9vrdieC%1f4%55)puP80xZk`1&dhnhyhXs9Zvclb!|<=~z|com z;l=NM8^hbT;rttah{g>!VauEAU?igw;Fqp8kv5{J@)V<8t*0`T7;2}QX`*QqBC`=? zi9svYIx_JTO3a+m45ZR&}=PGo^SG(OiD1&NI)LFx|Ei~+~YVClMov#t3_Fd*0 z@~FNG@!-F6Z&5*TrX-#7{HOIYX`Bo_<^JOOEi^3-=u}4^xN1m6+wZ8x@Hpv zad6U|N+a++6sB^j7GWM%lmVT9Q6Z9MAQDZBfs0mi(F~d}QVt413nf#>0Ux^@Z`}Rc zZS`vHv}0a)a_j$G^Duq!K~*>p`L)u}d(Su>?(}Q+q)CZpTX46A3$r}X4G00#GRNxj?_k!JyI#sNJMN@ z^5cNd$)64pz`8d^4u4qCHuQ`E<7hk}V<4*+&6<}-_Sb6~P>MOvEeqhdYw4Zqn+aGxvGa?B| zTQuknWohDl91V=n6@k-GRbcIhNW%t#&o-?M>3PoPq1;kdl|F^J8W9GWK}qw#X`bX& zh~;b>saRYRM>*-!X{V;?Qq-_{Zu=fQm!%VsBwfL8BT5&aD8+iNtdWvS)eo=RI|-JZ z&5+ZM2sf+{c@P1YSlbZxRPTaKGwn}VnDEGSXY}I2OE1Ciue$|ytA=jsHYfmvjtB(o z(f|M;07*naR00whc+bfgI_+fKzk3I6ec*TK9UQ{O&D$_IFo22t6vv!W)H_y0JoqO@ zMv+QJkw~R*;t_}8gvE<6`5)Gp!m&*)T&QsR+NqX&$E} zybB(W3)2+@5=(zKdfb<)H| zhaZLPF_ z(f&0Q(Kq}SG$)GwgO>qw=3w8$kHBgA2=+0r0Ik9^-YbR&kneid;mj$|_c?|_L0W;)%{0Eq*N-$u!AV$AR{;w7j zRx{CPtGp8;WCK0D*f}{N>vt%gfTd{|V-5g=)uIu&^@iAIbI;<$ST*J9Z@S2c8GuhJ zMIZuINv-A|2FSJBsA&d9ec;3oeGG#qti&(^eCvkqq0y{iWXEnCxa2_O%f4{Z%hjSZ z4@(!$!TPs0qV7kKiY0N`>8Id=LziREeZRugOV1-#uLylm+HO4pt-l)=oO2Eyx%F1W zTRsfEjbthbzolb$WePpXw74?nm}+jBxajJu@a7+%K<%|nFpBiK_r=MNu82L^1d92J zSlsqUQsV^^r^b210)*n=nU{T;fydvVamF9&AL1ojQ%rSJbcD&rG4Y2`|6dhK;ICi4;? zM(49kPY;$HZ~&fs`e_;39Dmx$5_q=$#a9vAoo7l5;)tOU(NUX`f=NBy#(hFHOlvV1 zy(#4TQ+RyCn>haDm6(0tfhcX>j*)FU;Y}6bR_a)B^81A}Qgk!bpun5+m=NffrL1x(WuC)ym2W=x*8f=Z@aCLFi;4~NVJ&FQKJL_05WMg#T7^6edi66DM>@2o zZ0>YGaEUrF_>C5Lgp(T$v>M7aiZn=eMHE#^5+XM;<_rWrym0c$rJIaIG2W;n+m*oR zR0Tb8L&8+Xj24Cm5}1tJNOVm@Fl#y%e*6;DQ*q4hnuV9{e;BplVa%{?bQdZZd;D2A zZ*IY$W1(emGUp>rOHtE8P_9dei=tXk>|zRJETMH^^H3Lxir7wyRcd%LhYML;GboPX z8P4fy!&NRjbLV0DrNhBj>`Ci6w~9C!$dV|hIB)YCZR(1X#Rh~PVa^H=!daVKHl^><)ap@x=MM1&8X zX`<}akk0fYSD288giDeknI&5Hg|Ig*|Jb~7^JR+Tm0fKldw0NKs`$vw-FSWVL`osrD4=9 zqo=zUOQtWvg8n&3Ac6emw=vtOdzYA7&T+*xmcn*_^T2~lM~fWamXEUEQumA$JPNk<8&J~CKotXG zzsNPMnc~Jk_PpADLboLzKNRUj6g)}}b)!~CTr)Ay-K!E_iE>nx?=?|2*^t?EO7W#E zX-T2u$9`H*NF)?1&hXvv`qH_IMOJH8KQ8{@WzsyDHAYJXGPRG#`!LMP;D7^=J>eKU znVZ1fPyZ2_-T`dgwgc0LhD2jS+7fe41Of3|D28ULOV%DXJ1D;bG%J?k$TedYIGW zp2ZDmgQ1Z@LbDK)v9aWaOkpn37#0XZwGrYwQq;jPBv6nC8(o) z3KP;ea6;O#4P+=9-!%Q`dCb$)K_X&0>n4P*n0&5IY$A&c5cDL6v%^2`SY}SMOlcy; zv5beXP+-VR67O6U{>DR5Zwg(IO`~Wd*bwW$4wutEUDCk)NEE}O`G_Lh2#}?3IXuj@ zyCf3O^C`SHOwnTLcwj}z<5%q4@q4|KZX0c zjtIrEEgv?UD-Nx=4^zYSXK711EHC&I&BK2mdH6py57ab~b|LnSg0Qm?Go>J_S|)}A z7dcX>RYq*$g? zTC3qHq%Ta|hWAG2>z8`z;`z1F1{yxO( zHT1=71fGcrIxY@Q#|0N%h(~{TGa@nwp{+Z$MmEYWlLI(`ZDT0agME!6&c5>Fc;ls4 zvHPVpn4?D|(2q#(^!_ePj!(gD1AXy0D%C0yW<){)ScoZ=WrzMrsuBy~wm5NduaL8V zYgY`Sb1c|FfM&IV#dGFic=sOpd9)QRu$lIK zbTwQ-I&JdN%O$ve13igu$y6xU%VO{`Z`NGw*|QfO2PEA|)GJlY%no33bRXhI3}zyN zy}rta>82*GSe5(CQqxVPp=DAi*6XO2%19fI7<5FFjtsL#CQ6t!Z6<0HlSoA@G#X_z z4IfT-6s7zml7WGEI*vxff@PYBPS#N#nG_Lu)=HwqS zRfbe(1JCBD*N!4;sQ^cA=A_6~f;MudkK-@D1kG{@Ywmqe(xsJVlEIZ+e;Paq)6$@M z9yD5JQ)9q&8ve~;ksu=c8o77edqRVVP;(@x8teH`2+t;iLn!X|b~pf*45?1gtWXI_ zb5q(omsZ7|$B<_^HffQ$AE)$L}u%Ba&m}ZSf+CFA`LpE zOZzsHupvqCB#AJ4*k)=xh2nH$G#zYfxftQkVMu2H6ltsi;M_CMM5|oKo_)g@7#P5Y zw>M&EZcN<6c<)#}^rf>fT@}z;_jNSrP6z`DJtDd~Kk!huee}(niScRy%Rli+3_tbK z*xJd_)6aPGh5tFXrL{8;np>>5R$GR?=*Xjwfcx4@&^RHXM?53uX?GbkRUiv}rOEB$ zfYhS94HGw+V$4vDPBFnN%L2lZz!slhtOrQ)X0ouNpvwxxO@dUO`(RUsat`=hR-+`;tyN3t1q6uqSMS zECMRKC$xrYP=UhzSC-)KCeUNH(l7tbZ<_Yt=jbj-UYE2e( zCkV9%#1w=xuE zP&OE@$h!P&26<4c`CX1)Pl!A6x>{6(mJv>p75wfgr;r&L(VOGY#1ZmNnVQw690^h` zm04h>Ne7~ICA#R1MfmkC-=yCTlB_owj%KJ-3-k>PF*P%(3DsgS&%`1`>n)`sr2`?1 zM1n#wkH|t~gC#%ar>}oRqJJse%15m>gQilJiYi<3H%J&3rDk1=ccGa`hKC|8MSdq* zNkhSdnoD9^wjK;Mr$#&y#|TTHPzkr$P$R2IY@|3Fwi7-PL^c^A-*_g|JKZdF*6H&_ ziSHJA`JpFd51nM{=Ao?*%V5aV?U}H+y~RUZ`_}8Vc_5o37H+G@Ks*m)PJr+UC(wQN znf&I^0lstJJ@obutLI_Cf?@SM1jO?oc@MJs6930smP9h50Xyr~uHn36*D%~{@$gMI z(eIR5j6qV_I6lH|-t#a&iPeL#?^0K_b z1F3Fmg{%e}Nh-GZ9x|aIJ%%56D4PezHaT2(HQ=&ZZV)jA1R*9tS55P;G)$*Mmj1pp z52o#h_{rvBu3A-ElVsZfazKs0Nb_JfT#jCL6hjxD!`7ePO5a?Sl<10O?k9!6G(1uN zUKCnvy9Ozh$cfR_!xPf6&^rXr+93{UqH@^9T6zjc9$X>v z?H09HG!Jt9%fqhMjA;>6H5z_1+>WRTTehR}KSMLJWoswCp%zU;{4%a?2jsCe-t;sX zRuW(vaf7L9lXxshst(<*M>&>UVZB!3|rsYWe46!14+yMJf=aJCnhwRMfL`+~6RS6B9}z zl6#`7E5%s0pl8kUt^}p56sVot69s+9hQV(R(0YEombfsRaP!t#O5tqaoRC@GrgR&bRq9K|6C^T z`Z>kto~Az}T5tb(5wTO`!y&GF%k}*Fn>T4*(EMOWUIz=IZZ)wYF$%RZc25syeehj8 zao3%gd#7lWvs&aY8yRNr;UoI%?nH!gsip|#BzrPH#R5zwWpoIqF0~iPtVkR+4P(i4!E6qa{ZJ@ETrf&Lyg(AYm5M0MTC?K+-K`)` zf9)o`i99`KR0(AAeDAamKIT*h5q>k;6zzW4RP?l^SqKKTwnNN}P;Hvxc4FAvXRpPhtQV%=D}6mvo9SJkBT%fYLXWJsd{!~P~@jQb(Y+( z*e`V^CGzniw^nkJp9n2r2)QQoS?+TYwRZD4fAX-Bfru}mZx}&Jw#C@&tbXnuE3AXr zYGolN4?YgnSPk+Y`O(3dtA2x@au!|TKqpdq@6K!~WKpM5QkZc?I9l`q#0QftV) zAwjeTUcE^m6s8z5IaI8?gff?*TFA0FZv8r@s#Tubz7;PPVY*VJE)QBuhQABUA^V$=l}fK z_TT^M%kRQ}`q(W?SC163&b^UX?AR05uA;GFBf)9`Pu7x|G+wbtyVWGvcD1wbwDPZ5 zPx(>dW++VCll7RG#Gov}WTK%|qiCC8vBILEA+mFG+NE3Jpz7Ll(^&>G5oT*OGAl>f zR4KA)cb3x!R**XWc=|qiJyYo@V=wNb@WM`dc8xQ&^F>a1{d)S3TS4{B$|2*o44^tNTRHZ~RW>R;`G>sN^caqte9R2Y= zo$jQTEG0g)kgZQ_#n2NZU|Q5$t{UIXhD*HN zVnsMje<*}m7g2&oOA3{c7|8t~B0+VEmMJLjRi#94*Dw?L64gkQa3qE^E9*4bI(STb z6)Led)3XImNcGblu=I0HW)Dh~5J&a&>H%odq(9olwCG$7G2|PxMB>$Is_t5X^crqW z*Q7Oh=!7JoNf3$tfv3azPVucin^!asB9{~XbnPY2gI`?P=`Q991%%pTNx>_aLD`C_ z2PC8`bGf1A7>Y$>Do4tC{sd623VEo<12B-z&@5MJxec9SXkFVu-T9MuKOcO4qBC#O z40kpWFVmJfvLzY4$o5gsaX;ZYC*R?+1>Eq~w{Yjb-30kLqTztb*VwyQ3-%jW`df=EwTx@&J-Kk$q-R^{(My*x{N^jE-}f8r!?Q3wOWkvQOkjsWKP~l21QHE{uoY9PhM47wh8P@O zMM}yLKs_AFV-FJ&DU;jKT1AwAA}y5M3^`c^L99q!*(gS%ls%VfrJ=}H`ICCkARLVo za>Re;&o8B6B7`F>CcGELJyI9A!ahw3R6yJSo`6(aqG9f$;^Qn^*dyuDMfWl zh^3epm9-u;Nn0VLz)r|^SaMk8Ym~;RY0|Q6#+oh0T2;z_mbUai-#q;3N2!M?TlQvK zuUj3ahDPc(D#c6s&v&4Xt1 z1cl!p;rL6hU?Sed^AltI`tgTZeeBU3+O?PNbT{R?pNCQJ7^Vf)y77fgNCaSSx`&HS zKbcQocMbb)`7v8=zm2}OOU4u#pETAH8a+wg@YWl+|EpicYDhyaUKZJxLefrAu9p#Z zR4SUG9BT9GcU{lM$9~VubDMmyL0_L@+cm>Tw>)AEklY*DkjcKx7mBIGMTZj|{kh0d zb)qC^w~rlF`KS#36rdpp=^&nMX*zt@l2Ok8*MDRDmY*r`qAnY*w$K@&keefvjw>Zm zrFV9i)gozXws`v24`_H>sZ#ZQOd>P%Akl2;#Jc9yF(M}AN}29hlICtLgrQY~QzEtKdjm201Qfu!R?HsfSYatZ4j@xL?j4ODN8T^P}y$B z10k=UoZGUAue4pA%*W#?tvO_f7K}=er$@jMi?WFmFvtd4yy`7)pqQOu>o0#t!u6X6 zA1E;I#}VYa4AorC(emG?W+%a3CuZ7+)r8j98C+^Z(UDK9$6Ek5O=%o_1GS=C#XR2@ z50WomQbV>3t~v?t(y;h|19|@q#kcz?;tIK%zwzm{qiT9DI~6jfO`|E{Iw5T$L@p^( zSCN33w#B}BLk9@m0aQYq351AT%+dQy&BL^D}i3J0!dDUq;K-+fkfQIn4U5AJ?(6&W%Lm@^p-CTUb``CN?z2kov+i~&rTc6qV-?s;U{v-a&=3&Q*bNu90m8q3sk~0Fz0zYE3 znKEF`@HCK3ibQ#X*7PsHn4BXzoujWE#IDN`+@jcO5L`OQuAVr*etH*Y4J_mQk9-2} zq@$=V?4?+$^1@yBF|vD#xhR*GC8z`(KL1+a&$RMj#^59dOIHxN`tnSj6 z>gK@2VJ+|$Ms0e{2*Fwn+m&z^`CNXgw2YT!qWw~F+R2_)&xr)Tbj(Vk)t)~9RbkdS zs6>CNherqPD-DF)cw$(TVpIwrG3?2PAzv;k{Y3tAIUE9#%BMJCsS3p7)7CHq;^3zT@j?<4?MygQcsat-?8aql)U2wG0SiQ_h*P5i$Ajv~kjl1*P zx|bC+`WDPjIp;OW^JX_;V5`AVnh}v@g#uJOmwe3+%Tl&@r}!To7{D#pIa1F1zh{^_ z)h#xqsr8Z3D(CQI^7O|hIeA^>Ye)qQGSLXpK#NMb%76j!CX9r9wCwJ3m3qYFNX;dd zj8iGri0j18)#kyDTI2=55VI*)>ZF5~N-E_2G{Qlujz`L}$VsYnOcJWAB+M|;hDU#Q zhGX9LX2$OPIeoKL!X=qB$r%Xu=- zD3xN7K0Cy;U@1>Ng=!+gz@h;qnKWcc5KFRW*I{ON>|}ARM0e0r3Yig$b7U@u8H-X8 zY+$g>v}kQ**l8OoAqZ5O9G~f8P;O?ST}5q`Gs^uXgO7p{qm)dr=uMY!*DXJ$m9645 zq&W{O(XZ$V=fq>7W$E^|T&=4gVp%4GS1$PjEV+zYAzG%*xYy>0pjx9Q#frlsp;);d zBc`bnLr=DZBKvF#mR2N*^N50%j*LHgVur(EC3pR)1ZgSe1Rx^#N|Ad=Lb9M}a}7rm zX61Y+TLzOIjdU^^$BkM{mI_oFP4%IrOp}7+(r1O~79;AkD8`{nyjEU|Mn|gTZ^|7l zt|aALyit>7hasVCiLarP$}abZFJJQiS(RT%!5j!`n5&>#mBJ(vDk-L;31Y__M|p4| z2b>!BKlvCdj#(JyoW~9rCcpwnjR;tS;^MzJE^#q(w0tKI>HU>Po?(I zgS576psP_;1hN2s=Nc_)T~V&O`YIm1^`|tlb3{8EGDFHx9g4Vw#XzDU!FvDzAOJ~3 zK~&uiQ4D&V^Umw|{cnDQv3H7o(b`w%{D#>-DmuZZ(ir$V3>_M&2D#NiIQ#N3zw+=& zQ<{(wvM9BiIGr^1pd=={4RUo?U!#RfmU6{)*YmA^`B&;ftm)|@Y)5F!7S!)%_N9qu z5**sLP0!7f&se9yufM(TK9&rRGBzgRMq@^vYEnyZSh0k4!SQdk5a^Gz-ljeVI6?-1v5$z4_aO_fFBP zI|sogH~r$eQ*iszo(>CIpD!{X@}*2lE0O|S26mw~&2U>W=3yEA$=28iQ;CLIfAuBg z=4RP?_XA{*A)sJSrKk^5kuz25CXo)|5|;W)S7k0qA&*G_Wv!}tPX5?dWXAy-;^NNHrY)Avq!f@Icwn$%CGE1WbG-ZoCKRUL4Fz?$JhMkL9No3e<7JdkCCaPhB_(2MnkfyGMSHr z855#Ov&I&u!rrFGm>gb;_mc-Z93|aWzRpp=$#xeDJPA0GCd4I|urM!L&##|;p2oo% zue#(7to-o%pg%=j^w^aut*5te1wvmO>@-w=Mn1fA#l_(*uS4fE{9hx5D_4~6uF*5K)&&4l48-pOlFAm_Cfa$xrd+S zmp}gn3yxVv$aDGCx4+H5{naPPe)l$7yLQoK2v59DJuWhbItj!6^_9n^$Q(O?U*t;>!PELF+v+DE`GYI9Vh z=Ht;M{3{g342H?XlJqVZ;h6;T;WBuNIsid8l1bw$KQx@>AzgFAk5562}; z1|-a<*H|!siUSdg6hWd+3nS3N33w_Uiq20gR6gcU8MG+%6U%h^C|{e;@$R@m z=ZQUqq%jz1aDDYlK%Zc%Qys;#%8ab`nXo*-$*7@M8+Gco#GrY%C%+yQ_6-R*3ONi+CbNxl|=?TI%mo&%>W=9()XK*a}f^ zv`E;t>e8io5ZO}93=?xa`h{fm)@#^z+imn^YuI&Refd*(DZE9ZBKljb7}-igNhIkd zi|AQ0iWdp7=gAlT=d0Am#yJX;$^0RP)}O+Wa*piyBqy#pL5Dco zpLk9m+=6HxJpB}mu+8ko-P)9=Rv$%lu!q3NLQQ(!vwbr&g)Hko_z^hgEU9WG#Kp(_ zl^Svo(zyFx?)%=iIdv3pJIIbZmN|I7VnYFSfjZ+c|k`FS_;f4%LWPtP%YBPi< zA(vj8deha7olHFC&&ByP=6am|<{Owz_p{%rYT#%h6KBth+c@^k-dG_H)Xl*@6Of>fL^bPu&`T6O!C;dRJq`dB8`MXA;x?>Q7{lNG?hKrgG-oy=st&Vp5IxbL?Q;?)|w;iA{` zy{~_hB`el2aMsDR({YwBItnXdlXWZ9ibZl;cJTZA?qhg#m`o%t;^;Q6*ua^_AxQt`Zc@^!p$<`;I;He+p z%z~LLSM-k1n#(aQXHhc7hH#M6uep{JF1}2s-_G_e?0xhR4*cpq20Vw}I22~*h{uN5 z9|&W=<^tBe_x;el0QT<3n>oT=U;PS!4KHxo>g5c)<@G%F`Ts+DHqU}kOoy1_o08^1 zpGh5GfC_y&*Sv0x=Z9XMrcDPwqDBZhII2PvoOys|*rpr{bL!QXkj>4q>%K>EibcB9 z87A|(J11!;Xc`8w-Y%*}n_8nrc`i@0Drjx-#p)c%=%kC@ehfT zMSl9M%$Eseer4dJi&NnwbB;e`OGV>~B<~ySrMJJIWy1?O@c1)~@7nGALM6}4Fxgg^ z&|%r)L=R50!L)!YOoK!sPN`Vbr019&AzvtA$Ky051405Q+bzA7&jW#3;*i*$Nq95al4nD zx?pT_<{m2vfFY4DKn*F&B>TgKyu? z@u!``n%7)NV)ZKMOHe4yP@0}#!NOq}8HAf}Ve@A`$FcDY#AF0t2MOv?#4#zN~5#hI~yLhfrVWJ}I_yDdMBNT}d5xk<1S@N^QrEv%cmG;vew>c~uiUq@r z{`JRIpe)+BeAA_O{d&JUsn;asMq&y53QJK=A=OoqOrm#Rf1m$?JhzLnr=B4jaP-1k zp3V?kxtikV{vCJkK5Va{lMzXA6tI;x51pr<8sVgQ=uEL2!7%k`l*JcZK)xN|XTN`f z$(qZdhQr=^g|duu%#arUh859uq^!+F&%Hpt-(rcrt`x0SgH|}e*z~xDc4d-joVltN z+I3r`Kn+552{H-l6e%7u=n-w7(?n?AU6}}{oOvR5{p2nd0c*RXq-(DFTz1ra^Kzdd zlhgz;@s9`{BP6maMorjkUNap1*K912Ji^*0?8Zk9& zb*4Bv8Jl0ZiVW_Rg5S;pqH_!Qje@*)oo4B!Ffi4D`Uhm$3{e`)@B!UC{5!33L8qIx zEthzJLsCF5Ud8Bz7qF>bSK89h;6f(GCKwqUQm;cr@jVao9^83Jn0Q9&8jjVO_I0)o`T**%?!~tv5BYh@ z#k{F{-h8f{`i>b+np0W*%X=bCoeUS04kJ8rBS3$;TN|^P?5tih(SXHtTM9Q{(<+Cw zHZ2`#&b*&m{#~Z_=}?HCNR(Q+M2{ID?zUMH3=p*~c1iPKhZwK7bQ4o4`ptt(nO@mE zNJw0%Tq6^*wTYAmfiw?|hDa}b+LCxs^3{rxaFWdcebPK!e>FRQax1;rDlt!d7|H>m zibF)50X8)|%2+ha>UUlXSDp`}L%vp8+;-b`@%UG7VtUUQSA6FOim@L1)MuzX{v4r! zILp5NNmw+MFW#f^5q`b@e%{xLnz?s)sV>B-fwl2J~4&o!85p5otRd-lPa<5hCt z-h3-R{{HtVr42s(qwhl^0|yUEX9j&;y0y-I>1*uy&Mn&TD9+OgQxP*|UpLVkuHcy; z{s4Ejq(c#TZ5jlW+!8edikp_LQX(9{bmZ0YhYp#b$h!lWEt{ro>5BhQt4hTVQK`57 z#OA@#$>#j#;lFDhG^A^mcb~?nx)`fs4*#;*8+x^t<*mKKIxukB>@4-~q;3>mp_{Mi}(pzpI=vf+eTgy$6$jx!+&R?+m z_MfvZY3U$lPuXK;c$7lRkVESA6JVxIlh*RdyO z)t?vYG@E|o;17cJStJ8Dk%h^?OwaFEh*ac!)$N0ysUVpl0*IDpQ7sVGt>%eWzn||VhUim^d}-TtM6X% zDRYW54+hm&Tl1Qf+8&3RejuS-7NUOfhedwaoz4H(hfz>m-?5&h7^v zBD`!BFMR6Ll#fgks5f-THdoB*=gQI`W%#&mqvvs?nHken;rRoH_)OMY-|1DT2N?6))CZOP;#IY3Xxp4jJ>rwzddwN z2duL}lY^dkHG_oBG<}1^no%}+Unw=tV|Sphp5L>^p7qh)74FHPlm^C z{SlSoET{MP5^^fkD)RUb;zS}WJpM$2-TjJAlTa0TI2N*5$$n8pova6C1us$R5|Afk zfoikPf$=eV`Ugmx5f-##N<}#0R7fOZ^mqYgHf^WA?*JJgvWV_62IUSKGww>ToBI5< zI2GxD+-L#Mpl+JlsLiGlJe-|mqvKK|Kv7o8Qm!O>m?%yV63%ujfE|g^tU8KrTs^!9 zTb7zmT`$g1(&otIl!gNKCc1EPRh<}nia!Zz@hpaI*?vSr2K|vJ1A-?za+r)A2N^#N*i+NqVXjKZ1zZVGFhQ6o8x`Q1F ztE6fE5EVweOakR=l2vL=LZLd%!#v;FH))B^U#5J%@yrk4@e5p?%D`Co!G|>}Ir0=XVc)nKQ z)(7q<)z!zg&0E#PD>Ntx1XSyoXyXHIrY9#zW|CNz#j(qma`K`PmKqkDe||edjT%Eu zS;zXcr9U=I%l8$cCdU5`+gc?>+U)rc8u@)kR=1tNEHyAH=Cw^o4dH&KhCHMcwI>GU zkf{WzlIu`x`DR=RU6x>3fisNu574gGDHcV-6x76YDLS-G>x`f@S3`bBdG0Un;OoO=FWT_F-=3%GEmZB!(RbRGL?Z}n_LXs21bZ7H0pD>*h~=bt2!%+ug7o!vvHH5J*!iQM(3h(b7oD**5AwQMag8CbJ1*IHjL2nY zllkYr)e7kGo4?2YP20HS^28My3X_|5Nl;Uk}Bbu&b}oX2UF z3EL^$M1<&dSFrQ0I|=40lnVuI%48EI_)vN8MhAKb2ZPK^OzYrgFcPPdFKQDaKW)Oa zY+IX$!|gh?h(V>+WT6=#;G?@Vwrw16DoY3!~E171hnAhuhQ1ViuHhW4X zhGP+>OBEa`SWvWb+iBu7Tx>Jg;pfj6cRrF;HVeMTA*iqh@jT39wterFPs!Sk$GXek z#O}7io@$9FU);#(l7)=#JHY73Vs`GCP+yT0Od-Q%#gY*=zOb2U(7egHajTDkHRdq7mTy@RWJbK%0xN}(|VL98{1Y1(t`}@g&f)$_=3UJ}O z-@>C0+)r@#5p51-m?xVBwT5+kY$`SO{4hMZPGn20AKKyiOD$q6vN%Y@jOy0Fh-KJQ z$+BYonM@l^)?IfkTlek8>+7R8-N)@;_zD-UK8Yvqd62H-k74yczMDg-5Oet|LBnF_ z<`?OyG)cX9fM@Txn{&@S1Gmv&!&94h&nN$uzKhQ0vE46{SUke^UE7)4yN8oAy*&Q8 zuaL=>G1?BrK#0ui&f)y`y^DvQ-;5DS&=pVd!XJLmn#CC=@4lN8HXmkbAk2Yao9AM1 z)_1-__p8t4507tTu&0lwpSYjafjyjVTI~Jdk2tAT$MV`7jAZD#`1Oqbq< zB%V(2m0P~fB}X5_?Ek%)@PU22>c+RQ=k7ab?AWWrT0N&b(jbvxiDc=O&4XO~^RKQN z&pSC5C0|2JV`7yp!P4 z#gwyx(+{v~^H!dGiVup!Rs_IrzKCk$FgwENP=0Ow{ttNTTW7-H&aAl*` zQdNYcJPV#!&Q{YBPoxmH{H91;dh6Gn!ey6SLQ=AP#*dJi&2sO}KOiBej7Tw?5(FQm z;ntaz;5Nl1#|S#EZthct<<}#v1}QtCgW<6F3)H_LLr1aTdpb0bZFi3;qaoRh2k<1z zL=XXiHVxSrNZlc7PR9rO$o*M#pcsJU(k1LFmw0?~hH)St3XyFaWIg#iOj3~^`qN2b zjS`2lV}yv(ipH1_$)uFjL22h)R;^mXU?xeX)uuI>;Cci$DjV=k;DJ| z-~O!UVf;wx9wO!m=bU~j%`F?KPmL39397Y0NF+Gg*~!DX<4o1oP^OVkFb$^dFoz-r z&lYpMP;M}8K*_SnwUNv~JHo-jG&4q< zqc38r#NtEnnWys5PEx&@Sh-? z%4PcEAr@FkN^?0DCsQ(h`#GG??)DrT6ut`v7q?dNy0 z?TLmdVl!KJD0%+JXEJdexlc~dLO4P+9LFh_$OI!A>|{!ST(yLej;Q(03>esLlTfuu zCf&tUIg1$$leBEDh{X>gn~JD}akV{$+a?)2&OYTho_+KI8u_Zq4_*}z17sK{m0+i6 zVS%NIC|xxNv)RP7d~=*;V<}?Lzqn2Lg)+?j=0WDS;(bt5pKcvq;wosNDuyXF^mk-L zN{~=Df}d6^4V(nwh><#9m*i=G!Y<8SLstEA({&Em`3IDIDK9M%qyg?U1M>OiWjRo{uT@Tp7kvC`D( z)(7@_x4YG;nPloho0sKpZ`~kLYaY8qn!JNe}di~${+j$ z+n;!v*t!!r`paKZ1k|1HeLwjZUgYin`_pjUgE@tPye}~(?^*uG{zv(?Uup-NH!2u+Xp&=BEk zFJsg9zDu;yQVC?E;c~>Q5=q85T&$>ysymq`m(A-2Vjv`pMnAXW&o>YM+4Jx}YaaYm z_?Lgo%QrMVTBJ&r&7pij{Zld#6|3`%n0ckhms}yYr9rB4eahdY1T67Kg(dkrPBvfC zvo9ri2elf-rbD+GCY+41e=f(;m`}sXOQN)TcYHLo{92~rE!R;5w9wt=x%eu*l~PGK z_^wZ+QlP2fgCAsL+-SAb?^TK=Ip%ejkvZjbc2|mg?T0s$>PoO@>kdtro|>!C^gOCU z3<^ljgC7#-2&%O!!-=bw@yV;NB=?J7F#FI0EDp*x$e>hoCBAnkFjThUNcP1DeF+|CC`HnU3_4J{HSXN zia(s0mo};HU1)$}_VwCWkpxq<2KA^#tGAo;zxa7xy#GEXY8BS3Kb_mYcPq}`G2VB@ zwfy8eH*v<*Z(`X$zKcH;rwImZUU+^J_x$Wm-hA3Q9AARRfBG|4tyzW@3G>_gALV18 z{}+t4D|mK#9J4pW*S`7{O8fWoj?>R!|E+hD$d}}4LoOJg@6z+QkWB-;Ryf$AOJ~3K~z6{S^o zv@R21gwgR{h@VpZWr9Q%w7z&JWcZqlGh1&^aq4<+$@8-ziO-VsY=!+Hx8u;8&JeXM z&0`VSQE$476Gj(O*|vpbOR_9X^-n7Pw^rlHdw)aJ2$RcBYY=N(H`Ea-5>6{h2{WOF zWf9iN-lZ89^sD%sd^%rH6d`S)*@Z|2P2z1spC#gBl3}CN9dhj!+HJ)++h#zwgOWm> z6+g!4LUvaxyimxqtI=Xc8V%DX?|9S%9utZxf$qZ51@wk(_RZ#aVrDNhm}GheX;mt? zwE`)coVVgQPG7N#K08TeIyd`5Y2tPN@|SELwyipGaB{qSuMx9PIP;A4u;n>wlZP-w z!_{_Fx2!X6(+|$@^+3KGOC0R8Mv!saWVapS@!T}q8&Jz6sM~2~@>Q}GQQ`)%q8Ym7 z5S+`gYIp#*G(|Nxr4yD{8}Pzj7<+aT z_EeSyHSsl6ac#fY5LBY@>}4Aw7nH2q+8Qg~Rx^#(IspkQvNhwOPKX1v*e6Eb6V6~; zz0NUbp2Z34Pvigo{ok<2trML(!eZJi%Or3sB@O3L35^|xK$vn>rbp6!3fHBjlT+2D zi%~{bfRYYq&AQE zHV?kUO|~jBbuzT*49K=aqwb}l@~7di+&r`z0)>;1JpWMCRLjo#P&KnM-Ip`6gAJAG z-mLikJ2ECrp)W})xnC8VvSpCqA)WSn`e5}ZH~x?LreZ#~p@Z6g32{1a0-l%csKK!_ z3Dk+8ZYX@suKbV?JDD8HXDEk4lm|1s{UbN>i+}zS?P5->Xk^k!oMxE4j}vAZI&r65P@p30W0^Rgu|t+rgEF`Im)PFEtTeu%UgrRhrZ z&{Wf`NC{JRROv%P!d(7-g5; zX83R3M&`}e!E;mWf5*pZO=cN7>qMfreNGj=cYNYAT>1VRVR$k8VFTqK+(!JYQ{b%^ zAezEMSAUel8@6Ds80M6(e-4%n=}7Cql^grhUEVIH=YM= zv|l-KeT96f77VhZ?h>-Xn(HtlB(~1|9Jk^GEsGOn>8+A270LNM%dMAA39-x9n9YI%<|-cj>FqeP zv)VL?yjeV5nscL@NlD^v(J%~N`@whfhX)@duyc&0`ZTIOVY73F_(K&L+;t4ol0hQp zxuA*XvjKGT>^B(F)MwH?OqHwbZB`K}Fa162Da_%Tvhnlii6j|KcJsE&-@wUu; zvTmkMuTWjP(mYuz(>(Wl&i>#>FnWfW%jVee?4wlnY{lL3EUAMBI9(>pHIIFU%|-&8 z@yWkq^n%wgH8I8b#9^L&{xOWbdr3aFffEP%Sp1eNdGUweCp}Xmg-Na~rLoVWQV*WU zePp`ddH(pYkw2C+`7$P-%Pq1pF*}=>Dw~n_e8zw^SH6bv*(t`J-om94syDh2W~NY+ zUc`n*T@kY7a+Ol8PNm+^Vm~1G^HPyqsjQpmTEo@tw4lW0iwYSbt<~gQS6D|pNzScP zD3__WTIywNh)1LIH4CNCHVk@_X}yQyhM~Syw^k?FY_QxiNk&baa+y}cAriJ>^>J|b zuXyUAM>J<=qAZ(G=(Y?Z5_(#%YXgxC$QHuW#O!*gr4n8>bjxce-Wwt4c`_sw$*igQ zG&&d*RIB(M+8z}ns9pz2SeGrk)D30BB))tZ(~&Sc8dWyu^Xx7bb(`4~Ql%Bga|4*g z8Q!>ZIj5~YhITy7{aat;w|jSJ*lD2BpiAD-{4DFbhPm*hbzJqjOWC}2`_#=(Kl=Lr zc;U%s|7a@m|Knf&%guu{57QHsyF-b{NoSlT&BOE5Ck_%6{eH{QBFYiWR@9^|gdE9q z&~bZ+S|G@*X)qQw*%WH>RH4WLD@b5y5#@l*ocn6207UbvVeb8|Yyw*)`w)-dV~mWSgS>{P7h zu_Gp?rg_SnCJ4aR#|=SIanv0 zz~i6$4DD@OX>Z@cGN(>Y)6tv=nUZ@opKKv7Xe=%Z!6vzKoq*)nbmSazfcWw*zhElH z5|o!8trDziF-NxArpzouqy5nSRS`nYDNfE%lg2w4G1d(5rkVW#i-@V zL@7WsAUB{-XprHAYU`C|5Y&QRH7lZh6>mhxpsSkYPV*oSEM09%Vzeu!=MaIgMY-jv zr4t}-2!zE3Tae)SUm$l zJZ4tYQN>U%p>z5l%Rtva=nQhPR?QHFp)^;2>7qvogtZf;@Ybu zAwClg*by_ep%k!&;}D6)n5h<&ge4y*hpcRfhWok+l>&O`mxZu{tA&!JddkZuO`&`} zVpf%l-lE0wR4-0pju-*mh>4b5%+R}}d5DA+JifDEgCdN2?)Aw*6-$t(> z6T?BePh1Iazl`ETk1&1Pqr{y6l}wEI%7yg5`>n9#C}9Xfp$rfGhJAP6LvGIzBB2ny zBmMNg;Zo(tZoT6dys&jQ;aHrJr6a7n`YKqmsxuL3(b~F=+rRcr=JM05K7T#yPg}?K zho55iQ=3#`cHx=lkT~%;*zgSFk3FPv$W#iZ3u5_-(Xe84U2{2yet8$kqJx*OD2YgL zlN&1)hSHWA3Uk?_PDWGV7_nvmTj+k&bb}Ubm`KRq|JyMAU&)sKzcmkf9V;9}hB}hOoRsTun=~--s2(>*s(zY$mz|<*nM{iON)l$9eo&$eLVD~l@t}cM7XJgR>Ko?8 z=_6WP4rlr(REx|u>cm0;eU2O~lo*MG@fwb16buR`T{2%PWlg;mw6w2J_wOe~UdrY{ zfDY0)D8ocNWMPb$?KcmN1_eP=dTmOnG<~O@rXg`MG5+bV?$*u2-fcS=T`;N%({hgs zBHJ)qtX{sDjhnVmtc8?5c;#!)=N)IQCwu3e%suoF$x2z}fig}g5TxGM#pQ3jl80~m zDYcm#;&)ebYDZk>ztv3k&<&%s!4wc z<7x1qf)qQ0gZWx09JC3BZJy2L$r!dOA~w}TE*DmLZ%?dCYmc?7)^Oo@7jW~}zD4he zM>Bc!2us$j8c;?YpQw^#WtRdjxO%0C5?lHftK9TQy@ON0)Ni>#t<>$?J$NSip|E@8A#L`7#R% zGn|!*)0mVT9@z@@@N6@TdF+WSKL0f=T(X$v{$0Fq&+UwFdXlrd(!`5-a)Lxo53s!n z+mcb1o_jXO3HYL~n_qwD8#G?r!s5w1BdHkO*S((IKfjCqoQGGc&@?RFL^VBEv$}Ku zrsk54_o359==rT%IKOe2Zz_U@P>npywn?oelIQ@_p%!Z{KcDgGX{Mjs#^rzWcRYU6 zH&mV%Ph`~mAL;I9Y-$G6h#?S@Qlmz`S;vi7xORxL1i8v!C!Hc>`D8AkDYfbiJjcUx zo9bbWr_$6MmvW;A1^L-+sh6oAnIikNFO4=CNNz$?rlILTk zL91Hf`uBfGy;}Eu{i}q-V!MagyzJ>g_%X2)$YWQ9p7O1`C1Loq<>^``;C{xD6l zdo)wXGBH{$|MxpSz;a9SU}O`M&?YKJg-AFARbVp8Ly%#7XloHC4JB%R1@ov(JDRH_|wAkbqmo5Y}<0d1zUJTWe`P zfJ{^5(2xn?tZ8!Cwt1>vVN(DKLqo)lTB#vI&p!7e^-2ws5Tmhvjy-lYWBCaZNt2m< zJ7~;K=@Mfd@PWmHEUUP<)3fvhf>hfc(MXzXEstd+{1sI=M7TGJ+o)qzYDDGZygIg+ z4XSm$52~F7iIRz=ND28QSt(WoX{Kv#y^ zXa1Q7Z~h^#>Pix?S5!c@YJ-3wy7HD5(_-rqT%ufnu@Gu34+@&S4Y_!P z!E4_Jr=3pmzPSTbKil4CoP4+;ef%^!al~9E?`5xNUD37>}-WDJEQCWaM&YP$Pw@9VPbZU zde!Bm6HZW^;qDzf=<4ku(Vb$tkR_3lX!J7E2Pav(WEJsfl)aOOh^C_I&yW|kSS*sw z&rzvWuqzJ3HAvPQtQ;ETu?_cYAs)x$%y60^J4&e~TPTSDgXJciWG1nk21T<$GHMYi zH?-lB8&YLR>IINSL8kI@i1|+;X&l4^FUVQZJkBQ;`(`EoX9uqJ(o|(08!A(NB{+1R zI7Td{|1J{|dGLk=&nDXj6*|A%NNB;^F_Nh?O1%zZjP}!AMM9+kX|LQ$wB}Pz{oj$vI8zPY`snk#YDJ*Wkc`LVlA;?Ps za~;#(e8`hv_!>3Y<9SHJiG-2K-|a?2K>p~Yf!BUFW#3zDrv0KJV+={kEF|M z^Wd>0)l01~OO&=wW`;u{)t2unm2o0r#%qoe!^)+KdLaTrTWdE-L~U}_I^FRorE-;& z6~l2Fxa}sU8KB{|Rmzla)<}dC zNz7JW${8uz0rs0NgZ;fk_RMO&N;7OQgTr*ffbKM{U<|wAk;#`Zsx`b;P_1YoNt71J zqUSPMZ&GN-v~aiGG7_E?=RGYy|-@V)LosX zdwTK=VTL#a0R@I2h>VgXDM3LLs$0MFJhvJ~f4lp~p0my2%$(^|;S-+s^Sr~3nK2nw5Nr78GJ^!0ZIXt?f>2m9 zW1?o0h5*8Dn9F<9g!s@f!OPEM>kofGbXI7MrfQYM9jF}%u&Yq+_%C^rr!EPjjC4^` z-HW6atC;CctJaBD$Evl`V9+)QHe43je&ryyMZhQkKS0WEPZveXeQTWhM`#!4sIoyqBBOzd-$;e=X2&(=yx$xtvW0K*SGu^5v3Q7_l@ zYkOl!Mv4MKBsDpuk7cBiR~l0~5hs%`5D0kU?zrD3;4?L&MHqfj%hqB_&JR6nI-pzj zje-W%e|dJ&a+XO)*$##9nSPx>7M;3g)Xd=H@ONLp8~zY80gK-~^*HfVg7WMfha9w; zU2jaOQ&Xjy*M#YVS1e}BmaWu@kccN)d*}+TJn>j64?RTnxo6byLWH<-x9h1sxPbF7 zKA%T!y`9=@MzhPLNf2~34hu(|2PMF>B@H5zbFROd4S)C}#*R_CG^k8M!yNr4jRR2H zqfBz7RUxiC-f5$HM$uTA9*B@X#kI_}{7mGkn1-L6>*%zlyStyULWZVxx+F2(V&U?| zTy)7r{PUN-jDM()_z6ccQ7W@EvVe5Fo0&p^dNxO3I?L$p?VNqlyKrk&HvICpnrl=a z?4g;ClU_KiZiTatJV&o&1UZtQ-Jl%}k`Qfr1w%|FW9+Gwwccqr z8zh_teXRyZ1`~u0m-IE4viFvs6PYNJG=pk{B38V$rkrIRCWfpRoj&-yMqEcTFy8>0 z2M1+YzK5;>p*)7e9zE7+P!j5rFbpKC zNkZIeHNt@q&2kODJjiN=RKTVu6sMe@#mHt@Y_y5GP13PAA=4mWz}ct26T7F2yMOW% zwVMx%fEyo~xmj%(q-{UpXhbQL1LEc;^et&db_{Ej#oswUDh_Gm8u1uky!nSr=CceYx>?}!?KG@`1(RR=?swn)la2p}A#q~W zIyRBN&-L3!oqqC(v^Q^}Ha&{ns^ODrTdg#kxMo06sww~8mY^}|{P~%5eC%ws*&2wj zGZMo-`dD_#MeGmq$A=$N_Y7e&cSX~@W8K@?GP0e_)ELIh6wBfvoVgMQ1An({IjOM> zzMA-)i!Gz6;xBQYky|RHCipV8^pZ8b#KM+RsI0cDfgPQOj22~5q=@sbjG0B;E1aT= zbaiB;9I!NaEZ=mP5D}boz7JW(;U}MjWg3jXwvDN$USL>+Pfk-aDjGExtGkES+hx{V z{9ahIhRll_F|swf4qgqJ1!<&vARVf~!G&CW z@%wZkPfkp;Xn5EgD{G{!K|sQ5gs<(kNyd_t%OyQngqJLr{nDkqeB*21=GL2UW~iqR zyV_7{k|~^J!$)y$T0J$E4D>S;in3zG5)B6nB?64@+QIaO=eaDokdRZQx+2Abp*|vG zIf^^?VMs5Lw&xrq?Lqc(VTSh zGzD15j7SRMd76>HU%imM9!%#e-qUoRp-5?N3L|XO+uz4KPdb6)mM&(%X|mx5|4C$W zlBIr=q~wX1EzjCmFBZ`*C=c(=L}>+1GSL$+ef>hOh>;IVC}FN-7YOC7MZ4)~jD(IQ z-snQx5y5a!Kkp@X#w65Fl9*jb1JT4TQRsZ450GxX6lKV>s1CMJ${RlW4QafLsRgINJ*aT4FHZIQT;msuD(9R$Zm}wC6A)|Xvg9g6DK|>Qd~q`EQing>q-Us`6Ry6L*KfX+^jMB$ z%ft=)sZ?qtI;q++TCa$GuoUcaDMmv0st##ez)C@jekHFpTG)XAb-$rD!8NOe1P#Vr zi%`SGs(Xr_s%@xlN2VqME`6m2F#)1JgS@;J(ICa9L(ymvv!mEKu?T3Y!<6K#NPwnm z`Dn#`?41*v%K$b(dZcU=u%57)s#j=7yV#$Z)!;69-3yXkA!lh#9O-N=U=}2!1o9<9 z0u(~Vo33{PM(cGS{#2Uixu>w}!3RmsR*1_FQae#;z!+4TP3_XlY7+1KplK`hMRImT z$S=#yG{Y3zZL+4Hy^VtADM%w{LC_>nYq2CK6Eq)2!=o)ZLZX&*IROMxAjw2p!VYCW zOXspffl<)l`jCC-_${W~8sm;py9`Go z1PmXOg%XQ=7K1%~Y?~g_j^%<_7fz!_wqDUJ3bBi zqv)R;ar^6varIw(k_Z3w-)QIORP^pRE|R}v$@I7-&r=N9+qBFeXMN-fHb4I&xffnn z@Svn50S_JPG;#eAOK~s7!D|PJ?nS0q^R7F>e8`Khzhy91tx^*=Fh}%p@~A{zB+ft$ zT82#L#ShS6*~;a-d;K}w_^)55EXF3Oh}z}~s0>Hr+H^66wA*Tv2*o(;$TciT_j2!T zzriPyouJqnTM9G{37@SwBm(mLWOmY|YRdET5l^L=%I9cVegd>vVEV9&S&mw~0Hc~C z>ejW;4H`krK%6--X_Rxtu+*%?rb#kn5)Ye%#o^D9*TGWz&bmydt+r|bYCdT~HHign z{FN#_K1tnxwko5`545FS`W4 z?dO5p?jTxg;hQVcV?}kUH|?c^N=((txJ1LnY2S}#m%{nn3 zEDu=N4bK@$Lc>KET?z!*?=v}R{W(m`&M+qy;=>EsGd9kakueH(fDOBMv4^(O3u^&W z0fg-Nm_JCDG&$=Pjz8`=R;)aTpZ(@!We#Zo03ZNKL_t(;eeI=d-Rln%tTjlvE(4J$ zXCHe!SG@NEe*4S2W**qP>6}|$dEx(#wj|(TbSnQq%jY}d%yp;2>zk=fj$zh|(5lIq z+p$Cxn?G4mV&zs-M;1wp%`_!N(c*P8%t%)c9KDuT3pw&WgC{m@(1qV@R*1*a9DUr; zj7;sPUCh(oKSFoQ(NWL4`n$L&v5@HGG|fsuN7-`dR9%<6`rBJX>Rv*k6d?0l=lSq3 z0SdMhIC2atXz)tEdC{y_Pg>epmZV%MX3U1;C2ATz^0vV!4OPVZS_WOFAOBpHrSYhC zF{_0t$v`(F!XsZf#GyC-6BIHKPO#<9`#I#C3*phHHJFWP`_`_YRuYPl=}J!$Qjw0#!q&%c=b^fbkZy&QhR+u(&4+4T?q zL@i%q^#vEe7e1%1RZJAwc>n$U@xcdp?4_sKQZBLR=)(!e2g#OOBzuQ=V`P-AufL-H z{+0ZkQngMwc^&V0&w8%9@-hkEM%Z5a_h&STSVFXN#RBnooMNG*n|5kyid0t@`9e;| z*JG0tG@Uwoc5dgc+wY_&8mBZlMa*@TPPQoBO=T{_+~fqG{miF%`};42?i7#R@>14B#Mx^pL~ z?hrGxlO+4PXg3Y)c1Y=aW8-@<{5}Ffn|Bz0VbUwY;&l`P9A?7$W6^GVqC3Pwe2K?&VZ%YHf?g`s^r`Mu~(k#dN!%fIAqoiFJoL>GBKNcI)l*j+NA2*%9#IRK<=; zrx`M~mbE*Oh-p(MQ>u!KvQj+awymx*0$2>k)l_A9on-x+(SQm9&4$;74G0Y+;HMzr zP0c2OrmI%ePN|G(T54-6`&T-0}cqKA{lM59K|*P>_} z%o;7`YMza-boW!SxN@{d=R5&w*fz*EyhgxkIoESJb#Gf3is~eFu3l18iN2vlygs^D zzo$PGReNp$HesKoluB_#^FkTt=a(L>aURIaY`)AT5G!$^B`1jznII%{!yy zB$TWkHyCEd@^jew_fqU1W_z{7FCMsuSXYYCUAtMn@?d6*Eu}eD8%3IKnZplS!poaB zF*jSIyStC`PCb?D&pv~h`|jn9M;;F zgo;h8*k8(X5Vx{s(9h`~zLKraKTr1A*XdHdSKR{-^QX8r1LYm^W}jgZLDy?o>R=|X zmtPx;<8FgVqs5+vX!c@cOGTx6h=^4R`k-x-uT^jYQKfP9bfx*s4S#_n^eo#{Do<9q z?k;vXOr_e;I>Afw^s%640KY%TbFaOoQ`OR3PP^A_dGG81u|PmAcV~-v4ms*@w(j4H z5eiXl)U~J;(XW%uvOF55x4#!>_cr|Lq&k_YwY%_z>#`4ns-x73u`UNk6qFPCt z6-~E6xl&eoZZH~A4TK1p=W+%5d;3X+Bb2gp1T=`wU_mlTe%tF@{h%1C-nbMQMZ?aIoK03abL#fX3!1co-GETqMZiLs#j<^u$ zb7q!IB*eaUi#JNrtnD0xov!1OMT=R#{yeSe9)J2dvH~8;Wrq3};&&R%OzdOL@FE6+ zVGiqCNWUG)ygWCy{-&3oe&(&4`+xVh|JiM6y7+)Y`-n47TL;^=P#@oqubijds^Yh# zBv;=E6(QrRK}(1qa)3duZ82_!c(r9R*56O-sH1qXkYl3V;JFu`@zl(X76~iKiEH0R zRs!fG0dU_oA~oQ-sNv~QuGwRCVNK#*rnhmvjT_+X+IV5}*1zDluC{)bTsMqOFrtmj}ds@|Q zn9z_?^$;!LIxk3Y_&2@;Q=@RuA^hQ=zrh*Te2m}S@K>CD$~suFgg^e%KVUaqx@9ye zpAt#Pr9>mn1g5#oo<6r3%zZNm@VGsITfiYPd?yrd&T7;TW>KZ zU29#E5z1{Jg=!sJJjaEz-0FDS$`vbbymYjbe&fv#H2tw7Se{=yDj?JDx+e&p|LD+e zb#kS)a8f6C1d7U_H~>5-Mefgb*?b2_0Epq2j-hnZJf|ipEQGIL@q4M*zPhAn`>-sV zqD=exy7|y`ALh=RenRn$QKGcGwBC*uz&v;*!)Kh$riQ^y_x_HdMJw2~Z!g_FQ6{GL z6O4s%>TP1dl!oxUzWGJs;V?b@X^vdAf`hx$>bA7`m%k!enPahdN6Tf~0YVCpI^aS6 zK5zRt53aNXld8M(A!{TNj;Ldo9L`3oO~r9Y1#L<-5gbD}7A8}ykP>G!q4PNn^@=al zt3>TE*+zv}FszOm(owR*A*S-u+x6@qWt1%Mj|fTwrZ{9syjW8;7(yC|S|(<*rGmNP zNQ7#+OxTcu8TwnUf`^^CJnas6kVItx4?aWA22%yB=}3fJxvW$=0S{uQEa!~a2Z{xu z-1ohKD5ZLdsFh;6S-@0kl0$bo%$Xm&lD&8Qn(m1r!DCUvTQ69$>lZj z6+(s|BVcLKCSK|iM3l)0gIqe%CXISa3x4r{&bDMS<5OX_P%>o=S523!gk#J5RFw{R zKod~qJ*xUetLCa^typOii+T>%VkjuZYON*qh@v;}XclTz5QUv{!sSn6*D|c=PLt1O za3UrnEtirwcQp*c!HA~EN{)z3d|GaUcEAe(JxDyyOX{zu4W?2PV#y@6Tn#gw!2h0g z?0fLHB&Vyy|rUYw75T5p-IhmdO4vrOxDGU%kNp4?G0?B*kpO z@xX)7&EyVpBxF*GT}^rIbn)A=52ZX+B|oKr!Km3JQ?IK7ob2078>KDDnu;Y-I%Ufh z@?HVeS&wR~8WGnzi+ZW3_faw!p z@aSeTMF^RG2EtML13{9dB72{Fl5inQb83=^&?+NQ3b{O%Yw7tQ&sd0Xbyv)0930c2 zV#oy7z!2~xS`x9L(P@-uJH?&Ipir$Tpzlt{X-J^1Ofb}iutm@i(*Q4E)uY>b4XujP zev`&KPr*^}(0LE$&wF`SWLL|yLaIOcIoUQG{qA*46^lIctD04P@=s! ztrJgQvC34wfxzZ^IH=7&nLwt8mQZO6mCD5*3M%zeM9JcGBql7mxvbJk9kJeTi54wH zshA_3?#2-_Sba=Lh5%WoaEPKwpnH&GuS z#gNHEQ`}m-){L($7M(&!7c^YcnT>SBYCe;UKf<=QpM4@~S$#0CHLL7v*LdRjXFVTI zS6qg=IrHtO(adMb@7Rf(*~1_{jZQx_)y1&Wz?SilP>>9?dn6qqIV7diAad3N`PW{D zv<8M5L#O+}s?cN}e9WB4iun zYYkl#gT4@zmZV_YoOIdyc>49%7+kW1+}I4g!5B~e_CZcK;s^#853}*%2kA+~2#G^b zu7DfwqVGMIGbheN=bi-zFT@HUcI05$W-;W)$xb*wqgoMrIANnAB-t| zt;)(3%QTfbH$B0`=s0I~rFmB~!m^$&2CjRL@JV2Fmi&)?LH>;qQigOL>R1xcXSr&v zD;9r}&maO?C*aqBmFY@N#kKR@6VI#YEg$fXn!vMmJHVyHyM#S(uj1wdzVFWu&G~h8 zppEOBm)ikr@W2gv;352Gaozda`QIfMggkC}KAK+Kc^vY2DVN=JgsZQ+mS5lWGm4p6 z21P5<-$yJQWlwgN+VDaSdhZ47FvEQ3*Z1KwL+l&fPyd1x6Vs#kLpJ47jfj;X7K}2o zcN^(+7x6@tgO@C1b#EVsMB{9|>uzG18Rg3+W#Xfw25;X;ufT9+d@6#*w?4dJ9&b0! z7f`lsQ*Kn~krei#CybAWLS(BlF%i3BpHk1HTPGKS2J#4Pqv?2sqfio5FkR9FXR*~S zlnQ!4W^w`&yw^)Q-tx6E+tTcocD+T(t*ITQUkcHtx3`x?Bh*V}!ag5yS+i{qbnMO- zX$wDEes3tMz{U`_HUSU+#pFT2gB12nr=?ksmAVv$QS!p;4xh7!DQK`Pkr8-`g%tY&6h*mvS@dT$rZLA zyCL4v2BtsY>2CDvEPOo)to5h<33w1-CTG51!xeor{9f4LTY`H5+^(KMYJY0|*WjT) z=)ck{JCL=!We-d zv$?El90Zg~;UepQu)9n33N!gUNy{P{3X?BN$_{i#lT<1dCfx>0lihlT&Xn@R@DT}y zaT^V98rhjVND=LE&gUl&-tY4HXGENWqj=#YmZ!|;9;iFVnMo}w;z7^ zo8V!5!^6ZHRT6%&y|k%V7S%|At8e%V9{$F^s#U9{c}D^ua-mJ53t4#ktpB z#gAug3am^S0 zn((3_MzYhC8da7rTf$fV{)=37(IqTdxsq>x@o(9&bDTljv)GhxmhTrTitII6V{$gj zqn_7u$17VxDX+{D!Gy-Z9`DLDD)Uwn?wUU(Uw{>Ud7TDF{T|L{LK`kd2wXv32X zboF6b0Y*mlGq7NggO?wSo5^z8p=-!K_9&b0yPK#}qAw68U!T_e61fQkV0ok~kNPs- zxREb2{7Ix_*a{vdNW9C^-JjFs}dx^WX1U41RT`1#Ly zeq@Bz>rch*PBNJ6=Gl##NGxB)BO703DqB{kOE(ZD+TBYmmFA7HF%CUs6}{<{)|+D^ z`xWGi{-GulV$))DY(&rDR5GE>-%7PaqB~97G?|>9!?r`rOiiV;y7$9u4$rH!L#@wSf)Ez({gEtuWQLtF&xsQmwKrLINIS-wAkdpkf8t z?$kKvqKl-eMfV36GOB!zN? zWIRPp>b622B4JFY#li)>tUh!VjqDsfp&-eoNw;g~venx9?>ztbhW|70AcEHNLE zaCq(8MKt{CD@t3kTNMohlawhzu%@(@WFeVyTs8Et6emI%C>QMrQ{rXpGsrC&W>>(+ zUSEyhZG2HfpXA$;=^lZv?}%(p}8P1FSyr zc=~($*!kj%?0I|xjar>S6Bc%*Da>T(OQqSB%_yxxP_GD_V}`AxL0`SD1&G@g|KA#m z7Y`}Y-LrKUWxv6i4}FqM-DM&gATm6p8{pZOo@49IP3j<2sn$5+*eSP7!(wi1lE%yomtB1Y)}lUs{@VxHGhWh>Ai)I3 zyzMyt?u-A=3p0rZx%IX?_|CWggY(XNFPC3_IhmOZ6VsFQ_xG#I!QkK^|MbFXZ&&kA}62yx>10!t4)krL=F1bToofFVS$s z;YpC6$xO-7u7@M^m{5?}w##_MioXZv@-v+Nm4Z0Sr?q%$!7s4}Rps-1Wm>P@bJp zzVAZ6BwvQuUn;`N<*dHoeQY7fx9+@)SgMabBX2O!mtcB!5;N?lkS}8sAs7fVJ+Y5K zBBYnZ%Hbi7TsXv$T|Mfs6Ua@o%Ct!NTKG-rWO7<9EWUD12;Ut-Qg+S0C&~i24?5N8x zW8Z)NnCMKAq!q-Cgqf}unQC}JL;`k`CL9$_VO5*d8bvJAQr$wa-k_&DNxNR7Bx&}d zAu&bBFO&_@kZ8h12k^?9V^FiivRG)CZCY;AOWc*$)$*whNNfbfVNPs_qmlychLkhx zgd7#+%Em|r12}G7X*!!qhVH55R)C>UfMBDdftxSLh~00IZiOkh6~<`dkA#WJ!7I}y z;P7Y{R<)vFQ#2OxyyA%-Dk83y$#pu8fBic4K6pRLDUY_~no?xCs#}whfFs3^UidC; z(NWDe13KUV0S|bZhkdmIZilwiFYiIkWx4GqA(V?ZCl4*PeH5CB=Eex95;4C{8ihq} zQuUikeVLH}QCYX9kBr-vEIqmf1RFt`@hE$98SS)7(I(m0A;U)^7S~WlNlITB4(qxX z>RniJjr=y{T3G?eqTW88PEF6v={o2OMU_Ke5&eUB&MWU;8t-00tw%oc?loC~^Wm53 zTGR=Y^t2A1c1yz7#0GVKLMVUE>#PKr&KdzyN3X?Myoy{j%xw?c!@$r2%Gn%;9K41t zJI1sV-E5Zi|HBSh!lu_YGh1jf)IY@GOO|roS?id-_a4TddQ_d3&9 zpWzQ*zma+-qhfpoJz}-pF_#bqL8H;6W}B?P?kcvv`YNU8w~`Pm?{w#IQm*{jQA6ED5r-l^&V5O^j7bxa^Bx zfMQ;)n~UuxsWZ;vmiJ!9d*1mjUfZ$*HxVVD3egUQIq!l?8Q-~wkALFRdiUIZ*S$oR zt|WiUPnmi8X?FkqA;PsHB{$2`WSU~Vq{Y9idj*gxP;RM|od z)CqETh!KOFPZEoitLekn$)EHS!~)rr%hQwfcm^^8AY?7Qso9fH%-@2Bw-!6P2XVC& z5x)R#)f@`=wgY6^4OYGLbS8@hUU_vhXMOAw-2IbVcyQ-Vj=S_-Bo+;E{v{t^Ze*Ni zckJeYC!XS!ZMzv-b`YnpKc6=yr)ac%9C`FnRLVttKlkn0$x}}}&Y_1KqP0ghn^kti zWtUt^Uw<#@WRh~d%=d2kKDXU|Ctbb$>JB$Im*d)NKg>nvT|gpa)13(O?86W9;)W;q z*tJ*U6RKD#=egEx+s(}%{v;Q!JDr({Q67Eb5w7`%zvsJu`vrPq2`>8l7h!A+R<2^- zPi|xJn$`U3-@iqqQDdOd&~+~hU+y!EkbQhY!Gm*kA&CUYw++lx z0wWqE+Lu;SjxD?QP!{XkXq@LKCwT)Odk}*LY0N9lL8sFa5P8_@6;$gLw(s6YSuEw{ z4Q{ju88+=kjn#`6aoF;uB!wnes1a(Lxop6G?{_x*;qm`7@UUm~aebqc*?Wyh_}CMV zKOXnxjnpPb3HclqMvJ|pc<3v5kf0E;2{OD8458UcrCztfltU@Di+6s1H{-D&sJE2dyA} z%o?^$jk0{{5|+f1%)an4yB>Q2vs}Qb)#;Cf$&@Q3Op8Duq&=X8-9(oaXvQJ{03ZNKL_t&)q5EyeG4#{#3h@>p;%N#zx)!l(Vh%^fgOL!cmMx-C$`gvjbn|c9x`R|IMORlBVY%!~5xKf5>RhyVF{MhG zB}T}nizJB95YTx}KJ73sH z7#{(#{FTg!Mnzpfa!wmd1Z9?w$x2bF1k$x{SR&x^^e*zBybIFB)HQNIH$Nu!AIf&~ z%KQ%F?ah5PpADh+c1J`x|4CVEt^@Pv~nf7F%X}QUI{BqCD}QbQ`*vaqfQ_kqgbu$ zN50Yy^RBWUxB_h!zbCt4cJIrc@VVSzU|8mBDekWbU zmeN?pTXl9jIno%!l5w(@%UGtM>FZrs#H@%OX7zxf7Rgb0&E;&BCWmcl5iXrUDH>vS z1iu|tU@k>XMJ$;WEW5=0VXDm|`UpqlKy`3y zZDK0UYpDUj7GFT=2!no8HEC%9<%X$AxEeOrY?6w0G3smZMzO@IaDk(+)}okI$rL`Y4z_wp0Zq8PwaN z{csiJg>2~YMfEXEH;VdN&)2r{cqJT8=r}@2k~1qBjgl`3`&lLqah;rr;D13RLL?Mo zB9qbnve0Loig?dREfZ7`wT39FXxp=Skk9E+)ybQ1wNmkDOEMCaBKJVSw15ZMA8#5n zsP(irwGdN*$+p4Ti!LU1^xGIS;6Hx$V|XKKmIS{rZhmCnvRV)qB_s==~xY zDwf|*!x3vvALoAfO18Z63i;=^5O-VHVzDk=3VHYEHDn5=g;te(v!!*e zWU`p9MM*%oYtaZtx$1BKnz3A#-jz$)HL{Nd3m1@(ya8#r3@qTm&;K3c+qMyJw&@SY zXjF1)S1uo-1u*TfhI+N+Ui1sE-Jub*=sENtjz41^n>KA`%`r#u@XIf7+R3Nz#O?QS z%G#6o<=uDFeeeppj#)#+@8_MTox|qmU*gk$`Ii`>2;ctk%?w7Ow72Y{`pT#R6~?z%c0nC z=}yN~d#2eSb0tT(C_)(-M?Y|$tRK9zMYL59;3G_MSVKM z^lO{>_*EZNgOPv#<~Qk$#0j?zDpMI2FJ8jHs^!#cHTJ%=g}L06)=I;v7?I2@;ijYE zi}H&3jW8|0$yB|l`{7{QPoUvhHp`?aEAka9K+P~!r;rsxk+7fHszW;%qI-BL8%HM@ zX|)-%{p@Jf*;g)6mRcrYdyxaJ3JXFuha9|$iF|>LyWb$#-{t94#gwGxP?($L@cspy zam;ZXbMP9ry}Bv4xsrSD_clEGe+M3REjyuivXHr_>GvOh@<}JseDxLT6Z;9cHB8BO zkV9LYcLF*pZ7Ry%U-v((KVWwIz6N@lnw#mnB_E+-MB^tTq(jQ1_ceuaa6JP#DRqg76rq`WtOzHY~sleh79cYWt)f1#vJClWg0D-2Lxa>J9c^wwvqYJp` zfI=+S#4j!dZ;H@75F(Qj84P;%b_Q0gA7jZvUMyyaFB)Xk@@4o-CCq*M8Q=I4fku^> z&%iW13%Q6t@aDx9k3`jiZ!i`oUo2`N?l(m^>gXjDlM_@&eLlvUZDPG$jFzez)YV0R zhNM!5Ae*1Vlp-h)qgfBAk8#T{MQ{zPl&3G^XR7S5_|$bQ_~{QI5Qef#@rkE+;QqUK zePR#Q1!=ZSPGdxRC_5%|#X7DnBJnmeGc#&AS(Q8o)8^P?j^X<2uh-33u2%H%%H*L( zXj{dCf{TU}PL`#XtkSXcOIm58N;2I|Fl_SZhG+T07r)5N)D%6bgofV*Kjt19dX;U5?AaUFYZ1;t@>zS8G z^$xOi`*ymz!%WXj5{QSXlxl>G7_mT<{rh(i4hIRxBOH0q3XT%mQ#8S*U;l>K%ruKk zgQQP5vZ_$^NPUvQ;ELU)OH+}J*ADcoYdzpF55h!m6bwjWuvjPiJz7oECDIX1`z(WU z)1@yK)nFj`8L3#5nPQ2E=~rMc9`KPsfT}bc)CD9+MQr%OAnZP_Qa!>k5aS7 zVk3&{HfVN7HDGF~6~>Z(w|mGp^33`io$M9H$4O!lNF zL->N03hgb~t76h4W&o)uv$X<7%SSvEq+YD4crYC>nJd?6MpA?#VJJ)zlzkG2QI$O( z^s&3zVl#e1ix!iL+YE~B>HaAyb9pjib6d({^`(gp4Kn4_nH(DGAtn z=t$>HrcO27Sb$a{PH}3A!BUfCBBJ17_k;J7nyC{Lj*S=wv|8Fdm4fC#&4Z^8@`@Ir zx&2q*K~iibd3GK=EYtTw+JX({!Gq}+L2lD?$WaQAiRrVbN~6PY$h4ajB(&2)DFfxE z7xESkMb)84QkO*+*Qe`Sq_xl+PvF)aiuDRn(@(e9A|oOmRxU|Sy3TVm(%g9m=WE&aro1h(p<*yDbU5QyMLbw@*2r_7p1D`U>urG8P~0F)avC*Tbe7j z80;Tn?W%+L*tusid;k56KK^@x0-oh8aAnG6V)SDjG!0N zDpWk-s5_2M#m@b(H+jfC_c}45F&ZroJjev96GEv9Giem~{M3CG`DR7;zD}1VS3_tw zE#cyeb!dReW|hT@SM%z=9fX2$Rv&SMy30NF=ZW7nL(a z&KvpJ0`8O=+Zlk&8w12O5U)vIvrD2(w`u*}R_p&q@7+%gLU-~RhZr()L^(!D8 znVKTlm7;g?B5E@;92riq;b*r}+_6>9(s_E66r%IfXaStE=OunNYg^PB6+~^*WBEx3 zBE;H00u^aeIz+Mbj+5r4=wig}&h-0moH|0V8?ck=S|~1hQnPuqwvIlp6R;-dhEGNo zou=BGw&V&Rq+arBAKifBiX`ug6;#1=&pS_3ozF8byuvBhe3<+1xtj;~?O<0BaxyU~ zdCw)%6Qd&Z^<=k%I&i@ySF-kmw-b!Tc;?w>nH(KqXt1CB>@*MDdoSTofLJu5wCPfz z$VC^N&$?4jQGmW<*Ea6_)m^-@X)}rL9`;XVh>Q4oXow?LuhFnh(W!2I^?BadzK#6O z-6XR$7DS?|FRf%UEcDr2f7O*(wvRjR_yvVxmVs0cw$NCG9vX`?IWfUtEUlDznFZ8m z$61a^(lS)TSgA{9Mu2j=MUF;?w$uR+s?QRJln=+Wb#f#$(~>x3nQi7e`7vF63rMa! zm{+nzZD72Von>#ipwnOJY6Yc9QLS;1&*D92p25*)p22UPeTwh>?k?4P8IHrUo<8>P z+^yzASDt3tydFBb)j6B@G__OcTKYB8A(Cw<&LU!C=XqgU1P}pqh(a*Pq}Vbp>f!yj-mJpj z|G4x61ophaa({qCqd~as6*kg&3BJ%i+;zRB1?8(vE2YCg9BCm!z2$;Esc?SaX(+8O-s zcA6%hcN|ruW)in0DS-VQwz2@w-jlO(M<1mg~fvL&4OHA%phicLxalV5$|?|EbIE-t$IQie}ElUJ_0fpDRLW!uD-4bt6OYH(laupI@*g6auTT)%$%vR?Sd8Qg^ay~B z#+9WORv#$E%Ti#j4!1Hx>)zc@W`IH|37g zNquKu1cM=rL_&3POV*vn<_5f;&+*dEEgXB?aqQc^gRWE$v-zg_<=5*4XjfT#m|1m*)o6Iy z5b@IYavluUUw1XzUVDxFbDN1aS{Qx-J)Rb7-eF3M*tVsj@SF(MB@9f>1f<#6V!Giq z5TqU{itfS+;futGCDN2CHJqAf{VL&t;$GCMmI$=Pl`M$eXwa&aNJrvSszs&76sr{i z(XhHQ3Gfm-UYW>8{XtyW@9NrxhMP^gWt|#@vNaM?6$Jfc#hI%s#OjmYM!+>_IbJB9 zKN4XoJ4-4Mq`qS>#hp7zOA%hF5ldNQ^TLP_GsG~>mQA+lqut#{XxVb=z1=k1Ez*w5 zf=HO|U=*|7pgcaw+{l>PlDf4r$G_`riaU2OIX=eXMT0cTlI7wM>q#@ST}N0?3d?W+Qf-hUB&(P z-OEFJcCy(ItKM-WPi=Tvaqo=RJA+`5BThJ(>ppP8nr@pHAiP}E$)1$0C z{4o55BJRFPPCoWn1{M!tRjd5^E8pbPmtRRD9^pTJ_fYn>E7_IRAl zo7wRA2G)J@6Y%K6Jn-Wma*$XmOU{_-quOd?`(x@rHCZnxZE2P5W&UX1t6H`CXqf?; zhQX9m(GbUcv!Q2LTXcD1wK}|nQ8U0Jd-w3n+yt_FBt%cfYqCC9B~q-7B{}}E!#MJc z)2SrFT=dybQgmA!z3O15_Ut7lLh*8yWyv%jJpU4gdIk&s?-xJ3@TRAJ|A+r2W_a`4 z{zvdIF_XKeVf#-w=(J+p-)0zfJJ+%`c;0&W?!#A?!t zGS_sNM7l1ThwOR4%Q#L;K)D1uw4)BKM1X^gF&CY90=w#EwiIRw_Vq9@G{_Ol4`TZD z9c+2{kM!26L>etkacnibFFEuVOEcZA)BMWbdA3?-PU=IKt@ zMC&C9`lc05G9HbyZ+HQ_3RP;E8j(FS0Jc~!$ zN3m8W98KWV8+sU~dwO`!`t@A=zKiJ_3^P4d)AVjR8~h@y{>FEBW8VnxKIa^rMu;m# zN`hUa>z|qCmY@8Dk+D(zp0MR7J2OppBu0OClHvXVHa`EHa*TKH+o7GhzOHWELV?~$ zgaNUva~cfg>Vz6~V#D2(OGV-`igiVdB!#sICMDwCRbbH+QBYdU;c_drt^;JG^HhmgeE4J6@!)NDF}r_Ua|#Yh%Ba%M zc&$R<&_h{x##uacFk5zRCz%LRtQTqdTC`mQt0}KRi2b8GiN~S@Y?F5! zdn~6Ov4(gy$CkVA!<^j5GAz1$ZNkEv75=r(KunCLspI^*(bO@lbfRRcAQy~)N=fyW z;?J8vNC7B;gyO*C2_z-gL5hKZxV8xmMS`N5qOI@*`147=0u*HL)aFC@=7r=^a7eC; zW$Sq(;a@R-OzAvh^@_fJ>Uz=H>wVplBs)iUEJU+dRcc`zujrH1_FcJxCXA2CE4PEa?bKu_nIuVVkK+L%UyDDJFt(wJr9yTIv`hV(~+-`T%d- z`Adx18qH*gC6~SnKK2pzT=gkldG=X72hP0se3D=JTe9E$HX}FRtBr<3zH$S+;{^EL zPuY3<-Ly&-4m#l&_{4|E{PI?aL`Yxs0j59x1!iWaIrQdl!S2_oZ`!3r$F|=;&OvWG z7OwpOo4)Y3#Pcl{9d#63b`ksj`mbni+RpOpu7S(f!y6;){qPMeas3n}3#3sYM1%2U zgcaYukxg57vhC|X;`BpTllr$Wvg5{oVbjjtT=4a8k-zJ=Jo4~kjLgjNsek!L7#iU7 zAH9+feDWGrU2!#YSKUBv;|>+Yue$aF@bSyp`d6RDe&`tngEqk{&S(7IyRi1o=!8Iu zWU-bNmn=;8L8%Rg8^n_@*u^R150g-glN#j?on#YYu9r1X(!Qs z=4oEL>kiD^90|)%x0#uG9jm{G_kZl8Jn`M{QJb1l!LRMNX}3M_Z%eV8E((u+)Qc$t(d*$9#pTvvb|3I~|V*Yu1YNcXcdGs%ejJsHMsIuuIMbr&5LR0B{A z2AJ~s_~<|WBb)Y)@c+^F-eFeN=lcG=d#}@HC^J++Py?b^5gVXl5@YYt*phgRrX8c{ zy?BxsO>8m8XcT)z#a>Vp6cG^tX~V$uncdskYw!KN-goUGBsu5&e*a|7*sNK&3VH7N&2Q8f;1gtfQM@K1]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

{?!CIq#q0k>BQEWkT%T;fQZ<3B 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 =6CA4NqC4m7RC+G2 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